diff --git a/yq/.browserslistrc b/yq/.browserslistrc
new file mode 100644
index 0000000..214388f
--- /dev/null
+++ b/yq/.browserslistrc
@@ -0,0 +1,3 @@
+> 1%
+last 2 versions
+not dead
diff --git a/yq/.env.test b/yq/.env.test
new file mode 100644
index 0000000..bf7bce4
--- /dev/null
+++ b/yq/.env.test
@@ -0,0 +1,8 @@
+# 测试环境
+NODE_ENV = 'test'
+
+# 测试环境,api前缀
+VUE_APP_BASE_API = ''
+
+# 测试环境,Url地址
+VUE_APP_BASE_URL = 'http://10.168.2.125:7101'
\ No newline at end of file
diff --git a/yq/.eslintrc.js b/yq/.eslintrc.js
new file mode 100644
index 0000000..de78c29
--- /dev/null
+++ b/yq/.eslintrc.js
@@ -0,0 +1,20 @@
+module.exports = {
+ root: true,
+ env: {
+ node: true
+ },
+ 'extends': [
+ 'plugin:vue/essential',
+ 'eslint:recommended'
+ ],
+ parserOptions: {
+ parser: 'babel-eslint'
+ },
+ rules: {
+ 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
+ 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
+ 'no-redeclare': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
+ 'no-unused-vars': process.env.NODE_ENV === 'production' ? 'warn' : 'off'
+
+ }
+}
diff --git a/yq/.gitignore b/yq/.gitignore
new file mode 100644
index 0000000..403adbc
--- /dev/null
+++ b/yq/.gitignore
@@ -0,0 +1,23 @@
+.DS_Store
+node_modules
+/dist
+
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/yq/README.md b/yq/README.md
index 6141ed0..72e7b0c 100644
--- a/yq/README.md
+++ b/yq/README.md
@@ -1,5 +1,23 @@
目录简介:
+- src/:项目核心源码(Vue2)
+ - views/:业务页面(大量数据指标/图表页、个人中心、订阅、支付、帮助中心等)
+ - components/:通用组件(顶部/侧栏、表单、留言板等)
+ - router/:路由配置(history 模式、重复导航处理、部分页面权限信息)
+ - store/:Vuex 状态管理(用户/Tab/大额交易等)
+ - api/:接口封装与请求工具
+ - util/:工具库(ECharts 数据处理、请求、加密、格式化等)
+ - lang/:多语言与文案(i18n、侧栏/页面文案、SEO 文案)
+- public/:静态资源与入口 HTML(图标/图片等)
+- vue.config.js / babel.config.js:构建配置
相关联其他文件:
+- 入口与挂载:src/main.js、src/App.vue、public/index.html
+- 路由与导航:src/router/index.js、src/components/CommonAside.vue、src/util/menu.js
+- 接口请求:src/api/*.js、src/util/request.js、src/api/http.js
+- 图表与数据处理:src/util/processingData.js、src/util/echarts.js、src/util/chartResize.js
+- 多语言/SEO 文案:src/lang/index.js、src/lang/zh.js、src/lang/en.js、src/lang/seoText/*
-功能简介:
\ No newline at end of file
+功能简介:
+- 区块链/加密数据可视化平台前端:基于 Vue2 + ElementUI + ECharts 展示各类指标图表(含时间轴、缩放、均线等处理)。
+- 用户与权限体系:路由 meta 中包含角色权限控制(注册/高级/vip/支持/审核/财务/管理员等)。
+- 业务模块:个人中心、帮助中心/工单、订阅与告警、支付/充值/提现与后台管理、指标文档介绍、SEO 展示页等。
\ No newline at end of file
diff --git a/yq/babel.config.js b/yq/babel.config.js
new file mode 100644
index 0000000..e955840
--- /dev/null
+++ b/yq/babel.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ presets: [
+ '@vue/cli-plugin-babel/preset'
+ ]
+}
diff --git a/yq/dist.zip b/yq/dist.zip
new file mode 100644
index 0000000..e32d7f8
Binary files /dev/null and b/yq/dist.zip differ
diff --git a/yq/package-lock.json b/yq/package-lock.json
new file mode 100644
index 0000000..e0743fb
--- /dev/null
+++ b/yq/package-lock.json
@@ -0,0 +1,13420 @@
+{
+ "name": "project",
+ "version": "0.1.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@achrinza/node-ipc": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmmirror.com/@achrinza/node-ipc/-/node-ipc-9.2.2.tgz",
+ "integrity": "sha512-b90U39dx0cU6emsOvy5hxU4ApNXnE3+Tuo8XQZfiKTGelDwpMwBVgBP7QX6dGTcJgu/miyJuNJ/2naFBliNWEw==",
+ "dev": true,
+ "requires": {
+ "@node-ipc/js-queue": "2.0.3",
+ "event-pubsub": "4.3.0",
+ "js-message": "1.0.7"
+ }
+ },
+ "@ampproject/remapping": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.0.tgz",
+ "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/gen-mapping": "^0.1.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "@babel/code-frame": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.16.7.tgz",
+ "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.16.7"
+ }
+ },
+ "@babel/compat-data": {
+ "version": "7.17.10",
+ "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.17.10.tgz",
+ "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==",
+ "dev": true
+ },
+ "@babel/core": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.17.12.tgz",
+ "integrity": "sha512-44ODe6O1IVz9s2oJE3rZ4trNNKTX9O7KpQpfAP4t8QII/zwrVRHL7i2pxhqtcY7tqMLrrKfMlBKnm1QlrRFs5w==",
+ "dev": true,
+ "requires": {
+ "@ampproject/remapping": "^2.1.0",
+ "@babel/code-frame": "^7.16.7",
+ "@babel/generator": "^7.17.12",
+ "@babel/helper-compilation-targets": "^7.17.10",
+ "@babel/helper-module-transforms": "^7.17.12",
+ "@babel/helpers": "^7.17.9",
+ "@babel/parser": "^7.17.12",
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.17.12",
+ "@babel/types": "^7.17.12",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.1",
+ "semver": "^6.3.0"
+ }
+ },
+ "@babel/generator": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.17.12.tgz",
+ "integrity": "sha512-V49KtZiiiLjH/CnIW6OjJdrenrGoyh6AmKQ3k2AZFKozC1h846Q4NYlZ5nqAigPDUXfGzC88+LOUuG8yKd2kCw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.17.12",
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "jsesc": "^2.5.1"
+ },
+ "dependencies": {
+ "@jridgewell/gen-mapping": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz",
+ "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/set-array": "^1.0.0",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ }
+ }
+ },
+ "@babel/helper-annotate-as-pure": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
+ "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz",
+ "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-explode-assignable-expression": "^7.16.7",
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-compilation-targets": {
+ "version": "7.17.10",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz",
+ "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==",
+ "dev": true,
+ "requires": {
+ "@babel/compat-data": "^7.17.10",
+ "@babel/helper-validator-option": "^7.16.7",
+ "browserslist": "^4.20.2",
+ "semver": "^6.3.0"
+ }
+ },
+ "@babel/helper-create-class-features-plugin": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.12.tgz",
+ "integrity": "sha512-sZoOeUTkFJMyhqCei2+Z+wtH/BehW8NVKQt7IRUQlRiOARuXymJYfN/FCcI8CvVbR0XVyDM6eLFOlR7YtiXnew==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-function-name": "^7.17.9",
+ "@babel/helper-member-expression-to-functions": "^7.17.7",
+ "@babel/helper-optimise-call-expression": "^7.16.7",
+ "@babel/helper-replace-supers": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7"
+ }
+ },
+ "@babel/helper-create-regexp-features-plugin": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz",
+ "integrity": "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "regexpu-core": "^5.0.1"
+ }
+ },
+ "@babel/helper-define-polyfill-provider": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz",
+ "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-compilation-targets": "^7.13.0",
+ "@babel/helper-module-imports": "^7.12.13",
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/traverse": "^7.13.0",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2",
+ "semver": "^6.1.2"
+ }
+ },
+ "@babel/helper-environment-visitor": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz",
+ "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-explode-assignable-expression": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz",
+ "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.17.9",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz",
+ "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.16.7",
+ "@babel/types": "^7.17.0"
+ }
+ },
+ "@babel/helper-hoist-variables": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz",
+ "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-member-expression-to-functions": {
+ "version": "7.17.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz",
+ "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.17.0"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
+ "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.12.tgz",
+ "integrity": "sha512-t5s2BeSWIghhFRPh9XMn6EIGmvn8Lmw5RVASJzkIx1mSemubQQBNIZiQD7WzaFmaHIrjAec4x8z9Yx8SjJ1/LA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/helper-simple-access": "^7.17.7",
+ "@babel/helper-split-export-declaration": "^7.16.7",
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.17.12",
+ "@babel/types": "^7.17.12"
+ }
+ },
+ "@babel/helper-optimise-call-expression": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz",
+ "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-plugin-utils": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz",
+ "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==",
+ "dev": true
+ },
+ "@babel/helper-remap-async-to-generator": {
+ "version": "7.16.8",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz",
+ "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-wrap-function": "^7.16.8",
+ "@babel/types": "^7.16.8"
+ }
+ },
+ "@babel/helper-replace-supers": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz",
+ "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-member-expression-to-functions": "^7.16.7",
+ "@babel/helper-optimise-call-expression": "^7.16.7",
+ "@babel/traverse": "^7.16.7",
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.17.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz",
+ "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.17.0"
+ }
+ },
+ "@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz",
+ "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.16.0"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz",
+ "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
+ "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
+ "dev": true
+ },
+ "@babel/helper-validator-option": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz",
+ "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==",
+ "dev": true
+ },
+ "@babel/helper-wrap-function": {
+ "version": "7.16.8",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz",
+ "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.16.8",
+ "@babel/types": "^7.16.8"
+ }
+ },
+ "@babel/helpers": {
+ "version": "7.17.9",
+ "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.17.9.tgz",
+ "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.17.9",
+ "@babel/types": "^7.17.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.17.12.tgz",
+ "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.17.12.tgz",
+ "integrity": "sha512-FLzHmN9V3AJIrWfOpvRlZCeVg/WLdicSnTMsLur6uDj9TT8ymUlG9XxURdW/XvuygK+2CW0poOJABdA4m/YKxA==",
+ "dev": true
+ },
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz",
+ "integrity": "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12"
+ }
+ },
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz",
+ "integrity": "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
+ "@babel/plugin-proposal-optional-chaining": "^7.17.12"
+ }
+ },
+ "@babel/plugin-proposal-async-generator-functions": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz",
+ "integrity": "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/helper-remap-async-to-generator": "^7.16.8",
+ "@babel/plugin-syntax-async-generators": "^7.8.4"
+ }
+ },
+ "@babel/plugin-proposal-class-properties": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz",
+ "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.17.12",
+ "@babel/helper-plugin-utils": "^7.17.12"
+ }
+ },
+ "@babel/plugin-proposal-class-static-block": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.12.tgz",
+ "integrity": "sha512-8ILyDG6eL14F8iub97dVc8q35Md0PJYAnA5Kz9NACFOkt6ffCcr0FISyUPKHsvuAy36fkpIitxZ9bVYPFMGQHA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.17.12",
+ "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5"
+ }
+ },
+ "@babel/plugin-proposal-decorators": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.12.tgz",
+ "integrity": "sha512-gL0qSSeIk/VRfTDgtQg/EtejENssN/r3p5gJsPie1UacwiHibprpr19Z0pcK3XKuqQvjGVxsQ37Tl1MGfXzonA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.17.12",
+ "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/helper-replace-supers": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7",
+ "@babel/plugin-syntax-decorators": "^7.17.12",
+ "charcodes": "^0.2.0"
+ }
+ },
+ "@babel/plugin-proposal-dynamic-import": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz",
+ "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-export-namespace-from": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz",
+ "integrity": "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-json-strings": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz",
+ "integrity": "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/plugin-syntax-json-strings": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-logical-assignment-operators": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz",
+ "integrity": "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+ }
+ },
+ "@babel/plugin-proposal-nullish-coalescing-operator": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz",
+ "integrity": "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-numeric-separator": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz",
+ "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ }
+ },
+ "@babel/plugin-proposal-object-rest-spread": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.12.tgz",
+ "integrity": "sha512-6l9cO3YXXRh4yPCPRA776ZyJ3RobG4ZKJZhp7NDRbKIOeV3dBPG8FXCF7ZtiO2RTCIOkQOph1xDDcc01iWVNjQ==",
+ "dev": true,
+ "requires": {
+ "@babel/compat-data": "^7.17.10",
+ "@babel/helper-compilation-targets": "^7.17.10",
+ "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-transform-parameters": "^7.17.12"
+ }
+ },
+ "@babel/plugin-proposal-optional-catch-binding": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz",
+ "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-optional-chaining": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz",
+ "integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-private-methods": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz",
+ "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.17.12",
+ "@babel/helper-plugin-utils": "^7.17.12"
+ }
+ },
+ "@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz",
+ "integrity": "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-create-class-features-plugin": "^7.17.12",
+ "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+ }
+ },
+ "@babel/plugin-proposal-unicode-property-regex": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz",
+ "integrity": "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.17.12",
+ "@babel/helper-plugin-utils": "^7.17.12"
+ }
+ },
+ "@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-syntax-decorators": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.12.tgz",
+ "integrity": "sha512-D1Hz0qtGTza8K2xGyEdVNCYLdVHukAcbQr4K3/s6r/esadyEriZovpJimQOpu8ju4/jV8dW/1xdaE0UpDroidw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12"
+ }
+ },
+ "@babel/plugin-syntax-dynamic-import": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-export-namespace-from": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+ "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.3"
+ }
+ },
+ "@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-jsx": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz",
+ "integrity": "sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12"
+ }
+ },
+ "@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-transform-arrow-functions": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz",
+ "integrity": "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12"
+ }
+ },
+ "@babel/plugin-transform-async-to-generator": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz",
+ "integrity": "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/helper-remap-async-to-generator": "^7.16.8"
+ }
+ },
+ "@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz",
+ "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-block-scoping": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.17.12.tgz",
+ "integrity": "sha512-jw8XW/B1i7Lqwqj2CbrViPcZijSxfguBWZP2aN59NHgxUyO/OcO1mfdCxH13QhN5LbWhPkX+f+brKGhZTiqtZQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12"
+ }
+ },
+ "@babel/plugin-transform-classes": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.17.12.tgz",
+ "integrity": "sha512-cvO7lc7pZat6BsvH6l/EGaI8zpl8paICaoGk+7x7guvtfak/TbIf66nYmJOH13EuG0H+Xx3M+9LQDtSvZFKXKw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-function-name": "^7.17.9",
+ "@babel/helper-optimise-call-expression": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/helper-replace-supers": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7",
+ "globals": "^11.1.0"
+ }
+ },
+ "@babel/plugin-transform-computed-properties": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz",
+ "integrity": "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12"
+ }
+ },
+ "@babel/plugin-transform-destructuring": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.12.tgz",
+ "integrity": "sha512-P8pt0YiKtX5UMUL5Xzsc9Oyij+pJE6JuC+F1k0/brq/OOGs5jDa1If3OY0LRWGvJsJhI+8tsiecL3nJLc0WTlg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12"
+ }
+ },
+ "@babel/plugin-transform-dotall-regex": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz",
+ "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-duplicate-keys": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz",
+ "integrity": "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12"
+ }
+ },
+ "@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz",
+ "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-for-of": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.17.12.tgz",
+ "integrity": "sha512-76lTwYaCxw8ldT7tNmye4LLwSoKDbRCBzu6n/DcK/P3FOR29+38CIIaVIZfwol9By8W/QHORYEnYSLuvcQKrsg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12"
+ }
+ },
+ "@babel/plugin-transform-function-name": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz",
+ "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-compilation-targets": "^7.16.7",
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-literals": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz",
+ "integrity": "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12"
+ }
+ },
+ "@babel/plugin-transform-member-expression-literals": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz",
+ "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-modules-amd": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.17.12.tgz",
+ "integrity": "sha512-p5rt9tB5Ndcc2Za7CeNxVf7YAjRcUMR6yi8o8tKjb9KhRkEvXwa+C0hj6DA5bVDkKRxB0NYhMUGbVKoFu4+zEA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-transforms": "^7.17.12",
+ "@babel/helper-plugin-utils": "^7.17.12",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ }
+ },
+ "@babel/plugin-transform-modules-commonjs": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.12.tgz",
+ "integrity": "sha512-tVPs6MImAJz+DiX8Y1xXEMdTk5Lwxu9jiPjlS+nv5M2A59R7+/d1+9A8C/sbuY0b3QjIxqClkj6KAplEtRvzaA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-transforms": "^7.17.12",
+ "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/helper-simple-access": "^7.17.7",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ }
+ },
+ "@babel/plugin-transform-modules-systemjs": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.12.tgz",
+ "integrity": "sha512-NVhDb0q00hqZcuLduUf/kMzbOQHiocmPbIxIvk23HLiEqaTKC/l4eRxeC7lO63M72BmACoiKOcb9AkOAJRerpw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-hoist-variables": "^7.16.7",
+ "@babel/helper-module-transforms": "^7.17.12",
+ "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ }
+ },
+ "@babel/plugin-transform-modules-umd": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.17.12.tgz",
+ "integrity": "sha512-BnsPkrUHsjzZGpnrmJeDFkOMMljWFHPjDc9xDcz71/C+ybF3lfC3V4m3dwXPLZrE5b3bgd4V+3/Pj+3620d7IA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-transforms": "^7.17.12",
+ "@babel/helper-plugin-utils": "^7.17.12"
+ }
+ },
+ "@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz",
+ "integrity": "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.17.12",
+ "@babel/helper-plugin-utils": "^7.17.12"
+ }
+ },
+ "@babel/plugin-transform-new-target": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz",
+ "integrity": "sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12"
+ }
+ },
+ "@babel/plugin-transform-object-super": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz",
+ "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-replace-supers": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-parameters": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz",
+ "integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12"
+ }
+ },
+ "@babel/plugin-transform-property-literals": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz",
+ "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-regenerator": {
+ "version": "7.17.9",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz",
+ "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==",
+ "dev": true,
+ "requires": {
+ "regenerator-transform": "^0.15.0"
+ }
+ },
+ "@babel/plugin-transform-reserved-words": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz",
+ "integrity": "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12"
+ }
+ },
+ "@babel/plugin-transform-runtime": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.12.tgz",
+ "integrity": "sha512-xsl5MeGjWnmV6Ui9PfILM2+YRpa3GqLOrczPpXV3N2KCgQGU+sU8OfzuMbjkIdfvZEZIm+3y0V7w58sk0SGzlw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.17.12",
+ "babel-plugin-polyfill-corejs2": "^0.3.0",
+ "babel-plugin-polyfill-corejs3": "^0.5.0",
+ "babel-plugin-polyfill-regenerator": "^0.3.0",
+ "semver": "^6.3.0"
+ }
+ },
+ "@babel/plugin-transform-shorthand-properties": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz",
+ "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-spread": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz",
+ "integrity": "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0"
+ }
+ },
+ "@babel/plugin-transform-sticky-regex": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz",
+ "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-template-literals": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.17.12.tgz",
+ "integrity": "sha512-kAKJ7DX1dSRa2s7WN1xUAuaQmkTpN+uig4wCKWivVXIObqGbVTUlSavHyfI2iZvz89GFAMGm9p2DBJ4Y1Tp0hw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12"
+ }
+ },
+ "@babel/plugin-transform-typeof-symbol": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz",
+ "integrity": "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12"
+ }
+ },
+ "@babel/plugin-transform-unicode-escapes": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz",
+ "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-unicode-regex": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz",
+ "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/preset-env": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.17.12.tgz",
+ "integrity": "sha512-Kke30Rj3Lmcx97bVs71LO0s8M6FmJ7tUAQI9fNId62rf0cYG1UAWwdNO9/sE0/pLEahAw1MqMorymoD12bj5Fg==",
+ "dev": true,
+ "requires": {
+ "@babel/compat-data": "^7.17.10",
+ "@babel/helper-compilation-targets": "^7.17.10",
+ "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/helper-validator-option": "^7.16.7",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.17.12",
+ "@babel/plugin-proposal-async-generator-functions": "^7.17.12",
+ "@babel/plugin-proposal-class-properties": "^7.17.12",
+ "@babel/plugin-proposal-class-static-block": "^7.17.12",
+ "@babel/plugin-proposal-dynamic-import": "^7.16.7",
+ "@babel/plugin-proposal-export-namespace-from": "^7.17.12",
+ "@babel/plugin-proposal-json-strings": "^7.17.12",
+ "@babel/plugin-proposal-logical-assignment-operators": "^7.17.12",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12",
+ "@babel/plugin-proposal-numeric-separator": "^7.16.7",
+ "@babel/plugin-proposal-object-rest-spread": "^7.17.12",
+ "@babel/plugin-proposal-optional-catch-binding": "^7.16.7",
+ "@babel/plugin-proposal-optional-chaining": "^7.17.12",
+ "@babel/plugin-proposal-private-methods": "^7.17.12",
+ "@babel/plugin-proposal-private-property-in-object": "^7.17.12",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.17.12",
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5",
+ "@babel/plugin-transform-arrow-functions": "^7.17.12",
+ "@babel/plugin-transform-async-to-generator": "^7.17.12",
+ "@babel/plugin-transform-block-scoped-functions": "^7.16.7",
+ "@babel/plugin-transform-block-scoping": "^7.17.12",
+ "@babel/plugin-transform-classes": "^7.17.12",
+ "@babel/plugin-transform-computed-properties": "^7.17.12",
+ "@babel/plugin-transform-destructuring": "^7.17.12",
+ "@babel/plugin-transform-dotall-regex": "^7.16.7",
+ "@babel/plugin-transform-duplicate-keys": "^7.17.12",
+ "@babel/plugin-transform-exponentiation-operator": "^7.16.7",
+ "@babel/plugin-transform-for-of": "^7.17.12",
+ "@babel/plugin-transform-function-name": "^7.16.7",
+ "@babel/plugin-transform-literals": "^7.17.12",
+ "@babel/plugin-transform-member-expression-literals": "^7.16.7",
+ "@babel/plugin-transform-modules-amd": "^7.17.12",
+ "@babel/plugin-transform-modules-commonjs": "^7.17.12",
+ "@babel/plugin-transform-modules-systemjs": "^7.17.12",
+ "@babel/plugin-transform-modules-umd": "^7.17.12",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12",
+ "@babel/plugin-transform-new-target": "^7.17.12",
+ "@babel/plugin-transform-object-super": "^7.16.7",
+ "@babel/plugin-transform-parameters": "^7.17.12",
+ "@babel/plugin-transform-property-literals": "^7.16.7",
+ "@babel/plugin-transform-regenerator": "^7.17.9",
+ "@babel/plugin-transform-reserved-words": "^7.17.12",
+ "@babel/plugin-transform-shorthand-properties": "^7.16.7",
+ "@babel/plugin-transform-spread": "^7.17.12",
+ "@babel/plugin-transform-sticky-regex": "^7.16.7",
+ "@babel/plugin-transform-template-literals": "^7.17.12",
+ "@babel/plugin-transform-typeof-symbol": "^7.17.12",
+ "@babel/plugin-transform-unicode-escapes": "^7.16.7",
+ "@babel/plugin-transform-unicode-regex": "^7.16.7",
+ "@babel/preset-modules": "^0.1.5",
+ "@babel/types": "^7.17.12",
+ "babel-plugin-polyfill-corejs2": "^0.3.0",
+ "babel-plugin-polyfill-corejs3": "^0.5.0",
+ "babel-plugin-polyfill-regenerator": "^0.3.0",
+ "core-js-compat": "^3.22.1",
+ "semver": "^6.3.0"
+ }
+ },
+ "@babel/preset-modules": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz",
+ "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+ "@babel/plugin-transform-dotall-regex": "^7.4.4",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ }
+ },
+ "@babel/runtime": {
+ "version": "7.17.9",
+ "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.17.9.tgz",
+ "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==",
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "@babel/runtime-corejs3": {
+ "version": "7.23.5",
+ "resolved": "https://registry.npmmirror.com/@babel/runtime-corejs3/-/runtime-corejs3-7.23.5.tgz",
+ "integrity": "sha512-7+ziVclejQTLYhXl+Oi1f6gTGD1XDCeLa4R472TNGQxb08zbEJ0OdNoh5Piz+57Ltmui6xR88BXR4gS3/Toslw==",
+ "requires": {
+ "core-js-pure": "^3.30.2",
+ "regenerator-runtime": "^0.14.0"
+ },
+ "dependencies": {
+ "regenerator-runtime": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
+ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA=="
+ }
+ }
+ },
+ "@babel/template": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.16.7.tgz",
+ "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.16.7",
+ "@babel/parser": "^7.16.7",
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.17.12.tgz",
+ "integrity": "sha512-zULPs+TbCvOkIFd4FrG53xrpxvCBwLIgo6tO0tJorY7YV2IWFxUfS/lXDJbGgfyYt9ery/Gxj2niwttNnB0gIw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.16.7",
+ "@babel/generator": "^7.17.12",
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-function-name": "^7.17.9",
+ "@babel/helper-hoist-variables": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7",
+ "@babel/parser": "^7.17.12",
+ "@babel/types": "^7.17.12",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ }
+ },
+ "@babel/types": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.17.12.tgz",
+ "integrity": "sha512-rH8i29wcZ6x9xjzI5ILHL/yZkbQnCERdHlogKuIb4PUr7do4iT8DPekrTbBLWTnRQm6U0GYABbTMSzijmEqlAg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "@dreysolano/prerender-spa-plugin": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/@dreysolano/prerender-spa-plugin/-/prerender-spa-plugin-1.0.3.tgz",
+ "integrity": "sha512-AIYhpslyX3T1yyQ55I10GuuB+HeIgwOalOTJLGgMYvwdn+SyQk0fKlsZA0ScafDssY4OHoqcG55yFBrpz4zM7Q==",
+ "requires": {
+ "@prerenderer/prerenderer": "^0.7.2",
+ "@prerenderer/renderer-puppeteer": "^0.2.0",
+ "html-minifier": "^4.0.0"
+ },
+ "dependencies": {
+ "html-minifier": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/html-minifier/-/html-minifier-4.0.0.tgz",
+ "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==",
+ "requires": {
+ "camel-case": "^3.0.0",
+ "clean-css": "^4.2.1",
+ "commander": "^2.19.0",
+ "he": "^1.2.0",
+ "param-case": "^2.1.1",
+ "relateurl": "^0.2.7",
+ "uglify-js": "^3.5.1"
+ }
+ },
+ "uglify-js": {
+ "version": "3.19.3",
+ "resolved": "https://registry.npmmirror.com/uglify-js/-/uglify-js-3.19.3.tgz",
+ "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="
+ }
+ }
+ },
+ "@hapi/address": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmmirror.com/@hapi/address/-/address-2.1.4.tgz",
+ "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==",
+ "dev": true
+ },
+ "@hapi/bourne": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmmirror.com/@hapi/bourne/-/bourne-1.3.2.tgz",
+ "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==",
+ "dev": true
+ },
+ "@hapi/hoek": {
+ "version": "8.5.1",
+ "resolved": "https://registry.npmmirror.com/@hapi/hoek/-/hoek-8.5.1.tgz",
+ "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==",
+ "dev": true
+ },
+ "@hapi/joi": {
+ "version": "15.1.1",
+ "resolved": "https://registry.npmmirror.com/@hapi/joi/-/joi-15.1.1.tgz",
+ "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==",
+ "dev": true,
+ "requires": {
+ "@hapi/address": "2.x.x",
+ "@hapi/bourne": "1.x.x",
+ "@hapi/hoek": "8.x.x",
+ "@hapi/topo": "3.x.x"
+ }
+ },
+ "@hapi/topo": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmmirror.com/@hapi/topo/-/topo-3.1.6.tgz",
+ "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==",
+ "dev": true,
+ "requires": {
+ "@hapi/hoek": "^8.3.0"
+ }
+ },
+ "@intervolga/optimize-cssnano-plugin": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz",
+ "integrity": "sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==",
+ "dev": true,
+ "requires": {
+ "cssnano": "^4.0.0",
+ "cssnano-preset-default": "^4.0.0",
+ "postcss": "^7.0.0"
+ }
+ },
+ "@jridgewell/gen-mapping": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
+ "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/set-array": "^1.0.0",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "@jridgewell/resolve-uri": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz",
+ "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==",
+ "dev": true
+ },
+ "@jridgewell/set-array": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.1.tgz",
+ "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==",
+ "dev": true
+ },
+ "@jridgewell/sourcemap-codec": {
+ "version": "1.4.13",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz",
+ "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==",
+ "dev": true
+ },
+ "@jridgewell/trace-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz",
+ "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmmirror.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "^1.0.1",
+ "glob-to-regexp": "^0.3.0"
+ }
+ },
+ "@node-ipc/js-queue": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/@node-ipc/js-queue/-/js-queue-2.0.3.tgz",
+ "integrity": "sha512-fL1wpr8hhD5gT2dA1qifeVaoDFlQR5es8tFuKqjHX+kdOtdNHnxkVZbtIrR2rxnMFvehkjaZRNV2H/gPXlb0hw==",
+ "dev": true,
+ "requires": {
+ "easy-stack": "1.0.1"
+ }
+ },
+ "@nodelib/fs.stat": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
+ "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
+ "dev": true
+ },
+ "@prerenderer/prerenderer": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmmirror.com/@prerenderer/prerenderer/-/prerenderer-0.7.2.tgz",
+ "integrity": "sha512-zWG3uFnrQWDJQoSzGB8bOnNhJCgIiylVYDFBP7Nw2LqngHOqwvpdBtGSjfajC8+fdR/iB2FqMqe27cfdmf/8TQ==",
+ "requires": {
+ "express": "^4.16.2",
+ "http-proxy-middleware": "^0.18.0",
+ "portfinder": "^1.0.13"
+ },
+ "dependencies": {
+ "http-proxy-middleware": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz",
+ "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==",
+ "requires": {
+ "http-proxy": "^1.16.2",
+ "is-glob": "^4.0.0",
+ "lodash": "^4.17.5",
+ "micromatch": "^3.1.9"
+ }
+ }
+ }
+ },
+ "@prerenderer/renderer-puppeteer": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmmirror.com/@prerenderer/renderer-puppeteer/-/renderer-puppeteer-0.2.0.tgz",
+ "integrity": "sha512-sC8WBcYcXbqm6premzCcUNDRROtAwBtBewUuzHyKcYDqU6InqjfpUQEXdIlhikN0gvqzlJy1+c7OJSfNYi4/tg==",
+ "requires": {
+ "promise-limit": "^2.5.0",
+ "puppeteer": "^1.7.0"
+ }
+ },
+ "@soda/friendly-errors-webpack-plugin": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmmirror.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz",
+ "integrity": "sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^3.0.0",
+ "error-stack-parser": "^2.0.6",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@soda/get-current-script": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/@soda/get-current-script/-/get-current-script-1.0.2.tgz",
+ "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==",
+ "dev": true
+ },
+ "@transloadit/prettier-bytes": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmmirror.com/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz",
+ "integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA=="
+ },
+ "@types/body-parser": {
+ "version": "1.19.2",
+ "resolved": "https://registry.npmmirror.com/@types/body-parser/-/body-parser-1.19.2.tgz",
+ "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
+ "dev": true,
+ "requires": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "@types/connect": {
+ "version": "3.4.35",
+ "resolved": "https://registry.npmmirror.com/@types/connect/-/connect-3.4.35.tgz",
+ "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/connect-history-api-fallback": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmmirror.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz",
+ "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==",
+ "dev": true,
+ "requires": {
+ "@types/express-serve-static-core": "*",
+ "@types/node": "*"
+ }
+ },
+ "@types/event-emitter": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmmirror.com/@types/event-emitter/-/event-emitter-0.3.5.tgz",
+ "integrity": "sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ=="
+ },
+ "@types/express": {
+ "version": "4.17.13",
+ "resolved": "https://registry.npmmirror.com/@types/express/-/express-4.17.13.tgz",
+ "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==",
+ "dev": true,
+ "requires": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^4.17.18",
+ "@types/qs": "*",
+ "@types/serve-static": "*"
+ }
+ },
+ "@types/express-serve-static-core": {
+ "version": "4.17.28",
+ "resolved": "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz",
+ "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*"
+ }
+ },
+ "@types/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/@types/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==",
+ "dev": true,
+ "requires": {
+ "@types/minimatch": "*",
+ "@types/node": "*"
+ }
+ },
+ "@types/http-proxy": {
+ "version": "1.17.9",
+ "resolved": "https://registry.npmmirror.com/@types/http-proxy/-/http-proxy-1.17.9.tgz",
+ "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/json-schema": {
+ "version": "7.0.11",
+ "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.11.tgz",
+ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
+ "dev": true
+ },
+ "@types/mime": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmmirror.com/@types/mime/-/mime-1.3.2.tgz",
+ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmmirror.com/@types/minimatch/-/minimatch-3.0.5.tgz",
+ "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==",
+ "dev": true
+ },
+ "@types/minimist": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmmirror.com/@types/minimist/-/minimist-1.2.2.tgz",
+ "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "17.0.34",
+ "resolved": "https://registry.npmmirror.com/@types/node/-/node-17.0.34.tgz",
+ "integrity": "sha512-XImEz7XwTvDBtzlTnm8YvMqGW/ErMWBsKZ+hMTvnDIjGCKxwK5Xpc+c/oQjOauwq8M4OS11hEkpjX8rrI/eEgA==",
+ "dev": true
+ },
+ "@types/normalize-package-data": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
+ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
+ "dev": true
+ },
+ "@types/q": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmmirror.com/@types/q/-/q-1.5.5.tgz",
+ "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==",
+ "dev": true
+ },
+ "@types/qs": {
+ "version": "6.9.7",
+ "resolved": "https://registry.npmmirror.com/@types/qs/-/qs-6.9.7.tgz",
+ "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
+ "dev": true
+ },
+ "@types/range-parser": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmmirror.com/@types/range-parser/-/range-parser-1.2.4.tgz",
+ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==",
+ "dev": true
+ },
+ "@types/sax": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz",
+ "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/serve-static": {
+ "version": "1.13.10",
+ "resolved": "https://registry.npmmirror.com/@types/serve-static/-/serve-static-1.13.10.tgz",
+ "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
+ "dev": true,
+ "requires": {
+ "@types/mime": "^1",
+ "@types/node": "*"
+ }
+ },
+ "@types/source-list-map": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmmirror.com/@types/source-list-map/-/source-list-map-0.1.2.tgz",
+ "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==",
+ "dev": true
+ },
+ "@types/tapable": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmmirror.com/@types/tapable/-/tapable-1.0.8.tgz",
+ "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==",
+ "dev": true
+ },
+ "@types/uglify-js": {
+ "version": "3.13.2",
+ "resolved": "https://registry.npmmirror.com/@types/uglify-js/-/uglify-js-3.13.2.tgz",
+ "integrity": "sha512-/xFrPIo+4zOeNGtVMbf9rUm0N+i4pDf1ynExomqtokIJmVzR3962lJ1UE+MmexMkA0cmN9oTzg5Xcbwge0Ij2Q==",
+ "dev": true,
+ "requires": {
+ "source-map": "^0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "@types/webpack": {
+ "version": "4.41.32",
+ "resolved": "https://registry.npmmirror.com/@types/webpack/-/webpack-4.41.32.tgz",
+ "integrity": "sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*",
+ "@types/tapable": "^1",
+ "@types/uglify-js": "*",
+ "@types/webpack-sources": "*",
+ "anymatch": "^3.0.0",
+ "source-map": "^0.6.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "@types/webpack-dev-server": {
+ "version": "3.11.6",
+ "resolved": "https://registry.npmmirror.com/@types/webpack-dev-server/-/webpack-dev-server-3.11.6.tgz",
+ "integrity": "sha512-XCph0RiiqFGetukCTC3KVnY1jwLcZ84illFRMbyFzCcWl90B/76ew0tSqF46oBhnLC4obNDG7dMO0JfTN0MgMQ==",
+ "dev": true,
+ "requires": {
+ "@types/connect-history-api-fallback": "*",
+ "@types/express": "*",
+ "@types/serve-static": "*",
+ "@types/webpack": "^4",
+ "http-proxy-middleware": "^1.0.0"
+ }
+ },
+ "@types/webpack-sources": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/@types/webpack-sources/-/webpack-sources-3.2.0.tgz",
+ "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*",
+ "@types/source-list-map": "*",
+ "source-map": "^0.7.3"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+ "dev": true
+ }
+ }
+ },
+ "@uppy/companion-client": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmmirror.com/@uppy/companion-client/-/companion-client-2.2.2.tgz",
+ "integrity": "sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==",
+ "requires": {
+ "@uppy/utils": "^4.1.2",
+ "namespace-emitter": "^2.0.1"
+ }
+ },
+ "@uppy/core": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmmirror.com/@uppy/core/-/core-2.3.4.tgz",
+ "integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==",
+ "requires": {
+ "@transloadit/prettier-bytes": "0.0.7",
+ "@uppy/store-default": "^2.1.1",
+ "@uppy/utils": "^4.1.3",
+ "lodash.throttle": "^4.1.1",
+ "mime-match": "^1.0.2",
+ "namespace-emitter": "^2.0.1",
+ "nanoid": "^3.1.25",
+ "preact": "^10.5.13"
+ }
+ },
+ "@uppy/store-default": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/@uppy/store-default/-/store-default-2.1.1.tgz",
+ "integrity": "sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ=="
+ },
+ "@uppy/utils": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmmirror.com/@uppy/utils/-/utils-4.1.3.tgz",
+ "integrity": "sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==",
+ "requires": {
+ "lodash.throttle": "^4.1.1"
+ }
+ },
+ "@uppy/xhr-upload": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz",
+ "integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==",
+ "requires": {
+ "@uppy/companion-client": "^2.2.2",
+ "@uppy/utils": "^4.1.2",
+ "nanoid": "^3.1.25"
+ }
+ },
+ "@vue/babel-helper-vue-jsx-merge-props": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz",
+ "integrity": "sha512-QOi5OW45e2R20VygMSNhyQHvpdUwQZqGPc748JLGCYEy+yp8fNFNdbNIGAgZmi9e+2JHPd6i6idRuqivyicIkA==",
+ "dev": true
+ },
+ "@vue/babel-helper-vue-transform-on": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz",
+ "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==",
+ "dev": true
+ },
+ "@vue/babel-plugin-jsx": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz",
+ "integrity": "sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "^7.0.0",
+ "@babel/plugin-syntax-jsx": "^7.0.0",
+ "@babel/template": "^7.0.0",
+ "@babel/traverse": "^7.0.0",
+ "@babel/types": "^7.0.0",
+ "@vue/babel-helper-vue-transform-on": "^1.0.2",
+ "camelcase": "^6.0.0",
+ "html-tags": "^3.1.0",
+ "svg-tags": "^1.0.0"
+ }
+ },
+ "@vue/babel-plugin-transform-vue-jsx": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.2.1.tgz",
+ "integrity": "sha512-HJuqwACYehQwh1fNT8f4kyzqlNMpBuUK4rSiSES5D4QsYncv5fxFsLyrxFPG2ksO7t5WP+Vgix6tt6yKClwPzA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "^7.0.0",
+ "@babel/plugin-syntax-jsx": "^7.2.0",
+ "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1",
+ "html-tags": "^2.0.0",
+ "lodash.kebabcase": "^4.1.1",
+ "svg-tags": "^1.0.0"
+ },
+ "dependencies": {
+ "html-tags": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/html-tags/-/html-tags-2.0.0.tgz",
+ "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==",
+ "dev": true
+ }
+ }
+ },
+ "@vue/babel-preset-app": {
+ "version": "4.5.17",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-preset-app/-/babel-preset-app-4.5.17.tgz",
+ "integrity": "sha512-iFv9J3F5VKUPcbx+TqW5qhGmAVyXQxPRpKpPOuTLFIVTzg+iwJnrqVbL4kJU5ECGDxPESW2oCVgxv9bTlDPu7w==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.11.0",
+ "@babel/helper-compilation-targets": "^7.9.6",
+ "@babel/helper-module-imports": "^7.8.3",
+ "@babel/plugin-proposal-class-properties": "^7.8.3",
+ "@babel/plugin-proposal-decorators": "^7.8.3",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-syntax-jsx": "^7.8.3",
+ "@babel/plugin-transform-runtime": "^7.11.0",
+ "@babel/preset-env": "^7.11.0",
+ "@babel/runtime": "^7.11.0",
+ "@vue/babel-plugin-jsx": "^1.0.3",
+ "@vue/babel-preset-jsx": "^1.2.4",
+ "babel-plugin-dynamic-import-node": "^2.3.3",
+ "core-js": "^3.6.5",
+ "core-js-compat": "^3.6.5",
+ "semver": "^6.1.0"
+ }
+ },
+ "@vue/babel-preset-jsx": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.4.tgz",
+ "integrity": "sha512-oRVnmN2a77bYDJzeGSt92AuHXbkIxbf/XXSE3klINnh9AXBmVS1DGa1f0d+dDYpLfsAKElMnqKTQfKn7obcL4w==",
+ "dev": true,
+ "requires": {
+ "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1",
+ "@vue/babel-plugin-transform-vue-jsx": "^1.2.1",
+ "@vue/babel-sugar-composition-api-inject-h": "^1.2.1",
+ "@vue/babel-sugar-composition-api-render-instance": "^1.2.4",
+ "@vue/babel-sugar-functional-vue": "^1.2.2",
+ "@vue/babel-sugar-inject-h": "^1.2.2",
+ "@vue/babel-sugar-v-model": "^1.2.3",
+ "@vue/babel-sugar-v-on": "^1.2.3"
+ }
+ },
+ "@vue/babel-sugar-composition-api-inject-h": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.2.1.tgz",
+ "integrity": "sha512-4B3L5Z2G+7s+9Bwbf+zPIifkFNcKth7fQwekVbnOA3cr3Pq71q71goWr97sk4/yyzH8phfe5ODVzEjX7HU7ItQ==",
+ "dev": true,
+ "requires": {
+ "@babel/plugin-syntax-jsx": "^7.2.0"
+ }
+ },
+ "@vue/babel-sugar-composition-api-render-instance": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.2.4.tgz",
+ "integrity": "sha512-joha4PZznQMsxQYXtR3MnTgCASC9u3zt9KfBxIeuI5g2gscpTsSKRDzWQt4aqNIpx6cv8On7/m6zmmovlNsG7Q==",
+ "dev": true,
+ "requires": {
+ "@babel/plugin-syntax-jsx": "^7.2.0"
+ }
+ },
+ "@vue/babel-sugar-functional-vue": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.2.2.tgz",
+ "integrity": "sha512-JvbgGn1bjCLByIAU1VOoepHQ1vFsroSA/QkzdiSs657V79q6OwEWLCQtQnEXD/rLTA8rRit4rMOhFpbjRFm82w==",
+ "dev": true,
+ "requires": {
+ "@babel/plugin-syntax-jsx": "^7.2.0"
+ }
+ },
+ "@vue/babel-sugar-inject-h": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.2.2.tgz",
+ "integrity": "sha512-y8vTo00oRkzQTgufeotjCLPAvlhnpSkcHFEp60+LJUwygGcd5Chrpn5480AQp/thrxVm8m2ifAk0LyFel9oCnw==",
+ "dev": true,
+ "requires": {
+ "@babel/plugin-syntax-jsx": "^7.2.0"
+ }
+ },
+ "@vue/babel-sugar-v-model": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.2.3.tgz",
+ "integrity": "sha512-A2jxx87mySr/ulAsSSyYE8un6SIH0NWHiLaCWpodPCVOlQVODCaSpiR4+IMsmBr73haG+oeCuSvMOM+ttWUqRQ==",
+ "dev": true,
+ "requires": {
+ "@babel/plugin-syntax-jsx": "^7.2.0",
+ "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1",
+ "@vue/babel-plugin-transform-vue-jsx": "^1.2.1",
+ "camelcase": "^5.0.0",
+ "html-tags": "^2.0.0",
+ "svg-tags": "^1.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "html-tags": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/html-tags/-/html-tags-2.0.0.tgz",
+ "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==",
+ "dev": true
+ }
+ }
+ },
+ "@vue/babel-sugar-v-on": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.2.3.tgz",
+ "integrity": "sha512-kt12VJdz/37D3N3eglBywV8GStKNUhNrsxChXIV+o0MwVXORYuhDTHJRKPgLJRb/EY3vM2aRFQdxJBp9CLikjw==",
+ "dev": true,
+ "requires": {
+ "@babel/plugin-syntax-jsx": "^7.2.0",
+ "@vue/babel-plugin-transform-vue-jsx": "^1.2.1",
+ "camelcase": "^5.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ }
+ }
+ },
+ "@vue/cli-overlay": {
+ "version": "4.5.17",
+ "resolved": "https://registry.npmmirror.com/@vue/cli-overlay/-/cli-overlay-4.5.17.tgz",
+ "integrity": "sha512-QKKp66VbMg+X8Qh0wgXSwgxLfxY7EIkZkV6bZ6nFqBx8xtaJQVDbTL+4zcUPPA6nygbIcQ6gvTinNEqIqX6FUQ==",
+ "dev": true
+ },
+ "@vue/cli-plugin-babel": {
+ "version": "4.5.17",
+ "resolved": "https://registry.npmmirror.com/@vue/cli-plugin-babel/-/cli-plugin-babel-4.5.17.tgz",
+ "integrity": "sha512-6kZuc3PdoUvGAnndUq6+GqjIXn3bqdTR8lOcAb1BH2b4N7IKGlmzcipALGS23HLVMAvDgNuUS7vf0unin9j2cg==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.11.0",
+ "@vue/babel-preset-app": "^4.5.17",
+ "@vue/cli-shared-utils": "^4.5.17",
+ "babel-loader": "^8.1.0",
+ "cache-loader": "^4.1.0",
+ "thread-loader": "^2.1.3",
+ "webpack": "^4.0.0"
+ }
+ },
+ "@vue/cli-plugin-eslint": {
+ "version": "4.5.17",
+ "resolved": "https://registry.npmmirror.com/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.5.17.tgz",
+ "integrity": "sha512-bVNDP+SuWcuJrBMc+JLaKvlxx25XKIlZBa+zzFnxhHZlwPZ7CeBD3e2wnsygJyPoKgDZcZwDgmEz1BZzMEjsNw==",
+ "dev": true,
+ "requires": {
+ "@vue/cli-shared-utils": "^4.5.17",
+ "eslint-loader": "^2.2.1",
+ "globby": "^9.2.0",
+ "inquirer": "^7.1.0",
+ "webpack": "^4.0.0",
+ "yorkie": "^2.0.0"
+ }
+ },
+ "@vue/cli-plugin-router": {
+ "version": "4.5.17",
+ "resolved": "https://registry.npmmirror.com/@vue/cli-plugin-router/-/cli-plugin-router-4.5.17.tgz",
+ "integrity": "sha512-9r9CSwqv2+39XHQPDZJ0uaTtTP7oe0Gx17m7kBhHG3FA7R7AOSk2aVzhHZmDRhzlOxjx9kQSvrOSMfUG0kV4dQ==",
+ "dev": true,
+ "requires": {
+ "@vue/cli-shared-utils": "^4.5.17"
+ }
+ },
+ "@vue/cli-plugin-vuex": {
+ "version": "4.5.17",
+ "resolved": "https://registry.npmmirror.com/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.5.17.tgz",
+ "integrity": "sha512-ck/ju2T2dmPKLWK/5QctNJs9SCb+eSZbbmr8neFkMc7GlbXw6qLWw5v3Vpd4KevdQA8QuQOA1pjUmzpCiU/mYQ==",
+ "dev": true
+ },
+ "@vue/cli-service": {
+ "version": "4.5.17",
+ "resolved": "https://registry.npmmirror.com/@vue/cli-service/-/cli-service-4.5.17.tgz",
+ "integrity": "sha512-MqfkRYIcIUACe3nYlzNrYstJTWRXHlIqh6JCkbWbdnXWN+IfaVdlG8zw5Q0DVcSdGvkevUW7zB4UhtZB4uyAcA==",
+ "dev": true,
+ "requires": {
+ "@intervolga/optimize-cssnano-plugin": "^1.0.5",
+ "@soda/friendly-errors-webpack-plugin": "^1.7.1",
+ "@soda/get-current-script": "^1.0.0",
+ "@types/minimist": "^1.2.0",
+ "@types/webpack": "^4.0.0",
+ "@types/webpack-dev-server": "^3.11.0",
+ "@vue/cli-overlay": "^4.5.17",
+ "@vue/cli-plugin-router": "^4.5.17",
+ "@vue/cli-plugin-vuex": "^4.5.17",
+ "@vue/cli-shared-utils": "^4.5.17",
+ "@vue/component-compiler-utils": "^3.1.2",
+ "@vue/preload-webpack-plugin": "^1.1.0",
+ "@vue/web-component-wrapper": "^1.2.0",
+ "acorn": "^7.4.0",
+ "acorn-walk": "^7.1.1",
+ "address": "^1.1.2",
+ "autoprefixer": "^9.8.6",
+ "browserslist": "^4.12.0",
+ "cache-loader": "^4.1.0",
+ "case-sensitive-paths-webpack-plugin": "^2.3.0",
+ "cli-highlight": "^2.1.4",
+ "clipboardy": "^2.3.0",
+ "cliui": "^6.0.0",
+ "copy-webpack-plugin": "^5.1.1",
+ "css-loader": "^3.5.3",
+ "cssnano": "^4.1.10",
+ "debug": "^4.1.1",
+ "default-gateway": "^5.0.5",
+ "dotenv": "^8.2.0",
+ "dotenv-expand": "^5.1.0",
+ "file-loader": "^4.2.0",
+ "fs-extra": "^7.0.1",
+ "globby": "^9.2.0",
+ "hash-sum": "^2.0.0",
+ "html-webpack-plugin": "^3.2.0",
+ "launch-editor-middleware": "^2.2.1",
+ "lodash.defaultsdeep": "^4.6.1",
+ "lodash.mapvalues": "^4.6.0",
+ "lodash.transform": "^4.6.0",
+ "mini-css-extract-plugin": "^0.9.0",
+ "minimist": "^1.2.5",
+ "pnp-webpack-plugin": "^1.6.4",
+ "portfinder": "^1.0.26",
+ "postcss-loader": "^3.0.0",
+ "ssri": "^8.0.1",
+ "terser-webpack-plugin": "^1.4.4",
+ "thread-loader": "^2.1.3",
+ "url-loader": "^2.2.0",
+ "vue-loader": "^15.9.2",
+ "vue-loader-v16": "npm:vue-loader@^16.1.0",
+ "vue-style-loader": "^4.1.2",
+ "webpack": "^4.0.0",
+ "webpack-bundle-analyzer": "^3.8.0",
+ "webpack-chain": "^6.4.0",
+ "webpack-dev-server": "^3.11.0",
+ "webpack-merge": "^4.2.2"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "optional": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "optional": true
+ },
+ "ssri": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmmirror.com/ssri/-/ssri-8.0.1.tgz",
+ "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
+ "dev": true,
+ "requires": {
+ "minipass": "^3.1.1"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "vue-loader-v16": {
+ "version": "npm:vue-loader@16.8.3",
+ "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
+ "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chalk": "^4.1.0",
+ "hash-sum": "^2.0.0",
+ "loader-utils": "^2.0.0"
+ }
+ }
+ }
+ },
+ "@vue/cli-shared-utils": {
+ "version": "4.5.17",
+ "resolved": "https://registry.npmmirror.com/@vue/cli-shared-utils/-/cli-shared-utils-4.5.17.tgz",
+ "integrity": "sha512-VoFNdxvTW4vZu3ne+j1Mf7mU99J2SAoRVn9XPrsouTUUJablglM8DASk7Ixhsh6ymyL/W9EADQFR6Pgj8Ujjuw==",
+ "dev": true,
+ "requires": {
+ "@achrinza/node-ipc": "9.2.2",
+ "@hapi/joi": "^15.0.1",
+ "chalk": "^2.4.2",
+ "execa": "^1.0.0",
+ "launch-editor": "^2.2.1",
+ "lru-cache": "^5.1.1",
+ "open": "^6.3.0",
+ "ora": "^3.4.0",
+ "read-pkg": "^5.1.1",
+ "request": "^2.88.2",
+ "semver": "^6.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "@vue/component-compiler-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmmirror.com/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz",
+ "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==",
+ "dev": true,
+ "requires": {
+ "consolidate": "^0.15.1",
+ "hash-sum": "^1.0.2",
+ "lru-cache": "^4.1.2",
+ "merge-source-map": "^1.1.0",
+ "postcss": "^7.0.36",
+ "postcss-selector-parser": "^6.0.2",
+ "prettier": "^1.18.2 || ^2.0.0",
+ "source-map": "~0.6.1",
+ "vue-template-es2015-compiler": "^1.9.0"
+ },
+ "dependencies": {
+ "hash-sum": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz",
+ "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz",
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "dev": true,
+ "requires": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
+ "dev": true
+ }
+ }
+ },
+ "@vue/preload-webpack-plugin": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz",
+ "integrity": "sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==",
+ "dev": true
+ },
+ "@vue/web-component-wrapper": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz",
+ "integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==",
+ "dev": true
+ },
+ "@wangeditor/basic-modules": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz",
+ "integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==",
+ "requires": {
+ "is-url": "^1.2.4"
+ }
+ },
+ "@wangeditor/code-highlight": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz",
+ "integrity": "sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==",
+ "requires": {
+ "prismjs": "^1.23.0"
+ }
+ },
+ "@wangeditor/core": {
+ "version": "1.1.19",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz",
+ "integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==",
+ "requires": {
+ "@types/event-emitter": "^0.3.3",
+ "event-emitter": "^0.3.5",
+ "html-void-elements": "^2.0.0",
+ "i18next": "^20.4.0",
+ "scroll-into-view-if-needed": "^2.2.28",
+ "slate-history": "^0.66.0"
+ }
+ },
+ "@wangeditor/editor": {
+ "version": "5.1.23",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz",
+ "integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==",
+ "requires": {
+ "@uppy/core": "^2.1.1",
+ "@uppy/xhr-upload": "^2.0.3",
+ "@wangeditor/basic-modules": "^1.1.7",
+ "@wangeditor/code-highlight": "^1.0.3",
+ "@wangeditor/core": "^1.1.19",
+ "@wangeditor/list-module": "^1.0.5",
+ "@wangeditor/table-module": "^1.1.4",
+ "@wangeditor/upload-image-module": "^1.0.2",
+ "@wangeditor/video-module": "^1.1.4",
+ "dom7": "^3.0.0",
+ "is-hotkey": "^0.2.0",
+ "lodash.camelcase": "^4.3.0",
+ "lodash.clonedeep": "^4.5.0",
+ "lodash.debounce": "^4.0.8",
+ "lodash.foreach": "^4.5.0",
+ "lodash.isequal": "^4.5.0",
+ "lodash.throttle": "^4.1.1",
+ "lodash.toarray": "^4.4.0",
+ "nanoid": "^3.2.0",
+ "slate": "^0.72.0",
+ "snabbdom": "^3.1.0"
+ }
+ },
+ "@wangeditor/editor-for-vue": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/editor-for-vue/-/editor-for-vue-1.0.2.tgz",
+ "integrity": "sha512-BOENvAXJVtVXlE2X50AAvjV82YlCUeu5cbeR0cvEQHQjYtiVnJtq7HSoj85r2kTgGouI5OrpJG9BBEjSjUSPyA=="
+ },
+ "@wangeditor/list-module": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/list-module/-/list-module-1.0.5.tgz",
+ "integrity": "sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ=="
+ },
+ "@wangeditor/table-module": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/table-module/-/table-module-1.1.4.tgz",
+ "integrity": "sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w=="
+ },
+ "@wangeditor/upload-image-module": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz",
+ "integrity": "sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA=="
+ },
+ "@wangeditor/video-module": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/video-module/-/video-module-1.1.4.tgz",
+ "integrity": "sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg=="
+ },
+ "@webassemblyjs/ast": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.9.0.tgz",
+ "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/helper-module-context": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/wast-parser": "1.9.0"
+ }
+ },
+ "@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz",
+ "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-api-error": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz",
+ "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-buffer": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz",
+ "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-code-frame": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz",
+ "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/wast-printer": "1.9.0"
+ }
+ },
+ "@webassemblyjs/helper-fsm": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz",
+ "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-module-context": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz",
+ "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0"
+ }
+ },
+ "@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
+ "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-wasm-section": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz",
+ "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-buffer": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/wasm-gen": "1.9.0"
+ }
+ },
+ "@webassemblyjs/ieee754": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz",
+ "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==",
+ "dev": true,
+ "requires": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "@webassemblyjs/leb128": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz",
+ "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==",
+ "dev": true,
+ "requires": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "@webassemblyjs/utf8": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz",
+ "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==",
+ "dev": true
+ },
+ "@webassemblyjs/wasm-edit": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz",
+ "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-buffer": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/helper-wasm-section": "1.9.0",
+ "@webassemblyjs/wasm-gen": "1.9.0",
+ "@webassemblyjs/wasm-opt": "1.9.0",
+ "@webassemblyjs/wasm-parser": "1.9.0",
+ "@webassemblyjs/wast-printer": "1.9.0"
+ }
+ },
+ "@webassemblyjs/wasm-gen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz",
+ "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/ieee754": "1.9.0",
+ "@webassemblyjs/leb128": "1.9.0",
+ "@webassemblyjs/utf8": "1.9.0"
+ }
+ },
+ "@webassemblyjs/wasm-opt": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz",
+ "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-buffer": "1.9.0",
+ "@webassemblyjs/wasm-gen": "1.9.0",
+ "@webassemblyjs/wasm-parser": "1.9.0"
+ }
+ },
+ "@webassemblyjs/wasm-parser": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz",
+ "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-api-error": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/ieee754": "1.9.0",
+ "@webassemblyjs/leb128": "1.9.0",
+ "@webassemblyjs/utf8": "1.9.0"
+ }
+ },
+ "@webassemblyjs/wast-parser": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz",
+ "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/floating-point-hex-parser": "1.9.0",
+ "@webassemblyjs/helper-api-error": "1.9.0",
+ "@webassemblyjs/helper-code-frame": "1.9.0",
+ "@webassemblyjs/helper-fsm": "1.9.0",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "@webassemblyjs/wast-printer": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz",
+ "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/wast-parser": "1.9.0",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "dev": true
+ },
+ "@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "dev": true
+ },
+ "accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "requires": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ }
+ },
+ "acorn": {
+ "version": "6.4.2",
+ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-6.4.2.tgz",
+ "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true
+ },
+ "acorn-object-spread": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/acorn-object-spread/-/acorn-object-spread-1.0.0.tgz",
+ "integrity": "sha512-XLGUSlVB4GeniUbk97r+NxLvcQDYNddFBl1WHSvMr/4v5lnNPWHzwHLdXrlBnusvZ0zq2lkjDm7fPEgJpjb4dg==",
+ "requires": {
+ "acorn": "^3.1.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw=="
+ }
+ }
+ },
+ "acorn-walk": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz",
+ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+ "dev": true
+ },
+ "address": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/address/-/address-1.2.0.tgz",
+ "integrity": "sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==",
+ "dev": true
+ },
+ "agent-base": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-4.3.0.tgz",
+ "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
+ "requires": {
+ "es6-promisify": "^5.0.0"
+ }
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-errors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/ajv-errors/-/ajv-errors-1.0.1.tgz",
+ "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
+ "dev": true
+ },
+ "ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true
+ },
+ "alphanum-sort": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
+ "integrity": "sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==",
+ "dev": true
+ },
+ "ansi-colors": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-3.2.4.tgz",
+ "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==",
+ "dev": true
+ },
+ "ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.21.3"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true
+ }
+ }
+ },
+ "ansi-html-community": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmmirror.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
+ "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-4.1.1.tgz",
+ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true
+ },
+ "anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "aproba": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/aproba/-/aproba-1.2.0.tgz",
+ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+ "dev": true
+ },
+ "arch": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/arch/-/arch-2.2.0.tgz",
+ "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
+ "dev": true
+ },
+ "arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "dev": true
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA=="
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q=="
+ },
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
+ },
+ "array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==",
+ "dev": true,
+ "requires": {
+ "array-uniq": "^1.0.1"
+ }
+ },
+ "array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ=="
+ },
+ "asn1": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmmirror.com/asn1/-/asn1-0.2.6.tgz",
+ "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "asn1.js": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmmirror.com/asn1.js/-/asn1.js-5.4.1.tgz",
+ "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "safer-buffer": "^2.1.0"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ }
+ }
+ },
+ "assert": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/assert/-/assert-1.5.0.tgz",
+ "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
+ "dev": true,
+ "requires": {
+ "object-assign": "^4.1.1",
+ "util": "0.10.3"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==",
+ "dev": true
+ },
+ "util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmmirror.com/util/-/util-0.10.3.tgz",
+ "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.1"
+ }
+ }
+ }
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw=="
+ },
+ "astral-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/astral-regex/-/astral-regex-1.0.0.tgz",
+ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+ "dev": true
+ },
+ "async": {
+ "version": "2.6.4",
+ "resolved": "https://registry.npmmirror.com/async/-/async-2.6.4.tgz",
+ "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
+ "requires": {
+ "lodash": "^4.17.14"
+ }
+ },
+ "async-each": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/async-each/-/async-each-1.0.3.tgz",
+ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
+ "dev": true
+ },
+ "async-limiter": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/async-limiter/-/async-limiter-1.0.1.tgz",
+ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
+ },
+ "async-validator": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-1.8.5.tgz",
+ "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
+ "requires": {
+ "babel-runtime": "6.x"
+ }
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "atob": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz",
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
+ },
+ "autoprefixer": {
+ "version": "9.8.8",
+ "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-9.8.8.tgz",
+ "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.12.0",
+ "caniuse-lite": "^1.0.30001109",
+ "normalize-range": "^0.1.2",
+ "num2fraction": "^1.2.2",
+ "picocolors": "^0.2.1",
+ "postcss": "^7.0.32",
+ "postcss-value-parser": "^4.1.0"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ }
+ }
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmmirror.com/aws4/-/aws4-1.11.0.tgz",
+ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
+ "dev": true
+ },
+ "axios": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmmirror.com/axios/-/axios-0.27.2.tgz",
+ "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
+ "requires": {
+ "follow-redirects": "^1.14.9",
+ "form-data": "^4.0.0"
+ },
+ "dependencies": {
+ "form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ }
+ }
+ }
+ },
+ "babel-eslint": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmmirror.com/babel-eslint/-/babel-eslint-10.1.0.tgz",
+ "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "@babel/parser": "^7.7.0",
+ "@babel/traverse": "^7.7.0",
+ "@babel/types": "^7.7.0",
+ "eslint-visitor-keys": "^1.0.0",
+ "resolve": "^1.12.0"
+ }
+ },
+ "babel-helper-vue-jsx-merge-props": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
+ "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
+ },
+ "babel-loader": {
+ "version": "8.2.5",
+ "resolved": "https://registry.npmmirror.com/babel-loader/-/babel-loader-8.2.5.tgz",
+ "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==",
+ "dev": true,
+ "requires": {
+ "find-cache-dir": "^3.3.1",
+ "loader-utils": "^2.0.0",
+ "make-dir": "^3.1.0",
+ "schema-utils": "^2.6.5"
+ }
+ },
+ "babel-plugin-dynamic-import-node": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmmirror.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+ "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
+ "dev": true,
+ "requires": {
+ "object.assign": "^4.1.0"
+ }
+ },
+ "babel-plugin-polyfill-corejs2": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz",
+ "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==",
+ "dev": true,
+ "requires": {
+ "@babel/compat-data": "^7.13.11",
+ "@babel/helper-define-polyfill-provider": "^0.3.1",
+ "semver": "^6.1.1"
+ }
+ },
+ "babel-plugin-polyfill-corejs3": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz",
+ "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-define-polyfill-provider": "^0.3.1",
+ "core-js-compat": "^3.21.0"
+ }
+ },
+ "babel-plugin-polyfill-regenerator": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz",
+ "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-define-polyfill-provider": "^0.3.1"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmmirror.com/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
+ "requires": {
+ "core-js": "^2.4.0",
+ "regenerator-runtime": "^0.11.0"
+ },
+ "dependencies": {
+ "core-js": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+ }
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmmirror.com/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "requires": {
+ "cache-base": "^1.0.1",
+ "class-utils": "^0.3.5",
+ "component-emitter": "^1.2.1",
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.1",
+ "mixin-deep": "^1.2.0",
+ "pascalcase": "^0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true
+ },
+ "batch": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/batch/-/batch-0.6.1.tgz",
+ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
+ "dev": true
+ },
+ "batch-processor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/batch-processor/-/batch-processor-1.0.0.tgz",
+ "integrity": "sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA=="
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+ "dev": true,
+ "requires": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "bfj": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmmirror.com/bfj/-/bfj-6.1.2.tgz",
+ "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==",
+ "dev": true,
+ "requires": {
+ "bluebird": "^3.5.5",
+ "check-types": "^8.0.3",
+ "hoopy": "^0.1.4",
+ "tryer": "^1.0.1"
+ }
+ },
+ "big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "dev": true
+ },
+ "bignumber.js": {
+ "version": "9.1.2",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz",
+ "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug=="
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true
+ },
+ "bindings": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz",
+ "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "file-uri-to-path": "1.0.0"
+ }
+ },
+ "bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true
+ },
+ "bn.js": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-5.2.0.tgz",
+ "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==",
+ "dev": true
+ },
+ "body-parser": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.0.tgz",
+ "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
+ "requires": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.10.3",
+ "raw-body": "2.5.1",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "qs": {
+ "version": "6.10.3",
+ "resolved": "https://registry.npmmirror.com/qs/-/qs-6.10.3.tgz",
+ "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
+ "requires": {
+ "side-channel": "^1.0.4"
+ }
+ }
+ }
+ },
+ "bonjour": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmmirror.com/bonjour/-/bonjour-3.5.0.tgz",
+ "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==",
+ "dev": true,
+ "requires": {
+ "array-flatten": "^2.1.0",
+ "deep-equal": "^1.0.1",
+ "dns-equal": "^1.0.0",
+ "dns-txt": "^2.0.2",
+ "multicast-dns": "^6.0.1",
+ "multicast-dns-service-types": "^1.1.0"
+ },
+ "dependencies": {
+ "array-flatten": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-2.1.2.tgz",
+ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
+ "dev": true
+ }
+ }
+ },
+ "boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
+ "dev": true
+ },
+ "browserify-aes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+ "dev": true,
+ "requires": {
+ "buffer-xor": "^1.0.3",
+ "cipher-base": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.3",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "browserify-cipher": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+ "dev": true,
+ "requires": {
+ "browserify-aes": "^1.0.4",
+ "browserify-des": "^1.0.0",
+ "evp_bytestokey": "^1.0.0"
+ }
+ },
+ "browserify-des": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/browserify-des/-/browserify-des-1.0.2.tgz",
+ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+ "dev": true,
+ "requires": {
+ "cipher-base": "^1.0.1",
+ "des.js": "^1.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "browserify-rsa": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
+ "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^5.0.0",
+ "randombytes": "^2.0.1"
+ }
+ },
+ "browserify-sign": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmmirror.com/browserify-sign/-/browserify-sign-4.2.1.tgz",
+ "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^5.1.1",
+ "browserify-rsa": "^4.0.1",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "elliptic": "^6.5.3",
+ "inherits": "^2.0.4",
+ "parse-asn1": "^5.1.5",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true
+ }
+ }
+ },
+ "browserify-zlib": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmmirror.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+ "dev": true,
+ "requires": {
+ "pako": "~1.0.5"
+ }
+ },
+ "browserslist": {
+ "version": "4.20.3",
+ "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.20.3.tgz",
+ "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30001332",
+ "electron-to-chromium": "^1.4.118",
+ "escalade": "^3.1.1",
+ "node-releases": "^2.0.3",
+ "picocolors": "^1.0.0"
+ }
+ },
+ "buble": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmmirror.com/buble/-/buble-0.15.2.tgz",
+ "integrity": "sha512-SHkzALzgJm7LhA/kfL1C3Os8X2ZuZB1Mg95mLdZM1blK5rdSpTngS01uGMfT98Yf6seQrKKTh/2JxSFdqNnKVA==",
+ "requires": {
+ "acorn": "^3.3.0",
+ "acorn-jsx": "^3.0.1",
+ "acorn-object-spread": "^1.0.0",
+ "chalk": "^1.1.3",
+ "magic-string": "^0.14.0",
+ "minimist": "^1.2.0",
+ "os-homedir": "^1.0.1"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw=="
+ },
+ "acorn-jsx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
+ "integrity": "sha512-AU7pnZkguthwBjKgCg6998ByQNIMjbuDQZ8bb78QAFZwPfmKia8AIzgY/gWgqCjnht8JLdXmB4YxA0KaV60ncQ==",
+ "requires": {
+ "acorn": "^3.0.4"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA=="
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
+ "requires": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g=="
+ }
+ }
+ },
+ "buffer": {
+ "version": "4.9.2",
+ "resolved": "https://registry.npmmirror.com/buffer/-/buffer-4.9.2.tgz",
+ "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
+ "dev": true,
+ "requires": {
+ "base64-js": "^1.0.2",
+ "ieee754": "^1.1.4",
+ "isarray": "^1.0.0"
+ }
+ },
+ "buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="
+ },
+ "buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ },
+ "buffer-indexof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
+ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
+ "dev": true
+ },
+ "buffer-json": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/buffer-json/-/buffer-json-2.0.0.tgz",
+ "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==",
+ "dev": true
+ },
+ "buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==",
+ "dev": true
+ },
+ "builtin-modules": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/builtin-modules/-/builtin-modules-2.0.0.tgz",
+ "integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg=="
+ },
+ "builtin-status-codes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+ "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==",
+ "dev": true
+ },
+ "bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
+ },
+ "cacache": {
+ "version": "12.0.4",
+ "resolved": "https://registry.npmmirror.com/cacache/-/cacache-12.0.4.tgz",
+ "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
+ "dev": true,
+ "requires": {
+ "bluebird": "^3.5.5",
+ "chownr": "^1.1.1",
+ "figgy-pudding": "^3.5.1",
+ "glob": "^7.1.4",
+ "graceful-fs": "^4.1.15",
+ "infer-owner": "^1.0.3",
+ "lru-cache": "^5.1.1",
+ "mississippi": "^3.0.0",
+ "mkdirp": "^0.5.1",
+ "move-concurrently": "^1.0.1",
+ "promise-inflight": "^1.0.1",
+ "rimraf": "^2.6.3",
+ "ssri": "^6.0.1",
+ "unique-filename": "^1.1.1",
+ "y18n": "^4.0.0"
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "requires": {
+ "collection-visit": "^1.0.0",
+ "component-emitter": "^1.2.1",
+ "get-value": "^2.0.6",
+ "has-value": "^1.0.0",
+ "isobject": "^3.0.1",
+ "set-value": "^2.0.0",
+ "to-object-path": "^0.3.0",
+ "union-value": "^1.0.0",
+ "unset-value": "^1.0.0"
+ }
+ },
+ "cache-loader": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/cache-loader/-/cache-loader-4.1.0.tgz",
+ "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==",
+ "dev": true,
+ "requires": {
+ "buffer-json": "^2.0.0",
+ "find-cache-dir": "^3.0.0",
+ "loader-utils": "^1.2.3",
+ "mkdirp": "^0.5.1",
+ "neo-async": "^2.6.1",
+ "schema-utils": "^2.0.0"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ }
+ }
+ },
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==",
+ "dev": true
+ },
+ "caller-callsite": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/caller-callsite/-/caller-callsite-2.0.0.tgz",
+ "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==",
+ "dev": true,
+ "requires": {
+ "callsites": "^2.0.0"
+ }
+ },
+ "caller-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/caller-path/-/caller-path-2.0.0.tgz",
+ "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==",
+ "dev": true,
+ "requires": {
+ "caller-callsite": "^2.0.0"
+ }
+ },
+ "callsites": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/callsites/-/callsites-2.0.0.tgz",
+ "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==",
+ "dev": true
+ },
+ "camel-case": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/camel-case/-/camel-case-3.0.0.tgz",
+ "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==",
+ "requires": {
+ "no-case": "^2.2.0",
+ "upper-case": "^1.1.1"
+ }
+ },
+ "camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true
+ },
+ "caniuse-api": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/caniuse-api/-/caniuse-api-3.0.0.tgz",
+ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.0.0",
+ "caniuse-lite": "^1.0.0",
+ "lodash.memoize": "^4.1.2",
+ "lodash.uniq": "^4.5.0"
+ }
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001341",
+ "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz",
+ "integrity": "sha512-2SodVrFFtvGENGCv0ChVJIDQ0KPaS1cg7/qtfMaICgeMolDdo/Z2OD32F0Aq9yl6F4YFwGPBS5AaPqNYiW4PoA==",
+ "dev": true
+ },
+ "case-sensitive-paths-webpack-plugin": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmmirror.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz",
+ "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "charcodes": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmmirror.com/charcodes/-/charcodes-0.2.0.tgz",
+ "integrity": "sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ==",
+ "dev": true
+ },
+ "chardet": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmmirror.com/chardet/-/chardet-0.7.0.tgz",
+ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+ "dev": true
+ },
+ "check-types": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmmirror.com/check-types/-/check-types-8.0.3.tgz",
+ "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==",
+ "dev": true
+ },
+ "chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "requires": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "dependencies": {
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ }
+ }
+ },
+ "chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+ "dev": true
+ },
+ "chrome-trace-event": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
+ "dev": true
+ },
+ "ci-info": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmmirror.com/ci-info/-/ci-info-1.6.0.tgz",
+ "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==",
+ "dev": true
+ },
+ "cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmmirror.com/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "requires": {
+ "arr-union": "^3.1.0",
+ "define-property": "^0.2.5",
+ "isobject": "^3.0.0",
+ "static-extend": "^0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "clean-css": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-4.2.4.tgz",
+ "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==",
+ "requires": {
+ "source-map": "~0.6.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "^2.0.0"
+ }
+ },
+ "cli-highlight": {
+ "version": "2.1.11",
+ "resolved": "https://registry.npmmirror.com/cli-highlight/-/cli-highlight-2.1.11.tgz",
+ "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.0.0",
+ "highlight.js": "^10.7.1",
+ "mz": "^2.4.0",
+ "parse5": "^5.1.1",
+ "parse5-htmlparser2-tree-adapter": "^6.0.0",
+ "yargs": "^16.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "cli-spinners": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.6.1.tgz",
+ "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==",
+ "dev": true
+ },
+ "cli-width": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/cli-width/-/cli-width-3.0.0.tgz",
+ "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
+ "dev": true
+ },
+ "clipboardy": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/clipboardy/-/clipboardy-2.3.0.tgz",
+ "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==",
+ "dev": true,
+ "requires": {
+ "arch": "^2.1.1",
+ "execa": "^1.0.0",
+ "is-wsl": "^2.1.1"
+ },
+ "dependencies": {
+ "is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "dev": true,
+ "requires": {
+ "is-docker": "^2.0.0"
+ }
+ }
+ }
+ },
+ "cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+ "dev": true
+ },
+ "clone-deep": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/clone-deep/-/clone-deep-4.0.1.tgz",
+ "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4",
+ "kind-of": "^6.0.2",
+ "shallow-clone": "^3.0.0"
+ }
+ },
+ "coa": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/coa/-/coa-2.0.2.tgz",
+ "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
+ "dev": true,
+ "requires": {
+ "@types/q": "^1.5.1",
+ "chalk": "^2.4.1",
+ "q": "^1.1.2"
+ }
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==",
+ "requires": {
+ "map-visit": "^1.0.0",
+ "object-visit": "^1.0.0"
+ }
+ },
+ "color": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmmirror.com/color/-/color-3.2.1.tgz",
+ "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.3",
+ "color-string": "^1.6.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "dev": true,
+ "requires": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+ "dev": true
+ },
+ "component-emitter": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
+ },
+ "compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "dev": true,
+ "requires": {
+ "mime-db": ">= 1.43.0 < 2"
+ }
+ },
+ "compression": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz",
+ "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+ "dev": true,
+ "requires": {
+ "accepts": "~1.3.5",
+ "bytes": "3.0.0",
+ "compressible": "~2.0.16",
+ "debug": "2.6.9",
+ "on-headers": "~1.0.2",
+ "safe-buffer": "5.1.2",
+ "vary": "~1.1.2"
+ },
+ "dependencies": {
+ "bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ }
+ }
+ },
+ "compute-scroll-into-view": {
+ "version": "1.0.20",
+ "resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
+ "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg=="
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmmirror.com/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "connect-history-api-fallback": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
+ "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
+ "dev": true
+ },
+ "console-browserify": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/console-browserify/-/console-browserify-1.2.0.tgz",
+ "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
+ "dev": true
+ },
+ "consolidate": {
+ "version": "0.15.1",
+ "resolved": "https://registry.npmmirror.com/consolidate/-/consolidate-0.15.1.tgz",
+ "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==",
+ "dev": true,
+ "requires": {
+ "bluebird": "^3.1.1"
+ }
+ },
+ "constants-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/constants-browserify/-/constants-browserify-1.0.0.tgz",
+ "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==",
+ "dev": true
+ },
+ "content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "requires": {
+ "safe-buffer": "5.2.1"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ }
+ }
+ },
+ "content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
+ },
+ "convert-source-map": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.8.0.tgz",
+ "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "cookie": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.5.0.tgz",
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
+ },
+ "copy-concurrently": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
+ "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
+ "dev": true,
+ "requires": {
+ "aproba": "^1.1.1",
+ "fs-write-stream-atomic": "^1.0.8",
+ "iferr": "^0.1.5",
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.5.4",
+ "run-queue": "^1.0.0"
+ }
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmmirror.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw=="
+ },
+ "copy-webpack-plugin": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz",
+ "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==",
+ "dev": true,
+ "requires": {
+ "cacache": "^12.0.3",
+ "find-cache-dir": "^2.1.0",
+ "glob-parent": "^3.1.0",
+ "globby": "^7.1.1",
+ "is-glob": "^4.0.1",
+ "loader-utils": "^1.2.3",
+ "minimatch": "^3.0.4",
+ "normalize-path": "^3.0.0",
+ "p-limit": "^2.2.1",
+ "schema-utils": "^1.0.0",
+ "serialize-javascript": "^4.0.0",
+ "webpack-log": "^2.0.0"
+ },
+ "dependencies": {
+ "find-cache-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+ "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+ "dev": true,
+ "requires": {
+ "commondir": "^1.0.1",
+ "make-dir": "^2.0.0",
+ "pkg-dir": "^3.0.0"
+ }
+ },
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^3.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.0"
+ }
+ }
+ }
+ },
+ "globby": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmmirror.com/globby/-/globby-7.1.1.tgz",
+ "integrity": "sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==",
+ "dev": true,
+ "requires": {
+ "array-union": "^1.0.1",
+ "dir-glob": "^2.0.0",
+ "glob": "^7.1.2",
+ "ignore": "^3.3.5",
+ "pify": "^3.0.0",
+ "slash": "^1.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
+ "dev": true
+ }
+ }
+ },
+ "ignore": {
+ "version": "3.3.10",
+ "resolved": "https://registry.npmmirror.com/ignore/-/ignore-3.3.10.tgz",
+ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
+ "dev": true
+ },
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ },
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "dev": true,
+ "requires": {
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
+ }
+ },
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "dev": true
+ },
+ "pkg-dir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-3.0.0.tgz",
+ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+ "dev": true,
+ "requires": {
+ "find-up": "^3.0.0"
+ }
+ },
+ "schema-utils": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ },
+ "slash": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/slash/-/slash-1.0.0.tgz",
+ "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==",
+ "dev": true
+ }
+ }
+ },
+ "core-js": {
+ "version": "3.25.5",
+ "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.25.5.tgz",
+ "integrity": "sha512-nbm6eZSjm+ZuBQxCUPQKQCoUEfFOXjUZ8dTTyikyKaWrTYmAVbykQfwsKE5dBK88u3QCkCrzsx/PPlKfhsvgpw=="
+ },
+ "core-js-compat": {
+ "version": "3.22.5",
+ "resolved": "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.22.5.tgz",
+ "integrity": "sha512-rEF75n3QtInrYICvJjrAgV03HwKiYvtKHdPtaba1KucG+cNZ4NJnH9isqt979e67KZlhpbCOTwnsvnIr+CVeOg==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.20.3",
+ "semver": "7.0.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-7.0.0.tgz",
+ "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
+ "dev": true
+ }
+ }
+ },
+ "core-js-pure": {
+ "version": "3.33.3",
+ "resolved": "https://registry.npmmirror.com/core-js-pure/-/core-js-pure-3.33.3.tgz",
+ "integrity": "sha512-taJ00IDOP+XYQEA2dAe4ESkmHt1fL8wzYDo3mRWQey8uO9UojlBFMneA65kMyxfYP7106c6LzWaq7/haDT6BCQ=="
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
+ },
+ "cosmiconfig": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
+ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
+ "dev": true,
+ "requires": {
+ "import-fresh": "^2.0.0",
+ "is-directory": "^0.3.1",
+ "js-yaml": "^3.13.1",
+ "parse-json": "^4.0.0"
+ },
+ "dependencies": {
+ "parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ }
+ }
+ }
+ },
+ "create-ecdh": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmmirror.com/create-ecdh/-/create-ecdh-4.0.4.tgz",
+ "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "elliptic": "^6.5.3"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ }
+ }
+ },
+ "create-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "dev": true,
+ "requires": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
+ },
+ "create-hmac": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmmirror.com/create-hmac/-/create-hmac-1.1.7.tgz",
+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+ "dev": true,
+ "requires": {
+ "cipher-base": "^1.0.3",
+ "create-hash": "^1.1.0",
+ "inherits": "^2.0.1",
+ "ripemd160": "^2.0.0",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "dev": true,
+ "requires": {
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
+ }
+ },
+ "crypto-browserify": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmmirror.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+ "dev": true,
+ "requires": {
+ "browserify-cipher": "^1.0.0",
+ "browserify-sign": "^4.0.0",
+ "create-ecdh": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "create-hmac": "^1.1.0",
+ "diffie-hellman": "^5.0.0",
+ "inherits": "^2.0.1",
+ "pbkdf2": "^3.0.3",
+ "public-encrypt": "^4.0.0",
+ "randombytes": "^2.0.0",
+ "randomfill": "^1.0.3"
+ }
+ },
+ "css-color-names": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmmirror.com/css-color-names/-/css-color-names-0.0.4.tgz",
+ "integrity": "sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==",
+ "dev": true
+ },
+ "css-declaration-sorter": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz",
+ "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.1",
+ "timsort": "^0.3.0"
+ }
+ },
+ "css-loader": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/css-loader/-/css-loader-3.6.0.tgz",
+ "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.3.1",
+ "cssesc": "^3.0.0",
+ "icss-utils": "^4.1.1",
+ "loader-utils": "^1.2.3",
+ "normalize-path": "^3.0.0",
+ "postcss": "^7.0.32",
+ "postcss-modules-extract-imports": "^2.0.0",
+ "postcss-modules-local-by-default": "^3.0.2",
+ "postcss-modules-scope": "^2.2.0",
+ "postcss-modules-values": "^3.0.0",
+ "postcss-value-parser": "^4.1.0",
+ "schema-utils": "^2.7.0",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ }
+ }
+ },
+ "css-select": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/css-select/-/css-select-2.1.0.tgz",
+ "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
+ "dev": true,
+ "requires": {
+ "boolbase": "^1.0.0",
+ "css-what": "^3.2.1",
+ "domutils": "^1.7.0",
+ "nth-check": "^1.0.2"
+ }
+ },
+ "css-select-base-adapter": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmmirror.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
+ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
+ "dev": true
+ },
+ "css-tree": {
+ "version": "1.0.0-alpha.37",
+ "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
+ "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
+ "dev": true,
+ "requires": {
+ "mdn-data": "2.0.4",
+ "source-map": "^0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "css-what": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmmirror.com/css-what/-/css-what-3.4.2.tgz",
+ "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
+ "dev": true
+ },
+ "cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true
+ },
+ "cssnano": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmmirror.com/cssnano/-/cssnano-4.1.11.tgz",
+ "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==",
+ "dev": true,
+ "requires": {
+ "cosmiconfig": "^5.0.0",
+ "cssnano-preset-default": "^4.0.8",
+ "is-resolvable": "^1.0.0",
+ "postcss": "^7.0.0"
+ }
+ },
+ "cssnano-preset-default": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmmirror.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz",
+ "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==",
+ "dev": true,
+ "requires": {
+ "css-declaration-sorter": "^4.0.1",
+ "cssnano-util-raw-cache": "^4.0.1",
+ "postcss": "^7.0.0",
+ "postcss-calc": "^7.0.1",
+ "postcss-colormin": "^4.0.3",
+ "postcss-convert-values": "^4.0.1",
+ "postcss-discard-comments": "^4.0.2",
+ "postcss-discard-duplicates": "^4.0.2",
+ "postcss-discard-empty": "^4.0.1",
+ "postcss-discard-overridden": "^4.0.1",
+ "postcss-merge-longhand": "^4.0.11",
+ "postcss-merge-rules": "^4.0.3",
+ "postcss-minify-font-values": "^4.0.2",
+ "postcss-minify-gradients": "^4.0.2",
+ "postcss-minify-params": "^4.0.2",
+ "postcss-minify-selectors": "^4.0.2",
+ "postcss-normalize-charset": "^4.0.1",
+ "postcss-normalize-display-values": "^4.0.2",
+ "postcss-normalize-positions": "^4.0.2",
+ "postcss-normalize-repeat-style": "^4.0.2",
+ "postcss-normalize-string": "^4.0.2",
+ "postcss-normalize-timing-functions": "^4.0.2",
+ "postcss-normalize-unicode": "^4.0.1",
+ "postcss-normalize-url": "^4.0.1",
+ "postcss-normalize-whitespace": "^4.0.2",
+ "postcss-ordered-values": "^4.1.2",
+ "postcss-reduce-initial": "^4.0.3",
+ "postcss-reduce-transforms": "^4.0.2",
+ "postcss-svgo": "^4.0.3",
+ "postcss-unique-selectors": "^4.0.1"
+ }
+ },
+ "cssnano-util-get-arguments": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz",
+ "integrity": "sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==",
+ "dev": true
+ },
+ "cssnano-util-get-match": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz",
+ "integrity": "sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw==",
+ "dev": true
+ },
+ "cssnano-util-raw-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz",
+ "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.0"
+ }
+ },
+ "cssnano-util-same-parent": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz",
+ "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==",
+ "dev": true
+ },
+ "csso": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz",
+ "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
+ "dev": true,
+ "requires": {
+ "css-tree": "^1.1.2"
+ },
+ "dependencies": {
+ "css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "dev": true,
+ "requires": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ }
+ },
+ "mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "cyclist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/cyclist/-/cyclist-1.0.1.tgz",
+ "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==",
+ "dev": true
+ },
+ "d": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/d/-/d-1.0.1.tgz",
+ "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
+ "requires": {
+ "es5-ext": "^0.10.50",
+ "type": "^1.0.1"
+ }
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "de-indent": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz",
+ "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
+ "dev": true
+ },
+ "debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+ "dev": true
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og=="
+ },
+ "deep-equal": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/deep-equal/-/deep-equal-1.1.1.tgz",
+ "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
+ "requires": {
+ "is-arguments": "^1.0.4",
+ "is-date-object": "^1.0.1",
+ "is-regex": "^1.0.4",
+ "object-is": "^1.0.1",
+ "object-keys": "^1.1.1",
+ "regexp.prototype.flags": "^1.2.0"
+ }
+ },
+ "deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "deepmerge": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-1.5.2.tgz",
+ "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ=="
+ },
+ "default-gateway": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmmirror.com/default-gateway/-/default-gateway-5.0.5.tgz",
+ "integrity": "sha512-z2RnruVmj8hVMmAnEJMTIJNijhKCDiGjbLP+BHJFOT7ld3Bo5qcIBpVYDniqhbMIIf+jZDlkP2MkPXiQy/DBLA==",
+ "dev": true,
+ "requires": {
+ "execa": "^3.3.0"
+ },
+ "dependencies": {
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "execa": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmmirror.com/execa/-/execa-3.4.0.tgz",
+ "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.0",
+ "get-stream": "^5.0.0",
+ "human-signals": "^1.1.1",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.0",
+ "onetime": "^5.1.0",
+ "p-finally": "^2.0.0",
+ "signal-exit": "^3.0.2",
+ "strip-final-newline": "^2.0.0"
+ }
+ },
+ "get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ },
+ "is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true
+ },
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true
+ },
+ "npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.0.0"
+ }
+ },
+ "onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ },
+ "p-finally": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/p-finally/-/p-finally-2.0.1.tgz",
+ "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==",
+ "dev": true
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
+ "defaults": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/defaults/-/defaults-1.0.3.tgz",
+ "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==",
+ "dev": true,
+ "requires": {
+ "clone": "^1.0.2"
+ }
+ },
+ "define-properties": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.1.4.tgz",
+ "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
+ "requires": {
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "requires": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "del": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmmirror.com/del/-/del-4.1.1.tgz",
+ "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
+ "dev": true,
+ "requires": {
+ "@types/glob": "^7.1.1",
+ "globby": "^6.1.0",
+ "is-path-cwd": "^2.0.0",
+ "is-path-in-cwd": "^2.0.0",
+ "p-map": "^2.0.0",
+ "pify": "^4.0.1",
+ "rimraf": "^2.6.3"
+ },
+ "dependencies": {
+ "globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==",
+ "dev": true,
+ "requires": {
+ "array-union": "^1.0.1",
+ "glob": "^7.0.3",
+ "object-assign": "^4.0.1",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true
+ }
+ }
+ }
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+ },
+ "depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
+ },
+ "des.js": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/des.js/-/des.js-1.0.1.tgz",
+ "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
+ },
+ "detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz",
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
+ "dev": true
+ },
+ "diffie-hellman": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmmirror.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "miller-rabin": "^4.0.0",
+ "randombytes": "^2.0.0"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ }
+ }
+ },
+ "dir-glob": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-2.2.2.tgz",
+ "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==",
+ "dev": true,
+ "requires": {
+ "path-type": "^3.0.0"
+ }
+ },
+ "dns-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/dns-equal/-/dns-equal-1.0.0.tgz",
+ "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==",
+ "dev": true
+ },
+ "dns-packet": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmmirror.com/dns-packet/-/dns-packet-1.3.4.tgz",
+ "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==",
+ "dev": true,
+ "requires": {
+ "ip": "^1.1.0",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "dns-txt": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/dns-txt/-/dns-txt-2.0.2.tgz",
+ "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==",
+ "dev": true,
+ "requires": {
+ "buffer-indexof": "^1.0.0"
+ }
+ },
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "dom-converter": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmmirror.com/dom-converter/-/dom-converter-0.2.0.tgz",
+ "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+ "dev": true,
+ "requires": {
+ "utila": "~0.4"
+ }
+ },
+ "dom-serializer": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-0.2.2.tgz",
+ "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^2.0.1",
+ "entities": "^2.0.0"
+ },
+ "dependencies": {
+ "domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true
+ }
+ }
+ },
+ "dom7": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz",
+ "integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==",
+ "requires": {
+ "ssr-window": "^3.0.0-alpha.1"
+ }
+ },
+ "domain-browser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/domain-browser/-/domain-browser-1.2.0.tgz",
+ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
+ "dev": true
+ },
+ "domelementtype": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-1.3.1.tgz",
+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+ "dev": true
+ },
+ "domhandler": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz",
+ "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^2.2.0"
+ },
+ "dependencies": {
+ "domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true
+ }
+ }
+ },
+ "domutils": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmmirror.com/domutils/-/domutils-1.7.0.tgz",
+ "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+ "dev": true,
+ "requires": {
+ "dom-serializer": "0",
+ "domelementtype": "1"
+ }
+ },
+ "dot-prop": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmmirror.com/dot-prop/-/dot-prop-5.3.0.tgz",
+ "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+ "dev": true,
+ "requires": {
+ "is-obj": "^2.0.0"
+ }
+ },
+ "dotenv": {
+ "version": "8.6.0",
+ "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-8.6.0.tgz",
+ "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==",
+ "dev": true
+ },
+ "dotenv-expand": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
+ "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
+ "dev": true
+ },
+ "duplexer": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmmirror.com/duplexer/-/duplexer-0.1.2.tgz",
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+ "dev": true
+ },
+ "duplexify": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmmirror.com/duplexify/-/duplexify-3.7.1.tgz",
+ "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0",
+ "stream-shift": "^1.0.0"
+ }
+ },
+ "easy-stack": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/easy-stack/-/easy-stack-1.0.1.tgz",
+ "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==",
+ "dev": true
+ },
+ "ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+ "dev": true,
+ "requires": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "echarts": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.3.3.tgz",
+ "integrity": "sha512-BRw2serInRwO5SIwRviZ6Xgm5Lb7irgz+sLiFMmy/HOaf4SQ+7oYqxKzRHAKp4xHQ05AuHw1xvoQWJjDQq/FGw==",
+ "requires": {
+ "tslib": "2.3.0",
+ "zrender": "5.3.2"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
+ "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+ }
+ }
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
+ },
+ "ejs": {
+ "version": "2.7.4",
+ "resolved": "https://registry.npmmirror.com/ejs/-/ejs-2.7.4.tgz",
+ "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==",
+ "dev": true
+ },
+ "electron-to-chromium": {
+ "version": "1.4.137",
+ "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz",
+ "integrity": "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==",
+ "dev": true
+ },
+ "element-resize-detector": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmmirror.com/element-resize-detector/-/element-resize-detector-1.2.4.tgz",
+ "integrity": "sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==",
+ "requires": {
+ "batch-processor": "1.0.0"
+ }
+ },
+ "element-ui": {
+ "version": "2.15.8",
+ "resolved": "https://registry.npmmirror.com/element-ui/-/element-ui-2.15.8.tgz",
+ "integrity": "sha512-N54zxosRFqpYax3APY3GeRmtOZwIls6Z756WM0kdPZ5Q92PIeKHnZgF1StlamIg9bLxP1k+qdhTZvIeQlim09A==",
+ "requires": {
+ "async-validator": "~1.8.1",
+ "babel-helper-vue-jsx-merge-props": "^2.0.0",
+ "deepmerge": "^1.2.0",
+ "normalize-wheel": "^1.0.1",
+ "resize-observer-polyfill": "^1.5.0",
+ "throttle-debounce": "^1.0.1"
+ }
+ },
+ "elliptic": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmmirror.com/elliptic/-/elliptic-6.5.4.tgz",
+ "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ }
+ }
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "dev": true
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
+ },
+ "encryptlong": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmmirror.com/encryptlong/-/encryptlong-3.1.4.tgz",
+ "integrity": "sha512-nx+om7MXaSBSBPBNKKPrOWMot/C0L0Ru8dy9WTyjO5k8Wo+1hsnK0d8uX1UjctkgcgEWhkKhVScniYDjXvnKgw=="
+ },
+ "end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dev": true,
+ "requires": {
+ "once": "^1.4.0"
+ }
+ },
+ "enhanced-resolve": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz",
+ "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "memory-fs": "^0.5.0",
+ "tapable": "^1.0.0"
+ },
+ "dependencies": {
+ "memory-fs": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmmirror.com/memory-fs/-/memory-fs-0.5.0.tgz",
+ "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
+ "dev": true,
+ "requires": {
+ "errno": "^0.1.3",
+ "readable-stream": "^2.0.1"
+ }
+ }
+ }
+ },
+ "entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "dev": true
+ },
+ "errno": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz",
+ "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+ "dev": true,
+ "requires": {
+ "prr": "~1.0.1"
+ }
+ },
+ "error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "error-stack-parser": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmmirror.com/error-stack-parser/-/error-stack-parser-2.0.7.tgz",
+ "integrity": "sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA==",
+ "dev": true,
+ "requires": {
+ "stackframe": "^1.1.1"
+ }
+ },
+ "es-abstract": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.20.1.tgz",
+ "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "function.prototype.name": "^1.1.5",
+ "get-intrinsic": "^1.1.1",
+ "get-symbol-description": "^1.0.0",
+ "has": "^1.0.3",
+ "has-property-descriptors": "^1.0.0",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.3",
+ "is-callable": "^1.2.4",
+ "is-negative-zero": "^2.0.2",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "is-string": "^1.0.7",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.12.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.2",
+ "regexp.prototype.flags": "^1.4.3",
+ "string.prototype.trimend": "^1.0.5",
+ "string.prototype.trimstart": "^1.0.5",
+ "unbox-primitive": "^1.0.2"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "es5-ext": {
+ "version": "0.10.62",
+ "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.62.tgz",
+ "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==",
+ "requires": {
+ "es6-iterator": "^2.0.3",
+ "es6-symbol": "^3.1.3",
+ "next-tick": "^1.1.0"
+ }
+ },
+ "es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
+ "requires": {
+ "d": "1",
+ "es5-ext": "^0.10.35",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "es6-promise": {
+ "version": "4.2.8",
+ "resolved": "https://registry.npmmirror.com/es6-promise/-/es6-promise-4.2.8.tgz",
+ "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="
+ },
+ "es6-promisify": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/es6-promisify/-/es6-promisify-5.0.0.tgz",
+ "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==",
+ "requires": {
+ "es6-promise": "^4.0.3"
+ }
+ },
+ "es6-symbol": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz",
+ "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
+ "requires": {
+ "d": "^1.0.1",
+ "ext": "^1.1.2"
+ }
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+ },
+ "eslint": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmmirror.com/eslint/-/eslint-6.8.0.tgz",
+ "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "ajv": "^6.10.0",
+ "chalk": "^2.1.0",
+ "cross-spawn": "^6.0.5",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "eslint-scope": "^5.0.0",
+ "eslint-utils": "^1.4.3",
+ "eslint-visitor-keys": "^1.1.0",
+ "espree": "^6.1.2",
+ "esquery": "^1.0.1",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^5.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.0.0",
+ "globals": "^12.1.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "inquirer": "^7.0.0",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.3.0",
+ "lodash": "^4.17.14",
+ "minimatch": "^3.0.4",
+ "mkdirp": "^0.5.1",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.8.3",
+ "progress": "^2.0.0",
+ "regexpp": "^2.0.1",
+ "semver": "^6.1.2",
+ "strip-ansi": "^5.2.0",
+ "strip-json-comments": "^3.0.1",
+ "table": "^5.2.3",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "dependencies": {
+ "eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "globals": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmmirror.com/globals/-/globals-12.4.0.tgz",
+ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.8.1"
+ }
+ },
+ "import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
+ "resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ }
+ },
+ "type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-loader": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmmirror.com/eslint-loader/-/eslint-loader-2.2.1.tgz",
+ "integrity": "sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg==",
+ "dev": true,
+ "requires": {
+ "loader-fs-cache": "^1.0.0",
+ "loader-utils": "^1.0.2",
+ "object-assign": "^4.0.1",
+ "object-hash": "^1.1.4",
+ "rimraf": "^2.6.1"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ }
+ }
+ },
+ "eslint-plugin-vue": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz",
+ "integrity": "sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ==",
+ "dev": true,
+ "requires": {
+ "natural-compare": "^1.4.0",
+ "semver": "^5.6.0",
+ "vue-eslint-parser": "^7.0.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-scope": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-4.0.3.tgz",
+ "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.1.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "eslint-utils": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-1.4.3.tgz",
+ "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^1.1.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true
+ },
+ "espree": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmmirror.com/espree/-/espree-6.2.1.tgz",
+ "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
+ "dev": true,
+ "requires": {
+ "acorn": "^7.1.1",
+ "acorn-jsx": "^5.2.0",
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true
+ }
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.1.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ }
+ }
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ }
+ }
+ },
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true
+ },
+ "estree-walker": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-0.2.1.tgz",
+ "integrity": "sha512-6/I1dwNKk0N9iGOU3ydzAAurz4NPo/ttxZNCqgIVbWFvWyzWBSNonRrJ5CpjDuyBfmM7ENN7WCzUi9aT/UPXXQ=="
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
+ },
+ "event-emitter": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz",
+ "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
+ "requires": {
+ "d": "1",
+ "es5-ext": "~0.10.14"
+ }
+ },
+ "event-pubsub": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/event-pubsub/-/event-pubsub-4.3.0.tgz",
+ "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==",
+ "dev": true
+ },
+ "eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
+ },
+ "events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "dev": true
+ },
+ "eventsource": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/eventsource/-/eventsource-1.1.1.tgz",
+ "integrity": "sha512-qV5ZC0h7jYIAOhArFJgSfdyz6rALJyb270714o7ZtNnw2WSJ+eexhKtE0O8LYPRsHZHf2osHKZBxGPvm3kPkCA==",
+ "dev": true,
+ "requires": {
+ "original": "^1.0.0"
+ }
+ },
+ "evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+ "dev": true,
+ "requires": {
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "execa": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/execa/-/execa-1.0.0.tgz",
+ "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^6.0.0",
+ "get-stream": "^4.0.0",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^2.0.0",
+ "p-finally": "^1.0.0",
+ "signal-exit": "^3.0.0",
+ "strip-eof": "^1.0.0"
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==",
+ "requires": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ },
+ "express": {
+ "version": "4.18.1",
+ "resolved": "https://registry.npmmirror.com/express/-/express-4.18.1.tgz",
+ "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==",
+ "requires": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.0",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.5.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.2.0",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.10.3",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.18.0",
+ "serve-static": "1.15.0",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "qs": {
+ "version": "6.10.3",
+ "resolved": "https://registry.npmmirror.com/qs/-/qs-6.10.3.tgz",
+ "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
+ "requires": {
+ "side-channel": "^1.0.4"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ }
+ }
+ },
+ "ext": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz",
+ "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
+ "requires": {
+ "type": "^2.7.2"
+ },
+ "dependencies": {
+ "type": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmmirror.com/type/-/type-2.7.2.tgz",
+ "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
+ }
+ }
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "external-editor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz",
+ "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+ "dev": true,
+ "requires": {
+ "chardet": "^0.7.0",
+ "iconv-lite": "^0.4.24",
+ "tmp": "^0.0.33"
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "requires": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "extract-zip": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmmirror.com/extract-zip/-/extract-zip-1.7.0.tgz",
+ "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==",
+ "requires": {
+ "concat-stream": "^1.6.2",
+ "debug": "^2.6.9",
+ "mkdirp": "^0.5.4",
+ "yauzl": "^2.10.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "fast-diff": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.1.2.tgz",
+ "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig=="
+ },
+ "fast-glob": {
+ "version": "2.2.7",
+ "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-2.2.7.tgz",
+ "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "^2.2.1",
+ "@nodelib/fs.stat": "^1.1.2",
+ "glob-parent": "^3.1.0",
+ "is-glob": "^4.0.0",
+ "merge2": "^1.2.3",
+ "micromatch": "^3.1.10"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.0"
+ }
+ }
+ }
+ }
+ }
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "faye-websocket": {
+ "version": "0.11.4",
+ "resolved": "https://registry.npmmirror.com/faye-websocket/-/faye-websocket-0.11.4.tgz",
+ "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
+ "dev": true,
+ "requires": {
+ "websocket-driver": ">=0.5.1"
+ }
+ },
+ "fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+ "requires": {
+ "pend": "~1.2.0"
+ }
+ },
+ "figgy-pudding": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmmirror.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
+ "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==",
+ "dev": true
+ },
+ "figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "^1.0.5"
+ }
+ },
+ "file-entry-cache": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
+ "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^2.0.1"
+ }
+ },
+ "file-loader": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/file-loader/-/file-loader-4.3.0.tgz",
+ "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==",
+ "dev": true,
+ "requires": {
+ "loader-utils": "^1.2.3",
+ "schema-utils": "^2.5.0"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ }
+ }
+ },
+ "file-uri-to-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+ "dev": true,
+ "optional": true
+ },
+ "filesize": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmmirror.com/filesize/-/filesize-3.6.1.tgz",
+ "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==",
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "finalhandler": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.2.0.tgz",
+ "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ },
+ "find-cache-dir": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "dev": true,
+ "requires": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ }
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "flat-cache": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-2.0.1.tgz",
+ "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+ "dev": true,
+ "requires": {
+ "flatted": "^2.0.0",
+ "rimraf": "2.6.3",
+ "write": "1.0.3"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-2.6.3.tgz",
+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ }
+ }
+ },
+ "flatted": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/flatted/-/flatted-2.0.2.tgz",
+ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
+ "dev": true
+ },
+ "flush-write-stream": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
+ "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.3.6"
+ }
+ },
+ "follow-redirects": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.0.tgz",
+ "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ=="
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ=="
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+ "dev": true
+ },
+ "form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmmirror.com/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "dev": true,
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==",
+ "requires": {
+ "map-cache": "^0.2.2"
+ }
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
+ },
+ "from2": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/from2/-/from2-2.3.0.tgz",
+ "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "fs-write-stream-atomic": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmmirror.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
+ "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "iferr": "^0.1.5",
+ "imurmurhash": "^0.1.4",
+ "readable-stream": "1 || 2"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "optional": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "function.prototype.name": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
+ "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.19.0",
+ "functions-have-names": "^1.2.2"
+ }
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
+ "dev": true
+ },
+ "functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
+ },
+ "gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true
+ },
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true
+ },
+ "get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "get-stream": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz",
+ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+ "dev": true,
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ },
+ "get-symbol-description": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ }
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmmirror.com/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA=="
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmmirror.com/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==",
+ "dev": true
+ },
+ "globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true
+ },
+ "globby": {
+ "version": "9.2.0",
+ "resolved": "https://registry.npmmirror.com/globby/-/globby-9.2.0.tgz",
+ "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==",
+ "dev": true,
+ "requires": {
+ "@types/glob": "^7.1.1",
+ "array-union": "^1.0.2",
+ "dir-glob": "^2.2.2",
+ "fast-glob": "^2.2.6",
+ "glob": "^7.1.3",
+ "ignore": "^4.0.3",
+ "pify": "^4.0.1",
+ "slash": "^2.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.10",
+ "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz",
+ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+ "dev": true
+ },
+ "gzip-size": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/gzip-size/-/gzip-size-5.1.1.tgz",
+ "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==",
+ "dev": true,
+ "requires": {
+ "duplexer": "^0.1.1",
+ "pify": "^4.0.1"
+ }
+ },
+ "handle-thing": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/handle-thing/-/handle-thing-2.0.1.tgz",
+ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
+ "dev": true
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
+ "dev": true
+ },
+ "har-validator": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmmirror.com/har-validator/-/har-validator-5.1.5.tgz",
+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.3",
+ "har-schema": "^2.0.0"
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==",
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="
+ }
+ }
+ },
+ "has-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true
+ },
+ "has-property-descriptors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
+ "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+ "requires": {
+ "get-intrinsic": "^1.1.1"
+ }
+ },
+ "has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+ },
+ "has-tostringtag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "requires": {
+ "has-symbols": "^1.0.2"
+ }
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==",
+ "requires": {
+ "get-value": "^2.0.6",
+ "has-values": "^1.0.0",
+ "isobject": "^3.0.0"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==",
+ "requires": {
+ "is-number": "^3.0.0",
+ "kind-of": "^4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "hash-base": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/hash-base/-/hash-base-3.1.0.tgz",
+ "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true
+ }
+ }
+ },
+ "hash-sum": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz",
+ "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==",
+ "dev": true
+ },
+ "hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmmirror.com/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
+ },
+ "hex-color-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
+ "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==",
+ "dev": true
+ },
+ "highlight.js": {
+ "version": "10.7.3",
+ "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-10.7.3.tgz",
+ "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
+ "dev": true
+ },
+ "hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
+ "dev": true,
+ "requires": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "hoopy": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmmirror.com/hoopy/-/hoopy-0.1.4.tgz",
+ "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==",
+ "dev": true
+ },
+ "hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true
+ },
+ "hpack.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmmirror.com/hpack.js/-/hpack.js-2.1.6.tgz",
+ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "obuf": "^1.0.0",
+ "readable-stream": "^2.0.1",
+ "wbuf": "^1.1.0"
+ }
+ },
+ "hsl-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/hsl-regex/-/hsl-regex-1.0.0.tgz",
+ "integrity": "sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==",
+ "dev": true
+ },
+ "hsla-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/hsla-regex/-/hsla-regex-1.0.0.tgz",
+ "integrity": "sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==",
+ "dev": true
+ },
+ "html-entities": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/html-entities/-/html-entities-1.4.0.tgz",
+ "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==",
+ "dev": true
+ },
+ "html-minifier": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmmirror.com/html-minifier/-/html-minifier-3.5.21.tgz",
+ "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==",
+ "dev": true,
+ "requires": {
+ "camel-case": "3.0.x",
+ "clean-css": "4.2.x",
+ "commander": "2.17.x",
+ "he": "1.2.x",
+ "param-case": "2.1.x",
+ "relateurl": "0.2.x",
+ "uglify-js": "3.4.x"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.17.1",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-2.17.1.tgz",
+ "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
+ "dev": true
+ }
+ }
+ },
+ "html-tags": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/html-tags/-/html-tags-3.2.0.tgz",
+ "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==",
+ "dev": true
+ },
+ "html-void-elements": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-2.0.1.tgz",
+ "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A=="
+ },
+ "html-webpack-plugin": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz",
+ "integrity": "sha512-Br4ifmjQojUP4EmHnRBoUIYcZ9J7M4bTMcm7u6xoIAIuq2Nte4TzXX0533owvkQKQD1WeMTTTyD4Ni4QKxS0Bg==",
+ "dev": true,
+ "requires": {
+ "html-minifier": "^3.2.3",
+ "loader-utils": "^0.2.16",
+ "lodash": "^4.17.3",
+ "pretty-error": "^2.0.2",
+ "tapable": "^1.0.0",
+ "toposort": "^1.0.0",
+ "util.promisify": "1.0.0"
+ },
+ "dependencies": {
+ "big.js": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/big.js/-/big.js-3.2.0.tgz",
+ "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
+ "dev": true
+ },
+ "emojis-list": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-2.1.0.tgz",
+ "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==",
+ "dev": true
+ },
+ "json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==",
+ "dev": true
+ },
+ "loader-utils": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-0.2.17.tgz",
+ "integrity": "sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==",
+ "dev": true,
+ "requires": {
+ "big.js": "^3.1.3",
+ "emojis-list": "^2.0.0",
+ "json5": "^0.5.0",
+ "object-assign": "^4.0.1"
+ }
+ },
+ "util.promisify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/util.promisify/-/util.promisify-1.0.0.tgz",
+ "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.2",
+ "object.getownpropertydescriptors": "^2.0.3"
+ }
+ }
+ }
+ },
+ "htmlparser2": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-6.1.0.tgz",
+ "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0",
+ "domutils": "^2.5.2",
+ "entities": "^2.0.0"
+ },
+ "dependencies": {
+ "dom-serializer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz",
+ "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ }
+ },
+ "domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true
+ },
+ "domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "dev": true,
+ "requires": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ }
+ }
+ }
+ },
+ "http-deceiver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmmirror.com/http-deceiver/-/http-deceiver-1.2.7.tgz",
+ "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "requires": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ }
+ },
+ "http-parser-js": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmmirror.com/http-parser-js/-/http-parser-js-0.5.6.tgz",
+ "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==",
+ "dev": true
+ },
+ "http-proxy": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmmirror.com/http-proxy/-/http-proxy-1.18.1.tgz",
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "requires": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "http-proxy-middleware": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz",
+ "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==",
+ "dev": true,
+ "requires": {
+ "@types/http-proxy": "^1.17.5",
+ "http-proxy": "^1.18.1",
+ "is-glob": "^4.0.1",
+ "is-plain-obj": "^3.0.0",
+ "micromatch": "^4.0.2"
+ },
+ "dependencies": {
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ }
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ }
+ }
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ }
+ },
+ "https-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/https-browserify/-/https-browserify-1.0.0.tgz",
+ "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==",
+ "dev": true
+ },
+ "https-proxy-agent": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
+ "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
+ "requires": {
+ "agent-base": "^4.3.0",
+ "debug": "^3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ }
+ }
+ },
+ "human-signals": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-1.1.1.tgz",
+ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+ "dev": true
+ },
+ "i18next": {
+ "version": "20.6.1",
+ "resolved": "https://registry.npmmirror.com/i18next/-/i18next-20.6.1.tgz",
+ "integrity": "sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==",
+ "requires": {
+ "@babel/runtime": "^7.12.0"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "icss-utils": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmmirror.com/icss-utils/-/icss-utils-4.1.1.tgz",
+ "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.14"
+ }
+ },
+ "ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true
+ },
+ "iferr": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmmirror.com/iferr/-/iferr-0.1.5.tgz",
+ "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==",
+ "dev": true
+ },
+ "ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmmirror.com/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true
+ },
+ "immer": {
+ "version": "9.0.21",
+ "resolved": "https://registry.npmmirror.com/immer/-/immer-9.0.21.tgz",
+ "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA=="
+ },
+ "immutable": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.0.0.tgz",
+ "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==",
+ "dev": true
+ },
+ "import-cwd": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/import-cwd/-/import-cwd-2.1.0.tgz",
+ "integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==",
+ "dev": true,
+ "requires": {
+ "import-from": "^2.1.0"
+ }
+ },
+ "import-fresh": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-2.0.0.tgz",
+ "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==",
+ "dev": true,
+ "requires": {
+ "caller-path": "^2.0.0",
+ "resolve-from": "^3.0.0"
+ }
+ },
+ "import-from": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/import-from/-/import-from-2.1.0.tgz",
+ "integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==",
+ "dev": true,
+ "requires": {
+ "resolve-from": "^3.0.0"
+ }
+ },
+ "import-local": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/import-local/-/import-local-2.0.0.tgz",
+ "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
+ "dev": true,
+ "requires": {
+ "pkg-dir": "^3.0.0",
+ "resolve-cwd": "^2.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^3.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "dev": true
+ },
+ "pkg-dir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-3.0.0.tgz",
+ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+ "dev": true,
+ "requires": {
+ "find-up": "^3.0.0"
+ }
+ }
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true
+ },
+ "indexes-of": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/indexes-of/-/indexes-of-1.0.1.tgz",
+ "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==",
+ "dev": true
+ },
+ "infer-owner": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/infer-owner/-/infer-owner-1.0.4.tgz",
+ "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "inquirer": {
+ "version": "7.3.3",
+ "resolved": "https://registry.npmmirror.com/inquirer/-/inquirer-7.3.3.tgz",
+ "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-width": "^3.0.0",
+ "external-editor": "^3.0.3",
+ "figures": "^3.0.0",
+ "lodash": "^4.17.19",
+ "mute-stream": "0.0.8",
+ "run-async": "^2.4.0",
+ "rxjs": "^6.6.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "through": "^2.3.6"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "^3.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true
+ },
+ "onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ },
+ "restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dev": true,
+ "requires": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "internal-ip": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/internal-ip/-/internal-ip-4.3.0.tgz",
+ "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==",
+ "dev": true,
+ "requires": {
+ "default-gateway": "^4.2.0",
+ "ipaddr.js": "^1.9.0"
+ },
+ "dependencies": {
+ "default-gateway": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/default-gateway/-/default-gateway-4.2.0.tgz",
+ "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==",
+ "dev": true,
+ "requires": {
+ "execa": "^1.0.0",
+ "ip-regex": "^2.1.0"
+ }
+ }
+ }
+ },
+ "internal-slot": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.3.tgz",
+ "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
+ "dev": true,
+ "requires": {
+ "get-intrinsic": "^1.1.0",
+ "has": "^1.0.3",
+ "side-channel": "^1.0.4"
+ }
+ },
+ "ip": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmmirror.com/ip/-/ip-1.1.8.tgz",
+ "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==",
+ "dev": true
+ },
+ "ip-regex": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/ip-regex/-/ip-regex-2.1.0.tgz",
+ "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==",
+ "dev": true
+ },
+ "ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
+ },
+ "is-absolute-url": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
+ "integrity": "sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==",
+ "dev": true
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==",
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-arguments": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz",
+ "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true
+ },
+ "is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "dev": true,
+ "requires": {
+ "has-bigints": "^1.0.1"
+ }
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "is-callable": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.4.tgz",
+ "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
+ "dev": true
+ },
+ "is-ci": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/is-ci/-/is-ci-1.2.1.tgz",
+ "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==",
+ "dev": true,
+ "requires": {
+ "ci-info": "^1.5.0"
+ }
+ },
+ "is-color-stop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/is-color-stop/-/is-color-stop-1.1.0.tgz",
+ "integrity": "sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==",
+ "dev": true,
+ "requires": {
+ "css-color-names": "^0.0.4",
+ "hex-color-regex": "^1.1.0",
+ "hsl-regex": "^1.0.0",
+ "hsla-regex": "^1.0.0",
+ "rgb-regex": "^1.0.1",
+ "rgba-regex": "^1.0.0"
+ }
+ },
+ "is-core-module": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.9.0.tgz",
+ "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==",
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+ }
+ }
+ },
+ "is-directory": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmmirror.com/is-directory/-/is-directory-0.3.1.tgz",
+ "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==",
+ "dev": true
+ },
+ "is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "dev": true
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-hotkey": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmmirror.com/is-hotkey/-/is-hotkey-0.2.0.tgz",
+ "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw=="
+ },
+ "is-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/is-module/-/is-module-1.0.0.tgz",
+ "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="
+ },
+ "is-negative-zero": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+ "dev": true
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "dev": true,
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/is-obj/-/is-obj-2.0.0.tgz",
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+ "dev": true
+ },
+ "is-path-cwd": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+ "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
+ "dev": true
+ },
+ "is-path-in-cwd": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
+ "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
+ "dev": true,
+ "requires": {
+ "is-path-inside": "^2.1.0"
+ }
+ },
+ "is-path-inside": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-2.1.0.tgz",
+ "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
+ "dev": true,
+ "requires": {
+ "path-is-inside": "^1.0.2"
+ }
+ },
+ "is-plain-obj": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
+ "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
+ "dev": true
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "requires": {
+ "isobject": "^3.0.1"
+ }
+ },
+ "is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-resolvable": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/is-resolvable/-/is-resolvable-1.1.0.tgz",
+ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
+ "dev": true
+ },
+ "is-shared-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2"
+ }
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
+ "dev": true
+ },
+ "is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "dev": true,
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.2"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+ "dev": true
+ },
+ "is-url": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmmirror.com/is-url/-/is-url-1.2.4.tgz",
+ "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="
+ },
+ "is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+ },
+ "is-wsl": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-1.1.0.tgz",
+ "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
+ "dev": true
+ },
+ "javascript-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz",
+ "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==",
+ "dev": true
+ },
+ "js-message": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmmirror.com/js-message/-/js-message-1.0.7.tgz",
+ "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
+ "dev": true
+ },
+ "jsencrypt": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/jsencrypt/-/jsencrypt-3.3.1.tgz",
+ "integrity": "sha512-dVvV54GdFuJgmEKn+oBiaifDMen4p6o6j/lJh0OVMcouME8sST0bJ7bldIgKBQk4za0zyGn0/pm4vOznR25mLw==",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true
+ },
+ "json-parse-better-errors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+ "dev": true
+ },
+ "json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true
+ },
+ "json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+ "dev": true
+ },
+ "json5": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.1.tgz",
+ "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "jsprim": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmmirror.com/jsprim/-/jsprim-1.4.2.tgz",
+ "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.4.0",
+ "verror": "1.10.0"
+ }
+ },
+ "killable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/killable/-/killable-1.0.1.tgz",
+ "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
+ },
+ "launch-editor": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/launch-editor/-/launch-editor-2.3.0.tgz",
+ "integrity": "sha512-3QrsCXejlWYHjBPFXTyGNhPj4rrQdB+5+r5r3wArpLH201aR+nWUgw/zKKkTmilCfY/sv6u8qo98pNvtg8LUTA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^1.0.0",
+ "shell-quote": "^1.6.1"
+ }
+ },
+ "launch-editor-middleware": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/launch-editor-middleware/-/launch-editor-middleware-2.3.0.tgz",
+ "integrity": "sha512-GJR64trLdFFwCoL9DMn/d1SZX0OzTDPixu4mcfWTShQ4tIqCHCGvlg9fOEYQXyBlrSMQwylsJfUWncheShfV2w==",
+ "dev": true,
+ "requires": {
+ "launch-editor": "^2.3.0"
+ }
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmmirror.com/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ }
+ },
+ "lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true
+ },
+ "loader-fs-cache": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz",
+ "integrity": "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==",
+ "dev": true,
+ "requires": {
+ "find-cache-dir": "^0.1.1",
+ "mkdirp": "^0.5.1"
+ },
+ "dependencies": {
+ "find-cache-dir": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz",
+ "integrity": "sha512-Z9XSBoNE7xQiV6MSgPuCfyMokH2K7JdpRkOYE1+mu3d4BFJtx3GW+f6Bo4q8IX6rlf5MYbLBKW0pjl2cWdkm2A==",
+ "dev": true,
+ "requires": {
+ "commondir": "^1.0.1",
+ "mkdirp": "^0.5.1",
+ "pkg-dir": "^1.0.0"
+ }
+ },
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==",
+ "dev": true,
+ "requires": {
+ "path-exists": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "pkg-dir": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-1.0.0.tgz",
+ "integrity": "sha512-c6pv3OE78mcZ92ckebVDqg0aWSoKhOTbwCV6qbCWMk546mAL9pZln0+QsN/yQ7fkucd4+yJPLrCBXNt8Ruk+Eg==",
+ "dev": true,
+ "requires": {
+ "find-up": "^1.0.0"
+ }
+ }
+ }
+ },
+ "loader-runner": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-2.4.0.tgz",
+ "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==",
+ "dev": true
+ },
+ "loader-utils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.2.tgz",
+ "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ }
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+ },
+ "lodash.clonedeep": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+ "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
+ },
+ "lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
+ },
+ "lodash.defaultsdeep": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmmirror.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz",
+ "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==",
+ "dev": true
+ },
+ "lodash.foreach": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmmirror.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
+ "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ=="
+ },
+ "lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
+ },
+ "lodash.kebabcase": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmmirror.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
+ "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==",
+ "dev": true
+ },
+ "lodash.mapvalues": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmmirror.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz",
+ "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==",
+ "dev": true
+ },
+ "lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
+ "dev": true
+ },
+ "lodash.throttle": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
+ "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
+ },
+ "lodash.toarray": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmmirror.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
+ "integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw=="
+ },
+ "lodash.transform": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmmirror.com/lodash.transform/-/lodash.transform-4.6.0.tgz",
+ "integrity": "sha512-LO37ZnhmBVx0GvOU/caQuipEh4GN82TcWv3yHlebGDgOxbxiwwzW5Pcx2AcvpIv2WmvmSMoC492yQFNhy/l/UQ==",
+ "dev": true
+ },
+ "lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
+ "dev": true
+ },
+ "log-symbols": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-2.2.0.tgz",
+ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.1"
+ }
+ },
+ "loglevel": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmmirror.com/loglevel/-/loglevel-1.8.0.tgz",
+ "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==",
+ "dev": true
+ },
+ "lower-case": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/lower-case/-/lower-case-1.1.4.tgz",
+ "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA=="
+ },
+ "lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "requires": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "magic-string": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.14.0.tgz",
+ "integrity": "sha512-ASteqiQbpCPx2uMF5NkmrIUlo3nsSDcPOo+O+F+pdPML/IS560BwrEljpzDFOR45eOME7UPTxgUQVPs6Lj2mTw==",
+ "requires": {
+ "vlq": "^0.2.1"
+ }
+ },
+ "make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "requires": {
+ "semver": "^6.0.0"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmmirror.com/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg=="
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==",
+ "requires": {
+ "object-visit": "^1.0.0"
+ }
+ },
+ "md5.js": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmmirror.com/md5.js/-/md5.js-1.3.5.tgz",
+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+ "dev": true,
+ "requires": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "mdn-data": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.4.tgz",
+ "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
+ "dev": true
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
+ },
+ "memory-fs": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmmirror.com/memory-fs/-/memory-fs-0.4.1.tgz",
+ "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==",
+ "dev": true,
+ "requires": {
+ "errno": "^0.1.3",
+ "readable-stream": "^2.0.1"
+ }
+ },
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
+ },
+ "merge-source-map": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/merge-source-map/-/merge-source-map-1.1.0.tgz",
+ "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
+ "dev": true,
+ "requires": {
+ "source-map": "^0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ },
+ "miller-rabin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/miller-rabin/-/miller-rabin-4.0.1.tgz",
+ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.0.0",
+ "brorand": "^1.0.1"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ }
+ }
+ },
+ "mime": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz",
+ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="
+ },
+ "mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
+ },
+ "mime-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/mime-match/-/mime-match-1.0.2.tgz",
+ "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==",
+ "requires": {
+ "wildcard": "^1.1.0"
+ }
+ },
+ "mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "requires": {
+ "mime-db": "1.52.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-1.2.0.tgz",
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+ "dev": true
+ },
+ "mini-css-extract-plugin": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmmirror.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz",
+ "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==",
+ "dev": true,
+ "requires": {
+ "loader-utils": "^1.1.0",
+ "normalize-url": "1.9.1",
+ "schema-utils": "^1.0.0",
+ "webpack-sources": "^1.1.0"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ },
+ "normalize-url": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmmirror.com/normalize-url/-/normalize-url-1.9.1.tgz",
+ "integrity": "sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ==",
+ "dev": true,
+ "requires": {
+ "object-assign": "^4.0.1",
+ "prepend-http": "^1.0.0",
+ "query-string": "^4.1.0",
+ "sort-keys": "^1.0.0"
+ }
+ },
+ "schema-utils": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ }
+ }
+ }
+ },
+ "minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "dev": true
+ },
+ "minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.6.tgz",
+ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
+ },
+ "minipass": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmmirror.com/minipass/-/minipass-3.1.6.tgz",
+ "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ },
+ "dependencies": {
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ }
+ }
+ },
+ "mississippi": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/mississippi/-/mississippi-3.0.0.tgz",
+ "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
+ "dev": true,
+ "requires": {
+ "concat-stream": "^1.5.0",
+ "duplexify": "^3.4.2",
+ "end-of-stream": "^1.1.0",
+ "flush-write-stream": "^1.0.0",
+ "from2": "^2.1.0",
+ "parallel-transform": "^1.1.0",
+ "pump": "^3.0.0",
+ "pumpify": "^1.3.3",
+ "stream-each": "^1.1.0",
+ "through2": "^2.0.0"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmmirror.com/mixin-deep/-/mixin-deep-1.3.2.tgz",
+ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+ "requires": {
+ "for-in": "^1.0.2",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "requires": {
+ "minimist": "^1.2.6"
+ }
+ },
+ "move-concurrently": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/move-concurrently/-/move-concurrently-1.0.1.tgz",
+ "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==",
+ "dev": true,
+ "requires": {
+ "aproba": "^1.1.1",
+ "copy-concurrently": "^1.0.0",
+ "fs-write-stream-atomic": "^1.0.8",
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.5.4",
+ "run-queue": "^1.0.3"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "multicast-dns": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmmirror.com/multicast-dns/-/multicast-dns-6.2.3.tgz",
+ "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
+ "dev": true,
+ "requires": {
+ "dns-packet": "^1.3.1",
+ "thunky": "^1.0.2"
+ }
+ },
+ "multicast-dns-service-types": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
+ "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==",
+ "dev": true
+ },
+ "mute-stream": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmmirror.com/mute-stream/-/mute-stream-0.0.8.tgz",
+ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+ "dev": true
+ },
+ "mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "requires": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "namespace-emitter": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/namespace-emitter/-/namespace-emitter-2.0.1.tgz",
+ "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g=="
+ },
+ "nan": {
+ "version": "2.15.0",
+ "resolved": "https://registry.npmmirror.com/nan/-/nan-2.15.0.tgz",
+ "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==",
+ "dev": true,
+ "optional": true
+ },
+ "nanoid": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="
+ },
+ "nanomatch": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmmirror.com/nanomatch/-/nanomatch-1.2.13.tgz",
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "fragment-cache": "^0.2.1",
+ "is-windows": "^1.0.2",
+ "kind-of": "^6.0.2",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ }
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
+ },
+ "neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true
+ },
+ "next-tick": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz",
+ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
+ },
+ "nice-try": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+ "dev": true
+ },
+ "no-case": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmmirror.com/no-case/-/no-case-2.3.2.tgz",
+ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
+ "requires": {
+ "lower-case": "^1.1.1"
+ }
+ },
+ "node-forge": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmmirror.com/node-forge/-/node-forge-0.10.0.tgz",
+ "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==",
+ "dev": true
+ },
+ "node-libs-browser": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmmirror.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
+ "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
+ "dev": true,
+ "requires": {
+ "assert": "^1.1.1",
+ "browserify-zlib": "^0.2.0",
+ "buffer": "^4.3.0",
+ "console-browserify": "^1.1.0",
+ "constants-browserify": "^1.0.0",
+ "crypto-browserify": "^3.11.0",
+ "domain-browser": "^1.1.1",
+ "events": "^3.0.0",
+ "https-browserify": "^1.0.0",
+ "os-browserify": "^0.3.0",
+ "path-browserify": "0.0.1",
+ "process": "^0.11.10",
+ "punycode": "^1.2.4",
+ "querystring-es3": "^0.2.0",
+ "readable-stream": "^2.3.3",
+ "stream-browserify": "^2.0.1",
+ "stream-http": "^2.7.2",
+ "string_decoder": "^1.0.0",
+ "timers-browserify": "^2.0.4",
+ "tty-browserify": "0.0.0",
+ "url": "^0.11.0",
+ "util": "^0.11.0",
+ "vm-browserify": "^1.0.1"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmmirror.com/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
+ "dev": true
+ }
+ }
+ },
+ "node-releases": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.4.tgz",
+ "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==",
+ "dev": true
+ },
+ "normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
+ }
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true
+ },
+ "normalize-url": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmmirror.com/normalize-url/-/normalize-url-3.3.0.tgz",
+ "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==",
+ "dev": true
+ },
+ "normalize-wheel": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
+ "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA=="
+ },
+ "npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==",
+ "dev": true,
+ "requires": {
+ "path-key": "^2.0.0"
+ }
+ },
+ "nth-check": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-1.0.2.tgz",
+ "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+ "dev": true,
+ "requires": {
+ "boolbase": "~1.0.0"
+ }
+ },
+ "num2fraction": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmmirror.com/num2fraction/-/num2fraction-1.2.2.tgz",
+ "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==",
+ "dev": true
+ },
+ "oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmmirror.com/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmmirror.com/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==",
+ "requires": {
+ "copy-descriptor": "^0.1.0",
+ "define-property": "^0.2.5",
+ "kind-of": "^3.0.3"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "object-hash": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmmirror.com/object-hash/-/object-hash-1.3.1.tgz",
+ "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==",
+ "dev": true
+ },
+ "object-inspect": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.0.tgz",
+ "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g=="
+ },
+ "object-is": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmmirror.com/object-is/-/object-is-1.1.5.tgz",
+ "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ }
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==",
+ "requires": {
+ "isobject": "^3.0.0"
+ }
+ },
+ "object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "object.getownpropertydescriptors": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmmirror.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz",
+ "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.19.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==",
+ "requires": {
+ "isobject": "^3.0.1"
+ }
+ },
+ "object.values": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmmirror.com/object.values/-/object.values-1.1.5.tgz",
+ "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.19.1"
+ }
+ },
+ "obuf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/obuf/-/obuf-1.1.2.tgz",
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+ "dev": true
+ },
+ "on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "on-headers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz",
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^1.0.0"
+ }
+ },
+ "open": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmmirror.com/open/-/open-6.4.0.tgz",
+ "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==",
+ "dev": true,
+ "requires": {
+ "is-wsl": "^1.1.0"
+ }
+ },
+ "opener": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmmirror.com/opener/-/opener-1.5.2.tgz",
+ "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
+ "dev": true
+ },
+ "opn": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmmirror.com/opn/-/opn-5.5.0.tgz",
+ "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
+ "dev": true,
+ "requires": {
+ "is-wsl": "^1.1.0"
+ }
+ },
+ "optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "dev": true,
+ "requires": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ }
+ },
+ "ora": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmmirror.com/ora/-/ora-3.4.0.tgz",
+ "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.2",
+ "cli-cursor": "^2.1.0",
+ "cli-spinners": "^2.0.0",
+ "log-symbols": "^2.2.0",
+ "strip-ansi": "^5.2.0",
+ "wcwidth": "^1.0.1"
+ },
+ "dependencies": {
+ "strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ }
+ }
+ }
+ },
+ "original": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/original/-/original-1.0.2.tgz",
+ "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
+ "dev": true,
+ "requires": {
+ "url-parse": "^1.4.3"
+ }
+ },
+ "os-browserify": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmmirror.com/os-browserify/-/os-browserify-0.3.0.tgz",
+ "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==",
+ "dev": true
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ=="
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+ "dev": true
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
+ "dev": true
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "p-map": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/p-map/-/p-map-2.1.0.tgz",
+ "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
+ "dev": true
+ },
+ "p-retry": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/p-retry/-/p-retry-3.0.1.tgz",
+ "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==",
+ "dev": true,
+ "requires": {
+ "retry": "^0.12.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true
+ },
+ "pako": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+ "dev": true
+ },
+ "parallel-transform": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/parallel-transform/-/parallel-transform-1.2.0.tgz",
+ "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==",
+ "dev": true,
+ "requires": {
+ "cyclist": "^1.0.1",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.1.5"
+ }
+ },
+ "param-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/param-case/-/param-case-2.1.1.tgz",
+ "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==",
+ "requires": {
+ "no-case": "^2.2.0"
+ }
+ },
+ "parchment": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/parchment/-/parchment-1.1.4.tgz",
+ "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg=="
+ },
+ "parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "requires": {
+ "callsites": "^3.0.0"
+ },
+ "dependencies": {
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true
+ }
+ }
+ },
+ "parse-asn1": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmmirror.com/parse-asn1/-/parse-asn1-5.1.6.tgz",
+ "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
+ "dev": true,
+ "requires": {
+ "asn1.js": "^5.2.0",
+ "browserify-aes": "^1.0.0",
+ "evp_bytestokey": "^1.0.0",
+ "pbkdf2": "^3.0.3",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ }
+ },
+ "parse5": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/parse5/-/parse5-5.1.1.tgz",
+ "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
+ "dev": true
+ },
+ "parse5-htmlparser2-tree-adapter": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
+ "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
+ "dev": true,
+ "requires": {
+ "parse5": "^6.0.1"
+ },
+ "dependencies": {
+ "parse5": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/parse5/-/parse5-6.0.1.tgz",
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+ "dev": true
+ }
+ }
+ },
+ "parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmmirror.com/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw=="
+ },
+ "path-browserify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-0.0.1.tgz",
+ "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==",
+ "dev": true
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ },
+ "path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
+ },
+ "path-type": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/path-type/-/path-type-3.0.0.tgz",
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+ "dev": true,
+ "requires": {
+ "pify": "^3.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
+ "dev": true
+ }
+ }
+ },
+ "pbkdf2": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/pbkdf2/-/pbkdf2-3.1.2.tgz",
+ "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
+ "dev": true,
+ "requires": {
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
+ "dev": true
+ },
+ "picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true
+ },
+ "pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==",
+ "dev": true
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==",
+ "dev": true,
+ "requires": {
+ "pinkie": "^2.0.0"
+ }
+ },
+ "pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "requires": {
+ "find-up": "^4.0.0"
+ }
+ },
+ "pnp-webpack-plugin": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmmirror.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz",
+ "integrity": "sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==",
+ "dev": true,
+ "requires": {
+ "ts-pnp": "^1.1.6"
+ }
+ },
+ "portfinder": {
+ "version": "1.0.28",
+ "resolved": "https://registry.npmmirror.com/portfinder/-/portfinder-1.0.28.tgz",
+ "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
+ "requires": {
+ "async": "^2.6.2",
+ "debug": "^3.1.1",
+ "mkdirp": "^0.5.5"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmmirror.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg=="
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-calc": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmmirror.com/postcss-calc/-/postcss-calc-7.0.5.tgz",
+ "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.27",
+ "postcss-selector-parser": "^6.0.2",
+ "postcss-value-parser": "^4.0.2"
+ }
+ },
+ "postcss-colormin": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz",
+ "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.0.0",
+ "color": "^3.0.0",
+ "has": "^1.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-convert-values": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz",
+ "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-discard-comments": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz",
+ "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.0"
+ }
+ },
+ "postcss-discard-duplicates": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz",
+ "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.0"
+ }
+ },
+ "postcss-discard-empty": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz",
+ "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.0"
+ }
+ },
+ "postcss-discard-overridden": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz",
+ "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.0"
+ }
+ },
+ "postcss-load-config": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz",
+ "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==",
+ "dev": true,
+ "requires": {
+ "cosmiconfig": "^5.0.0",
+ "import-cwd": "^2.0.0"
+ }
+ },
+ "postcss-loader": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/postcss-loader/-/postcss-loader-3.0.0.tgz",
+ "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==",
+ "dev": true,
+ "requires": {
+ "loader-utils": "^1.1.0",
+ "postcss": "^7.0.0",
+ "postcss-load-config": "^2.0.0",
+ "schema-utils": "^1.0.0"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ },
+ "schema-utils": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ }
+ }
+ }
+ },
+ "postcss-merge-longhand": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmmirror.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz",
+ "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==",
+ "dev": true,
+ "requires": {
+ "css-color-names": "0.0.4",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0",
+ "stylehacks": "^4.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-merge-rules": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz",
+ "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.0.0",
+ "caniuse-api": "^3.0.0",
+ "cssnano-util-same-parent": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-selector-parser": "^3.0.0",
+ "vendors": "^1.0.0"
+ },
+ "dependencies": {
+ "postcss-selector-parser": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+ "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+ "dev": true,
+ "requires": {
+ "dot-prop": "^5.2.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ }
+ }
+ }
+ },
+ "postcss-minify-font-values": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz",
+ "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-minify-gradients": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz",
+ "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==",
+ "dev": true,
+ "requires": {
+ "cssnano-util-get-arguments": "^4.0.0",
+ "is-color-stop": "^1.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-minify-params": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz",
+ "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==",
+ "dev": true,
+ "requires": {
+ "alphanum-sort": "^1.0.0",
+ "browserslist": "^4.0.0",
+ "cssnano-util-get-arguments": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0",
+ "uniqs": "^2.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-minify-selectors": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz",
+ "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==",
+ "dev": true,
+ "requires": {
+ "alphanum-sort": "^1.0.0",
+ "has": "^1.0.0",
+ "postcss": "^7.0.0",
+ "postcss-selector-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-selector-parser": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+ "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+ "dev": true,
+ "requires": {
+ "dot-prop": "^5.2.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ }
+ }
+ }
+ },
+ "postcss-modules-extract-imports": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz",
+ "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.5"
+ }
+ },
+ "postcss-modules-local-by-default": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz",
+ "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==",
+ "dev": true,
+ "requires": {
+ "icss-utils": "^4.1.1",
+ "postcss": "^7.0.32",
+ "postcss-selector-parser": "^6.0.2",
+ "postcss-value-parser": "^4.1.0"
+ }
+ },
+ "postcss-modules-scope": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz",
+ "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.6",
+ "postcss-selector-parser": "^6.0.0"
+ }
+ },
+ "postcss-modules-values": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz",
+ "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==",
+ "dev": true,
+ "requires": {
+ "icss-utils": "^4.0.0",
+ "postcss": "^7.0.6"
+ }
+ },
+ "postcss-normalize-charset": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz",
+ "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.0"
+ }
+ },
+ "postcss-normalize-display-values": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz",
+ "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==",
+ "dev": true,
+ "requires": {
+ "cssnano-util-get-match": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-normalize-positions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz",
+ "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==",
+ "dev": true,
+ "requires": {
+ "cssnano-util-get-arguments": "^4.0.0",
+ "has": "^1.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-normalize-repeat-style": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz",
+ "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==",
+ "dev": true,
+ "requires": {
+ "cssnano-util-get-arguments": "^4.0.0",
+ "cssnano-util-get-match": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-normalize-string": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz",
+ "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-normalize-timing-functions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz",
+ "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==",
+ "dev": true,
+ "requires": {
+ "cssnano-util-get-match": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-normalize-unicode": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz",
+ "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-normalize-url": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz",
+ "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==",
+ "dev": true,
+ "requires": {
+ "is-absolute-url": "^2.0.0",
+ "normalize-url": "^3.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-normalize-whitespace": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz",
+ "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-ordered-values": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz",
+ "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==",
+ "dev": true,
+ "requires": {
+ "cssnano-util-get-arguments": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-reduce-initial": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz",
+ "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.0.0",
+ "caniuse-api": "^3.0.0",
+ "has": "^1.0.0",
+ "postcss": "^7.0.0"
+ }
+ },
+ "postcss-reduce-transforms": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz",
+ "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==",
+ "dev": true,
+ "requires": {
+ "cssnano-util-get-match": "^4.0.0",
+ "has": "^1.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "6.0.10",
+ "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
+ "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
+ "dev": true,
+ "requires": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ }
+ },
+ "postcss-svgo": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz",
+ "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0",
+ "svgo": "^1.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-unique-selectors": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz",
+ "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==",
+ "dev": true,
+ "requires": {
+ "alphanum-sort": "^1.0.0",
+ "postcss": "^7.0.0",
+ "uniqs": "^2.0.0"
+ }
+ },
+ "postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "preact": {
+ "version": "10.19.2",
+ "resolved": "https://registry.npmmirror.com/preact/-/preact-10.19.2.tgz",
+ "integrity": "sha512-UA9DX/OJwv6YwP9Vn7Ti/vF80XL+YA5H2l7BpCtUr3ya8LWHFzpiO5R+N7dN16ujpIxhekRFuOOF82bXX7K/lg=="
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+ "dev": true
+ },
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==",
+ "dev": true
+ },
+ "prerender-spa-plugin": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmmirror.com/prerender-spa-plugin/-/prerender-spa-plugin-3.4.0.tgz",
+ "integrity": "sha512-4Gtu7XIz5p0VBi1527c/ogu0NNcM5kJPG9q3F26SioeeURVbIJ11B6fuK8pxTmlPqffKPR/2TRRf4o020r4Fqw==",
+ "dev": true,
+ "requires": {
+ "@prerenderer/prerenderer": "^0.7.2",
+ "@prerenderer/renderer-puppeteer": "^0.2.0",
+ "html-minifier": "^3.5.16"
+ }
+ },
+ "prettier": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.6.2.tgz",
+ "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==",
+ "dev": true,
+ "optional": true
+ },
+ "pretty-error": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/pretty-error/-/pretty-error-2.1.2.tgz",
+ "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.20",
+ "renderkid": "^2.0.4"
+ }
+ },
+ "prismjs": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz",
+ "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q=="
+ },
+ "process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmmirror.com/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
+ "progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
+ },
+ "promise-inflight": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/promise-inflight/-/promise-inflight-1.0.1.tgz",
+ "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
+ "dev": true
+ },
+ "promise-limit": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmmirror.com/promise-limit/-/promise-limit-2.7.0.tgz",
+ "integrity": "sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw=="
+ },
+ "proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "requires": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ }
+ },
+ "proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
+ "prr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+ "dev": true
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==",
+ "dev": true
+ },
+ "psl": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmmirror.com/psl/-/psl-1.8.0.tgz",
+ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
+ "dev": true
+ },
+ "public-encrypt": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/public-encrypt/-/public-encrypt-4.0.3.tgz",
+ "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "parse-asn1": "^5.0.0",
+ "randombytes": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ }
+ }
+ },
+ "pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "pumpify": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmmirror.com/pumpify/-/pumpify-1.5.1.tgz",
+ "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
+ "dev": true,
+ "requires": {
+ "duplexify": "^3.6.0",
+ "inherits": "^2.0.3",
+ "pump": "^2.0.0"
+ },
+ "dependencies": {
+ "pump": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/pump/-/pump-2.0.1.tgz",
+ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ }
+ }
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true
+ },
+ "puppeteer": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmmirror.com/puppeteer/-/puppeteer-1.20.0.tgz",
+ "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==",
+ "requires": {
+ "debug": "^4.1.0",
+ "extract-zip": "^1.6.6",
+ "https-proxy-agent": "^2.2.1",
+ "mime": "^2.0.3",
+ "progress": "^2.0.1",
+ "proxy-from-env": "^1.0.0",
+ "rimraf": "^2.6.1",
+ "ws": "^6.1.0"
+ }
+ },
+ "q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmmirror.com/q/-/q-1.5.1.tgz",
+ "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.5.3",
+ "resolved": "https://registry.npmmirror.com/qs/-/qs-6.5.3.tgz",
+ "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+ "dev": true
+ },
+ "query-string": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmmirror.com/query-string/-/query-string-4.3.4.tgz",
+ "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==",
+ "dev": true,
+ "requires": {
+ "object-assign": "^4.1.0",
+ "strict-uri-encode": "^1.0.0"
+ }
+ },
+ "querystring": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmmirror.com/querystring/-/querystring-0.2.0.tgz",
+ "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==",
+ "dev": true
+ },
+ "querystring-es3": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmmirror.com/querystring-es3/-/querystring-es3-0.2.1.tgz",
+ "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==",
+ "dev": true
+ },
+ "querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+ "dev": true
+ },
+ "quill": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmmirror.com/quill/-/quill-1.3.7.tgz",
+ "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==",
+ "requires": {
+ "clone": "^2.1.1",
+ "deep-equal": "^1.0.1",
+ "eventemitter3": "^2.0.3",
+ "extend": "^3.0.2",
+ "parchment": "^1.1.4",
+ "quill-delta": "^3.6.2"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="
+ },
+ "eventemitter3": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-2.0.3.tgz",
+ "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg=="
+ }
+ }
+ },
+ "quill-delta": {
+ "version": "3.6.3",
+ "resolved": "https://registry.npmmirror.com/quill-delta/-/quill-delta-3.6.3.tgz",
+ "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==",
+ "requires": {
+ "deep-equal": "^1.0.1",
+ "extend": "^3.0.2",
+ "fast-diff": "1.1.2"
+ }
+ },
+ "randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "randomfill": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/randomfill/-/randomfill-1.0.4.tgz",
+ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+ "dev": true,
+ "requires": {
+ "randombytes": "^2.0.5",
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
+ },
+ "raw-body": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.1.tgz",
+ "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
+ "requires": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ }
+ },
+ "read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "dev": true,
+ "requires": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "dev": true
+ },
+ "regenerate-unicode-properties": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz",
+ "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==",
+ "dev": true,
+ "requires": {
+ "regenerate": "^1.4.2"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.13.9",
+ "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
+ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
+ },
+ "regenerator-transform": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmmirror.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz",
+ "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "requires": {
+ "extend-shallow": "^3.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
+ "regexp.prototype.flags": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
+ "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "functions-have-names": "^1.2.2"
+ }
+ },
+ "regexpp": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/regexpp/-/regexpp-2.0.1.tgz",
+ "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
+ "dev": true
+ },
+ "regexpu-core": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.0.1.tgz",
+ "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==",
+ "dev": true,
+ "requires": {
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.0.1",
+ "regjsgen": "^0.6.0",
+ "regjsparser": "^0.8.2",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.0.0"
+ }
+ },
+ "regjsgen": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmmirror.com/regjsgen/-/regjsgen-0.6.0.tgz",
+ "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==",
+ "dev": true
+ },
+ "regjsparser": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.8.4.tgz",
+ "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==",
+ "dev": true,
+ "requires": {
+ "jsesc": "~0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
+ "dev": true
+ }
+ }
+ },
+ "relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog=="
+ },
+ "remove-trailing-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==",
+ "dev": true
+ },
+ "renderkid": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmmirror.com/renderkid/-/renderkid-2.0.7.tgz",
+ "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==",
+ "dev": true,
+ "requires": {
+ "css-select": "^4.1.3",
+ "dom-converter": "^0.2.0",
+ "htmlparser2": "^6.1.0",
+ "lodash": "^4.17.21",
+ "strip-ansi": "^3.0.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+ "dev": true
+ },
+ "css-select": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz",
+ "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+ "dev": true,
+ "requires": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.0.1",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0",
+ "nth-check": "^2.0.1"
+ }
+ },
+ "css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+ "dev": true
+ },
+ "dom-serializer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz",
+ "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ }
+ },
+ "domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true
+ },
+ "domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "dev": true,
+ "requires": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ }
+ },
+ "nth-check": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.0.1.tgz",
+ "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==",
+ "dev": true,
+ "requires": {
+ "boolbase": "^1.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ }
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/repeat-element/-/repeat-element-1.1.4.tgz",
+ "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ=="
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w=="
+ },
+ "request": {
+ "version": "2.88.2",
+ "resolved": "https://registry.npmmirror.com/request/-/request-2.88.2.tgz",
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.3",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.5.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true
+ },
+ "require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "dev": true
+ },
+ "requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
+ },
+ "resize-observer-polyfill": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+ },
+ "resolve": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.0.tgz",
+ "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
+ "requires": {
+ "is-core-module": "^2.8.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "resolve-cwd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
+ "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==",
+ "dev": true,
+ "requires": {
+ "resolve-from": "^3.0.0"
+ }
+ },
+ "resolve-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-3.0.0.tgz",
+ "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==",
+ "dev": true
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmmirror.com/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg=="
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==",
+ "dev": true,
+ "requires": {
+ "onetime": "^2.0.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmmirror.com/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
+ },
+ "retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmmirror.com/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+ "dev": true
+ },
+ "rgb-regex": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/rgb-regex/-/rgb-regex-1.0.1.tgz",
+ "integrity": "sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==",
+ "dev": true
+ },
+ "rgba-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/rgba-regex/-/rgba-regex-1.0.0.tgz",
+ "integrity": "sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "dev": true,
+ "requires": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "rollup-plugin-buble": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmmirror.com/rollup-plugin-buble/-/rollup-plugin-buble-0.15.0.tgz",
+ "integrity": "sha512-iyCysEjC/TTMfchDK15DU4DZlj1x3TOzjWFUlzPjM8b3DA1sztuWmWd3vsPn3uvubGWHHfp49LqxlrXUr7+PLw==",
+ "requires": {
+ "buble": "^0.15.0",
+ "rollup-pluginutils": "^1.5.0"
+ }
+ },
+ "rollup-plugin-commonjs": {
+ "version": "8.4.1",
+ "resolved": "https://registry.npmmirror.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.4.1.tgz",
+ "integrity": "sha512-mg+WuD+jlwoo8bJtW3Mvx7Tz6TsIdMsdhuvCnDMoyjh0oxsVgsjB/N0X984RJCWwc5IIiqNVJhXeeITcc73++A==",
+ "requires": {
+ "acorn": "^5.2.1",
+ "estree-walker": "^0.5.0",
+ "magic-string": "^0.22.4",
+ "resolve": "^1.4.0",
+ "rollup-pluginutils": "^2.0.1"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "5.7.4",
+ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-5.7.4.tgz",
+ "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg=="
+ },
+ "estree-walker": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-0.5.2.tgz",
+ "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig=="
+ },
+ "magic-string": {
+ "version": "0.22.5",
+ "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.22.5.tgz",
+ "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
+ "requires": {
+ "vlq": "^0.2.2"
+ }
+ },
+ "rollup-pluginutils": {
+ "version": "2.8.2",
+ "resolved": "https://registry.npmmirror.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
+ "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
+ "requires": {
+ "estree-walker": "^0.6.1"
+ },
+ "dependencies": {
+ "estree-walker": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-0.6.1.tgz",
+ "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w=="
+ }
+ }
+ }
+ }
+ },
+ "rollup-plugin-json": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/rollup-plugin-json/-/rollup-plugin-json-2.3.1.tgz",
+ "integrity": "sha512-alQQQVPo2z9pl6LSK8QqyDlWwCH5KeE8YxgQv7fa/SeTxz+gQe36jBjcha7hQW68MrVh9Ms71EQaMZDAG3w2yw==",
+ "requires": {
+ "rollup-pluginutils": "^2.0.1"
+ },
+ "dependencies": {
+ "estree-walker": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-0.6.1.tgz",
+ "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w=="
+ },
+ "rollup-pluginutils": {
+ "version": "2.8.2",
+ "resolved": "https://registry.npmmirror.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
+ "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
+ "requires": {
+ "estree-walker": "^0.6.1"
+ }
+ }
+ }
+ },
+ "rollup-plugin-node-resolve": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmmirror.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.4.0.tgz",
+ "integrity": "sha512-PJcd85dxfSBWih84ozRtBkB731OjXk0KnzN0oGp7WOWcarAFkVa71cV5hTJg2qpVsV2U8EUwrzHP3tvy9vS3qg==",
+ "requires": {
+ "builtin-modules": "^2.0.0",
+ "is-module": "^1.0.0",
+ "resolve": "^1.1.6"
+ }
+ },
+ "rollup-pluginutils": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmmirror.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz",
+ "integrity": "sha512-SjdWWWO/CUoMpDy8RUbZ/pSpG68YHmhk5ROKNIoi2En9bJ8bTt3IhYi254RWiTclQmL7Awmrq+rZFOhZkJAHmQ==",
+ "requires": {
+ "estree-walker": "^0.2.1",
+ "minimatch": "^3.0.2"
+ }
+ },
+ "run-async": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmmirror.com/run-async/-/run-async-2.4.1.tgz",
+ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+ "dev": true
+ },
+ "run-queue": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/run-queue/-/run-queue-1.0.3.tgz",
+ "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==",
+ "dev": true,
+ "requires": {
+ "aproba": "^1.1.1"
+ }
+ },
+ "rxjs": {
+ "version": "6.6.7",
+ "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-6.6.7.tgz",
+ "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.9.0"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==",
+ "requires": {
+ "ret": "~0.1.10"
+ }
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "sass": {
+ "version": "1.51.0",
+ "resolved": "https://registry.npmmirror.com/sass/-/sass-1.51.0.tgz",
+ "integrity": "sha512-haGdpTgywJTvHC2b91GSq+clTKGbtkkZmVAb82jZQN/wTy6qs8DdFm2lhEQbEwrY0QDRgSQ3xDurqM977C3noA==",
+ "dev": true,
+ "requires": {
+ "chokidar": ">=3.0.0 <4.0.0",
+ "immutable": "^4.0.0",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ }
+ },
+ "sass-loader": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmmirror.com/sass-loader/-/sass-loader-8.0.2.tgz",
+ "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==",
+ "dev": true,
+ "requires": {
+ "clone-deep": "^4.0.1",
+ "loader-utils": "^1.2.3",
+ "neo-async": "^2.6.1",
+ "schema-utils": "^2.6.1",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ }
+ }
+ },
+ "sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+ "dev": true
+ },
+ "schema-utils": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz",
+ "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.5",
+ "ajv": "^6.12.4",
+ "ajv-keywords": "^3.5.2"
+ }
+ },
+ "scroll-into-view-if-needed": {
+ "version": "2.2.31",
+ "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
+ "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==",
+ "requires": {
+ "compute-scroll-into-view": "^1.0.20"
+ }
+ },
+ "select-hose": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz",
+ "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
+ "dev": true
+ },
+ "selfsigned": {
+ "version": "1.10.14",
+ "resolved": "https://registry.npmmirror.com/selfsigned/-/selfsigned-1.10.14.tgz",
+ "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==",
+ "dev": true,
+ "requires": {
+ "node-forge": "^0.10.0"
+ }
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ },
+ "send": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmmirror.com/send/-/send-0.18.0.tgz",
+ "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ },
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ }
+ }
+ },
+ "serialize-javascript": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+ "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+ "dev": true,
+ "requires": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "serve-index": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmmirror.com/serve-index/-/serve-index-1.9.1.tgz",
+ "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
+ "dev": true,
+ "requires": {
+ "accepts": "~1.3.4",
+ "batch": "0.6.1",
+ "debug": "2.6.9",
+ "escape-html": "~1.0.3",
+ "http-errors": "~1.6.2",
+ "mime-types": "~2.1.17",
+ "parseurl": "~1.3.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
+ "dev": true,
+ "requires": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": ">= 1.4.0 < 2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+ "dev": true
+ },
+ "statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "dev": true
+ }
+ }
+ },
+ "serve-static": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.15.0.tgz",
+ "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+ "requires": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.18.0"
+ }
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
+ "dev": true
+ },
+ "set-value": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/set-value/-/set-value-2.0.1.tgz",
+ "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-extendable": "^0.1.1",
+ "is-plain-object": "^2.0.3",
+ "split-string": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
+ "dev": true
+ },
+ "setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+ },
+ "sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmmirror.com/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "shallow-clone": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/shallow-clone/-/shallow-clone-3.0.1.tgz",
+ "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.2"
+ }
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
+ "dev": true
+ },
+ "shell-quote": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.7.3.tgz",
+ "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
+ "dev": true
+ },
+ "shvl": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/shvl/-/shvl-2.0.3.tgz",
+ "integrity": "sha512-V7C6S9Hlol6SzOJPnQ7qzOVEWUQImt3BNmmzh40wObhla3XOYMe4gGiYzLrJd5TFa+cI2f9LKIRJTTKZSTbWgw=="
+ },
+ "side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ }
+ },
+ "signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "^0.3.1"
+ },
+ "dependencies": {
+ "is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+ "dev": true
+ }
+ }
+ },
+ "sitemap": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-6.4.0.tgz",
+ "integrity": "sha512-DoPKNc2/apQZTUnfiOONWctwq7s6dZVspxAZe2VPMNtoqNq7HgXRvlRnbIpKjf+8+piQdWncwcy+YhhTGY5USQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "^14.14.28",
+ "@types/sax": "^1.2.1",
+ "arg": "^5.0.0",
+ "sax": "^1.2.4"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "14.18.63",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz",
+ "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==",
+ "dev": true
+ }
+ }
+ },
+ "sitemap-webpack-plugin": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/sitemap-webpack-plugin/-/sitemap-webpack-plugin-1.1.1.tgz",
+ "integrity": "sha512-ViKO1uIe7oUMJdjXX098eNRn/Yp04dajC2bmODXhy6qvmYtbBfauGQrir72u/WdMxIpOP0q5y07hyvB10py+OA==",
+ "dev": true,
+ "requires": {
+ "schema-utils": "^3.0.0",
+ "sitemap": "^6.0.0",
+ "webpack-sources": "^1.4.3"
+ },
+ "dependencies": {
+ "schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ }
+ }
+ }
+ },
+ "slash": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/slash/-/slash-2.0.0.tgz",
+ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+ "dev": true
+ },
+ "slate": {
+ "version": "0.72.8",
+ "resolved": "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz",
+ "integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==",
+ "requires": {
+ "immer": "^9.0.6",
+ "is-plain-object": "^5.0.0",
+ "tiny-warning": "^1.0.3"
+ },
+ "dependencies": {
+ "is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
+ }
+ }
+ },
+ "slate-history": {
+ "version": "0.66.0",
+ "resolved": "https://registry.npmmirror.com/slate-history/-/slate-history-0.66.0.tgz",
+ "integrity": "sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==",
+ "requires": {
+ "is-plain-object": "^5.0.0"
+ },
+ "dependencies": {
+ "is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
+ }
+ }
+ },
+ "slice-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-2.1.0.tgz",
+ "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.0",
+ "astral-regex": "^1.0.0",
+ "is-fullwidth-code-point": "^2.0.0"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
+ "dev": true
+ }
+ }
+ },
+ "snabbdom": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmmirror.com/snabbdom/-/snabbdom-3.5.1.tgz",
+ "integrity": "sha512-wHMNIOjkm/YNE5EM3RCbr/+DVgPg6AqQAX1eOxO46zYNvCXjKP5Y865tqQj3EXnaMBjkxmQA5jFuDpDK/dbfiA=="
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmmirror.com/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "requires": {
+ "base": "^0.11.1",
+ "debug": "^2.2.0",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "map-cache": "^0.2.2",
+ "source-map": "^0.5.6",
+ "source-map-resolve": "^0.5.0",
+ "use": "^3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "requires": {
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.0",
+ "snapdragon-util": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "requires": {
+ "kind-of": "^3.2.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "sockjs": {
+ "version": "0.3.24",
+ "resolved": "https://registry.npmmirror.com/sockjs/-/sockjs-0.3.24.tgz",
+ "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
+ "dev": true,
+ "requires": {
+ "faye-websocket": "^0.11.3",
+ "uuid": "^8.3.2",
+ "websocket-driver": "^0.7.4"
+ },
+ "dependencies": {
+ "uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true
+ }
+ }
+ },
+ "sockjs-client": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmmirror.com/sockjs-client/-/sockjs-client-1.6.0.tgz",
+ "integrity": "sha512-qVHJlyfdHFht3eBFZdKEXKTlb7I4IV41xnVNo8yUKA1UHcPJwgW2SvTq9LhnjjCywSkSK7c/e4nghU0GOoMCRQ==",
+ "dev": true,
+ "requires": {
+ "debug": "^3.2.7",
+ "eventsource": "^1.1.0",
+ "faye-websocket": "^0.11.4",
+ "inherits": "^2.0.4",
+ "url-parse": "^1.5.10"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ }
+ }
+ },
+ "sort-keys": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/sort-keys/-/sort-keys-1.1.2.tgz",
+ "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==",
+ "dev": true,
+ "requires": {
+ "is-plain-obj": "^1.0.0"
+ },
+ "dependencies": {
+ "is-plain-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+ "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
+ "dev": true
+ }
+ }
+ },
+ "source-list-map": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/source-list-map/-/source-list-map-2.0.1.tgz",
+ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="
+ },
+ "source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "dev": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmmirror.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+ "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+ "requires": {
+ "atob": "^2.1.2",
+ "decode-uri-component": "^0.2.0",
+ "resolve-url": "^0.2.1",
+ "source-map-url": "^0.4.0",
+ "urix": "^0.1.0"
+ }
+ },
+ "source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmmirror.com/source-map-url/-/source-map-url-0.4.1.tgz",
+ "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw=="
+ },
+ "spdx-correct": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.1.1.tgz",
+ "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+ "dev": true,
+ "requires": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+ "dev": true
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "requires": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz",
+ "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==",
+ "dev": true
+ },
+ "spdy": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/spdy/-/spdy-4.0.2.tgz",
+ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.0",
+ "handle-thing": "^2.0.0",
+ "http-deceiver": "^1.2.7",
+ "select-hose": "^2.0.0",
+ "spdy-transport": "^3.0.0"
+ }
+ },
+ "spdy-transport": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/spdy-transport/-/spdy-transport-3.0.0.tgz",
+ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.0",
+ "detect-node": "^2.0.4",
+ "hpack.js": "^2.1.6",
+ "obuf": "^1.1.2",
+ "readable-stream": "^3.0.6",
+ "wbuf": "^1.7.3"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ }
+ }
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "requires": {
+ "extend-shallow": "^3.0.0"
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true
+ },
+ "sshpk": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmmirror.com/sshpk/-/sshpk-1.17.0.tgz",
+ "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
+ "dev": true,
+ "requires": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ }
+ },
+ "ssr-window": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-3.0.0.tgz",
+ "integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA=="
+ },
+ "ssri": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmmirror.com/ssri/-/ssri-6.0.2.tgz",
+ "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==",
+ "dev": true,
+ "requires": {
+ "figgy-pudding": "^3.5.1"
+ }
+ },
+ "stable": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz",
+ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+ "dev": true
+ },
+ "stackframe": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/stackframe/-/stackframe-1.2.1.tgz",
+ "integrity": "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmmirror.com/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==",
+ "requires": {
+ "define-property": "^0.2.5",
+ "object-copy": "^0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
+ },
+ "stream-browserify": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/stream-browserify/-/stream-browserify-2.0.2.tgz",
+ "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
+ "dev": true,
+ "requires": {
+ "inherits": "~2.0.1",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "stream-each": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmmirror.com/stream-each/-/stream-each-1.2.3.tgz",
+ "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "stream-shift": "^1.0.0"
+ }
+ },
+ "stream-http": {
+ "version": "2.8.3",
+ "resolved": "https://registry.npmmirror.com/stream-http/-/stream-http-2.8.3.tgz",
+ "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
+ "dev": true,
+ "requires": {
+ "builtin-status-codes": "^3.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.3.6",
+ "to-arraybuffer": "^1.0.0",
+ "xtend": "^4.0.0"
+ }
+ },
+ "stream-shift": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/stream-shift/-/stream-shift-1.0.1.tgz",
+ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
+ "dev": true
+ },
+ "strict-uri-encode": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
+ "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "string.prototype.trimend": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz",
+ "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.19.5"
+ }
+ },
+ "string.prototype.trimstart": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz",
+ "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.19.5"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ }
+ }
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==",
+ "dev": true
+ },
+ "strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
+ },
+ "stylehacks": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/stylehacks/-/stylehacks-4.0.3.tgz",
+ "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-selector-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-selector-parser": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+ "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+ "dev": true,
+ "requires": {
+ "dot-prop": "^5.2.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ }
+ }
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
+ },
+ "svg-tags": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz",
+ "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
+ "dev": true
+ },
+ "svgo": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmmirror.com/svgo/-/svgo-1.3.2.tgz",
+ "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.1",
+ "coa": "^2.0.2",
+ "css-select": "^2.0.0",
+ "css-select-base-adapter": "^0.1.1",
+ "css-tree": "1.0.0-alpha.37",
+ "csso": "^4.0.2",
+ "js-yaml": "^3.13.1",
+ "mkdirp": "~0.5.1",
+ "object.values": "^1.1.0",
+ "sax": "~1.2.4",
+ "stable": "^0.1.8",
+ "unquote": "~1.1.1",
+ "util.promisify": "~1.0.0"
+ }
+ },
+ "table": {
+ "version": "5.4.6",
+ "resolved": "https://registry.npmmirror.com/table/-/table-5.4.6.tgz",
+ "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.10.2",
+ "lodash": "^4.17.14",
+ "slice-ansi": "^2.1.0",
+ "string-width": "^3.0.0"
+ },
+ "dependencies": {
+ "emoji-regex": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-7.0.3.tgz",
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ }
+ }
+ }
+ },
+ "tapable": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmmirror.com/tapable/-/tapable-1.1.3.tgz",
+ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
+ "dev": true
+ },
+ "terser": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmmirror.com/terser/-/terser-4.8.0.tgz",
+ "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
+ "dev": true,
+ "requires": {
+ "commander": "^2.20.0",
+ "source-map": "~0.6.1",
+ "source-map-support": "~0.5.12"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "terser-webpack-plugin": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz",
+ "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==",
+ "dev": true,
+ "requires": {
+ "cacache": "^12.0.2",
+ "find-cache-dir": "^2.1.0",
+ "is-wsl": "^1.1.0",
+ "schema-utils": "^1.0.0",
+ "serialize-javascript": "^4.0.0",
+ "source-map": "^0.6.1",
+ "terser": "^4.1.2",
+ "webpack-sources": "^1.4.0",
+ "worker-farm": "^1.7.0"
+ },
+ "dependencies": {
+ "find-cache-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+ "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+ "dev": true,
+ "requires": {
+ "commondir": "^1.0.1",
+ "make-dir": "^2.0.0",
+ "pkg-dir": "^3.0.0"
+ }
+ },
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^3.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "dev": true,
+ "requires": {
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
+ }
+ },
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "dev": true
+ },
+ "pkg-dir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-3.0.0.tgz",
+ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+ "dev": true,
+ "requires": {
+ "find-up": "^3.0.0"
+ }
+ },
+ "schema-utils": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "requires": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmmirror.com/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "requires": {
+ "thenify": ">= 3.1.0 < 4"
+ }
+ },
+ "thread-loader": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmmirror.com/thread-loader/-/thread-loader-2.1.3.tgz",
+ "integrity": "sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==",
+ "dev": true,
+ "requires": {
+ "loader-runner": "^2.3.1",
+ "loader-utils": "^1.1.0",
+ "neo-async": "^2.6.0"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ }
+ }
+ },
+ "throttle-debounce": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
+ "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg=="
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmmirror.com/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ },
+ "thunky": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz",
+ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
+ "dev": true
+ },
+ "timers-browserify": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmmirror.com/timers-browserify/-/timers-browserify-2.0.12.tgz",
+ "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==",
+ "dev": true,
+ "requires": {
+ "setimmediate": "^1.0.4"
+ }
+ },
+ "timsort": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmmirror.com/timsort/-/timsort-0.3.0.tgz",
+ "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==",
+ "dev": true
+ },
+ "tiny-warning": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/tiny-warning/-/tiny-warning-1.0.3.tgz",
+ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "~1.0.2"
+ }
+ },
+ "to-arraybuffer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+ "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==",
+ "dev": true
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmmirror.com/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==",
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "requires": {
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "regex-not": "^1.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==",
+ "requires": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ }
+ },
+ "toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
+ },
+ "toposort": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmmirror.com/toposort/-/toposort-1.0.7.tgz",
+ "integrity": "sha512-FclLrw8b9bMWf4QlCJuHBEVhSRsqDj6u3nIjAzPeJvgl//1hBlffdlk0MALceL14+koWEdU4ofRAXofbODxQzg==",
+ "dev": true
+ },
+ "tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "dev": true,
+ "requires": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ }
+ },
+ "tryer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/tryer/-/tryer-1.0.1.tgz",
+ "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==",
+ "dev": true
+ },
+ "ts-pnp": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/ts-pnp/-/ts-pnp-1.2.0.tgz",
+ "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==",
+ "dev": true
+ },
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
+ "tty-browserify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmmirror.com/tty-browserify/-/tty-browserify-0.0.0.tgz",
+ "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==",
+ "dev": true
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
+ "dev": true
+ },
+ "type": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/type/-/type-1.2.0.tgz",
+ "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "~1.1.2"
+ }
+ },
+ "type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "dev": true
+ },
+ "type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ }
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
+ },
+ "uglify-js": {
+ "version": "3.4.10",
+ "resolved": "https://registry.npmmirror.com/uglify-js/-/uglify-js-3.4.10.tgz",
+ "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==",
+ "dev": true,
+ "requires": {
+ "commander": "~2.19.0",
+ "source-map": "~0.6.1"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-2.19.0.tgz",
+ "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ }
+ },
+ "unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
+ "dev": true
+ },
+ "unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "dev": true,
+ "requires": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ }
+ },
+ "unicode-match-property-value-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==",
+ "dev": true
+ },
+ "unicode-property-aliases-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/union-value/-/union-value-1.0.1.tgz",
+ "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+ "requires": {
+ "arr-union": "^3.1.0",
+ "get-value": "^2.0.6",
+ "is-extendable": "^0.1.1",
+ "set-value": "^2.0.1"
+ }
+ },
+ "uniq": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/uniq/-/uniq-1.0.1.tgz",
+ "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==",
+ "dev": true
+ },
+ "uniqs": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/uniqs/-/uniqs-2.0.0.tgz",
+ "integrity": "sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ==",
+ "dev": true
+ },
+ "unique-filename": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/unique-filename/-/unique-filename-1.1.1.tgz",
+ "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+ "dev": true,
+ "requires": {
+ "unique-slug": "^2.0.0"
+ }
+ },
+ "unique-slug": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/unique-slug/-/unique-slug-2.0.2.tgz",
+ "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
+ "dev": true,
+ "requires": {
+ "imurmurhash": "^0.1.4"
+ }
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
+ },
+ "unquote": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/unquote/-/unquote-1.1.1.tgz",
+ "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==",
+ "requires": {
+ "has-value": "^0.3.1",
+ "isobject": "^3.0.0"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmmirror.com/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==",
+ "requires": {
+ "get-value": "^2.0.3",
+ "has-values": "^0.1.4",
+ "isobject": "^2.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==",
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmmirror.com/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ=="
+ }
+ }
+ },
+ "upath": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/upath/-/upath-1.2.0.tgz",
+ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+ "dev": true
+ },
+ "upper-case": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmmirror.com/upper-case/-/upper-case-1.1.3.tgz",
+ "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA=="
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg=="
+ },
+ "url": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmmirror.com/url/-/url-0.11.0.tgz",
+ "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==",
+ "dev": true,
+ "requires": {
+ "punycode": "1.3.2",
+ "querystring": "0.2.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmmirror.com/punycode/-/punycode-1.3.2.tgz",
+ "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==",
+ "dev": true
+ }
+ }
+ },
+ "url-loader": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/url-loader/-/url-loader-2.3.0.tgz",
+ "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==",
+ "dev": true,
+ "requires": {
+ "loader-utils": "^1.2.3",
+ "mime": "^2.4.4",
+ "schema-utils": "^2.5.0"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ }
+ }
+ },
+ "url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "dev": true,
+ "requires": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "use": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/use/-/use-3.1.1.tgz",
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
+ },
+ "util": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmmirror.com/util/-/util-0.11.1.tgz",
+ "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
+ "dev": true
+ }
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "util.promisify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/util.promisify/-/util.promisify-1.0.1.tgz",
+ "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.2",
+ "has-symbols": "^1.0.1",
+ "object.getownpropertydescriptors": "^2.1.0"
+ }
+ },
+ "utila": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmmirror.com/utila/-/utila-0.4.0.tgz",
+ "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
+ "dev": true
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
+ },
+ "uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "dev": true
+ },
+ "v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+ "dev": true
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "requires": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
+ },
+ "vendors": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/vendors/-/vendors-1.0.4.tgz",
+ "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==",
+ "dev": true
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmmirror.com/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
+ "vlq": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmmirror.com/vlq/-/vlq-0.2.3.tgz",
+ "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow=="
+ },
+ "vm-browserify": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/vm-browserify/-/vm-browserify-1.1.2.tgz",
+ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
+ "dev": true
+ },
+ "vue": {
+ "version": "2.6.14",
+ "resolved": "https://registry.npmmirror.com/vue/-/vue-2.6.14.tgz",
+ "integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ=="
+ },
+ "vue-eslint-parser": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz",
+ "integrity": "sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.1",
+ "eslint-scope": "^5.1.1",
+ "eslint-visitor-keys": "^1.1.0",
+ "espree": "^6.2.1",
+ "esquery": "^1.4.0",
+ "lodash": "^4.17.21",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ }
+ }
+ }
+ },
+ "vue-hot-reload-api": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmmirror.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz",
+ "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==",
+ "dev": true
+ },
+ "vue-i18n": {
+ "version": "8.27.2",
+ "resolved": "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-8.27.2.tgz",
+ "integrity": "sha512-QVzn7u2WVH8F7eSKIM00lujC7x1mnuGPaTnDTmB01Hd709jDtB9kYtBqM+MWmp5AJRx3gnqAdZbee9MelqwFBg=="
+ },
+ "vue-loader": {
+ "version": "15.9.8",
+ "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-15.9.8.tgz",
+ "integrity": "sha512-GwSkxPrihfLR69/dSV3+5CdMQ0D+jXg8Ma1S4nQXKJAznYFX14vHdc/NetQc34Dw+rBbIJyP7JOuVb9Fhprvog==",
+ "dev": true,
+ "requires": {
+ "@vue/component-compiler-utils": "^3.1.0",
+ "hash-sum": "^1.0.2",
+ "loader-utils": "^1.1.0",
+ "vue-hot-reload-api": "^2.3.0",
+ "vue-style-loader": "^4.1.0"
+ },
+ "dependencies": {
+ "hash-sum": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz",
+ "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
+ "dev": true
+ },
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ }
+ }
+ },
+ "vue-meta-info": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmmirror.com/vue-meta-info/-/vue-meta-info-0.1.7.tgz",
+ "integrity": "sha512-0tfCM0XB6aU44ycijhGBCiLe9bLsFa82qZ1fA3gaEnvpQCw4Tnk6p5R3JpppZTThycr70ckf9Wx49C7ESDp75A==",
+ "requires": {
+ "rollup-plugin-buble": "^0.15.0",
+ "rollup-plugin-commonjs": "^8.2.0",
+ "rollup-plugin-json": "^2.3.0",
+ "rollup-plugin-node-resolve": "^3.0.0",
+ "vue": "^2.4.2",
+ "vue-router": "^2.7.0"
+ },
+ "dependencies": {
+ "vue-router": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-2.8.1.tgz",
+ "integrity": "sha512-MC4jacHBhTPKtmcfzvaj2N7g6jgJ/Z/eIjZdt+yUaUOM1iKC0OUIlO/xCtz6OZFFTNUJs/1YNro2GN/lE+nOXA=="
+ }
+ }
+ },
+ "vue-quill-editor": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmmirror.com/vue-quill-editor/-/vue-quill-editor-3.0.6.tgz",
+ "integrity": "sha512-g20oSZNWg8Hbu41Kinjd55e235qVWPLfg4NvsLW6d+DhgBTFbEuMpcWlUdrD6qT3+Noim6DRu18VLM9lVShXOQ==",
+ "requires": {
+ "object-assign": "^4.1.1",
+ "quill": "^1.3.4"
+ }
+ },
+ "vue-router": {
+ "version": "3.5.4",
+ "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-3.5.4.tgz",
+ "integrity": "sha512-x+/DLAJZv2mcQ7glH2oV9ze8uPwcI+H+GgTgTmb5I55bCgY3+vXWIsqbYUzbBSZnwFHEJku4eoaH/x98veyymQ=="
+ },
+ "vue-style-loader": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmmirror.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz",
+ "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==",
+ "dev": true,
+ "requires": {
+ "hash-sum": "^1.0.2",
+ "loader-utils": "^1.0.2"
+ },
+ "dependencies": {
+ "hash-sum": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz",
+ "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
+ "dev": true
+ },
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ }
+ }
+ },
+ "vue-template-compiler": {
+ "version": "2.6.14",
+ "resolved": "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz",
+ "integrity": "sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g==",
+ "dev": true,
+ "requires": {
+ "de-indent": "^1.0.2",
+ "he": "^1.1.0"
+ }
+ },
+ "vue-template-es2015-compiler": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmmirror.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz",
+ "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
+ "dev": true
+ },
+ "vuex": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmmirror.com/vuex/-/vuex-3.6.2.tgz",
+ "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw=="
+ },
+ "vuex-persistedstate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/vuex-persistedstate/-/vuex-persistedstate-4.1.0.tgz",
+ "integrity": "sha512-3SkEj4NqwM69ikJdFVw6gObeB0NHyspRYMYkR/EbhR0hbvAKyR5gksVhtAfY1UYuWUOCCA0QNGwv9pOwdj+XUQ==",
+ "requires": {
+ "deepmerge": "^4.2.2",
+ "shvl": "^2.0.3"
+ },
+ "dependencies": {
+ "deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="
+ }
+ }
+ },
+ "wangeditor": {
+ "version": "4.7.15",
+ "resolved": "https://registry.npmmirror.com/wangeditor/-/wangeditor-4.7.15.tgz",
+ "integrity": "sha512-aPTdREd8BxXVyJ5MI+LU83FQ7u1EPd341iXIorRNYSOvoimNoZ4nPg+yn3FGbB93/owEa6buLw8wdhYnMCJQLg==",
+ "requires": {
+ "@babel/runtime": "^7.11.2",
+ "@babel/runtime-corejs3": "^7.11.2",
+ "tslib": "^2.1.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz",
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
+ }
+ }
+ },
+ "watchpack": {
+ "version": "1.7.5",
+ "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-1.7.5.tgz",
+ "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==",
+ "dev": true,
+ "requires": {
+ "chokidar": "^3.4.1",
+ "graceful-fs": "^4.1.2",
+ "neo-async": "^2.5.0",
+ "watchpack-chokidar2": "^2.0.1"
+ }
+ },
+ "watchpack-chokidar2": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz",
+ "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chokidar": "^2.1.8"
+ },
+ "dependencies": {
+ "anymatch": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-2.0.0.tgz",
+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "micromatch": "^3.1.4",
+ "normalize-path": "^2.1.1"
+ },
+ "dependencies": {
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "remove-trailing-separator": "^1.0.1"
+ }
+ }
+ }
+ },
+ "binary-extensions": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-1.13.1.tgz",
+ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+ "dev": true,
+ "optional": true
+ },
+ "chokidar": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-2.1.8.tgz",
+ "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "anymatch": "^2.0.0",
+ "async-each": "^1.0.1",
+ "braces": "^2.3.2",
+ "fsevents": "^1.2.7",
+ "glob-parent": "^3.1.0",
+ "inherits": "^2.0.3",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "normalize-path": "^3.0.0",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.2.1",
+ "upath": "^1.1.1"
+ }
+ },
+ "fsevents": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz",
+ "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "bindings": "^1.5.0",
+ "nan": "^2.12.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-extglob": "^2.1.0"
+ }
+ }
+ }
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "binary-extensions": "^1.0.0"
+ }
+ },
+ "readdirp": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-2.2.1.tgz",
+ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "graceful-fs": "^4.1.11",
+ "micromatch": "^3.1.10",
+ "readable-stream": "^2.0.2"
+ }
+ }
+ }
+ },
+ "wbuf": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmmirror.com/wbuf/-/wbuf-1.7.3.tgz",
+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+ "dev": true,
+ "requires": {
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+ "dev": true,
+ "requires": {
+ "defaults": "^1.0.3"
+ }
+ },
+ "webpack": {
+ "version": "4.46.0",
+ "resolved": "https://registry.npmmirror.com/webpack/-/webpack-4.46.0.tgz",
+ "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-module-context": "1.9.0",
+ "@webassemblyjs/wasm-edit": "1.9.0",
+ "@webassemblyjs/wasm-parser": "1.9.0",
+ "acorn": "^6.4.1",
+ "ajv": "^6.10.2",
+ "ajv-keywords": "^3.4.1",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^4.5.0",
+ "eslint-scope": "^4.0.3",
+ "json-parse-better-errors": "^1.0.2",
+ "loader-runner": "^2.4.0",
+ "loader-utils": "^1.2.3",
+ "memory-fs": "^0.4.1",
+ "micromatch": "^3.1.10",
+ "mkdirp": "^0.5.3",
+ "neo-async": "^2.6.1",
+ "node-libs-browser": "^2.2.1",
+ "schema-utils": "^1.0.0",
+ "tapable": "^1.1.3",
+ "terser-webpack-plugin": "^1.4.3",
+ "watchpack": "^1.7.4",
+ "webpack-sources": "^1.4.1"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ },
+ "schema-utils": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ }
+ }
+ }
+ },
+ "webpack-bundle-analyzer": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmmirror.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz",
+ "integrity": "sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA==",
+ "dev": true,
+ "requires": {
+ "acorn": "^7.1.1",
+ "acorn-walk": "^7.1.1",
+ "bfj": "^6.1.1",
+ "chalk": "^2.4.1",
+ "commander": "^2.18.0",
+ "ejs": "^2.6.1",
+ "express": "^4.16.3",
+ "filesize": "^3.6.1",
+ "gzip-size": "^5.0.0",
+ "lodash": "^4.17.19",
+ "mkdirp": "^0.5.1",
+ "opener": "^1.5.1",
+ "ws": "^6.0.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true
+ }
+ }
+ },
+ "webpack-chain": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmmirror.com/webpack-chain/-/webpack-chain-6.5.1.tgz",
+ "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==",
+ "dev": true,
+ "requires": {
+ "deepmerge": "^1.5.2",
+ "javascript-stringify": "^2.0.1"
+ }
+ },
+ "webpack-dev-middleware": {
+ "version": "3.7.3",
+ "resolved": "https://registry.npmmirror.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz",
+ "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==",
+ "dev": true,
+ "requires": {
+ "memory-fs": "^0.4.1",
+ "mime": "^2.4.4",
+ "mkdirp": "^0.5.1",
+ "range-parser": "^1.2.1",
+ "webpack-log": "^2.0.0"
+ }
+ },
+ "webpack-dev-server": {
+ "version": "3.11.3",
+ "resolved": "https://registry.npmmirror.com/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz",
+ "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==",
+ "dev": true,
+ "requires": {
+ "ansi-html-community": "0.0.8",
+ "bonjour": "^3.5.0",
+ "chokidar": "^2.1.8",
+ "compression": "^1.7.4",
+ "connect-history-api-fallback": "^1.6.0",
+ "debug": "^4.1.1",
+ "del": "^4.1.1",
+ "express": "^4.17.1",
+ "html-entities": "^1.3.1",
+ "http-proxy-middleware": "0.19.1",
+ "import-local": "^2.0.0",
+ "internal-ip": "^4.3.0",
+ "ip": "^1.1.5",
+ "is-absolute-url": "^3.0.3",
+ "killable": "^1.0.1",
+ "loglevel": "^1.6.8",
+ "opn": "^5.5.0",
+ "p-retry": "^3.0.1",
+ "portfinder": "^1.0.26",
+ "schema-utils": "^1.0.0",
+ "selfsigned": "^1.10.8",
+ "semver": "^6.3.0",
+ "serve-index": "^1.9.1",
+ "sockjs": "^0.3.21",
+ "sockjs-client": "^1.5.0",
+ "spdy": "^4.0.2",
+ "strip-ansi": "^3.0.1",
+ "supports-color": "^6.1.0",
+ "url": "^0.11.0",
+ "webpack-dev-middleware": "^3.7.2",
+ "webpack-log": "^2.0.0",
+ "ws": "^6.2.1",
+ "yargs": "^13.3.2"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+ "dev": true
+ },
+ "anymatch": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-2.0.0.tgz",
+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "dev": true,
+ "requires": {
+ "micromatch": "^3.1.4",
+ "normalize-path": "^2.1.1"
+ },
+ "dependencies": {
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==",
+ "dev": true,
+ "requires": {
+ "remove-trailing-separator": "^1.0.1"
+ }
+ }
+ }
+ },
+ "binary-extensions": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-1.13.1.tgz",
+ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "chokidar": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-2.1.8.tgz",
+ "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+ "dev": true,
+ "requires": {
+ "anymatch": "^2.0.0",
+ "async-each": "^1.0.1",
+ "braces": "^2.3.2",
+ "fsevents": "^1.2.7",
+ "glob-parent": "^3.1.0",
+ "inherits": "^2.0.3",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "normalize-path": "^3.0.0",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.2.1",
+ "upath": "^1.1.1"
+ }
+ },
+ "cliui": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/cliui/-/cliui-5.0.0.tgz",
+ "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+ "dev": true,
+ "requires": {
+ "string-width": "^3.1.0",
+ "strip-ansi": "^5.2.0",
+ "wrap-ansi": "^5.1.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-4.1.1.tgz",
+ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ }
+ }
+ }
+ },
+ "emoji-regex": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-7.0.3.tgz",
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+ "dev": true
+ },
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^3.0.0"
+ }
+ },
+ "fsevents": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz",
+ "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "bindings": "^1.5.0",
+ "nan": "^2.12.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.0"
+ }
+ }
+ }
+ },
+ "http-proxy-middleware": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz",
+ "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==",
+ "dev": true,
+ "requires": {
+ "http-proxy": "^1.17.0",
+ "is-glob": "^4.0.0",
+ "lodash": "^4.17.11",
+ "micromatch": "^3.1.10"
+ }
+ },
+ "is-absolute-url": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
+ "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
+ "dev": true
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^1.0.0"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
+ "dev": true
+ },
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "dev": true
+ },
+ "readdirp": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-2.2.1.tgz",
+ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.11",
+ "micromatch": "^3.1.10",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "schema-utils": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ }
+ },
+ "string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-4.1.1.tgz",
+ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "wrap-ansi": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.0",
+ "string-width": "^3.0.0",
+ "strip-ansi": "^5.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-4.1.1.tgz",
+ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ }
+ }
+ }
+ },
+ "yargs": {
+ "version": "13.3.2",
+ "resolved": "https://registry.npmmirror.com/yargs/-/yargs-13.3.2.tgz",
+ "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+ "dev": true,
+ "requires": {
+ "cliui": "^5.0.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^3.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^13.1.2"
+ }
+ },
+ "yargs-parser": {
+ "version": "13.1.2",
+ "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-13.1.2.tgz",
+ "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ }
+ }
+ },
+ "webpack-log": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/webpack-log/-/webpack-log-2.0.0.tgz",
+ "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "^3.0.0",
+ "uuid": "^3.3.2"
+ }
+ },
+ "webpack-merge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmmirror.com/webpack-merge/-/webpack-merge-4.2.2.tgz",
+ "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.15"
+ }
+ },
+ "webpack-sources": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-1.4.3.tgz",
+ "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
+ "dev": true,
+ "requires": {
+ "source-list-map": "^2.0.0",
+ "source-map": "~0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "websocket-driver": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmmirror.com/websocket-driver/-/websocket-driver-0.7.4.tgz",
+ "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
+ "dev": true,
+ "requires": {
+ "http-parser-js": ">=0.5.1",
+ "safe-buffer": ">=5.1.0",
+ "websocket-extensions": ">=0.1.1"
+ }
+ },
+ "websocket-extensions": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmmirror.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
+ "dev": true
+ },
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dev": true,
+ "requires": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ }
+ },
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==",
+ "dev": true
+ },
+ "wildcard": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz",
+ "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng=="
+ },
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true
+ },
+ "worker-farm": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmmirror.com/worker-farm/-/worker-farm-1.7.0.tgz",
+ "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
+ "dev": true,
+ "requires": {
+ "errno": "~0.1.7"
+ }
+ },
+ "wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "write": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/write/-/write-1.0.3.tgz",
+ "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
+ "dev": true,
+ "requires": {
+ "mkdirp": "^0.5.1"
+ }
+ },
+ "ws": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmmirror.com/ws/-/ws-6.2.2.tgz",
+ "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==",
+ "requires": {
+ "async-limiter": "~1.0.0"
+ }
+ },
+ "xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "dev": true
+ },
+ "y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "requires": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "dependencies": {
+ "cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true
+ },
+ "yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+ "requires": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ },
+ "yorkie": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/yorkie/-/yorkie-2.0.0.tgz",
+ "integrity": "sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==",
+ "dev": true,
+ "requires": {
+ "execa": "^0.8.0",
+ "is-ci": "^1.0.10",
+ "normalize-path": "^1.0.0",
+ "strip-indent": "^2.0.0"
+ },
+ "dependencies": {
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^4.0.1",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ },
+ "execa": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmmirror.com/execa/-/execa-0.8.0.tgz",
+ "integrity": "sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^5.0.1",
+ "get-stream": "^3.0.0",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^2.0.0",
+ "p-finally": "^1.0.0",
+ "signal-exit": "^3.0.0",
+ "strip-eof": "^1.0.0"
+ }
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz",
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "dev": true,
+ "requires": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ }
+ },
+ "normalize-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-1.0.0.tgz",
+ "integrity": "sha512-7WyT0w8jhpDStXRq5836AMmihQwq2nrUVQrgjvUo/p/NZf9uy/MeJ246lBJVmWuYXMlJuG9BNZHF0hWjfTbQUA==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
+ "dev": true
+ }
+ }
+ },
+ "zrender": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.3.2.tgz",
+ "integrity": "sha512-8IiYdfwHj2rx0UeIGZGGU4WEVSDEdeVCaIg/fomejg1Xu6OifAL1GVzIPHg2D+MyUkbNgPWji90t0a8IDk+39w==",
+ "requires": {
+ "tslib": "2.3.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
+ "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+ }
+ }
+ }
+ }
+}
diff --git a/yq/package.json b/yq/package.json
new file mode 100644
index 0000000..10b33fc
--- /dev/null
+++ b/yq/package.json
@@ -0,0 +1,48 @@
+{
+ "name": "project",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "vue-cli-service serve",
+ "build": "vue-cli-service build",
+ "lint": "vue-cli-service lint",
+ "serve:test": "vue-cli-service serve --mode test",
+ "build:test": "vue-cli-service build --mode test"
+ },
+ "dependencies": {
+ "@dreysolano/prerender-spa-plugin": "^1.0.3",
+ "@wangeditor/editor": "^5.1.23",
+ "@wangeditor/editor-for-vue": "^1.0.2",
+ "axios": "^0.27.2",
+ "bignumber.js": "^9.1.2",
+ "core-js": "^3.25.5",
+ "echarts": "^5.3.2",
+ "element-resize-detector": "^1.2.4",
+ "element-ui": "^2.15.8",
+ "encryptlong": "^3.1.4",
+ "vue": "^2.6.11",
+ "vue-i18n": "^8.27.2",
+ "vue-meta-info": "^0.1.7",
+ "vue-quill-editor": "^3.0.6",
+ "vue-router": "^3.2.0",
+ "vuex": "^3.4.0",
+ "vuex-persistedstate": "^4.1.0",
+ "wangeditor": "^4.7.15"
+ },
+ "devDependencies": {
+ "@vue/cli-plugin-babel": "~4.5.17",
+ "@vue/cli-plugin-eslint": "~4.5.17",
+ "@vue/cli-plugin-router": "~4.5.17",
+ "@vue/cli-plugin-vuex": "~4.5.17",
+ "@vue/cli-service": "~4.5.17",
+ "babel-eslint": "^10.1.0",
+ "eslint": "^6.7.2",
+ "eslint-plugin-vue": "^6.2.2",
+ "jsencrypt": "^3.3.1",
+ "prerender-spa-plugin": "^3.4.0",
+ "sass": "^1.26.5",
+ "sass-loader": "^8.0.2",
+ "sitemap-webpack-plugin": "^1.1.1",
+ "vue-template-compiler": "^2.6.11"
+ }
+}
diff --git a/yq/public/favicon.ico b/yq/public/favicon.ico
new file mode 100644
index 0000000..e82c2c2
Binary files /dev/null and b/yq/public/favicon.ico differ
diff --git a/yq/public/img/btc.png b/yq/public/img/btc.png
new file mode 100644
index 0000000..6402b75
Binary files /dev/null and b/yq/public/img/btc.png differ
diff --git a/yq/public/img/busd.png b/yq/public/img/busd.png
new file mode 100644
index 0000000..ae667c8
Binary files /dev/null and b/yq/public/img/busd.png differ
diff --git a/yq/public/img/eth.png b/yq/public/img/eth.png
new file mode 100644
index 0000000..c96f24c
Binary files /dev/null and b/yq/public/img/eth.png differ
diff --git a/yq/public/img/f1.png b/yq/public/img/f1.png
new file mode 100644
index 0000000..dd80cbc
Binary files /dev/null and b/yq/public/img/f1.png differ
diff --git a/yq/public/img/f2.png b/yq/public/img/f2.png
new file mode 100644
index 0000000..e0e24e4
Binary files /dev/null and b/yq/public/img/f2.png differ
diff --git a/yq/public/img/f3.png b/yq/public/img/f3.png
new file mode 100644
index 0000000..2888780
Binary files /dev/null and b/yq/public/img/f3.png differ
diff --git a/yq/public/img/favicon.ico b/yq/public/img/favicon.ico
new file mode 100644
index 0000000..e82c2c2
Binary files /dev/null and b/yq/public/img/favicon.ico differ
diff --git a/yq/public/img/gusd.png b/yq/public/img/gusd.png
new file mode 100644
index 0000000..e8d066f
Binary files /dev/null and b/yq/public/img/gusd.png differ
diff --git a/yq/public/img/husd.png b/yq/public/img/husd.png
new file mode 100644
index 0000000..ad889d2
Binary files /dev/null and b/yq/public/img/husd.png differ
diff --git a/yq/public/img/ltc.png b/yq/public/img/ltc.png
new file mode 100644
index 0000000..b80eff4
Binary files /dev/null and b/yq/public/img/ltc.png differ
diff --git a/yq/public/index.html b/yq/public/index.html
new file mode 100644
index 0000000..0c94852
--- /dev/null
+++ b/yq/public/index.html
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ coinbus - A professional blockchain data analysis platform
+
+
+
+
+
+
+
+
+
+ We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
+ Please enable it to continue.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/public/robots.txt b/yq/public/robots.txt
new file mode 100644
index 0000000..298e27f
--- /dev/null
+++ b/yq/public/robots.txt
@@ -0,0 +1,22 @@
+User-agent: * # 适用于所有搜索引擎爬虫
+Allow: / #允许爬取根目录下的所有内容
+Disallow: /admin
+Disallow: /api
+
+
+
+# 站点地图配置
+Sitemap: https://coinbus.cc/sitemap.xml # 站点地图
+
+
+
+
+# SEO优化 允许爬取各类静态资源文件
+Allow: /*.js
+Allow: /*.css
+Allow: /*.png
+Allow: /*.jpg
+Allow: /*.gif
+Allow: /*.svg
+Allow: /*.ico
+
diff --git a/yq/src/App.vue b/yq/src/App.vue
new file mode 100644
index 0000000..8070d6f
--- /dev/null
+++ b/yq/src/App.vue
@@ -0,0 +1,893 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/api/CancelTokens.js b/yq/src/api/CancelTokens.js
new file mode 100644
index 0000000..4f90ebc
--- /dev/null
+++ b/yq/src/api/CancelTokens.js
@@ -0,0 +1,64 @@
+// import { ref } from "vue";
+// import axios from "axios";
+
+// const keyword = ref("");
+// let temp;
+// const search = () => {
+// temp?.("取消请求"); // 取消上一次请求
+// axios({
+// method: "post",
+// url: "/api",
+// data: { wd: keyword.value },
+// cancelToken: new axios.CancelToken((cancel) => {
+// // 接受一个 cancel 取消当前请求的方法
+// temp = cancel;
+// })
+// }).then((res) => {
+// // 成功
+// }).catch((err) => {
+// if (axios.isCancel(err)) {
+// console.log(err.message); // 被取消时的参数
+// } else {
+// console.log(err); // 请求错误
+// }
+// });
+// };
+
+
+// import { AxiosRequestConfig } from "axios";
+
+// export default {
+
+// tokens: new Map(),
+
+// getKey: (config: AxiosRequestConfig): string => [config.url,config.method].join("&"),
+
+// add(config: AxiosRequestConfig) {
+// const pendingKey = this.getKey(config);
+// config.cancelToken =
+// config.cancelToken ||
+// new axios.CancelToken((cancel) => {
+// if (!this.tokens.has(pendingKey)) {
+// this.tokens.set(pendingKey, cancel);
+// }
+// });
+// },
+
+// remove(config: AxiosRequestConfig) {
+// const pendingKey = this.getKey(config);
+// if (this.tokens.has(pendingKey)) {
+// const cancelToken = this.tokens.get(pendingKey);
+// cancelToken(pendingKey);
+// this.tokens.delete(pendingKey);
+// }
+// },
+
+// removeAll() {
+// this.tokens.forEach((value, key) => {
+// const cancelToken = this.tokens.get(key);
+// cancelToken(key);
+// this.tokens.delete(key);
+// });
+// },
+// };
+
diff --git a/yq/src/api/api.js b/yq/src/api/api.js
new file mode 100644
index 0000000..361d3b8
--- /dev/null
+++ b/yq/src/api/api.js
@@ -0,0 +1,685 @@
+import { get,POST } from './http'
+
+export default class API {
+ //盈利地址数
+ static getDownloadFile(ids) {
+ return get(`/marketall/ticket/downloadFile?ids=${ids}`)
+
+ }
+
+
+
+ //盈利地址数
+ static getProfitAddress(req, radius, start, end) {
+ if (start) {
+ return get(`/marketall/${radius}/v2/${req}?start=${start}`)
+ } else {
+ return get(`/marketall/${radius}/v2/${req}`)
+ }
+ }
+
+ //
+ static getHolder(req, radius, start, end) {
+ if (start) {
+ return get(`/marketall/${radius}/${req}?start=${start}`)
+ } else {
+ return get(`/marketall/${radius}/${req}`)
+ }
+ }
+
+ //验证邮箱是否注册过
+ static getcheckMail(email) {
+ return get(`/system/user/checkMail/${email}`)
+
+ }
+ //请求个人中心资料
+ static getpersonal() {
+ return get(`/system/user/profile`)
+
+ }
+ //请求重置密码验证码
+ static getpasswrodCode() {
+ return get(`/auth/restPwdCode`)
+
+ }
+ //请求注册弹窗验证码图片
+ static getCodeEmail(username, email) {
+ return get(`/auth/emailcode?userName=${username}&email=${email}`)
+
+ }
+ //请求验证码图片
+ static getVerification() {
+ return get(`/code`)
+
+ }
+ //请求erc20 token大额交易 前50的token
+ static getETHTokenAbbrs() {
+ return get(`/marketall/eth/ETHTokenAbbrs`)
+
+ }
+ //BTC移动平均线
+ static getEthSma(day, start, end,) {
+ if (start) {
+ return get(`/marketall/eth/sma/${day}?start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/eth/sma/${day}`)
+ }
+
+
+ }
+
+ //BTC移动平均线
+ static getSma(day, start, end,) {
+ if (start) {
+ return get(`/marketall/btc/sma/${day}?start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/btc/sma/${day}`)
+ }
+
+
+ }
+
+ //新合约地址
+ static getNewContract(req, radius, page, limit,total) {
+ if (total) {
+ return get(`/marketall/${radius}/${req}?page=${page}&limit=${limit}&total=${total}`)
+ }else{
+ return get(`/marketall/${radius}/${req}?page=${page}&limit=${limit}`)
+ }
+
+
+ }
+ //11月2号 更改dailyBuySell接口
+ static getDailyBuySell(req, radius, start, end, page, limit) {
+ if (start) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}&page=${page}&limit=${limit}`)
+ } else {
+ return get(`/marketall/${radius}/${req}?page=${page}&limit=${limit}`)
+ }
+
+
+ }
+
+ //大额交易搜索 分页 没有时间搜索 26修改接口
+ static getBigDeals3(req, radius, search, page, limit) {
+
+ if (search) {
+ return get(`/marketall/${radius}/${req}?total=${search}&page=${page}&limit=${limit}`)
+ } else if (!search) {
+ return get(`/marketall/${radius}/${req}?page=${page}&limit=${limit}`)
+ } else {
+
+ return get(`/marketall/${radius}/${req}?page=${page}&limit=${limit}`)
+ }
+
+
+ }
+
+ //新增csupply 流通供应量/ 累计币天销毁量(流通供应量)
+ static getMvrv(req, radius, start, end) {
+ if (radius !== "BTC" && start) {
+ return get(`/marketall/list/interface?req=market&radius=${radius}&start=${start}&end=${end}`)
+ } else if (radius == "BTC" && start && end) {
+ return get(`/marketall/btc/mvrv?start=${start}&end=${end}`)
+ } else if (radius == "BTC" && !start) {
+ return get(`/marketall/btc/mvrv`)
+ } else {
+ console.log("走着空间看到就", `${req, radius}`);
+
+ return get(`/marketall/list/interface?req=market&radius=${radius}`)
+ }
+ }
+
+ //新增csupply 流通供应量/ 累计币天销毁量(流通供应量)
+ static getCsupply(req, radius, start, end,sma) {
+
+ if (sma) {
+ if (start && end) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}&sma=${sma}`)
+ } else {
+ return get(`/marketall/${radius}/${req}?sma=${sma}`)
+ }
+ }else{
+ if (start && end) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/${radius}/${req}`)
+ }
+ }
+
+
+ }
+ //新增soag 币天销毁量年龄分布
+ static getSoag(req, radius, start, end,sma) {
+ if (sma) {
+ if (start && end) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}&sma=${sma}`)
+ } else {
+ return get(`/marketall/${radius}/${req}?sma=${sma}`)
+ }
+ }else{
+ if (start && end) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/${radius}/${req}`)
+ }
+ }
+
+ }
+ //新增dormancy 已花费输出休眠平均天数
+ static getDormancy(req, radius, start, end,sma) {
+ if (sma) {
+ if (start && end) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}&sma=${sma}`)
+ } else {
+ return get(`/marketall/${radius}/${req}?sma=${sma}`)
+ }
+ }else{
+ if (start && end) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/${radius}/${req}`)
+ }
+ }
+
+ }
+ //新增asol已花费输出平均寿命
+ static getAsol(req, radius, start, end,sma) {
+ if (sma) {
+ if (start && end) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}&sma=${sma}`)
+ } else {
+ return get(`/marketall/${radius}/${req}?sma=${sma}`)
+ }
+ }else{
+ if (start && end) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/${radius}/${req}`)
+ }
+ }
+
+
+ }
+ //新增sopr 已花费输出盈利比
+ static getSopr(req, radius, start, end,sma) {
+ if (sma) {
+ if (start && end) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}&sma=${sma}`)
+ } else {
+ return get(`/marketall/${radius}/${req}?sma=${sma}`)
+ }
+ }else{
+ if (start && end) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/${radius}/${req}`)
+ }
+ }
+
+ }
+
+ //新增Profitrate 已实现盈利交易占比
+ static getProfitrate(req, radius, start, end,sma) {
+ if (sma) {
+ if (start && end) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}&sma=${sma}`)
+ } else {
+ return get(`/marketall/${radius}/${req}?sma=${sma}`)
+ }
+ }else{
+ if (start && end) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/${radius}/${req}`)
+ }
+ }
+
+
+ }
+
+ //纳斯达克日K BTC 日K
+ static getNDAQBTCPrice(req, start, end,sma) {
+ if (sma) {
+ if (start) {
+ return get(`/marketall/market/${req}?start=${start}&end=${end}&sma=${sma}`)
+ } else {
+ return get(`/marketall/market/${req}?sma=${sma}`)
+ }
+ }else{
+ if (start) {
+ return get(`/marketall/market/${req}?start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/market/${req}`)
+ }
+ }
+
+ }
+
+ //合约主动买入量
+ static getTakerlongshortRatio(symbol, period, start, end, limit) {
+ // &limit=${limit}
+ if (start) {
+ return get(`/futures/data/takerlongshortRatio?symbol=${symbol}&period=${period}&startTime=${start}&endTime=${end}`)
+ } else {
+ return get(`/futures/data/takerlongshortRatio?symbol=${symbol}&period=${period}`)
+ }
+
+
+
+ }
+ //未平仓合约数
+ static getOpenInterest(symbol, start, end, limit) {
+
+ // &limit=${limit}
+ if (symbol && start) {
+ return get(`/fapi/v1/openInterest?symbol=${symbol}&startTime=${start}&endTime=${end}`)
+ } else if (!symbol && start) {
+ return get(`/fapi/v1/openInterest?startTime=${start}&endTime=${end}`)
+ } if (symbol && !start) {
+
+ return get(`/fapi/v1/openInterest?symbol=${symbol}`)
+ } else {
+ return get(`/fapi/v1/openInterest`)
+ }
+ }
+
+ //资金费率
+ static getFundingRate(symbol, start, end, limit) {
+
+ // &limit=${limit}
+ if (symbol && start) {
+ return get(`/fapi/v1/fundingRate?symbol=${symbol}&startTime=${start}&endTime=${end}`)
+ } else if (!symbol && start) {
+ return get(`/fapi/v1/fundingRate?startTime=${start}&endTime=${end}`)
+ } if (symbol && !start) {
+
+ return get(`/fapi/v1/fundingRate?symbol=${symbol}`)
+ } else {
+ return get(`/fapi/v1/fundingRate`)
+ }
+ }
+
+ //每日交易量、交易费
+ static getVolume(req, radius, start, end,sma) {
+ if (sma) {
+ if (start) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}&sma=${sma}`)
+ } else {
+ return get(`/marketall/${radius}/${req}?sma=${sma}`)
+ }
+ }else{
+ if (start) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/${radius}/${req}`)
+ }
+ }
+
+ }
+ static getFees(req, radius, start, end,) {
+ if (start) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/${radius}/${req}`)
+ }
+ }
+
+ //ma370
+ static getMa370(req, radius, start, end,sma) {
+ if (sma) {
+ if (start) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}&sma=${sma}`)
+ } else {
+ return get(`/marketall/${radius}/${req}?sma=${sma}`)
+ }
+ }else{
+ if (start) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/${radius}/${req}`)
+ }
+ }
+
+ }
+ //每日币价K线 新增capReal
+ static getCapReal(start, end,) {
+ if (start) {
+ return get(`/marketall/btc/capReal?coin=BTC&start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/btc/capReal?coin=BTC`)
+ }
+ }
+ //请求BTC price价格
+ static getBtcPrice(start, end,) {
+ if (start) {
+ return get(`/marketall/list/interface?req=price&radius=btc&start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/list/interface?req=price&radius=btc`)
+ }
+ }
+ //请求BTC/ETH price价格
+ static getBtcPrice2(radius, start, end,) {
+ if (start) {
+ return get(`/marketall/list/interface?req=price&radius=${radius}&start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/list/interface?req=price&radius=${radius}`)
+ }
+ }
+
+ //币安 条件查询
+ static getPriceValueLine(start, end,) {
+ return get(`/marketall/bian/list?symbol=BTCUSDT&start=${start}&end=${end}`)
+ if (req && start && end) {
+ return get(`/marketall/${radius}/${req}?symbol=${symbol}&timeInterval=${timeInterval}&start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/${radius}/${req}?symbol=${symbol}&timeInterval=${timeInterval}`)
+ }
+
+ // &start=${start}&end=${end}
+
+ }
+ //以太坊巨鲸地址余额列表
+ static getTopAddrList(type, page, limit) {
+ if (type) {
+ return get(`/marketall/eth/ethTopAddrList?total=${type}&page=${page}&limit=${limit}`)
+ } else {
+ return get(`/marketall/eth/ethTopAddrList?page=${page}&limit=${limit}`)
+ }
+
+
+ if (req && start && end && type) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}&type=${type}`)
+ } else if (req && start && end && !type) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/${radius}/${req}`)
+ }
+ }
+ //地址对应标记持有者名称关系列表
+ static getBtctags(req, radius, page, limit) {
+ if (req && page && !limit) {
+ return get(`/marketall/${radius}/${req}?page=${page}`)
+ } else if (req && page && limit) {
+ return get(`/marketall/${radius}/${req}?page=${page}&limit=${limit}`)
+ } else if (req && !page && limit) {
+ return get(`/marketall/${radius}/${req}?limit=${limit}`)
+ }
+ else {
+ return get(`/marketall/${radius}/${req}`)
+ }
+
+
+ }
+ //天针
+ static getDaysNeedle(interval, limit) {
+ return get(`https://13.214.133.132:7101/marketall/bian/tz?interval=${interval}&limit=${limit}`)
+
+ }
+
+ //8/29新增币价当前市值排名
+ static getCoinmarketall() {
+
+ return get(`/marketall/list/coinmarket/all`)
+ }
+
+ //8/29新增24小时币价
+ static getCoinmarket(coin, start, end) {
+ if (coin) {
+ return get(`/marketall/list/coinmarket?coin=${coin}&start=${start}&end=${end}`)
+ } else {
+ return
+ }
+
+ if (start) {
+ return get(`/marketall/list/coinmarket?coin=${coin}&start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/list/coinmarket?coin=${coin}`)
+ }
+
+ }
+
+ //8/15新增币安价格
+ static getPriceValue(interval, start, end) {
+ return get(`/marketall/bian/priceValue?interval=${interval}&start=${start}&end=${end}`)
+ // return get(`/marketall/bian/priceValue?symbol=BTCUSDT&start=${start}&end=${end}`)
+
+ }
+ //8月5号新增BalanceData
+ static getBalanceData(req, radius, value, start, end) {
+ if (req && !start && !end) {
+ return get(`/marketall/${radius}/${req}/${value}`)
+ } else {
+ return get(`/marketall/${radius}/${req}/${value}?start=${start}&end=${end}`)
+ }
+ }
+ //8月2号新增getTopList
+ static getTopList(req, radius, type,) {
+ if (req && type) {
+ return get(`/marketall/${radius}/${req}?${type}`)
+ } else {
+ return get(`/marketall/${radius}/${req}`)
+ }
+ }
+ //20号新增newAddress
+ static getNewAddress(req, radius, start, end,sma) {
+ if (sma) {
+ if (start && end) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}&sma=${sma}`)
+ } else {
+ return get(`/marketall/${radius}/${req}?sma=${sma}`)
+ }
+ }else{
+ if (start && end) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/${radius}/${req}`)
+ }
+ }
+
+ }
+ //币安 条件查询
+ static getBiAnController(req, radius, symbol, timeInterval, start, end, type,) {
+ if (req && start && end) {
+ return get(`/marketall/${radius}/${req}?symbol=${symbol}&timeInterval=${timeInterval}&start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/${radius}/${req}?symbol=${symbol}&timeInterval=${timeInterval}`)
+ }
+
+ // &start=${start}&end=${end}
+
+ }
+ //arh99请求格式不同
+ static getArh(req, radius, start, end) {
+ if (req && start && end) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/${radius}/${req}`)
+ }
+
+ }
+ //大额交易搜索 不分页
+ static getBigDeals2(req, radius, search, start, end, page, limit) {
+ if (search && start && end) {
+ return get(`/marketall/${radius}/${req}?total=${search}&start=${start}&end=${end}&page=${page}&limit=${limit}`)
+ } else if (req && search && !start) {
+ return get(`/marketall/${radius}/${req}?total=${search}&page=${page}&limit=${limit}`)
+ } else if (req && !search && !start) {
+ return get(`/marketall/${radius}/${req}?page=${page}&limit=${limit}`)
+ } else if (req && !search && start) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}&page=${page}&limit=${limit}`)
+ } else {
+ return get(`/marketall/${radius}/${req}?page=${page}&limit=${limit}`)
+ }
+
+ }
+ //大额交易搜索 带分页
+ static getETHTokenBigtx(req, radius, search, start, end, page, limit, abbr) {
+ if (abbr) {
+ if (search && start && end) {
+ return get(`/marketall/${radius}/${req}?total=${search}&start=${start}&end=${end}&page=${page}&limit=${limit}&abbr=${abbr}`)
+ } else if (req && search && !start) {
+ return get(`/marketall/${radius}/${req}?total=${search}&page=${page}&limit=${limit}&abbr=${abbr}`)
+ } else if (req && !search && !start) {//默认渲染一天的数据 带时间
+ return get(`/marketall/${radius}/${req}?page=${page}&limit=${limit}&abbr=${abbr}`)
+ } else if (req && !search && start) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}&page=${page}&limit=${limit}&abbr=${abbr}`)
+ } else if (req && !search && start) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}&page=${page}&limit=${limit}&abbr=${abbr}`)
+ } else {
+ return get(`/marketall/${radius}/${req}?page=${page}&limit=${limit}&abbr=${abbr}`)
+ }
+ } else {
+ if (search && start && end) {
+ return get(`/marketall/${radius}/${req}?total=${search}&start=${start}&end=${end}&page=${page}&limit=${limit}`)
+ } else if (req && search && !start) {
+ return get(`/marketall/${radius}/${req}?total=${search}&page=${page}&limit=${limit}`)
+ } else if (req && !search && !start) {//默认渲染一天的数据 带时间
+ return get(`/marketall/${radius}/${req}?page=${page}&limit=${limit}`)
+ } else if (req && !search && start) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}&page=${page}&limit=${limit}`)
+ } else if (req && !search && start) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}&page=${page}&limit=${limit}`)
+ } else {
+ return get(`/marketall/${radius}/${req}?page=${page}&limit=${limit}`)
+ }
+ }
+
+
+
+
+
+ }
+ //大额交易搜索 带分页
+ static getBigDeals(req, radius, search, start, end, page, limit) {
+
+ if (search && start && end) {
+ return get(`/marketall/${radius}/${req}?total=${search}&start=${start}&end=${end}&page=${page}&limit=${limit}`)
+ } else if (req && search && !start) {
+ return get(`/marketall/${radius}/${req}?total=${search}&page=${page}&limit=${limit}`)
+ } else if (req && !search && !start) {//默认渲染一天的数据 带时间
+ return get(`/marketall/${radius}/${req}?page=${page}&limit=${limit}`)
+ } else if (req && !search && start && page) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}&page=${page}&limit=${limit}`)
+ } else if (req && !search && start) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}&page=${page}&limit=${limit}`)
+ } else {
+ return get(`/marketall/${radius}/${req}?page=${page}&limit=${limit}`)
+ }
+
+
+
+ }
+ //大额tabel表格
+ static getBigDealsTabel(req, radius, address, txId) {
+ if (address) {
+ return get(`/marketall/${radius}/${req}?address=${address}`)
+ } else {
+ return get(`/marketall/${radius}/${req}?txId=${txId}`)
+ }
+
+
+ }
+ //大额交易数量查询
+ static getBigDealsCount(req, radius, start, end, type,sma) {
+ if (sma) {
+ if (req && start && end && type) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}&type=${type}&sma=${sma}`)
+ } else if (req && start && end && !type) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}&sma=${sma}`)
+ } else {
+
+ return get(`/marketall/${radius}/${req}?sma=${sma}`)
+ }
+ }else{
+ if (req && start && end && type) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}&type=${type}`)
+ } else if (req && start && end && !type) {
+ return get(`/marketall/${radius}/${req}?start=${start}&end=${end}`)
+ } else {
+
+ return get(`/marketall/${radius}/${req}`)
+ }
+ }
+
+ }
+ static getNdaqData(type, start, end) {//NAQA
+ if (start && end) {
+ return get(`${type}&start=${start}&end=${end}`)
+ } else {
+ return get(`${type}`)
+ }
+ }
+ //通用请求
+ static getActiveaddress(req, radius, start, end,sma) {//Activeaddress
+ if (sma) {
+ if (req && radius && start && end) {
+ return get(`/marketall/list/interface?req=${req}&radius=${radius}&start=${start}&end=${end}&sma=${sma}`)
+ } else if (req && radius && !start) {
+ return get(`/marketall/list/interface?req=${req}&radius=${radius}&sma=${sma}`)
+ } else if (req && !radius && start && end) {
+ return get(`/marketall/list/interface?req=${req}&start=${start}&end=${end}&sma=${sma}`)
+ } else {
+ return get(`/marketall/list/interface?req=${req}&sma=${sma}`)
+ }
+ }else{
+ if (req && radius && start && end) {
+ return get(`/marketall/list/interface?req=${req}&radius=${radius}&start=${start}&end=${end}`)
+ } else if (req && radius && !start) {
+ return get(`/marketall/list/interface?req=${req}&radius=${radius}`)
+ } else if (req && !radius && start && end) {
+ return get(`/marketall/list/interface?req=${req}&start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/list/interface?req=${req}`)
+ }
+ }
+
+
+
+
+ }
+ //请求价格
+ static getPriceOHLC(req, radius, start, end) {//Activeaddress
+ if (start && end) {
+ return get(`/marketall/list/interface?req=${req}&radius=${radius}&start=${start}&end=${end}`)
+ }
+ if (req && radius) {
+ return get(`/marketall/list/interface?req=${req}&radius=${radius}`)
+ } else if (req && !radius && start && end) {
+ return get(`/marketall/list/interface?req=${req}&start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/list/interface?req=${req}`)
+ }
+
+
+ }
+ //NDAQ
+ static getPriceNDAQ(req, start, end,sma) {//Activeaddress
+ if (sma) {
+ if (start, end) {
+ return get(`/marketall/market/${req}?start=${start}&end=${end}&sma=${sma}`)
+ } else {
+ return get(`/marketall/market/${req}?sma=${sma}`)
+ }
+ }else{
+ if (start, end) {
+ return get(`/marketall/market/${req}?start=${start}&end=${end}`)
+ } else {
+ return get(`/marketall/market/${req}`)
+ }
+ }
+
+
+
+ }
+
+}
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/api/apiPost.js b/yq/src/api/apiPost.js
new file mode 100644
index 0000000..333a6ae
--- /dev/null
+++ b/yq/src/api/apiPost.js
@@ -0,0 +1,312 @@
+import request from './http'
+
+//盈利地址数
+export function fetchProfitAddress(data) {
+ return request({
+ url: `/marketall/btc/v2/profitAddress`,
+ method: 'post',
+ data
+ })
+}
+
+
+//亏损地址数
+export function fetchLossAddress(data) {
+ return request({
+ url: `/marketall/btc/v2/lossAddress`,
+ method: 'post',
+ data
+ })
+}
+
+//地址盈亏比
+export function fetchProfitRatio(data) {
+ return request({
+ url: `/marketall/btc/v2/profitRatio`,
+ method: 'post',
+ data
+ })
+}
+
+//长期持有者供应量
+export function fetchLthSupply(data) {
+ return request({
+ url: `/marketall/btc/v2/lthSupply`,
+ method: 'post',
+ data
+ })
+}
+
+//短期持有者供应量
+export function fetchSthSupply(data) {
+ return request({
+ url: `/marketall/btc/v2/sthSupply`,
+ method: 'post',
+ data
+ })
+}
+
+// 已实现价格
+export function fetchRealizedPrice(data) {
+ return request({
+ url: `/marketall/btc/v2/realizedPrice`,
+ method: 'post',
+ data
+ })
+}
+
+// 长/短期持有者供应量盈亏比
+export function fetchRelativeLthSth(data) {
+ return request({
+ url: `/marketall/btc/v2/relativeLthSth`,
+ method: 'post',
+ data
+ })
+}
+
+// 长期持有者盈利总供应量
+export function fetchLthProfitSupply(data) {
+ return request({
+ url: `/marketall/btc/v2/lthProfitSupply`,
+ method: 'post',
+ data
+ })
+}
+
+
+// 长期持有者亏损总供应量
+export function fetchLthLossSupply(data) {
+ return request({
+ url: `/marketall/btc/v2/lthLossSupply`,
+ method: 'post',
+ data
+ })
+}
+
+// 短期持有者盈利总供应量
+export function fetchSthProfitSupply(data) {
+ return request({
+ url: `/marketall/btc/v2/sthProfitSupply`,
+ method: 'post',
+ data
+ })
+}
+
+// 短期持有者亏损总供应量
+export function fetchSthLossSupply(data) {
+ return request({
+ url: `/marketall/btc/v2/sthLossSupply`,
+ method: 'post',
+ data
+ })
+}
+
+// 短期持有者盈亏比
+export function fetchSthProfitRatio(data) {
+ return request({
+ url: `/marketall/btc/v2/sthProfitRatio`,
+ method: 'post',
+ data
+ })
+}
+
+
+// 短期到长期实现价值比率
+export function fetchSLRVRatio(data) {
+ return request({
+ url: `/marketall/btc/v2/SLRVRatio`,
+ method: 'post',
+ data
+ })
+}
+
+
+// 长期持有者盈亏比
+export function fetchLthProfitRatio(data) {
+ return request({
+ url: `/marketall/btc/v2/lthProfitRatio`,
+ method: 'post',
+ data
+ })
+}
+
+//长期持有者每日交易量
+export function fetchLthVolume(data) {
+ return request({
+ url: `/marketall/btc/v2/lthVolume`,
+ method: 'post',
+ data
+ })
+}
+
+//交易汇率乘数
+export function fetchFrm(data) {
+ return request({
+ url: `/marketall/btc/v2/frm`,
+ method: 'post',
+ data
+ })
+}
+
+//累积价值-销毁天数比
+export function fetchCvdd(data) {
+ return request({
+ url: `/marketall/btc/v2/cvdd`,
+ method: 'post',
+ data
+ })
+}
+
+//已平衡价格
+export function fetchBalancedPrice(data) {
+ return request({
+ url: `/marketall/btc/v2/balancedPrice`,
+ method: 'post',
+ data
+ })
+}
+
+//市值/交易价值比
+export function fetchNvtRatio(data) {
+ return request({
+ url: `/marketall/btc/v2/nvtRatio`,
+ method: 'post',
+ data
+ })
+}
+
+//流通速度
+export function fetchVelocity(data) {
+ return request({
+ url: `/marketall/btc/v2/velocity`,
+ method: 'post',
+ data
+ })
+}
+
+//已实现流通市值
+export function fetchRcap(data) {
+ return request({
+ url: `/marketall/btc/rcap`,
+ method: 'post',
+ data
+ })
+}
+//已实现流通市值(找零消除)
+export function fetchEarcap(data) {
+ return request({
+ url: `/marketall/btc/earcap`,
+ method: 'post',
+ data
+ })
+}
+
+//时区购买力
+export function getTzbp(data) {
+ return request({
+ url: `/marketall/exchange/v2/tzbp`,
+ method: 'post',
+ data
+ })
+}
+
+//买入大单挂单
+export function getBobp(data) {
+ return request({
+ url: `/marketall/exchange/v2/bobp`,
+ method: 'post',
+ data
+ })
+}
+
+//卖出大单挂单
+export function getBosp(data) {
+ return request({
+ url: `/marketall/exchange/v2/bosp`,
+ method: 'post',
+ data
+ })
+}
+//交易所余额
+export function getExchange(data) {
+ return request({
+ url: `/marketall/btc/v2/ebalance`,
+ method: 'post',
+ data
+ })
+}
+
+//交易所余额 下拉框
+export function getExchanges(data) {
+ return request({
+ url: `/marketall/btc/v2/exchanges`,
+ method: 'post',
+ data
+ })
+}
+
+//交易所余额ETH
+export function getExchangeETH(data) {
+ return request({
+ url: `/marketall/eth/v2/ebalance`,
+ method: 'post',
+ data
+ })
+}
+
+//交易所余额 下拉框ETH
+export function getExchangesETH(data) {
+ return request({
+ url: `/marketall/eth/v2/exchanges`,
+ method: 'post',
+ data
+ })
+}
+
+//待交易池详情
+export function getMempool(data) {
+ return request({
+ url: `/marketall/btc/v2/mempool`,
+ method: 'post',
+ data
+ })
+}
+
+
+//NVT信号
+export function getNvtSign(data) {
+ return request({
+ url: `/marketall/btc/v2/nvtSign`,
+ method: 'post',
+ data
+ })
+}
+
+//长/短期持有者供应量盈亏分布
+export function DistributionLthSth(data) {
+ return request({
+ url: `/marketall/btc/v2/distributionLthSth`,
+ method: 'post',
+ data
+ })
+}
+
+//大额交易ETH 价格接口
+export function ethPrice(data) {
+ return request({
+ url: `/marketall/eth/v2/price`,
+ method: 'post',
+ data
+ })
+}
+
+//价值损毁天数倍数
+export function getVDD(data) {
+ return request({
+ url: `/marketall/btc/vdd`,
+ method: 'post',
+ data
+ })
+}
+
+
diff --git a/yq/src/api/help.js b/yq/src/api/help.js
new file mode 100644
index 0000000..88b92aa
--- /dev/null
+++ b/yq/src/api/help.js
@@ -0,0 +1,147 @@
+import request from './http'
+
+//获取问题分类
+export function getQuestionType(data) {
+ return request({
+ url: `marketall/ticket/getQuestionType`,
+ method: 'post',
+ data
+ })
+ }
+
+ //提交工单
+export function getSubmitTicket(data) {
+ return request({
+ url: `marketall/ticket/submitTicket`,
+ method: 'post',
+ data
+ })
+ }
+
+ //工单继续提交
+export function getResubmitTicket(data) {
+ return request({
+ url: `marketall/ticket/resubmitTicket`,
+ method: 'post',
+ data
+ })
+ }
+
+//撤回工单
+export function getRetractTicket(data) {
+ return request({
+ url: `marketall/ticket/retractTicket`,
+ method: 'post',
+ data
+ })
+ }
+
+ //个人工单列表
+export function getPrivateTicket(data) {
+ return request({
+ url: `marketall/ticket/getPrivateTicket`,
+ method: 'post',
+ data
+ })
+ }
+
+
+//工单详情
+export function getTicketDetails(data) {
+ return request({
+ url: `marketall/ticket/getTicketDetails`,
+ method: 'post',
+ data
+ })
+ }
+
+//提交工单审核
+export function getSubmitAuditTicket(data) {
+ return request({
+ url: `marketall/ticket/submitAuditTicket`,
+ method: 'post',
+ data
+ })
+ }
+
+ //个人未读工单数
+export function getUnreadCount(data) {
+ return request({
+ url: `marketall/ticket/getUnreadCount`,
+ method: 'post',
+ data
+ })
+ }
+//后台工单列表
+export function getTicketList(data) {
+ return request({
+ url: `marketall/ticket/getTicketList`,
+ method: 'post',
+ data
+ })
+ }
+
+
+ //每日工单数
+export function getDailyCount(data) {
+ return request({
+ url: `marketall/ticket/getDailyCount`,
+ method: 'post',
+ data
+ })
+ }
+
+ //审核工单
+export function getAuditTicket(data) {
+ return request({
+ url: `marketall/ticket/auditTicket`,
+ method: 'post',
+ data
+ })
+ }
+
+//文件下载
+export function getDownloadFile(data) {
+ return request({
+ url: `marketall/ticket/downloadFile`,
+ method: 'post',
+ data
+ })
+ }
+ //回复工单
+export function getResponTicket(data) {
+ return request({
+ url: `marketall/ticket/responTicket`,
+ method: 'post',
+ data
+ })
+ }
+
+ //个人中心 个人中心 已回复未读工单更改状态
+export function getReadTicket(data) {
+ return request({
+ url: `marketall/ticket/readTicket`,
+ method: 'post',
+ data
+ })
+ }
+
+//结束工单
+export function getEndTicket(data) {
+ return request({
+ url: `marketall/ticket/endTicket`,
+ method: 'post',
+ data
+ })
+}
+
+
+ //查询用户当前账户余额
+ export function GetUserAccount(data) {
+ return request({
+ url: `/order/transfer/getUserAccount`,
+ method: 'post',
+ data
+ })
+ }
+
diff --git a/yq/src/api/http.js b/yq/src/api/http.js
new file mode 100644
index 0000000..1310083
--- /dev/null
+++ b/yq/src/api/http.js
@@ -0,0 +1,418 @@
+import axios from 'axios'
+import { Message } from 'element-ui'
+import { Loading } from 'element-ui';
+import CancelTokens from './CancelTokens'
+const baseURL = '/api' //代理接口的名称
+import { $addStorageEvent } from '../util/processingData'
+
+//不需要带token 匿名访问的接口
+const noTokenUrl = [
+ `/marketall/btc/address`,
+ `/marketall/list/interface?req=price&`,
+ `/marketall/BTC/csupply`,
+ `/marketall/btc/mintusd`,
+ `/marketall/btc/marketcap`,
+ `/marketall/BTC/mvrv`,
+ `/marketall/BTC/btcbigtxcount`,
+ `/marketall/BTC/bigamountvout`,
+ `/marketall/BTC/arh99`,
+ `/marketall/BTC/arh99day`,
+ `/marketall/BTC/jzr60`,
+ `/marketall/BTC/jzr60day`,
+ `/marketall/BTC/ma730`,
+ `marketall/BTC/ma730day`,
+ `/marketall/ETH/csupply`,
+ `/marketall/ETH/reward`,
+ `/marketall/eth/ETHVolume`,
+ `/marketall/eth/ETHFees`,
+ `/marketall/eth/address`,
+ `/marketall/ETH/ethbigtxcount`,
+ `/marketall/ETH/ethbigtx`,
+ `/eth/ethTopAddrList`,
+ `/marketall/ETH/tronUsdtVolume`,
+ `/marketall/eth/usdtVolume`,
+ `/marketall/eth/usdcVolume`,
+ `/marketall/ETH/tronUsdcVolume`,
+ `/marketall/market/NDAQohlc`,
+ `/marketall/market/NDAQma`,
+
+]
+
+let overtime = "" //同页面多次请求超时只报错一次
+window.addEventListener("setItem", () => {
+ overtime = localStorage.getItem("overtime");
+});
+Message.customClass = "messageClass"
+let message = '' //登录过期控制只提示一次报错
+
+//开发环境 development
+if (process.env.NODE_ENV == 'development') {
+ // axios.defaults.baseURL = 'http://10.168.2.197:7001'
+ // axios.defaults.baseURL = 'https://13.214.133.132:11447'
+ // axios.defaults.baseURL = 'http://10.168.2.125:7101'
+ axios.defaults.baseURL = 'https://coinbus.cc/api/v1'
+
+}
+//生产环境 production
+if (process.env.NODE_ENV == 'production') {
+ axios.defaults.baseURL = 'https://coinbus.cc/api/v1'
+ // xios.defaults.baseURL = 'https://13.214.133.132:11447'
+}
+//测试环境
+if (process.env.NODE_ENV === "staging") {
+ axios.defaults.baseURL = "https://coinbus.cc/api/v1"
+}
+//创建一个axios对象
+const service = axios.create({
+ baseURL: process.env.VUE_APP_BASE_API,
+ timeout: 1000,// 10000
+});
+// 添加请求拦截器(post)
+service.interceptors.request.use( config =>{
+ if (config.url.includes('/fapi/v1/fundingRate') || config.url.includes('/fapi/v1/openInterest') || config.url.includes('/futures/data/takerlongshortRatio')) {
+ config.baseURL = baseURL
+ // config.baseURL = `https://fapi.binance.com`
+ // config.baseURL = 'https://binancezh.jp'
+ }
+ else if(config.url.includes('transfer/endOrder')){
+ config.timeout = 60000//充值确认接口单独设置响应时间1分钟
+
+
+ }else if(config.url.includes('levelUp')){
+ config.timeout = 30000//消费升级接口改为30秒
+ }else{
+ config.timeout = 10000
+ }
+
+ // token
+ if (!noTokenUrl.includes(config.url)) {
+ const token = localStorage.token;
+ if (token) {
+
+ config.headers.Authorization = `Bearer ${token}`
+ }
+ }
+
+ return config
+},error=> {
+ // if (error.code == "ECONNABORTED") {
+ // console.log(overtime,"几个都降低");
+ // if (!overtime) {
+ // overtime ="请求超时"
+ // Message({//请求超时
+ // showClose: true,
+ // message: window.vm.$i18n.t('login.timeout'),
+ // type: 'error',
+ // customClass: "messageClass",
+ // duration: 10000,
+ // });
+ // }
+
+ // }
+
+ // if (error.response.status >= 500) {//服务器错误
+ // console.log("甲方劲夫劲夫附件");
+ // Message({
+ // showClose: true,
+ // message: window.vm.$i18n.t('login.server'),
+ // type: 'error',
+ // customClass: "messageClass"
+ // });
+ // }
+
+ // 对请求错误做些什么
+ return Promise.reject(error)
+})
+
+
+// 添加请求拦截器
+// token注入
+axios.interceptors.request.use(function (config) {
+ if (config.url.includes('/fapi/v1/fundingRate') || config.url.includes('/fapi/v1/openInterest') || config.url.includes('/futures/data/takerlongshortRatio')) {
+ config.baseURL = baseURL
+ // config.baseURL = `https://fapi.binance.com`
+ // config.baseURL = 'https://binancezh.jp'
+ }
+ // config.headers={
+ // appid:"565656"
+ // }w'i'zhi
+ // token
+ if (!noTokenUrl.includes(config.url)) {
+ const token = localStorage.token;
+ if (token) {
+
+ config.headers.Authorization = `Bearer ${token}`
+ }
+ }
+
+
+
+ return config
+}, (error) => {
+ // 对请求错误做些什么
+ return Promise.reject(error)
+})
+
+
+//响应超时的时间
+axios.defaults.timeout = 10000;
+service.defaults.timeout = 10000;
+
+// 设置请求次数,请求的间隙
+axios.defaults.retry = 1;
+axios.defaults.retryDelay = 1000;
+var axiosResError = ""
+// 添加响应拦截器
+axios.interceptors.response.use(
+
+ res => {
+
+ // console.log(res,"响应数据111");
+ if (res.config.baseURL !== "https://fapi.binance.com") {
+
+ if (res.data.code == 421) {//登录过期删除token 421
+ //清空就是拦截到过期就删除了token 把两外两个存成空
+ console.log("登录过期");
+ localStorage.removeItem("token");
+ $addStorageEvent(1, "username", '')
+ $addStorageEvent(1, "loginTime", '')
+ localStorage.setItem("identity", JSON.stringify({}))
+ $addStorageEvent(1, "dialogLoginVisible",JSON.stringify(true) );//弹出登录
+
+ if(!message){
+ message = res.data.msg
+ Message({
+ message: res.data.msg,
+ type: 'warning',
+ customClass: "messageClass",
+ duration: 3000,
+ showClose: true,
+ });
+ }
+
+ }else if(res.data.code == 401){//登录才能查看的页面
+ if (!overtime) {
+ overtime ="登录才能查看的页面"
+ Message({
+ message: window.vm.$i18n.t('login.viewPage'),
+ type: 'error',
+ customClass: "messageClass",
+ showClose: true,
+
+ });
+ }
+
+ }else if(res.data.code !== 200){
+ console.log(`!== 200`,res);
+ Message({
+ message: res.data.msg,
+ type: 'error',
+ customClass: "messageClass"
+
+ });
+ }
+
+ }
+
+ return res;
+ }, error => {
+
+ if (error.code == "ECONNABORTED") {
+ if (!overtime) {
+ overtime ="请求超时"
+ Message({//请求超时
+ showClose: true,
+ message: window.vm.$i18n.t('login.timeout'),
+ type: 'error',
+ customClass: "messageClass",
+ showClose: true,
+ duration: 4000,
+ });
+
+ }
+ }
+
+ console.log('err' + error)
+ let { message } = error;
+ if (message == "Network Error") {//后端接口连接异常,请刷新重试
+ message = window.vm.$i18n.t('login.linkError')
+ }
+ else if (message.includes("timeout")) {//超时
+ message = window.vm.$i18n.t('login.timeout')
+ }
+ else if (message.includes("Request failed with status code")) {//系统接口异常5...
+ message = window.vm.$i18n.t('login.system') + message.substr(message.length - 3);
+ }
+ if (!overtime) {
+ overtime=message
+ Message({
+ message: message,
+ type: 'error',
+ showClose: true,
+ duration: 5 * 1000
+ })
+ }
+ // Message({
+ // message: message,
+ // type: 'error',
+ // duration: 5 * 1000
+ // })
+ return Promise.reject(error)
+
+ }
+
+);
+var serviceResError=""
+// 添加响应拦截器 post
+service.interceptors.response.use(
+
+ res=>{
+
+ if (res.data.code == 421) {//登录过期删除token 421
+ //清空就是拦截到过期就删除了token 把两外两个存成空
+ localStorage.removeItem("token");
+
+ $addStorageEvent(1, "username", '')
+ $addStorageEvent(1, "loginTime", '')
+ localStorage.setItem("identity", JSON.stringify({}))
+ $addStorageEvent(1, "dialogLoginVisible",JSON.stringify(true) );
+
+
+
+
+ console.log(message,"service 1 ");
+ if(!message){//登录过期 控制报错信息只提示一次
+
+ message = res.data.msg
+ Message({
+ message: res.data.msg,
+ type: 'error',
+ customClass: "messageClass",
+ duration: 3000,
+ showClose: true,
+ });
+ }
+
+ }else if(res.data.code == 401){//登录才能查看的页面
+ if (!overtime) {
+ overtime=`登录才能查看的页面`
+ Message({
+ message: window.vm.$i18n.t('login.viewPage'),
+ type: 'error',
+ customClass: "messageClass",
+ showClose: true,
+
+ });
+ }
+
+ }else if(res.data.code !== 200){
+ console.log(`!== 200`,res);
+ Message({
+ message: res.data.msg,
+ type: 'error',
+ customClass: "messageClass",
+ showClose: true,
+
+ });
+ }
+
+
+
+
+
+ return res;
+ },
+ error=>{
+
+
+ if (error.code == "ECONNABORTED") {
+ if (!overtime) {
+ overtime ="请求超时"
+ Message({//请求超时
+ showClose: true,
+ message: window.vm.$i18n.t('login.timeout'),
+ type: 'error',
+ customClass: "messageClass",
+ showClose: true,
+ duration: 4000,
+ });
+
+ }
+ }
+
+
+
+ console.log('err5555555555555' + error)
+ let { message } = error;
+ if (message == "Network Error") {
+ message = window.vm.$i18n.t('login.linkError')
+ }
+ else if (message.includes("timeout")) {
+ message = window.vm.$i18n.t('login.timeout')
+ }
+ else if (message.includes("Request failed with status code")) {
+ message = window.vm.$i18n.t('login.system') + message.substr(message.length - 3);
+ }
+ if (!overtime) {
+ overtime=message
+ Message({
+ message: message,
+ type: 'error',
+ showClose: true,
+ duration: 5 * 1000
+ })
+ }
+ // Message({
+ // message: message,
+ // type: 'error',
+ // duration: 5 * 1000
+ // })
+ return Promise.reject(error)
+
+
+ }
+)
+
+// 封装 get 方法
+export function get(url, params) {
+ return new Promise((resolve, reject) => {
+ axios.get(url, {
+ params: params
+ }).then(res => {
+ resolve(res)
+ }).catch(err => {
+ reject(err)
+ return
+ })
+ })
+}
+
+// 封装 post方法
+export function POST(url, data) {
+ return new Promise((resolve, reject) => {
+ axios.post(url, data)
+ .then(res => {
+ resolve(res)
+ })
+ .catch(err => {
+ reject(err)
+ })
+ })
+}
+
+// 封装 delete方法
+export function Delete(url) {
+ return new Promise((resolve, reject) => {
+ axios.delete(url)
+ .then(res => {
+ resolve(res)
+ })
+ .catch(err => {
+ reject(err)
+ })
+ })
+}
+
+
+export default service;
+
diff --git a/yq/src/api/messageBoard.js b/yq/src/api/messageBoard.js
new file mode 100644
index 0000000..98fb33a
--- /dev/null
+++ b/yq/src/api/messageBoard.js
@@ -0,0 +1,73 @@
+import request from './http'
+
+//进入页面默认请求留言数据
+export function fetchMessageBoard(data) {
+ return request({
+ url: `/marketall/msgBorad/getPageMsg`,
+ method: 'post',
+ data
+ })
+ }
+
+//提交留言
+export function submitMessage(data) {
+ return request({
+ url: `/marketall/msgBorad/submitMsg`,
+ method: 'post',
+ data
+ })
+}
+
+//留言板后台 留言数量
+export function msgBoradNum(data) {
+ return request({
+ url: `/marketall/msgBorad/getDailyMsgCount`,
+ method: 'post',
+ data
+ })
+}
+
+//留言板后台 tabel表格数据
+export function msgBoradTabel(data) {
+ return request({
+ url: `/marketall/msgBorad/getAllMsg`,
+ method: 'post',
+ data
+ })
+}
+//回复留言
+export function responMsg(data) {
+ return request({
+ url: `/marketall/msgBorad/responMsg`,
+ method: 'post',
+ data
+ })
+}
+
+//个人中心 未读留言
+export function getPrivateMsg(data) {
+ return request({
+ url: `/marketall/msgBorad/getPrivateMsg`,
+ method: 'post',
+ data
+ })
+}
+
+//查询点赞 踩的数量
+export function getPraise(data) {
+ return request({
+ url: `/marketall/msgBorad/getPageDetail`,
+ method: 'post',
+ data
+ })
+}
+
+//点赞 踩
+export function getClickPraisePoor(data) {
+ return request({
+ url: `/marketall/msgBorad/comment`,
+ method: 'post',
+ data
+ })
+}
+
diff --git a/yq/src/api/messageSubscription.js b/yq/src/api/messageSubscription.js
new file mode 100644
index 0000000..fb4e41b
--- /dev/null
+++ b/yq/src/api/messageSubscription.js
@@ -0,0 +1,25 @@
+import request from './http'
+//请求订阅
+export function getSubscript(data) {
+ return request({
+ url: '/marketall/msgSub/subscript',
+ method: 'post',
+ data
+ })
+}
+//订阅列表
+export function getSubscriptList(data) {
+ return request({
+ url: '/marketall/msgSub/list',
+ method: 'post',
+ data
+ })
+}
+//退订
+export function getSubscriptDelete(data) {
+ return request({
+ url: '/marketall/msgSub/cancel',
+ method: 'post',
+ data
+ })
+}
\ No newline at end of file
diff --git a/yq/src/api/pages.js b/yq/src/api/pages.js
new file mode 100644
index 0000000..46791b6
--- /dev/null
+++ b/yq/src/api/pages.js
@@ -0,0 +1,544 @@
+import request from './http'
+
+//PI周期顶指标
+export function takePiCycleTopIndicator(data) {
+ return request({
+ url: `/marketall/btc/v2/PiCycleTopIndicator`,
+ method: 'post',
+ data
+ })
+}
+
+//稳定币供应比
+export function takeSsr(data) {
+ return request({
+ url: `/marketall/btc/v2/ssr`,
+ method: 'post',
+ data
+ })
+}
+
+//稳定币供应比振荡器
+export function takeSsro(data) {
+ return request({
+ url: `/marketall/btc/v2/ssro`,
+ method: 'post',
+ data
+ })
+}
+
+
+//库存/新发行比
+export function takeStfRatio(data) {
+ return request({
+ url: `/marketall/btc/v2/stfRatio`,
+ method: 'post',
+ data
+ })
+}
+
+//库存/新发行偏差
+export function takeStfDeflection(data) {
+ return request({
+ url: `/marketall/btc/v2/stfDeflection`,
+ method: 'post',
+ data
+ })
+}
+
+//黄金比例乘数
+export function takeGoldenRatioMult(data) {
+ return request({
+ url: `/marketall/btc/v2/goldenRatioMult`,
+ method: 'post',
+ data
+ })
+}
+
+//PI周期顶指标 eth
+export function takepiCycleTopEth(data) {
+ return request({
+ url: `/marketall/eth/v2/PiCycleTopIndicator`,
+ method: 'post',
+ data
+ })
+}
+
+
+//黄金比例乘数 eth takegoldenRatioMultEth
+export function takegoldenRatioMultEth(data) {
+ return request({
+ url: `/marketall/eth/v2/goldenRatioMult`,
+ method: 'post',
+ data
+ })
+}
+//币天销毁量 eth cdd
+export function getCddEth(data) {
+ return request({
+ url: `/marketall/eth/v2/cdd`,
+ method: 'post',
+ data
+ })
+}
+
+//已花费输出休眠平均天数 eth dormancy
+export function getDormancyEth(data) {
+ return request({
+ url: `/marketall/eth/v2/dormancy`,
+ method: 'post',
+ data
+ })
+}
+//已花费输出平均寿命eth asol
+export function getAsolEth(data) {
+ return request({
+ url: `/marketall/eth/v2/asol`,
+ method: 'post',
+ data
+ })
+}
+
+//币天销毁量分布eth
+export function getCddwaveEth(data) {
+ return request({
+ url: `/marketall/eth/v2/cddwave`,
+ method: 'post',
+ data
+ })
+}
+
+//按余额分段的地址数分布eth
+export function getDistributionEth(data) {
+ return request({
+ url: `/marketall/eth/v2/address/distribution`,
+ method: 'post',
+ data
+ })
+}
+
+//持有者地址的供应分布eth
+export function getSupplyDistributionEth(data) {
+ return request({
+ url: `/marketall/eth/v2/address/supplyDistribution`,
+ method: 'post',
+ data
+ })
+}
+
+//盈利地址百分比eth
+export function getProfitPercentEth(data) {
+ return request({
+ url: `/marketall/eth/v2/address/profitPercent`,
+ method: 'post',
+ data
+ })
+}
+
+//盈利地址百分比eth
+export function getProfitEth(data) {
+ return request({
+ url: `/marketall/eth/v2/address/profit`,
+ method: 'post',
+ data
+ })
+}
+
+//亏损地址数eth
+export function getLossEth(data) {
+ return request({
+ url: `/marketall/eth/v2/address/loss`,
+ method: 'post',
+ data
+ })
+}
+
+//通货膨胀率eth
+export function getInflactionRateEth(data) {
+ return request({
+ url: `/marketall/eth/v2/inflactionRate`,
+ method: 'post',
+ data
+ })
+}
+
+//通货膨胀率eth
+export function getIssuanceEth(data) {
+ return request({
+ url: `/marketall/eth/v2/issuance`,
+ method: 'post',
+ data
+ })
+}
+
+//已花费输出盈利比eth
+export function getSoprEth(data) {
+ return request({
+ url: `/marketall/eth/v2/sopr`,
+ method: 'post',
+ data
+ })
+}
+
+//流通速度eth
+export function getVelocityEth(data) {
+ return request({
+ url: `/marketall/eth/v2/velocity`,
+ method: 'post',
+ data
+ })
+}
+
+//流通速度eth
+export function getNvtRatioEth(data) {
+ return request({
+ url: `/marketall/eth/v2/nvtRatio`,
+ method: 'post',
+ data
+ })
+}
+
+//活跃度eth
+export function getLivelinessEth(data) {
+ return request({
+ url: `/marketall/eth/v2/liveliness`,
+ method: 'post',
+ data
+ })
+}
+
+//交易费率乘数eth
+export function getFrmEth(data) {
+ return request({
+ url: `/marketall/eth/v2/frm`,
+ method: 'post',
+ data
+ })
+}
+
+//盈利百分比eth
+export function getSupplyProfitPercentEth(data) {
+ return request({
+ url: `/marketall/eth/v2/supply/profitPercent`,
+ method: 'post',
+ data
+ })
+}
+
+//盈利供应量eth
+export function getSupplyProfitEth(data) {
+ return request({
+ url: `/marketall/eth/v2/supply/profit`,
+ method: 'post',
+ data
+ })
+}
+
+//盈利亏损量eth
+export function getSupplyLossEth(data) {
+ return request({
+ url: `/marketall/eth/v2/supply/loss`,
+ method: 'post',
+ data
+ })
+}
+
+//未实现的净收益损失比eth
+export function getNuplEth(data) {
+ return request({
+ url: `/marketall/eth/v2/nupl`,
+ method: 'post',
+ data
+ })
+}
+
+//未实现的净收益量 eth
+export function getRelativeUProfitEth(data) {
+ return request({
+ url: `/marketall/eth/v2/relativeUProfit`,
+ method: 'post',
+ data
+ })
+}
+
+//未实现的净亏损量 eth
+export function getRelativeULossEth(data) {
+ return request({
+ url: `/marketall/eth/v2/relativeULoss`,
+ method: 'post',
+ data
+ })
+}
+
+//长持者未实现的净收益量 eth
+export function getLthNUPLEth(data) {
+ return request({
+ url: `/marketall/eth/v2/lthNUPL`,
+ method: 'post',
+ data
+ })
+}
+
+//短持者未实现的净亏损量 eth
+export function getSthNUPLEth(data) {
+ return request({
+ url: `/marketall/eth/v2/sthNUPL`,
+ method: 'post',
+ data
+ })
+}
+
+//流通市值 eth
+export function getMarketcapEth(data) {
+ return request({
+ url: `/marketall/eth/v2/marketcap`,
+ method: 'post',
+ data
+ })
+}
+
+//已实现流通市值 eth
+export function getRcapEth(data) {
+ return request({
+ url: `/marketall/eth/v2/rcap`,
+ method: 'post',
+ data
+ })
+}
+
+//已实现价格 eth
+export function getRpriceEth(data) {
+ return request({
+ url: `/marketall/eth/v2/rprice`,
+ method: 'post',
+ data
+ })
+}
+
+//流通市值-已实现流通市值比 eth
+export function getMvrvRatioEth(data) {
+ return request({
+ url: `/marketall/eth/v2/mvrvRatio`,
+ method: 'post',
+ data
+ })
+}
+
+//燃烧量 eth
+export function getBurnedSupplyEth(data) {
+ return request({
+ url: `/marketall/eth/v2/burnedSupply`,
+ method: 'post',
+ data
+ })
+}
+
+//燃烧量 eth
+export function getMintedSupplyEth(data) {
+ return request({
+ url: `/marketall/eth/v2/mintedSupply`,
+ method: 'post',
+ data
+ })
+}
+
+//USDT铸造量
+export function getMintedUSDT(data) {
+ return request({
+ url: `/marketall/eth/v2/usdt/minted`,
+ method: 'post',
+ data
+ })
+}
+//USDT铸造量 表格数据
+export function getMintedUSDTTable(data) {
+ return request({
+ url: `/marketall/eth/v2/usdt/minted/list`,
+ method: 'post',
+ data
+ })
+}
+//USDC铸造量
+export function getMintedUSDC(data) {
+ return request({
+ url: `/marketall/eth/v2/usdc/minted`,
+ method: 'post',
+ data
+ })
+}
+//USDC铸造量 表格数据
+export function getMintedUSDCTable(data) {
+ return request({
+ url: `/marketall/eth/v2/usdc/minted/list`,
+ method: 'post',
+ data
+ })
+}
+
+//BUSD铸造量
+export function getMintedBUSD(data) {
+ return request({
+ url: `/marketall/eth/v2/busd/minted`,
+ method: 'post',
+ data
+ })
+}
+//BUSD铸造量 表格数据
+export function getMintedBUSDTable(data) {
+ return request({
+ url: `/marketall/eth/v2/busd/minted/list`,
+ method: 'post',
+ data
+ })
+}
+
+//资金费率
+export function getFundingRate(data) {
+ return request({
+ url: `/marketall/exchange/fundingRate`,
+ method: 'post',
+ data
+ })
+}
+
+//未平仓合约数
+export function getOpenInterest(data) {
+ return request({
+ url: `/marketall/exchange/openInterest`,
+ method: 'post',
+ data
+ })
+}
+
+
+//合约主动买入量
+export function getTakerLongShortRatio(data) {
+ return request({
+ url: `/marketall/exchange/takerlongshortRatio`,
+ method: 'post',
+ data
+ })
+}
+
+//成交量分布图
+export function getVolumeProfile(data) {
+ return request({
+ url: `/marketall/exchange/volumeProfile`,
+ method: 'post',
+ data
+ })
+}
+
+
+//成交量分布图 K线数据
+export function getKLine(data) {
+ return request({
+ url: `/marketall/bian/kline`,
+ method: 'post',
+ data
+ })
+}
+
+//代币交易量
+export function getErcVolume(data) {
+ return request({
+ url: `/marketall/eth/ETHTokenVolume`,
+ method: 'post',
+ data
+ })
+}
+
+//国债收益率
+export function getUSTreasuriesYields(data) {
+ return request({
+ url: `/marketall/market/USTreasuriesYields`,
+ method: 'post',
+ data
+ })
+}
+//货币供应量
+export function MoneyStockMeasures(data) {
+ return request({
+ url: `/marketall/market/MoneyStockMeasures`,
+ method: 'post',
+ data
+ })
+}
+
+//私营部门贷款
+export function loanPsi(data) {
+ return request({
+ url: `/marketall/market/loan/psi`,
+ method: 'post',
+ data
+ })
+}
+
+//私人债务占GDP比重
+export function loanGdp(data) {
+ return request({
+ url: `/marketall/market/loan/gdp`,
+ method: 'post',
+ data
+ })
+}
+
+//每周经济指数
+export function wei(data) {
+ return request({
+ url: `/marketall/market/wei`,
+ method: 'post',
+ data
+ })
+}
+
+//MVRV Z-Score BTC 修改接口为POST
+export function MVRVZ(data) {
+ return request({
+ url: `/marketall/btc/mvrvz`,
+ method: 'post',
+ data
+ })
+}
+
+
+//外汇
+export function exchangeRate(data) {
+ return request({
+ url: `/marketall/market/exchangeRate`,
+ method: 'post',
+ data
+ })
+}
+
+//外汇曲线图
+export function exchangeRateChart(data) {
+ return request({
+ url: `/marketall/market/exchangeRate/list`,
+ method: 'post',
+ data
+ })
+}
+
+//GDP 曲线图
+export function getGDPChart(data) {
+ return request({
+ url: `/marketall/market/GDP/list`,
+ method: 'post',
+ data
+ })
+}
+
+//GDP
+export function getGDP(data) {
+ return request({
+ url: `/marketall/market/GDP`,
+ method: 'post',
+ data
+ })
+}
+
+
+
+
+
diff --git a/yq/src/api/pay.js b/yq/src/api/pay.js
new file mode 100644
index 0000000..da90762
--- /dev/null
+++ b/yq/src/api/pay.js
@@ -0,0 +1,161 @@
+import request from './http'
+
+//提交充值
+export function Recharge(data) {
+ return request({
+ url: `/order/transfer/createOrder`,
+ method: 'post',
+ data
+ })
+}
+
+//订单支付确认
+export function EndOrder(data) {
+ return request({
+ url: `/order/transfer/endOrder`,
+ method: 'post',
+ data
+ })
+}
+
+//请求订单取消 关闭转账交易
+export function CancelOrder(data) {
+ return request({
+ url: `/order/transfer/cancelOrder`,
+ method: 'post',
+ data
+ })
+}
+
+//根据txid查询订单
+export function CheckOrderByTxid(data) {
+ return request({
+ url: `/order/transfer/checkOrderByTxid`,
+ method: 'post',
+ data
+ })
+}
+
+//提交升级订单
+export function LevelUp(data) {
+ return request({
+ url: `/order/consume/levelUp`,
+ method: 'post',
+ data
+ })
+}
+
+
+//获取对应等级所需金额
+export function GetNeedFunding(data) {
+ return request({
+ url: `/order/consume/getNeedFunding`,
+ method: 'post',
+ data
+ })
+}
+
+
+//发起提现申请
+export function Apply(data) {
+ return request({
+ url: `/order/withdraw/apply`,
+ method: 'post',
+ data
+ })
+}
+
+//查看个人提现历史
+export function Pravite(data) {
+ return request({
+ url: `/order/withdraw//history/pravite`,
+ method: 'post',
+ data
+ })
+}
+
+
+//查看个人提现历史
+export function historyAll(data) {
+ return request({
+ url: `/order/withdraw/history/all`,
+ method: 'post',
+ data
+ })
+}
+
+
+//财务处理提现订单
+export function Handle(data) {
+ return request({
+ url: `/order/withdraw/handle`,
+ method: 'post',
+ data
+ })
+}
+
+//查看提现订单详情
+export function getDetail(data) {
+ return request({
+ url: `/order/withdraw/getDetail`,
+ method: 'post',
+ data
+ })
+}
+
+//查看个人充值记录
+export function privateOrder(data) {
+ return request({
+ url: `order/transfer/privateOrder`,
+ method: 'post',
+ data
+ })
+}
+
+//查看所有充值记录
+export function allAddCreditOrder(data) {
+ return request({
+ url: `order/transfer/allAddCreditOrder`,
+ method: 'post',
+ data
+ })
+}
+
+//获取邮箱验证码
+export function getEmailCode(data) {
+ return request({
+ url: `order/withdraw/getEmailCode`,
+ method: 'post',
+ data
+ })
+}
+
+//查看个人消费历史 消费记录
+export function PrivateConsume(data) {
+ return request({
+ url: `order/consume/privateConsume`,
+ method: 'post',
+ data
+ })
+}
+
+//新增用户可用地址
+export function AddNewAddress(data) {
+ return request({
+ url: `order/transfer/addNewAddress`,
+ method: 'post',
+ data
+ })
+}
+
+
+//查询上次提交交易hash时间 倒计时
+export function LastUseTxid(data) {
+ return request({
+ url: `order/transfer/lastUseTxid`,
+ method: 'post',
+ data
+ })
+}
+
+
diff --git a/yq/src/api/realTimeData.js b/yq/src/api/realTimeData.js
new file mode 100644
index 0000000..b37df41
--- /dev/null
+++ b/yq/src/api/realTimeData.js
@@ -0,0 +1,93 @@
+import request from './http'
+
+//地址统计
+export function getAddress(data) {
+ return request({
+ url: `/marketall/btc/rt/address`,
+ method: 'post',
+ data
+ })
+ }
+
+ //交易费
+export function getBTCFees(data) {
+ return request({
+ url: `/marketall/btc/rt/BTCFees`,
+ method: 'post',
+ data
+ })
+ }
+
+ //交易量
+export function getBTCVolume(data) {
+ return request({
+ url: `/marketall/btc/rt/BTCVolume`,
+ method: 'post',
+ data
+ })
+ }
+
+ //交易量(消除找零)
+export function getEaVolume2(data) {
+ return request({
+ url: `/marketall/btc/rt/eaVolume`,
+ method: 'post',
+ data
+ })
+ }
+//每日已实现盈利交易占比
+export function getProfitRate2(data) {
+ return request({
+ url: `/marketall/btc/rt/profitRate`,
+ method: 'post',
+ data
+ })
+ }
+
+
+ //已花费输出盈利比
+export function getSopr2(data) {
+ return request({
+ url: `/marketall/btc/rt/sopr`,
+ method: 'post',
+ data
+ })
+ }
+
+ //已花费输出平均寿命
+export function getAsol2(data) {
+ return request({
+ url: `/marketall/btc/rt/asol`,
+ method: 'post',
+ data
+ })
+ }
+
+//已花费输出休眠平均天数
+export function getDormancy2(data) {
+ return request({
+ url: `/marketall/btc/rt/dormancy`,
+ method: 'post',
+ data
+ })
+ }
+
+
+//币天销毁量
+export function getCdd2(data) {
+ return request({
+ url: `/marketall/btc/rt/cdd`,
+ method: 'post',
+ data
+ })
+ }
+
+ //币天销毁量年龄分布
+export function getSoag2(data) {
+ return request({
+ url: `/marketall/btc/rt/soag`,
+ method: 'post',
+ data
+ })
+ }
+
diff --git a/yq/src/api/sharing.js b/yq/src/api/sharing.js
new file mode 100644
index 0000000..09e9a27
--- /dev/null
+++ b/yq/src/api/sharing.js
@@ -0,0 +1,9 @@
+import server from "../util/request"
+
+export function fetchActiveaddress(params){
+ return server({
+ method:"GET",
+ url:"/marketall/activeaddress/list?coin=btc",
+ params
+ })
+}
\ No newline at end of file
diff --git a/yq/src/assets/404_images/404.png b/yq/src/assets/404_images/404.png
new file mode 100644
index 0000000..3d8e230
Binary files /dev/null and b/yq/src/assets/404_images/404.png differ
diff --git a/yq/src/assets/404_images/404_cloud.png b/yq/src/assets/404_images/404_cloud.png
new file mode 100644
index 0000000..c6281d0
Binary files /dev/null and b/yq/src/assets/404_images/404_cloud.png differ
diff --git a/yq/src/assets/icon/demo.css b/yq/src/assets/icon/demo.css
new file mode 100644
index 0000000..a67054a
--- /dev/null
+++ b/yq/src/assets/icon/demo.css
@@ -0,0 +1,539 @@
+/* Logo 字体 */
+@font-face {
+ font-family: "iconfont logo";
+ src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
+ src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
+ url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
+ url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
+ url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
+}
+
+.logo {
+ font-family: "iconfont logo";
+ font-size: 160px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+/* tabs */
+.nav-tabs {
+ position: relative;
+}
+
+.nav-tabs .nav-more {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ height: 42px;
+ line-height: 42px;
+ color: #666;
+}
+
+#tabs {
+ border-bottom: 1px solid #eee;
+}
+
+#tabs li {
+ cursor: pointer;
+ width: 100px;
+ height: 40px;
+ line-height: 40px;
+ text-align: center;
+ font-size: 16px;
+ border-bottom: 2px solid transparent;
+ position: relative;
+ z-index: 1;
+ margin-bottom: -1px;
+ color: #666;
+}
+
+
+#tabs .active {
+ border-bottom-color: #f00;
+ color: #222;
+}
+
+.tab-container .content {
+ display: none;
+}
+
+/* 页面布局 */
+.main {
+ padding: 30px 100px;
+ width: 960px;
+ margin: 0 auto;
+}
+
+.main .logo {
+ color: #333;
+ text-align: left;
+ margin-bottom: 30px;
+ line-height: 1;
+ height: 110px;
+ margin-top: -50px;
+ overflow: hidden;
+ *zoom: 1;
+}
+
+.main .logo a {
+ font-size: 160px;
+ color: #333;
+}
+
+.helps {
+ margin-top: 40px;
+}
+
+.helps pre {
+ padding: 20px;
+ margin: 10px 0;
+ border: solid 1px #e7e1cd;
+ background-color: #fffdef;
+ overflow: auto;
+}
+
+.icon_lists {
+ width: 100% !important;
+ overflow: hidden;
+ *zoom: 1;
+}
+
+.icon_lists li {
+ width: 100px;
+ margin-bottom: 10px;
+ margin-right: 20px;
+ text-align: center;
+ list-style: none !important;
+ cursor: default;
+}
+
+.icon_lists li .code-name {
+ line-height: 1.2;
+}
+
+.icon_lists .icon {
+ display: block;
+ height: 100px;
+ line-height: 100px;
+ font-size: 42px;
+ margin: 10px auto;
+ color: #333;
+ -webkit-transition: font-size 0.25s linear, width 0.25s linear;
+ -moz-transition: font-size 0.25s linear, width 0.25s linear;
+ transition: font-size 0.25s linear, width 0.25s linear;
+}
+
+.icon_lists .icon:hover {
+ font-size: 100px;
+}
+
+.icon_lists .svg-icon {
+ /* 通过设置 font-size 来改变图标大小 */
+ width: 1em;
+ /* 图标和文字相邻时,垂直对齐 */
+ vertical-align: -0.15em;
+ /* 通过设置 color 来改变 SVG 的颜色/fill */
+ fill: currentColor;
+ /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
+ normalize.css 中也包含这行 */
+ overflow: hidden;
+}
+
+.icon_lists li .name,
+.icon_lists li .code-name {
+ color: #666;
+}
+
+/* markdown 样式 */
+.markdown {
+ color: #666;
+ font-size: 14px;
+ line-height: 1.8;
+}
+
+.highlight {
+ line-height: 1.5;
+}
+
+.markdown img {
+ vertical-align: middle;
+ max-width: 100%;
+}
+
+.markdown h1 {
+ color: #404040;
+ font-weight: 500;
+ line-height: 40px;
+ margin-bottom: 24px;
+}
+
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+ color: #404040;
+ margin: 1.6em 0 0.6em 0;
+ font-weight: 500;
+ clear: both;
+}
+
+.markdown h1 {
+ font-size: 28px;
+}
+
+.markdown h2 {
+ font-size: 22px;
+}
+
+.markdown h3 {
+ font-size: 16px;
+}
+
+.markdown h4 {
+ font-size: 14px;
+}
+
+.markdown h5 {
+ font-size: 12px;
+}
+
+.markdown h6 {
+ font-size: 12px;
+}
+
+.markdown hr {
+ height: 1px;
+ border: 0;
+ background: #e9e9e9;
+ margin: 16px 0;
+ clear: both;
+}
+
+.markdown p {
+ margin: 1em 0;
+}
+
+.markdown>p,
+.markdown>blockquote,
+.markdown>.highlight,
+.markdown>ol,
+.markdown>ul {
+ width: 80%;
+}
+
+.markdown ul>li {
+ list-style: circle;
+}
+
+.markdown>ul li,
+.markdown blockquote ul>li {
+ margin-left: 20px;
+ padding-left: 4px;
+}
+
+.markdown>ul li p,
+.markdown>ol li p {
+ margin: 0.6em 0;
+}
+
+.markdown ol>li {
+ list-style: decimal;
+}
+
+.markdown>ol li,
+.markdown blockquote ol>li {
+ margin-left: 20px;
+ padding-left: 4px;
+}
+
+.markdown code {
+ margin: 0 3px;
+ padding: 0 5px;
+ background: #eee;
+ border-radius: 3px;
+}
+
+.markdown strong,
+.markdown b {
+ font-weight: 600;
+}
+
+.markdown>table {
+ border-collapse: collapse;
+ border-spacing: 0px;
+ empty-cells: show;
+ border: 1px solid #e9e9e9;
+ width: 95%;
+ margin-bottom: 24px;
+}
+
+.markdown>table th {
+ white-space: nowrap;
+ color: #333;
+ font-weight: 600;
+}
+
+.markdown>table th,
+.markdown>table td {
+ border: 1px solid #e9e9e9;
+ padding: 8px 16px;
+ text-align: left;
+}
+
+.markdown>table th {
+ background: #F7F7F7;
+}
+
+.markdown blockquote {
+ font-size: 90%;
+ color: #999;
+ border-left: 4px solid #e9e9e9;
+ padding-left: 0.8em;
+ margin: 1em 0;
+}
+
+.markdown blockquote p {
+ margin: 0;
+}
+
+.markdown .anchor {
+ opacity: 0;
+ transition: opacity 0.3s ease;
+ margin-left: 8px;
+}
+
+.markdown .waiting {
+ color: #ccc;
+}
+
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+ opacity: 1;
+ display: inline-block;
+}
+
+.markdown>br,
+.markdown>p>br {
+ clear: both;
+}
+
+
+.hljs {
+ display: block;
+ background: white;
+ padding: 0.5em;
+ color: #333333;
+ overflow-x: auto;
+}
+
+.hljs-comment,
+.hljs-meta {
+ color: #969896;
+}
+
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+ color: #df5000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+ color: #a71d5d;
+}
+
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+ color: #0086b3;
+}
+
+.hljs-section,
+.hljs-name {
+ color: #63a35c;
+}
+
+.hljs-tag {
+ color: #333333;
+}
+
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+ color: #795da3;
+}
+
+.hljs-addition {
+ color: #55a532;
+ background-color: #eaffea;
+}
+
+.hljs-deletion {
+ color: #bd2c00;
+ background-color: #ffecec;
+}
+
+.hljs-link {
+ text-decoration: underline;
+}
+
+/* 代码高亮 */
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+ color: black;
+ background: none;
+ text-shadow: 0 1px white;
+ font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+ text-align: left;
+ white-space: pre;
+ word-spacing: normal;
+ word-break: normal;
+ word-wrap: normal;
+ line-height: 1.5;
+
+ -moz-tab-size: 4;
+ -o-tab-size: 4;
+ tab-size: 4;
+
+ -webkit-hyphens: none;
+ -moz-hyphens: none;
+ -ms-hyphens: none;
+ hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+
+@media print {
+
+ code[class*="language-"],
+ pre[class*="language-"] {
+ text-shadow: none;
+ }
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+ padding: 1em;
+ margin: .5em 0;
+ overflow: auto;
+}
+
+:not(pre)>code[class*="language-"],
+pre[class*="language-"] {
+ background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre)>code[class*="language-"] {
+ padding: .1em;
+ border-radius: .3em;
+ white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+ color: slategray;
+}
+
+.token.punctuation {
+ color: #999;
+}
+
+.namespace {
+ opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+ color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+ color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+ color: #9a6e3a;
+ background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+ color: #07a;
+}
+
+.token.function,
+.token.class-name {
+ color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+ color: #e90;
+}
+
+.token.important,
+.token.bold {
+ font-weight: bold;
+}
+
+.token.italic {
+ font-style: italic;
+}
+
+.token.entity {
+ cursor: help;
+}
diff --git a/yq/src/assets/icon/demo_index.html b/yq/src/assets/icon/demo_index.html
new file mode 100644
index 0000000..2ff7d55
--- /dev/null
+++ b/yq/src/assets/icon/demo_index.html
@@ -0,0 +1,3385 @@
+
+
+
+
+ iconfont Demo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Unicode
+ Font class
+ Symbol
+
+
+
查看项目
+
+
+
+
+
+
+
+
+ 警示 感叹号 !2
+ 
+
+
+
+
+ 刷新
+ 
+
+
+
+
+ 刷新
+ 
+
+
+
+
+ 刷新
+ 
+
+
+
+
+ 资讯
+ 
+
+
+
+
+ 股指
+ 
+
+
+
+
+ 资讯
+ 
+
+
+
+
+ 资讯
+ 
+
+
+
+
+ GDP
+ 
+
+
+
+
+ 每股指标
+ 
+
+
+
+
+ 资讯
+ 
+
+
+
+
+ gdp
+ 
+
+
+
+
+ 股指
+ 
+
+
+
+
+ 货币金融服务
+ 
+
+
+
+
+ GDP
+ 
+
+
+
+
+ GDP
+ 
+
+
+
+
+ 产品-货币金融服务
+ 
+
+
+
+
+ 产品-货币金融服务
+ 
+
+
+
+
+ 债券-次级债券
+ 
+
+
+
+
+ 股指期权
+ 
+
+
+
+
+ GDP
+ 
+
+
+
+
+ 债券
+ 
+
+
+
+ 𐃲
+ 债券
+ 𐃲
+
+
+
+
+ 回到顶部
+ 
+
+
+
+
+ 回到顶部
+ 
+
+
+
+
+ 向右展开
+ 
+
+
+
+
+ 向右展开3
+ 
+
+
+
+
+ 右展开
+ 
+
+
+
+
+ 向右展开
+ 
+
+
+
+
+ 右展开-默认
+ 
+
+
+
+
+ 左右展开
+ 
+
+
+
+
+ 左右
+ 
+
+
+
+
+ 箭头_左右切换
+ 
+
+
+
+
+ 左右拖
+ 
+
+
+
+
+ 左右拉伸
+ 
+
+
+
+
+ 10x6向右展开三角
+ 
+
+
+
+
+ 右展开
+ 
+
+
+
+
+ 向右展开
+ 
+
+
+
+
+ 向右展开
+ 
+
+
+
+
+ 左右展开
+ 
+
+
+
+
+ icon-rgb_指标智能管理
+ 
+
+
+
+
+ 指标管理
+ 
+
+
+
+
+ 销售指标
+ 
+
+
+
+
+ 收藏
+ 
+
+
+
+
+ 等级一
+ 
+
+
+
+
+ 等级二
+ 
+
+
+
+
+ 等级三
+ 
+
+
+
+
+ 星星
+ 
+
+
+
+
+ 星星
+ 
+
+
+
+
+ 24gl-starEmpty
+ 
+
+
+
+
+ 星星
+ 
+
+
+
+
+ lv2
+ 
+
+
+
+
+ lv1
+ 
+
+
+
+
+ 星星
+ 
+
+
+
+
+ 活动,五角星,星
+ 
+
+
+
+
+ 星星
+ 
+
+
+
+
+ 五角星
+ 
+
+
+
+
+ 星星
+ 
+
+
+
+
+ 星星
+ 
+
+
+
+
+ 星星
+ 
+
+
+
+
+ 五角星
+ 
+
+
+
+
+ 星星
+ 
+
+
+
+
+ 升级
+ 
+
+
+
+
+ 升版-升级
+ 
+
+
+
+
+ 版本升级
+ 
+
+
+
+
+ ebr_升级
+ 
+
+
+
+
+ facebook_facebook52
+ 
+
+
+
+
+ twitter
+ 
+
+
+
+
+ reddit
+ 
+
+
+
+
+ discord
+ 
+
+
+
+
+ telegram
+ 
+
+
+
+
+ 踩2
+ 
+
+
+
+
+ 踩
+ 
+
+
+
+
+ 踩1
+ 
+
+
+
+
+ 点赞
+ 
+
+
+
+
+ 点赞
+ 
+
+
+
+
+ 分享
+ 
+
+
+
+
+ cai
+ 
+
+
+
+
+ 点赞
+ 
+
+
+
+
+ 小三角down
+ 
+
+
+
+
+ 小三角up
+ 
+
+
+
+
+ 搜索_填充
+ 
+
+
+
+
+ 搜索
+ 
+
+
+
+
+ 通知
+ 
+
+
+
+
+ 24gl-folderOpen
+ 
+
+
+
+
+ ic_candleline
+ 
+
+
+
+
+ 个人 (9)
+ 
+
+
+
+
+ 美元6
+ 
+
+
+
+
+ 美元
+ 
+
+
+
+
+ 美元
+ 
+
+
+
+
+ 美元_o
+ 
+
+
+
+
+ 24gl-obelus
+ 
+
+
+
+
+ 24gl-plusMinus
+ 
+
+
+
+
+ 书本
+ 
+
+
+
+
+ 4-柱状图
+ 
+
+
+
+
+ 美元
+ 
+
+
+
+
+ 箭头_左右切换
+ 
+
+
+
+
+ 美元
+ 
+
+
+
+
+ 代码,分支,分流,分叉
+ 
+
+
+
+
+ 书本-book2
+ 
+
+
+
+
+ 正负
+ 
+
+
+
+
+ 钱包
+ 
+
+
+
+
+ 鞋/包
+ 
+
+
+
+
+ 美元
+ 
+
+
+
+
+ 金币
+ 
+
+
+
+
+ 美元
+ 
+
+
+
+
+ 美元1
+ 
+
+
+
+
+ 409折线图-线性
+ 
+
+
+
+
+ 钱包
+ 
+
+
+
+
+ 闪电
+ 
+
+
+
+
+ 锤子
+ 
+
+
+
+
+ 折线图_o
+ 
+
+
+
+
+ 房子
+ 
+
+
+
+
+ 钱包
+ 
+
+
+
+
+ 图标44
+ 
+
+
+
+
+ 房子01
+ 
+
+
+
+
+ 建筑
+ 
+
+
+
+
+ 图表
+ 
+
+
+
+
+ 文件夹
+ 
+
+
+
+
+ 时钟
+ 
+
+
+
+
+ 用户管理
+ 
+
+
+
+
+ 图表
+ 
+
+
+
+
+ 房子
+ 
+
+
+
+
+ 槌子,锤子,敲打,工具
+ 
+
+
+
+
+ 美元
+ 
+
+
+
+
+ 日历
+ 
+
+
+
+
+ 电池
+ 
+
+
+
+
+ 电源管理
+ 
+
+
+
+
+ 验证码
+ 
+
+
+
+
+ 分类
+ 
+
+
+
+
+ 券
+ 
+
+
+
+
+ 常用_发现
+ 
+
+
+
+
+ 常用_发现 副本
+ 
+
+
+
+
+ 常用_链接 副本
+ 
+
+
+
+
+ 消息
+ 
+
+
+
+
+ 网络
+ 
+
+
+
+
+ 相机
+ 
+
+
+
+
+ 手机
+ 
+
+
+
+
+ 定位
+ 
+
+
+
+
+
Unicode 引用
+
+
+
Unicode 是字体在网页端最原始的应用方式,特点是:
+
+ 支持按字体的方式去动态调整图标大小,颜色等等。
+ 默认情况下不支持多色,直接添加多色图标会自动去色。
+
+
+ 注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)
+
+
Unicode 使用步骤如下:
+
第一步:拷贝项目下面生成的 @font-face
+
@font-face {
+ font-family: 'i';
+ src: url('iconfont.woff2?t=1693193677535') format('woff2'),
+ url('iconfont.woff?t=1693193677535') format('woff'),
+ url('iconfont.ttf?t=1693193677535') format('truetype');
+}
+
+
第二步:定义使用 iconfont 的样式
+
.i {
+ font-family: "i" !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+
第三步:挑选相应图标并获取字体编码,应用于页面
+
+<span class="i">3</span>
+
+
+ "i" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。
+
+
+
+
+
+
+
+
+
+ 警示 感叹号 !2
+
+ .ijingshigantanhao2
+
+
+
+
+
+
+ 刷新
+
+ .ishuaxin
+
+
+
+
+
+
+ 刷新
+
+ .ishuaxin1
+
+
+
+
+
+
+ 刷新
+
+ .ishuaxin2
+
+
+
+
+
+
+ 资讯
+
+ .izixun
+
+
+
+
+
+
+ 股指
+
+ .iguzhi
+
+
+
+
+
+
+ 资讯
+
+ .izixun1
+
+
+
+
+
+
+ 资讯
+
+ .izixun2
+
+
+
+
+
+
+ GDP
+
+ .iGDP
+
+
+
+
+
+
+ 每股指标
+
+ .imeiguzhibiao
+
+
+
+
+
+
+ 资讯
+
+ .izixun3
+
+
+
+
+
+
+ gdp
+
+ .igdp
+
+
+
+
+
+
+ 股指
+
+ .iguzhi1
+
+
+
+
+
+
+ 货币金融服务
+
+ .iicon_jinrongfuwu
+
+
+
+
+
+
+ GDP
+
+ .iGDP1
+
+
+
+
+
+
+ GDP
+
+ .iGDP2
+
+
+
+
+
+
+ 产品-货币金融服务
+
+ .ichanpin-huobijinrongfuwu
+
+
+
+
+
+
+ 产品-货币金融服务
+
+ .ichanpin-huobijinrongfuwu1
+
+
+
+
+
+
+ 债券-次级债券
+
+ .izhaiquan-cijizhaiquan
+
+
+
+
+
+
+ 股指期权
+
+ .iguzhiqiquan
+
+
+
+
+
+
+ GDP
+
+ .iGDP3
+
+
+
+
+
+
+ 债券
+
+ .izhaiquan
+
+
+
+
+
+
+ 债券
+
+ .izhaiquan1
+
+
+
+
+
+
+ 回到顶部
+
+ .ihuidaodingbu
+
+
+
+
+
+
+ 回到顶部
+
+ .ihuidaodingbu1
+
+
+
+
+
+
+ 向右展开
+
+ .ixiangyouzhankai2
+
+
+
+
+
+
+ 向右展开3
+
+ .ixiangyouzhankai3
+
+
+
+
+
+
+ 右展开
+
+ .iarrow-right-fill-03
+
+
+
+
+
+
+ 向右展开
+
+ .ixiangyouzhankai4
+
+
+
+
+
+
+ 右展开-默认
+
+ .iyouzhankai-moren
+
+
+
+
+
+
+ 左右展开
+
+ .izuoyouzhankai
+
+
+
+
+
+
+ 左右
+
+ .izuoyou
+
+
+
+
+
+
+ 箭头_左右切换
+
+ .ijiantou_zuoyouqiehuan1
+
+
+
+
+
+
+ 左右拖
+
+ .izuoyoutuo
+
+
+
+
+
+
+ 左右拉伸
+
+ .izuoyoulashen
+
+
+
+
+
+
+ 10x6向右展开三角
+
+ .i10x6xiangyouzhankaisanjiao
+
+
+
+
+
+
+ 右展开
+
+ .iyouzhankai
+
+
+
+
+
+
+ 向右展开
+
+ .ixiangyouzhankai
+
+
+
+
+
+
+ 向右展开
+
+ .ixiangyouzhankai1
+
+
+
+
+
+
+ 左右展开
+
+ .izuoyouzhankai1
+
+
+
+
+
+
+ icon-rgb_指标智能管理
+
+ .iicon-rgb_zhibiaozhinengguanli
+
+
+
+
+
+
+ 指标管理
+
+ .izhibiaoguanli
+
+
+
+
+
+
+ 销售指标
+
+ .ixiaoshouzhibiao
+
+
+
+
+
+
+ 收藏
+
+ .ishoucang
+
+
+
+
+
+
+ 等级一
+
+ .ilevel1
+
+
+
+
+
+
+ 等级二
+
+ .ilevel2
+
+
+
+
+
+
+ 等级三
+
+ .ilevel3
+
+
+
+
+
+
+ 星星
+
+ .ixingxing5
+
+
+
+
+
+
+ 星星
+
+ .ixingxing6
+
+
+
+
+
+
+ 24gl-starEmpty
+
+ .i24gl-starEmpty
+
+
+
+
+
+
+ 星星
+
+ .ixingxing7
+
+
+
+
+
+
+ lv2
+
+ .iicon-test1
+
+
+
+
+
+
+ lv1
+
+ .iicon-test2
+
+
+
+
+
+
+ 星星
+
+ .ixingxing
+
+
+
+
+
+
+ 活动,五角星,星
+
+ .iiconzhengli-
+
+
+
+
+
+
+ 星星
+
+ .ixingxing1
+
+
+
+
+
+
+ 五角星
+
+ .istart
+
+
+
+
+
+
+ 星星
+
+ .istar
+
+
+
+
+
+
+ 星星
+
+ .ixingxing2
+
+
+
+
+
+
+ 星星
+
+ .ixingxing3
+
+
+
+
+
+
+ 五角星
+
+ .istart1
+
+
+
+
+
+
+ 星星
+
+ .ixingxing4
+
+
+
+
+
+
+ 升级
+
+ .ishengji
+
+
+
+
+
+
+ 升版-升级
+
+ .ishengban-shengji
+
+
+
+
+
+
+ 版本升级
+
+ .ibanbenshengji-05
+
+
+
+
+
+
+ ebr_升级
+
+ .iebr_shengji
+
+
+
+
+
+
+ facebook_facebook52
+
+ .ifacebookfacebook52
+
+
+
+
+
+
+ twitter
+
+ .itwitter-fill
+
+
+
+
+
+
+ reddit
+
+ .ireddit
+
+
+
+
+
+
+ discord
+
+ .idiscord
+
+
+
+
+
+
+ telegram
+
+ .itelegram
+
+
+
+
+
+
+ 踩2
+
+ .icai4
+
+
+
+
+
+
+ 踩
+
+ .icai1
+
+
+
+
+
+
+ 踩1
+
+ .icai2
+
+
+
+
+
+
+ 点赞
+
+ .idianzan
+
+
+
+
+
+
+ 点赞
+
+ .idianzan1
+
+
+
+
+
+
+ 分享
+
+ .ifenxiang
+
+
+
+
+
+
+ cai
+
+ .icai
+
+
+
+
+
+
+ 点赞
+
+ .iz-like
+
+
+
+
+
+
+ 小三角down
+
+ .ixiaosanjiaodown
+
+
+
+
+
+
+ 小三角up
+
+ .ixiaosanjiaoup
+
+
+
+
+
+
+ 搜索_填充
+
+ .isousuotianchong
+
+
+
+
+
+
+ 搜索
+
+ .isousuo
+
+
+
+
+
+
+ 通知
+
+ .itongzhi
+
+
+
+
+
+
+ 24gl-folderOpen
+
+ .igl-folderOpen
+
+
+
+
+
+
+ ic_candleline
+
+ .iiccandleline
+
+
+
+
+
+
+ 个人 (9)
+
+ .igeren9
+
+
+
+
+
+
+ 美元6
+
+ .imeiyuan6
+
+
+
+
+
+
+ 美元
+
+ .imeiyuan2
+
+
+
+
+
+
+ 美元
+
+ .imeiyuan3
+
+
+
+
+
+
+ 美元_o
+
+ .imeiyuan_o
+
+
+
+
+
+
+ 24gl-obelus
+
+ .i24gl-obelus
+
+
+
+
+
+
+ 24gl-plusMinus
+
+ .i24gl-plusMinus
+
+
+
+
+
+
+ 书本
+
+ .ishuben
+
+
+
+
+
+
+ 4-柱状图
+
+ .i-zhuzhuangtu
+
+
+
+
+
+
+ 美元
+
+ .imeiyuan4
+
+
+
+
+
+
+ 箭头_左右切换
+
+ .ijiantou_zuoyouqiehuan
+
+
+
+
+
+
+ 美元
+
+ .i9meiyuan
+
+
+
+
+
+
+ 代码,分支,分流,分叉
+
+ .icode-branch
+
+
+
+
+
+
+ 书本-book2
+
+ .ishuben-book2
+
+
+
+
+
+
+ 正负
+
+ .izhengfu
+
+
+
+
+
+
+ 钱包
+
+ .iqianbao-copy
+
+
+
+
+
+
+ 鞋/包
+
+ .ixiebao
+
+
+
+
+
+
+ 美元
+
+ .i30
+
+
+
+
+
+
+ 金币
+
+ .ijinbi
+
+
+
+
+
+
+ 美元
+
+ .iiconset0294
+
+
+
+
+
+
+ 美元1
+
+ .imeiyuan1
+
+
+
+
+
+
+ 409折线图-线性
+
+ .izhexiantu-xianxing
+
+
+
+
+
+
+ 钱包
+
+ .iqianbao
+
+
+
+
+
+
+ 闪电
+
+ .ishandian
+
+
+
+
+
+
+ 锤子
+
+ .ichuizi
+
+
+
+
+
+
+ 折线图_o
+
+ .izhexiantu_o
+
+
+
+
+
+
+ 房子
+
+ .iicon-test
+
+
+
+
+
+
+ 钱包
+
+ .iqianbao1
+
+
+
+
+
+
+ 图标44
+
+ .itubiao
+
+
+
+
+
+
+ 房子01
+
+ .ithin-_home_flat
+
+
+
+
+
+
+ 建筑
+
+ .ibuilding
+
+
+
+
+
+
+ 图表
+
+ .itubiao1
+
+
+
+
+
+
+ 文件夹
+
+ .iwenjianjia
+
+
+
+
+
+
+ 时钟
+
+ .ishizhong
+
+
+
+
+
+
+ 用户管理
+
+ .iyonghuguanli_huaban
+
+
+
+
+
+
+ 图表
+
+ .itubiao2
+
+
+
+
+
+
+ 房子
+
+ .ifangzi
+
+
+
+
+
+
+ 槌子,锤子,敲打,工具
+
+ .ihammer
+
+
+
+
+
+
+ 美元
+
+ .imeiyuan
+
+
+
+
+
+
+ 日历
+
+ .irili
+
+
+
+
+
+
+ 电池
+
+ .idianchi
+
+
+
+
+
+
+ 电源管理
+
+ .ichangyongtubiao_dianyuanguanlixuanzhong
+
+
+
+
+
+
+ 验证码
+
+ .ichangyongtubiao-fuben-33
+
+
+
+
+
+
+ 分类
+
+ .ichangyongtubiao-fuben-41
+
+
+
+
+
+
+ 券
+
+ .ichangyongtubiao-fuben-60
+
+
+
+
+
+
+ 常用_发现
+
+ .ichangyong_faxian
+
+
+
+
+
+
+ 常用_发现 副本
+
+ .ia-changyong_faxianfuben
+
+
+
+
+
+
+ 常用_链接 副本
+
+ .ia-changyong_lianjiefuben
+
+
+
+
+
+
+ 消息
+
+ .ixiaoxi
+
+
+
+
+
+
+ 网络
+
+ .iwangluo
+
+
+
+
+
+
+ 相机
+
+ .ixiangji
+
+
+
+
+
+
+ 手机
+
+ .ishouji
+
+
+
+
+
+
+ 定位
+
+ .idingwei
+
+
+
+
+
+
font-class 引用
+
+
+
font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。
+
与 Unicode 使用方式相比,具有如下特点:
+
+ 相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。
+ 因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。
+
+
使用步骤如下:
+
第一步:引入项目下面生成的 fontclass 代码:
+
<link rel="stylesheet" href="./iconfont.css">
+
+
第二步:挑选相应图标并获取类名,应用于页面:
+
<span class="i ixxx"></span>
+
+
+ "
+ i" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。
+
+
+
+
+
+
+
+
+
+
+ 警示 感叹号 !2
+ #ijingshigantanhao2
+
+
+
+
+
+
+ 刷新
+ #ishuaxin
+
+
+
+
+
+
+ 刷新
+ #ishuaxin1
+
+
+
+
+
+
+ 刷新
+ #ishuaxin2
+
+
+
+
+
+
+ 资讯
+ #izixun
+
+
+
+
+
+
+ 股指
+ #iguzhi
+
+
+
+
+
+
+ 资讯
+ #izixun1
+
+
+
+
+
+
+ 资讯
+ #izixun2
+
+
+
+
+
+
+ GDP
+ #iGDP
+
+
+
+
+
+
+ 每股指标
+ #imeiguzhibiao
+
+
+
+
+
+
+ 资讯
+ #izixun3
+
+
+
+
+
+
+ gdp
+ #igdp
+
+
+
+
+
+
+ 股指
+ #iguzhi1
+
+
+
+
+
+
+ 货币金融服务
+ #iicon_jinrongfuwu
+
+
+
+
+
+
+ GDP
+ #iGDP1
+
+
+
+
+
+
+ GDP
+ #iGDP2
+
+
+
+
+
+
+ 产品-货币金融服务
+ #ichanpin-huobijinrongfuwu
+
+
+
+
+
+
+ 产品-货币金融服务
+ #ichanpin-huobijinrongfuwu1
+
+
+
+
+
+
+ 债券-次级债券
+ #izhaiquan-cijizhaiquan
+
+
+
+
+
+
+ 股指期权
+ #iguzhiqiquan
+
+
+
+
+
+
+ GDP
+ #iGDP3
+
+
+
+
+
+
+ 债券
+ #izhaiquan
+
+
+
+
+
+
+ 债券
+ #izhaiquan1
+
+
+
+
+
+
+ 回到顶部
+ #ihuidaodingbu
+
+
+
+
+
+
+ 回到顶部
+ #ihuidaodingbu1
+
+
+
+
+
+
+ 向右展开
+ #ixiangyouzhankai2
+
+
+
+
+
+
+ 向右展开3
+ #ixiangyouzhankai3
+
+
+
+
+
+
+ 右展开
+ #iarrow-right-fill-03
+
+
+
+
+
+
+ 向右展开
+ #ixiangyouzhankai4
+
+
+
+
+
+
+ 右展开-默认
+ #iyouzhankai-moren
+
+
+
+
+
+
+ 左右展开
+ #izuoyouzhankai
+
+
+
+
+
+
+ 左右
+ #izuoyou
+
+
+
+
+
+
+ 箭头_左右切换
+ #ijiantou_zuoyouqiehuan1
+
+
+
+
+
+
+ 左右拖
+ #izuoyoutuo
+
+
+
+
+
+
+ 左右拉伸
+ #izuoyoulashen
+
+
+
+
+
+
+ 10x6向右展开三角
+ #i10x6xiangyouzhankaisanjiao
+
+
+
+
+
+
+ 右展开
+ #iyouzhankai
+
+
+
+
+
+
+ 向右展开
+ #ixiangyouzhankai
+
+
+
+
+
+
+ 向右展开
+ #ixiangyouzhankai1
+
+
+
+
+
+
+ 左右展开
+ #izuoyouzhankai1
+
+
+
+
+
+
+ icon-rgb_指标智能管理
+ #iicon-rgb_zhibiaozhinengguanli
+
+
+
+
+
+
+ 指标管理
+ #izhibiaoguanli
+
+
+
+
+
+
+ 销售指标
+ #ixiaoshouzhibiao
+
+
+
+
+
+
+ 收藏
+ #ishoucang
+
+
+
+
+
+
+ 等级一
+ #ilevel1
+
+
+
+
+
+
+ 等级二
+ #ilevel2
+
+
+
+
+
+
+ 等级三
+ #ilevel3
+
+
+
+
+
+
+ 星星
+ #ixingxing5
+
+
+
+
+
+
+ 星星
+ #ixingxing6
+
+
+
+
+
+
+ 24gl-starEmpty
+ #i24gl-starEmpty
+
+
+
+
+
+
+ 星星
+ #ixingxing7
+
+
+
+
+
+
+ lv2
+ #iicon-test1
+
+
+
+
+
+
+ lv1
+ #iicon-test2
+
+
+
+
+
+
+ 星星
+ #ixingxing
+
+
+
+
+
+
+ 活动,五角星,星
+ #iiconzhengli-
+
+
+
+
+
+
+ 星星
+ #ixingxing1
+
+
+
+
+
+
+ 五角星
+ #istart
+
+
+
+
+
+
+ 星星
+ #istar
+
+
+
+
+
+
+ 星星
+ #ixingxing2
+
+
+
+
+
+
+ 星星
+ #ixingxing3
+
+
+
+
+
+
+ 五角星
+ #istart1
+
+
+
+
+
+
+ 星星
+ #ixingxing4
+
+
+
+
+
+
+ 升级
+ #ishengji
+
+
+
+
+
+
+ 升版-升级
+ #ishengban-shengji
+
+
+
+
+
+
+ 版本升级
+ #ibanbenshengji-05
+
+
+
+
+
+
+ ebr_升级
+ #iebr_shengji
+
+
+
+
+
+
+ facebook_facebook52
+ #ifacebookfacebook52
+
+
+
+
+
+
+ twitter
+ #itwitter-fill
+
+
+
+
+
+
+ reddit
+ #ireddit
+
+
+
+
+
+
+ discord
+ #idiscord
+
+
+
+
+
+
+ telegram
+ #itelegram
+
+
+
+
+
+
+ 踩2
+ #icai4
+
+
+
+
+
+
+ 踩
+ #icai1
+
+
+
+
+
+
+ 踩1
+ #icai2
+
+
+
+
+
+
+ 点赞
+ #idianzan
+
+
+
+
+
+
+ 点赞
+ #idianzan1
+
+
+
+
+
+
+ 分享
+ #ifenxiang
+
+
+
+
+
+
+ cai
+ #icai
+
+
+
+
+
+
+ 点赞
+ #iz-like
+
+
+
+
+
+
+ 小三角down
+ #ixiaosanjiaodown
+
+
+
+
+
+
+ 小三角up
+ #ixiaosanjiaoup
+
+
+
+
+
+
+ 搜索_填充
+ #isousuotianchong
+
+
+
+
+
+
+ 搜索
+ #isousuo
+
+
+
+
+
+
+ 通知
+ #itongzhi
+
+
+
+
+
+
+ 24gl-folderOpen
+ #igl-folderOpen
+
+
+
+
+
+
+ ic_candleline
+ #iiccandleline
+
+
+
+
+
+
+ 个人 (9)
+ #igeren9
+
+
+
+
+
+
+ 美元6
+ #imeiyuan6
+
+
+
+
+
+
+ 美元
+ #imeiyuan2
+
+
+
+
+
+
+ 美元
+ #imeiyuan3
+
+
+
+
+
+
+ 美元_o
+ #imeiyuan_o
+
+
+
+
+
+
+ 24gl-obelus
+ #i24gl-obelus
+
+
+
+
+
+
+ 24gl-plusMinus
+ #i24gl-plusMinus
+
+
+
+
+
+
+ 书本
+ #ishuben
+
+
+
+
+
+
+ 4-柱状图
+ #i-zhuzhuangtu
+
+
+
+
+
+
+ 美元
+ #imeiyuan4
+
+
+
+
+
+
+ 箭头_左右切换
+ #ijiantou_zuoyouqiehuan
+
+
+
+
+
+
+ 美元
+ #i9meiyuan
+
+
+
+
+
+
+ 代码,分支,分流,分叉
+ #icode-branch
+
+
+
+
+
+
+ 书本-book2
+ #ishuben-book2
+
+
+
+
+
+
+ 正负
+ #izhengfu
+
+
+
+
+
+
+ 钱包
+ #iqianbao-copy
+
+
+
+
+
+
+ 鞋/包
+ #ixiebao
+
+
+
+
+
+
+ 美元
+ #i30
+
+
+
+
+
+
+ 金币
+ #ijinbi
+
+
+
+
+
+
+ 美元
+ #iiconset0294
+
+
+
+
+
+
+ 美元1
+ #imeiyuan1
+
+
+
+
+
+
+ 409折线图-线性
+ #izhexiantu-xianxing
+
+
+
+
+
+
+ 钱包
+ #iqianbao
+
+
+
+
+
+
+ 闪电
+ #ishandian
+
+
+
+
+
+
+ 锤子
+ #ichuizi
+
+
+
+
+
+
+ 折线图_o
+ #izhexiantu_o
+
+
+
+
+
+
+ 房子
+ #iicon-test
+
+
+
+
+
+
+ 钱包
+ #iqianbao1
+
+
+
+
+
+
+ 图标44
+ #itubiao
+
+
+
+
+
+
+ 房子01
+ #ithin-_home_flat
+
+
+
+
+
+
+ 建筑
+ #ibuilding
+
+
+
+
+
+
+ 图表
+ #itubiao1
+
+
+
+
+
+
+ 文件夹
+ #iwenjianjia
+
+
+
+
+
+
+ 时钟
+ #ishizhong
+
+
+
+
+
+
+ 用户管理
+ #iyonghuguanli_huaban
+
+
+
+
+
+
+ 图表
+ #itubiao2
+
+
+
+
+
+
+ 房子
+ #ifangzi
+
+
+
+
+
+
+ 槌子,锤子,敲打,工具
+ #ihammer
+
+
+
+
+
+
+ 美元
+ #imeiyuan
+
+
+
+
+
+
+ 日历
+ #irili
+
+
+
+
+
+
+ 电池
+ #idianchi
+
+
+
+
+
+
+ 电源管理
+ #ichangyongtubiao_dianyuanguanlixuanzhong
+
+
+
+
+
+
+ 验证码
+ #ichangyongtubiao-fuben-33
+
+
+
+
+
+
+ 分类
+ #ichangyongtubiao-fuben-41
+
+
+
+
+
+
+ 券
+ #ichangyongtubiao-fuben-60
+
+
+
+
+
+
+ 常用_发现
+ #ichangyong_faxian
+
+
+
+
+
+
+ 常用_发现 副本
+ #ia-changyong_faxianfuben
+
+
+
+
+
+
+ 常用_链接 副本
+ #ia-changyong_lianjiefuben
+
+
+
+
+
+
+ 消息
+ #ixiaoxi
+
+
+
+
+
+
+ 网络
+ #iwangluo
+
+
+
+
+
+
+ 相机
+ #ixiangji
+
+
+
+
+
+
+ 手机
+ #ishouji
+
+
+
+
+
+
+ 定位
+ #idingwei
+
+
+
+
+
Symbol 引用
+
+
+
这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章
+ 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:
+
+ 支持多色图标了,不再受单色限制。
+ 通过一些技巧,支持像字体那样,通过 font-size, color 来调整样式。
+ 兼容性较差,支持 IE9+,及现代浏览器。
+ 浏览器渲染 SVG 的性能一般,还不如 png。
+
+
使用步骤如下:
+
第一步:引入项目下面生成的 symbol 代码:
+
<script src="./iconfont.js"></script>
+
+
第二步:加入通用 CSS 代码(引入一次就行):
+
<style>
+.icon {
+ width: 1em;
+ height: 1em;
+ vertical-align: -0.15em;
+ fill: currentColor;
+ overflow: hidden;
+}
+</style>
+
+
第三步:挑选相应图标并获取类名,应用于页面:
+
<svg class="icon" aria-hidden="true">
+ <use xlink:href="#icon-xxx"></use>
+</svg>
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/assets/icon/iconfont.css b/yq/src/assets/icon/iconfont.css
new file mode 100644
index 0000000..0414229
--- /dev/null
+++ b/yq/src/assets/icon/iconfont.css
@@ -0,0 +1,571 @@
+@font-face {
+ font-family: "i"; /* Project id 3157209 */
+ src: url('iconfont.woff2?t=1693193677535') format('woff2'),
+ url('iconfont.woff?t=1693193677535') format('woff'),
+ url('iconfont.ttf?t=1693193677535') format('truetype');
+}
+
+.i {
+ font-family: "i" !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.ijingshigantanhao2:before {
+ content: "\e7f4";
+}
+
+.ishuaxin:before {
+ content: "\e6e0";
+}
+
+.ishuaxin1:before {
+ content: "\e63b";
+}
+
+.ishuaxin2:before {
+ content: "\e796";
+}
+
+.izixun:before {
+ content: "\e64e";
+}
+
+.iguzhi:before {
+ content: "\e65e";
+}
+
+.izixun1:before {
+ content: "\e645";
+}
+
+.izixun2:before {
+ content: "\e771";
+}
+
+.iGDP:before {
+ content: "\e884";
+}
+
+.imeiguzhibiao:before {
+ content: "\e6dc";
+}
+
+.izixun3:before {
+ content: "\e638";
+}
+
+.igdp:before {
+ content: "\e63f";
+}
+
+.iguzhi1:before {
+ content: "\e639";
+}
+
+.iicon_jinrongfuwu:before {
+ content: "\e649";
+}
+
+.iGDP1:before {
+ content: "\e658";
+}
+
+.iGDP2:before {
+ content: "\e648";
+}
+
+.ichanpin-huobijinrongfuwu:before {
+ content: "\e63a";
+}
+
+.ichanpin-huobijinrongfuwu1:before {
+ content: "\e663";
+}
+
+.izhaiquan-cijizhaiquan:before {
+ content: "\e671";
+}
+
+.iguzhiqiquan:before {
+ content: "\e7a2";
+}
+
+.iGDP3:before {
+ content: "\e692";
+}
+
+.izhaiquan:before {
+ content: "\e68e";
+}
+
+.izhaiquan1:before {
+ content: "\100f2";
+}
+
+.ihuidaodingbu:before {
+ content: "\e73c";
+}
+
+.ihuidaodingbu1:before {
+ content: "\e637";
+}
+
+.ixiangyouzhankai2:before {
+ content: "\e624";
+}
+
+.ixiangyouzhankai3:before {
+ content: "\e7d3";
+}
+
+.iarrow-right-fill-03:before {
+ content: "\e739";
+}
+
+.ixiangyouzhankai4:before {
+ content: "\e635";
+}
+
+.iyouzhankai-moren:before {
+ content: "\e636";
+}
+
+.izuoyouzhankai:before {
+ content: "\e65c";
+}
+
+.izuoyou:before {
+ content: "\e634";
+}
+
+.ijiantou_zuoyouqiehuan1:before {
+ content: "\eb0d";
+}
+
+.izuoyoutuo:before {
+ content: "\e673";
+}
+
+.izuoyoulashen:before {
+ content: "\e652";
+}
+
+.i10x6xiangyouzhankaisanjiao:before {
+ content: "\e63e";
+}
+
+.iyouzhankai:before {
+ content: "\e684";
+}
+
+.ixiangyouzhankai:before {
+ content: "\e651";
+}
+
+.ixiangyouzhankai1:before {
+ content: "\e693";
+}
+
+.izuoyouzhankai1:before {
+ content: "\ec3a";
+}
+
+.iicon-rgb_zhibiaozhinengguanli:before {
+ content: "\e6fa";
+}
+
+.izhibiaoguanli:before {
+ content: "\e72a";
+}
+
+.ixiaoshouzhibiao:before {
+ content: "\e664";
+}
+
+.ishoucang:before {
+ content: "\e630";
+}
+
+.ilevel1:before {
+ content: "\e631";
+}
+
+.ilevel2:before {
+ content: "\e632";
+}
+
+.ilevel3:before {
+ content: "\e633";
+}
+
+.ixingxing5:before {
+ content: "\e80d";
+}
+
+.ixingxing6:before {
+ content: "\efeb";
+}
+
+.i24gl-starEmpty:before {
+ content: "\e8c4";
+}
+
+.ixingxing7:before {
+ content: "\e75b";
+}
+
+.iicon-test1:before {
+ content: "\e625";
+}
+
+.iicon-test2:before {
+ content: "\e629";
+}
+
+.ixingxing:before {
+ content: "\e607";
+}
+
+.iiconzhengli-:before {
+ content: "\e61f";
+}
+
+.ixingxing1:before {
+ content: "\e870";
+}
+
+.istart:before {
+ content: "\e608";
+}
+
+.istar:before {
+ content: "\e65d";
+}
+
+.ixingxing2:before {
+ content: "\e621";
+}
+
+.ixingxing3:before {
+ content: "\e622";
+}
+
+.istart1:before {
+ content: "\e623";
+}
+
+.ixingxing4:before {
+ content: "\e62f";
+}
+
+.ishengji:before {
+ content: "\e62c";
+}
+
+.ishengban-shengji:before {
+ content: "\e643";
+}
+
+.ibanbenshengji-05:before {
+ content: "\e62a";
+}
+
+.iebr_shengji:before {
+ content: "\e61e";
+}
+
+.ifacebookfacebook52:before {
+ content: "\e606";
+}
+
+.itwitter-fill:before {
+ content: "\e63d";
+}
+
+.ireddit:before {
+ content: "\ea03";
+}
+
+.idiscord:before {
+ content: "\e617";
+}
+
+.itelegram:before {
+ content: "\e618";
+}
+
+.icai4:before {
+ content: "\e691";
+}
+
+.icai1:before {
+ content: "\e602";
+}
+
+.icai2:before {
+ content: "\e68f";
+}
+
+.idianzan:before {
+ content: "\e616";
+}
+
+.idianzan1:before {
+ content: "\e619";
+}
+
+.ifenxiang:before {
+ content: "\e601";
+}
+
+.icai:before {
+ content: "\e62e";
+}
+
+.iz-like:before {
+ content: "\e6bf";
+}
+
+.ixiaosanjiaodown:before {
+ content: "\e614";
+}
+
+.ixiaosanjiaoup:before {
+ content: "\e615";
+}
+
+.isousuotianchong:before {
+ content: "\e694";
+}
+
+.isousuo:before {
+ content: "\e60e";
+}
+
+.itongzhi:before {
+ content: "\e612";
+}
+
+.igl-folderOpen:before {
+ content: "\eabe";
+}
+
+.iiccandleline:before {
+ content: "\e613";
+}
+
+.igeren9:before {
+ content: "\e641";
+}
+
+.imeiyuan6:before {
+ content: "\e738";
+}
+
+.imeiyuan2:before {
+ content: "\e64b";
+}
+
+.imeiyuan3:before {
+ content: "\eb1a";
+}
+
+.imeiyuan_o:before {
+ content: "\eba1";
+}
+
+.i24gl-obelus:before {
+ content: "\e88f";
+}
+
+.i24gl-plusMinus:before {
+ content: "\e890";
+}
+
+.ishuben:before {
+ content: "\e60d";
+}
+
+.i-zhuzhuangtu:before {
+ content: "\e628";
+}
+
+.imeiyuan4:before {
+ content: "\e90d";
+}
+
+.ijiantou_zuoyouqiehuan:before {
+ content: "\e6eb";
+}
+
+.i9meiyuan:before {
+ content: "\e626";
+}
+
+.icode-branch:before {
+ content: "\e993";
+}
+
+.ishuben-book2:before {
+ content: "\e644";
+}
+
+.izhengfu:before {
+ content: "\e73d";
+}
+
+.iqianbao-copy:before {
+ content: "\ebb4";
+}
+
+.ixiebao:before {
+ content: "\e600";
+}
+
+.i30:before {
+ content: "\e620";
+}
+
+.ijinbi:before {
+ content: "\e6c8";
+}
+
+.iiconset0294:before {
+ content: "\e6c1";
+}
+
+.imeiyuan1:before {
+ content: "\e733";
+}
+
+.izhexiantu-xianxing:before {
+ content: "\e904";
+}
+
+.iqianbao:before {
+ content: "\e646";
+}
+
+.ishandian:before {
+ content: "\e799";
+}
+
+.ichuizi:before {
+ content: "\e61b";
+}
+
+.izhexiantu_o:before {
+ content: "\ebb3";
+}
+
+.iicon-test:before {
+ content: "\e603";
+}
+
+.iqianbao1:before {
+ content: "\e61c";
+}
+
+.itubiao:before {
+ content: "\e610";
+}
+
+.ithin-_home_flat:before {
+ content: "\e611";
+}
+
+.ibuilding:before {
+ content: "\e64a";
+}
+
+.itubiao1:before {
+ content: "\e61d";
+}
+
+.iwenjianjia:before {
+ content: "\e74a";
+}
+
+.ishizhong:before {
+ content: "\e60c";
+}
+
+.iyonghuguanli_huaban:before {
+ content: "\e62d";
+}
+
+.itubiao2:before {
+ content: "\e659";
+}
+
+.ifangzi:before {
+ content: "\e64f";
+}
+
+.ihammer:before {
+ content: "\e87c";
+}
+
+.imeiyuan:before {
+ content: "\e73f";
+}
+
+.irili:before {
+ content: "\e71a";
+}
+
+.idianchi:before {
+ content: "\e62b";
+}
+
+.ichangyongtubiao_dianyuanguanlixuanzhong:before {
+ content: "\e605";
+}
+
+.ichangyongtubiao-fuben-33:before {
+ content: "\e60a";
+}
+
+.ichangyongtubiao-fuben-41:before {
+ content: "\e60b";
+}
+
+.ichangyongtubiao-fuben-60:before {
+ content: "\e60f";
+}
+
+.ichangyong_faxian:before {
+ content: "\e6b0";
+}
+
+.ia-changyong_faxianfuben:before {
+ content: "\e6ba";
+}
+
+.ia-changyong_lianjiefuben:before {
+ content: "\e6bb";
+}
+
+.ixiaoxi:before {
+ content: "\e67c";
+}
+
+.iwangluo:before {
+ content: "\e627";
+}
+
+.ixiangji:before {
+ content: "\e609";
+}
+
+.ishouji:before {
+ content: "\e61a";
+}
+
+.idingwei:before {
+ content: "\e604";
+}
+
diff --git a/yq/src/assets/icon/iconfont.js b/yq/src/assets/icon/iconfont.js
new file mode 100644
index 0000000..ebda5c0
--- /dev/null
+++ b/yq/src/assets/icon/iconfont.js
@@ -0,0 +1 @@
+window._iconfont_svg_string_3157209=' ',function(c){var l=(l=document.getElementsByTagName("script"))[l.length-1],a=l.getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var h,i,z,t,o,s=function(l,a){a.parentNode.insertBefore(l,a)};if(a&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(l){console&&console.log(l)}}h=function(){var l,a=document.createElement("div");a.innerHTML=c._iconfont_svg_string_3157209,(a=a.getElementsByTagName("svg")[0])&&(a.setAttribute("aria-hidden","true"),a.style.position="absolute",a.style.width=0,a.style.height=0,a.style.overflow="hidden",a=a,(l=document.body).firstChild?s(a,l.firstChild):l.appendChild(a))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(h,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),h()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(z=h,t=c.document,o=!1,m(),t.onreadystatechange=function(){"complete"==t.readyState&&(t.onreadystatechange=null,v())})}function v(){o||(o=!0,z())}function m(){try{t.documentElement.doScroll("left")}catch(l){return void setTimeout(m,50)}v()}}(window);
\ No newline at end of file
diff --git a/yq/src/assets/icon/iconfont.json b/yq/src/assets/icon/iconfont.json
new file mode 100644
index 0000000..f0a4a75
--- /dev/null
+++ b/yq/src/assets/icon/iconfont.json
@@ -0,0 +1,982 @@
+{
+ "id": "3157209",
+ "name": "music",
+ "font_family": "i",
+ "css_prefix_text": "i",
+ "description": "",
+ "glyphs": [
+ {
+ "icon_id": "689256",
+ "name": "警示 感叹号 !2",
+ "font_class": "jingshigantanhao2",
+ "unicode": "e7f4",
+ "unicode_decimal": 59380
+ },
+ {
+ "icon_id": "1781545",
+ "name": "刷新",
+ "font_class": "shuaxin",
+ "unicode": "e6e0",
+ "unicode_decimal": 59104
+ },
+ {
+ "icon_id": "6376283",
+ "name": "刷新",
+ "font_class": "shuaxin1",
+ "unicode": "e63b",
+ "unicode_decimal": 58939
+ },
+ {
+ "icon_id": "28944169",
+ "name": "刷新",
+ "font_class": "shuaxin2",
+ "unicode": "e796",
+ "unicode_decimal": 59286
+ },
+ {
+ "icon_id": "1115097",
+ "name": "资讯",
+ "font_class": "zixun",
+ "unicode": "e64e",
+ "unicode_decimal": 58958
+ },
+ {
+ "icon_id": "1279431",
+ "name": "股指",
+ "font_class": "guzhi",
+ "unicode": "e65e",
+ "unicode_decimal": 58974
+ },
+ {
+ "icon_id": "2506223",
+ "name": "资讯",
+ "font_class": "zixun1",
+ "unicode": "e645",
+ "unicode_decimal": 58949
+ },
+ {
+ "icon_id": "4933454",
+ "name": "资讯",
+ "font_class": "zixun2",
+ "unicode": "e771",
+ "unicode_decimal": 59249
+ },
+ {
+ "icon_id": "5719208",
+ "name": "GDP",
+ "font_class": "GDP",
+ "unicode": "e884",
+ "unicode_decimal": 59524
+ },
+ {
+ "icon_id": "6695200",
+ "name": "每股指标",
+ "font_class": "meiguzhibiao",
+ "unicode": "e6dc",
+ "unicode_decimal": 59100
+ },
+ {
+ "icon_id": "7708016",
+ "name": "资讯",
+ "font_class": "zixun3",
+ "unicode": "e638",
+ "unicode_decimal": 58936
+ },
+ {
+ "icon_id": "11086601",
+ "name": "gdp",
+ "font_class": "gdp",
+ "unicode": "e63f",
+ "unicode_decimal": 58943
+ },
+ {
+ "icon_id": "12084717",
+ "name": "股指",
+ "font_class": "guzhi1",
+ "unicode": "e639",
+ "unicode_decimal": 58937
+ },
+ {
+ "icon_id": "12319736",
+ "name": "货币金融服务",
+ "font_class": "icon_jinrongfuwu",
+ "unicode": "e649",
+ "unicode_decimal": 58953
+ },
+ {
+ "icon_id": "13759988",
+ "name": "GDP",
+ "font_class": "GDP1",
+ "unicode": "e658",
+ "unicode_decimal": 58968
+ },
+ {
+ "icon_id": "15216920",
+ "name": "GDP",
+ "font_class": "GDP2",
+ "unicode": "e648",
+ "unicode_decimal": 58952
+ },
+ {
+ "icon_id": "22992379",
+ "name": "产品-货币金融服务",
+ "font_class": "chanpin-huobijinrongfuwu",
+ "unicode": "e63a",
+ "unicode_decimal": 58938
+ },
+ {
+ "icon_id": "23093526",
+ "name": "产品-货币金融服务",
+ "font_class": "chanpin-huobijinrongfuwu1",
+ "unicode": "e663",
+ "unicode_decimal": 58979
+ },
+ {
+ "icon_id": "23524296",
+ "name": "债券-次级债券",
+ "font_class": "zhaiquan-cijizhaiquan",
+ "unicode": "e671",
+ "unicode_decimal": 58993
+ },
+ {
+ "icon_id": "27125111",
+ "name": "股指期权",
+ "font_class": "guzhiqiquan",
+ "unicode": "e7a2",
+ "unicode_decimal": 59298
+ },
+ {
+ "icon_id": "29689001",
+ "name": "GDP",
+ "font_class": "GDP3",
+ "unicode": "e692",
+ "unicode_decimal": 59026
+ },
+ {
+ "icon_id": "32334086",
+ "name": "债券",
+ "font_class": "zhaiquan",
+ "unicode": "e68e",
+ "unicode_decimal": 59022
+ },
+ {
+ "icon_id": "33096080",
+ "name": "债券",
+ "font_class": "zhaiquan1",
+ "unicode": "100f2",
+ "unicode_decimal": 65778
+ },
+ {
+ "icon_id": "7482196",
+ "name": "回到顶部",
+ "font_class": "huidaodingbu",
+ "unicode": "e73c",
+ "unicode_decimal": 59196
+ },
+ {
+ "icon_id": "8644758",
+ "name": "回到顶部",
+ "font_class": "huidaodingbu1",
+ "unicode": "e637",
+ "unicode_decimal": 58935
+ },
+ {
+ "icon_id": "2272804",
+ "name": "向右展开",
+ "font_class": "xiangyouzhankai2",
+ "unicode": "e624",
+ "unicode_decimal": 58916
+ },
+ {
+ "icon_id": "4039964",
+ "name": "向右展开3",
+ "font_class": "xiangyouzhankai3",
+ "unicode": "e7d3",
+ "unicode_decimal": 59347
+ },
+ {
+ "icon_id": "6136815",
+ "name": "右展开",
+ "font_class": "arrow-right-fill-03",
+ "unicode": "e739",
+ "unicode_decimal": 59193
+ },
+ {
+ "icon_id": "8209295",
+ "name": "向右展开",
+ "font_class": "xiangyouzhankai4",
+ "unicode": "e635",
+ "unicode_decimal": 58933
+ },
+ {
+ "icon_id": "20120590",
+ "name": "右展开-默认",
+ "font_class": "youzhankai-moren",
+ "unicode": "e636",
+ "unicode_decimal": 58934
+ },
+ {
+ "icon_id": "1615178",
+ "name": "左右展开",
+ "font_class": "zuoyouzhankai",
+ "unicode": "e65c",
+ "unicode_decimal": 58972
+ },
+ {
+ "icon_id": "2702787",
+ "name": "左右",
+ "font_class": "zuoyou",
+ "unicode": "e634",
+ "unicode_decimal": 58932
+ },
+ {
+ "icon_id": "5387596",
+ "name": "箭头_左右切换",
+ "font_class": "jiantou_zuoyouqiehuan1",
+ "unicode": "eb0d",
+ "unicode_decimal": 60173
+ },
+ {
+ "icon_id": "7717061",
+ "name": "左右拖",
+ "font_class": "zuoyoutuo",
+ "unicode": "e673",
+ "unicode_decimal": 58995
+ },
+ {
+ "icon_id": "9925313",
+ "name": "左右拉伸",
+ "font_class": "zuoyoulashen",
+ "unicode": "e652",
+ "unicode_decimal": 58962
+ },
+ {
+ "icon_id": "15160919",
+ "name": "10x6向右展开三角",
+ "font_class": "10x6xiangyouzhankaisanjiao",
+ "unicode": "e63e",
+ "unicode_decimal": 58942
+ },
+ {
+ "icon_id": "16324782",
+ "name": "右展开",
+ "font_class": "youzhankai",
+ "unicode": "e684",
+ "unicode_decimal": 59012
+ },
+ {
+ "icon_id": "18451417",
+ "name": "向右展开",
+ "font_class": "xiangyouzhankai",
+ "unicode": "e651",
+ "unicode_decimal": 58961
+ },
+ {
+ "icon_id": "33475546",
+ "name": "向右展开",
+ "font_class": "xiangyouzhankai1",
+ "unicode": "e693",
+ "unicode_decimal": 59027
+ },
+ {
+ "icon_id": "35915355",
+ "name": "左右展开",
+ "font_class": "zuoyouzhankai1",
+ "unicode": "ec3a",
+ "unicode_decimal": 60474
+ },
+ {
+ "icon_id": "5950487",
+ "name": "icon-rgb_指标智能管理",
+ "font_class": "icon-rgb_zhibiaozhinengguanli",
+ "unicode": "e6fa",
+ "unicode_decimal": 59130
+ },
+ {
+ "icon_id": "12594593",
+ "name": "指标管理",
+ "font_class": "zhibiaoguanli",
+ "unicode": "e72a",
+ "unicode_decimal": 59178
+ },
+ {
+ "icon_id": "22169360",
+ "name": "销售指标",
+ "font_class": "xiaoshouzhibiao",
+ "unicode": "e664",
+ "unicode_decimal": 58980
+ },
+ {
+ "icon_id": "4393",
+ "name": "收藏",
+ "font_class": "shoucang",
+ "unicode": "e630",
+ "unicode_decimal": 58928
+ },
+ {
+ "icon_id": "1127408",
+ "name": "等级一",
+ "font_class": "level1",
+ "unicode": "e631",
+ "unicode_decimal": 58929
+ },
+ {
+ "icon_id": "1127409",
+ "name": "等级二",
+ "font_class": "level2",
+ "unicode": "e632",
+ "unicode_decimal": 58930
+ },
+ {
+ "icon_id": "1127410",
+ "name": "等级三",
+ "font_class": "level3",
+ "unicode": "e633",
+ "unicode_decimal": 58931
+ },
+ {
+ "icon_id": "2932864",
+ "name": "星星",
+ "font_class": "xingxing5",
+ "unicode": "e80d",
+ "unicode_decimal": 59405
+ },
+ {
+ "icon_id": "7296812",
+ "name": "星星",
+ "font_class": "xingxing6",
+ "unicode": "efeb",
+ "unicode_decimal": 61419
+ },
+ {
+ "icon_id": "7553794",
+ "name": "24gl-starEmpty",
+ "font_class": "24gl-starEmpty",
+ "unicode": "e8c4",
+ "unicode_decimal": 59588
+ },
+ {
+ "icon_id": "11222358",
+ "name": "星星",
+ "font_class": "xingxing7",
+ "unicode": "e75b",
+ "unicode_decimal": 59227
+ },
+ {
+ "icon_id": "14007852",
+ "name": "lv2",
+ "font_class": "icon-test1",
+ "unicode": "e625",
+ "unicode_decimal": 58917
+ },
+ {
+ "icon_id": "14007854",
+ "name": "lv1",
+ "font_class": "icon-test2",
+ "unicode": "e629",
+ "unicode_decimal": 58921
+ },
+ {
+ "icon_id": "1671793",
+ "name": "星星",
+ "font_class": "xingxing",
+ "unicode": "e607",
+ "unicode_decimal": 58887
+ },
+ {
+ "icon_id": "4608572",
+ "name": "活动,五角星,星",
+ "font_class": "iconzhengli-",
+ "unicode": "e61f",
+ "unicode_decimal": 58911
+ },
+ {
+ "icon_id": "8289033",
+ "name": "星星",
+ "font_class": "xingxing1",
+ "unicode": "e870",
+ "unicode_decimal": 59504
+ },
+ {
+ "icon_id": "8406048",
+ "name": "五角星",
+ "font_class": "start",
+ "unicode": "e608",
+ "unicode_decimal": 58888
+ },
+ {
+ "icon_id": "19031627",
+ "name": "星星",
+ "font_class": "star",
+ "unicode": "e65d",
+ "unicode_decimal": 58973
+ },
+ {
+ "icon_id": "20188729",
+ "name": "星星",
+ "font_class": "xingxing2",
+ "unicode": "e621",
+ "unicode_decimal": 58913
+ },
+ {
+ "icon_id": "22402157",
+ "name": "星星",
+ "font_class": "xingxing3",
+ "unicode": "e622",
+ "unicode_decimal": 58914
+ },
+ {
+ "icon_id": "24106208",
+ "name": "五角星",
+ "font_class": "start1",
+ "unicode": "e623",
+ "unicode_decimal": 58915
+ },
+ {
+ "icon_id": "33438709",
+ "name": "星星",
+ "font_class": "xingxing4",
+ "unicode": "e62f",
+ "unicode_decimal": 58927
+ },
+ {
+ "icon_id": "3777786",
+ "name": "升级",
+ "font_class": "shengji",
+ "unicode": "e62c",
+ "unicode_decimal": 58924
+ },
+ {
+ "icon_id": "8802621",
+ "name": "升版-升级",
+ "font_class": "shengban-shengji",
+ "unicode": "e643",
+ "unicode_decimal": 58947
+ },
+ {
+ "icon_id": "14915034",
+ "name": "版本升级",
+ "font_class": "banbenshengji-05",
+ "unicode": "e62a",
+ "unicode_decimal": 58922
+ },
+ {
+ "icon_id": "16120758",
+ "name": "ebr_升级",
+ "font_class": "ebr_shengji",
+ "unicode": "e61e",
+ "unicode_decimal": 58910
+ },
+ {
+ "icon_id": "1188726",
+ "name": "facebook_facebook52",
+ "font_class": "facebookfacebook52",
+ "unicode": "e606",
+ "unicode_decimal": 58886
+ },
+ {
+ "icon_id": "9512669",
+ "name": "twitter",
+ "font_class": "twitter-fill",
+ "unicode": "e63d",
+ "unicode_decimal": 58941
+ },
+ {
+ "icon_id": "11983504",
+ "name": "reddit",
+ "font_class": "reddit",
+ "unicode": "ea03",
+ "unicode_decimal": 59907
+ },
+ {
+ "icon_id": "26267561",
+ "name": "discord",
+ "font_class": "discord",
+ "unicode": "e617",
+ "unicode_decimal": 58903
+ },
+ {
+ "icon_id": "26267569",
+ "name": "telegram",
+ "font_class": "telegram",
+ "unicode": "e618",
+ "unicode_decimal": 58904
+ },
+ {
+ "icon_id": "8358884",
+ "name": "踩2",
+ "font_class": "cai4",
+ "unicode": "e691",
+ "unicode_decimal": 59025
+ },
+ {
+ "icon_id": "4485651",
+ "name": "踩",
+ "font_class": "cai1",
+ "unicode": "e602",
+ "unicode_decimal": 58882
+ },
+ {
+ "icon_id": "8358883",
+ "name": "踩1",
+ "font_class": "cai2",
+ "unicode": "e68f",
+ "unicode_decimal": 59023
+ },
+ {
+ "icon_id": "9149167",
+ "name": "点赞",
+ "font_class": "dianzan",
+ "unicode": "e616",
+ "unicode_decimal": 58902
+ },
+ {
+ "icon_id": "9686817",
+ "name": "点赞",
+ "font_class": "dianzan1",
+ "unicode": "e619",
+ "unicode_decimal": 58905
+ },
+ {
+ "icon_id": "68268",
+ "name": "分享",
+ "font_class": "fenxiang",
+ "unicode": "e601",
+ "unicode_decimal": 58881
+ },
+ {
+ "icon_id": "848624",
+ "name": "cai",
+ "font_class": "cai",
+ "unicode": "e62e",
+ "unicode_decimal": 58926
+ },
+ {
+ "icon_id": "849179",
+ "name": "点赞",
+ "font_class": "z-like",
+ "unicode": "e6bf",
+ "unicode_decimal": 59071
+ },
+ {
+ "icon_id": "166176",
+ "name": "小三角down",
+ "font_class": "xiaosanjiaodown",
+ "unicode": "e614",
+ "unicode_decimal": 58900
+ },
+ {
+ "icon_id": "166177",
+ "name": "小三角up",
+ "font_class": "xiaosanjiaoup",
+ "unicode": "e615",
+ "unicode_decimal": 58901
+ },
+ {
+ "icon_id": "145727",
+ "name": "搜索_填充",
+ "font_class": "sousuotianchong",
+ "unicode": "e694",
+ "unicode_decimal": 59028
+ },
+ {
+ "icon_id": "5034919",
+ "name": "搜索",
+ "font_class": "sousuo",
+ "unicode": "e60e",
+ "unicode_decimal": 58894
+ },
+ {
+ "icon_id": "9826654",
+ "name": "通知",
+ "font_class": "tongzhi",
+ "unicode": "e612",
+ "unicode_decimal": 58898
+ },
+ {
+ "icon_id": "7594806",
+ "name": "24gl-folderOpen",
+ "font_class": "gl-folderOpen",
+ "unicode": "eabe",
+ "unicode_decimal": 60094
+ },
+ {
+ "icon_id": "659106",
+ "name": "ic_candleline",
+ "font_class": "iccandleline",
+ "unicode": "e613",
+ "unicode_decimal": 58899
+ },
+ {
+ "icon_id": "741931",
+ "name": "个人 (9)",
+ "font_class": "geren9",
+ "unicode": "e641",
+ "unicode_decimal": 58945
+ },
+ {
+ "icon_id": "844642",
+ "name": "美元6",
+ "font_class": "meiyuan6",
+ "unicode": "e738",
+ "unicode_decimal": 59192
+ },
+ {
+ "icon_id": "3762533",
+ "name": "美元",
+ "font_class": "meiyuan2",
+ "unicode": "e64b",
+ "unicode_decimal": 58955
+ },
+ {
+ "icon_id": "5387627",
+ "name": "美元",
+ "font_class": "meiyuan3",
+ "unicode": "eb1a",
+ "unicode_decimal": 60186
+ },
+ {
+ "icon_id": "5387968",
+ "name": "美元_o",
+ "font_class": "meiyuan_o",
+ "unicode": "eba1",
+ "unicode_decimal": 60321
+ },
+ {
+ "icon_id": "7542786",
+ "name": "24gl-obelus",
+ "font_class": "24gl-obelus",
+ "unicode": "e88f",
+ "unicode_decimal": 59535
+ },
+ {
+ "icon_id": "7542792",
+ "name": "24gl-plusMinus",
+ "font_class": "24gl-plusMinus",
+ "unicode": "e890",
+ "unicode_decimal": 59536
+ },
+ {
+ "icon_id": "8922368",
+ "name": "书本",
+ "font_class": "shuben",
+ "unicode": "e60d",
+ "unicode_decimal": 58893
+ },
+ {
+ "icon_id": "11227027",
+ "name": "4-柱状图",
+ "font_class": "-zhuzhuangtu",
+ "unicode": "e628",
+ "unicode_decimal": 58920
+ },
+ {
+ "icon_id": "12387153",
+ "name": "美元",
+ "font_class": "meiyuan4",
+ "unicode": "e90d",
+ "unicode_decimal": 59661
+ },
+ {
+ "icon_id": "15685587",
+ "name": "箭头_左右切换",
+ "font_class": "jiantou_zuoyouqiehuan",
+ "unicode": "e6eb",
+ "unicode_decimal": 59115
+ },
+ {
+ "icon_id": "16589891",
+ "name": "美元",
+ "font_class": "9meiyuan",
+ "unicode": "e626",
+ "unicode_decimal": 58918
+ },
+ {
+ "icon_id": "18170243",
+ "name": "代码,分支,分流,分叉",
+ "font_class": "code-branch",
+ "unicode": "e993",
+ "unicode_decimal": 59795
+ },
+ {
+ "icon_id": "19009843",
+ "name": "书本-book2",
+ "font_class": "shuben-book2",
+ "unicode": "e644",
+ "unicode_decimal": 58948
+ },
+ {
+ "icon_id": "21732462",
+ "name": "正负",
+ "font_class": "zhengfu",
+ "unicode": "e73d",
+ "unicode_decimal": 59197
+ },
+ {
+ "icon_id": "29890537",
+ "name": "钱包",
+ "font_class": "qianbao-copy",
+ "unicode": "ebb4",
+ "unicode_decimal": 60340
+ },
+ {
+ "icon_id": "5136",
+ "name": "鞋/包",
+ "font_class": "xiebao",
+ "unicode": "e600",
+ "unicode_decimal": 58880
+ },
+ {
+ "icon_id": "49730",
+ "name": "美元",
+ "font_class": "30",
+ "unicode": "e620",
+ "unicode_decimal": 58912
+ },
+ {
+ "icon_id": "313854",
+ "name": "金币",
+ "font_class": "jinbi",
+ "unicode": "e6c8",
+ "unicode_decimal": 59080
+ },
+ {
+ "icon_id": "554343",
+ "name": "美元",
+ "font_class": "iconset0294",
+ "unicode": "e6c1",
+ "unicode_decimal": 59073
+ },
+ {
+ "icon_id": "844637",
+ "name": "美元1",
+ "font_class": "meiyuan1",
+ "unicode": "e733",
+ "unicode_decimal": 59187
+ },
+ {
+ "icon_id": "1727596",
+ "name": "409折线图-线性",
+ "font_class": "zhexiantu-xianxing",
+ "unicode": "e904",
+ "unicode_decimal": 59652
+ },
+ {
+ "icon_id": "2668424",
+ "name": "钱包",
+ "font_class": "qianbao",
+ "unicode": "e646",
+ "unicode_decimal": 58950
+ },
+ {
+ "icon_id": "4294114",
+ "name": "闪电",
+ "font_class": "shandian",
+ "unicode": "e799",
+ "unicode_decimal": 59289
+ },
+ {
+ "icon_id": "5048147",
+ "name": "锤子",
+ "font_class": "chuizi",
+ "unicode": "e61b",
+ "unicode_decimal": 58907
+ },
+ {
+ "icon_id": "5388007",
+ "name": "折线图_o",
+ "font_class": "zhexiantu_o",
+ "unicode": "ebb3",
+ "unicode_decimal": 60339
+ },
+ {
+ "icon_id": "5650485",
+ "name": "房子",
+ "font_class": "icon-test",
+ "unicode": "e603",
+ "unicode_decimal": 58883
+ },
+ {
+ "icon_id": "5969564",
+ "name": "钱包",
+ "font_class": "qianbao1",
+ "unicode": "e61c",
+ "unicode_decimal": 58908
+ },
+ {
+ "icon_id": "6264220",
+ "name": "图标44",
+ "font_class": "tubiao",
+ "unicode": "e610",
+ "unicode_decimal": 58896
+ },
+ {
+ "icon_id": "6953121",
+ "name": "房子01",
+ "font_class": "thin-_home_flat",
+ "unicode": "e611",
+ "unicode_decimal": 58897
+ },
+ {
+ "icon_id": "9525397",
+ "name": "建筑",
+ "font_class": "building",
+ "unicode": "e64a",
+ "unicode_decimal": 58954
+ },
+ {
+ "icon_id": "10352335",
+ "name": "图表",
+ "font_class": "tubiao1",
+ "unicode": "e61d",
+ "unicode_decimal": 58909
+ },
+ {
+ "icon_id": "11520058",
+ "name": "文件夹",
+ "font_class": "wenjianjia",
+ "unicode": "e74a",
+ "unicode_decimal": 59210
+ },
+ {
+ "icon_id": "11855585",
+ "name": "时钟",
+ "font_class": "shizhong",
+ "unicode": "e60c",
+ "unicode_decimal": 58892
+ },
+ {
+ "icon_id": "12753449",
+ "name": "用户管理",
+ "font_class": "yonghuguanli_huaban",
+ "unicode": "e62d",
+ "unicode_decimal": 58925
+ },
+ {
+ "icon_id": "13638712",
+ "name": "图表",
+ "font_class": "tubiao2",
+ "unicode": "e659",
+ "unicode_decimal": 58969
+ },
+ {
+ "icon_id": "15819520",
+ "name": "房子",
+ "font_class": "fangzi",
+ "unicode": "e64f",
+ "unicode_decimal": 58959
+ },
+ {
+ "icon_id": "18165178",
+ "name": "槌子,锤子,敲打,工具",
+ "font_class": "hammer",
+ "unicode": "e87c",
+ "unicode_decimal": 59516
+ },
+ {
+ "icon_id": "21732485",
+ "name": "美元",
+ "font_class": "meiyuan",
+ "unicode": "e73f",
+ "unicode_decimal": 59199
+ },
+ {
+ "icon_id": "5483674",
+ "name": "日历",
+ "font_class": "rili",
+ "unicode": "e71a",
+ "unicode_decimal": 59162
+ },
+ {
+ "icon_id": "9982141",
+ "name": "电池",
+ "font_class": "dianchi",
+ "unicode": "e62b",
+ "unicode_decimal": 58923
+ },
+ {
+ "icon_id": "10283803",
+ "name": "电源管理",
+ "font_class": "changyongtubiao_dianyuanguanlixuanzhong",
+ "unicode": "e605",
+ "unicode_decimal": 58885
+ },
+ {
+ "icon_id": "20733427",
+ "name": "验证码",
+ "font_class": "changyongtubiao-fuben-33",
+ "unicode": "e60a",
+ "unicode_decimal": 58890
+ },
+ {
+ "icon_id": "20733429",
+ "name": "分类",
+ "font_class": "changyongtubiao-fuben-41",
+ "unicode": "e60b",
+ "unicode_decimal": 58891
+ },
+ {
+ "icon_id": "20733455",
+ "name": "券",
+ "font_class": "changyongtubiao-fuben-60",
+ "unicode": "e60f",
+ "unicode_decimal": 58895
+ },
+ {
+ "icon_id": "24330605",
+ "name": "常用_发现",
+ "font_class": "changyong_faxian",
+ "unicode": "e6b0",
+ "unicode_decimal": 59056
+ },
+ {
+ "icon_id": "24333891",
+ "name": "常用_发现 副本",
+ "font_class": "a-changyong_faxianfuben",
+ "unicode": "e6ba",
+ "unicode_decimal": 59066
+ },
+ {
+ "icon_id": "24333904",
+ "name": "常用_链接 副本",
+ "font_class": "a-changyong_lianjiefuben",
+ "unicode": "e6bb",
+ "unicode_decimal": 59067
+ },
+ {
+ "icon_id": "1212315",
+ "name": "消息",
+ "font_class": "xiaoxi",
+ "unicode": "e67c",
+ "unicode_decimal": 59004
+ },
+ {
+ "icon_id": "2378431",
+ "name": "网络",
+ "font_class": "wangluo",
+ "unicode": "e627",
+ "unicode_decimal": 58919
+ },
+ {
+ "icon_id": "5093354",
+ "name": "相机",
+ "font_class": "xiangji",
+ "unicode": "e609",
+ "unicode_decimal": 58889
+ },
+ {
+ "icon_id": "6570225",
+ "name": "手机",
+ "font_class": "shouji",
+ "unicode": "e61a",
+ "unicode_decimal": 58906
+ },
+ {
+ "icon_id": "7127376",
+ "name": "定位",
+ "font_class": "dingwei",
+ "unicode": "e604",
+ "unicode_decimal": 58884
+ }
+ ]
+}
diff --git a/yq/src/assets/icon/iconfont.ttf b/yq/src/assets/icon/iconfont.ttf
new file mode 100644
index 0000000..da0f21e
Binary files /dev/null and b/yq/src/assets/icon/iconfont.ttf differ
diff --git a/yq/src/assets/icon/iconfont.woff b/yq/src/assets/icon/iconfont.woff
new file mode 100644
index 0000000..f88b2a2
Binary files /dev/null and b/yq/src/assets/icon/iconfont.woff differ
diff --git a/yq/src/assets/icon/iconfont.woff2 b/yq/src/assets/icon/iconfont.woff2
new file mode 100644
index 0000000..9c15ab0
Binary files /dev/null and b/yq/src/assets/icon/iconfont.woff2 differ
diff --git a/yq/src/assets/imgs/advantage.png b/yq/src/assets/imgs/advantage.png
new file mode 100644
index 0000000..34bef9d
Binary files /dev/null and b/yq/src/assets/imgs/advantage.png differ
diff --git a/yq/src/assets/imgs/dataAnalysis.png b/yq/src/assets/imgs/dataAnalysis.png
new file mode 100644
index 0000000..8e47a49
Binary files /dev/null and b/yq/src/assets/imgs/dataAnalysis.png differ
diff --git a/yq/src/assets/imgs/doWhat.png b/yq/src/assets/imgs/doWhat.png
new file mode 100644
index 0000000..26679f9
Binary files /dev/null and b/yq/src/assets/imgs/doWhat.png differ
diff --git a/yq/src/assets/imgs/majorFunction.png b/yq/src/assets/imgs/majorFunction.png
new file mode 100644
index 0000000..6b899af
Binary files /dev/null and b/yq/src/assets/imgs/majorFunction.png differ
diff --git a/yq/src/assets/imgs/topbg.jpg b/yq/src/assets/imgs/topbg.jpg
new file mode 100644
index 0000000..4136032
Binary files /dev/null and b/yq/src/assets/imgs/topbg.jpg differ
diff --git a/yq/src/assets/imgs/why.png b/yq/src/assets/imgs/why.png
new file mode 100644
index 0000000..0e33c96
Binary files /dev/null and b/yq/src/assets/imgs/why.png differ
diff --git a/yq/src/assets/logo.png b/yq/src/assets/logo.png
new file mode 100644
index 0000000..f3d2503
Binary files /dev/null and b/yq/src/assets/logo.png differ
diff --git a/yq/src/assets/nav_images/btc .png b/yq/src/assets/nav_images/btc .png
new file mode 100644
index 0000000..3dbdc03
Binary files /dev/null and b/yq/src/assets/nav_images/btc .png differ
diff --git a/yq/src/assets/nav_images/eth .png b/yq/src/assets/nav_images/eth .png
new file mode 100644
index 0000000..2803dd6
Binary files /dev/null and b/yq/src/assets/nav_images/eth .png differ
diff --git a/yq/src/assets/nav_images/usdc .png b/yq/src/assets/nav_images/usdc .png
new file mode 100644
index 0000000..6de9e79
Binary files /dev/null and b/yq/src/assets/nav_images/usdc .png differ
diff --git a/yq/src/assets/style.css b/yq/src/assets/style.css
new file mode 100644
index 0000000..30164a4
--- /dev/null
+++ b/yq/src/assets/style.css
@@ -0,0 +1,5 @@
+/* 全局样式 */
+/* 首字母大写 */
+.capitalize {
+ text-transform: capitalize;
+ }
\ No newline at end of file
diff --git a/yq/src/components/CommonAside.vue b/yq/src/components/CommonAside.vue
new file mode 100644
index 0000000..17aa1b9
--- /dev/null
+++ b/yq/src/components/CommonAside.vue
@@ -0,0 +1,7320 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
BTC
+
+
+
+
+
+
+
+ {{ $t(`menu.Stablecoin`) }}
+
+
+
+
+
+
+
+
+ {{ $t(`menu.other`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.value }}
+
+
+
+
+
+
+
+
+
{{ $t(`home.updateContent`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/components/CommonHeader.vue b/yq/src/components/CommonHeader.vue
new file mode 100644
index 0000000..8812180
--- /dev/null
+++ b/yq/src/components/CommonHeader.vue
@@ -0,0 +1,2132 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/components/HelloWorld.vue b/yq/src/components/HelloWorld.vue
new file mode 100644
index 0000000..8c5434a
--- /dev/null
+++ b/yq/src/components/HelloWorld.vue
@@ -0,0 +1,60 @@
+
+
+
{{ msg }}
+
+ For a guide and recipes on how to configure / customize this project,
+ check out the
+ vue-cli documentation .
+
+
Installed CLI Plugins
+
+
Essential Links
+
+
Ecosystem
+
+
+
+
+
+
+
+
diff --git a/yq/src/components/MessageBoard.vue b/yq/src/components/MessageBoard.vue
new file mode 100644
index 0000000..80d0349
--- /dev/null
+++ b/yq/src/components/MessageBoard.vue
@@ -0,0 +1,613 @@
+
+
+
{{ $t(`message.messageBoard`) }}
+
+ {{ $t(`message.message`) }}
+
+
+
+
+ {{
+ $t(`message.publish`)
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ item.userName }}
+
{{ item.id }} {{ $t(`message.building`) }}
+
+
{{ item.userMsg }}
+
+
+ {{handelTime(item.userDate)}}
+ {{
+ $t(`message.reply`)
+ }}
+
+
+
+
+
+
+
+
+
+
+
{{replySubItem.responser}}
+
{{replySubItem.respon}}
+
+ {{ handelTime(replySubItem.responDate) }}
+ {{
+ $t(`message.reply`)
+ }}
+
+
+
+
+
+
+
+
+ {{
+ $t(`message.determine`)
+ }}
+ {{
+ $t(`message.cancel`)
+ }}
+
+
+
+
+
+
+
+
+ {{ $t(`message.help`) }}
+ {{ praiseNum }}
+ {{ poorNum }}
+
+
+
+
+
+
+
+
+
+
+
+
分享页面到 Twitter
+
分享页面到 Facebook
+
分享页面到 Telegram
+
分享页面到 Reddit
+
分享页面到 discord
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/components/commonFooter.vue b/yq/src/components/commonFooter.vue
new file mode 100644
index 0000000..264773b
--- /dev/null
+++ b/yq/src/components/commonFooter.vue
@@ -0,0 +1,126 @@
+
+
+
+
+ {{item.label}}
+
+
+
+
+
+
+
+
+
+
+
+ ©2022
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/components/dropdownBox.vue b/yq/src/components/dropdownBox.vue
new file mode 100644
index 0000000..2e2340d
--- /dev/null
+++ b/yq/src/components/dropdownBox.vue
@@ -0,0 +1,179 @@
+
+
+
+ Resolution
+
+
+ {{ $t(activeValue) }}
+
+
+
+
+ {{ $t(item.label) }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/components/formula.vue b/yq/src/components/formula.vue
new file mode 100644
index 0000000..4ba4f8c
--- /dev/null
+++ b/yq/src/components/formula.vue
@@ -0,0 +1,1246 @@
+
+
+
+
+
+
+ Address in Profit = total address where Price >= Price_created
+
+
+
+
+
+ Address in Loss = total address where Price < Price_ created
+
+
+
+
+
+
+
+
+
+
+
+ Profit for LTH = number of balance where Price > Price_created and Holder Time >= 155days
+
+
+
+
+
+ Loss for LTH = number of balance where Price <= Price_created and Holder Time >= 155days
+
+
+
+
+
+
+
+ Profit for STH = number of balance where Price > Price_created and Holder Time < 155days
+
+
+
+
+
+ Loss for STH = number of balance where Price <= Price_created and Holder Time < 155days
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Market Cap = price [USD] · Total Supply
+
+
+
+
+
+
+ Realized Cap = value · price created
+
+ [USD] (of all UTXOs)
+
+
+
+
+
+
+
+
+
+
+
+
+ Realized Profit = value · (price spent [USD] - price created [USD] )
+
+
+
(of all spent outputs where price spent > price created )
+
+
+
+
+
+ Realized Loss = value · (price created [USD] - price spent [USD] )
+
+
+
(of all spent outputs where price created > price spent )
+
+
+
+
+
+
+
+
+
+
+
+
+ BalancedPriceUSD = RealisedPriceUSD 一 TransferredPriceUSD
+
+
+
+
+
+
+
+ Unrealized Profit = value · (price [USD] - price created [USD] )
+
+
+
+
(of all UTXOs where price > price created )
+
+
+
+
+
+ Unrealized Loss = value · (price created [USD] - price [USD] )
+
+
+
+
(of all UTXOs where price created > price)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ASOL = Mean{ lifespan [days] (of all spent outputs) }
+
+
+
+
+
+ CDD = value · lifespan [days] (of all spent outputs )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SSR Oscillator = Bollinger_Bands(200,2)
+
+
+
+
+
+ S/F = circulating supply/newly mined bitcoins
+
+
+
+
+
+ S/F Deflection = Price/( circulating supply/newly mined bitcoins)
+
+
+
+
+
+
+
+
+
+
+
+
+ MB = {{ $t(`home.cash`) }} + {{ $t(`home.deposit`) }}
+
+
+
+
+
+ M1 = {{ $t(`home.cash2`) }} + {{ $t(`home.current`) }} + {{ $t(`home.check`) }} + {{ $t(`home.depositCheck`) }}
+
+
+
+
+
+ M2 = M1 + {{ $t(`home.savings`) }} + {{ $t(`home.regular`) }} + {{ $t(`home.otherDeposits`) }}
+
+
+
+
+
+
+
+ Private debt as a percentage of GDP = {{ $t(`home.private`) }} / {{ $t(`home.GDP`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/components/saveData.vue b/yq/src/components/saveData.vue
new file mode 100644
index 0000000..772c411
--- /dev/null
+++ b/yq/src/components/saveData.vue
@@ -0,0 +1,650 @@
+
+
+
+
+
+
+ {{ $t(`menu.homePage`) }}
+
+
+ {{ $t("menu.upgrade") }}
+
+
+ {{ $t("login.exit") }}
+
+ {{ $t("login.customerService") }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ langs }}
+
+
+
+
+
+
+
+
+ {{ $t(`menu.homePage`) }}
+
+ {{ $t("login.exit") }}
+
+ {{ $t("login.customerService") }}
+
+
+
+
+
+
+
+
+
+
+ {{ langs }}
+
+
+
+
+
+
+ {{ $t(`menu.homePage`) }}
+
+ {{ $t("login.exit") }}
+
+ {{ $t("login.customerService") }}
+
+
+
+
+
+
+
+
+
+
+ {{ langs }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/lang/BiAnController/index.js b/yq/src/lang/BiAnController/index.js
new file mode 100644
index 0000000..ab5576e
--- /dev/null
+++ b/yq/src/lang/BiAnController/index.js
@@ -0,0 +1,98 @@
+export const Bian_zh = {
+ bian: {
+ oneMinutes:"1分钟",
+ minutes3:"3分钟",
+ minutes5:"5分钟",
+ minutes15:"15分钟",
+ minutes30:"30分钟",
+ hours1:"1小时",
+ hours2:"2小时",
+ hours4:"4小时",
+ hours6:"6小时",
+ hours8:"8小时",
+ hours12:"12小时",
+ day:"1天",
+ day3:"3天",
+ weekly:"周线",
+ selectCycle:"选择周期",
+ month:"月线",
+ open:"开",
+ high:"高",
+ low:"低",
+ closed:"收",
+ volume:"成交量",
+ assets:"资产",
+ interval:"间隔",
+ month1:"1个月",
+ introduce:"介绍",
+ Real:"实时数据",
+ details:"每日交易详情 数据展示",
+ date:"日期",
+ buy:"买入数量",
+ sell:"卖出数量",
+ block:"块高度",
+ transaction:"交易价格",
+ income:"卖出收益",
+ goal:"目标",
+ cycle:"K线周期",
+ lines:"K线根数",
+ kLineCycle:"请选择K线周期",
+ scanning:"开始扫描",
+ please:"请选择",
+ trading:"交易对",
+ level:"等级",
+ serialNumber:"序号",
+
+ },
+
+
+};
+export const Bian_en = {
+ bian: {
+ oneMinutes:"1 min",
+ minutes3:"3 min",
+ minutes5:"5 min",
+ minutes15:"15 min",
+ minutes30:"30 min",
+ hours1:"1h",
+ hours2:"2h",
+ hours4:"4h",
+ hours6:"6h",
+ hours8:"8h",
+ hours12:"12h",
+ day:"1day",
+ day3:"3days",
+ weekly:"weekly",
+ selectCycle:"Select cycle",
+ month:"month",
+ open:"open",
+ high:"high",
+ low:"low",
+ closed:"closed",
+ volume:"volume",
+ assets:"assets",
+ interval:"interval",
+ month1:"1 month",
+ introduce:"introduce",
+ Real:"Real time data.",
+ details:"Daily trading details data display",
+ date:"date",
+ buy:"Buy the number",
+ sell:"Sell quantity",
+ block:"Block height",
+ transaction:"The transaction price",
+ income:"Sell income",
+ goal:"Goal",
+ cycle:"K line cycle",
+ lines:"The number of K line",
+ kLineCycle:"Please select the K-line period",
+ scanning:"Start scanning",
+ please:"Please select a",
+ trading:"Trading on",
+ level:"level",
+ serialNumber:"number",
+
+ },
+
+
+};
\ No newline at end of file
diff --git a/yq/src/lang/MessageBoard/index.js b/yq/src/lang/MessageBoard/index.js
new file mode 100644
index 0000000..0af3202
--- /dev/null
+++ b/yq/src/lang/MessageBoard/index.js
@@ -0,0 +1,73 @@
+export const MessageBoard_zh = {
+ message:{
+ backstage:"留言板后台",
+ messageBoard:"留言板",
+ message:"我要留言",
+ said:"说点什么...",
+ publish:"发表",
+ building:"楼",
+ reply:"回复",
+ determine:"确定",
+ cancel:"取消",
+ help:"本页面对您是否有帮助?",
+ said1:"我也说一句...",
+ todayMessage:"今日留言数",
+ processedMessage:"已处理留言数",
+ unprocessedMessage:"未处理留言数",
+ historyChart:"留言每日历史图表",
+ unprocessedTabel:"未处理留言列表",
+ num:"编号",
+ userDate:"日期",
+ userName:"用户名",
+ msgPage:"留言页面",
+ userMsg:"留言内容",
+ operation:"操作",
+ inputContent:"输入内容",
+ submitReply:"提交回复",
+ processedTabel:"已处理留言列表",
+ responDate:"回复时间",
+ responser:"回复人",
+ respon:"回复内容",
+ unread:"未读留言标签",
+ unreadTabel:"未读留言列表",
+ submissionTime:"提交时间",
+ submittedTabel:"已提交留言列表",
+ }
+}
+export const MessageBoard_en = {
+ message:{
+ backstage:"Message board backstage",
+ messageBoard:"Message board",
+ message:"I'd like to leave a message.",
+ said:"Say something...",
+ publish:"publish",
+ building:"layer",
+ determine:"determine",
+ cancel:"cancel",
+ help:"This page is helpful to you?",
+ said1:"Let me say something...",
+ reply:"reply",
+ todayMessage:"Number of messages today",
+ processedMessage:"Number of messages processed",
+ unprocessedMessage:"Number of unprocessed messages",
+ historyChart:"Comment daily history chart",
+ unprocessedTabel:"The message list is not processed",
+ num:"number",
+ userDate:"date",
+ userName:"User name",
+ msgPage:"Message page",
+ userMsg:"Message content",
+ operation:"operation",
+ inputContent:"Input content",
+ submitReply:"Submit a reply",
+ processedTabel:"The message list has been processed",
+ responDate:"Recovery time",
+ responser:"responder",
+ respon:"Reply content",
+ unread:"Unread message label",
+ unreadTabel:"List of unread messages",
+ submissionTime:"Submission time",
+ submittedTabel:"A list of comments has been submitted",
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/lang/arh999/index.js b/yq/src/lang/arh999/index.js
new file mode 100644
index 0000000..89e9457
--- /dev/null
+++ b/yq/src/lang/arh999/index.js
@@ -0,0 +1,46 @@
+export const arh_zh = {
+ arh: {
+ graph:"arh999囤币及逃顶指标",
+ dayGraph:"最近24小时数据图",
+ jzr:"江卓尔60日累计涨幅",
+ ma370:"2年移动平均价格乘数",
+ ndaq:"纳斯达克日K",
+ btc:"BTC日K",
+ pleaseTrade:"请选择交易对",
+ contracts:"未平仓合约数",
+ trading:"交易对",
+ time:"时间",
+ pleaseInterval:"请选择时间间隔",
+ search:"搜索",
+ distribution:"持有者地址数分布( 按余额分段)",
+ ratio:"持有者地址数分布( 按余额分段)比率分布",
+ ratio1:" 持有者币数量分布(按余额分段)",
+ ratio2:" 持有者币数量分布(按余额分段)比率分布",
+ },
+
+
+};
+export const arh_en = {
+ arh: {
+ graph:"arh999 hoarding and escape top index",
+ dayGraph:"Data chart for the last 24 hours",
+ jzr:"Jiang Zhuoer 60-day Cumulative Increase And Decrease",
+ ma370:"2 year moving average price multiplier",
+ ndaq:"Nasdaq Daily K",
+ btc:"BTC Daily K",
+ pleaseTrade:"Please select a trade pair",
+ contracts:"Number of contracts open interest",
+ trading:"Trading on",
+ time:"time",
+ pleaseInterval:"Please select an interval",
+ search:"search",
+ distribution:"Balance - number of holders distribution",
+ ratio:"Balance to holder ratio distribution",
+ ratio1:"Balance - the distribution of the number of coins held",
+ ratio2:"The balance to holder ratio distribution",
+
+
+},
+
+
+};
\ No newline at end of file
diff --git a/yq/src/lang/aside/index.js b/yq/src/lang/aside/index.js
new file mode 100644
index 0000000..2f8b8c4
--- /dev/null
+++ b/yq/src/lang/aside/index.js
@@ -0,0 +1,654 @@
+export const aside_zh = {
+ menu: {
+ onchain: "链上数据",
+ onchain1: "大额交易",
+ onchain2: "地址统计",
+ onchain3: "区块实时交易量",
+ onchain4: "日交易详情",
+ onchain5: "地址数分布",
+ onchain5I:"(余额)地址数分布",
+ onchain6: "币数量分布",
+ onchain6I: "(余额)币数量分布",
+ onchain7: "地址数分布",
+ onchain7I: "(时间)地址数分布",
+ onchain8: "币数量分布",
+ onchain8I: "(时间)币数量分布",
+ onchain9: "地址数分布",
+ onchain9I: "(价格)地址数分布",
+ onchain10: "币数量分布",
+ onchain10I: "(价格)币数量分布",
+ onchain11: "地址数分布",
+ onchain11I: "(价差)地址数分布",
+ onchain12: "币数量分布",
+ onchain12I: "(价差)币数量分布",
+ onchain13: "地址数分布",
+ onchain13I: "(盈利)地址数分布",
+ onchain14: "币数量分布",
+ onchain14I: "(盈利)币数量分布",
+ onchain15: "巨鲸地址列表",
+ onchain16: "巨鲸交易监控",
+ onchain17: "币价当前市值排名",
+ coinmarketall: "币价当前市值排名",
+ onchain18: "地址对应标记持有者名称关系列表",
+ onchain19: "交易统计",
+ onchain20: "矿工余额",
+ onchain21: "矿工余额",
+ technology: "技术指标",
+ technology1: "MVRV Ratio",
+ mvrv: "MVRV Ratio",
+ technology2: "MVRV Z-Score",
+ technology3: "NVTRatio",
+ technology4: "NVTSignal",
+ technology5: "日K线",
+ technology6: "江卓尔60日累计涨幅",
+ jzr60: "江卓尔60日累计涨幅",
+ technology7: "arh999囤币及逃顶指标",
+ arh999: "arh999囤币及逃顶指标",
+ technology8: "天针",
+ technology9: "ETF持有比特币",
+ technology10: "ETF比特币变动",
+ technology11: "2年移动平均价格乘数",
+ ma730: "2年移动平均价格乘数",
+ technology12: "已实现流通市值",
+ technology13: "资金费率",
+ technology14: "未平仓合约数",
+ technology15: "合约主动买入量",
+ technology16: "每日已实现盈利交易占比",
+ technology17: "已花费输出盈利比",
+ SOPR: "已花费输出盈利比",
+ technology18: "已花费输出平均寿命",
+ asol: "已花费输出平均寿命",
+ technology19: "已花费输出休眠平均天数",
+ technology20: "币天销毁量年龄分布",
+ soag: "币天销毁量年龄分布",
+ technology21: "流通供应量",
+ technology22: "累计币天销毁量(流通供应量)",
+ technology23: "累计币天销毁量",
+ technology24: "活跃度",
+ technology25: "已实现盈利量",
+ technology26: "已实现亏损量",
+ technology27: "已实现净收益损失比",
+ technology28: "流通市值",
+ marketcap: "流通市值",
+ technology29: "已实现流通市值",
+ rcap: "已实现流通市值",
+ technology30: "长期持有者 MVRV Ratio",
+ lthmvrv: "长期持有者 MVRV Ratio",
+ technology31: "短期持有者 MVRV Ratio",
+ sthmvrv: "短期持有者 MVRV Ratio",
+ technology32: "未实现的净收益损失比",
+ nupl: "未实现的净收益损失比",
+ technology33: "未实现的净收益量",
+ technology34: "未实现的净亏损量",
+ technology35: "长持者未实现的净收益损失比",
+ lthnupl: "长持者未实现的净收益损失比",
+ technology36: "短持者未实现的净收益损失比",
+ sthnupl: "短持者未实现的净收益损失比",
+ technology37: "币天销毁量",
+ CDD: "币天销毁量",
+ macro: "宏观经济指标",
+ macro1: "纳斯达克指数",
+ macro2: "纳斯达克指数 vs BTC",
+ exchange: "交易所数据",
+ exchange1: "合约K线",
+ exchange2: "交易量",
+ address: "地址",
+ address1: "活动地址",
+ address2: "每日活跃地址数",
+ address3: "每日发起交易地址数",
+ address4: "每日收到交易地址数",
+ address5: "新增地址",
+ address6: "每日新增地址数",
+ address7: "地址总数",
+ transactions: "交易汇总",
+ transactions1: "交易规模",
+ transactions2: "每天交易规模",
+ transactions3: "每秒交易规模",
+ transactions4: "交易量",
+ transactions5: "成交次数",
+ transactions6: "日成交率",
+ Distribution: "分配数据",
+ Distribution1: "地址余额 ≥0.1",
+ Distribution2: "地址余额 ≥0.01",
+ Distribution3: "地址余额 ≥1",
+ Distribution4: "地址余额 ≥10 ",
+ Distribution5: "地址余额 ≥100",
+ Distribution6: "地址余额 ≥1000",
+ Distribution7: "地址余额 ≥10000 ",
+ derivatives: "主要交易所衍生数据",
+ derivatives1: "具体数据",
+ derivatives2: "交易所日交易量",
+ derivatives3: "交易所笔数变动",
+ // Currency: "持有者币龄地址数/币数量分布图", 删除
+ Currency1: "持有者地址数详细分布(按持有时间分段)",
+ Currency2: "余额<0.01",
+ Currency2I: "(地址)余额<0.01",
+ balanceData1: "余额<0.01",
+ Currency3: "余额>=0.01 & < 0.1",
+ Currency3I: "(地址)余额>=0.01 & < 0.1",
+ balanceData2: "余额>=0.01 & < 0.1",
+ Currency4: "余额>=0.1 & < 1",
+ Currency4I: "(地址)余额>=0.1 & < 1",
+ balanceData3: "余额>=0.1 & < 1",
+ Currency5: "余额>=1 & < 10",
+ Currency5I: "(地址)余额>=1 & < 10",
+ balanceData4: "余额>=1 & < 10",
+ Currency6: "余额>=10 & < 100",
+ Currency6I: "(地址)余额>=10 & < 100",
+ balanceData5: "余额>=10 & < 100",
+ Currency7: "余额>=100 & < 1000",
+ Currency7I: "(地址)余额>=100 & < 1000",
+ balanceData6: "余额>=100 & < 1000",
+ Currency8: "余额>=1000 & < 10000",
+ Currency8I: "(地址)余额>=1000 & < 10000",
+ balanceData7: "余额>=1000 & < 10000",
+ Currency9: "余额>=10000",
+ Currency9I: "(地址)余额>=10000",
+ balanceData8: "余额>=10000",
+ Currency10: "持有者币数量详细分布(按持有时间分段)",
+ Currency11: "余额<0.01",
+ Currency11I: "(币数量)余额<0.01",
+ balanceData9: "余额<0.01",
+ Currency12: "余额>=0.01 & < 0.1",
+ Currency12I: "(币数量)余额>=0.01 & < 0.1",
+ balanceData10: "余额>=0.01 & < 0.1",
+ Currency13: "余额>=0.1 & < 1",
+ Currency13I: "(币数量)余额>=0.1 & < 1",
+ balanceData11: "余额>=0.1 & < 1",
+ Currency14: "余额>=1 & < 10",
+ Currency14I: "(币数量)余额>=1 & < 10",
+ balanceData12: "余额>=1 & < 10",
+ Currency15: "余额>=10 & < 100",
+ Currency15I: "(币数量)余额>=10 & < 100",
+ balanceData13: "余额>=10 & < 100",
+ Currency16: "余额>=100 & < 1000",
+ Currency16I: "(币数量)余额>=100 & < 1000",
+ balanceData14: "余额>=100 & < 1000",
+ Currency17: "余额>=1000 & < 10000",
+ Currency17I: "(币数量)余额>=1000 & < 10000",
+ balanceData15: "余额>=1000 & < 10000",
+ Currency18: "余额>=10000",
+ Currency18I: "(币数量)余额>=10000",
+ balanceData16: "余额>=10000",
+ large: "大额交易数据",
+ large1: "USDT大额交易监控",
+ large2: "USDC大额交易监控",
+ large5: "BUSD大额监控",
+ large3: "USDT日交易量",
+ large4: "USDC日交易量",
+ interval: "1月",
+ interval1: "历史数据",
+ interval2: "1周",
+ interval3: "1天",
+ interval4: "5分钟",
+ interval5: "无",
+ interval6: "1周及实时数据",
+ interval7: "默认1天,可根据选择时间间隔查询",
+ interval8: "选择交易对查询",
+ interval9: "通过查询时间间隔显示数据,默认5分钟",
+ interva20: "折线图:1月数据,表格:2天",
+ interva21: "条件查询显示",
+ interva22: "折线图:1月数据,表格:1周",
+ interva23: "所有数据 无时间线",
+ interva24:"8小时",
+ technology38:"Puell Multiple",
+ market:"市场指标",
+ nonChain:"非链数据",
+ transactionMonitoring:"大额交易监控",
+ holders:"持有者分布",
+ circulation:"流通量",
+ profitAddress:"盈利地址数",
+ lossAddress:"亏损地址数",
+ profitRatio:"地址盈亏比",
+ lthSupply:"长期持有者供应量",
+ lthSupply2:"长期持有者供应量",
+ sthSupply:"短期持有者供应量",
+ sthSupply2:"短期持有者供应量",
+ realizedPrice:"已实现价格",
+ relativeLthSth:"长/短期持有者供应量盈亏比",
+ relativeLthSth2:"长/短期持有者供应量盈亏比",
+ lthProfitSupply:"长期持有者盈利供应量",
+ lthProfitSupply2:"长期持有者盈利供应量",
+ lthLossSupply:"长期持有者亏损总供应量",
+ lthLossSupply2:"长期持有者亏损总供应量",
+ sthProfitSupply:"短期持有者盈利供应量",
+ sthProfitSupply2:"短期持有者盈利供应量",
+ sthLossSupply:"短期持有者亏损供应量",
+ sthLossSupply2:"短期持有者亏损供应量",
+ sthProfitRatio:"短期持有者盈亏比",
+ sthProfitRatio2:"短期持有者盈亏比",
+ SLRVRatio:"短期到长期实现价值比率",
+ SLRVRatio2:"短期到长期实现价值比率",
+ lthProfitRatio:"长期持有者盈亏比",
+ lthProfitRatio2:"长期持有者盈亏比",
+ lthVolume:"长期持有者每日交易量",
+ lthVolume2:"长期持有者每日交易量",
+ frm:"交易汇率乘数",
+ cvdd:"累积价值-销毁天数比",
+ cvdd2:"累积价值-销毁天数比",
+ balancedPrice:"已平衡价格",
+ nvtRatio:"市盈率",
+ nvtRatio2:"市盈率",
+ velocity:"流通速度",
+ holderAddress:"持有者地址数分布",
+ upgrade:"升级账户",
+ PiCycleTopIndicator:"PI周期顶指标",
+ ssr:"稳定币供应比",
+ ssro:"稳定币供应比振荡器",
+ stfRatio:"库存/新发行比",
+ stfDeflection:"库存/新发行偏差",
+ goldenRatioMult:"黄金比例乘数",
+ Miners:"矿工",
+ Network:"网络",
+ LongShort:"长/短期持有者",
+ ProfitLoss:"盈亏",
+ Lifetime:"币龄",
+ Ratio:"比率",
+ Holder:"持有者分布",
+ balanceGroup:"按余额划分",
+ timeGroup:"按持有时间划分",
+ priceGroup:"按买入价格划分",
+ PriceDifference:"按买卖价差划分",
+ profitGroup:"按盈利划分",
+ addressGroup:"地址详细分布",
+ CoinQuantity:"币数量详细分布",
+ earcap:"已实现流通市值(找零消除)",
+ earcap2:"已实现流通市值(找零消除)",
+ btcBalance:"交易所余额",
+ tzbp:"时区购买力",
+ bobp:"买入大单挂单",
+ bosp:"卖出大单挂单",
+ volumeProfile:"成交量分布图",
+ exchange10:"交易所余额",
+ dataMonitoring:"访问统计",
+ quickNews:"市场快讯",
+ economics:"财经日历",
+ currencyBTC:"BTC",
+ currencyETH:"ETH",
+ Stablecoin:"稳定币",
+ mempool:"待交易池详情",
+ nvtSign:"NVT信号",
+ homePage:"首页",
+ USTreasuriesYields:"国债收益率",
+ MoneyStockMeasures:"货币供应量",
+ loanPsi:"私营部门贷款",
+ loanGdp:"私人债务占GDP比重",
+ wei:"每周经济指数",
+ distributionLthSth:"长/短期持有者供应量盈亏分布",
+ macroscopic:"宏观经济(美国)",
+ other:"其他",
+ BTCMenu:"BTC",
+ ETHMenu:"ETH",
+ stableMenu:"稳定币",
+ macroscopicMenu:"宏观经济指标",
+ exchangeRate:"实时汇率",
+ GDP:"GDP",
+ newAddress:"新地址数",
+ newAddressVolume:"新地址交易量",
+ TransactionVolume:"交易量",
+ adjusted:"交易量(找零消除)",
+ TransactionFee:"交易费",
+ totalAddress:"总地址数",
+ minerBalance:"矿工地址余额",
+ minerAddress:"矿工地址数",
+ TransactionCount:"交易内存池数量",
+ memoryPoolFees:"交易内存池费用",
+ saCDD:"币天销毁量(供应调整)",
+ sadormancy:"已花费输出休眠平均天数(供应量调整)",
+ sellRatio:"合约主动买入量(买卖比率)",
+ balanceGroup2:"按余额划分地址数分布",
+ currencyGroup:"按余额划分币数量分布",
+ addressBalance:"余额 < 0.01",
+ addressBalance1:"余额 >=0.01 & <0.1",
+ addressBalance2:"余额 >=0.1 & <1",
+ addressBalance3:"余额 >=1 & <10",
+ addressBalance4:"余额 >=10 & <100",
+ addressBalance5:"余额 >=100 & <1000",
+ addressBalance6:"余额 >=1000 & <10000",
+ addressBalance7:"余额 >=10000",
+ currencyGroup1:"余额 < 0.01",
+ currencyGroup2:"余额 >=0.01 & <0.1",
+ currencyGroup3:"余额 >=0.1 & <1",
+ currencyGroup4:"余额 >=1 & <10",
+ currencyGroup5:"余额 >=10 & <100",
+ currencyGroup6:"余额 >=100 & <1000",
+ currencyGroup7:"余额 >=1000 & <10000",
+ currencyGroup8:"余额 >=10000",
+ activeAddresses:"活跃地址数",
+ ReceiveAddresses:"接收地址数",
+ SendAddresses:"发送地址数",
+ USDCETH:"USDC On ETH大额交易",
+ USDTETH:"USDT On ETH大额交易",
+ vdd:"价值损毁天数倍数",
+ },
+
+
+};
+export const aside_en = {
+ menu: {
+ onchain: "Onchain",
+ onchain1: "Big Amount Transaction",
+ onchain2: "Address Statistics",
+ onchain3: "Block Real-time Trading Volume",
+ onchain4: "Daily Transaction Details",
+ onchain5: "Address Distribution of Holder",
+ onchain5I:"(balance)Address Distribution of Holder",
+ onchain6: "Supply Distribution of Holder",
+ onchain6I: "(balance)Supply Distribution of Holder",
+ onchain7: "Address Distribution of Holder",
+ onchain7I: "(time)Address Distribution of Holder",
+ onchain8: "Supply Distribution of Holder",
+ onchain8I: "(time)Supply Distribution of Holder",
+ onchain9: "Address Distribution of Holder",
+ onchain9I: "(price)Address Distribution of Holder",
+ onchain10: "Supply Distribution of Holder",//
+ onchain10I: "(price)Supply Distribution of Holder",//
+ onchain11: "Address Distribution of Holder",
+ onchain11I: "(Price difference)Address Distribution of Holder",
+ onchain12: "Supply Distribution of Holder",
+ onchain12I: "(Price difference)Supply Distribution of Holder",
+ onchain13: "Address Distribution of Holder",
+ onchain13I: "(profit)Address Distribution of Holder",
+ onchain14: "Supply Distribution of Holder",
+ onchain14I: "(profit)Supply Distribution of Holder",
+ onchain15: "Whale Address List",
+ onchain16: "Whale trade monitoring",
+ onchain17: "Makret Value of the Currency",
+ coinmarketall:"The current market value of the currency",
+ onchain18: "Addresses correspond to a relational list of tag holder names",
+ onchain19: "Transaction statistics",
+ onchain20: "Miner Balance",
+ onchain21: "Miner Balance",
+ technology: "Technical indicators",
+ technology1: "MVRV Ratio",
+ mvrv:"Market Value To Realized Value(MVRV) Ratio",
+ technology2: "MVRV Z-Score",
+ technology3: "NVTRatio",
+ technology4: "NVTSignal",
+ technology5: "day K line",
+ technology6: "Jiang Zhuoer 60-day Cumulative Gain",
+ jzr60:"Jiang Zhuoer 60-day Cumulative Increase and Decrease",
+ technology7: "ahr999 hoarding index",
+ arh999:"ahr999 Hoarding and Escape Top Index",
+ technology8: "Days needle",
+ technology9: "ETF hold bitcoins",
+ technology10: "ETF Bitcoin moves",
+ technology11: "2-Year MA Multiplier",
+ ma730:"2 Years Moving Average Price Multiplier",
+ technology12: "Realized capitalization",
+ technology13: "Funding Rate",
+ technology14: "Number of Open Interest",
+ technology15: "Perpetual By Active Buying",
+ technology16: "Daily Percent UTXOs in Profit",
+ technology17: "SOPR",
+ SOPR:"Spent Output Profit Ratio (SOPR)",
+ technology18: "ASOL",
+ asol:"Average Spent Output Lifespan(ASOL)",
+ technology19: "Dormancy",
+ technology20: "Age distribution of CDD",
+ soag:"Age distribution of Coin Days Destoryed(CDD)",
+ technology21: "Circulating Supply",
+ technology22: "Cumulative Circulating Supply",
+ technology23: "Cumulative Coin Days Destroyed",
+ technology24: "Liveliness",
+ technology25: "Realized Profit",
+ technology26: "Realized Loss",
+ technology27: "Realized Profit/Loss Ratio",
+ technology28: "Market Cap",
+ marketcap:"Market Cap [USD]",
+ technology29: "Realized Cap",
+ rcap:"Realized Cap [USD]",
+ technology30: "LTH MVRV",
+ lthmvrv:"Long-Term Holder(LTH) MVRV",
+ technology31: "STH MVRV",
+ sthmvrv:"Short-Term Holder (STH) MVRV",
+ technology32: "NUPL",
+ nupl:"Net Unrealized Profit/Loss(NUPL)",
+ technology33: "Unrealized Profit",
+ technology34: "Unrealized Loss",
+ technology35: "LTH NUPL",
+ lthnupl:"Long Term Holder NUPL",
+ technology36: "STH NUPL",
+ sthnupl:"Short Term Holder NUPL",
+ technology37: "CDD",
+ CDD:"Coin Days Destoryed(CDD)",
+ macro: "Macroeconomic Indicators",
+ macro1: "NDAQ index",
+ macro2: "NDAQ index Vs BTC",
+ exchange: "Exchange Data",
+ exchange1: "Contract K line",
+ exchange2: "Trading volume",
+ address: "Addresses",
+ address1: "Activities address",
+ address2: "Number of active addresses per day",
+ address3: "Number of address initiates per day",
+ address4: "Number of transaction addresses received per day",
+ address5: "The new address",
+ address6: "Number of newly added addresses per day",
+ address7: "The total number of addresses",
+ transactions: "The transactions",
+ transactions1: "deals The size of the ",
+ transactions2: "Daily trading size",
+ transactions3: "Transaction size per second",
+ transactions4: "Trading volume",
+ transactions5: "Clinch a deal the number",
+ transactions6: "Day of closing",
+ Distribution: "Distribution of data",
+ Distribution1: "Address the balance ≥0.1",
+ Distribution2: "Address the balance ≥0.01",
+ Distribution3: "Address the balance ≥1",
+ Distribution4: "Address the balance ≥10 ",
+ Distribution5: "Address the balance ≥100",
+ Distribution6: "Address the balance ≥1000",
+ Distribution7: "Address the balance ≥10000 ",
+ derivatives: "Major exchange derivatives data",
+ derivatives1: "The specific data",
+ derivatives2: "Daily exchange volume",
+ derivatives3: "Changes in the number of transactions",
+ Currency: "Distribution map of address number of holder coin age/coin quantity",
+ Currency1: "Detailed Distribution of Holder addresses (by time held)",
+ Currency2: "The balance of>=0 and <0.01",
+ Currency2I: "(address)The balance of>=0 and <0.01",
+ balanceData1:"Address Distribution(The balance of>=0 and <0.01)",
+ Currency3: "The balance of>=0.01 and <0.1",
+ Currency3I: "(address)The balance of>=0.01 and <0.1",
+ balanceData2:"Address Distribution(The balance of>=0.01 and <0.1)",
+ Currency4: "The balance of>=0.1 and <1",
+ Currency4I: "(address)The balance of>=0.1 and <1",
+ balanceData3:"Address Distribution(The balance of>=0.1 and <1)",
+ Currency5: "The balance of>=1 and <10",
+ Currency5I: "(address)The balance of>=1 and <10",
+ balanceData4:"Address Distribution(The balance of>=1 and <10)",
+ Currency6: "The balance of>=10 and <100",
+ Currency6I: "(address)The balance of>=10 and <100",
+ balanceData5:"Address Distribution(The balance of>=10 and <100)",
+ Currency7: "The balance of>=100 and <1000",
+ Currency7I: "(address)The balance of>=100 and <1000",
+ balanceData6:"Address Distribution(The balance of>=100 and <1000)",
+ Currency8: "The balance of>=1000 and <10000",
+ Currency8I: "(address)The balance of>=1000 and <10000",
+ balanceData7:"Address Distribution(The balance of>=1000 and <10000)",
+ Currency9: "The balance of>=10000",
+ Currency9I: "(address)The balance of>=10000",
+ balanceData8:"Address Distribution(The balance of>=10000)",
+ Currency10: "Detailed distribution of the number of holders' coins (by holding time)",
+ Currency11: "The balance of>=0 and <0.01",
+ Currency11I: "(Number of coins)The balance of>=0 and <0.01",
+ balanceData9:"Supply Distribution(The balance of>=0 and <0.01)",
+ Currency12: "The balance of>=0.01 and <0.1",
+ Currency12I: "(Number of coins)The balance of>=0.01 and <0.1",
+ balanceData10:"Supply Distribution(The balance of>=0.01 and <0.1)",
+ Currency13: "The balance of>=0.1 and <1",
+ Currency13I: "(Number of coins)The balance of>=0.1 and <1",
+ balanceData11:"Supply Distribution(The balance of>=0.1 and <1)",
+ Currency14: "The balance of>=1 and <10",
+ Currency14I: "(Number of coins)The balance of>=1 and <10",
+ balanceData12:"Supply Distribution(The balance of>=1 and <10)",
+ Currency15: "The balance of>=10 and <100",
+ Currency15I: "(Number of coins)The balance of>=10 and <100",
+ balanceData13:"Supply Distribution(The balance of>=10 and <100)",
+ Currency16: "The balance of>=100 and <1000",
+ Currency16I: "(Number of coins)The balance of>=100 and <1000",
+ balanceData14:"Supply Distribution(The balance of>=100 and <1000)",
+ Currency17: "The balance of>=1000 and <10000",
+ Currency17I: "(Number of coins)The balance of>=1000 and <10000",
+ balanceData15:"Supply Distribution(The balance of>=1000 and <10000)",
+ Currency18: "The balance of>=10000",
+ Currency18I: "(Number of coins)The balance of>=10000",
+ balanceData16:"Supply Distribution(The balance of>=10000)",
+ large: "Large transaction data",
+ large1: "USDT large transaction monitoring",
+ large2: "USDC large transaction monitoring",
+ large3: "Daily trading volume of USDT",
+ large4: "Daily trading volume of USDC",
+ interval: "Last month",
+ interval1: "The historical data",
+ interval2: "week",
+ interval3: "day",
+ interval4: "5 minutes",
+ interval5: "There is no",
+ interval6: "1 week and real-time data",
+ interval7: "The default is 1 day, which can be queried according to the selected time interval",
+ interval8: "Select transaction pair query",
+ interval9: "Display data through the query interval. Default is 5 minutes.",
+ interva20: "Line chart: January data, table: 2 days",
+ interva21: "Conditional query display",
+ interva22: "Line chart: January data, table: 1 week",
+ interva23: "All data has no time line",
+ interva24:"8 hours",
+ technology38:"Puell Multiple",
+ market:"Market Indicators",
+ nonChain:"Off link data",
+ transactionMonitoring:"Large transaction monitoring",
+ holders:"Distribution of holders",
+ circulation:"Flux Of Circulation",
+ profitAddress:"Address in Profit",
+ lossAddress:"Address in Loss",
+ profitRatio:"Percent of Address in Profit",
+ lthSupply:"Total Supply Held by LTH",
+ lthSupply2:"Total Supply Held by Long-Term Holders(LTH)",
+ sthSupply:"Total Supply Held by STH",
+ sthSupply2:"Total Supply Held by Short-Term Holders(STH)",
+ realizedPrice:"Realized Price",
+ lthProfitSupply:"Total Supply in Profit Held by LTH",
+ lthProfitSupply2:"Total Supply in Profit Held by Long-Term Holders(LTH)",
+ lthLossSupply:"Total Supply in Loss Held by LTH",
+ lthLossSupply2:"Total Supply in Loss Held by Long-Term Holders(LTH)",
+ sthProfitSupply:"Total Supply in Profit Held by STH",
+ sthProfitSupply2:"Total Supply in Profit Held by Short-Term Holders(STH)",
+ sthLossSupply:"Total Supply in Loss Held by STH",
+ sthLossSupply2:"Total Supply in Loss Held by Short-Term Holders(STH)",
+ sthProfitRatio:"STH Profit/Loss Ratio",
+ sthProfitRatio2:"Short-Term Holder (STH) Profit/Loss Ratio",
+ SLRVRatio:"SLRV Ratio",
+ SLRVRatio2:"Short to Long-Term Realized Value (SLRV) Ratio",
+ lthProfitRatio:"LTH Profit/Loss Ratio",
+ lthProfitRatio2:"Long-Term Holder (LTH) Profit/Loss Ratio",
+ relativeLthSth:"LTH/STH Supply in Profit/Loss",
+ relativeLthSth2:"Long- and Short-Term Holder Supply in Profit/Loss",
+ lthVolume:"LTH Daily Volume",
+ lthVolume2:"Long-Term Holder(LTH) Daily Volume",
+ frm:"Fee Ratio Multiple(FRM)",
+ cvdd:"CVDD",
+ cvdd2:"Cumulative Value-Days Destroyed (CVDD)",
+ balancedPrice:"Balanced Price",
+ nvtRatio:"NVT Ratio",
+ nvtRatio2:"Network Value to Transactions(NVT) Ratio",
+ velocity:"Velocity",
+ holderAddress:"Holder address number distribution",
+ upgrade:"Upgrade Plan",
+ piCycleTopIndicator:"Pi Cycle Top Indicator",
+ ssr:"Stablecoin Supply Ratio (SSR)",
+ ssro:"Stablecoin Supply Ratio (SSR) Oscillator",
+ stfRatio:"Stock-to-Flow Ratio",
+ stfDeflection:"Stock-to-Flow Deflection",
+ goldenRatioMult:"Golden Ratio Multiplier",
+ Miners:"Miners",
+ Network:"Network info",
+ LongShort:"Long/Short Term",
+ ProfitLoss:"Profit/Loss",
+ Lifetime:"Coin lifespan",
+ Ratio:"Ratio",
+ Holder:"Holder",
+ balanceGroup:"By Balance",
+ timeGroup:"By Holding Time",
+ priceGroup:"By Buying Price",
+ PriceDifference:"By Price Gap",
+ profitGroup:"By Profit",
+ addressGroup:"Address Detail",
+ CoinQuantity:"Supply Detail",
+ earcap:"Entity-adjusted Realized Cap",
+ earcap2:"Entity-adjusted Realized Cap [USD]",
+ btcBalance:"Exchange Balance (BTC)",
+ tzbp:"Buy Power for Time Zone",
+ bobp:"Buy Power for Big Order",
+ bosp:"Sell Power for Big Order",
+ volumeProfile:"Volume Profile",
+ PiCycleTopIndicator:"Pi Cycle Top Indicator",
+ exchange10:"Exchange Balance",
+ dataMonitoring:"Summary",
+ quickNews:"Market News",
+ economics:"Economic Calendar",
+ currencyBTC:"BTC",
+ currencyETH:"ETH",
+ Stablecoin:"Stablecoin",
+ mempool:"Mempool Transactions",
+ nvtSign:"Network Value to Transactions Signal",
+ homePage:"homePage",
+ USTreasuriesYields:"TreasuriesYields",
+ MoneyStockMeasures:"currency supply",
+ loanPsi:"loans to private sector",
+ loanGdp:"Private debt as a percentage of GDP",
+ wei:"Weekly Economic Index",
+ distributionLthSth:"LTH/STH Supply Distribution",
+ macroscopic:"Macroeconomics (United States)",
+ other:"other",
+ BTCMenu:"BTC",
+ ETHMenu:"ETH",
+ stableMenu:"Stable currency",
+ macroscopicMenu:"Macroeconomics",
+ exchangeRate:"Real time exchange rate",
+ GDP:"Gross Domestic Product",
+ newAddress:"New Addresses",
+ newAddressVolume:"New Addresses Volume",
+ TransactionVolume:"Transactions Volume",
+ adjusted:"Transactions Volume(Entity-Adjusted)",
+ TransactionFee:"Transactions Fee",
+ totalAddress:"Total Addresses",
+ minerBalance:"Miner Balance",
+ minerAddress:"Miner Addresses",
+ TransactionCount:"Mempool Transactions Count",
+ memoryPoolFees:"Mempool Transactions Fees",
+ saCDD:"Supply-Adjusted CDD",
+ sadormancy:"Supply-Adjusted Dormancy",
+ sellRatio:"Perpetual By Active Buying(Buy & Sell Ratio)",
+ balanceGroup2:"By Balance Address Distribution of Holder",
+ currencyGroup:"By Balance Supply Distribution of Holder",
+ addressBalance:"Balance < 0.01",
+ addressBalance1:"Balance >=0.01 and Balance <0.1",
+ addressBalance2:"Balance >=0.1 and Balance <1",
+ addressBalance3:"Balance >=1 and Balance <10",
+ addressBalance4:"Balance >=10 and Balance <100",
+ addressBalance5:"Balance >=100 and Balance <1000",
+ addressBalance6:"Balance >=1000 and Balance <10000",
+ addressBalance7:"Balance >=10000",
+ currencyGroup1:"Balance < 0.01",
+ currencyGroup2:"Balance >=0.01 and Balance <0.1",
+ currencyGroup3:"Balance >=0.1 and Balance <1",
+ currencyGroup4:"Balance >=1 and Balance <10",
+ currencyGroup5:"Balance >=10 and Balance <100",
+ currencyGroup6:"Balance >=100 and Balance <1000",
+ currencyGroup7:"Balance >=1000 and Balance <10000",
+ currencyGroup8:"Balance >=10000",
+ activeAddresses:"Active Addresses",
+ ReceiveAddresses:"Receive Addresses",
+ SendAddresses:"Send Addresses",
+ USDCETH:"USDC(ETH) Big Amount Transaction",
+ USDTETH:"USDT(ETH) Big Amount Transaction",
+ vdd:"Value Days Destroyed (VDD) Multiple",
+
+
+ },
+
+
+};
\ No newline at end of file
diff --git a/yq/src/lang/asideEth/index.js b/yq/src/lang/asideEth/index.js
new file mode 100644
index 0000000..9b1a747
--- /dev/null
+++ b/yq/src/lang/asideEth/index.js
@@ -0,0 +1,272 @@
+export const asideEth_zh = {
+ menu2: {
+ onchain: "链上数据",
+ onchain1: "大额交易",
+ onchain2: "巨鲸地址列表",
+ onchain18: "地址对应标记持有者名称关系列表",
+ onchain19: "交易统计",
+ technology: "技术指标",
+ technology5: "日K线",
+ technology8: "天针",
+ technology6: "江卓尔60日累计涨幅",
+ jzr60: "江卓尔60日累计涨幅",
+ technology7: "arh999指标",
+ technology11: "2年移动平均价格乘数",
+ ma730: "2年移动平均价格乘数",
+ address: "地址",
+ address1: "活动地址",
+ address2: "每日活跃地址数",
+ address3: "每日发起交易地址数",
+ address4: "每日收到交易地址数",
+ address5: "新增地址",
+ address6: "每日新增地址数",
+ address7: "地址总数",
+ transactions: "交易汇总",
+ transactions4: "交易量",
+ transactions5: "成交次数",
+ transactions6: "日成交率",
+ Distribution: "分配数据",
+ Distribution1: "地址余额 ≥0.1",
+ Distribution2: "地址余额 ≥0.01",
+ Distribution3: "地址余额 ≥1",
+ Distribution4: "地址余额 ≥10 ",
+ Distribution5: "地址余额 ≥100",
+ Distribution6: "地址余额 ≥1000",
+ Distribution7: "地址余额 ≥10000 ",
+ derivatives: "主要交易所衍生数据",
+ derivatives1: "具体数据",
+ derivatives2: "交易所日交易量",
+ derivatives3: "交易所笔数变动",
+ large5: "代币大额交易",
+ ercBigDeals: "代币大额交易",
+ large6: "代币交易量",
+ reward: "抵押奖励",
+ cnew: "新合约数",
+ newContract: "新合约地址",
+ ethTopAddrMonitorList: "巨鲸地址交易历史",
+ tronUSDTBigTx: "USDT on TRON大额交易",
+ tronUSDCBigTx: "USDC on TRON大额交易",
+ tronUsdtVolume: "USDT on TRON交易量",
+ tronUsdcVolume: "USDC on TRON交易量",
+ dailyTrading: "日交易量",
+ monitoring: "大额交易监控",
+ usdt: "USDT交易量",
+ usdt2: "USDT交易量",
+ usdc: "USDC交易量",
+ usdc2: "USDC交易量",
+ busd: "BUSD交易量",
+ busd2: "BUSD交易量",
+ csusdc: "USDC流通量",
+ csusdc2: "USDC流通量",
+ csusdt: "USDT流通量",
+ csbusd: "BUSD流通量",
+ cstotal: "总流通量",
+ PiCycleTopIndicator: "PI周期顶指标",
+ goldenRatioMult: "黄金比例乘数",
+ cdd: "币天销毁量",
+ cdd2: "币天销毁量",
+ dormancy: "已花费输出休眠平均天数",
+ asol: "已花费输出平均寿命",
+ asol2: "已花费输出平均寿命",
+ cddwave: "币天销毁量年龄分布",
+ cddwave2: "币天销毁量年龄分布",
+ distribution: "地址数分布",
+ supplyDistribution: "币数量分布",
+ profitPercent: "盈利地址百分比",
+ profit: "盈利地址数",
+ loss: "亏损地址数",
+ inflationRate: "通货膨胀率",
+ issuance: "新币发行量",
+ sopr: "已花费输出盈利比",
+ sopr2: "已花费输出盈利比",
+ velocity: "流通速度",
+ nvtRatio: "市盈率",
+ nvtRatio2: "市盈率",
+ liveliness: "活跃度",
+ frm: "交易费率乘数",
+ supplyprofitPercent: "盈利百分比",
+ supplyprofit: "盈利供应量",
+ supplyloss: "盈利亏损量",
+ nupl: "未实现的净收益损失比",
+ nupl2: "未实现的净收益损失比",
+ relativeUProfit: "未实现的净收益量",
+ relativeULoss: "未实现的净亏损量",
+ lthNUPL: "长持者未实现的净收益损失比",
+ lthNUPL2: "长持者未实现的净收益损失比",
+ sthNUPL: "短持者未实现的净亏损损失比",
+ sthNUPL2: "短持者未实现的净亏损损失比",
+ marketcap: "流通市值",
+ marketcap2: "流通市值",
+ rcap: "已实现流通市值",
+ rcap2: "已实现流通市值",
+ rprice: "已实现价格",
+ mvrvRatio: "MVRV Ratio",
+ mvrvRatio2: "MVRV Ratio",
+ burnedSupply: "燃烧量",
+ mintedSupply: "发行量",
+ Miners:"矿工",
+ Network:"网络",
+ LongShort:"长/短期持有者",
+ ProfitLoss:"盈亏",
+ Lifetime:"币龄",
+ Ratio:"比率",
+ Token:"代币",
+ balanceGroup:"按余额划分",
+ Holder:"持有者分布",
+ flux:"流通量",
+ casting:"铸造",
+ TradingVolume:"交易量",
+ Bulk:"大额交易监控",
+ USDTCasting:"USDT铸造量",
+ USDTCasting2:"USDT铸造量",
+ USDCCasting:"USDC铸造量",
+ USDCCasting2:"USDC铸造量",
+ BUSDCasting:"BUSD铸造量",
+ BUSDCasting2:"BUSD铸造量",
+ ethBalance:"交易所余额",
+ USDCMonitoring:"USDC大额交易",
+ USDCMonitoring2:"USDC大额交易",
+ USDTMonitoring:"USDT大额交易",
+ USDTMonitoring2:"USDT大额交易",
+ BUSDMonitoring:"BUSD大额交易",
+ BUSDMonitoring2:"BUSD大额交易",
+
+
+ },
+
+
+};
+export const asideEth_en = {
+ menu2: {
+ onchain1: "Big Amount Transaction",
+ onchain18: "Addresses correspond to a relational list of tag holder names",
+ onchain2: "Whales Address List",
+ onchain19: "Transaction Statistics",
+ technology: "Technical indicators",
+ technology5: "Day K line",
+ technology6: "Jiang Zhuoer 60-day Cumulative Gain",
+ jzr60:"Jiang Zhuoer 60-day Cumulative Increase and Decrease",
+ technology7: "Arh999 indicators",
+ technology8: "Days needle",
+ technology11: "2-Year MA Multiplier",
+ ma730:"2 Years Moving Average Price Multiplier",
+ address: "address",
+ address1: "Activities address",
+ address2: "Number of active addresses per day",
+ address3: "Number of address initiates per day",
+ address4: "Number of transaction addresses received per day",
+ address5: "The new address",
+ address6: "Number of newly added addresses per day",
+ address7: "The total number of addresses",
+ transactions: "The transactions",
+ transactions4: "Trading volume",
+ transactions5: "Clinch a deal the number",
+ transactions6: "Day of closing",
+ Distribution: "Distribution of data",
+ Distribution1: "Address the balance ≥0.1",
+ Distribution2: "Address the balance ≥0.01",
+ Distribution3: "Address the balance ≥1",
+ Distribution4: "Address the balance ≥10 ",
+ Distribution5: "Address the balance ≥100",
+ Distribution6: "Address the balance ≥1000",
+ Distribution7: "Address the balance ≥10000 ",
+ derivatives: "Major exchange derivatives data",
+ derivatives1: "The specific data",
+ derivatives2: "Daily exchange volume",
+ derivatives3: "Changes in the number of transactions",
+ large5: "ERC20 Token Big Amount Transaction",
+ ercBigDeals:"ERC20 Token Big Amount Transaction History",
+ large6: "ERC20 Token Daily Volume",
+ reward: "ETH2 Staking Rewards",
+ cnew: "Number of New Contract",
+ newContract: "New Contracts",
+ ethTopAddrMonitorList: "Top Address History",
+ tronUSDTBigTx: "USDT(tron) big amount transaction",
+ tronUSDCBigTx: "USDC(tron) big amount transaction",
+ tronUsdtVolume: "usdt(tron) volume",
+ tronUsdcVolume: "usdc(tron) volume",
+ dailyTrading: "Daily trading volume",
+ monitoring: "Large transaction monitoring",
+ usdt: "USDT Volume",
+ usdt2:"Onchain volume(USDT)",
+ usdc: "USDC Volume",
+ usdc2:"Onchain volume(USDC)",
+ busd: "BUSD Volume",
+ busd2:"Onchain volume(BUSD)",
+ csusdc: "USDC Supply",
+ csusdt: "USDT Supply",
+ csbusd: "BUSD Supply",
+ cstotal: "Total Supply",
+ PiCycleTopIndicator: "Pi Cycle Top Indicator",
+ goldenRatioMult: "Golden Ratio Multiplier",
+ cdd: "CDD",
+ cdd2:"Coin Days Destroyed(CDD)",
+ dormancy: "Dormancy",
+ asol: "ASOL",
+ asol2:"Average Spent Output Lifespan(ASOL)",
+ cddwave: "Age Distribution Of CDD",
+ cddwave2:"Age distribution of Coin Days Destoryed(CDD)",
+ distribution: "Address Distribution of Holder",
+ supplyDistribution: "Supply Distribution of Holder",
+ profitPercent: "Percent of Address in Profit",
+ profit: "Address in Profit",
+ loss: "Address in Loss",
+ inflationRate: "Inflation Rate",
+ issuance: "Issuance ",
+ sopr: "SOPR",
+ sopr2:"Spent Output Profit Ratio (SOPR)",
+ velocity: "Velocity",
+ nvtRatio: "NVT Ratio",
+ nvtRatio2:"Network Value To Transactions(NVT) Ratio",
+ liveliness: "Liveliness",
+ frm: "Fee Ratio Multiple(FRM)",
+ supplyprofitPercent: "Percent Supply In Profit",
+ supplyprofit: "Total Supply In Profit",
+ supplyloss: "Total Supply In Loss",
+ nupl: "NUPL",
+ nupl2:"Net Unrealized Profit/Loss(NUPL)",
+ relativeUProfit: "Unrealized Profit",
+ relativeULoss: "Unrealized Loss",
+ lthNUPL: "LTH NUPL",
+ lthNUPL2:"Long Term Holder NUPL",
+ sthNUPL: "STH NUPL",
+ sthNUPL2:"Short Term Holder NUPL",
+ marketcap: "Market Cap",
+ marketcap2:"Market Cap [USD]",
+ rcap: "Realized Cap",
+ rcap2:"Realized Cap [USD]",
+ rprice: "Realized Price",
+ mvrvRatio: "MVRV Ratio",
+ mvrvRatio2:"Market Value To Realized Value(MVRV) Ratio",
+ burnedSupply: "Burned Supply",
+ mintedSupply: "Minted Supply",
+ Miners:"Miners",
+ Network:"Network info",
+ LongShort:"Long Short",
+ ProfitLoss:"Profit/Loss",
+ Lifetime:"Coin Lifespan",
+ Ratio:"Ratio",
+ Token:"Token",
+ balanceGroup:"By Balance",
+ Holder:"Holder",
+ flux:"Circulating Supply",
+ casting:"Number of Minted",
+ TradingVolume:"Onchain Volume",
+ Bulk:"Big Amount Transaction",
+ USDTCasting:"USDT Minted",
+ USDTCasting2:"Number of Minted(USDT)",
+ USDCCasting:"USDC Minted",
+ USDCCasting2:"Number of Minted(USDC)",
+ BUSDCasting:"BUSD Minted",
+ BUSDCasting2:"Number of Minted(BUSD)",
+ ethBalance:"Exchange Balance (ETH)",
+ USDCMonitoring:"USDC transaction",
+ USDCMonitoring2:"Big Amount transaction(USDC)",
+ USDTMonitoring:"USDT transaction",
+ USDTMonitoring2:"Big Amount transaction(USDT)",
+ BUSDMonitoring:"BUSD transaction",
+ BUSDMonitoring2:"Big Amount transaction(BUSD)",
+ },
+
+
+};
\ No newline at end of file
diff --git a/yq/src/lang/asideMacroscopic/index.js b/yq/src/lang/asideMacroscopic/index.js
new file mode 100644
index 0000000..4a01b13
--- /dev/null
+++ b/yq/src/lang/asideMacroscopic/index.js
@@ -0,0 +1,21 @@
+export const asideMacroscopic_zh ={
+ Macroscopic:{
+ monetaryFinance:"货币金融",
+ loan:"贷款",
+ bond:"债券",
+ stockIndex:"股指",
+ GDP:"GDP",
+ info:"资讯",
+ }
+}
+export const asideMacroscopic_en ={
+ Macroscopic:{
+ monetaryFinance:"Monetary Finance",
+ loan:"loan",
+ bond:"bond",
+ stockIndex:"Stock index",
+ GDP:"GDP",
+ info:"information",
+ }
+}
+
diff --git a/yq/src/lang/en.js b/yq/src/lang/en.js
new file mode 100644
index 0000000..4349a52
--- /dev/null
+++ b/yq/src/lang/en.js
@@ -0,0 +1,28 @@
+export default {
+ message: {
+
+ userName:`user name`,
+ login:"login",
+ password:"password",
+ account:"There is no account?",
+ registered:"registered",
+ forgotPassword:"Forgot password?",
+ resetPassword:"To reset your password",
+ cancel:"cancel",
+ switchLanguages:"Switching between Chinese and English",
+ charts:"chart"
+ },
+ placeholder:{
+ data: 'select date'
+ },
+ login:{
+
+ data: 'login'
+ }
+
+
+
+
+}
+
+
\ No newline at end of file
diff --git a/yq/src/lang/formula/index.js b/yq/src/lang/formula/index.js
new file mode 100644
index 0000000..eea9d2d
--- /dev/null
+++ b/yq/src/lang/formula/index.js
@@ -0,0 +1,21 @@
+export const formula_zh ={
+ formula:{
+ name:"名称",
+ updateTime:"更新时间",
+ updateInterval:"更新间隔",
+ queryTime:"查询时间",
+ state:"状态",
+ newData:"最新数据",
+ }
+}
+
+export const formula_en ={
+ formula:{
+ name:"name",
+ updateTime:"Update time",
+ updateInterval:"update interval",
+ queryTime:"Query time",
+ state:"state",
+ newData:"Latest data",
+ }
+}
\ No newline at end of file
diff --git a/yq/src/lang/help/index.js b/yq/src/lang/help/index.js
new file mode 100644
index 0000000..0e07c4f
--- /dev/null
+++ b/yq/src/lang/help/index.js
@@ -0,0 +1,164 @@
+export const help_zh = {
+ help:{
+ said:"说点什么...",
+ publish:"发表",
+ building:"楼",
+ reply:"回复",
+ determine:"确定",
+ cancel:"取消",
+ num:"编号",
+ userDate:"日期",
+ userName:"用户名",
+ msgPage:"留言页面",
+ userMsg:"留言内容",
+ operation:"操作",
+ inputContent:"输入内容",
+ submitReply:"提交回复",
+ responDate:"回复时间",
+ responser:"回复人",
+ respon:"回复内容",
+ submissionTime:"提交时间",
+ problem:"问题分类",
+ problemTitle:"问题标题",
+ dealWith:"处理状态",
+ details:"详情",
+ orderDetails:"工单详情",
+ orderNumber:"工单编号",
+ submitName:"提交用户名",
+ submitContent:"提交内容",
+ download:"下载附件",
+ uploaded:"文件上传中...",
+ sumWarning:"请确认数据填写完整在提交!",
+ resubmit:"请确认填写提交内容!",
+ recall:"撤回",
+ toAudit:"已经是待审核状态,不能重复提交!",
+ AuditContent:"审核内容:",
+ account:"账户",
+ time:"时间",
+ Continue:"继续提交",
+ SubmitToday:"今日提交工单数",
+ processed:"已处理工单数",
+ unprocessed:"未处理工单数",
+ beReviewed:"待审核工单数",
+ reviewed:"已审核工单数",
+ chart:"工单每日历史图表",
+ timeout:"超时工单列表",
+ beProcessed:"待处理工单列表",
+ processedTable:"已处理工单列表",
+ beReviewedTable:"待审核工单列表",
+ reviewedTable:"已审核工单列表",
+ withdrawTable:"已撤回工单列表",
+ processing:"工单处理",
+ requestReview:"请求审核",
+ AuditOpinion:"审核意见",
+ audit:"审核",
+ AuditUser:"审核用户",
+ AuditTime:"审核时间",
+ unreadWork:"未读工单汇总",
+ submittedWork:"已提交工单列表",
+ ReplyUnread:"已回复未读工单列表",
+ closedTable:"已关闭工单列表",
+ sameName:"不能上传相同名字的文件!",
+ fileType:"不支持的文件类型",
+ fileSize:"文件大小不能超过",
+ fileNum:"超出最大上传文件数量的限制!",
+ solve:"该工单问题已解决?",
+ end:"结束工单",
+ problemTitle1:"请确认填写标题内容!",
+ problem2:"请确认选择问题种类!",
+ describe:"请确认填写描述内容!",
+ historyTable:"工单提交历史列表",
+
+
+
+
+
+
+ }
+}
+export const help_en = {
+ help:{
+ backstage:"Message board backstage",
+ messageBoard:"Message board",
+ message:"I'd like to leave a message.",
+ said:"Say something...",
+ publish:"publish",
+ building:"layer",
+ determine:"determine",
+ cancel:"cancel",
+ help:"This page is helpful to you?",
+ said1:"Let me say something...",
+ reply:"reply",
+ todayMessage:"Number of messages today",
+ processedMessage:"Number of messages processed",
+ unprocessedMessage:"Number of unprocessed messages",
+ historyChart:"Comment daily history chart",
+ unprocessedTabel:"The message list is not processed",
+ num:"number",
+ userDate:"date",
+ userName:"User name",
+ msgPage:"Message page",
+ userMsg:"Message content",
+ operation:"operation",
+ inputContent:"Input content",
+ submitReply:"Submit a reply",
+ processedTabel:"The message list has been processed",
+ responDate:"Recovery time",
+ responser:"responder",
+ respon:"Reply content",
+ unread:"Unread message label",
+ unreadTabel:"List of unread messages",
+ submissionTime:"Submission time",
+ submittedTabel:"A list of comments has been submitted",
+ problem:"Problem classification",
+ problemTitle:"Question heading",
+ dealWith:"Processing state",
+ details:"details",
+ orderDetails:"Work order details",
+ orderNumber:"Work order number",
+ submitName:"Submit user name",
+ submitContent:"Submit content",
+ download:"Download attachment",
+ uploaded:"The file is uploaded...",
+ sumWarning:"Please confirm that the data is complete before submission!",
+ resubmit:"Please confirm to fill in the submission content!",
+ recall:"withdraw",
+ toAudit:"It is in the state to be reviewed and cannot be submitted again!",
+ AuditContent:"Content of review:",
+ account:"account",
+ time:"time",
+ Continue:"Continue to submit",
+ SubmitToday:"The number of jobs submitted today",
+ processed:"The number of processed jobs",
+ unprocessed:"Unprocessed number of workers",
+ beReviewed:"Number of workers to be audited",
+ reviewed:"The number of approved workers",
+ chart:"Daily history chart of work order",
+ timeout:"Overtime work order list",
+ beProcessed:"Waiting list of science and technology",
+ processedTable:"List of processed work orders",
+ beReviewedTable:"List of work order to be reviewed",
+ reviewedTable:"Audited work order list",
+ withdrawTable:"Retracted work order list",
+ processing:"Work order processing",
+ requestReview:"Request review",
+ AuditOpinion:"Audit opinion",
+ audit:"audit",
+ AuditUser:"Audit user",
+ AuditTime:"Audit time",
+ unreadWork:"Summary of unread work orders",
+ submittedWork:"Work order list has been submitted",
+ ReplyUnread:"The list of unread work orders has been returned",
+ closedTable:"Closed order list",
+ sameName:"You cannot upload files with the same name!",
+ fileType:"Unsupported file type!",
+ fileSize:"The file size cannot exceed",
+ fileNum:"The maximum number of uploaded files is exceeded!",
+ solve:"The issue with this work order has been resolved?",
+ end:"End Work Order",
+ problemTitle1:"Please confirm to fill in the title content!",
+ problem2:"Please confirm selecting the type of problem!",
+ describe:"Please confirm to fill in the description content!",
+ historyTable:"Historical work orders",
+ }
+}
\ No newline at end of file
diff --git a/yq/src/lang/home/index.js b/yq/src/lang/home/index.js
new file mode 100644
index 0000000..633881a
--- /dev/null
+++ b/yq/src/lang/home/index.js
@@ -0,0 +1,334 @@
+export const home_zh = {
+ home: {
+ assets:"资产",
+ interval:"间隔",
+ introduce:"介绍",
+ tradingVolume:"最新大额交易",
+ tradingHours:"交易时间",
+ checkDetails:"查看详情",
+ details:"详情",
+ date:"日期",
+ number:"交易额",
+ address:"地址",
+ toAddress:"转入地址",
+ height:"区块高度",
+ outAddress:"转出地址",
+ transaction:"交易ID",
+ shutDown:"关闭",
+ startDate:"开始日期",
+ endDate:"结束日期",
+ no:"无",
+ Range:"范围选择查询",
+ search:"搜索 Address/amount/txid",
+ relationship:"地址对应标记持有者名称关系列表",
+ markName:"标记持有者姓名",
+ trading:"交易对",
+ currency:"币价",
+ dayCurrency:"24小时币价",
+ currencyName:"币名简称",
+ contractAddress:"合约地址",
+ aAddress:"发起地址",
+ targetAddress:"目标地址",
+ down:"关闭",
+ bigTable:"大额交易列表",
+ activeAddress:"合约地址",
+ searchs:"搜索 地址/余额/交易hash",
+ ethereum:"以太坊巨鲸地址余额列表",
+ balance:"您的账户余额信息",
+ searchAddress:"搜索 Address / value",
+ serialNumber:"序号",
+ aCurrency:"币数量",
+ notPage:"暂无此页面",
+ ascending:"升 序",
+ descending:"降 序",
+ voutn:"该笔交易索引号",
+ vouttype:"接收地址类型",
+ days:"持有天数",
+ buyPrice:"买入价格",
+ sellPrice:"卖出价格",
+ profit:"利润",
+ vout:"接收地址",
+ fromAbbr:"转入合约",
+ toAbbr:"转出合约",
+ fromTag:"转入地址标识",
+ toTag:"转出地址标识",
+ tag:"地址标识",
+ favorite:"喜欢",
+ compare:"",
+ switch:"线性/对数:",
+ switch1:"线性",
+ switch2:"对数",
+ hash:"交易hash",
+ compare:"比较",
+ create:"创建警报",
+ abbr:"请选择",
+ smaWarning:"请输入0-100之间的整数!",
+ PersonalInformation:"个人信息",
+ sex:"性别",
+ loginIp:"最近登录IP",
+ loginCount:"登录次数",
+ figure:"图1",
+ figure2:"图2",
+ figure3:"图3",
+ figure4:"图4",
+ table:"表1",
+ table2:"表2",
+ searchResults:"USDC大额交易监控表格",
+ loginDate:"登录时间",
+ open:"开盘",
+ highestPrice:"最高",
+ ndaqAmount:"成交量",
+ closePrice:"收盘",
+ lowestPrice:"最低",
+ clinch:"成交额",
+ amplitude:"振幅",
+ rise:"涨跌额",
+ picture:"涨跌幅",
+ copy:"复制成功",
+ copyTabel:"双击复制表格内容",
+ action:"行为",
+ NoData:"无数据",
+ formula:"计算公式",
+ topList:"巨鲸地址列表",
+ sopr:"已花费输出盈利比",
+ lthSopr:"长期持有者的已花费输出盈利比",
+ sthSopr:"短期持有者的已花费输出盈利比",
+ Increase:"当日涨幅",
+ tag1:"标签",
+ loadingData:"数据努力加载中...",
+ Destruction:"销毁",
+ casting:"铸造",
+ minutes5:"5分钟",
+ minutes15:"15分钟",
+ minutes30:"30分钟",
+ hour1:"1小时",
+ hour2:"2小时",
+ hour4:"4小时",
+ hour6:"6小时",
+ hour12:"12小时",
+ day1:"1天",
+ month1:"1月",
+ month3:"3月",
+ month6:"6月",
+ year1:"1年",
+ year2:"2年",
+ year5:"5年",
+ year10:"10年",
+ year20:"20年",
+ year30:"30年",
+ introduction:"指标介绍",
+ welcome:"欢迎使用coinbus指标文档介绍",
+ totalAmount:"总金额",
+ Adjusted:"经过季节性调整",
+ Unadjusted:"未经过季节性调整",
+ cash:"现金(流通中的纸币和硬币)",
+ deposit:"存款准备金",
+ cash2:"现金",
+ current:"活期存款",
+ check:"旅行支票账户",
+ depositCheck:"其他存款人存款支票账户",
+ savings:"储蓄存款",
+ regular:"定期存款",
+ otherDeposits:"其他存款人存款",
+ private:"私营部门贷款",
+ GDP:"全年GDP",
+ unit:"单位",
+ M1:"M1说明:2020年5月之前,M1由",
+ M1_1:"(1)美国财政部、联邦储备银行和存款机构金库以外的货币组成;",
+ M1_2:"(2)商业银行的活期存款(不包括存款机构、美国政府、外国银行和官方机构持有的金额)减去托收过程中的现金项目和美联储浮动资金;",
+ M1_3:"(3) 其他支票存款 (OCD),包括可转让提款指令 (NOW) 和自动转账服务 (ATS)、存款机构账户、信用社共享汇票账户以及储蓄机构活期存款。",
+ M1_4:"从 2020 年 5 月开始,M1 包括",
+ M1_5:"(1) 美国财政部、联邦储备银行以外的货币,以及存款机构的金库;",
+ M1_6:"(2)商业银行的活期存款(不包括存款机构、美国政府、外国银行和官方机构持有的金额)减去托收过程中的现金项目和美联储浮动资金;",
+ M1_7:"(3) 其他流动性存款,包括强迫存款和储蓄存款(包括货币市场存款账户)。季节性调整后的 M1 是通过对货币、活期存款和 OCD(2020 年 5 月之前)或其他流动存款(2020 年 5 月开始)求和得出的,每一项都单独进行季节性调整。",
+ M2:"M2说明:2020年5月之前,M2由M1加",
+ M2_1:"(1)储蓄存款(含货币市场存款账户)组成;",
+ M2_2:"(2)小面额定期存款(金额低于10万美元的定期存款)减去个人退休账户(IRA)和存款机构的基奥余额;",
+ M2_3:"(3) 零售货币市场基金 (MMF) 余额减去 MMF 中的 IRA 和 Keogh 余额。",
+ M2_4:"从 2020 年 5 月开始,M2 由 M1 加上",
+ M2_5:"(1) 小面额定期存款(金额低于 10 万美元的定期存款)减去存款机构的 IRA 和 Keogh 余额组成;",
+ M2_6:"(2) 零售 MMF 余额减去 IRA 和基奥 MMF 余额。季节性调整后的 M2 是通过将储蓄存款(2020 年 5 月之前)、小面额定期存款和零售货币市场基金(分别经过季节性调整)相加,并将此结果添加到季节性调整后的 M1 中得出的。",
+ newContractSearch:"搜索地址/交易Hash",
+ ranking:"排名",
+ ethPrice:"价格曲线无数据",
+ GDPRemind:"注:时间查询按年返回数据",
+ loading:"加载 ",
+ ago:" 前的数据...",
+ after:" 后的数据...",
+ updateContent:"更新内容",
+ noPage:" 对不起,您正在寻找的页面不存在。尝试检查URL的错误,然后按浏览器上的刷新按钮或尝试在我们的应用程序中找到其他内容。",
+ canTFind:"找不到网页!",
+ realTimeData:"实时数据",
+ VPN:"请打开VPN稳定访问该表格",
+
+ },
+
+
+};
+export const home_en = {
+ home: {
+ assets:"assets",
+ interval:"interval",
+ introduce:"introduce",
+ tradingVolume:"Maximum trading volume",
+ tradingHours:"Trading hours",
+ checkDetails:"Check the details",
+ details:"details",
+ date:"date",
+ number:"Transaction volume",
+ address:"address",
+ toAddress:"To address",
+ height:"Block height",
+ outAddress:"Turns out the address",
+ transaction:"Transaction ID",
+ shutDown:"Shut down",
+ startDate:"Start date",
+ endDate:"End date",
+ no:"There is no",
+ Range:"selection query",
+ search:"search Address/amount/txid",
+ relationship:"Addresses correspond to a relational list of tag holder names",
+ markName:"Name of Mark Holder",
+ trading:"Trading on",
+ currency:"currency",
+ dayCurrency:"24-hour coin price",
+ currencyName:"Currency name for short",
+ contractAddress:"Contract address",
+ aAddress:"A address",
+ targetAddress:"The target address",
+ down:"Shut down",
+ bigTable:"Large Transaction Form",
+ activeAddress:"Address of contract",
+ searchs:"address/balance/Transaction hash",
+ ethereum:"Ethereum Whale address balance list",
+ balance:"Your account balance information",
+ searchAddress:"search Address / value",
+ serialNumber:"number",
+ aCurrency:"A currency",
+ notPage:"This page is not available",
+ ascending:"ascending",
+ descending:"Descending order",
+ voutn:"vout.n",
+ vouttype:"receive address type",
+ days:"holder days",
+ buyPrice:"buyin price",
+ sellPrice:"sellout price",
+ profit:"profit",
+ vout:"receive address",
+ fromAbbr:"Transfer to contract",
+ toAbbr:"Transfer contract",
+ fromTag:"Transfer address identification",
+ toTag:"Transfer out address identification",
+ tag:"Address label",
+ favorite:"Favorite",
+ switch:"Linear/logarithmic display:",
+ switch1:"Linear",
+ switch2:"Log",
+ hash:"transaction hash id",
+ compare:"Compare",
+ create:"Create Alert",
+ abbr:"Please select",
+ smaWarning:"The value cannot be greater than 100. Re-enter!",
+ PersonalInformation:"Personal information",
+ sex:"gender",
+ loginIp:"Last Login IP Address",
+ loginCount:"Number of logins",
+ figure:"Figure1",
+ figure2:"Figure2",
+ figure3:"Figure3",
+ figure4:"Figure4",
+ table:"table 1",
+ table2:"table 2",
+ searchResults:"USDC Bulk Transaction Monitoring form",
+ loginDate:"Login time",
+ open:"Opening",
+ highestPrice:"highest",
+ ndaqAmount:"Volume of trading",
+ closePrice:"closing",
+ lowestPrice:"lowest",
+ clinch:"Transaction forehead",
+ amplitude:"amplitude",
+ rise:"Up down amount",
+ picture:"Rise and fall",
+ copy:"Replication succeeded",
+ copyTabel:"Double-click to copy the table contents",
+ action:"behavior",
+ NoData:"No data",
+ formula:"Calculation formula",
+ topList:"Giant Whale Address List",
+ sopr:"Expended output profit ratio",
+ lthSopr:"Long-term holders' spent output profit ratio",
+ sthSopr:"Short term holders' spent output profit ratio",
+ Increase:"Intraday increase",
+ tag1:"tag",
+ loadingData:"Effort loading data...",
+ Destruction:"Destruction",
+ casting:"casting",
+ minutes5:"5 minutes",
+ minutes15:"15 minutes",
+ minutes30:"30 minutes",
+ hour1:"1 hour",
+ hour2:"2 hour",
+ hour4:"4 hour",
+ hour6:"6 hour",
+ hour12:"12 hour",
+ day1:"1 day",
+ introduction:"Introduction",
+ month1:"1 month",
+ month3:"3 months",
+ month6:"6 months",
+ year1:"1 year",
+ year2:"2 years",
+ year5:"5 years",
+ year10:"10 years",
+ year20:"20 years",
+ year30:"30 years",
+ welcome:"Welcome to the Coinbus metric document introduction",
+ totalAmount:"Total amount",
+ Adjusted:"Seasonally adjusted",
+ Unadjusted:"Not seasonally adjusted",
+ cash:"Cash (notes and coins in circulation)",
+ deposit:"Deposit reserve",
+ cash2:"cash",
+ current:"Demand deposit",
+ check:"Traveller's cheque account",
+ depositCheck:"Other depositors' deposit check accounts",
+ savings:"Savings account",
+ regular:"Fixed deposit",
+ otherDeposits:"Deposits from other depositors",
+ private:"loans to private sector",
+ GDP:"GDP",
+ unit:"unit",
+ M1:"M1 description:Before May 2020, M1 consists of ",
+ M1_1:"(1) currency outside the U.S. Treasury, Federal Reserve Banks, and the vaults of depository institutions;",
+ M1_2:"(2) demand deposits at commercial banks (excluding those amounts held by depository institutions, the U.S. government, and foreign banks and official institutions) less cash items in the process of collection and Federal Reserve float; and",
+ M1_3:"(3) other checkable deposits (OCDs), consisting of negotiable order of withdrawal, or NOW, and automatic transfer service, or ATS, accounts at depository institutions, share draft accounts at credit unions, and demand deposits at thrift institutions. ",
+ M1_4:" Beginning May 2020, M1 consists of ",
+ M1_5:"(1) currency outside the U.S. Treasury, Federal Reserve Banks, and the vaults of depository institutions;",
+ M1_6:"(2) demand deposits at commercial banks (excluding those amounts held by depository institutions, the U.S. government, and foreign banks and official institutions) less cash items in the process of collection and Federal Reserve float; and ",
+ M1_7:"(3) other liquid deposits, consisting of OCDs and savings deposits (including money market deposit accounts). Seasonally adjusted M1 is constructed by summing currency, demand deposits, and OCDs (before May 2020) or other liquid deposits (beginning May 2020), each seasonally adjusted separately.",
+ M2:"M2 description:Before May 2020, M2 consists of M1 plus",
+ M2_1:"(1) savings deposits (including money market deposit accounts);",
+ M2_2:"(2) small-denomination time deposits (time deposits in amounts of less than $100,000) less individual retirement account (IRA) and Keogh balances at depository institutions; and",
+ M2_3:"(3) balances in retail money market funds (MMFs) less IRA and Keogh balances at MMFs.",
+ M2_4:"Beginning May 2020, M2 consists of M1 plus",
+ M2_5:"(1) small-denomination time deposits (time deposits in amounts of less than $100,000) less IRA and Keogh balances at depository institutions; and ",
+ M2_6:"(2) balances in retail MMFs less IRA and Keogh balances at MMFs. Seasonally adjusted M2 is constructed by summing savings deposits (before May 2020), small-denomination time deposits, and retail MMFs, each seasonally adjusted separately, and adding this result to seasonally adjusted M1.",
+ newContractSearch:"Search Address/Transaction Hash",
+ ranking:"#",
+ ethPrice:"No data on price curve",
+ GDPRemind:"Note: Time query returns data by year",
+ loading:"loading ",
+ ago:" Previous data...",
+ after:" Subsequent data...",
+ updateContent:"Update content",
+ noPage:" Sorry, the page you are looking for does not exist. Try checking for errors in the URL, then press the refresh button on the browser or try to find other content in our application.",
+ canTFind:"Unable to find webpage!",
+ realTimeData:"realTimeData",
+ VPN:"Please open VPN to stably access this table",
+
+ },
+
+
+
+};
\ No newline at end of file
diff --git a/yq/src/lang/index.js b/yq/src/lang/index.js
new file mode 100644
index 0000000..b09b6d9
--- /dev/null
+++ b/yq/src/lang/index.js
@@ -0,0 +1,33 @@
+import Vue from 'vue'
+import VueI18n from 'vue-i18n'
+//import elementEnLocale from 'element-ui/lib/locale/lang/en'
+//import elementZhLocale from 'element-ui/lib/locale/lang/zh-CN'
+import locale from 'element-ui/lib/locale' // 引入elementui语言包模块
+//import enLocale from './en.js' // 本地英文包
+//import zhLocale from './zh.js' // 本地中文包
+import messages from "./messages"
+
+Vue.use(VueI18n) // vue使用i18n模块
+
+// const messages = {
+// en: {
+// ...enLocale,
+// ...elementEnLocale
+// },
+// zh: {
+// ...zhLocale,
+// ...elementZhLocale
+// }
+// }
+// 使用选项创建VueI18n实例
+
+const i18n = new VueI18n({
+ locale: localStorage.getItem('lang') || 'zh',
+ fallbackLocale:'zh', //首选语言缺少翻译时要使用的语言,
+ messages ,// 设置语言环境信息
+ silentTranslationWarn: true,//去掉页面警告
+})
+
+
+locale.i18n((key, value) => i18n.t(key, value)) // 在注册Element时设置i18n的处理方法
+export default i18n
diff --git a/yq/src/lang/introduce/index.js b/yq/src/lang/introduce/index.js
new file mode 100644
index 0000000..a1f6e56
--- /dev/null
+++ b/yq/src/lang/introduce/index.js
@@ -0,0 +1,387 @@
+export const introduction_zh = {
+ introduce:{
+ btcbigtxcount:"单位:千=K,M=百万,B=十亿 /// 记录链上交易价值>=100万USD的转账,对于有地址标签的可以得出拥有地址的交易双方实体,可以通过观察大额交易条数和金额来预测价格。当价格剧烈变化的时候通常有大额转账入或出交易所。",
+ address:"单位:千=K,M=百万,B=十亿 ///总地址数, 指示用户数增长状态, 不包含余额为0的地址, 地址数走高意味着更多新用户入场///新地址数:每日的新地址数, 指示用户短期参与状态,数值走高意味着更多新用户入场,数值走低意味着用户对买入币正在失去兴趣///活跃地址数:每日活跃地址数,指示用户当前参与状态,该指标需要结合其他指标分析,数值走高可能意味着用户的卖或买动作, 数值低 意味着当前链上转账不活跃///发送地址数:每日发送地址数,指示用户当前花费情况, 数值走高意味着用户可能的卖的动作,数值低意味着当前链上转账不活跃,需结合其他指标分析///接收地址数:每日接收地址数,指示用户当前买入情况,数值高意味着用户可能的买的动作,数值低意味着当前链上转账不活跃,需结合其他指标分析///新地址交易量:每日新地址的交易量,指示新用户的买入活动情况, 数值高意味着新用户可能买入了大量币,数值低意味着当前状态新用户买入意愿较低",
+ blockAmount:"单位:千=K,M=百万,B=十亿 ///区块实时交易量",
+ dailyBuySell:"单位:千=K,M=百万,B=十亿 ///BTC每日交易详情",
+ utxos:"单位:千=K,M=百万,B=十亿 ///持有者 余额分段及每段地址数分布",
+ utxos2nd:"单位:千=K,M=百万,B=十亿 ///余额-持有者币数量分布(按余额分段的地址数分布)",
+ holder:"单位:千=K,M=百万,B=十亿 ///该指标观察持有者的币龄分布及对应的地址数",
+ holderBalance:"单位:千=K,M=百万,B=十亿 ///X轴:持有者超过天数 /// 横轴: 持有天数 ///纵轴:持有地址数量",
+ getBuyData:"单位:千=K,M=百万,B=十亿 ///按买入价格分段的地址数分布 ///横轴: 购入价格范围 ///纵轴:对应价格范围内的地址数量",
+ getBuyAmountData:"单位:千=K,M=百万,B=十亿 ///按买入价格分段的币数量分布 /// 横轴: 购入价格范围 /// 纵轴:对应价格范围内的币数量",
+ getDiffData:"单位:千=K,M=百万,B=十亿 ///按买入卖出价格差的地址数分布 /// 横轴:当前价格-购入价格差值 /// 纵轴:数量分布数据",
+ getDiffAmountData:"单位:千=K,M=百万,B=十亿 ///按买入卖出价格差的地址数分布 /// 横轴:持有者当前收益币范围 /// 纵轴:数量分布数据",
+ getProfitData:"单位:千=K,M=百万,B=十亿 ///按盈利分段的地址数分布/// 横轴:当前收益范围 ///纵轴:收益范围的数量",
+ getProfitAmountData:"单位:千=K,M=百万,B=十亿 ///按盈利分段的币数量分布/// 横轴:持有者当前收益币范围 ///纵轴:数量分布数据",
+ getTopList:"巨鲸支持者观察,可以选择某一个余额范围及时间范围来观察巨鲸持有者变化状况, 有地址标签的可以观察该地址是谁持有,也可以搜索用户指定的地址进行持有变化的观察",
+ getTopListWatch:"单位:千=K,M=百万,B=十亿 ///巨鲸 币数量变动表",
+ coinmarketall:"单位:千=K,M=百万,B=十亿 ///每5分钟的币价(按照市值排序,只展示前100的值)",
+ btcTags:"单位:千=K,M=百万,B=十亿 ///地址对应标记持有者名称关系列表",
+ BTCVolume:"单位:千=K,M=百万,B=十亿 ///Transaction Volume: 交易量 /// Transaction Fee:交易费///Transaction Volume (Entity-adjusted):(消除找零的交易量)即消除链上交易的找零部分,更真实的反应交易量情况///上述三个仅指示链上活动程度,数值走高意味着币可能买或卖,交易量或交易费低迷意味着链上活动少,市场处于观望状态,需结合其他指标一起分析",
+ minerAddress:"单位:千=K,M=百万,B=十亿 ///即矿工余额的变化情况,数值一直增长意味着矿工在囤币以获取更多的利润,数值走低意味着矿工在抛售他们手中的币止盈",
+ minerBalance:"单位:千=K,M=百万,B=十亿 ///矿工地址中的总供应量。",
+ MVRV:"单位:千=K,M=百万,B=十亿 /// 计算公式:MVRV = Market Cap / Realized Cap ///该指标评估流通市值与实际市值的比率,走高表明投资者收益开始积累,当比率大于3.5 表明市场开始过热, 价格已经高风险, 投资者可能会抛出货币锁定收益。走低表明投资者收益开始释放,可能进入熊市,当比率小于1.0 后表明市场进入投降阶段,也预示着可能的熊市阶段。",
+ MVRVZ:"单位:千=K,M=百万,B=十亿 ///计算公式:MVRV-Z Score =Market Cap - Realized Cap / Standard Deviation (Market Cap) /// 该评分评估币资产相对于其市值标准差当前价格是否被高估或低估, 当市场价值明显高于实际价值时, 表明可能到了市场顶部, 反之则表明到了市场底部。",
+ NVTRatio:"单位:千=K,M=百万,B=十亿 ///网络价值与交易 (NVT) 比率的计算方法是将市值除以以美元衡量的转移链上交易量。NVT 比率由 Willy Woo 创建。",
+ NVTSignal:"单位:千=K,M=百万,B=十亿 ///NVT信号(NVTS)是原NVT比率的改进版本。它在分母中使用日交易量的90天移动平均值,而不是原始的日交易量。该移动平均线提高了该比率,使其更好地发挥领先指标的作用。",
+ OHLCPrice:"单位:千=K,M=百万,B=十亿 ///OHLC以美元计价的资产价格烛台图。字段介绍:///closePrice:闭盘价///highestPrice:最高价///lowestPrice: 最低价///openPrice:开盘价",
+ jzr60:"单位:千=K,M=百万,B=十亿 ///该指标累计60天的涨幅,短期币价涨幅超过新人新资金入场速度时,即涨幅过高(比如超过100%)将会导致投资者抛售币来锁定短期利润",
+ arh999:"单位:千=K,M=百万,B=十亿 ///ahr999 = (比特币价格/200日定投成本) * (比特币价格/指数增长估值)///指数增长估值= 10^[5.84 * log(币龄) - 17.01]///币龄 = 当前日期距离2009年1月3日的天数///当比特币价格同时低于短期定投成本和预期估值时增大投资额,能增大用户收益的概率。根据指标回测,当ahr999指标数据低于0.45时或许适合抄底,在0.45和1.2区间内或许适合定投BTC,高于该区间说明此时或许不是良好的定投时机///Ahr999x Index Ahr999逃顶指数///ahr999x=(200日定投成本/比特币价格)*(指数增长估值/比特币价格)*3///该指标与arh999相反,用来指示逃顶",
+ DaysNeedle:"单位:千=K,M=百万,B=十亿 ///天针",
+ Holding:"单位:千=K,M=百万,B=十亿 ///目的比特币ETF中的比特币数量。",
+ Flows:"单位:千=K,M=百万,B=十亿 ///从目的比特币ETF流入的比特币数量。",
+ ma730:"单位:千=K,M=百万,B=十亿 ///该指标突出了购买或出售比特币会产生超额回报的时期。当价格跌破2年均线(绿线)时,买入比特币在历史上产生了巨大的回报。当价格高于2年均线x5(红线)时卖出比特币,历来都能有效地获取利润",
+ capReal:"单位:千=K,M=百万,B=十亿 ///已实现资本化(已实现上限)是市值的一种变化,它根据每个UTXO最后一次移动时的价格对其进行估值,而不是其当前价值。因此,它代表了网络中所有硬币的实现价值,而不是它们的市场价值。实现的上限减少了丢失和长期休眠的硬币的影响,并根据硬币在给定链条经济中的实际存在来加权。当上一次以明显更便宜的价格移动的硬币被消费时,它会将硬币重新估值为当前价格,从而将已实现上限增加相应的金额。同样,如果一枚硬币的价格低于上一次移动时的价格,它将重新估值到更低的价格,并相应减少已实现上限。鉴于上一次移动时每枚硬币的已实现上限价值,它可以被视为资产中存储或保存的价值的代表。因此,此指标可被视为网络总成本基础的估计,并使其成为创建其他指标(例如MVRV和NUPL)的强大基线。",
+ CDD:"单位:千=K,M=百万,B=十亿 ///计算公式:CDD = value . lifespan [days] (of all spent outputs ) ///计算公式:Supply-Adjusted CDD = CDD / Total Supply///CDD是观察长期持有者和富有的投资者的消费行为的宝贵工具,因为它同时考虑了寿命和硬币数量。它特别适合于观察宏观趋势,即在以前的周期中积累的投资者开始花费他们的硬币。///高指标值可能表明长期投资者正在花费硬币来实现利润,利用市场的力量,或减少持有资产的信念。///持续的高位或趋势性的较高指标值为长期持有者消费行为的结论增加了砝码。在看涨的市场中,CDD通常有走高的趋势,因为长期持有者在市场强势中卖出,并经常在当地价格顶点附近达到峰值。///低指标值发生在日常网络流量占主导地位,旧币保持休眠状态,以及持有资产的信念很高的时候。对该资产的兴趣减少的时期(如熊市)往往导致链上活动减少,因此指标值较低。///持续的低位或趋势性的较低指标值可能表明长期持有者的信心正在恢复,他们开始持有而不是花费他们的硬币。///供应量调整的CDD说明了总供应量的积累对CDD指标的影响。随着更多的币被发行,更多的CDD被总网络积累,CDD的下限将随着时间的推移而增加。",
+ fundingRate:"单位:千=K,M=百万,B=十亿 ///资金费率是指基于永续合约市场价格与现货价格之间的价差,向多头或空头交易者支付的定期费用。因此,取决于敞口头寸,交易者可以是付款方,也可以是收款方。资金费率可防止两个市场的价格持续出现偏差。它在一天之内会多次重新计算,目前的重新计算间隔为8小时。当前仅包含币安数据",
+ openInterest:"单位:千=K,M=百万,B=十亿 ///未平仓和约数是指当前存在的未平仓的合约总数,包括未到期合约数、为未被执行(结清)合约数。未平仓合约数通常用来确认合约的趋势和趋势逆转。当前仅包含币安的数据",
+ takerlongshortRatio:"单位:千=K,M=百万,B=十亿 ///合约主动买入量指的是展示单位时间内,合约主动性买盘的成交量(taker吃挂单买入),即资金流入量。通常来说,合约主动买入量大说明市场看涨。当前仅包含币安的数据",
+ profitrate:"单位:千=K,M=百万,B=十亿 ///如果当前价格高于创建时的价格,UTXO就处于盈利状态。反之,如果当前价格低于创建时的价格,则UTXO处于亏损状态///一般来说,较高的数值可能表明市场的顶部,而较低的数值可能是底部的信号。",
+ sopr:"单位:千=K,M=百万,B=十亿 ///SOPR指标反映了在链上移动的所有币的利润变现程度///SOPR值大于1意味着当天移动的币平均来说是盈利的(卖出价格大于支付价格)。///SOPR值小于1,意味着当天移动的币平均来说是亏损的(卖出价格小于支付价格)。///SOPR值正好为1,意味着当天移动的币平均来说是以收支平衡的方式出售硬币。///SOPR呈上升趋势,意味着利润正在实现。///SOPR呈下降趋势,意味着正在实现损失和/或盈利的币没有被使用。///LTH-SOPR反映了所有在链上移动的、寿命超过155天的币(长期持有者)的盈亏程度。在155天的过程中(LTH阈值),市场波动和价格通常会朝着一个方向解决,要么高于,要么低于UTXO创建时的价格(假设成本基础)。因此,当LTH持有的币被花费时,它往往会实现可观的利润或损失。LTH-SOPR经常达到相对较大(>2.0)和较小的数值(<0.8)。///STH-SOPR反映了所有在链上移动的寿命小于155天的币(短期持有者)的变现盈亏程度。",
+ asol:"单位:千=K,M=百万,B=十亿 ///计算公式:ASOL = Mean{ lifespan [days] (of all spent outputs) }///ASOL在宏观层面上强调了当天每笔交易产出所花费的硬币寿命。这提供了对一段时间内短期(年轻硬币)和长期(旧硬币)消费行为之间平衡的洞察力。它往往随着市场波动和市场情绪及结构的变化而呈上升趋势,因为旧的休眠硬币被花回流通。高数值通常表明网络流量中增加了旧币的使用比例,通常与长期持有者利用高市场波动性活动有关。低值通常表示每天的流量主要由正在消费的年轻硬币组成,通常与交易所和短期持有者有关。",
+ dormancy:"单位:千=K,M=百万,B=十亿 ///计算公式:Dormancy =CDD / Transaction Volume/// 计算公式:Supply-Adjusted Dormancy = Dormancy / Total Supply///币的平均休眠天数(Dormancy)描述了每个已花费的币在被移动之前的平均休眠天数。高休眠值意味着,平均而言,当天消费的硬币已经在非流动性状态下保存了较长的时间,并可能被消费回流通循环。///低休眠值意味着当天花费的硬币相对较年轻,表明较老的硬币通常仍未被花费,链上的数量是更多日常流量的特征。",
+ soag:"单位:千=K,M=百万,B=十亿 ///该指标通过观察币龄分布长期持有者和短期持有者的出售状况,可以结合CDD指标综合分析。",
+ csupply:"单位:千=K,M=百万,B=十亿 ///即已挖出或发行的货币供应总量,该指标指示有多少币已流通, 还剩多少待流通,当流通量占比较高时意味着一级发行已接近尾声,对于固定总发行量的币种以后主要靠交易费维护网络运行。",
+ Liveliness:"单位:千=K,M=百万,B=十亿 ///计算公式:Liveliness = Cumulative CDD / Cumulative Total Supply ///计算公式:Liveliness = value . lifespan [blocks](of all outputs ever spent) / value . lifespan [blocks] (of all outputs ever reated)///活跃度是一个指标,它提供了宏观上对持有者行为变化的洞察力,有助于识别长期持有人积累或消费的趋势。它突出了币龄的销毁速度比流通量的积累速度快的时期。///当高比例的硬币供应处于休眠状态(即保持持有行为),并且币龄的积累超过了链上活动所破坏的币龄时,活力将下降。///当销毁的币龄等于流通供应所积累的币龄时,活力将趋于平缓。///当长期持有者开始花费积累了大量硬币天数的旧币,超过币龄数积累的速度时,活力将增加。",
+ rprofit:"单位:千=K,M=百万,B=十亿 ///即当卖出大于买入价格在花费时实现的盈利,当持续走高到新高点时表明价格可能已经处于超买阶段,投资者可能选择抛售锁定利润。当持续走低到新低点时表明价格处于超卖阶段,可能是筑底状态。",
+ rloss:"单位:千=K,M=百万,B=十亿 ///即当卖出小于买入价格在花费时实现的亏损,当持续走高到新高点时表明价格可能已经处于超卖阶段,投资者可能选择买入进行积累。当持续走低到新低点时表明价格处于超买阶段,可能是牛市末期。",
+ rplRate:"单位:千=K,M=百万,B=十亿 ///计算公式:Realized Profit/Loss = Realized Profit / Realized Loss///该比率观察已花费的币的盈亏状况,当比率走高时表明开始实现盈利,资金可能正在流入, 到达新高度时表明可能到达阶段性高点,投资者正在出售锁定利润。当比率走到新低时表明可能到达阶段性低点,投资者可以寻找适时的买入机会。",
+ marketcap:"单位:千=K,M=百万,B=十亿 /// 计算公式:Market Cap = price [USD] . Total Supply /// 市值代表币的总资产价值,描述币的资产规模,走高需要评估该资产是否进入牛市或被高估, 走低需要评估该资产是否会进入熊市或归零,该指标通常用来对比其他币和其他非币资产。",
+ rcap:"单位:千=K,M=百万,B=十亿 ///已实现流通市值根据最后一次移动时的价格对每个UTXO进行估值。当市值交易高于已实现的上限时,市场就处于总体盈利状态。当市值交易低于已实现的上限时,市场就处于总体亏损状态。该指标的异常走高表明大量投资者可能在售卖币,即移动了他们的硬币。",
+ earcap1:"单位:千=K,M=百万,B=十亿 ///Entity-adjusted Realized Cap:已实现上限的改进变体,丢弃同一实体地址之间的交易(“内部”交易)。因此,实体调整后的已实现上限仅考虑实际经济活动,与基于原始UTXO的同行相比,提供了更好的市场信号",
+ lthmvrv:"单位:千=K,M=百万,B=十亿 ///LTH – Makret Cap 长期持有者流通市值 ///LTH – Realized Cap 长期持有者已实现流通市值 ///计算公式:LTH-MVRV= Market Cap (of all UTXOs where age≥155 days) /Realized Cap (of all UTXOs where age≥155 days)///长期持有者的市值与已实现市值的比率, 该比率开始走高表明长期持有者开始积累,市场开始向好,到一定新高度即长期持有者可能抛售他们的币来止盈,反之开始走低表明长期持有者正在出售他们的币。",
+ sthmvrv:"单位:千=K,M=百万,B=十亿 ///STH – Market Cap 短期持有者流通市值 /// STH – Realized Cap 短期持有者已实现流通市值///计算公式:STH-MVRV = Market Cap (of all UTXOs where age < 155 days) / Realized Cap (of all UTXOs where age < 155 days)///短期持有者的市值与已实现市值的比率, 该比率开始走高表明短期持有者开始积累,高到一定新高度即短期持有者可能抛售他们的币来止盈,表明达到局部顶部,反之开始走低表明短期持有者正在出售他们的币, 价格可能还会有新低。",
+ nupl:"单位:千=K,M=百万,B=十亿 ///计算公式:Net Unrealized Profit and Loss (NUPL) = Market Cap -Realixed Cap / Market Cap ///该指标表明投资者整体是处于盈利还是亏损状态。任何高于零的数值表明投资者处于净盈利状态,反之则表明处于净亏损状态,偏离零越远,市场越接近顶部和底部。",
+ uprofit:"单位:千=K,M=百万,B=十亿 ///未实现的利润是指在资产价格低于当前价格时创建的UTXO应计的总利润。",
+ uloss:"单位:千=K,M=百万,B=十亿 ///未实现的损失是指在资产价格高于当前价格时创建的UTXO应计的总损失。通过观察UTXO创建时的价格与资产的当前价格之间的delta,我们可以确定该UTXO中的投资者(价格上升)还是损失(价格下降)的状态,以及程度如何。",
+ lthnupl:"单位:千=K,M=百万,B=十亿 ///该指标评估长期持有者的盈亏情况。长期投资者可能会因为该指标的新高来售出锁定盈利,也会以为该指标的新低来买入积累利润。",
+ sthnupl:"单位:千=K,M=百万,B=十亿 ///该指标评估短期持有者的盈亏情况。该指标走出新高表明局部顶部,短期投资者可能选择售出锁定盈利,如果该指标创出新低有可能局部价格还有下行空间。",
+ mintusd:"单位:千=K,M=百万,B=十亿 ///计算公式:Puell Multiple = Daily Coin Issuance (USD) / MA365 (Daily Coin Issuance (USD))///即每日挖出的价值与365天平均挖出价值的比值///低数值意味着挖矿可能接近一年的关机价,矿工可能需要售出挖出的币来支付电费,也意味着价格底部///高数值意味着挖矿有可观的盈利,也意味着价格相对的顶部",
+ NDAQohlc:"单位:千=K,M=百万,B=十亿///MA5/MA10/MA20:分别代表5日移动平均线均价/10日移动平均线均价/20日移动平均线均价",
+ NDAQBTCPrice:"单位:千=K,M=百万,B=十亿 ///纳斯达克指数 vs BTC",
+ bian:"单位:千=K,M=百万,B=十亿 ///币安合约K线",
+ priceValue:"单位:千=K,M=百万,B=十亿 ///币安“K线”价格交易量",
+ activeAddress:"单位:千=K,M=百万,B=十亿 ///作为发送方或接收方活动的唯一地址的数目。只有在成功的交易中处于活动状态的地址才被计算在内。",
+ sendingAddress:"单位:千=K,M=百万,B=十亿 ///作为资金发送方活动的唯一地址的数目。只有在成功的非零传输中作为发送方活动的地址才被计数。",
+ receivingAddress:"单位:千=K,M=百万,B=十亿 ///活跃的作为资金接收者的唯一地址的数目。只有在成功的非零传输中作为接收者活动的地址才被计数。",
+ newAddress:"单位:千=K,M=百万,B=十亿 ///在网络中原生货币的一次交易中首次出现的唯一地址的数量。",
+ totalAddress:"单位:千=K,M=百万,B=十亿 ///网络中原生币交易中出现过的唯一地址的总数。",
+ transsizetotal:"单位:千=K,M=百万,B=十亿 ///时间段内所有事务的总大小(以字节为单位)。",
+ transsizemean:"单位:千=K,M=百万,B=十亿 ///一段时间内事务的平均大小(以字节为单位)。",
+ transactions:"单位:千=K,M=百万,B=十亿 ///交易总额。只计算成功的事务。",
+ transrate:"单位:千=K,M=百万,B=十亿 ///每秒的事务总数。只计算成功的事务。",
+ distribution:"单位:千=K,M=百万,B=十亿 ///持有至少0.1个硬币的唯一地址的数量。对于以太坊,只计算外部拥有地址(EOAs),合同不包括在内。",
+ distribution1:"单位:千=K,M=百万,B=十亿 ///持有至少0.01个硬币的唯一地址的数目。对于以太坊,只计算外部拥有地址(EOAs),合同不包括在内。",
+ distribution2:"单位:千=K,M=百万,B=十亿 ///持有至少1枚硬币的唯一地址的数目。对于以太坊,只计算外部拥有地址(EOAs),合同不包括在内。”",
+ distribution3:"单位:千=K,M=百万,B=十亿 ///持有至少10个硬币的唯一地址的数目。对于以太坊,只计算外部拥有地址(EOAs),合同不包括在内。",
+ distribution4:"单位:千=K,M=百万,B=十亿 ///持有至少100个硬币的唯一地址的数目。对于以太坊,只计算外部拥有地址(EOAs),合同不包括在内。",
+ distribution5:"单位:千=K,M=百万,B=十亿 ///持有至少1000个硬币的唯一地址的数量。对于以太坊,只计算外部拥有地址(EOAs),合同不包括在内。",
+ distribution6:"单位:千=K,M=百万,B=十亿 ///持有至少1万枚硬币的唯一地址的数量。对于以太坊,只计算外部拥有地址(EOAs),合同不包括在内。",
+ dailyVolume:"单位:千=K,M=百万,B=十亿 ///过去24小时内每个交易所期货合约的总交易量。值每10分钟更新一次。对于所有支持的交换和最早可用的数据点的列表。",
+ getDayBalanceData:"单位:千=K,M=百万,B=十亿 ///横坐标:时间 /// 纵坐标:地址数量",
+ getDayBalanceAmountData:"单位:千=K,M=百万,B=十亿 ///横坐标:时间 /// 纵坐标:地址数量",
+ usdtbigtx:"单位:千=K,M=百万,B=十亿 ///USDT大额交易表",
+ usdcbigtx:"单位:千=K,M=百万,B=十亿 ///USDC大额交易表",
+ usdtVolume:"单位:千=K,M=百万,B=十亿 ///USDT每日总交易量",
+ usdcVolume:"单位:千=K,M=百万,B=十亿 ///USDC每日总交易量",
+ ethbigtxcount:"单位:千=K,M=百万,B=十亿 ///图1 是ETH大额交易每日交易数量, 表1是大额交易详情",
+ ethTags:"单位:千=K,M=百万,B=十亿 ///地址对应标记持有者名称关系列表",
+ ethTopAddrList:"单位:千=K,M=百万,B=十亿 ///以太坊巨鲸地址余额列表",
+ ETHVolume:"单位:千=K,M=百万,B=十亿 ///Transaction Volume:交易量///Transaction Fees:交易费///EIP1559 burnt fees:该指标表示自引入EIP-1559的伦敦硬分叉实施以来焚烧的ETH的累计总和。以太坊改进提案(EIP-1559)为交易设定了基本费用,该费用用于减少ETH的总体供应。因此,这个指标表明了以太坊面临的通缩压力。///上述三个仅指示链上活动程度,数值走高意味着币可能买或卖,交易量或交易费低迷意味着链上活动少,市场处于观望状态,需结合其他指标一起分析",
+ ETHTokenBigtx:"单位:千=K,M=百万,B=十亿 /// ERC20 token 大额交易跟踪///目前仅统计合约的transfer函数",
+ ETHTokenVolume:"单位:千=K,M=百万,B=十亿 ///观察代币的活跃情况,需结合其他指标一起分析",
+ ethAddress:"单位:千=K,M=百万,B=十亿 ///活跃地址数:指示用户当前参与状态,该指标需要结合其他指标分析,数值走高可能意味着用户的卖或买动作, 数值低 意味着当前链上转账不活跃///接收地址数:指示用户当前买入情况,数值高意味着用户可能的买的动作,数值低意味着当前链上转账不活跃,需结合其他指标分析///发送地址数:指示用户当前花费情况, 数值走高意味着用户可能的卖的动作,数值低意味着当前链上转账不活跃,需结合其他指标分析",
+ none:"单位:千=K,M=百万,B=十亿 ///无",
+ reward:"单位:千=K,M=百万,B=十亿 ///统计抵押奖励观察抵押者的盈利情况,变低可能导致抵押者退出抵押抛出币锁定利润, 变高可能导致抵押者买入币进行抵押积累利润",
+ cnew:"单位:千=K,M=百万,B=十亿 ///链上每天部署的新合约数,本身无特别意义,需结合其他指标一起分析",
+ newContract:"单位:千=K,M=百万,B=十亿 ///每日新创建的智能合约地址列表",
+ dayUsdc:"单位:千=K,M=百万,B=十亿 ///目前只统计了usdc在tron和ETH链上transfer函数的交易量",
+ dayUsdt:"单位:千=K,M=百万,B=十亿 ///目前只统计了usdt在tron和ETH链上transfer函数的交易量",
+ dayBusd:"单位:千=K,M=百万,B=十亿 ///目前只统计了busd在ETH链上transfer函数的交易量",
+ bigUsdc:"单位:千=K,M=百万,B=十亿 ///目前只记录了usdc在tron和ETH链上transfer函数相关的大额交易",
+ bigUsdt:"单位:千=K,M=百万,B=十亿 ///目前只记录了usdt在tron和ETH链上transfer函数相关的大额交易",
+ bigBusd:"单位:千=K,M=百万,B=十亿 ///目前只记录了busd在ETH链上transfer函数相关的大额交易",
+ profitAddress:"单位:千=K,M=百万,B=十亿 ///计算公式:Address in Profit = total address where Price >= Price_ created///即在当前价格下相对创建价格处于盈利状态的地址个数,指示市场顶部, 越高代表大部分地址处于盈利状态,有抛售止盈风险",
+ lossAddress:"单位:千=K,M=百万,B=十亿 ///计算公式:Address in Loss = total address where Price < Price_ created///即在当前价格下相对创建价格处于亏损状态的地址个数,指示市场底部,越低代表大部分地址处于亏损状态,可以适时买入",
+ profitRatio:"单位:千=K,M=百万,B=十亿///计算公式:Percent of Address in Profit =Address in Profit / Total Address///即在当前价格下相对创建价格处于盈利状态的地址占总地址的百分比,指示市场顶部, 越高代表大部分地址处于盈利状态,有抛售止盈风险",
+ lthSupply:"单位:千=K,M=百万,B=十亿///即币龄超过155天的持有者的供应总量,该指标观察长期持有者是否在卖出或积累币,走高意味着当前价格是否被低估,适合买入, 走低意味着当前价格被高估,适合卖出",
+ sthSupply:"单位:千=K,M=百万,B=十亿///即币龄小于155天的持有者的供应总量,该指标观察短期持有者是否在卖出或积累币,走高意味着短期持有者在积累币,走低表明短期持有者在出售手中的币,用户需结合其他指标分析是否跟随",
+ realizedPrice:"单位:千=K,M=百万,B=十亿///计算公式:Realized Price = Realized Cap / circulating supply///已实现价格指标表明币当前合理的价格,一般用于评估支撑价格,投资者可以参考该指标评估价格是否处于超买或超卖区间。",
+ relativeLthSth:"单位:千=K,M=百万,B=十亿///即波浪图指示长期和短期持有者盈亏供应量的分布,方便用户观察4个指标与价格的对应关系。",
+ lthProfitSupply:"单位:千=K,M=百万,B=十亿///计算公式:Profit for LTH = number of balance where Price > Price_created and Holder Time >= 155days",
+ lthLossSupply:"单位:千=K,M=百万,B=十亿///计算公式:Loss for LTH = number of balance where Price <= Price_created and Holder Time >= 155days",
+ sthProfitSupply:"单位:千=K,M=百万,B=十亿///计算公式:Profit for STH = number of balance where Price > Price_created and Holder Time < 155days",
+ sthLossSupply:"单位:千=K,M=百万,B=十亿///计算公式:Loss for STH = number of balance where Price <= Price_created and Holder Time < 155days",
+ sthProfitRatio:"单位:千=K,M=百万,B=十亿///计算公式:PL Ratio for STH = Profit for STH / Loss for STH ///短期持有者指持有少于155天的地址,如果短期持有者绝大部分处于盈利状态,短期内可能会选择出售止盈,也可能价格会继续上行是跟进买入机会,如果短期持有者绝大部分处于亏损状态,短期内可能是买入机会, 也可能价格底还未到,可能继续下行。如果短期持有者盈亏比处于极端的状态,比率出现新高或新低,意味着对应的售出和买入机会。该指标需要用户配合其他指标自行斟酌。",
+ SLRVRatio:"单位:千=K,M=百万,B=十亿/// 计算公式:SLRV ratio = HOLDER in 24h / HOLDER in 6m~1y /// 即24小时持有者与6个月到1年的持有者的比率,该指标用于测量短期持有者对比长期持有者的流通速度以检测是否是熊市。走高的SLRV比率表明短期持有者在网络上更加活跃,意味着市场顶部即将到来, 走低的SLRV比率表明短期持有者活动很少,或者是长期持有者的基数大大增加,需要结合其他指标分析是否是买入的机会。",
+ lthProfitRatio:"单位:千=K,M=百万,B=十亿///计算公式:PL Ratio for LTH = Profit for LTH / Loss for LTH ///长期持有者指持有超过155天的地址,如果长期持有者绝大部分处于盈利状态,可能会选择出售止盈,如果长期持有者绝大部分处于亏损状态,可能是买入机会。如果长期持有者盈亏比处于极端的状态,比率出现新高或新低,意味着对应的售出和买入机会。",
+ null:"单位:千=K,M=百万,B=十亿///无",
+ frm:"单位:千=K,M=百万,B=十亿///计算公式:Fee Ratio Multiple =miner revenue( blocks rewards + transaction fees ) / transaction fees///即矿工总收入与交易费的比率,属于衡量比特币网络安全性的指标,低数值意味着用户只需支付较低的交易费用同时有着较高的网络安全性,即矿工有可观盈利加大算力去维护网络,高数值意味着用户需支付较高交易费用来维护网络运行,导致其经济性降低,用户不活跃,总交易费会进一步降低即矿工可能关机导致算力变低,安全性降低.",
+ cvdd:"单位:千=K,M=百万,B=十亿///累积价值-已销毁天数是被销毁的硬币天数的累计美元价值与市场年龄(天数)的比。该指标用于探测市场底部。",
+ balancedPrice:"单位:千=K,M=百万,B=十亿///平衡价格是实现价格和交易价格之间的差。交易价格是以美元计算的被销毁的硬币天数的累积总和,由流通供应和比特币成立以来的总时间调整。平衡价格试图检测主要周期的底部。投资者可以参考该指标评估币的支撑价格。",
+ nvtRatio:"单位:千=K,M=百万,B=十亿///计算公式:NVT Ratio =Market Cap [USD] / Transaction Volume [USD]///市值与交易值(NVT)比率描述了市值与交易量之间的关系。该指标类似于股票中的市盈率。走高或新高的比值表明投资者对比特币的定价是溢价的,因为市值增长超过了链上交易量和价值结算的利用。从历史上看,高NVT比率值与市场顶部和高估期相吻合。走低或新低的比值表明投资者对比特币的定价是有折扣的,因为链上传输量和网络利用率超过了市值增长。从历史上看,低NVT比率值是有利于积累的时期,而且往往与市场底部和趋势性牛市相吻合。一个恒定的NVT比率(或横向趋势)表明目前市值和转让量的增长趋势都处于平衡状态,表明目前的市场趋势是可持续的。这种状态往往是在看涨或看跌趋势的早期和中期达到的,因为市场方向已经确定。",
+ velocity:"单位:千=K,M=百万,B=十亿///计算公式:Velocity = 1 / NVT Ratio = Transaction Volume [USD] / Market Cap [USD] ///该指标衡量币在网络中流通的速度。走高表明用户采用该币可能变得活跃, 走低表明用户活动变得低迷, 通常需结合其他指标综合判断。",
+ PiCycleTopIndicator:"单位:千=K,M=百万,B=十亿///在历史上,Pi Cycle Top指标在挑选市场周期高点的时间方面一直很有效,可以达到3天之内。在过去的三个市场周期中,当111DMA向上移动并穿过350DMA x 2时,我们看到它与比特币的价格达到峰值相吻合",
+ ssr:"单位:千=K,M=百万,B=十亿///计算公式:SSR = Market Cap (of BTC) / Market Cap (of all Stablecoins )///当SSR较低时,当前的稳定币供应有更多的 `购买力`来购买BTC",
+ ssro:"单位:千=K,M=百万,B=十亿///计算公式:SSR Oscillator = bollinger_bands(200,2) /// 稳定币震荡指标来自于稳定币供应比率(SSR),并量化SSR的200d SMA在布林线BB(200, 2)内的移动情况。当数值冲高时表明购买力正在消耗, 当数值新低时表明购买力正在累积",
+ stfRatio:"单位:千=K,M=百万,B=十亿///计算公式:S/F = circulating supply/newly mined bitcoins///库存与流量(S/F)比率是一个流行的模型,它假定稀缺性驱动价值。它被定义为一种商品的现有库存和新生产的流量的比率",
+ stfDeflection:"单位:千=K,M=百万,B=十亿///计算公式:S/F Deflection = Price/( circulating supply/newly mined bitcoins)///稀缺性偏差是指一项资产的当前价格和其稀缺性的比率。它被用来确定一项资产在其稀缺性方面是被高估还是低估了///如果偏转≥1,意味着根据S/F模型,该资产被高估了。如果偏移量<1,根据这个模型,该资产被低估了",
+ goldenRatioMult:"单位:千=K,M=百万,B=十亿///黄金比例乘数探讨了比特币的价格对数曲线和市场周期,以了解价格在中长期时间框架上可能的表现。它的市场周期高点碰到了350DMA的递减斐波那契序列倍数。这是因为随着时间的推移,比特币在对数规模上的爆炸性增长正在放缓。随着它的市值增加,同样的对数规模的增长速度变得更加困难",
+ distribution:"单位:千=K,M=百万,B=十亿///持有正数(非零)硬币的唯一地址的数量。合同被排除在外,只有外部拥有的地址(EOA)被计算在内。注意到ERC-20资产1h分辨率每24小时更新一次。",
+ supplyDistribution:"单位:千=K,M=百万,B=十亿///具有特定平衡带的地址之间的相对供应分布。仅包括外部拥有地址(EOAs)的供应,合同中的供应不包括在内。因此,这些数字是相对于EOAs中持有的总供应量而言的。",
+ profitPercentEth:"单位:千=K,M=百万,B=十亿///其基金的平均买入价格低于当前价格的唯一地址的百分比。“买入价格”在这里被定义为硬币被转移到一个地址时的价格。仅计算外部拥有地址(EOAs),合同不包括在内。",
+ profitEth:"单位:千=K,M=百万,B=十亿///其基金的平均买入价格低于当前价格的唯一地址的数目。“买入价格”在这里被定义为硬币被转移到一个地址时的价格。仅计算外部拥有地址(EOAs),合同不包括在内。",
+ lossEth:"单位:千=K,M=百万,B=十亿///其基金的平均买入价格高于当前价格的唯一地址的数目。“买入价格”在这里被定义为硬币被转移到一个地址时的价格。仅计算外部拥有地址(EOAs),合同不包括在内。",
+ inflactionRateEth:"单位:千=K,M=百万,B=十亿///计算公式:Inflation Rate = new coins issued / current supply///该指标表明币的通货膨胀情况,因为币未设定发行上限,且有燃烧费用,所以要通过该指标来观察是否进入通缩还是通胀阶段,一直通缩表明该币存在稀缺性, 一直通胀表明该币存在超发风险",
+ issuanceEth:"单位:千=K,M=百万,B=十亿///添加到当前供应中的新硬币总量,即铸造硬币或发布到网络的新硬币。",
+ soprEth:"单位:千=K,M=百万,B=十亿///SOPR指标反映了在链上移动的所有币的利润变现程度。///SOPR值大于1意味着当天移动的币平均来说是盈利的(卖出价格大于支付价格)。///SOPR值小于1,意味着当天移动的币平均来说是亏损的(卖出价格小于支付价格)。///SOPR值正好为1,意味着当天移动的币平均来说是以收支平衡的方式出售硬币。///SOPR呈上升趋势,意味着利润正在实现。///SOPR呈下降趋势,意味着正在实现损失和/或盈利的币没有被使用。",
+ velocityEth:"单位:千=K,M=百万,B=十亿///流通速度是衡量单位在网络中流通速度的指标,通过将链上交易量(以美元计)除以市值来计算,即NVT比率的倒数。",
+ nvtRatioEth:"单位:千=K,M=百万,B=十亿///市值/交易价值比(NVT)是通过市值除以以美元衡量的转移链上交易量来计算的。NVT比率是由威利·吴创造的。",
+ livelinessEth:"单位:千=K,M=百万,B=十亿///活跃度被定义为被摧毁的硬币天数总和和所有被创造的硬币天数总和的比率。当长期持有者平仓时,活跃度增加,而当他们积累到HODL时,活跃度下降。这个指标是由Tamas Blummer创建的。",
+ frmEth:"单位:千=K,M=百万,B=十亿///交易费率乘数(FRM)定义为矿工总收益(区块奖励+交易费用)与交易费用之间的比率。FRM是对区块链安全性的衡量,并评估区块奖励消失后链的安全性。这个指标是由Matteo Leibowitz首先提出的",
+ supplyProfitPercentEth:"单位:千=K,M=百万,B=十亿///流通供给量占利润的百分比,即在上次移动时价格低于当前价格的现有硬币的百分比。",
+ supplyProfitEth:"单位:千=K,M=百万,B=十亿///以利润为单位的流通供应量,即上次移动时价格低于当前价格的硬币数量.",
+ supplyLossEth:"单位:千=K,M=百万,B=十亿///流通供应量的损失,即上次移动时价格高于当前价格的硬币数量。",
+ nuplEth:"单位:千=K,M=百万,B=十亿///未实现的净收益损失比是相对未实现利润和相对未实现亏损之间的差额。欲了解更多信息,请参阅本文。这一指标也可以通过从市值中减去已实现的市值,并将结果除以本文所述的市值来计算。",
+ relativeUProfitEth:"单位:千=K,M=百万,B=十亿///相对未实现利润定义为所有现有货币在变现时的价格低于当前市值规范化价格的美元利润总额",
+ relativeULossEth:"单位:千=K,M=百万,B=十亿///未实现的净亏损量定义为所有现有货币在变现时的价格高于当前市值规范化价格的美元总损失。",
+ lthNUPLEth:"单位:千=K,M=百万,B=十亿///长持者未实现的净收益量 (LTH-NUPL)是指净未实现利润/亏损,仅考虑寿命至少为155天的UTXOs,可作为评估长期投资者行为的指标。",
+ sthNUPLEth:"单位:千=K,M=百万,B=十亿///短持者未实现的净亏损量 (sb -NUPL)是指净未实现利润/亏损,仅考虑小于155天的utxo,并作为评估短期投资者行为的指标。",
+ marketcapEth:"单位:千=K,M=百万,B=十亿///流通市值(或网络价值)定义为当前供应量与当前美元价格的乘积。",
+ rcapEth:"单位:千=K,M=百万,B=十亿///已实现流通市值:已实现的上限以不同的价格对不同部分的供应进行估值(而不是使用当前的每日收盘价)。具体来说,它是通过最后一次移动每个UTXO时的价格来计算的。",
+ rpriceEth:"单位:千=K,M=百万,B=十亿///实现价格是实现上限除以当前供应量。",
+ mvrvRatioEth:"单位:千=K,M=百万,B=十亿///流通市值-已实现流通市值比(MVRV)是市值与实现价值之间的比率。它表明交易价格何时低于“公允价值”。这个指标是由David Puell和Murad Muhmudov创建的。",
+ burnedSupplyEth:"单位:千=K,M=百万,B=十亿///统计燃烧费观察币的通缩情况,需结合其他指标一起分析",
+ mintedSupplyEth:"单位:千=K,M=百万,B=十亿///已发行ETH的总量。",
+ tzbp:"单位:千=K,M=百万,B=十亿///该指标显示各个工作时间内的价格变化,即亚洲(00:00-12:00 UTC)、美洲(12:00-0:00 UTC)、欧洲(06:00-18:00 UT)。当前仅包含币安的数据",
+ lthVolume:"单位:千=K,M=百万,B=十亿///即币龄超过155天的持有者每日的交易量, 该指标观察长期持有者是否在卖出币,交易量走高可以用来评估当前价格是否被高估",
+ bobp:"单位:千=K,M=百万,B=十亿///该指标统计指定时间间隔(比如5分钟)在各个分段价位上的潜在买入卖出挂单, 表明资金的意向。当前仅包含币安的数据",
+ cddwave:"单位:千=K,M=百万,B=十亿///",
+ balanceDistribution:"单位:千=K,M=百万,B=十亿///该指标表明持有者的余额分布,通过大额地址的历史数量变化观察巨鲸是否在买入或卖出, 通过小额地址的历史占比变化,观察新用户的增长情况, 通过大额数量占总流通量的对比观察币的垄断程度。",
+ timeDivision:"单位:千=K,M=百万,B=十亿///该指标观察持有者的币龄分布及对应的币数量",
+ priceDivision:"单位:千=K,M=百万,B=十亿///该指标观察持有者在当前价格相对于买入价格的价差分布及对应的地址数量",
+ priceDivision1:"单位:千=K,M=百万,B=十亿///该指标观察持有者在当前价格相对于买入价格的价差分布及对应的币数量",
+ profitDistribution:"单位:千=K,M=百万,B=十亿///该指标表明持有者相对于当前价格的盈利分布情况, 通过盈利占比观察如果绝大部分持有者都处于盈利状态, 通常意味着顶部的到来, 如果绝大部分持有者处于亏损状态, 通常意味着底部的形成。",
+ detailedDistribution:"单位:千=K,M=百万,B=十亿///该指标将余额分成段并详细描述各个段的币龄,币数量分布,用户可以分析各个段的分布特点和历史变化结合其他指标一起分析网络整体特征。",
+ volumeProfile:"单位:千=K,M=百万,B=十亿///成交量分布图是一项高级图表研究,显示指定时间段内指定价格水平的交易活动。这项数据(考虑了用户定义的参数,例如行数和时间段)在图表上绘制了直方图,旨在显示基于数量的主要和/或重要价格水平。本质上,成交量分布图会获取指定时间段内以特定价格水平交易的总交易量,并将总交易量分为买入交易量或卖出交易量,然后使交易者可以轻松看到该信息。当前仅包含币安的数据",
+ exchange1:"单位:千=K,M=百万,B=十亿///交易所持有的ETH总币量,目前仅统计前10交易所,即Binance 、BinanceUS 、Bitfinex 、Bitstamp 、Bybit 、Coinbase 、Gate 、Kraken、KuCoin 、OKX ",
+ quickNews:"引用金十数据网站",
+ circulationTotalCSupply:"单位:千=K,M=百万,B=十亿///总流通量指标观察USDC,USDT,BUSD的流通量之和,当该指标上升时通常表明更多的购买力,反之则购买力下降",
+ circulationUSDC:"单位:千=K,M=百万,B=十亿///USDC流通量观察USDC的流通量变化",
+ circulationUSDT:"单位:千=K,M=百万,B=十亿///USDT流通量观察USDC的流通量变化",
+ circulationBUSD:"单位:千=K,M=百万,B=十亿///BUSD流通量观察USDC的流通量变化",
+ ethTopAddrMonitorList:"单位:千=K,M=百万,B=十亿///跟踪以太坊大额持有者的链上活动",
+ mempool:"单位:千=K,M=百万,B=十亿///通过观察待交易池里的交易数和交易费观察待交易情况,突然变高可能表明有用户需要售出币,需要结合其他指标一起分析",
+ nvtSign:"单位:千=K,M=百万,B=十亿///NVT Signal (NVTS)是NVT Ratio的改进版,它使用每日转账量的90天移动平均值作为分母。高NVT Signal 通常意味着市场的顶部, 低NVT Signal通常意味着市场底部。///恒定的NVT信号(或横向趋势)表明当前市值和转移量的增长趋势处于平衡状态,表明当前市场趋势是可持续的。这种状态通常出现在看涨或看跌趋势的初期至中期,此时市场方向已经确立。",
+ USTreasuriesYields:"单位:千=K,M=百万,B=十亿///由一国政府(财政部)发行的中长期债务工具,一般采用面额发行,定期付息,到期偿付本金和最后一期利息///美国国债收益率是指美国政府债券的利率,通常以10年期和30年期国债收益率最为广为关注。这些收益率在金融市场中被认为是重要的经济指标,可以反映市场对美国经济状况和通胀预期的看法。///包含:30年期政府债券收益率、20年期政府债券收益率、10年期政府债券收益率、5年期政府债券收益率、2年期政府债券收益率、1年期政府债券收益率、6月期政府债券收益率、3月期政府债券收益率、1月期政府债券收益率",
+ MoneyStockMeasures:"单位:千=K,M=百万,B=十亿///MB:包括硬币、纸币在内的流通货币 (Currency in Circulation) 以及银行准备金余额 (Reserve Balances)///M1:M1由///(1)美国财政部、联邦储备银行和存款机构金库以外的货币组成;///(2)商业银行的活期存款(不包括存款机构、美国政府、外国银行和官方机构持有的金额)减去托收过程中的现金项目和美联储浮动资金;///(3)其他流动存款,包括其他支票存款(或 OCD,其中包括可转让提款指令或 NOW 和自动转账服务,或 ATS、存款机构账户、信用合作社的共享汇票账户以及活期存款)储蓄机构)和储蓄存款(包括货币市场存款账户)///M2:M2 包括 M1 加上/// (1) 小额定期存款(金额低于 100,000 美元的定期存款)减去个人退休账户 (IRA) 和存款机构的 Keogh 余额;///(2) 零售货币市场基金 (MMF) 中的余额减去 MMF 中的 IRA 和 Keogh 余额///M3(已停止更新):M3是货币供应量中最宽泛的一指标,包括M2以及更长期、更大额度的存款、大额时间存款、机构投资者的存款等。在2006年,美国停止了对M3的官方统计,因此,M3的计算方法可能会有所不同,但一些私人机构和研究机构可能会尝试估算M3,但这些估算结果可能不同且缺乏官方认可。需要注意的是,这些指标的具体定义和计算方法可能因不同的国家或机构而异。在美国,这些指标由美联储(美国联邦储备系统)进行统计和发布。",
+ loanPsi:"单位:千=K,M=百万,B=十亿///私营部门(又称“民营部门”,英语:private sector)是经济的一部分,有时被称为公民部门(英语:citizen sector),由个人或私人团体拥有,而不是由国家所有,与之相对的是公共部门。 私营部门分为两个子部门:家庭部门和私营企业部门这里的私营部门贷款数据就是前面商业银行资产负债表中的“商业和工业贷款”数值。",
+ loanGdp:"单位:千=K,M=百万,B=十亿///",
+ wei:"单位:千=K,M=百万,B=十亿///纽约联储为因应 2020 年所爆发的新冠肺炎疫情,挑选了十项每日或每週更新等高频数据,并将这些数据组成综合指数,每週发布一次,以观察较即时的经济变化。该指数每週四更新上週数据,并于下週二修正前值。///这十项数据涵盖日常消费、就业市场、生产力三大面向,以下分别列出:///1. 红皮书报告:同店零售销售(Redbook Research:Same-store retail sales average)///2. 初次申请失业金人数///3. 连续申请失业金人数///4. ASA 僱佣指数(The American Staffing Association Staffing Index)///5. 拉斯穆森消费指数(Rasmussen Consumer Index)///6. 每週钢铁产量///7. 电力输出量///8. 每週燃料销售量///9. 美国铁路流量///10. 联邦预扣税数据///将上述数据组成纽约联储每週经济指数,可以观察到短线间美国实体经济的变化,为一项领先指标。当指标向上时,实体经济可能将转佳;而当指标向下时,则代表实体经济有转弱的迹象。",
+ USDCCasting:"单位:千=K,M=百万,B=十亿///USDC铸造量介绍USDC铸造星观察USDC每日铸造量的变化并记录在哪些链的哪些交易上被铸造目前仅观察eth,tron链",
+ USDTCasting:"单位:千=K,M=百万,B=十亿///USDT铸造量介绍USDT铸造星观察USDT每日铸造量的变化并记录在哪些链的哪些交易上被铸造目前仅观察eth,tron链",
+ BUSDCasting:"单位:千=K,M=百万,B=十亿///BUSD铸造量介绍BUSD铸造星观察BUSD每日铸造量的变化并记录在哪些链的哪些交易上被铸造目前仅观察eth链",
+ buyingPrice:"单位:千=K,M=百万,B=十亿///该指标表明持有者在什么价位购入了币,即持有成本。一般来说,某个价位积累的币为了盈利不会轻易抛售,故一般构成支撑点的判定。",
+ distributionLthSth:"单位:千=K,M=百万,B=十亿///通过对比长期持有者和短期持有者的盈利和亏损数据来观察当前市场处于顶部还是底部,市场是否还有增长潜力或处于下降通道。通常长期持有者处于大部分亏损状态意味着市场的相对底部, 反之则是顶部要注意抛售获利风险, 短期持有者处于大部分盈利状态意味着当前的相对顶部,有阶段性止盈需求。",
+ exchangeRate:"不同货币之间的兑换比率即为汇率。外汇交易市场决定了具体的汇率,进而决定了购买外国商品和金融资产的成本。///汇率的变化是连续的,并且受到全球外汇市场参与者的交易活动和供求关系的影响。市场参与者可以在交易时间内随时进行交易,这也是导致汇率变动的主要原因。商业银行、金融数据提供商和新闻机构也是获取实时汇率数据的重要来源。汇率是由市场上的交易活动决定的,市场参与者通常会根据各自的交易平台和数据源获取汇率数据。因此,选择可靠的数据提供商和数据来源是确保汇率数据准确性和可靠性的关键。",
+ GDP:"净出口 = 出口额 – 进口额///个人消费支出(PCE, Personal consumption expenditures)///国内私人投资总额(Gross private domestic investment)///商品和服务的净出口(Net exports of goods and services)///个人消费支出(PCE, Personal consumption expenditures):耐用消费品(Durable goods)、非耐用消费品(Nondurable goods)、服务(Services) /// 国内私人投资总额(Gross private domestic investment):固定投资、私人库存变动 ///商品和服务的净出口(Net exports of goods and services):出口、进口。///",
+ vdd:"Value Days Destroyed(VDD)Multiple旨在确定比特币价格何时可能出现泡沫,并接近主要周期高点。///它使用了销毁硬币天数的原理,Coin Days Destroyed是支出速度的代表,它为长时间没有在链上移动的硬币提供了额外的权重。///销毁的价值天数乘以销毁的硬币天数乘以$BTC的价格,从而随着$BTC价格的变化,可以更好地比较一段时间内的消费活动。///Value Days Destroyed Multiple然后将30天的VDD平均值除以365的平均值,将近期支出速度与年平均支出速度进行比较。///它能够突出显示旧硬币何时开始迅速进入市场销售。这种情况通常发生在长期参与者希望在主要牛市周期中随着价格加速上涨而获利时。///这种旧硬币进入市场的现象最终导致价格下跌,供不应求,牛市结束。",
+
+
+ }
+
+
+}
+export const introduction_en = {
+ introduce:{
+ btcbigtxcount:"Unit: thousands =K, M= millions, B= billion///Record transfers with a transaction value of>=1 million USD on the chain. For entities with address labels that can identify both parties to the transaction, the price can be predicted by observing the number and amount of large transactions. When prices fluctuate significantly, there are usually large transfers in or out of the exchange.",
+ address:"Unit: thousands =K, M= millions, B= billion///Total Address:Total number of addresses, indicating the growth status of user numbers, excluding addresses with a balance of 0. A higher number of addresses means more new users are entering///New Address:The daily number of new addresses indicates the short-term participation status of users. A higher value indicates more new users entering, while a lower value indicates that users are losing interest in buying coins///Active Address:The number of active addresses per day indicates the user's current participation status. This indicator needs to be analyzed in conjunction with other indicators. A higher value may indicate the user's selling or buying actions, while a lower value indicates that the current online transfer is not active///Send Address:The number of daily sending addresses indicates the user's current spending situation. A higher value indicates the user's possible selling actions, while a lower value indicates that the current on chain transfer is not active, which needs to be analyzed in conjunction with other indicators///Receive Address:The daily number of receiving addresses indicates the user's current buying situation. A high value indicates the user's possible buying actions, while a low value indicates that the current on chain transfer is not active, which needs to be analyzed in conjunction with other indicators///Transfer volume of new address:The daily transaction volume of new addresses indicates the buying activity of new users. A high value indicates that new users may have bought a large amount of coins, while a low value indicates that new users have a low willingness to buy in the current state",
+ blockAmount:"Unit: thousands =K, M= millions, B= billion///Block real-time trading volume",
+ dailyBuySell:"Unit: thousands =K, M= millions, B= billion///Daily transaction details of BTC",
+ utxos:"Unit: thousands =K, M= millions, B= billion///Segment of holder's balance and distribution of addresses per segment",
+ utxos2nd:"Unit: thousands =K, M= millions, B= billion///Balance-holder currency quantity distribution (distribution by number of addresses segmented by balance)",
+ holder:"Unit: thousands =K, M= millions, B= billion///This indicator observes the distribution of coin age and corresponding addresses of holders",
+ holderBalance:"Unit: thousands =K, M= millions, B= billion///X axis: the number of days the holder has exceeded /// holderBalance30: The holder has exceeded 30 days /// holderBalance10y: The holder has exceeded 10 years /// The specific number of Y axis",
+ getBuyData:"Unit: thousands =K, M= millions, B= billion///Distribution of number of addresses segmented by purchase price /// X axis: purchase price range ///Y axis: quantity of corresponding price range",
+ getBuyAmountData:"Unit: thousands =K, M= millions, B= billion///Quantity distribution of coins segmented by purchase price /// X axis: purchase price range /// Y axis: quantity of coins in corresponding price range",
+ getDiffData:"Unit: thousands =K, M= millions, B= billion///Address number distribution according to buy/sell price difference /// X axis: current price-purchase price difference /// Y axis: quantity distribution data",
+ getDiffAmountData:"Unit: thousands =K, M= millions, B= billion///Address number distribution according to buy/sell price difference /// X axis: holder's current earning coin range /// Y axis: quantity distribution data ",
+ getProfitData:"Unit: thousands =K, M= millions, B= billion///Number of addresses distributed by revenue segment /// X axis: current revenue range ///Y axis: number of revenue ranges",
+ getProfitAmountData:"Unit: thousands =K, M= millions, B= billion///Number distribution of coins segmented by profit /// X axis: current range of coins earned by the holder ///Y axis: number distribution data",
+ getTopList:"Giant whale supporters can observe the changes in the status of giant whale holders by selecting a certain balance range and time range. For those with an address tag, they can observe who holds the address or search for a user specified address to observe the changes in ownership",
+ getTopListWatch:"Unit: thousands =K, M= millions, B= billion///Table of changes in the number of giant whale coins",
+ coinmarketall:"Unit: thousands =K, M= millions, B= billion///Currency price every 5 minutes (sorted by market capitalization, only the top 100 values are shown)",
+ btcTags:"Unit: thousands =K, M= millions, B= billion///Address corresponding tag holder name relationship list",
+ BTCVolume:"Unit: thousands =K, M= millions, B= billion///Transaction Volume///Transaction Fees///Transaction Volume (Entity-adjusted):(Eliminating zero change trading volume) means eliminating the zero change portion of on chain transactions, reflecting the trading volume situation more realistically///The above three only indicate the degree of on chain activity. A higher value indicates that the currency may be bought or sold, while a lower transaction volume or fee indicates less on chain activity. The market is in a wait-and-see state, and needs to be analyzed in conjunction with other indicators",
+ minerAddress:"Unit: thousands =K, M= millions, B= billion///The change in the balance of miners means that a continuous increase in the value means that miners are hoarding coins to obtain more profits, while a decrease in the value means that miners are selling their coins to stop profits",
+ minerBalance:"Unit: thousands =K, M= millions, B= billion///Miner Balance:The total supply held in miner addresses .",
+ MVRV:"Unit: thousands =K, M= millions, B= billion/// Calculation formula:MVRV = Market Cap / Realized Cap /// This indicator evaluates the ratio of circulating market value to actual market value. A rise indicates that investors have started to accumulate returns. When the ratio is greater than 3.5, it indicates that the market is starting to overheat, and the price is already high-risk. Investors may sell currency lock in returns. A decline indicates that investors' returns are beginning to release and may enter a bear market. When the ratio is less than 1.0, it indicates that the market has entered a surrender stage and also indicates a possible bear market stage.",
+ MVRVZ:"Unit: thousands =K, M= millions, B= billion/// Calculation formula:MVRV-Z Score =Market Cap - Realized Cap / Standard Deviation (Market Cap)/// Whether the current price of the evaluated currency asset relative to its market value standard deviation is overvalued or undervalued. When the market value is significantly higher than the actual value, it indicates that it may have reached the top of the market, otherwise it indicates that it has reached the bottom of the market.",
+ NVTRatio:"Unit: thousands =K, M= millions, B= billion///The Network Value to Transactions (NVT) Ratio is computed by dividing the market cap by the transferred on-chain volume measured in USD. The NVT Ratio was created by Willy Woo.",
+ NVTSignal:"Unit: thousands =K, M= millions, B= billion///The NVT Signal (NVTS) is a modified version of the original NVT Ratio. It uses a 90 day moving average of the daily transaction volume in the denominator instead of the raw daily transaction volume. This moving average improves the ratio to better function as a leading indicator.",
+ OHLCPrice:"Unit: thousands =K, M= millions, B= billion///OHLC dollar-denominated asset price candlestick chart",
+ jzr60:"Unit: thousands =K, M= millions, B= billion///This indicator has accumulated a 60 day increase, and when the short-term currency price increases faster than the entry speed of new funds, i.e. the increase is too high (such as exceeding 100%), it will cause investors to sell coins to lock in short-term profits",
+ arh999:"Unit: thousands =K, M= millions, B= billion/// Ahr999=(Bitcoin price/200 day Fixed investment cost) * (Bitcoin price/exponential growth valuation)///Exponential growth valuation=10 ^ [5.84 * log (currency age) - 17.01]///Currency age=number of days from the current date to January 3, 2009///When the price of Bitcoin is both lower than the short-term fixed investment cost and expected valuation, increasing the investment amount can increase the probability of user returns.According to the indicator backtesting, when the ahr999 indicator data is below 0.45, it may be suitable for bottoming out, and between 0.45 and 1.2, it may be suitable for booking BTC. If it is higher than this range, it may not be a good timing for booking at this time///Ahr999x Index Escape Index///Ahr999x=(200 day fixed cost/Bitcoin price) * (exponential growth valuation/Bitcoin price) * 3///This indicator is opposite to arh999 and is used to indicate top flight",
+ DaysNeedle:"Unit: thousands =K, M= millions, B= billion///Celestial needle",
+ Holding:"Unit: thousands =K, M= millions, B= billion///The number of bitcoin in the Purpose Bitcoin ETF. Source: Purpose Investments",
+ Flows:"Unit: thousands =K, M= millions, B= billion///The number of bitcoin flowing from/to the Purpose Bitcoin ETF. Source: Purpose Investments",
+ ma730:"Unit: thousands =K, M= millions, B= billion///This indicator highlights the period during which buying or selling Bitcoin generates excess returns. Buying Bitcoin has historically generated huge returns when prices fall below the two-year moving average (green line). Selling Bitcoin when the price exceeds the 2-year moving average x5 (red line) has always been an effective way to generate profits",
+ capReal:"Unit: thousands =K, M= millions, B= billion///Realized capitalization (realized cap) is a variation of market capitalization that values each UTXO based on the price when it was last moved, as opposed to its current value. As such, it represents the realized value of all the coins in the network, as opposed to their market value.Realized cap reduces the impact of lost and long dormant coins, and weights coins according to their actual presence in the economy of a given chain. When a coin that was last moved at significantly cheaper prices is spent, it will re-value the coins to the current price, and thus increase realized cap by a corresponding amount. Similarly,/// if a coin is spent at a price lower than when it was last moved, it will re-value to a cheaper price and have a corresponding decrease on realized cap.Given realized cap values each coin at the time last moved, it can be considered a proxy for the value 'stored' or 'saved' in the asset. This metric can therefore be considered an estimate of the aggregate cost basis for the network and makes it a powerful baseline for the creation of additional metrics (e.g. MVRV and NUPL).",
+ CDD:"Unit: thousands =K, M= millions, B= billion///Calculation formula:CDD = value . lifespan [days] (of all spent outputs ) /// Calculation formula: Supply-Adjusted CDD = CDD / Total Supply///CDD is a valuable tool for observing the consumption behavior of long-term holders and wealthy investors, as it considers both lifespan and coin count. It is particularly suitable for observing macro trends, where investors who have accumulated in previous cycles begin to spend their coins.///High indicator values may indicate that long-term investors are spending coins to achieve profits, leveraging market forces, or reducing their belief in holding assets.///Continuous high or trendy high indicator values add weight to the conclusion of long-term holder consumption behavior. In bullish markets, CDD usually tends to rise as long-term holders sell during market strength and often peak near local price peaks.///Low indicator values occur when daily network traffic is dominant, old coins remain dormant, and the belief in holding assets is high. A period of reduced interest in the asset (such as a bear market) often leads to a decrease in on chain activity, resulting in lower indicator values.///Persistent low or trendy lower indicator values may indicate that long-term holders' confidence is recovering and they are starting to hold rather than spend their coins.///The CDD of supply adjustment indicates the impact of the accumulation of total supply on the CDD indicator. As more coins are issued and more CDD is accumulated by the total network, the lower limit of CDD will increase over time.",
+ fundingRate:"Unit: thousands =K, M= millions, B= billion///Capital rate refers to the periodic fee paid to long or short traders based on the price difference between the market price of the perpetual contract and the spot price. Therefore, depending on the open position, the trader can be either the payer or the payee.The fund rate can prevent sustained price deviations between the two markets. It will be recalculated multiple times within a day, and the current recalculation interval is 8 hours.Currently only data containing BINANCE",
+ openInterest:"Unit: thousands =K, M= millions, B= billion///Open positions and approximations refer to the total number of contracts that are currently open, including the number of unexpired contracts and the number of contracts that have not been executed (settled).The number of open positions is usually used to confirm the trend and reversal of the contract. Currently only data containing BINANCE",
+ takerlongshortRatio:"Unit: thousands =K, M= millions, B= billion///Contract active buying volume refers to the trading volume of contract active buying per unit of time displayed(taker Buy by eating a listed order),That is, the inflow of funds. Generally speaking, a large active buying volume of contracts indicates that the market is bullish. Currently, only data from Coin Security is included",
+ profitrate:"Unit: thousands =K, M= millions, B= billion///If the current price is higher than the price at the time of creation, UTXO is in a profitable state. On the contrary, if the current price is lower than the price at the time of creation, UTXO is in a loss state///Generally speaking, higher values may indicate the top of the market, while lower values may signal the bottom.",
+ sopr:"Unit: thousands =K, M= millions, B= billion///SOPR indicator reflects the degree of profit realization of all currencies moving on the chain.///SOPR value is greater than 1, it means that on average, the currency moving on that day is profitable (the selling price is greater than the payment price).///SOPR value is less than 1, it means that on average, the currency moving on that day is at a loss (the selling price is less than the payment price).///SOPR value is exactly 1, which means that on average, coins moving on the same day are sold in a breakeven manner.///SOPR is on the rise, indicating that profits are being realized.///SOPR shows a downward trend, indicating that the currency that is achieving losses and/or profits has not been used.///LTH-SOPR reflects the profitability of all coins (long-term holders) that move on the chain and have a lifespan of over 155 days. During the 155 day process (LTH threshold), market volatility and prices usually resolve in one direction, either above or below the price at the time of UTXO creation (assuming cost basis). Therefore, when the currency held by LTH is spent, it often achieves significant profits or losses. LTH-SOPR often reaches relatively large (>2.0) and small values (<0.8).///STH-SOPR reflects the degree of realization profit and loss of all coins (short-term holders) that have a lifespan of less than 155 days moving on the chain.",
+ asol:"Unit: thousands =K, M= millions, B= billion///Calculation formula:ASOL = Mean{ lifespan [days] (of all spent outputs) }///ASOL emphasizes at the macro level the lifespan of coins spent on each transaction output on that day. This provides insight into the balance between short-term (young coins) and long-term (old coins) consumption behavior over a period of time. It tends to rise with market fluctuations and changes in market sentiment and structure, because old dormant coins are spent back in circulation. A high value usually indicates an increase in the proportion of old currency usage in network traffic, which is usually related to long-term holders taking advantage of high market volatility activities. Low values usually indicate that daily traffic is mainly composed of young coins being consumed, usually related to exchanges and short-term holders.",
+ dormancy:"Unit: thousands =K, M= millions, B= billion///Calculation formula:Dormancy = CDD / Transaction Volume ///Calculation formula: Supply-Adjusted Dormancy = Dormancy / Total Supply ///The average number of dormancy days of a coin (Dormancy) describes the average number of dormancy days of each spent coin before it is moved A high dormancy value means that, on average, coins consumed on the same day have been stored in a non liquid state for a long time and may be consumed back into the circulation cycle. ///A low sleep value means that the coins spent on the day are relatively young, indicating that older coins are usually not yet spent, and the number of coins on the chain is a characteristic of more daily traffic.",
+ soag:"Unit: thousands =K, M= millions, B= billion///This indicator can be comprehensively analyzed in conjunction with the CDD indicator by observing the sales status of long-term and short-term holders of coin age distribution.",
+ csupply:"Unit: thousands =K, M= millions, B= billion///The total amount of money supply that has been excavated or issued, which indicates how much currency has been circulated and how much remains to be circulated. When the circulation proportion is relatively high, it means that the First level issuance is approaching the end. For currencies with a fixed total issuance volume, the maintenance network operation will mainly rely on transaction fees in the future.",
+ Liveliness:"Unit: thousands =K, M= millions, B= billion///Calculation formula:Liveliness = Cumulative CDD / Cumulative Total Supply ///Calculation formula:Liveliness = value . lifespan [blocks](of all outputs ever spent) / value . lifespan [blocks] (of all outputs ever reated)///Activity is an indicator that provides macro insight into changes in holder behavior and helps identify trends in long-term holder accumulation or consumption. It highlights the period when the destruction speed of coin age is faster than the accumulation speed of circulation.///When a high proportion of coin supply is in a dormant state (i.e. maintaining holding behavior) and the accumulation of coin age exceeds the age destroyed by on chain activities, vitality will decrease.///When the age of destroyed coins equals the accumulated age of circulating supply, the vitality will tend to flatten out.///When long-term holders start spending old coins that have accumulated a large number of coin days, exceeding the rate of coin age accumulation, vitality will increase.",
+ rprofit:"Unit: thousands =K, M= millions, B= billion///When the selling price is greater than the buying price, the profit achieved during the expenditure may indicate that the price is already in the overbought stage when it continues to rise to a new high, and investors may choose to sell to lock in profits. When the price continues to fall to a new low point, it indicates that it is in an oversold stage and may be in a bottoming state.",
+ rloss:"Unit: thousands =K, M= millions, B= billion///When the selling price is lower than the buying price and the loss is realized during the expenditure, it indicates that the price may have been in an oversold stage when it continues to rise to a new high, and investors may choose to buy to accumulate. When the price continues to fall to a new low, it indicates that it is in an overbought stage, possibly at the end of a bull market.",
+ rplRate:"Unit: thousands =K, M= millions, B= billion/// Calculation formula:Realized Profit/Loss = Realized Profit / Realized Loss///This ratio observes the profit and loss situation of the spent coins. When the ratio rises, it indicates the beginning of profitability, funds may be flowing in, and when reaching a new high, it indicates that it may reach a stage high point, and investors are selling to lock in profits. When the ratio reaches a new low, it indicates that it may reach a temporary low point, and investors can look for timely buying opportunities.",
+ marketcap:"Unit: thousands =K, M= millions, B= billion/// Calculation formula:Market Cap = price [USD] . Total Supply ///The market value represents the total asset value of a currency, describing the asset size of the currency. To increase, it is necessary to evaluate whether the asset will enter a bull market or be overvalued. To decrease, it is necessary to evaluate whether the asset will enter a bear market or return to zero. This indicator is usually used to compare other currencies and other non monetary assets.",
+ rcap:"Unit: thousands =K, M= millions, B= billion///The realized circulating market value is valued for each UTXO based on the price at the last movement. When the market value transaction exceeds the realized upper limit, the market is in an overall profitable state. When the market value transaction falls below the realized upper limit, the market is in an overall loss state. The abnormal increase in this indicator indicates that a large number of investors may be selling coins, i.e. moving their coins.",
+ lthmvrv:"Unit: thousands =K, M= millions, B= billion///LTH – Makret Cap Long-term holder's circulating market value /// LTH – Realized Cap Long term holders have achieved market value in circulation /// Calculation formula:LTH-MVRV= Market Cap (of all UTXOs where age≥155 days) /Realized Cap (of all UTXOs where age≥155 days)///The ratio of the market value of long-term holders to the realized market value. An increase in this ratio indicates that long-term holders are beginning to accumulate and the market is beginning to improve. At a certain new height, long-term holders may sell their coins to stop profits. Conversely, a decrease indicates that long-term holders are selling their coins.",
+ sthmvrv:"Unit: thousands =K, M= millions, B= billion/// STH – Market Cap Short term holder's circulating market value /// STH – Realized Cap Short term holders have achieved market value in circulation///Calculation formula:STH-MVRV = Market Cap (of all UTXOs where age < 155 days) / Realized Cap (of all UTXOs where age < 155 days)///The ratio of the market value of short-term holders to the realized market value. A rise in this ratio indicates that short-term holders are starting to accumulate, reaching a new high where short-term holders may sell their coins to stop profits, indicating a local peak. Conversely, a decrease indicates that short-term holders are selling their coins, and prices may also reach new lows .",
+ nupl:"Unit: thousands =K, M= millions, B= billion///Calculation formula:Net Unrealized Profit and Loss (NUPL) = Market Cap -Realixed Cap / Market Cap ///This indicator indicates whether investors are in a profit or loss state as a whole. Any value above zero indicates that the investor is in a net profit state, while the opposite indicates a net loss state. The further away from zero, the closer the market is to the top and bottom.",
+ uprofit:"Unit: thousands =K, M= millions, B= billion///Unrealized profit refers to the total profit accrued by UTXO created when the asset price is lower than the current price.",
+ uloss:"Unit: thousands =K, M= millions, B= billion///Unrealized losses refer to the total losses accrued by UTXO when the asset price is higher than the current price.By observing the delta between the price at the time of UTXO creation and the current price of the asset, we can determine whether the investors in the UTXO are in a state of (price increase) or loss (price decrease), and to what extent.",
+ lthnupl:"Unit: thousands =K, M= millions, B= billion///This indicator evaluates the profit and loss situation of long-term holders. Long term investors may sell and lock in profits due to the new high of the indicator, or buy and accumulate profits based on the new low of the indicator.",
+ sthnupl:"Unit: thousands =K, M= millions, B= billion///This indicator evaluates the profit and loss situation of short-term holders. This indicator has reached a new high, indicating a partial peak. Short term investors may choose to sell and lock in profits. If the indicator reaches a new low, there may be room for local prices to decline.",
+ mintusd:"Unit: thousands =K, M= millions, B= billion/// Calculation formula:Puell Multiple = Daily Coin Issuance (USD) / MA365 (Daily Coin Issuance (USD))///The ratio of the daily excavated value to the average excavated value over 365 days///A low value means that mining may approach a one-year shutdown price, miners may need to sell the excavated coins to pay for electricity bills, and it also means that the price is at a bottom///High numerical values mean significant profits from mining and also mean relatively high prices",
+ NDAQohlc:"Unit: thousands =K, M= millions, B= billion/// MA5/MA10/MA20: Represents 5-day moving average / 10-day moving average / 20-day moving average",
+ NDAQBTCPrice:"Unit: thousands =K, M= millions, B= billion///NDAQ Index VS BTC",
+ bian:"Unit: thousands =K, M= millions, B= billion///Binance contract K line",
+ priceValue:"Unit: thousands =K, M= millions, B= billion///Binance `K line` price trading volume",
+ activeAddress:"Unit: thousands =K, M= millions, B= billion///The number of unique addresses that were active either as a sender or receiver. Only addresses that were active in successful transactions are counted.",
+ sendingAddress:"Unit: thousands =K, M= millions, B= billion///The number of unique addresses that were active as a sender of funds. Only addresses that were active as a sender in successful non-zero transfers are counted.",
+ receivingAddress:"Unit: thousands =K, M= millions, B= billion///The number of unique addresses that were active as a receiver of funds. Only addresses that were active as a receiver in successful non-zero transfers are counted.",
+ newAddress: "Unit: thousands =K, M= millions, B= billion///The number of unique addresses that appeared for the first time in a transaction of the native coin in the network.",
+ totalAddress:"Unit: thousands =K, M= millions, B= billion///The total number of unique addresses that ever appeared in a transaction of the native coin in the network.",
+ transsizetotal:"Unit: thousands =K, M= millions, B= billion///The total size of all transactions within the time period (in bytes).",
+ transsizemean:"Unit: thousands =K, M= millions, B= billion///The mean size of a transaction within the time period (in bytes).",
+ transactions:"Unit: thousands =K, M= millions, B= billion///The total amount of transactions. Only successful transactions are counted.",
+ transrate: "Unit: thousands =K, M= millions, B= billion///The total amount of transactions per second. Only successful transactions are counted.",
+ distribution:"Unit: thousands =K, M= millions, B= billion///The number of unique addresses holding at least 0.1 coins. For Ethereum only Externally Owned Addresses (EOAs) are counted, contracts are excluded.",
+ distribution1:"Unit: thousands =K, M= millions, B= billion///The number of unique addresses holding at least 0.01 coins. For Ethereum only Externally Owned Addresses (EOAs) are counted, contracts are excluded.",
+ distribution2:"Unit: thousands =K, M= millions, B= billion///The number of unique addresses holding at least 1 coin. For Ethereum only Externally Owned Addresses (EOAs) are counted, contracts are excluded.",
+ distribution3:"Unit: thousands =K, M= millions, B= billion///The number of unique addresses holding at least 10 coins. For Ethereum only Externally Owned Addresses (EOAs) are counted, contracts are excluded.",
+ distribution4:"Unit: thousands =K, M= millions, B= billion///The number of unique addresses holding at least 100 coins. For Ethereum only Externally Owned Addresses (EOAs) are counted, contracts are excluded.",
+ distribution5:"Unit: thousands =K, M= millions, B= billion///The number of unique addresses holding at least 1k coins. For Ethereum only Externally Owned Addresses (EOAs) are counted, contracts are excluded.",
+ distribution6:"Unit: thousands =K, M= millions, B= billion///he number of unique addresses holding at least 10k coins. For Ethereum only Externally Owned Addresses (EOAs) are counted, contracts are excluded.",
+ dailyVolume:"Unit: thousands =K, M= millions, B= billion///The total volume traded in futures contracts per exchange over the last 24 hours. Values are updated every 10 min. For a list of all supported exchanges and earliest available datapoints.",
+ getDayBalanceData:"Unit: thousands =K, M= millions, B= billion///X-coordinate: time /// y-coordinate: number of addresses",
+ getDayBalanceAmountData:"X-coordinate: time /// y-coordinate: number of addresses",
+ usdtbigtx:"Unit: thousands =K, M= millions, B= billion///USDT Table of large transactions",
+ usdcbigtx:"Unit: thousands =K, M= millions, B= billion///USDC Table of Large transactions",
+ usdtVolume:"Unit: thousands =K, M= millions, B= billion///USDT daily trading volume",
+ usdcVolume:"Unit: thousands =K, M= millions, B= billion///USDC daily trading volume",
+ ethbigtxcount:"Unit: thousands =K, M= millions, B= billion///Figure 1 shows the daily number of ETH large transactions, and Table 1 shows the details of large transactions",
+ ethTags:"Unit: thousands =K, M= millions, B= billion///Addresses correspond to a relational list of tag holder names",
+ ethTopAddrList:"Unit: thousands =K, M= millions, B= billion///Ethereum Whale address balance list",
+ ETHVolume:"Unit: thousands =K, M= millions, B= billion///Transaction Volume///Transaction Fees///EIP1559 burnt fees:This metric represents the cumulative sum of ETH incinerated since the implementation of the London Hard Fork, which introduced EIP-1559. The Ethereum Improvement Proposal (EIP-1559) established a base fee for transactions, which is burned to reduce the overall ETH supply. As a result, this metric indicates the deflationary pressure on Ethereum.///The above three only indicate the degree of on chain activity. A higher value indicates that the currency may be bought or sold, while a lower transaction volume or fee indicates less on chain activity. The market is in a wait-and-see state, and needs to be analyzed in conjunction with other indicators",
+ ETHTokenBigtx:"Unit: thousands =K, M= millions, B= billion///ERC20 token Large transaction tracking/// Currently, only the transfer function of the contract is counted",
+ ETHTokenVolume:"Unit: thousands =K, M= millions, B= billion///Observing the activity of tokens requires analysis in conjunction with other indicators",
+ ethAddress:"Unit: thousands =K, M= millions, B= billion///Active Address:The number of active addresses per day indicates the user's current participation status. This indicator needs to be analyzed in conjunction with other indicators. A higher value may indicate the user's selling or buying actions, while a lower value indicates that the current online transfer is not active///Receive Address:The daily number of receiving addresses indicates the user's current buying situation. A high value indicates the user's possible buying actions, while a low value indicates that the current on chain transfer is not active, which needs to be analyzed in conjunction with other indicators///Send Address:The number of daily sending addresses indicates the user's current spending situation. A higher value indicates the user's possible selling actions, while a lower value indicates that the current on chain transfer is not active, which needs to be analyzed in conjunction with other indicators",
+ none:"Unit: thousands =K, M= millions, B= billion///There is no",
+ reward:"Unit: thousands =K, M= millions, B= billion///Count mortgage rewards and observe the profitability of the mortgagor. Lowering the rewards may lead to the mortgagor withdrawing from the mortgage and selling coins to lock in profits, while increasing the rewards may lead to the mortgagor buying coins to accumulate profits from the mortgage",
+ cnew:"Unit: thousands =K, M= millions, B= billion///The number of new contracts deployed on the chain every day is not particularly meaningful and needs to be analyzed in conjunction with other indicators",
+ newContract:"Unit: thousands =K, M= millions, B= billion///A list of new smart contract addresses created daily",
+ dayUsdc:"Unit: thousands =K, M= millions, B= billion///At present, only the transaction volume of usdc transfer function on tron and ETH chain is counted",
+ dayUsdt:"Unit: thousands =K, M= millions, B= billion///At present, only the transaction volume of usdt transfer function on tron and ETH chains is counted",
+ bigUsdc:"Unit: thousands =K, M= millions, B= billion///Currently, only large transactions related to the transfer function of USDC on the tron and ETH chains have been recorded",
+ bigUsdt:"Unit: thousands =K, M= millions, B= billion///Currently, only large transactions related to the transfer function of USDT on the tron and ETH chains have been recorded",
+ dayBusd:"Unit: thousands =K, M= millions, B= billion///Currently, only the transaction volume of busd transfer function on the ETH chain is collected",
+ bigBusd:"Unit: thousands =K, M= millions, B= billion///Currently, only large transactions related to the transfer function of busd on the ETH chain have been recorded",
+ profitAddress:"Unit: thousands =K, M= millions, B= billion/// Calculation formula:Address in Profit = total address where Price >= Price_ created///That is, the number of addresses that are relatively profitable at the current price, indicating the top of the market. The higher the number, the more profitable the majority of addresses are, and there is a risk of selling and stopping profits",
+ lossAddress:"Unit: thousands =K, M= millions, B= billion/// Calculation formula:Address in Loss = total address where Price < Price_ created///The number of addresses that are relatively in a loss state at the current price, indicating the bottom of the market. The lower the number, the more addresses are in a loss state and can be bought in a timely manner",
+ profitRatio:"Unit: thousands =K, M= millions, B= billion/// Calculation formula:Percent of Address in Profit =Address in Profit / Total Address///The percentage of addresses that are relatively profitable at the current price, indicating the top of the market. The higher the percentage, the more profitable the majority of addresses are, and there is a risk of selling to stop profits",
+ lthSupply:"Unit: thousands =K, M= millions, B= billion///The total supply of holders with a coin age of over 155 days, this indicator observes whether long-term holders are selling or accumulating coins. A rise indicates whether the current price is undervalued and suitable for buying, while a decrease indicates that the current price is overvalued and suitable for selling",
+ sthSupply:"Unit: thousands =K, M= millions, B= billion///The total supply of holders with a coin age of less than 155 days. This indicator observes whether short-term holders are selling or accumulating coins. A higher indicator indicates that short-term holders are accumulating coins, while a lower indicator indicates that short-term holders are selling coins. Users need to analyze whether they are following other indicators",
+ realizedPrice:"Unit: thousands =K, M= millions, B= billion/// Calculation formula:Realized Price = Realized Cap / circulating supply///The realized price indicator indicates the current reasonable price of the currency, which is generally used to evaluate the supporting price. Investors can refer to this indicator to evaluate whether the price is in the overbought or oversold range.",
+ relativeLthSth:"Unit: thousands =K, M= millions, B= billion///The wave chart indicates the distribution of profit and loss supply of long-term and short-term holders, facilitating users to observe the corresponding relationship between the four indicators and prices.",
+ lthProfitSupply:"Unit: thousands =K, M= millions, B= billion/// Calculation formula:Profit for LTH = number of balance where Price > Price_created and Holder Time >= 155days",
+ lthLossSupply:"Unit: thousands =K, M= millions, B= billion/// Calculation formula:Loss for LTH = number of balance where Price <= Price_created and Holder Time >= 155days",
+ sthProfitSupply:"Unit: thousands =K, M= millions, B= billion/// Calculation formula:Profit for STH = number of balance where Price > Price_created and Holder Time < 155days",
+ sthLossSupply:"Unit: thousands =K, M= millions, B= billion/// Calculation formula:Loss for STH = number of balance where Price <= Price_created and Holder Time < 155days",
+ sthProfitRatio:"Unit: thousands =K, M= millions, B= billion/// Calculation formula: PL Ratio for STH = Profit for STH / Loss for STH ///Short term holders refer to those who hold addresses for less than 155 days. If the majority of short-term holders are in a profitable state, they may choose to sell to stop earning in the short term, or the price may continue to rise as a follow-up buying opportunity. If the majority of short-term holders are in a loss state, it may be a buying opportunity in the short term, or the price may continue to decline before the bottom is reached. If the short-term holder's profit to loss ratio is in an extreme state, and the ratio reaches a new high or low, it means corresponding selling and buying opportunities. This indicator needs to be considered by users in conjunction with other indicators.",
+ SLRVRatio:"Unit: thousands =K, M= millions, B= billion///Calculation formula: SLRV ratio = HOLDER in 24h / HOLDER in 6m~1y /// The ratio of 24-hour holders to holders aged 6 months to 1 year is used to measure the circulation speed of short-term holders compared to long-term holders to detect whether it is a bear market. A higher SLRV ratio indicates that short-term holders are more active online, indicating that the market top is approaching. A lower SLRV ratio indicates that short-term holders have little activity, or that the base of long-term holders has greatly increased. It is necessary to analyze whether it is a buying opportunity in conjunction with other indicators.",
+ lthProfitRatio:"Unit: thousands =K, M= millions, B= billion/// Calculation formula:PL Ratio for LTH = Profit for LTH / Loss for LTH /// Long term holders refer to those who hold addresses for more than 155 days. If the majority of long-term holders are in a profitable state, they may choose to sell to stop earning. If the majority of long-term holders are in a loss state, it may be a buying opportunity. If the long-term holder's profit to loss ratio is in an extreme state, and the ratio reaches a new high or low, it means corresponding selling and buying opportunities.",
+ null:"Unit: thousands =K, M= millions, B= billion///There is no",
+ frm:"Unit: thousands =K, M= millions, B= billion/// Calculation formula:Fee Ratio Multiple =miner revenue( blocks rewards + transaction fees ) / transaction fees ///The ratio of miners' total income to transaction fees is a measure of Bitcoin network security. A low value means that users only need to pay lower transaction fees while maintaining high network security. This means that miners have considerable profits and increase their computing power to maintain the network. A high value means that users need to pay higher transaction fees to maintain network operation, resulting in reduced economic efficiency and user inactivity, The total transaction fee will further decrease, meaning that miners may shut down, resulting in lower computing power and reduced security",
+ cvdd:"Unit: thousands =K, M= millions, B= billion///Accumulated Value - The number of days destroyed is the ratio of the cumulative dollar value of the destroyed coins to their market age (days). This indicator is used to detect the bottom of the market.",
+ balancedPrice:"Unit: thousands =K, M= millions, B= billion///Balancing price is the difference between the realized price and the transaction price. The transaction price is the cumulative sum of the days of destroyed coins in US dollars, adjusted by the total time since the circulation supply and the establishment of Bitcoin. Balancing prices attempts to detect the bottom of major cycles. Investors can refer to this indicator to evaluate the support price of coins.",
+ nvtRatio:"Unit: thousands =K, M= millions, B= billion///Calculation formula:NVT Ratio =Market Cap [USD] / Transaction Volume [USD]///The Market Value to Trading Value (NVT) ratio describes the relationship between market value and trading volume. This indicator is similar to the P/E ratio in stocks. The higher or new high ratio indicates that investors are priced at a premium compared to the special currency, as market value growth exceeds the utilization of on chain trading volume and value settlement. From a historical perspective, high NVT ratio values are consistent with market tops and overvaluation periods. The ratio of a decline or new low indicates that investors have a discount on the pricing of Bitcoin, as the chain upload volume and network utilization exceed the market value growth. From a historical perspective, low NVT ratio values have been favorable periods for accumulation and often coincide with market bottoms and trending bull markets. A constant NVT ratio (or horizontal trend) indicates that the current growth trend of market value and transfer volume is in a balanced state, indicating that the current market trend is sustainable. This state is often reached in the early and middle stages of a bullish or bearish trend, as the market direction has already been determined.",
+ velocity:"Unit: thousands =K, M= millions, B= billion/// Calculation formula:Velocity = 1 / NVT Ratio = Transaction Volume [USD] / Market Cap [USD] /// This indicator measures the speed at which coins circulate in the network. A rise indicates that users may become active when using the currency, while a decrease indicates that user activity has become sluggish. It is usually necessary to combine other indicators to make a comprehensive judgment.",
+ PiCycleTopIndicator:"Unit: thousands =K, M= millions, B= billion///Throughout history, the Pi Cycle Top indicator has been very effective in selecting the timing of market cycle highs, reaching within 3 days. In the past three market cycles, when 111DMA moved up and passed through 350DMA x 2, we saw that it matched the peak price of Bitcoin",
+ ssr:"Unit: thousands =K, M= millions, B= billion///Calculation formula:SSR = Market Cap (of BTC) / Market Cap (of all Stablecoins )///When SSR is low, the current stable currency supply has more `purchasing power` to purchase BTC",
+ ssro:"Unit: thousands =K, M= millions, B= billion///Calculation formula:SSR Oscillator = bollinger_bands(200,2)///The stable currency volatility indicator comes from the stable currency supply ratio (SSR) and quantifies the movement of the 200d SMA of SSR within the BB (200,2) of the Bollinger Line. When the value rises, it indicates that purchasing power is being consumed, and when the value reaches a new low, it indicates that purchasing power is accumulating",
+ stfRatio:"Unit: thousands =K, M= millions, B= billion///Calculation formula:///The inventory to flow (S/F) ratio is a popular model, which assumes that scarcity drives value. It is defined as the ratio of existing inventory to newly produced flow of a commodity",
+ stfDeflection:"Unit: thousands =K, M= millions, B= billion///Calculation formula:S/F Deflection = Price/( circulating supply/newly mined bitcoins)///Scarcity deviation refers to the ratio between the current price of an asset and its scarcity. It is used to determine whether an asset is overvalued or undervalued in terms of its scarcity///If the deflection is ≥ 1, it means that the asset is overvalued according to the S/F model. If the offset is less than 1, according to this model, the asset is undervalued",
+ goldenRatioMult:"nit: thousands =K, M= millions, B= billion///The golden ratio multiplier explores the price logarithm curve and market cycle of Bitcoin to understand the possible performance of prices in the medium and long-term time frame. Its market cycle peak hit a decreasing Fibonacci sequence multiple of 350DMA. This is because over time, the explosive growth of Bitcoin on a logarithmic scale is slowing down. As its market value increases, the growth rate of the same logarithmic scale becomes more difficult",
+ distribution:"Unit: thousands =K, M= millions, B= billion///The number of unique addresses holding a positive (non-zero) amount of coins. Contracts are excluded, only Externally Owned Addresses (EOAs) are counted. Note that ERC-20 Assets 1h resolution is being updated every 24 hours.",
+ supplyDistribution:"Unit: thousands =K, M= millions, B= billion///The relative supply distribution across addresses with specific balance bands. Only supply in Externally Owned Addresses (EOAs) is included, supply in contracts is excluded. Therefore the numbers are relative to the total supply held in EOAs.",
+ profitPercentEth:"Unit: thousands =K, M= millions, B= billion///The percentage of unique addresses whose funds have an average buy price that is lower than the current price. `Buy price` is here defined as the price at the time coins were transferred into an address. Only Externally Owned Addresses (EOAs) is are counted, contracts are excluded.",
+ profitEth:"Unit: thousands =K, M= millions, B= billion///The number of unique addresses whose funds have an average buy price that is lower than the current price. `Buy price` is here defined as the price at the time coins were transferred into an address. Only Externally Owned Addresses (EOAs) is are counted, contracts are excluded.",
+ lossEth:"Unit: thousands =K, M= millions, B= billion///The number of unique addresses whose funds have an average buy price that is higher than the current price. `Buy price`is here defined as the price at the time coins were transferred into an address. Only Externally Owned Addresses (EOAs) is are counted, contracts are excluded.",
+ inflactionRateEth:"Unit: thousands =K, M= millions, B= billion///Calculation formula:Inflation Rate = new coins issued / current supply///This indicator shows the inflation of the currency. Since the currency has no issuance ceiling and has burning costs, it is necessary to observe whether it has entered the stage of deflation or inflation through this indicator. Constant deflation indicates that the currency is scarcity, and constant inflation indicates that the currency is at risk of over issuance",
+ issuanceEth:"Unit: thousands =K, M= millions, B= billion///The total amount of new coins added to the current supply, i.e. minted coins or new coins released to the network.",
+ soprEth:"Unit: thousands =K, M= millions, B= billion///The SOPR indicator reflects the degree of profit realization of all currencies moving on the chain.///A SOPR value greater than 1 means that on average, the currency moving on that day is profitable (the selling price is greater than the payment price).///If the SOPR value is less than 1, it means that on average, the currency moving on that day is at a loss (the selling price is less than the payment price).///The SOPR value is exactly 1, which means that on average, coins moving on the same day are sold in a breakeven manner.///The upward trend of SOPR indicates that profits are being realized.///The downward trend of SOPR indicates that the currency that is achieving losses and/or profits has not been used.",
+ velocityEth:"Unit: thousands =K, M= millions, B= billion///Velocity is a measure of how quickly units are circulating in the network and is calculated by dividing the on-chain transaction volume (in USD) by the market cap, i.e. the inverse of the NVT ratio.",
+ nvtRatioEth:"Unit: thousands =K, M= millions, B= billion///The Network Value to Transactions (NVT) Ratio is computed by dividing the market cap by the transferred on-chain volume measured in USD. The NVT Ratio was created by Willy Woo.",
+ livelinessEth:"Unit: thousands =K, M= millions, B= billion///Liveliness is defined as the ratio of the sum of Coin Days Destroyed and the sum of all coin days ever created. Liveliness increases as long term holder liquidate positions and decreases while they accumulate to HODL. This metric was created by Tamas Blummer.",
+ frmEth:"Unit: thousands =K, M= millions, B= billion///The Fee Ratio Multiple (FRM) is defined as the ratio between the total miner revenue (blocks rewards + transaction fees) and transaction fees. FRM is a measure of a blockchain's security and gives an assessment how secure a chain is once block rewards disappear. This metric was first introduced by Matteo Leibowitz",
+ supplyProfitPercentEth:"Unit: thousands =K, M= millions, B= billion///The percentage of circulating supply in profit, i.e. the percentage of existing coins whose price at the time they last moved was lower than the current price.",
+ supplyProfitEth:"Unit: thousands =K, M= millions, B= billion///The circulating supply in profit, i.e. the amount of coins whose price at the time they last moved was lower than the current price",
+ supplyLossEth:"Unit: thousands =K, M= millions, B= billion///The circulating supply in loss, i.e. the amount of coins whose price at the time they last moved was higher than the current price.",
+ nuplEth:"Unit: thousands =K, M= millions, B= billion///Net Unrealized Profit/Loss is the difference between Relative Unrealized Profit and Relative Unrealized Loss. For more information see this article. This metric can also be calculated by subtracting realised cap from market cap, and dividing the result by the market cap as described in this article.",
+ relativeUProfitEth:"Unit: thousands =K, M= millions, B= billion///Relative Unrealized Profit is defined as the total profit in USD of all coins in existence whose price at realisation time was lower than the current price normalized by the market cap",
+ relativeULossEth:"Unit: thousands =K, M= millions, B= billion///Relative Unrealized Loss is defined as the total loss in USD of all coins in existence whose price at realisation time was higher than the current price normalized by the market cap.",
+ lthNUPLEth:"Unit: thousands =K, M= millions, B= billion///Long Term Holder NUPL (LTH-NUPL) is Net Unrealized Profit/Loss that takes into account only UTXOs with a lifespan of at least 155 days and serves as an indicator to assess the behaviour of long term investors. ",
+ sthNUPLEth:"Unit: thousands =K, M= millions, B= billion///Short Term Holder NUPL (STH-NUPL) is Net Unrealized Profit/Loss that takes into account only UTXOs younger than 155 days and serves as an indicator to assess the behaviour of short term investors.",
+ marketcapEth:"Unit: thousands =K, M= millions, B= billion///The market capitalization (or network value) is defined as the product of the current supply by the current USD price.",
+ rcapEth:"Unit: thousands =K, M= millions, B= billion///Realized Cap values different part of the supplies at different prices (instead of using the current daily close). Specifically, it is computed by valuing each UTXO by the price when it was last moved.",
+ rpriceEth:"Unit: thousands =K, M= millions, B= billion///Realized Price is the Realized Cap divided by the current supply.",
+ mvrvRatioEth:"Unit: thousands =K, M= millions, B= billion///Market Value to Realized Value (MVRV) is the ratio between market cap and realised cap. It gives an indication of when the traded price is below a `fair value`. This metric was created by David Puell and Murad Muhmudov.",
+ burnedSupplyEth:"Unit: thousands =K, M= millions, B= billion///Statistics on combustion costs and observation of currency deflation need to be analyzed in conjunction with other indicators",
+ mintedSupplyEth:"Unit: thousands =K, M= millions, B= billion///The total amount of issued ETH.",
+ tzbp:"Unit: thousands =K, M= millions, B= billion///This indicator displays the price changes during various working hours, i.eAsia (00:00-12:00 UTC)、Americas (12:00-0:00 UTC)、Europe (06:00-18:00 UT).Currently only data containing BINANCE",
+ lthVolume:"Unit: thousands =K, M= millions, B= billion///The daily trading volume of holders with a coin age of over 155 days, which observes whether long-term holders are selling coins. The increase in trading volume can be used to evaluate whether the current price is overvalued",
+ earcap1:"Unit: thousands =K, M= millions, B= billion///Entity-adjusted Realized Cap is an improved variant of Realized Cap that discards transactions between addresses of the same entity (`in-house`transactions). Entity-adjusted Realized Cap therefore accounts for real economic activity only, and provides an improved market signal compared to its raw UTXO-based counterpart",
+ bobp:"Unit: thousands =K, M= millions, B= billion///This indicator calculates the potential buying and selling orders at various segmented prices within a specified time interval (such as 5 minutes), indicating the intention of the funds.Currently only data containing BINANCE",
+ cddwave:"Unit: thousands =K, M= millions, B= billion///",
+ balanceDistribution:"Unit: thousands =K, M= millions, B= billion///This indicator indicates the balance distribution of holders, observing whether giant whales are buying or selling through changes in the historical quantity of large addresses, observing the growth of new users through changes in the historical proportion of small addresses, and observing the degree of monopoly of coins through a comparison of large quantities to total circulation.",
+ timeDivision:"Unit: thousands =K, M= millions, B= billion///This indicator observes the distribution of coin age of holders and the corresponding number of coins",
+ priceDivision:"Unit: thousands =K, M= millions, B= billion///This indicator observes the distribution of the price difference between the current price and the buying price of the holder and the corresponding number of addresses",
+ priceDivision1:"Unit: thousands =K, M= millions, B= billion///This indicator observes the distribution of the price difference between the current price and the buying price of the holder and the corresponding number of coins",
+ profitDistribution:"Unit: thousands =K, M= millions, B= billion///This indicator indicates the profit distribution of holders relative to the current price. By observing the proportion of profits, if the majority of holders are in a profit state, it usually means the arrival of the top. If the majority of holders are in a loss state, it usually means the formation of the bottom.",
+ detailedDistribution:"Unit: thousands =K, M= millions, B= billion///This indicator divides the balance into segments and provides a detailed description of the currency age and quantity distribution for each segment. Users can analyze the distribution characteristics and historical changes of each segment, combined with other indicators, to analyze the overall characteristics of the network.",
+ volumeProfile:"Unit: thousands =K, M= millions, B= billion///The trading volume distribution chart is an advanced chart study that displays trading activities at a specified price level during a specified time period. This data (taking into account user-defined parameters such as number of rows and time period) is plotted as a histogram on the chart, aiming to display the main and/or important price levels based on quantity.Essentially, the trading volume distribution map captures the total trading volume at a specific price level during a specified time period, and divides the total trading volume into buying or selling volumes, making it easy for traders to see this information.Currently only data containing BINANCE",
+ exchange1:"Unit: thousands =K, M= millions, B= billion///The total amount of ETH currency held by the exchange is currently only counted for the top 10 exchanges, namely Binance 、BinanceUS 、Bitfinex 、Bitstamp 、Bybit 、Coinbase 、Gate 、Kraken、KuCoin 、OKX ",
+ quickNews:"Cite Jinshi Data website",
+ circulationTotalCSupply:"Unit: thousands =K, M= millions, B= billion///The total flow flux indicator observes the sum of the circulation volumes of USDC, USDT, and BUSD. When this indicator increases, it usually indicates more purchasing power, while conversely, purchasing power decreases.",
+ circulationUSDC:"Unit: thousands =K, M= millions, B= billion///Observation of changes in USDC circulation volume",
+ circulationUSDT:"Unit: thousands =K, M= millions, B= billion///Observation of changes in USDC circulation volume through USDT circulation volume",
+ circulationBUSD:"Unit: thousands =K, M= millions, B= billion///Observing the changes in USDC circulation volume through BUSD circulation volume",
+ ethTopAddrMonitorList:"Unit: thousands =K, M= millions, B= billion///Follow up the activities of Ethereum large value holders on the chain",
+ mempool:"Unit: thousands =K, M= millions, B= billion///By observing the number of transactions and transaction fees in the pending transaction pool, the situation of pending transactions may suddenly increase, indicating that there are users who need to sell coins and need to be analyzed in conjunction with other indicators",
+ nvtSign:"Unit: thousands =K, M= millions, B= billion///NVT Signal (NVTS) is an improved version of NVT Ratio that uses the 90 day moving average of daily transfer volume as the denominator. A high NVT signal usually means the top of the market, while a low NVT signal usually means the bottom of the market.///Constant NVT signal (or horizontal trend) indicates that the growth trend of current market value and transfer volume is in balance, indicating that the current Market trend is sustainable. This state usually occurs in the early to mid stages of a bullish or bearish trend, when the market direction has been established.",
+ USTreasuriesYields:"Unit: thousands =K, M= millions, B= billion///A medium to long-term debt instrument issued by a government (Ministry of Finance), usually issued in denomination, with regular interest payments, principal and final interest payments upon maturity.///The yield of US treasury bond bonds refers to the interest rate of US government bonds. Usually, the yield of 10-year and 30-year treasury bond is the most widely concerned. These returns are considered important economic indicators in the financial market, reflecting the market's views on the state of the US economy and inflation expectations.///contain:30-year government bond yield、20-year government bond yield、10-year government bond yield、5-year government bond yield、2-year government bond yield、1-year government bond yield、6-month government bond yield、3-month government bond yield、Yields on 1-month government bonds",
+ MoneyStockMeasures:"Unit: thousands =K, M= millions, B= billion///MB:Currency in circulation, including coins and paper currency (Currency in Circulation) And bank reserve balance (Reserve Balances)///M1:M1 consists of/// (1) currencies other than the Treasury, Federal Reserve Bank, and depository institution vaults of the United States;///(2) The Demand deposit of commercial banks (excluding the amount held by depository institutions, the U.S. government, foreign banks and official institutions) minus the cash items in the process of collection and the floating funds of the Federal Reserve;///(3) Other current deposits, including other checking deposits (or OCDs, including transferable withdrawal instructions or NOW and automatic transfer services, or ATS, depository institution accounts, credit cooperatives' shared bill accounts, and Demand deposit savings institutions) and Savings account (including money market Deposit account)///M2:M2 includes M1 plus///(1) Small term deposits (term deposits below $100000) minus individual retirement accounts (IRAs) and Keogh balances with depository institutions;///(2) Subtract IRA and Keogh balances from balances in retail money market funds (MMFs)///M3 (update stopped):///M3 is the broadest indicator of Money supply, including M2, longer term and larger amount deposits, large amount time deposits, institutional investors' deposits, etc. In 2006, the United States ceased official statistics on M3, so the calculation methods for M3 may vary. However, some private institutions and research institutions may attempt to estimate M3, but these estimates may differ and lack official recognition. It should be noted that the specific definitions and calculation methods of these indicators may vary depending on different countries or institutions. In the United States, these indicators are counted and released by the Federal Reserve (the Federal Reserve of the United States).",
+ loanPsi:"Unit: thousands =K, M= millions, B= billion///The private sector (also known as the `private sector` in English) is a part of the economy, sometimes referred to as the citizen sector, owned by individuals or private groups rather than the state, as opposed to the public sector. The private sector is divided into two sub sectors: the household sector and the private enterprise sector The private sector loan data here is the value of `commercial and industrial loans` in the previous balance sheet of commercial banks.",
+ loanGdp:"Unit: thousands =K, M= millions, B= billion///",
+ wei:"Unit: thousands =K, M= millions, B= billion///In response to the COVID-19 that broke out in 2020, the New York Federal Reserve selected ten high-frequency data such as daily or weekly updates, and composed these data into a composite index, which was released once a week to observe more immediate economic changes. The index updates last week's data every Thursday and corrects the previous value next Tuesday.///These ten data items cover three major aspects: daily consumption, job market, and productivity, and are listed below:///1.Redbook Research:Same-store retail sales average///2. Number of initial applicants for unemployment benefits///3. Number of consecutive applicants for unemployment benefits///4.The American Staffing Association Staffing Index///5.Rasmussen Consumer Index///6. Weekly steel production///7. Power output///8. Weekly fuel sales volume///9. US Railway Traffic///10. Federal Withholding Tax Data///By combining the above data into the weekly economic index of the New York Fed, short-term changes in the US real economy can be observed, making it a leading indicator. When the indicators are upward, the real economy may improve; When the indicator goes down, it indicates signs of weakening in the real economy.",
+ USDCCasting:"Unit: thousands =K, M= millions, B= billion///Introduction to USDC Casting Quantity: USDC Casting Star observes the daily changes in USDC casting quantity and records which chains and transactions are being cast. Currently, only ETH and TRON chains are being observed",
+ USDTCasting:"Unit: thousands =K, M= millions, B= billion///Introduction to USDT Casting Quantity: USDT Casting Star observes the daily changes in USDT casting quantity and records which chains and transactions are being cast. Currently, only ETH and TRON chains are being observed",
+ BUSDCasting:"Unit: thousands =K, M= millions, B= billion///Introduction to BUSD Casting Quantity: BUSD Casting Star observes the daily changes in BUSD casting quantity and records which chains and transactions are being cast. Currently, only ETH chains are being observed",
+ buyingPrice:"Unit: thousands =K, M= millions, B= billion///This indicator indicates at what price point the holder purchased the currency, which is the holding cost. Generally speaking, coins accumulated at a certain price level will not be easily sold for profit, so it generally constitutes the determination of a support point.",
+ distributionLthSth:"Unit: thousands =K, M= millions, B= billion///By comparing the profit and loss data of long-term and short-term holders, observe whether the current market is at the top or bottom, and whether there is still growth potential or a downward trend in the market. Usually, long-term holders in a state of majority loss indicate a relative bottom in the market, while on the contrary, they should pay attention to the risk of selling profits at the top. Short term holders in a state of majority profit indicate a current relative top, with a phased demand for stopping profits.",
+ exchangeRate:"The exchange rate is the exchange rate between different currencies. The foreign exchange trading market determines the specific exchange rate, which in turn determines the cost of purchasing foreign goods and financial assets.///The changes in exchange rates are continuous and are influenced by the trading activities and supply demand relationships of global foreign exchange market participants. Market participants can trade at any time during trading hours, which is also the main reason for exchange rate fluctuations. Commercial banks, financial data providers, and news organizations are also important sources of real-time exchange rate data. Exchange rates are determined by trading activities in the market, and market participants typically obtain exchange rate data based on their respective trading platforms and data sources. Therefore, selecting reliable data providers and sources is the key to ensuring the accuracy and reliability of exchange rate data.",
+ GDP:"Net exports = Export volume - Import amount///PCE, Personal consumption expenditures///Gross private domestic investment///Net exports of goods and services///PCE, Personal consumption expenditures:Durable goods、Nondurable goods、Services///Gross private domestic investment:Fixed investment, changes in private inventory///Net exports of goods and services:Exports, imports.///",
+ vdd:"Value Days Destroyed (VDD) Multiple aims to identify when the price of Bitcoin may be becoming frothy and close to topping out at major cycle highs./// Coin Days Destroyed is a proxy for spending velocity that gives extra weighting to coins that have not moved onchain for longer periods of time.///Value Days Destroyed multiplies Coin Days Destroyed by $BTC price, thereby allowing for better comparisons of spending activity over time as the price of $BTC varies.///Value Days Destroyed Multiple then divides a 30-day average of VDD by a 365 average to compare near-term spending velocity with a yearly average of spending velocity.///It is able to highlight when older coins begin to rapidly enter the market to be sold. This typically happens when longer-term participants look to take profits as price accelerates up in major bull market cycles.///This phenomenon of old coins entering the market eventually causes price to drop as supply exceeds demand and the bull market is brought to an end.",
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/lang/login/index.js b/yq/src/lang/login/index.js
new file mode 100644
index 0000000..d605f37
--- /dev/null
+++ b/yq/src/lang/login/index.js
@@ -0,0 +1,332 @@
+export const login_zh = {
+
+ login: {
+ btn: "登录",
+ VerificationCode: "请输入验证码",
+ gainPhone: "获取手机验证码",
+ gainEmail: "获取邮箱验证码",
+ phone: "手机号",
+ email: "邮箱",
+ email2:"邮箱无法接收验证码?",
+ authCode: "验证码",
+ gain: "获取",
+ PleasePassword: "请输入密码",
+ PleaseEnterYourUserName: "请输入用户名 / 邮箱账号",
+ PleaseEnterTheVerificationCode: "请输入验证码",
+ PasswordLength: "密码长度不能小于6位",
+ changePassword: "修改密码",
+ oldPassword: "旧密码",
+ newPassword: "新密码",
+ ConfirmNewPassword: "确认新密码",
+ randomPassword: "获取随机密码",
+ userName: `用户名 / 邮箱`,
+ login: "登录",
+ password: "密码",
+ account: "没有账户?",
+ registered: "注册",
+ forgotPassword: "忘记密码?",
+ resetPassword: "重置密码",
+ cancel: "取消",
+ switchLanguages: "切换中英文",
+ charts: "图表",
+ agree: "必须勾选同意条款",
+ terms: "我同意条款与条件,并同意根据隐私声明接收加密货币市场见解和更新",
+ areAccount: "已拥有账户? ",
+ inputEmail: "请输入您的电子邮件地址",
+ sendEmail: "重新发送确认电子邮件",
+ submit: "提交",
+ dashboard: "仪表板",
+ workbench: "工作台",
+ transactionView: "交易视图",
+ alarm: "警报",
+ price: "价钱",
+ video: "视频",
+ insights: "见解",
+ BBS: "论坛",
+ resources: "资源",
+ exit: "退出",
+ mailbox: "邮箱",
+ help: "帮助",
+ title: "标题",
+ placeholderTitle: "请输入",
+ kinds: "问题种类",
+ description: "描述",
+ description1: "请输入问题详情,我们回尽快为您解决.",
+ attachment: "附件",
+ Upload: " 将文件拖到此处,或",
+ Upload1: "点击上传",
+ Upload2: "只能上传jpg/png文件,且不超过500kb",
+ home: "主页",
+ feedback: "提交工单",
+ smaPlaceholder: "请选择",
+ emailCode: "请输入邮箱收到验证码",
+ passwordValidation: "密码不能为空!",
+ registeredName: "用户名",
+ warningEmailCode: "请确认正确输入邮箱及用户名!",
+ sendEmailCode: "邮箱验证码已发送!",
+ newPassword: "新密码",
+ emailVerification: "获取邮箱验证码",
+ newPasswordCodeFail: "获取验证码失败,请稍后重试!",
+ newPasswordSuccess: "重置密码成功,请登录!",
+ getCode: "获取验证码",
+ sending: "发送中",
+ again: "重新获取",
+ newLogin: "请重新登录!",
+ personal: "个人中心",
+ loginMask: "请先登录或者注册,才能查看此页面。",
+ rewriteEmail: "邮箱已被注册,请重新输入。",
+ inconsistency: "密码输入不一致请重新输入!",
+ CodeFailNull: "验证码不能为空!",
+ checkVerification: "请先获取邮箱验证码后正确输入!",
+ PagePermission: "当前账户等级访问页面权限不足",
+ userPermission: "当前账号权限",
+ anonymousUser: "匿名用户",
+ registerUser: "注册用户",
+ advanceUser: "付费用户",
+ vipUser: "特邀付费用户,公司股东",
+ upgrade:"升级账户权限",
+ admin:"网站管理员",
+ support:"支持及维护人员, 审核者",
+ verifier:"审核",
+ accounting:"财会人员",
+ oldPassword:"旧密码",
+ oldEmail:"原邮箱",
+ newEmail:"新邮箱",
+ newEmail2:"填写新邮箱",
+ CustomerManagemen:"客服管理",
+ subscribe:"自定义订阅",
+ personalData:"个人资料",
+ subscribeCenter:"订阅中心",
+ payManagement:"充值确认",
+ payHistories:"转账记录",
+ subscribeBoard:"消息订阅",
+ server:"服务器错误!",
+ timeout:"请求超时,请尝试刷新网页!",
+ viewPage:"请先登录或者注册后查看页面!",
+ AccountLevel:"账户等级",
+ expense:"费用",
+ accountUpgrade:"账号升级",
+ monthlyPlay:"L3 月度付费用户",
+ yearsPlay:"L3 年度付费用户",
+ vipYearsPlay:"L4 vip年度付费用户",
+ navigation:"输入搜索导航名",
+ loginCheck:"请确认格式输入正确且不能为空!",
+ set:"设置",
+ backgroundAddress:"新增收款地址",
+ backendPayment:"转账确认",
+ backendRefund:"退款确认",
+ backendWithdrawal:"提现订单",
+ balance:"余额",
+ Recharge:"充值",
+ Withdrawal:"提现",
+ currentLevel:"当前等级",
+ backgroundPage:"后台管理",
+ customerService:"联系客服",
+ SMAwarning:"该指标SMA不能大于30天!",
+ finance:"财务管理",
+ userPrompt:"以字母开头,允许使用字母、数字、下划线,长度不小于3,不大于16位",
+ passwordPrompt:"应包含大小写字母、数字和特殊字符,长度不小于8,不大于32位",
+ paymentBackend:"数据中心",
+ RechargeRecord:"充值记录",
+ Statement:"申述",
+ userNamePrompt:"请确认用户名格式正确及内容不能为空!",
+ passwordPrompt1:"请确认密码格式正确及内容不能为空!",
+ check1:"请勾选同意条款!",
+ loginUpgrade:"请先注册登录!",
+ linkError:"后端接口连接异常,请刷新重试",
+ system:"系统接口异常",
+ subscriptionLetter:"站内信",
+ Alarm:"订阅与告警",
+ publishObservations:"发布观察报告",
+ Charts:"数据图表",
+ researchReport:"研究报告",
+ submitWork:"提交工单",
+ historicalWork:"历史工单",
+ onlineService:"在线客服",
+ HistoryRecord:"历史记录",
+ publishResearchReport:"发布研报",
+ dataStatistics:"数据统计",
+ registrationNotice:"新用户注册通知:",
+ registrationPrompt:"1.对于新注册的用户,将自动获得30天的全部数据指标浏览权限(vip4等级,价值约$42)。",
+ registrationPrompt2:"2.如果您对本网站提供了重要的意见或建议,我们会为您新增30天的vip4权限(价值约$42),您可以在 个人中心=》联系客服 =》提交工单 页面提出您的意见和建议。获得赠送的用户以通告为准。",
+ registrationPrompt3:"3.本网站所有数据仅作为参考,不构成投资建议。",
+ registrationPrompt4:"4.浏览和使用本网站数据时请遵守您所在地当地的法律。",
+ GoRegistered:"去注册",
+ },
+ placeholder: {
+ data: '选择日期'
+ },
+ logins: {
+ data: '登录'
+ },
+ // sidebar:{
+ // title:'你好'
+ // }
+
+};
+export const login_en = {
+ login: {
+ btn: "Log in",
+ VerificationCode: "Please enter the verification code",
+ gainPhone: "Phone verification code",
+ gainEmail: "Get email verification code",
+ phone: "Mobile phone",
+ email: "email",
+ authCode: "Verification code",
+ gain: "To obtain",
+ PleasePassword: "Please enter your password",
+ PleaseEnterYourUserName: "Please enter your user name / Email Account Number",
+ PleaseEnterTheVerificationCode: "Please enter the verification code",
+ PasswordLength: "Password length can not less than six",
+ changePassword: "Change the password",
+ oldPassword: "old Password",
+ newPassword: "new Password",
+ ConfirmNewPassword: "Confirm New Password",
+ randomPassword: " get random password",
+ userName: `user name / Email`,
+ login: "login",
+ password: "password",
+ account: "There is no account?",
+ registered: "Sign Up",
+ forgotPassword: "Forgot password?",
+ resetPassword: "To reset your password",
+ cancel: "cancel",
+ switchLanguages: "Switching between Chinese and English",
+ charts: "chart",
+ agree: "You have to check agree",
+ terms: "I agree to the terms and conditions and agree to receive cryptocurrency market insights and updates in accordance with the privacy statement",
+ areAccount: "Have an account? ",
+ inputEmail: "Please enter your email address",
+ sendEmail: "Resend the confirmation email",
+ submit: "submit",
+ dashboard: "The dashboard",
+ workbench: "The workbench",
+ transactionView: "Transaction view",
+ alarm: "The alarm",
+ price: "price",
+ video: "video",
+ insights: "insights",
+ BBS: "BBS",
+ resources: "resources",
+ exit: "Log out",
+ mailbox: "E-mail",
+ help: "Help",
+ title: "Title",
+ placeholderTitle: "Please enter",
+ kinds: "Types of questions",
+ description: "Description",
+ description1: "Please input the details of the problem, we will solve it for you as soon as possible.",
+ attachment: "The attachment",
+ Upload: " Drag the file here, or",
+ Upload1: "Click on the upload",
+ Upload2: "Only jpg/png files with a maximum size of 500kb can be uploaded",
+ home: "Home",
+ feedback: "Submit Work Order",
+ smaPlaceholder: "Please select",
+ emailCode: "Please enter the email to receive the verification code",
+ passwordValidation: "The password cannot be empty!",
+ registeredName: "User name",
+ warningEmailCode: "Please confirm the correct input email and user name!",
+ sendEmailCode: "Email verification code has been sent!",
+ newPassword: "New password",
+ emailVerification: "Get mailbox verification code",
+ newPasswordCodeFail: "Failed to get CAPTCHA, please try again later!",
+ newPasswordSuccess: "Password reset succeeded, please log in!",
+ getCode: "Access authentication code",
+ sending: "Sending",
+ again: "Obtain again",
+ newLogin: "Please log in again!",
+ personal: "Personal Center",
+ loginMask: "Please Login Or Register To View This Page。",
+ rewriteEmail: "Email has been registered, please re-enter.",
+ inconsistency: "Password input is inconsistent please re-enter!",
+ CodeFailNull: "The verification code cannot be empty!",
+ checkVerification: "Please first obtain the email verification code after the correct input!",
+ PagePermission: "Insufficient access permissions to the page at the current account level",
+ userPermission: "Permissions of current account",
+ anonymousUser: "Anonymous user",
+ registerUser: "Registered user",
+ advanceUser: "Paying subscriber",
+ vipUser: "VIP user",
+ upgrade:"Upgrade account permissions",
+ admin:"super administrator",
+ support:"Support and maintenance staff, auditors",
+ verifier:"audit",
+ accounting:"Financial and accounting personnel",
+ oldPassword:"Old password",
+ oldEmail:"Original mailbox",
+ newEmail:"New mailbox",
+ CustomerManagemen:"Customer management",
+ subscribe:"Custom subscription",
+ personalData:"Profile",
+ subscribeCenter:"Subscription",
+ payManagement:"Deposit",
+ payHistories:"Transfer records",
+ subscribeBoard:"Subscription",
+ server:"Server error!",
+ timeout:"Request timed out, please try refreshing the webpage!",
+ viewPage:"Please login or register to view the page!",
+ AccountLevel:"Account level",
+ expense:"expense",
+ accountUpgrade:"Account Upgrade",
+ monthlyPlay:"Monthly payer",
+ yearsPlay:"Annual payer",
+ vipYearsPlay:"vip annual paying user",
+ navigation:"Search navigation",
+ loginCheck:"Please confirm that the format input is correct and cannot be empty!",
+ set:"set",
+ backgroundAddress:"Add payment address",
+ backendPayment:"Transfer",
+ backendRefund:"Refund",
+ backendWithdrawal:"Withdrawal Order",
+ balance:"Balance",
+ Recharge:"Recharge",
+ Withdrawal:"Withdrawal",
+ currentLevel:"Current level",
+ backgroundPage:"Admin",
+ customerService:"Contact",
+ SMAwarning:"The SMA of this indicator cannot exceed 30 days!",
+ finance:"financial management",
+ userPrompt:"Start with letter Allow letters, numbers, and underscores Length not less than 3 but not more than 16 ",
+ passwordPrompt:"Contains uppercase and lowercase letters, numbers, and special characters,Length not less than 8 and not more than 32",
+ paymentBackend:"Data Center",
+ RechargeRecord:"Recharge Record",
+ email2:"Email cannot receive verification code?",
+ Statement:"Statement",
+ newEmail2:"fill in new Email",
+ userNamePrompt:"Please confirm that the username format is correct and the content cannot be empty!",
+ passwordPrompt1:"Please confirm that the password format is correct and the content cannot be empty!",
+ check1:"Please check the agree clause!",
+ loginUpgrade:"Please register and log in first!",
+ linkError:"Backend interface connection exception, please refresh and try again",
+ system:"System interface exception",
+ subscriptionLetter:"Subscription letter",
+ Alarm:"Subscription and Alarm",
+ publishObservations:"Release observation report",
+ Charts:"Charts",
+ researchReport:"research Report",
+ submitWork:"Submit Work Order",
+ historicalWork:"Historical Work",
+ onlineService:"Online Service",
+ HistoryRecord:"History",
+ publishResearchReport:"Publish research",
+ dataStatistics:"Data Statistics",
+ registrationNotice:"New user registration notification:",
+ registrationPrompt:"1. For newly registered users, you will automatically receive 30 days of all indicators browsing privileges (VIP level 4, value of approximately $42).",
+ registrationPrompt2:"2. If you provide important feedback or suggestions to us, we will add 30 days of VIP 4 privileges for you (value of approximately $42). You can provide your feedback and suggestions on the `Personal Center => Contact => Submit Work Order` page. Users who received gifts are subject to the announcement.",
+ registrationPrompt3:"3. All data on this website is for reference only and does not constitute investment advice.",
+ registrationPrompt4:"4. Please comply with the local laws of your location when browsing and using data on this website.",
+ GoRegistered:"Go Registered",
+
+ },
+ placeholder: {
+ data: 'select date'
+ },
+ logins: {
+ data: 'login'
+ },
+ // sidebar:{
+ // title:'hallo'
+ // }
+
+};
\ No newline at end of file
diff --git a/yq/src/lang/messages.js b/yq/src/lang/messages.js
new file mode 100644
index 0000000..8767924
--- /dev/null
+++ b/yq/src/lang/messages.js
@@ -0,0 +1,66 @@
+import {login_en,login_zh} from "./login/index"
+import {home_en,home_zh} from "./home/index"
+import {arh_en,arh_zh} from "./arh999/index"
+import {Bian_en,Bian_zh} from "./BiAnController/index"
+import {aside_en,aside_zh} from "./aside/index"
+import {help_en,help_zh} from "./help/index"
+import {asideEth_en,asideEth_zh} from "./asideEth/index"
+import {introduction_zh,introduction_en} from "./introduce/index"
+import {MessageBoard_zh,MessageBoard_en} from "./MessageBoard/index"
+import {subscribe_zh,subscribe_en} from "./subscribe/index"
+import {formula_zh,formula_en} from "./formula/index"
+import {pay_zh,pay_en} from "./pay/index"
+import {asideMacroscopic_zh,asideMacroscopic_en} from "./asideMacroscopic/index"
+import {seo_zh,seo_en} from "./seoText/index"
+import elementEnLocale from 'element-ui/lib/locale/lang/en'
+import elementZhLocale from 'element-ui/lib/locale/lang/zh-CN'
+
+
+export default {
+ zh: {
+ // 传入element相关模块
+ ...elementZhLocale,
+ // 自定义国际化对象引入
+ ...login_zh,
+ ...home_zh,
+ ...arh_zh,
+ ...Bian_zh,
+ ...aside_zh,
+ ...asideEth_zh,
+ ...introduction_zh,
+ ...MessageBoard_zh,
+ ...help_zh,
+ ...pay_zh,
+ ...subscribe_zh,
+ ...formula_zh,
+ ...asideMacroscopic_zh,
+ ...seo_zh,
+
+
+
+ },
+
+ en: {
+ // 传入element相关模块
+ ...elementEnLocale,
+ // 自定义国际化对象引入
+ ...login_en,
+ ...home_en,
+ ...arh_en,
+ ...Bian_en,
+ ...aside_en,
+ ...asideEth_en,
+ ...introduction_en,
+ ...MessageBoard_en,
+ ...help_en,
+ ...pay_en,
+ ...subscribe_en,
+ ...formula_en,
+ ...asideMacroscopic_en,
+ ...seo_en
+
+
+
+ },
+
+ };
\ No newline at end of file
diff --git a/yq/src/lang/pay/index.js b/yq/src/lang/pay/index.js
new file mode 100644
index 0000000..57c99d7
--- /dev/null
+++ b/yq/src/lang/pay/index.js
@@ -0,0 +1,387 @@
+export const pay_zh = {
+ pay:{
+ Payment:"支付详情",
+ AccountUpgrade:"账户升级",
+ AmountPaid:"支付金额",
+ currency:"支付币种",
+ network:"支付网络",
+ address:"支付地址",
+ PaymentID:"支付txid",
+ SubmitPayment:"提交支付",
+ Confirmation:"确认支付信息",
+ AccountLevel:"账户等级",
+ ConfirmationPayment:"确认支付",
+ cancel:"取 消",
+ L2users:"今日L2用户数",
+ L3users:"今日L3用户数",
+ L4users:"今日L4用户数",
+ AmountReceived:"今日收款金额",
+ addL2:"今日新增L2用户数",
+ addL3:"今日新增L3用户数",
+ addL4:"今日新增L4用户数",
+ TotalCollection:"总收款金额",
+ TotalCollectionL2:"L2用户总收款金额",
+ TotalCollectionL3:"L3用户总收款金额",
+ TotalCollectionL4:"L4用户总收款金额",
+ chart:"每日历史图表",
+ beConfirmedTable:"待确认支付列表",
+ confirmedTable:"已确认支付列表",
+ edit:"编辑历史",
+ number:"编号",
+ date:"日期",
+ user:"用户",
+ CausePayment:"支付原由",
+ CollectionAddress:"收款地址",
+ PaymentStatus:"支付状态",
+ edit1:"编辑",
+ EditingReason:"编辑原由",
+ submit:"提交",
+ ServiceStatus:"服务生效状态",
+ OriginalPayment:"原支付状态",
+ presentPaymentStatus:"当前支付状态",
+ EditUser:"编辑用户",
+ PaymentHistory:"支付历史",
+ PurchaseService:"购买服务",
+ userPlan:"用户计划",
+ AccountAuthority:"账户权限等级详情",
+ Refers:"指标标识",
+ WhetherPay:"是否需要付费",
+ authority:"权限",
+ granularity:"数据颗粒度",
+ expense:"费用",
+ AnonymousUser:"匿名用户",
+ technicalL1:"L1技术指标",
+ technicalL2:"L2技术指标",
+ technicalL3:"L3技术指标",
+ technicalL4:"L4技术指标",
+ RegisteredUser:"注册用户",
+ monthlyPay:"月度付费用户",
+ greatMessage:"日报,周报,重大消息订阅",
+ customizeMessage:"自定义指标消息订阅",
+ support:"技术支持",
+ annualPay:"年度付费用户",
+ vipAnnualPay:"VIP年度付费用户",
+ NewCurrency:"新币种及新技术指标优先使用",
+ Withdrawal:"提现金额",
+ none:"无",
+ confirmSubmission:"确认提交",
+ closeTransfer:"该笔交易已成功关闭!",
+ upgradeSuccessful:"账户升级成功!",
+ Withdrawal1:"提现",
+ Recharge1:"充值",
+ WithdrawalSuccess:"提现申请成功",
+ withdrawalRecords:"提现记录",
+ money:"金额",
+ currency:"币种",
+ network:"网络",
+ applicationAddress:"申请地址",
+ originatingAddress:"发起地址",
+ refundAmount:"实退金额",
+ refundAddress:"实退地址",
+ refundTime:"退款完成时间",
+ refundTxid:"实退交易hash",
+ Remarks:"备注",
+ pendingProcessing:"待处理订单",
+ withdrawalRecords:"提现记录",
+ successfulOrder:"成功订单",
+ withdrawalFailed:"失败订单",
+ placeholderAddress:"请输入邮箱查询",
+ operation:"操作",
+ confirm:"确定",
+ refuse:"拒绝",
+ cancel:"取消",
+ prompt:"提示",
+ rechargeAmount:"请确保输入金额格式正确,只能填写数字!",
+ Txid:"交易hash",
+ consumption:"消费记录",
+ paymentCurrency:"请检查币种填写内容!",
+ paymentNetwork:"请检查网络填写内容!",
+ paymentAddress:"请检查地址填写内容!",
+ paymentAmount:"请检查金额填写内容!",
+ paymentCode:"请检查验证码填写内容!",
+ AccountLevel_1:"当前账户等级",
+ withdrawal_1:"申请提现",
+ enterAmount:"请选择或输入",
+ receivingAddress:"收款地址",
+ input:"请输入",
+ Reminder:"提示",
+ Reminder_1:"1、提现需要通过人工审核,人工审核通常不会超过24小时。",
+ Reminder_2:"2、提现时,每种稳定币会单独计算,请确保提现时您账户内相应的稳定币余额足够。",
+ Reminder_3:"3、提现所产生的手续费需由您自己承担,该费用不同的区块网络会有所差异。",
+ Reminder_4:"4、您最终收到的金额以实际到账为准。",
+ Reminder_5:"1、您实际转账的网络和币种需与您提交的网络和币种一致,否则会导致您的转账无法在相应的区块链中被查询到。",
+ Reminder_6:"2、本网站所有稳定币均视为等值,即为1USDT=1USDC=1BUSD,您的总余额为USDT余额+USDC余额+BUSD余额。",
+ Reminder_7:"3、当单一稳定币余额不足以全额支付消费订单时,扣除顺序为USDT => USDC => BUSD,即优先扣除USDT,USDT余额不足以全额支付时,会继续扣除USDC,当USDT+USDC的余额不足以全额支付时,会继续扣除BUSD。",
+ Reminder_8:"4、您充值的稳定币可在本网站用于升级服务、订阅咨询等任何付费服务。",
+ Reminder_9:"5、转账后请妥善保管您的交易hash,交易hash是您转账的唯一凭证。",
+ Reminder_10:"6、您在本网站的充值金额以我们实际收到的转账金额为准。",
+ Reminder_11:"7、请不要未提交本页面内容就开始转账,该行为会导致我们无法对您的转账进行有效查询。",
+ Reminder_12:"8、如有提前转账操作,请前往",
+ Reminder_13:"交易hash页面",
+ Reminder_14:"进行转账确认。",
+ accountBalance:"账户余额",
+ toRecharge:"去充值?",
+ toRecharge1:"去充值",
+ Reminder_16:"1、本网站所有稳定币均视为等值,即为1USDT=1USDC=1BUSD,您的总余额为USDT余额+USDC余额+BUSD余额。",
+ Reminder_17:"2、当单一稳定币余额不足以全额支付消费订单时,扣除顺序为USDT => USDC => BUSD,即优先扣除USDT,USDT余额不足以全额支付时,会继续扣除USDC,当USDT+USDC的余额不足以全额支付时,会继续扣除BUSD。",
+ Reminder_18:"3、如果您的总余额不足以支付该笔消费,请前往充值页面进行充值。",
+ Reminder_19:"1、请您收到转账的交易hash之后再点击确认转账按钮,否则可能会因为网络延迟等原因导致我们无法在区块链上查询到您的转账。",
+ Reminder_20:"2、请您在30分钟内完成转账操作,如果未在30分钟完成转账,请回到",
+ Reminder_21:"充值页面",
+ Reminder_22:"重新提交订单。",
+ Reminder_23:"3、若因区块链网络原因导致充值未能及时到账,请您在获取到转账的交易hash后进入提交",
+ Reminder_24:"提交您的交易hash,此时请确保您提交的交易hash能在相应的区块链网络上被查询到。",
+ Reminder_25:"4、最终充值结果我们会以邮件形式通知您。",
+ transactions:"验证交易hash",
+ service:"联系客服",
+ Address:"地址",
+ waitFor:"等待确认",
+ confirmTransfer:"确认已转账",
+ closeTransfer:"关闭转账交易",
+ problem:"转账遇到问题",
+ rechargedSuccessfully:"充值成功!",
+ orderNumber:"订单号",
+ refundAmount:"退款金额",
+ applicationTime:"申请时间",
+ selectDate:"选择日期时间",
+ Refusal:"拒绝提现",
+ withdrawalDetails:"提现详情",
+ currencyBalance:"当前币种余额",
+ addAddress:"新增地址",
+ fillInNew:"填写新增地址:",
+ remind:"提示:每条新增地址须通过换行键单独放在一行",
+ confirmAddition:"确认新增",
+ confirmAddition2:"个收款地址",
+ rechargeRecord:"充值记录",
+ failedOrders:"支付失败订单",
+ Reminder_26:"提示:该页面每4小时只能提交一次,所以请您仔细阅读下方文字",
+ Reminder_27:"1、请仔细检查您填写的交易hash是否与区块链上的交易hash一致。",
+ Reminder_28:"2、请仔细检查该交易hash的收款方是否为我们提供的钱包地址。",
+ Reminder_29:"3、请仔细检查该交易hash的转账金额是否与您实际转账金额一致(手续费需由您自行支付)。",
+ Reminder_30:"4、请勿恶意提交交易hash,否则可能会导致您的账号被封禁或其他处罚。如果您有多笔交易hash待处理,请您联系我们的",
+ Reminder_31:"人工客服",
+ queryWasSuccessful:"查询成功!",
+ totalBalance:"当前总余额",
+ expirationTime:"到期时间",
+ consumptionInstructions:"消费说明",
+ status:"状态",
+ empty:"请确认新增地址数据填写正确!",
+ mailbox:"验证码已发送您邮箱!",
+ Insufficient:"余额不足!",
+ userEmail:"用户邮箱",
+ Disabled:"禁用",
+ renew:"等级续费",
+ userAddress:"绑定地址",
+ appliedAddress:"提现地址",
+ balance:"余额",
+ refund:"实退金额",
+ calculation:"计算中...",
+ hashError:"交易hash有误,请仔细检查!",
+ explain:"该时间为我们确认退款的时间,实际的退款时间以区块信息为准",
+ grade:"请确认选择账户升级等级!",
+ search:"请确认填写搜索内容!",
+ transferSuccessful:"转账成功",
+ transferFailed:"转账失败",
+ Pending:"待处理",
+ withdrawalSuccessful:"提现成功",
+ withdrawalFailed1:"提现失败",
+ hash1:"您还需",
+ hash2:"时",
+ hash3:"分",
+ hash4:"秒后才能提交",
+ }
+}
+export const pay_en = {
+ pay:{
+ Payment:"Payment details",
+ AccountUpgrade:"Account upgrade",
+ AmountPaid:"Amount",
+ currency:"Currency of payment",
+ network:"Payment network",
+ address:"Payment address",
+ PaymentID:"Pay txid",
+ SubmitPayment:"Submit payment",
+ Confirmation:"Confirm payment information",
+ AccountLevel:"Account level",
+ ConfirmationPayment:"Confirmation of payment",
+ cancel:"cancel",
+ L2users:"Number of L2 users today",
+ L3users:"Number of L3 users today",
+ L4users:"Number of L4 users today",
+ AmountReceived:"Amount received today",
+ addL2:"The number of L2 users was added today",
+ addL3:"The number of L3 users was added today",
+ addL4:"The number of L4 users was added today",
+ TotalCollection:"Total amount received",
+ TotalCollectionL2:"L2 Total amount received by a user",
+ TotalCollectionL3:"L3 Total amount received by a user",
+ TotalCollectionL4:"L4 Total amount received by a user",
+ chart:"Daily history chart",
+ beConfirmedTable:"Payment list to be confirmed",
+ confirmedTable:"Payment list confirmed",
+ edit:"Editing history",
+ number:"number",
+ date:"date",
+ user:"user",
+ CausePayment:"Cause of payment",
+ CollectionAddress:"Collection address",
+ PaymentStatus:"Payment status",
+ edit1:"edit",
+ EditingReason:"Editing reason",
+ submit:"submit",
+ ServiceStatus:"Service status",
+ OriginalPayment:"Original payment status",
+ presentPaymentStatus:"Current payment status",
+ EditUser:"Edit user",
+ PaymentHistory:"Payment history",
+ PurchaseService:"Purchase service",
+ AccountAuthority:"Details about the account permission level",
+ Refers:"index",
+ WhetherPay:"Whether to pay",
+ authority:"authority",
+ granularity:"Data granularity",
+ expense:"expense",
+ AnonymousUser:"Anonymous user",
+ technicalL1:"L1 technical index",
+ technicalL2:"L2 technical index",
+ technicalL3:"L3 technical index",
+ technicalL4:"L4 technical index",
+ RegisteredUser:"Registered user",
+ monthlyPay:"Monthly payer",
+ greatMessage:"Daily, weekly, major news subscriptions",
+ customizeMessage:"Custom indicator message subscriptions",
+ support:"Technical support",
+ annualPay:"Annual payer",
+ vipAnnualPay:"VIP Annual payer",
+ NewCurrency:"New currency types and new technical indicators are preferred",
+ Withdrawal:"Withdrawal amount",
+ userPlan:"User Plan",
+ none:"nothing",
+ confirmSubmission:"Submit",
+ closeTransfer:"This transaction has been successfully closed!",
+ upgradeSuccessful:"Account upgrade successful!",
+ Withdrawal1:"Withdrawal",
+ Recharge1:"Recharge",
+ withdrawalRecords:"withdrawal Records",
+ money:"Money",
+ currency:"Currency",
+ network:"Network",
+ applicationAddress:"Application address",
+ originatingAddress:"Originating address",
+ refundAmount:"Refund amount",
+ refundTime:"Return time",
+ refundTxid:"Return Transaction Hash",
+ Remarks:"Remarks",
+ pendingProcessing:"Pending orders",
+ withdrawalRecords:"Withdrawal records",
+ successfulOrder:"Successful order",
+ withdrawalFailed:"Failed orders",
+ placeholderAddress:"Please enter your email for query",
+ operation:"Operation",
+ confirm:"Confirm",
+ refuse:"Refuse",
+ cancel:"Cancel",
+ prompt:"Prompt",
+ rechargeAmount:"Please ensure that the input amount format is correct and only numbers can be filled in !",
+ Txid:"Transaction Hash",
+ consumption:"Consumption records",
+ paymentCurrency:"Please check the currency filling content!",
+ paymentNetwork:"Please check the network filling content!",
+ paymentAddress:"Please check the address information!",
+ paymentAmount:"Please check the amount filled in!",
+ paymentCode:"Please check the content of the verification code!",
+ AccountLevel_1:"Current account level",
+ withdrawal_1:"Apply for withdrawal",
+ enterAmount:"Please select or enter",
+ receivingAddress:"Receiving address",
+ input:"Please enter",
+ Reminder:"Reminder",
+ Reminder_1:"1、Withdrawal requires manual review, which usually does not exceed 24 hours。",
+ Reminder_2:"2、When withdrawing, each type of stable currency will be calculated separately. Please ensure that the corresponding stable currency balance in your account is sufficient when withdrawing。",
+ Reminder_3:"3、The handling fee generated by withdrawal must be borne by yourself, and this fee may vary depending on the blocknetwork。",
+ Reminder_4:"4、The amount you ultimately receive will be based on the actual receipt。",
+ Reminder_5:"1、The network and currency you actually transferred must be consistent with the network and currency you submitted, otherwise your transfer will not be able to be queried in the corresponding blockchain。",
+ Reminder_6:"2、All stable currencies on this website are considered equivalent, i.e. 1USDT=1USDC=1BUSSD. Your total balance is USDT balance+USDC balance+BUSD balance。",
+ Reminder_7:"3、When the balance of a single stable currency is insufficient to fully pay the consumption order, the deduction order is USDT=>USDC=>BUSD, which means that USDT will be deducted first. When the USDT balance is insufficient to fully pay, USDC will continue to be deducted. When the balance of USDT+USDC is insufficient to fully pay, BUSD will continue to be deducted。",
+ Reminder_8:"4、The stable currency you recharge can be used on this website for any paid services such as upgrade services, subscription consulting, etc。",
+ Reminder_9:"5、Please keep your transaction hash properly after the transfer. The transaction hash is the only voucher for your transfer。",
+ Reminder_10:"6、The amount you recharge on this website is based on the actual transfer amount we receive。",
+ Reminder_11:"7、Please do not start transferring funds without submitting the content on this page. This behavior may prevent us from effectively querying your transfer。",
+ Reminder_12:"8、If there is an advance transfer operation, please go to",
+ Reminder_13:"Transaction Hash page",
+ Reminder_14:"Confirm transfer。",
+ accountBalance:"Account balance",
+ toRecharge:"recharge?",
+ toRecharge1:"recharge",
+ Reminder_16:"1、All stable currencies on this website are considered equivalent, i.e. 1USDT=1USDC=1BUSSD. Your total balance is USDT balance+USDC balance+BUSD balance。",
+ Reminder_17:"2、When the balance of a single stable currency is insufficient to fully pay the consumption order, the deduction order is USDT=>USDC=>BUSD, which means that USDT will be deducted first. When the USDT balance is insufficient to fully pay, USDC will continue to be deducted. When the balance of USDT+USDC is insufficient to fully pay, BUSD will continue to be deducted。",
+ Reminder_18:"3、If your total balance is not enough to pay for the purchase, please go to the recharge page to recharge。",
+ transactions:"validate Transaction Hash",
+ service:"Contact customer service",
+ Address:"Address",
+ Reminder_19:"1、Please click the confirm transfer button after receiving the transaction hash of the transfer, otherwise we may not be able to query your transfer on the blockchain due to network delays and other reasons。",
+ Reminder_20:"2、Please complete the transfer operation within 30 minutes. If the transfer is not completed within 30 minutes, please return to",
+ Reminder_21:"Recharge page",
+ Reminder_22:"Resubmit Order。",
+ Reminder_23:"3、If the recharge is not received in a timely manner due to blockchain network reasons, please enter the submission after obtaining the transaction hash for the transfer",
+ Reminder_24:"Submit your transaction hash, please ensure that the transaction hash you submitted can be queried on the corresponding blockchain network at this time。",
+ Reminder_25:"4、We will notify you via email of the final recharge result。",
+ waitFor:"Waiting for confirmation",
+ confirmTransfer:"Confirm Transfer",
+ closeTransfer:"Close transfer",
+ problem:"Transfer problem",
+ rechargedSuccessfully:"Recharged successfully!",
+ orderNumber:"number",
+ refundAmount:"refund amount",
+ applicationTime:"Application time",
+ selectDate:"Select Date Time",
+ Refusal:"Refusal to withdraw",
+ withdrawalDetails:"Withdrawal details",
+ currencyBalance:"Current currency balance",
+ addAddress:"Add Address",
+ fillInNew:"Fill in the new address:",
+ remind:"Reminder: Each newly added address must be placed on a separate line using the newline key",
+ confirmAddition:"Confirm addition",
+ confirmAddition2:"payment addresses",
+ rechargeRecord:"Recharge Record",
+ failedOrders:"Payment failed order",
+ Reminder_26:"Reminder: This page can only be submitted once every 4 hours, so please read the text below carefully",
+ Reminder_27:"1、Please carefully check if the transaction hash you filled in matches the transaction hash on the blockchain。",
+ Reminder_28:"2、Please carefully check if the recipient of the transaction hash is the wallet address we provided。",
+ Reminder_29:"3、Please carefully check whether the transfer amount of the transaction hash is consistent with your actual transfer amount (the handling fee needs to be paid by you)。",
+ Reminder_30:"4、Please do not maliciously submit transaction hashes, as this may result in your account being banned or other penalties. If you have multiple transactions pending hash processing, please contact our",
+ Reminder_31:"Manual customer service",
+ queryWasSuccessful:"Query successful!",
+ totalBalance:"Current total balance",
+ expirationTime:"Expiration time",
+ consumptionInstructions:"explain",
+ status:"state",
+ empty:"Please confirm that the new address data is filled in correctly!",
+ mailbox:"The verification code has been sent to your email!",
+ Insufficient:"Insufficient balance!",
+ userEmail:"User email",
+ Disabled:"Disabled",
+ renew:"Level renewal",
+ userAddress:"Bind Address",
+ appliedAddress:"Withdrawal address",
+ balance:"balance",
+ refund:"Actual refund amount",
+ calculation:"Calculating...",
+ hashError:"Transaction hash error, please carefully check!",
+ explain:"This is the time we confirm the refund, and the actual refund time is based on the block information",
+ refundAddress:"refund Address",
+ grade:"Please confirm selecting the account upgrade level!",
+ search:"Please confirm to fill in the search content!",
+ transferSuccessful:"Transfer successful",
+ transferFailed:"Transfer failed",
+ Pending:"Pending",
+ withdrawalSuccessful:"Withdrawal successful",
+ withdrawalFailed1:"Withdrawal failed",
+ hash1:"You still need to",
+ hash2:"Hour",
+ hash3:"branch",
+ hash4:"Seconds before submitting",
+
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/lang/seoText/index.js b/yq/src/lang/seoText/index.js
new file mode 100644
index 0000000..f3a3b15
--- /dev/null
+++ b/yq/src/lang/seoText/index.js
@@ -0,0 +1,55 @@
+export const seo_zh = {
+ seo: {
+ Web: "coinbus 数据分析平台,涵盖 BTC、ETH、稳定币、宏观经济等多方面的区块链数据。提供链上数据、市场指标、交易所数据、交易量、大额交易监控、流通量、债券等众多板块的精准分析,助您洞察加密货币市场趋势",
+ privilegeLevel: "coinbus 提供不同会员等级账号权限,明确各等级对应的指标查看权限及服务内容。该页面详细介绍不同等级账号权限详情与资费标准,助您选择适合的账号等级。",
+ WorkOrderDetails: "用户可在此页面查看提交工单的详细情况及处理记录,也能继续提交相关问题后续,随时跟进问题处理进度。",
+ personal: "Coinbus 个人中心页面,用户可查看账号等级情况、进行账号升级,查询账户余额信息,汇总未读工单及查看权限等级资费详情。",
+ subscribe: "Coinbus 支持区块链分析相关日报、周报及重大消息订阅。用户可自定义选择订阅内容及通知方式,该页面还包含订阅操作历史及消息历史。",
+ payHistories: "Coinbus 支付历史页面,用户可在此查询转账记录,涵盖待处理转账、转账成功及转账失败的所有记录。",
+ AccountUpgrade: "Coinbus 账户升级页面,用户可根据自身账号情况选择升级权限并提交支付,享受更高权限的服务。",
+ IndexIntroduce: "Coinbus 指标解释页面,详细记录了网站所有区块链指标的解释,用户可通过该文档了解链上指标含义及计算方式。",
+ Recharge: "Coinbus 充值页面,为用户提供方便快捷的充值渠道,可选择币种及支付网络,输入充值金额进行账户充值。",
+ TXID: "Coinbus 用户提交充值的 txid 页面,用于后台审核充值订单。",
+ Withdrawal: "Coinbus 申请提现页面,用户可根据当前账户余额选择相关币种、金额、网络并填写收款地址提交提现申请。",
+ withdrawalRecords: "Coinbus 申请提现历史记录页面,用于统计用户提现的历史记录,包括待处理提现、提现成功及失败的记录,方便用户查询",
+ withdrawalDetails: "Coinbus 提现订单详情页面,可查看提现订单的详细信息,包括时间、金额、状态、收款地址等。",
+ ConsumptionRecords: "Coinbus 消费记录页面,用户可查询消费记录,包括待处理订单、成功订单及失败订单,以及消费详情如日期、金额、消费说明等。",
+ Alarm: "Coinbus 订阅与告警页面,用户可选择需要告警提示的指标,设置周期及通知方式进行订阅,以便更好地了解链上指标变化情况。",
+ publishObservations: "Coinbus 发布观察报告页面,用于编写周报、月报、重大消息、活动通知等报告相关内容并提交发布,还可查询发布历史记录。",
+ dataDisplay: "本页面全面介绍 coinbus 区块链数据分析平台。详细阐述了该网站的主要功能,包括实时监控交易数据、深入分析市场指标、大额交易监控等。突出了网站的优点,如精准的数据来源、直观的可视化展示、个性化订阅服务和强大的后台管理。解释了为什么用户应该选择该网站,强调专业团队、持续更新、用户友好界面和优质客户服务。明确了网站的用途,帮助用户理解加密货币市场和区块链技术,以制定明智的投资决策和风险管理策略。还列举了涵盖的数据分析内容,包括链上数据、市场指标、交易所数据、宏观经济数据和大额交易监控。",
+ metaDescription:"coinbus 是专业的区块链数据分析平台,为您提供精准的比特币、以太坊等加密货币链上数据指标与深入的市场洞察。凭借可靠的数据来源、专业的分析团队以及实时更新,助力您在加密货币领域做出明智决策。",
+ metaKeywords:"coinbus,BTC,ETH,稳定币分析,宏观经济,区块链数据分析,加密货币链上分析,比特币分析,以太坊分析,链上数据,加密货币,市场洞察,加密货币分析平台,区块链数据研究,Blockchain",
+ appTitle:"coinbus - 一个专业的区块链数据分析平台",
+ help:"Coinbus 区块链分析平台为用户提供完善的帮助中心。在使用过程中遇到问题可提交工单,我们会及时回复处理,提升用户使用体验。",
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+}
+
+export const seo_en = {
+ seo: {
+ help:"Coinbus blockchain analysis platform provides users with a perfect help center. If you encounter problems in the process of using the platform, you can submit a work order, and we will reply in time to deal with them and improve the user experience.",
+ metaDescription:"coinbus is a professional blockchain data analytics platform that provides you with accurate on-chain data metrics and in-depth market insights on Bitcoin, Ether and other cryptocurrencies. With reliable data sources, a professional analyst team and real-time updates, it helps you make informed decisions in the cryptocurrency space.",
+ metaKeywords:"coinbus,BTC,ETH,stablecoin analysis,macroeconomics,blockchain data analysis,cryptocurrency on-chain analysis,bitcoin analysis,ethereum analysis,on-chain data,cryptocurrencies,market insights,cryptocurrency analytics platforms,blockchain data research,Blockchain",
+ appTitle:"coinbus - A professional blockchain data analysis platform",
+ "Web":"Coinbus data analysis platform, covering BTC ETH、 Blockchain data from various aspects such as stablecoins and macroeconomics. Provide precise analysis of on chain data, market indicators, exchange data, trading volume, monitoring of large transactions, liquidity, bonds, and many other sectors to help you gain insights into cryptocurrency market trends","privilegeLevel":"Coinbus provides different membership level account permissions, clarifying the corresponding indicator viewing permissions and service content for each level. This page provides detailed information on the permissions and tariff standards for different levels of accounts, helping you choose the appropriate account level.","WorkOrderDetails":"Users can view detailed information and processing records of submitted work orders on this page, as well as continue to submit related issues and follow up on the progress of problem resolution at any time.","personal":"On the Coinbus personal center page, users can view account level information, upgrade their accounts, check account balance information, summarize unread work orders, and view permission level tariff details.","subscribe":"Coinbus supports subscriptions to daily, weekly, and major news related to blockchain analysis. Users can customize the subscription content and notification methods, and this page also includes subscription operation history and message history.","payHistories":"The Coinbus payment history page allows users to check transfer records, including all records of pending transfers, successful transfers, and failed transfers.","AccountUpgrade":"On the Coinbus account upgrade page, users can choose to upgrade their account permissions and submit payments based on their own account situation to enjoy higher privilege services.","IndexIntroduce":"The Coinbus Indicator Explanation page provides detailed explanations of all blockchain indicators on the website, allowing users to understand the meaning and calculation methods of on chain indicators through this document.","Recharge":"The Coinbus recharge page provides users with a convenient and fast recharge channel, allowing them to choose their currency and payment network, and input the recharge amount to recharge their account.","TXID":"The txid page submitted by Coinbus users for recharging is used for backend review of recharge orders.","Withdrawal":"On the Coinbus withdrawal application page, users can select the relevant currency, amount, and network based on their current account balance, and fill in the receiving address to submit the withdrawal application.","withdrawalRecords":"The Coinbus withdrawal history page is used to track the withdrawal history of users, including records of pending withdrawals, successful withdrawals, and failed withdrawals, making it convenient for users to query","withdrawalDetails":"The Coinbus withdrawal order details page allows you to view detailed information about the withdrawal order, including time, amount, status, and payment address.","ConsumptionRecords":"The Coinbus consumption record page allows users to query consumption records, including pending orders, successful orders, and failed orders, as well as consumption details such as date, amount, and consumption instructions.","Alarm":"The Coinbus subscription and alert page allows users to select the indicators that require alert prompts, set the subscription period and notification method, in order to better understand the changes in on chain indicators.","publishObservations":"Coinbus releases observation report page, which is used to write weekly reports, monthly reports, major news, event notifications and other report related content and submit them for publication. It can also query the publication history.","dataDisplay":"This page provides a comprehensive introduction to the Coinbus blockchain data analysis platform. The main functions of the website were elaborated in detail, including real-time monitoring of transaction data, in-depth analysis of market indicators, and monitoring of large transactions. Highlighting the advantages of the website, such as precise data sources, intuitive visual displays, personalized subscription services, and powerful backend management. Explained why users should choose this website, emphasizing professional team, continuous updates, user-friendly interface, and high-quality customer service. Clarify the purpose of the website to help users understand the cryptocurrency market and blockchain technology, in order to make informed investment decisions and risk management strategies. It also lists the data analysis content covered, including on chain data, market indicators, exchange data, macroeconomic data, and monitoring of large transactions."
+
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/lang/subscribe/index.js b/yq/src/lang/subscribe/index.js
new file mode 100644
index 0000000..269a536
--- /dev/null
+++ b/yq/src/lang/subscribe/index.js
@@ -0,0 +1,187 @@
+export const subscribe_zh = {
+ subscribe: {
+ dayReport: "今日报告数量",
+ greatReport: "重大消息报告数量",
+ customizeMessage: "自定义消息数量",
+ unauditedReport: "未审核报告数量",
+ reviewedReport: "已审核报告数量",
+ chart: "每日历史图表",
+ ReportRelease: "报告发布",
+ beReviewedRelease: "待审核报告",
+ number: "编号",
+ date: "日期",
+ ReportType: "报告类型",
+ state: "状态",
+ publisher: "发布人",
+ auditor: "审核人",
+ Subscriber: "订阅者组",
+ MessageTitle: "消息标题",
+ operation: "操作",
+ audit: "审核",
+ rejectedRelease: "已拒绝报告",
+ correction: "订正",
+ publishedRelease: "已发布报告历史",
+ details: "详情",
+ customizeHistory: "自定义消息历史",
+ subscriber1: "订阅者",
+ subscriber1Email: "订阅邮箱",
+ subscriber1Type: "订阅类型",
+ subscribe2: "订阅",
+ DailySubscription: "日报订阅",
+ WeeklySubscription: "周报订阅",
+ MajorSubscription: "重大消息订阅",
+ ConfirmSubscription: "确认订阅",
+ SubscriptionHistory: "订阅操作历史",
+ user: "用户",
+ OperationContent: "操作内容",
+ MessageHistory: "消息历史",
+ receiveEmail: "接收邮箱",
+ MessageDetails: "消息详情",
+ customizeSubscription: "自定义订阅",
+ customizeIndex: "自定义订阅指标",
+ IndexName: "指标名",
+ CurrentValue: "当前值",
+ ConditionalSelection: "条件选择(涨跌幅或门限值)",
+ increase: "涨幅百分比",
+ increaseValue: "涨幅值",
+ decline: "跌幅百分比",
+ declineValue: "跌幅值",
+ SMA: "SMA选择",
+ alarm: "告警周期选择",
+ unreadMessage: "未读消息详情",
+ time: "时间",
+ MessageContent: "消息内容",
+ Please: "请输入",
+ selectAlarm: "选择告警指标",
+ subscriptionReport: "订阅观察报告",
+ monthlyReport: "月报订阅",
+ Unsubscribed: "退订",
+ indicatorSelection: "指标选择",
+ alarmType: "告警类型",
+ addressFilling: "地址填写",
+ addressPrompt: "指定地址(最多5个地址)",
+ addressWarning: "2.每个地址请分别用 / 符号隔开,最多指定5个地址,超出将默认取值前5个地址",
+ addressWarning2: "1.请仔细确认地址填写正确,否则将导致订阅消息无法推送",
+ notificationMethod: "通知方式",
+ confirmSubmission: "确认提交",
+ subscribedMetrics: "已订阅指标",
+ subscriptionTime: "订阅时间",
+ subscribedChannels: "订阅频道",
+ subscriptionMetrics: "订阅指标",
+ alarmThreshold: "告警阈值",
+ alarmCycle: "告警周期",
+ unsubscribeReminder: "确认退订该项指标?",
+ alarmAcknowledgement: "告警信息确认",
+ Cancel: "取 消",
+ Confirm: "确 定",
+ address:"地址",
+ numericalValue:"数值",
+ ratio:"比值",
+ day:"1天",
+ realTimeData:"实时数据",
+ addressVerification:"地址不能为空或输入中文字符!",
+ noticeVerification:"请至少选择一种通知方式!",
+ repeatSubscription:"该指标已订阅,不能重复订阅!",
+
+
+
+
+
+
+
+ }
+}
+export const subscribe_en = {
+ subscribe: {
+ dayReport: "Quantity reported today",
+ greatReport: "Number of major news reports",
+ customizeMessage: "Customize the number of messages",
+ unauditedReport: "Number of unaudited reports",
+ reviewedReport: "Number of audited reports",
+ chart: "Daily history chart",
+ ReportRelease: "Report release",
+ beReviewedRelease: "Report to be reviewed",
+ number: "number",
+ date: "date",
+ ReportType: "Report type",
+ state: "state",
+ publisher: "publisher",
+ auditor: "auditor",
+ Subscriber: "Subscriber group",
+ MessageTitle: "Message title",
+ operation: "operation",
+ audit: "audit",
+ rejectedRelease: "Rejected report",
+ correction: "correction",
+ publishedRelease: "A report history has been published",
+ details: "details",
+ customizeHistory: "Customize the message history",
+ subscriber1: "subscriber",
+ subscriber1Email: "Subscribe to email",
+ subscriber1Type: "Subscription type",
+ subscribe2: "subscribe",
+ DailySubscription: "Daily subscription",
+ WeeklySubscription: "Weekly subscription",
+ MajorSubscription: "Major news subscription",
+ ConfirmSubscription: "Confirm subscription",
+ SubscriptionHistory: "Subscription operation history",
+ user: "user",
+ OperationContent: "Operation content",
+ MessageHistory: "Message history",
+ receiveEmail: "Receiving mailbox",
+ MessageDetails: "Message details",
+ customizeSubscription: "Custom subscription",
+ customizeIndex: "Customize subscription metrics",
+ IndexName: "Index name",
+ CurrentValue: "Current value",
+ ConditionalSelection: "Condition selection (rise or fall or threshold)",
+ increase: "Percentage increase",
+ increaseValue: "Value of increase",
+ decline: "Percentage decline",
+ declineValue: "Decline value",
+ SMA: "SMA selection",
+ alarm: "Alarm cycle selection",
+ unreadMessage: "Message details not read",
+ time: "time",
+ MessageContent: "Message content",
+ Please: "Please enter",
+ selectAlarm: "Select alarm indicators",
+ subscriptionReport: "Subscription observation report",
+ monthlyReport: "Monthly report subscription",
+ Unsubscribed: "Unsubscribe",
+ indicatorSelection: "selection",
+ alarmType: "Alarm Type",
+ addressFilling: "Address",
+ addressPrompt: "Specify addresses (up to 5 addresses)",
+ addressWarning: "2.Please separate each address with a / symbol, and specify a maximum of 5 addresses. If exceeded, the default value will be the top 5 addresses",
+ notificationMethod: "Notifications",
+ confirmSubmission: "Confirm submission",
+ subscribedMetrics: "Subscribed metrics",
+ subscriptionTime: "Subscription time",
+ subscribedChannels: "Subscribed Channels",
+ subscriptionMetrics: "Subscription metrics",
+ alarmThreshold: "Alarm threshold",
+ alarmCycle: "Alarm cycle",
+ unsubscribeReminder: "Are you sure to unsubscribe from this indicator?",
+ alarmAcknowledgement: "Alarm information confirmation",
+ Cancel: "Cancel",
+ Confirm: "Confirm",
+ address:"address",
+ numericalValue:"numerical Value",
+ ratio:"ratio",
+ day:"day",
+ realTimeData:"RealTime",
+ addressWarning2: "1.Please carefully confirm that the address is filled in correctly, otherwise it will result in subscription messages not being pushed",
+ addressVerification:"The address cannot be empty or input Chinese characters!",
+ noticeVerification:"Please select at least one notification method!",
+ repeatSubscription:"This indicator is subscribed and cannot be subscribed again!",
+
+
+
+
+ }
+
+
+
+}
+
diff --git a/yq/src/lang/zh.js b/yq/src/lang/zh.js
new file mode 100644
index 0000000..46edd14
--- /dev/null
+++ b/yq/src/lang/zh.js
@@ -0,0 +1,23 @@
+export default {
+ message: {
+
+ userName:`用户名`,
+ login:"登录",
+ password:"密码",
+ account:"没有账户?",
+ registered:"注册",
+ forgotPassword:"忘记密码?",
+ resetPassword:"重置密码",
+ cancel:"取消",
+ switchLanguages:"切换中英文",
+ charts:"图表",
+
+
+ },
+ placeholder:{
+ data: '选择日期'
+ },
+ login:{
+ data: '登录'
+ }
+}
\ No newline at end of file
diff --git a/yq/src/main.js b/yq/src/main.js
new file mode 100644
index 0000000..c8d61b3
--- /dev/null
+++ b/yq/src/main.js
@@ -0,0 +1,129 @@
+import Vue from 'vue'
+import 'element-ui/lib/theme-chalk/index.css';
+import App from './App.vue'
+import router from './router'
+import store from './store'
+import "./assets/icon/iconfont.css"
+import ElementUI from 'element-ui';
+import axios from "axios";
+// 引入VueI18n
+import i18n from './lang/index'
+import API from "./api/api"
+import VueQuillEditor from 'vue-quill-editor'
+import 'quill/dist/quill.core.css'
+
+import 'quill/dist/quill.snow.css'
+
+import 'quill/dist/quill.bubble.css'
+import './assets/style.css' //全局单词首字母大写
+import Dropdown from './components/dropdownBox.vue';
+import MetaInfo from 'vue-meta-info'
+
+Vue.use(MetaInfo)
+
+Vue.component('Dropdown', Dropdown);
+
+Vue.use(VueQuillEditor) // 注册富文本编辑器
+
+
+
+ // Vue.config.productionTip =false
+
+//el-tabel 使用千分位格式
+import {stateFormat,handleScopeFormat,stateFormat2} from './util/thousands'
+import {$addStorageEvent} from '../src/util/processingData'
+Vue.prototype.stateFormat = stateFormat
+Vue.prototype.stateFormat2 = stateFormat2
+Vue.prototype.handleScopeFormat = handleScopeFormat
+
+
+// element-ui 为了兼容vue-i18n@6.x
+Vue.use(ElementUI, {
+ i18n: (key, value) => i18n.t(key, value)
+})
+
+
+
+
+
+Vue.prototype.$axios = axios
+Vue.prototype.$API = API
+Vue.use(ElementUI);
+
+Vue.config.productionTip = false
+
+// //监听localstorage
+Vue.prototype.$addStorageEvent = $addStorageEvent
+
+
+console.log = ()=>{} //全局关闭打印
+
+
+
+
+window.a = Vue
+window.vm = new Vue({
+ router,
+ store,
+ i18n,
+ render: h => h(App),
+ created() {
+ this.$watch(
+ () => this.$i18n.locale,
+ (newLocale) => {
+ this.updateMetaAndTitle();
+ }
+ );
+ this.updateMetaAndTitle();
+ this.updateCanonicalUrl(); // 添加这行
+ },
+ mounted () {
+ document.dispatchEvent(new Event('render-event'))
+ },
+ methods: {
+ updateMetaAndTitle() {
+ document.title = this.$i18n.t('seo.appTitle');
+ const descriptionMeta = document.querySelector('meta[name="description"]');
+ const keywordsMeta = document.querySelector('meta[name="keywords"]');
+
+ if (descriptionMeta) {
+ descriptionMeta.content = this.$i18n.t('seo.metaDescription');
+ }
+ if (keywordsMeta) {
+ keywordsMeta.content = this.$i18n.t('seo.metaKeywords');
+ }
+ },
+
+ updateCanonicalUrl() {//更新index。html的canonical 确保每个页面都有正确的规范链接
+ const canonicalLink = document.querySelector('link[rel="canonical"]');
+ if (canonicalLink) {
+ // 根据当前路由更新 canonical URL
+ const path = this.$route.path;
+ const baseUrl = 'https://coinbus.cc';
+
+ // 如果是首页,使用基础URL
+ if (path === '/') {
+ canonicalLink.href = baseUrl;
+ } else {
+ // 其他页面添加路径
+ canonicalLink.href = `${baseUrl}${path}`;
+ }
+ }
+ },
+
+
+
+
+ },
+ watch: {
+ // 监听路由变化
+ '$route'() {
+ this.updateCanonicalUrl();
+ }
+ }
+}).$mount('#app')
+
+// 初次加载和DOM加载完成时更新
+document.addEventListener('DOMContentLoaded', () => {
+ window.vm.updateMetaAndTitle();
+});
\ No newline at end of file
diff --git a/yq/src/router/index.js b/yq/src/router/index.js
new file mode 100644
index 0000000..0871a5c
--- /dev/null
+++ b/yq/src/router/index.js
@@ -0,0 +1,501 @@
+import Vue from 'vue'
+import { $addStorageEvent } from '../util/processingData'
+import VueRouter from 'vue-router'
+import noPage from '../views/noPage.vue'
+import Web from '../views/web.vue'
+import i18n from '../lang/index'
+Vue.use(VueRouter)
+
+const routes = [
+ {
+ // path: '/Web',
+ path: '/',
+ name: 'Web',
+ component: Web,
+ meta:{
+ title:"首页",
+ description:i18n.t(`seo.Web`),
+ keywords:"区块链分析、加密货币数据、Coinbus、链上数据指标、市场洞察,Blockchain Analytics, Cryptocurrency Data, Coinbus, On-Chain Data Metrics, Market Insights",
+ },
+ children: [
+ // {
+ // path: '/NDAQ',
+ // name: 'NDAQ',
+ // component: () => import('../views/NDAQ.vue'),
+
+ // },
+ // {
+ // path: 'ETH',
+ // name: 'ETH',
+ // component: () => import('../views/ETH.vue'),
+ // meta:{
+ // title:"",
+ // description:"",
+ // keywords:"",
+ // }
+ // }
+ ]
+ },
+ // {
+ // path: '/Home',
+ // name: 'Home',
+ // component: () => import('../views/Home/index.vue'),
+ // meta:{
+ // title:"",
+ // description:"",
+ // keywords:"",
+ // }
+ // },
+ {
+ path: '/privilegeLevel',
+ name: 'PrivilegeLevel',
+ component: () => import('../views/privilegeLevel/index.vue'),
+ meta:{
+ roleKey: [`registered`, `advance`, `vip`, `support`, "verifier", `admin`] ,//可以访问人员
+ title:"账户权限等级详情",
+ description:i18n.t(`seo.privilegeLevel`),
+ keywords:"Coinbus, 权限等级,账号权限,会员等级资费, Privilege Levels, Account Privileges, Membership Level Rates",
+ }
+ },
+ // {
+ // path: '/Bian',
+ // name: 'Bian',
+ // component: () => import('../views/BiAnController.vue'),
+ // meta:{
+ // title:"",
+ // description:"",
+ // keywords:"",
+ // }
+ // },
+ {//帮助中心
+ path: '/help',
+ name: 'help',
+ component: () => import('../views/help/index.vue'),
+ meta: {//财会人员和匿名人员不能访问
+ inaccessible: "accounting",
+ roleKey: [`registered`, `advance`, `vip`, `support`, "verifier", `admin`] ,//可以访问人员
+ title:"帮助中心",
+ description:i18n.t(`seo.help`),
+ keywords:"coinbus 帮助中心,工单提交,问题处理,Work order submission, problem handling",
+ },
+ },
+ {//帮助中心历史工单点击跳出详情
+ path: '/WorkOrderDetails',
+ name: 'WorkOrderDetails',
+ meta: {//财会人员和匿名人员不能访问
+ inaccessible: "accounting",
+ roleKey: [`registered`, `advance`, `vip`, `support`, "verifier", `admin`], //可以访问人员
+ title:"工单详情",
+ description:i18n.t(`seo.WorkOrderDetails`),
+ keywords:"Coinbus 工单详情、用户工单、问题跟进,User work orders, problem follow-up",
+ },
+ component: () => import('../views/WorkOrderDetails/index.vue'),
+ },
+ {//帮助中心后台管理页面
+ path: '/HelpBackstage',
+ name: 'HelpBackstage',
+ meta: {
+ roleKey: [`support`, `verifier`, `admin`], //可以访问人员
+ // title:"后台管理",
+ // description:"Coinbus 帮助中心后台管理页面,供管理员查看工单提交情况分析,包括工单历史图表、超时工单列表、待处理及已处理工单等,高效管理用户问题。",
+ // keywords:"Coinbus 后台管理、工单分析、工单处理",
+ },
+ component: () => import('../views/helpBackstage/index.vue'),
+ },
+ {//帮助中心后台管理页面的详情页面
+ path: '/HelpDetails',
+ name: 'HelpDetails',
+ meta: {
+ roleKey: [`support`, `verifier`, `admin`], //可以访问人员
+ // title:"工单详情",
+ // description:"后台管理人员在此查看工单详情及处理历史记录,以便对用户回复处理情况,确保问题妥善解决。",
+ // keywords:"Coinbus 后台工单详情、管理回复、问题处理历史",
+ },
+ component: () => import('../views/helpDetails/index.vue'),
+ },
+ {//个人中心
+ path: '/personal',
+ name: 'personal',
+ alias: '/',
+ meta: {
+ roleKey: [`registered`, `advance`, `vip`, `support`, `verifier`, `accounting`, `admin`], //可以访问人员
+ title:"个人中心",
+ description:i18n.t(`seo.personal`),
+ keywords:"Coinbus 个人中心、账号管理、余额查询,Personal center, account management, balance inquiry",
+ },
+
+ // component: Web,
+ component: () => import('../views/personal/index.vue'),
+ },
+ {//留言板后台 WorkOrderDetails
+ path: '/messageBoard',
+ name: 'messageBoard',
+ meta: {
+ roleKey: [`support`, `verifier`, `admin`],
+ // title:"留言板后台",
+ // description:"Coinbus 留言板后台供管理人员监控用户留言情况,包含留言历史图表、未处理留言列表、已处理留言列表,及时回应用户反馈。",
+ // keywords:"Coinbus 留言板管理、用户反馈、后台监控",
+ },
+ component: () => import('../views/MessageBoard/index.vue'),
+ },
+ {//自定义订阅 subscribe
+ path: '/subscribe',
+ name: 'subscribe',
+ meta: {
+ roleKey: [`advance`, `vip`, `support`, `verifier`, `admin`], //可以访问人员
+ title:"自定义订阅",
+ description:i18n.t(`seo.subscribe`),
+ keywords:"Coinbus 自定义订阅、消息订阅、通知方式,Custom subscriptions, message subscriptions, notification methods",
+ },
+ component: () => import('../views/subscribe/index.vue'),
+ },
+ // {//自定义订阅 、订阅详情页面subscribeDetails
+ // path: '/subscribeDetails',
+ // name: 'subscribeDetails',
+ // meta: {
+ // roleKey: [`advance`, `vip`, `support`, `verifier`, `admin`], //可以访问人员
+ // title:"",
+ // description:"",
+ // keywords:"",
+ // },
+ // component: () => import('../views/subscribeDetails/index.vue'),
+ // },
+ {//订阅管理后台 subscribeBoard
+ path: '/subscribeBoard',
+ name: 'subscribeBoard',
+ meta: {
+ roleKey: [`verifier`, `admin`], //可以访问人员
+ // title:"订阅管理后台",
+ // description:"Coinbus 订阅管理后台供管理人员统计查看订阅报告数量,管理报告发布及待审核、已拒绝、已发布报告历史和自定义消息历史的相关信息分析统计。",
+ // keywords:"Coinbus 订阅管理、报告统计、后台分析",
+ },
+ component: () => import('../views/subscribeBoard/index.vue'),
+ },
+ {//订阅发布 报告发布 subscribeRelease
+ path: '/subscribeRelease',
+ name: 'subscribeRelease',
+ meta: {
+ roleKey: [`admin`], //可以访问人员
+ // title:"报告发布",
+ // description:"Coinbus 报告发布页面,仅供后台管理员使用。包含报告类型、预计发出时间、标题及内容,确保高质量的订阅报告发布",
+ // keywords:"Coinbus 报告发布、管理员操作、订阅报告",
+ },
+ component: () => import('../views/subscribeRelease/index.vue'),
+ },
+ {//订阅 审核页面 subscribAaudit
+ path: '/subscribAaudit',
+ name: 'subscribAaudit',
+ meta: {
+ roleKey: [`verifier`, `admin`], //可以访问人员
+ // title:"订阅审核",
+ // description:"Coinbus 的发布报告审核页面,展示报告相关详情信息。审核人员可依据这些信息回复审核意见,决定通过或拒绝审核报告。",
+ // keywords:"Coinbus 订阅审核、报告审核、审核意见",
+ },
+ component: () => import('../views/subscribAaudit/index.vue'),
+ },
+ {//支付管理后台 payManagement payHistories
+ path: '/payManagement',
+ name: 'payManagement',
+ meta: {
+ roleKey: [`accounting`, `admin`], //可以访问人员
+ // title:"支付管理后台",
+ // description:"Coinbus 支付管理后台,供管理人员管理用户信息。包括新增用户数量、日新增数量、转账、提现相关信息及消费金额,还有每日历史分析图。",
+ // keywords:"Coinbus 支付管理、用户信息管理、历史分析",
+ },
+ component: () => import('../views/payManagement/index.vue'),
+ },
+ {//支付历史 payHistories AccountUpgrade
+ path: '/payHistories',
+ name: 'payHistories',
+ meta: {
+ roleKey: [`registered`, `advance`, `vip`, `support`, `verifier`, `accounting`, `admin`], //可以访问人员
+ title:"支付历史",
+ description:i18n.t(`seo.payHistories`),
+ keywords:"Coinbus 支付历史、转账记录查询,Payment history, transfer history inquiry",
+ },
+ component: () => import('../views/payHistories/index.vue'),
+ },
+ {//账户升级页面 AccountUpgrade
+ path: '/AccountUpgrade',
+ name: 'AccountUpgrade',
+ meta: {
+ roleKey: [`registered`, `advance`, `vip`, `support`, `verifier`, `accounting`, `admin`], //可以访问人员
+ title:"账户升级",
+ description:i18n.t(`seo.AccountUpgrade`),
+ keywords:"Coinbus 账户升级,权限提升、支付升级,Account Upgrade, Privilege Upgrade, Payment Upgrade",
+ },
+ component: () => import('../views/AccountUpgrade/index.vue'),
+ },
+ {//后台地址管理页面 管理员 财务可看
+ path: '/BackgroundAddress',
+ name: 'BackgroundAddress',
+ meta: {
+ roleKey: [`accounting`, `admin`], //可以访问人员
+ // title:"新增收款地址",
+ // description:"Coinbus 后台地址管理页面,供后台财务和管理人员添加收款地址。",
+ // keywords:"Coinbus 后台地址管理、收款地址添加",
+ },
+ component: () => import('../views/backgroundAddress/index.vue'),
+ },
+ {//后台确认支付 管理员 财务可看
+ path: '/BackendPayment',
+ name: 'BackendPayment',
+ meta: {
+ roleKey: [`accounting`, `admin`], //可以访问人员
+ // title:"转账确认",
+ // description:"Coinbus 后台确认支付页面,供后台财务和管理人员确认处理用户提交的转账申请。",
+ // keywords:"Coinbus 后台支付确认、转账处理",
+ },
+ component: () => import('../views/backendPayment/index.vue'),
+ },
+ {//后台退款确认 管理员 财务可看
+ path: '/BackendRefund',
+ name: 'BackendRefund',
+ meta: {
+ roleKey: [`accounting`, `admin`], //可以访问人员
+ // title:"退款确认",
+ // description:"Coinbus 后台退款确认页面,供后台财务和管理人员及时处理用户的退款申请。",
+ // keywords:"Coinbus 后台退款确认、退款处理",
+ },
+ component: () => import('../views/backendRefund/index.vue'),
+ },
+ {//后台提现 管理员 财务可看
+ path: '/BackendWithdrawal',
+ name: 'BackendWithdrawal',
+ meta: {
+ roleKey: [`accounting`, `admin`], //可以访问人员
+ // title:"提现订单",
+ // description:"Coinbus 后台提现页面,供后台财务和管理人员处理用户提交的提现订单,并查询提现成功及失败的相关订单记录。",
+ // keywords:"Coinbus 后台提现管理、提现订单处理",
+ },
+ component: () => import('../views/backendWithdrawal/index.vue'),
+ },
+ // {//数据监控 支持及维护人员, 审核者可看 admin后期取消
+ // path: '/DataMonitoring',
+ // name: 'DataMonitoring',
+ // meta: {
+ // roleKey: [`support`, `admin`] ,//可以访问人员
+ // title:"",
+ // description:"",
+ // keywords:"",
+ // },
+ // component: () => import('../views/dataMonitoring/index.vue'),
+ // },
+ {//指标解释页面
+ path: '/IndexIntroduce',
+ name: 'IndexIntroduce',
+ meta: {
+ roleKey: [`registered`, `advance`, `vip`, `support`, `verifier`, `accounting`, `admin`], //可以访问人员
+ title:"指标文档介绍",
+ description:i18n.t(`seo.IndexIntroduce`),
+ keywords:"Coinbus 指标解释、链上指标含义,Interpretation of indicators, meaning of chained indicators",
+ },
+ component: () => import('../views/indexIntroduce/index.vue'),
+ },
+ {//充值页面
+ path: '/Recharge',
+ name: 'Recharge',
+ meta: {
+ roleKey: [`registered`, `advance`, `vip`, `support`, `verifier`, `accounting`, `admin`], //可以访问人员
+ title:"充值",
+ description:i18n.t(`seo.Recharge`),
+ keywords:"Coinbus 充值、币种选择、支付网络,Top-ups, currency selection, payment networks",
+ },
+ component: () => import('../views/Recharge/index.vue'),
+ },
+ {//提交txid页面
+ path: '/TXID',
+ name: 'TXID',
+ meta: {
+ roleKey: [`registered`, `advance`, `vip`, `support`, `verifier`, `accounting`, `admin`], //可以访问人员
+ title:"交易Hash",
+ description:i18n.t(`seo.TXID`),
+ keywords:"Coinbus 提交 txid、充值审核,Submit txid, recharge audit",
+ },
+ component: () => import('../views/TXID/index.vue'),
+ },
+ {//申请提现
+ path: '/Withdrawal',
+ name: 'Withdrawal',
+ meta: {
+ roleKey: [`registered`, `advance`, `vip`, `support`, `verifier`, `accounting`, `admin`], //可以访问人员
+ title:"申请提现",
+ description:i18n.t(`seo.Withdrawal`),
+ keywords:"Coinbus 申请提现、提现设置,Application for withdrawal, withdrawal settings",
+ },
+ component: () => import('../views/Withdrawal/index.vue'),
+ },
+ {//申请提现历史记录
+ path: '/withdrawalRecords',
+ name: 'withdrawalRecords',
+ meta: {
+ roleKey: [`registered`, `advance`, `vip`, `support`, `verifier`, `accounting`, `admin`], //可以访问人员
+ title:"申请提现历史记录",
+ description:i18n.t(`seo.withdrawalRecords`),
+ keywords:"Coinbus 提现历史、记录查询,Withdrawal history, record search",
+ },
+ component: () => import('../views/withdrawalRecords/index.vue'),
+ },
+ {//提现订单详情
+ path: '/withdrawalDetails',
+ name: 'withdrawalDetails',
+ meta: {
+ roleKey: [`registered`, `advance`, `vip`, `support`, `verifier`, `accounting`, `admin`], //可以访问人员
+ title:"提现订单详情",
+ description:i18n.t(`seo.withdrawalDetails`),
+ keywords:"Coinbus 提现详情、订单信息,Withdrawal details, order information",
+ },
+ component: () => import('../views/withdrawalDetails/index.vue'),
+ },
+ {//充值记录
+ path: '/RechargeRecord',
+ name: 'RechargeRecord',
+ meta: {
+ roleKey: [`accounting`, `admin`], //可以访问人员
+ // title:"充值记录管理",
+ // description:"Coinbus 充值记录管理页面,供后台管理人员和财务查看充值订单的详细信息,包括待处理订单、成功订单及失败订单。",
+ // keywords:"Coinbus 充值记录管理、订单详情",
+ },
+ component: () => import('../views/rechargeRecord/index.vue'),
+ },
+ {//消费记录 subscriptionLetter
+ path: '/ConsumptionRecords',
+ name: 'ConsumptionRecords',
+ meta: {
+ roleKey: [`registered`, `advance`, `vip`, `support`, `verifier`, `accounting`, `admin`], //可以访问人员
+ title:"消费记录",
+ description:i18n.t(`seo.ConsumptionRecords`),
+ keywords:"Coinbus 消费记录、消费查询,Consumption records, consumption inquiry",
+ },
+ component: () => import('../views/consumptionRecords/index.vue'),
+ },
+ // {//站内信
+ // path: '/subscriptionLetter',
+ // name: 'SubscriptionLetter',
+ // meta: {
+ // roleKey: [`registered`, `advance`, `vip`, `support`, `verifier`, `accounting`, `admin`], //可以访问人员
+ // title:"",
+ // description:"",
+ // keywords:"",
+ // },
+ // component: () => import('../views/subscriptionLetter/index.vue'),
+ // },
+ {//订阅与告警
+ path: '/Alarm',
+ name: 'Alarm',
+ meta: {
+ roleKey: [`registered`, `advance`, `vip`, `support`, `verifier`, `accounting`, `admin`], //可以访问人员
+ title:"订阅与告警",
+ description:i18n.t(`seo.Alarm`),
+ keywords:"Coinbus 订阅告警、指标变化,Subscribe to alerts, indicator changes",
+ },
+ component: () => import('../views/Alarm/index.vue'),
+ },
+ {//发布观察报告
+ path: '/publishObservations',
+ name: 'PublishObservations',
+ meta: {
+ roleKey: [`registered`, `advance`, `vip`, `support`, `verifier`, `accounting`, `admin`], //可以访问人员
+ title:"发布观察报告 ",
+ description:i18n.t(`seo.publishObservations`),
+ keywords:"Coinbus 观察报告、发布历史,Observation reports, release history",
+ },
+ component: () => import('../views/publishObservations/index.vue'),
+ },
+ {//seo 数据展示
+ path: '/dataDisplay',
+ name: 'DataDisplay',
+ meta: {
+ roleKey: [`registered`, `advance`, `vip`, `support`, `verifier`, `accounting`, `admin`], //可以访问人员
+ title:"coinbus 区块链数据分析平台介绍",
+ description:i18n.t(`seo.dataDisplay`),
+ keywords:"Coinbus、区块链数据分析、加密货币、交易数据、市场指标、大额交易监控、精准数据、可视化展示、订阅服务、专业团队、客户服务、投资决策、风险管理,Blockchain data analytics, cryptocurrencies, trading data, market metrics, large transaction monitoring, accurate data, visualization, subscription services, professional team, customer service, investment decisions, risk management",
+ },
+ component: () => import('../views/dataDisplay/index.vue'),
+ },
+
+ {
+ path: '*',//404
+ name: 'noPage',
+ component: noPage
+ },
+
+]
+
+
+
+const router = new VueRouter({
+ // hash history
+ mode: "history",
+ routes
+})
+
+
+
+// 全局前置守卫 在每次路由跳转前执行一些逻辑
+// router.beforeEach((to, from, next) => {
+// $addStorageEvent(1, "permissionMask", JSON.stringify(false))
+// // 想要进入个人中心页面 必须有token
+// let token = localStorage.getItem("token");
+// //当前用户等级
+// let identity = JSON.parse(localStorage.getItem("identity"));
+
+// // console.log(to.path,3333);
+// //返回首页关闭遮罩
+// if (to.path == "/" || to.path == "/web") {
+// //判断跳转的动态组件还是其他路由页面存不同的显示旗帜
+// $addStorageEvent(1, "routerPage", JSON.stringify("web"))
+// $addStorageEvent(1, "permissionMask", JSON.stringify(false))
+// next();
+// } else if (to.path == `/IndexIntroduce`) {
+
+// $addStorageEvent(1, "routerPage", JSON.stringify("IndexIntroduce"))
+
+// } else { //指标介绍和组件页面可以同时存在
+// $addStorageEvent(1, "routerPage", JSON.stringify("noWeb"))
+
+// }
+
+
+
+// next();
+// });
+
+
+
+
+// const originalPush = VueRouter.prototype.push
+
+// VueRouter.prototype.push = function push(location) {
+// return originalPush.call(this, location).catch(err => err)
+// }
+
+// const VueRouterPush = VueRouter.prototype.push//处理重复跳转一个页面报错问题
+// VueRouter.prototype.push = function push(to) {
+// return VueRouterPush.call(this, to).catch(err => err)
+// }
+// 处理重复路由导航
+const originalPush = VueRouter.prototype.push
+const originalReplace = VueRouter.prototype.replace
+
+// 重写push方法
+VueRouter.prototype.push = function push(location) {
+ return originalPush.call(this, location).catch(err => {
+ if (err.name !== 'NavigationDuplicated') {
+ return Promise.reject(err)
+ }
+ return Promise.resolve(false)
+ })
+}
+
+// 同样处理replace方法
+VueRouter.prototype.replace = function replace(location) {
+ return originalReplace.call(this, location).catch(err => {
+ if (err.name !== 'NavigationDuplicated') {
+ return Promise.reject(err)
+ }
+ return Promise.resolve(false)
+ })
+}
+
+export default router
\ No newline at end of file
diff --git a/yq/src/store/bigDEals.js b/yq/src/store/bigDEals.js
new file mode 100644
index 0000000..2e60406
--- /dev/null
+++ b/yq/src/store/bigDEals.js
@@ -0,0 +1,15 @@
+export default {
+ state: {
+ tableData:[]
+ },
+ mutations: {
+ handelTableData(state,val){
+ state.tableData =val
+ },
+
+ },
+ actions: {
+
+ },
+
+}
\ No newline at end of file
diff --git a/yq/src/store/index.js b/yq/src/store/index.js
new file mode 100644
index 0000000..f1b5b4e
--- /dev/null
+++ b/yq/src/store/index.js
@@ -0,0 +1,21 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+import tab from './tab'
+import user from './user'
+import bigDEals from './bigDEals'
+import createPersistedState from 'vuex-persistedstate';
+Vue.use(Vuex)
+
+
+export default new Vuex.Store({
+
+ modules: {
+ tab,//引入模块
+ user,
+ bigDEals,
+
+ },
+ plugins: [//持久化保存vuex数据
+ createPersistedState()
+ ],
+})
diff --git a/yq/src/store/tab.js b/yq/src/store/tab.js
new file mode 100644
index 0000000..977d950
--- /dev/null
+++ b/yq/src/store/tab.js
@@ -0,0 +1,24 @@
+export default {
+ state: {
+ menu:[],//全部菜单
+ currentMenu:{label:"menu.profitAddress"},//选择的菜单
+ chooseTime:{
+ start:"",
+ end:""
+ }
+ },
+ mutations: {
+ selectMenu(state,val){
+ state.currentMenu =val
+ },
+ handelTime(state,val){
+ state.chooseTime.start =val[0]
+ state.chooseTime.end=val[1]
+
+ }
+ },
+ actions: {
+
+ },
+
+}
\ No newline at end of file
diff --git a/yq/src/store/user.js b/yq/src/store/user.js
new file mode 100644
index 0000000..503cf0a
--- /dev/null
+++ b/yq/src/store/user.js
@@ -0,0 +1,27 @@
+export default {
+
+
+
+
+ state: {
+ userName:"",//用户名
+ identity:{},
+ },
+ mutations: {
+ handelName(state,val){
+ state.userName =val
+ console.log("存名字",state.userName);
+
+ },
+ handelIdentity(state,val){
+ state.identity =val
+ console.log("存权限",state.identity);
+ }
+ },
+ actions: {
+
+ },
+
+
+
+}
\ No newline at end of file
diff --git a/yq/src/util/chartResize.js b/yq/src/util/chartResize.js
new file mode 100644
index 0000000..3669570
--- /dev/null
+++ b/yq/src/util/chartResize.js
@@ -0,0 +1,36 @@
+import * as echarts from "echarts";
+import Vue from 'vue';
+import elementResizeDetectorMaker from "element-resize-detector"
+
+export var version = '0.0.1';
+var compatible = (/^2\./).test(Vue.version);
+if (!compatible) {
+ Vue.util.warn('vue echarts resize directive ' + version + ' only supports Vue 2.x, and does not support Vue ' + Vue.version);
+}
+let HANDLER = "_vue_echarts_resize_handler"
+
+function bind(el) {
+ unbind(el);
+ el[HANDLER] = function () {
+ let chart = echarts.getInstanceByDom(el);
+ if (!chart) {
+ return;
+ }
+ chart.resize();
+ }
+ //监听window窗体变化,更新echarts大小
+ //window.addEventListener("resize", el[HANDLER])
+ //监听绑定的div大小变化,更新echarts大小
+ elementResizeDetectorMaker().listenTo(el,el[HANDLER])
+
+}
+function unbind(el) {
+ //window.removeEventListener("resize", el[HANDLER]);
+ elementResizeDetectorMaker().removeListener(el,el[HANDLER])
+ delete el[HANDLER];
+}
+var directive = {
+ bind: bind,
+ unbind: unbind
+};
+Vue.directive("on-echart-resize", directive)
diff --git a/yq/src/util/demo.js b/yq/src/util/demo.js
new file mode 100644
index 0000000..261272d
--- /dev/null
+++ b/yq/src/util/demo.js
@@ -0,0 +1,366 @@
+//
+//
+//
+//
+//
+//
+//
+
+//
+
diff --git a/yq/src/util/echarts.js b/yq/src/util/echarts.js
new file mode 100644
index 0000000..f439817
--- /dev/null
+++ b/yq/src/util/echarts.js
@@ -0,0 +1,303 @@
+//折线图
+export const line = {
+ tooltip: {
+ trigger: "axis",
+ position: function (pt) {
+ return [pt[0], "10%"];
+ },
+ },
+ legend: {},
+ xAxis: {
+ // type: "time",
+ data: [],
+ // boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ // axisLabel: {
+ // formatter: function (e) {
+
+ // let value;
+ // if (e > 1000000) {
+ // value = e / 100000;
+ // } else if (e > 100000) {
+ // value = e / 1000;
+ // } else {
+ // value = e / 100;
+ // }
+ // return value;
+ // },
+ // },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "1",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "发送地址数",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#008acc",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#008acc",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ markLine: {
+ symbol: ["none", "none"], //去掉箭头
+ itemStyle: {
+ normal: {
+ lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ },
+ },
+ // lineStyle:{
+ // color:"red"
+ // },
+
+ label: {
+ formatter: "{b}",
+ fontSize: 10,
+ color: "rgba(0,0,0,0.8)",
+ align: "left",
+ },
+ data: [
+ {
+ name: "0",
+ yAxis: 0,
+ },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+ {
+ name: "$70W",
+ yAxis: 700000,
+ },
+ {
+ name: "$40W",
+ yAxis: 400000,
+ },
+
+ {
+ name: "$10W",
+ yAxis: 100000,
+ },
+ {
+ name: "$100W",
+ yAxis: 1000000,
+ // position: ['100%', '50'],
+ },
+ ],
+ },
+ },
+ {
+ name: "日交易量",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#666666",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#666666",
+ width: "1",
+ },
+ data: [],
+ },
+ ],
+
+}
+
+//小折线图
+export const minLine = {
+
+ xAxis: {
+ boundaryGap: false,
+ show:false,
+ axisLine: { onZero: false },
+ axisTick: { show: false },
+ axisLabel: { show: false, interval: 0 },
+ data: [],
+
+ },
+ yAxis: {
+ // type:"value",
+ show:false,
+ scale: true,
+ position: 'right',
+ axisLine: { show: false },
+ axisTick: { show: false },
+ splitLine: { show: false},
+ axisLabel: { inside: false,interval: 0 }
+ },
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ ],
+ grid:{
+ top:1,
+ bottom:3,
+ left:3,
+ right:3,
+ },
+ series: [
+ {
+ name: 'Fake Data',
+ type: 'line',
+ showSymbol: false,
+ lineStyle: {
+ color: "#d84d65"
+ },
+ data: []
+ }
+ ]
+
+}
+//柱状图
+export const bar = {
+ title: {
+ text: "",
+ left: "center",
+ textStyle: {
+ fontSize: 15,
+ fontWeight: "normal"
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ axisPointer: {
+ type: "cross",
+ crossStyle: {
+ color: "#999",
+ },
+ },
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i <= params.length - 1; i++) {
+ // res += `${params[i].marker} ${params[i].value[1]} ${params[i].seriesName}`;
+ // }
+ // return "111";
+ // },
+ },
+
+ legend: {
+ right: 100,
+ formatter: function (name) {
+
+ return name;
+ },
+ },
+ xAxis: [
+ {
+ type: "category",
+ data: [],
+ },
+ ],
+ yAxis: [
+ {
+ type: "value",
+ // name: "Precipitation",
+ // min: 0,
+ // max: 250,
+ // interval: 50,
+ axisLabel: {
+ formatter: function (value) {
+
+ let label = value / 1000000
+ return `${label}M`
+ },
+ },
+ },
+
+ ],
+ series: [
+ {
+
+ type: "bar",
+ colorBy: "data",
+ // tooltip: {
+ // valueFormatter: function (value) {
+ // return value + " ml";
+ // },
+ // },
+ data: [],
+ itemStyle: {
+ color: "#fdaa56",
+ },
+ },
+ {
+ name: "",
+ type: "bar",
+ itemStyle: {
+ color: "#607d8b",
+ },
+
+ data: [],
+ },
+ ],
+
+}
+
diff --git a/yq/src/util/fun.js b/yq/src/util/fun.js
new file mode 100644
index 0000000..d7e4e1b
--- /dev/null
+++ b/yq/src/util/fun.js
@@ -0,0 +1,20 @@
+
+import JSEncrypt from "jsencrypt"; //引入模块
+
+const publicKey = `MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA05Wt7Jqv+fQFS4ND2sqY
+XAMnn7iZYCThxe5zfXjqZ27Q3bIC0NIIgKAcrox3Ke5mb+hJ4D5pYFbnRdaRC6X1
+64QDMLMxNd2jgVrSVwJbEIJaBNeLIzcS6ZzozVEMgIquOBfurwt8il070eFczoBL
+iFXnfLlmTpx0fSem4pTBLIRPuM0fQQAeD419Pu/p067EuYBMOy19c6pf0QQnUVbd
+PZjDvZb8WLXXtpKhAWT/9o6CjJkieTmkjslP479fk/ImRXbmALwoByVpY+kX6NTX
+6gBEy53svi7arlC1IK+Pp9nX/RbUkLRoXH2he6dgd5F/8QCV4eHMJ6CeLuUORVx2
+FQIDAQAB`
+export const encryption = (str) => {
+ //创建实例
+ const jse = new JSEncrypt()
+ //添加秘钥 秘钥放过来
+ jse.setPublicKey(publicKey)
+ //加密
+ let data = jse.encrypt(str)
+ return data
+
+}
diff --git a/yq/src/util/index.js b/yq/src/util/index.js
new file mode 100644
index 0000000..ab5072a
--- /dev/null
+++ b/yq/src/util/index.js
@@ -0,0 +1,164 @@
+import store from '@/store/index'
+import {NotificationBackend} from '@/api/index'
+
+class webscoketUtill {
+ constructor(url = '') {
+ //连接地址
+ this.url = url
+ //连接器
+ this.ws = null
+ //避免重复连接
+ this.is_open_scoket = false
+ //心跳时间
+ this.timeout = 9000
+ //心跳定时器
+ this.heartbeatInterval = null
+ //重连次数
+ this.reconnectionTimes = 9
+ //多久重连一次
+ this.reconnectionTimeout = null
+ //连接次数
+ this.numberConnections = 0
+
+ try {
+ this.init()
+ } catch (e) {
+ throw new Error(e)
+ }
+
+ }
+
+ init() {
+ //创建webscoket
+ this.ws = new WebSocket(this.url)
+ //监听链接是否成功
+ this.ws.onopen = (e) => {
+ this.is_open_scoket = true
+ this.numberConnections = 0
+ clearInterval(this.heartbeatInterval)
+ clearTimeout(this.reconnectionTimeout)
+ this.heartbeat()
+ this.onmessage()
+ this.onclose()
+ }
+ this.onerror()
+ }
+
+ //接收后端信息
+ onmessage() {
+ this.ws.onmessage = (e) => {
+ if (this.isJSON(e.data)) {
+ let data = JSON.parse(e.data)
+ if (data.code === 201) {
+ NotificationBackend({
+ symbol: store.state.currency,
+ time: '30s',
+ client_id: data.data.client_id
+ })
+ }
+ if (data.code === 202) {
+ let arr = []
+ data.data.history.forEach(item => {
+ arr.push(JSON.parse(item))
+ })
+ store.commit({
+ type: 'on_K_line_array',
+ data: arr
+ })
+ }
+ if (data.code === 203) {
+ store.commit({
+ type: 'onSecondData',
+ data: JSON.parse(data.data)
+ })
+ }
+ if (data.code === 204) {
+ store.commit({
+ type: 'onBranchData',
+ data: data.data || false
+ })
+ }
+ }
+ }
+ }
+
+ //发送消息
+ send(val) {
+ let str = ''
+ if (typeof val === 'string') {
+ str = val
+ } else {
+ str = JSON.stringify(val)
+ }
+ this.ws.send(str)
+ }
+
+ //检测心跳
+ heartbeat() {
+ this.heartbeatInterval = setInterval(() => {
+ this.send({
+ code: 1,
+ msg: '狗哥摆烂了'
+ })
+ }, this.timeout)
+ }
+
+ //重连
+ reconnection() {
+ clearInterval(this.heartbeatInterval)
+ clearTimeout(this.reconnectionTimeout)
+ if (!this.is_open_scoket) {
+ if (this.numberConnections < this.reconnectionTimes) {
+ this.close()
+ this.init()
+ this.numberConnections++
+ this.reconnectionTimeout = setTimeout(() => {
+ this.reconnection()
+ }, 3000)
+ }
+ }
+ }
+
+ //后端连接断开
+ onclose() {
+ this.ws.onclose = (e) => {
+ this.is_open_scoket = false
+ this.reconnection()
+ }
+ }
+
+ close() {
+ this.send({
+ code: 2,
+ data: '我已关闭!'
+ })
+ this.ws.close()
+
+ }
+
+ //连接失败
+ onerror() {
+ this.ws.onerror = (e) => {
+ this.is_open_scoket = false
+ this.reconnection()
+ }
+ }
+
+ //判断是否是json
+ isJSON(str) {
+ if (typeof str === 'string') {
+ try {
+ let obj = JSON.parse(str)
+ if (typeof obj === 'object' && obj) {
+ return true
+ } else {
+ return false
+ }
+ } catch (e) {
+ return false
+ }
+ }
+ }
+}
+
+export default webscoketUtill
\ No newline at end of file
diff --git a/yq/src/util/menu.js b/yq/src/util/menu.js
new file mode 100644
index 0000000..a840fe8
--- /dev/null
+++ b/yq/src/util/menu.js
@@ -0,0 +1,3073 @@
+export const bTCMenu =[
+ {
+ //链上数据
+ label: "menu.onchain",
+ icon: "i itubiao2",
+ nested: "peers", //没有多层嵌套
+ id: "B01",
+ children: [
+ {
+ //地址
+ label: "menu.address",
+ icon: "i izhexiantu-xianxing",
+ id: "B01-1",
+ children: [
+ {
+ //地址统计
+ path: "/",
+ label: "menu.onchain2",
+ fullName: "menu.onchain2",
+ icon: "i igl-folderOpen",
+ componentReq: "newAddress2",
+ radius: "btc",
+ id: "B01-1-4",
+ introduce: "introduce.address",
+ navigation: "newAddress",
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //盈利地址数
+ path: "/",
+ label: "menu.profitAddress",
+ fullName: "menu.profitAddress",
+ icon: "i igl-folderOpen",
+ componentReq: "profitAddress",
+ radius: "btc",
+ id: "B01-1-1",
+ introduce: "introduce.profitAddress",
+ navigation: "profitAddress",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //匿名用户
+ },
+ {
+ //亏损地址数
+ path: "/",
+ label: "menu.lossAddress",
+ fullName: "menu.lossAddress",
+ icon: "i igl-folderOpen",
+ componentReq: "lossAddress",
+ radius: "btc",
+ id: "B01-1-2",
+ introduce: "introduce.lossAddress",
+ navigation: "lossAddress",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //匿名用户
+ },
+ {
+ //地址盈亏比
+ path: "/",
+ label: "menu.profitRatio",
+ fullName: "menu.profitRatio",
+ icon: "i igl-folderOpen",
+ componentReq: "profitRatio",
+ radius: "btc",
+ id: "B01-1-3",
+ introduce: "introduce.profitRatio",
+ navigation: "profitRatio",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //匿名用户
+ },
+
+ {
+ //暂时注释 持有比特币超过100个的地址列表 改为 巨鲸地址列表 无权限
+ path: "/",
+ label: "menu.onchain15",
+ fullName: "menu.onchain15",
+ icon: "i igl-folderOpen",
+ componentReq: "getTopList",
+ radius: "btc",
+ id: "B01-1-5",
+ introduce: "introduce.getTopList",
+ navigation: "topList", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //新增地址数
+ path: "/",
+ label: "menu.newAddress",
+ fullName: "menu.newAddress",
+ icon: "i igl-folderOpen",
+ componentReq: "newAddress2",
+ radius: "btc",
+ id: "B01-1-6",
+ introduce: "introduce.address",
+ navigation: "newAddress2",
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //新地址交易量
+ path: "/",
+ label: "menu.newAddressVolume",
+ fullName: "menu.newAddressVolume",
+ icon: "i igl-folderOpen",
+ componentReq: "newAddress2",
+ radius: "btc",
+ id: "B01-1-7",
+ introduce: "introduce.address",
+ navigation: "newAddressVolume",
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //总地址数
+ path: "/",
+ label: "menu.totalAddress",
+ fullName: "menu.totalAddress",
+ icon: "i igl-folderOpen",
+ componentReq: "newAddress2",
+ radius: "btc",
+ id: "B01-1-8",
+ introduce: "introduce.address",
+ navigation: "totalAddress",
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ ],
+ },
+ {
+ //矿工
+ label: "menu.Miners",
+ icon: "i izhexiantu-xianxing",
+ id: "B02-1",
+ children: [
+ {
+ //发行价值(USD) 改为日发行价值 中英文都是 puell multiple
+ path: "/",
+ label: "menu.technology38",
+ fullName: "menu.technology38",
+ icon: "i igl-folderOpen",
+ componentReq: "mintusd",
+ radius: "btc",
+ id: "B02-1-1",
+ introduce: "introduce.mintusd",
+ navigation: "mintusd", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户"
+ },
+ // {
+ // //矿工地址数 与矿工地址余额 合并 改为矿工余额
+ // path: "/",
+ // label: "menu.onchain20",
+ // fullName: "menu.onchain21",
+ // icon: "i igl-folderOpen",
+ // componentReq: "minerAddress",
+ // radius: "btc",
+ // id: "B02-1-2",
+ // introduce: "introduce.minerAddress",
+ // navigation: "minerAddress", //导航组件名称
+ // assets: "BTC",
+ // interval: "menu.interval3", //1天
+ // type: "L1",
+ // authority: "guest", //匿名用户
+ // },
+ {
+ //矿工地址数
+ path: "/",
+ label: "menu.minerAddress",
+ fullName: "menu.minerAddress",
+ icon: "i igl-folderOpen",
+ componentReq: "minerAddress",
+ radius: "btc",
+ id: "B02-1-3",
+ introduce: "introduce.minerAddress",
+ navigation: "minerAddress2", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3", //1天
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //矿工地址余额
+ path: "/",
+ label: "menu.minerBalance",
+ fullName: "menu.minerBalance",
+ icon: "i igl-folderOpen",
+ componentReq: "minerAddress",
+ radius: "btc",
+ id: "B02-1-4",
+ introduce: "introduce.minerAddress",
+ navigation: "minerBalance2", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3", //1天
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ ],
+ },
+ {
+ //网络
+ label: "menu.Network",
+ icon: "i izhexiantu-xianxing",
+ id: "B03-1",
+ children: [
+ // {
+ // //日交易统计 更改名字 交易统计 拆分为 交易量、交易费、交易量(找零消除)
+ // path: "/",
+ // label: "menu.onchain19",
+ // fullName: "menu.onchain19",
+ // icon: "i igl-folderOpen",
+ // componentReq: "BTCVolume",
+ // radius: "btc",
+ // id: "B03-1-1",
+ // introduce: "introduce.BTCVolume",
+ // navigation: "volume", //导航组件名称
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L1",
+ // authority: "guest", //匿名用户
+ // },
+ {
+ //交易汇率乘数
+ path: "/",
+ label: "menu.frm",
+ fullName: "menu.frm",
+ icon: "i igl-folderOpen",
+ componentReq: "frm",
+ radius: "btc",
+ id: "B03-1-2",
+ introduce: "introduce.frm",
+ navigation: "frm",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ {
+ //流通供应量
+ path: "/",
+ label: "menu.technology21",
+ fullName: "menu.technology21",
+ icon: "i igl-folderOpen",
+ componentReq: "csupply",
+ radius: "btc",
+ id: "B03-1-3",
+ introduce: "introduce.csupply",
+ navigation: "csupply", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ path: "/", //大额交易
+ label: "menu.onchain1",
+ fullName: "menu.onchain1",
+ icon: "i igl-folderOpen",
+ componentReq: "ethbigtxcount",
+ radius: "btc",
+ id: "B03-1-4",
+ introduce: "introduce.btcbigtxcount",
+ navigation: "bigDeals",
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ // {
+ // //待交易池详情 拆分为交易内存池数量、交易内存池费用
+ // path: "/",
+ // label: "menu.mempool",
+ // fullName: "menu.mempool", //全名
+ // icon: "i igl-folderOpen",
+ // componentReq: "mempool",
+ // radius: "btc",
+ // id: "B03-1-5",
+ // introduce: "introduce.mempool",
+ // navigation: "mempool", //导航组件名称
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered",
+ // },
+ {
+ //交易量
+ path: "/",
+ label: "menu.TransactionVolume",
+ fullName: "menu.TransactionVolume",
+ icon: "i igl-folderOpen",
+ componentReq: "BTCVolume",
+ radius: "btc",
+ id: "B03-1-6",
+ introduce: "introduce.BTCVolume",
+ navigation: "TransactionVolume", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //交易费
+ path: "/",
+ label: "menu.TransactionFee",
+ fullName: "menu.TransactionFee",
+ icon: "i igl-folderOpen",
+ componentReq: "BTCVolume",
+ radius: "btc",
+ id: "B03-1-7",
+ introduce: "introduce.BTCVolume",
+ navigation: "TransactionFee", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //交易量(找零消除)
+ path: "/",
+ label: "menu.adjusted",
+ fullName: "menu.adjusted",
+ icon: "i igl-folderOpen",
+ componentReq: "BTCVolume",
+ radius: "btc",
+ id: "B03-1-8",
+ introduce: "introduce.BTCVolume",
+ navigation: "adjusted", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //交易内存池数量 memoryPoolFees
+ path: "/",
+ label: "menu.TransactionCount",
+ fullName: "menu.TransactionCount", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "mempool",
+ radius: "btc",
+ id: "B03-1-9",
+ introduce: "introduce.mempool",
+ navigation: "TransactionCount", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ {
+ //交易内存池费用
+ path: "/",
+ label: "menu.memoryPoolFees",
+ fullName: "menu.memoryPoolFees", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "mempool",
+ radius: "btc",
+ id: "B03-1-10",
+ introduce: "introduce.mempool",
+ navigation: "memoryPoolFees", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ ],
+ },
+ {
+ //长/短期持有者
+ label: "menu.LongShort",
+ icon: "i izhexiantu-xianxing",
+ id: "B04-1",
+ children: [
+ {
+ //长期持有者每日交易量
+ path: "/",
+ label: "menu.lthVolume", //简写
+ fullName: "menu.lthVolume2", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "lthVolume",
+ radius: "btc",
+ id: "B04-1-1",
+ introduce: "introduce.lthVolume",
+ navigation: "lthVolume",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //长期持有者供应量
+ path: "/",
+ label: "menu.lthSupply",
+ fullName: "menu.lthSupply2", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "lthSupply",
+ radius: "btc",
+ id: "B04-1-2",
+ introduce: "introduce.lthSupply",
+ navigation: "lthSupply",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //长期持有者盈利总供应量 改为 长期持有者盈利供应量
+ path: "/",
+ label: "menu.lthProfitSupply",
+ fullName: "menu.lthProfitSupply2", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "lthProfitSupply",
+ radius: "btc",
+ id: "B04-1-3",
+ introduce: "introduce.lthProfitSupply",
+ navigation: "lthProfitSupply",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //长期持有者亏损总供应量 改为 长期持有者亏损供应量
+ path: "/",
+ label: "menu.lthLossSupply",
+ fullName: "menu.lthLossSupply2", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "lthLossSupply",
+ radius: "btc",
+ id: "B04-1-4",
+ introduce: "introduce.lthLossSupply",
+ navigation: "lthLossSupply",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //长期持有者盈亏比
+ path: "/",
+ label: "menu.lthProfitRatio",
+ fullName: "menu.lthProfitRatio2", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "lthProfitRatio",
+ radius: "btc",
+ id: "B04-1-5",
+ introduce: "introduce.lthProfitRatio",
+ navigation: "lthProfitRatio",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //短期持有者供应量
+ path: "/",
+ label: "menu.sthSupply",
+ fullName: "menu.sthSupply2", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "sthSupply",
+ radius: "btc",
+ id: "B04-1-13",
+ introduce: "introduce.sthSupply",
+ navigation: "sthSupply",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //短期持有者盈利总供应量 改为短期持有者盈利供应量
+ path: "/",
+ label: "menu.sthProfitSupply",
+ fullName: "menu.sthProfitSupply2", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "sthProfitSupply",
+ radius: "btc",
+ id: "B04-1-6",
+ introduce: "introduce.sthProfitSupply",
+ navigation: "sthProfitSupply",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //短期持有者亏损总供应量 改为短期持有者亏损供应量
+ path: "/",
+ label: "menu.sthLossSupply",
+ fullName: "menu.sthLossSupply2", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "sthLossSupply",
+ radius: "btc",
+ id: "B04-1-7",
+ introduce: "introduce.sthLossSupply",
+ navigation: "sthLossSupply",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //短期持有者盈亏比
+ path: "/",
+ label: "menu.sthProfitRatio",
+ fullName: "menu.sthProfitRatio2", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "sthProfitRatio",
+ radius: "btc",
+ id: "B04-1-8",
+ introduce: "introduce.sthProfitRatio",
+ navigation: "sthProfitRatio",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //长/短期持有者供应量盈亏比
+ path: "/",
+ label: "menu.relativeLthSth",
+ fullName: "menu.relativeLthSth2", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "relativeLthSth",
+ radius: "btc",
+ id: "B04-1-9",
+ introduce: "introduce.relativeLthSth",
+ navigation: "relativeLthSth",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //短期到长期实现价值比率
+ path: "/",
+ label: "menu.SLRVRatio",
+ fullName: "menu.SLRVRatio2", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "SLRVRatio",
+ radius: "btc",
+ id: "B04-1-10",
+ introduce: "introduce.SLRVRatio",
+ navigation: "SLRVRatio",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //长持者流通市值-已实现流通市值比 改为 长期持有者 MVRV Ratio
+ path: "/",
+ label: "menu.technology30",
+ fullName: "menu.lthmvrv", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "lthmvrv",
+ radius: "btc",
+ id: "B04-1-11",
+ introduce: "introduce.lthmvrv",
+ navigation: "lthmvrv", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //短持者流通市值-已实现流通市值比 改为 短期持有者 MVRV Ratio
+ path: "/",
+ label: "menu.technology31",
+ fullName: "menu.sthmvrv", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "sthmvrv",
+ radius: "btc",
+ id: "B04-1-12",
+ introduce: "introduce.sthmvrv",
+ navigation: "sthmvrv", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //长/短期持有者供应量盈亏分布
+ path: "/",
+ label: "menu.distributionLthSth",
+ fullName: "menu.distributionLthSth", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "distributionLthSth",
+ radius: "btc",
+ id: "B04-1-14",
+ introduce: "introduce.distributionLthSth",
+ navigation: "distributionLthSth", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ ],
+ },
+ {
+ //盈亏
+ label: "menu.ProfitLoss",
+ icon: "i izhexiantu-xianxing",
+ id: "B05-1",
+ children: [
+ {
+ //流通市值
+ path: "/",
+ label: "menu.technology28",
+ fullName: "menu.marketcap", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "marketcap",
+ radius: "btc",
+ id: "B05-1-1",
+ introduce: "introduce.marketcap",
+ navigation: "marketcap", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ // 已实现流通市值 改为和流通市值合并显示在一个页面 后期修改拆分
+ path: "/",
+ label: "menu.technology29",
+ fullName: "menu.rcap", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "rcap",
+ radius: "btc",
+ id: "B05-1-17",
+ introduce: "introduce.rcap",
+ navigation: "rcap", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest",
+ },
+ {
+ // 已实现流通市值(找零消除)
+ path: "/",
+ label: "menu.earcap",
+ fullName: "menu.earcap2", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "earcap",
+ radius: "btc",
+ id: "B05-1-18",
+ introduce: "introduce.earcap1",
+ navigation: "earcap1", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ {
+ //新的MVRV 改名 MVRV Ratio
+
+ path: "/",
+ label: "menu.technology1",
+ fullName: "menu.mvrv", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "market",
+ radius: "mvrv",
+ id: "B05-1-3",
+ introduce: "introduce.MVRV",
+ navigation: "mvrv",
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //MVRVZ MVRV Z-Score
+ path: "/",
+ label: "menu.technology2",
+ fullName: "menu.technology2", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "market",
+ // req: "market",
+ radius: "MVRVZ",
+ coin: "BTC",
+ id: "B05-1-4",
+ introduce: "introduce.MVRVZ",
+ navigation: "MVRVZ", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //流通速度
+ path: "/",
+ label: "menu.velocity",
+ fullName: "menu.velocity", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "velocity",
+ radius: "btc",
+ id: "B05-1-2",
+ introduce: "introduce.velocity",
+ navigation: "velocity",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+
+ {
+ //已实现盈利量
+ path: "/",
+ label: "menu.technology25",
+ fullName: "menu.technology25", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "rprofit",
+ radius: "btc",
+ id: "B05-1-5",
+ formula: "", //介绍公式
+ introduce: "introduce.rprofit",
+ navigation: "rprofit", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //已实现亏损量
+ path: "/",
+ label: "menu.technology26",
+ fullName: "menu.technology26", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "rloss",
+ radius: "btc",
+ id: "B05-1-6",
+ introduce: "introduce.rloss",
+ navigation: "rloss", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //已实现净收益损失比
+ path: "/",
+ label: "menu.technology27",
+ fullName: "menu.technology27", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "rplRate",
+ radius: "btc",
+ id: "B05-1-7",
+ introduce: "introduce.rplRate",
+ navigation: "rplRate", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //已实现价格
+ path: "/",
+ label: "menu.realizedPrice",
+ fullName: "menu.realizedPrice", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "realizedPrice",
+ radius: "btc",
+ id: "B05-1-8",
+ introduce: "introduce.realizedPrice",
+ navigation: "realizedPrice",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ {
+ //已平衡价格
+ path: "/",
+ label: "menu.balancedPrice",
+ fullName: "menu.balancedPrice", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "balancedPrice",
+ radius: "btc",
+ id: "B05-1-9",
+ introduce: "introduce.balancedPrice",
+ navigation: "balancedPrice",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //累积价值-销毁天数比
+ path: "/",
+ label: "menu.cvdd",
+ fullName: "menu.cvdd2", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "cvdd",
+ radius: "btc",
+ id: "B05-1-10",
+ introduce: "introduce.cvdd",
+ navigation: "cvdd",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ {
+ //未实现的净收益量
+ path: "/",
+ label: "menu.technology33",
+ fullName: "menu.technology33", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "uprofit",
+ radius: "btc",
+ id: "B05-1-12",
+ introduce: "introduce.uprofit",
+ navigation: "uprofit", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //未实现的净亏损量
+ path: "/",
+ label: "menu.technology34",
+ fullName: "menu.technology34", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "uloss",
+ radius: "btc",
+ id: "B05-1-13",
+ introduce: "introduce.uloss",
+ navigation: "uloss", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //未实现的净收益损失比
+ path: "/",
+ label: "menu.technology32",
+ fullName: "menu.nupl", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "nupl",
+ radius: "btc",
+ id: "B05-1-11",
+ introduce: "introduce.nupl",
+ navigation: "nupl", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+
+ {
+ //长持者未实现的净收益量 改为 长持者未实现的净收益损失比
+ path: "/",
+ label: "menu.technology35",
+ fullName: "menu.lthnupl", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "lthnupl",
+ radius: "btc",
+ id: "B05-1-14",
+ introduce: "introduce.lthnupl",
+ navigation: "lthnupl", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3", //改为1天
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //短持者未实现的净收益量 改为 短持者未实现的净收益损失比
+ path: "/",
+ label: "menu.technology36",
+ fullName: "menu.sthnupl", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "sthnupl",
+ radius: "btc",
+ id: "B05-1-15",
+ introduce: "introduce.sthnupl",
+ navigation: "sthnupl", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3", //改为1天
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //市值/交易价值比 NVT Ratio 改为 市盈率
+ path: "/",
+ label: "menu.nvtRatio",
+ fullName: "menu.nvtRatio2", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "nvtRatio",
+ radius: "btc",
+ id: "B05-1-16",
+ introduce: "introduce.nvtRatio",
+ navigation: "nvtRatio",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ {
+ //NVT信号
+ path: "/",
+ label: "menu.nvtSign",
+ fullName: "menu.nvtSign", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "nvtSign",
+ radius: "btc",
+ id: "B05-1-19",
+ introduce: "introduce.nvtSign",
+ navigation: "nvtSign",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ ],
+ },
+ {
+ //币龄
+ label: "menu.Lifetime",
+ icon: "i izhexiantu-xianxing",
+ id: "B06-1",
+ children: [
+ {
+ //已花费输出平均寿命
+ path: "/",
+ label: "menu.technology18",
+ fullName: "menu.asol", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "asol",
+ radius: "btc",
+ id: "B06-1-1",
+ introduce: "introduce.asol",
+ navigation: "asol", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //币天销毁量
+ path: "/",
+ label: "menu.technology37",
+ fullName: "menu.CDD", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "CDD",
+ radius: "btc",
+ id: "B06-1-2",
+ introduce: "introduce.CDD",
+ navigation: "CDD", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //币天销毁量年龄分布
+ path: "/",
+ label: "menu.technology20",
+ fullName: "menu.soag", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "soag",
+ radius: "btc",
+ id: "B06-1-3",
+ introduce: "introduce.soag",
+ navigation: "soag", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //已花费输出休眠平均天数
+ path: "/",
+ label: "menu.technology19",
+ fullName: "menu.technology19", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "dormancy",
+ radius: "btc",
+ id: "B06-1-4",
+ introduce: "introduce.dormancy",
+ navigation: "dormancy", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //活跃度
+ path: "/",
+ label: "menu.technology24",
+ fullName: "menu.technology24", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "liveliness",
+ radius: "btc",
+ id: "B06-1-5",
+ introduce: "introduce.Liveliness",
+ navigation: "liveliness", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户"
+ },
+ {
+ //币天销毁量 拆分 币天销毁量(供应调整)
+ path: "/",
+ label: "menu.saCDD",
+ fullName: "menu.saCDD", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "saCDD",
+ radius: "btc",
+ id: "B06-1-6",
+ introduce: "introduce.CDD",
+ navigation: "saCDD", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //已花费输出休眠平均天数 拆分 已花费输出休眠平均天数(供应量调整)
+ path: "/",
+ label: "menu.sadormancy",
+ fullName: "menu.sadormancy", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "sadormancy",
+ radius: "btc",
+ id: "B06-1-7",
+ introduce: "introduce.dormancy",
+ navigation: "sadormancy", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //价值销毁天数(VDD)倍数 价值损毁天数倍数
+ path: "/",
+ label: "menu.vdd",
+ fullName: "menu.vdd", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "vdd",
+ radius: "btc",
+ id: "B06-1-8",
+ introduce: "introduce.vdd",
+ navigation: "VDD", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ ],
+ },
+ {
+ //比率
+ label: "menu.Ratio",
+ icon: "i izhexiantu-xianxing",
+ id: "B07-1",
+ children: [
+ {
+ //已实现盈利交易占比 改成 每日已实现盈利交易占比(redmine)
+ path: "/",
+ label: "menu.technology16",
+ fullName: "menu.technology16", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "profitrate",
+ radius: "btc",
+ id: "B07-1-1",
+ introduce: "introduce.profitrate",
+ navigation: "profitrate", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //已花费输出盈利比
+ path: "/",
+ label: "menu.technology17",
+ fullName: "menu.SOPR", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "sopr",
+ radius: "btc",
+ id: "B07-1-2",
+ introduce: "introduce.sopr",
+ navigation: "sopr", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ ],
+ },
+ {
+ //持有者分布
+ label: "menu.Holder",
+ icon: "i izhexiantu-xianxing",
+ id: "B08-1",
+ children: [
+ // {
+ // //按余额划分
+ // label: "menu.balanceGroup",
+ // icon: "i izhexiantu-xianxing",
+ // id: "B08-1-1",
+ // children: [
+ // {
+ // //持有者地址数分布( 按余额分段) 改为 地址数分布
+ // path: "/",
+ // label: "menu.onchain5",
+ // fullName: "menu.onchain5", //全名
+ // icon: "i igl-folderOpen",
+ // componentReq: "utxos",
+ // radius: "btc",
+ // id: "B08-1-1-1",
+ // introduce: "introduce.balanceDistribution",
+ // navigation: "utxos",
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // type: "L3",
+ // authority: "advance", //付费用户
+ // },
+ // {
+ // //持有者币数量分布(按余额分段) 改为 币数量分布
+ // path: "/",
+ // label: "menu.onchain6",
+ // fullName: "menu.onchain6", //全名
+ // icon: "i igl-folderOpen",
+ // componentReq: "utxos2nd",
+ // radius: "btc",
+ // id: "B08-1-1-2",
+ // introduce: "introduce.balanceDistribution",
+ // navigation: "utxos2nd",
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // type: "L3",
+ // authority: "advance", //付费用户
+ // },
+ // ],
+ // },
+ {
+ //按余额划分 改为 按余额划分地址数分布
+ label: "menu.balanceGroup2",
+ icon: "i izhexiantu-xianxing",
+ id: "B08-1-8",
+ children: [
+ {
+ //按余额划分 地址数分布 余额 <=0.01
+ path: "/",
+ label: "menu.addressBalance",
+ fullName: "menu.addressBalance", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "addressBalance",
+ radius: "btc",
+ id: "B08-1-8-1",
+ introduce: "introduce.balanceDistribution",
+ navigation: "addressBalance",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //按余额划分 地址数分布 余额 >=0.01 & <0.1
+ path: "/",
+ label: "menu.addressBalance1",
+ fullName: "menu.addressBalance1", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "addressBalance1",
+ radius: "btc",
+ id: "B08-1-8-2",
+ introduce: "introduce.balanceDistribution",
+ navigation: "addressBalance1",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //按余额划分 地址数分布 余额 >=0.1 & <1
+ path: "/",
+ label: "menu.addressBalance2",
+ fullName: "menu.addressBalance2", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "addressBalance2",
+ radius: "btc",
+ id: "B08-1-8-3",
+ introduce: "introduce.balanceDistribution",
+ navigation: "addressBalance2",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //按余额划分 地址数分布 余额 >=1 & <10
+ path: "/",
+ label: "menu.addressBalance3",
+ fullName: "menu.addressBalance3", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "addressBalance3",
+ radius: "btc",
+ id: "B08-1-8-4",
+ introduce: "introduce.balanceDistribution",
+ navigation: "addressBalance3",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //按余额划分 地址数分布 余额 >=10 & <100
+ path: "/",
+ label: "menu.addressBalance4",
+ fullName: "menu.addressBalance4", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "addressBalance4",
+ radius: "btc",
+ id: "B08-1-8-5",
+ introduce: "introduce.balanceDistribution",
+ navigation: "addressBalance4",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //按余额划分 地址数分布 余额 >=100 & <1000
+ path: "/",
+ label: "menu.addressBalance5",
+ fullName: "menu.addressBalance5", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "addressBalance5",
+ radius: "btc",
+ id: "B08-1-8-6",
+ introduce: "introduce.balanceDistribution",
+ navigation: "addressBalance5",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //按余额划分 地址数分布 余额 >=1000 & <10000
+ path: "/",
+ label: "menu.addressBalance6",
+ fullName: "menu.addressBalance6", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "addressBalance6",
+ radius: "btc",
+ id: "B08-1-8-7",
+ introduce: "introduce.balanceDistribution",
+ navigation: "addressBalance6",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //按余额划分 地址数分布 余额 >=10000
+ path: "/",
+ label: "menu.addressBalance7",
+ fullName: "menu.addressBalance7", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "addressBalance7",
+ radius: "btc",
+ id: "B08-1-8-8",
+ introduce: "introduce.balanceDistribution",
+ navigation: "addressBalance7",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+
+
+
+
+ ],
+ },
+ {
+ //按余额划分 改为 按余额划分币数量分布
+ label: "menu.currencyGroup",
+ icon: "i izhexiantu-xianxing",
+ id: "B08-1-9",
+ children: [
+ {
+ //按余额划分 币数量分布 余额 <=0.01
+ path: "/",
+ label: "menu.currencyGroup1",
+ fullName: "menu.currencyGroup1", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "currencyGroup1",
+ radius: "btc",
+ id: "B08-1-9-1",
+ introduce: "introduce.balanceDistribution",
+ navigation: "currencyGroup1",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //按余额划分 币数量分布 余额 >=0.01 & <0.1
+ path: "/",
+ label: "menu.currencyGroup2",
+ fullName: "menu.currencyGroup2", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "currencyGroup2",
+ radius: "btc",
+ id: "B08-1-9-2",
+ introduce: "introduce.balanceDistribution",
+ navigation: "currencyGroup2",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //按余额划分 币数量分布 余额 >=0.1 & <1
+ path: "/",
+ label: "menu.currencyGroup3",
+ fullName: "menu.currencyGroup3", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "currencyGroup3",
+ radius: "btc",
+ id: "B08-1-9-3",
+ introduce: "introduce.balanceDistribution",
+ navigation: "currencyGroup3",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //按余额划分 币数量分布 "余额 >=1 & <10
+ path: "/",
+ label: "menu.currencyGroup4",
+ fullName: "menu.currencyGroup4", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "currencyGroup4",
+ radius: "btc",
+ id: "B08-1-9-4",
+ introduce: "introduce.balanceDistribution",
+ navigation: "currencyGroup4",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //按余额划分 币数量分布 余额 >=10 & <100
+ path: "/",
+ label: "menu.currencyGroup5",
+ fullName: "menu.currencyGroup5", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "currencyGroup5",
+ radius: "btc",
+ id: "B08-1-9-5",
+ introduce: "introduce.balanceDistribution",
+ navigation: "currencyGroup5",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //按余额划分 币数量分布 余额 >=100 & <1000
+ path: "/",
+ label: "menu.currencyGroup6",
+ fullName: "menu.currencyGroup6", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "currencyGroup6",
+ radius: "btc",
+ id: "B08-1-9-6",
+ introduce: "introduce.balanceDistribution",
+ navigation: "currencyGroup6",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //按余额划分 币数量分布 余额 >=1000 & <10000
+ path: "/",
+ label: "menu.currencyGroup7",
+ fullName: "menu.currencyGroup7", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "currencyGroup7",
+ radius: "btc",
+ id: "B08-1-9-7",
+ introduce: "introduce.balanceDistribution",
+ navigation: "currencyGroup7",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //按余额划分 币数量分布 余额 >=10000
+ path: "/",
+ label: "menu.currencyGroup8",
+ fullName: "menu.currencyGroup8", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "currencyGroup8",
+ radius: "btc",
+ id: "B08-1-9-8",
+ introduce: "introduce.balanceDistribution",
+ navigation: "currencyGroup8",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+
+
+
+
+
+
+
+ ],
+ },
+ {
+ //按持有时间划分
+ label: "menu.timeGroup",
+ icon: "i izhexiantu-xianxing",
+ id: "B08-1-2",
+ children: [
+ {
+ //持有者地址数分布( 按持有时间分段) 改为 地址数分布
+ path: "/",
+ label: "menu.onchain7",
+ fullName: "menu.onchain7", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "holder",
+ radius: "btc",
+ id: "B08-1-2-1",
+ introduce: "introduce.holder",
+ navigation: "holder",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //持有者币数量分布( 按持有时间分段) 改为 币数量分布
+ path: "/",
+ label: "menu.onchain8",
+ fullName: "menu.onchain8", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "holderBalance",
+ radius: "btc",
+ id: "B08-1-2-2",
+ introduce: "introduce.timeDivision",
+ navigation: "holderBalance",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ ],
+ },
+ {
+ //按买入价格划分
+ label: "menu.priceGroup",
+ icon: "i izhexiantu-xianxing",
+ id: "B08-1-3",
+ children: [
+ {
+ //持有者地址数分布( 按买入价格分段) 改为 地址数分布
+ path: "/",
+ label: "menu.onchain9",
+ fullName: "menu.onchain9", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "getBuyData",
+ radius: "btc",
+ id: "B08-1-3-1",
+ introduce: "introduce.buyingPrice",
+ navigation: "buyData", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //持有者币数量分布( 按买入价格分段) 改为 币数量分布
+ path: "/", //与Buy Data共用
+ label: "menu.onchain10",
+ fullName: "menu.onchain10", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "getBuyAmountData",
+ radius: "btc",
+ id: "B08-1-3-2",
+ introduce: "introduce.buyingPrice",
+ navigation: "buyData", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ ],
+ },
+ {
+ //按买卖价差划分
+ label: "menu.PriceDifference",
+ icon: "i izhexiantu-xianxing",
+ id: "B08-1-4",
+ children: [
+ {
+ //持有者地址数分布(盈亏) 改为 地址数分布
+ path: "/",
+ label: "menu.onchain11",
+ fullName: "menu.onchain11", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "getDiffData",
+ radius: "btc",
+ id: "B08-1-4-1",
+ introduce: "introduce.priceDivision",
+ navigation: "diffData", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //持有者币数量分布(盈亏) 改为 币数量分布
+ path: "/", //与Diff Data共用
+ label: "menu.onchain12",
+ fullName: "menu.onchain12", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "getDiffAmountData",
+ radius: "btc",
+ id: "B08-1-4-2",
+ introduce: "introduce.priceDivision1",
+ navigation: "diffData", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ ],
+ },
+ {
+ //按按盈利划分
+ label: "menu.profitGroup",
+ icon: "i izhexiantu-xianxing",
+ id: "B08-1-5",
+ children: [
+ {
+ //持有者地址数分布(利润率) 改为 地址数分布
+ path: "/",
+ label: "menu.onchain13",
+ fullName: "menu.onchain13", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "getProfitData",
+ radius: "btc",
+ id: "B08-1-5-1",
+ introduce: "introduce.profitDistribution",
+ navigation: "profitData", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //持有者币数量分布(利润率) 改为 币数量分布
+ path: "/", //与Profit Data共用
+ label: "menu.onchain14",
+ fullName: "menu.onchain14", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "getProfitAmountData",
+ radius: "btc",
+ id: "B08-1-5-2",
+ introduce: "introduce.profitDistribution",
+ navigation: "profitData", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ ],
+ },
+ {
+ //地址详细分布
+ label: "menu.addressGroup",
+ icon: "i izhexiantu-xianxing",
+ id: "B08-1-6",
+ children: [
+ {
+ //余额>=0 and <0.01的地址 币龄分布表 改为 余额<0.01
+ // path: "/",
+ label: "menu.Currency2",
+ componentReq: "getDayBalanceData",
+ fullName: "menu.balanceData1", //全名
+ radius: "btc",
+ id: "B08-1-6-1",
+ value: 0,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ parameter: 0,
+ },
+ {
+ // path: "/", 改为 余额>=0.01 & < 0.1
+ label: "menu.Currency3",
+ componentReq: "getDayBalanceData",
+ fullName: "menu.balanceData2", //全名
+ radius: "btc",
+ id: "B08-1-6-2",
+ value: 0.01,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ parameter: 0.01,
+ },
+ {
+ // path: "/", 改为 余额>=0.1 & < 1
+ label: "menu.Currency4",
+ fullName: "menu.balanceData3", //全名
+ componentReq: "getDayBalanceData",
+ radius: "btc",
+ id: "B08-1-6-3",
+ value: 0.1,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ parameter: 0.1,
+ },
+ {
+ // path: "/", 余额>=1 & < 10
+ label: "menu.Currency5",
+ fullName: "menu.balanceData4", //全名
+ componentReq: "getDayBalanceData",
+ radius: "btc",
+ id: "B08-1-6-4",
+ value: 1,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ parameter: 1,
+ },
+ {
+ // path: "/", 余额>=10 & < 100
+ label: "menu.Currency6",
+ fullName: "menu.balanceData5", //全名
+ componentReq: "getDayBalanceData",
+ radius: "btc",
+ id: "B08-1-6-5",
+ value: 10,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ parameter: 10,
+ },
+ {
+ // path: "/",余额>=100 & < 1000
+ label: "menu.Currency7",
+ fullName: "menu.balanceData6", //全名
+ componentReq: "getDayBalanceData",
+ radius: "btc",
+ id: "B08-1-6-6",
+ value: 100,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ parameter: 100,
+ },
+ {
+ // path: "/", 余额>=1000 & < 10000
+ label: "menu.Currency8",
+ fullName: "menu.balanceData7", //全名
+ componentReq: "getDayBalanceData",
+ radius: "btc",
+ id: "B08-1-6-7",
+ value: 1000,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ parameter: 1000,
+ },
+ {
+ // path: "/", 余额>=10000
+ label: "menu.Currency9",
+ fullName: "menu.balanceData8", //全名
+ componentReq: "getDayBalanceData",
+ radius: "btc",
+ id: "B08-1-6-8",
+ value: 10000,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ parameter: 10000,
+ },
+ ],
+ },
+ {
+ //币数量详细分布
+ label: "menu.CoinQuantity",
+ icon: "i izhexiantu-xianxing",
+ id: "B08-1-7",
+ children: [
+ {
+ //余额>=0 and <0.01的币数量 币龄分布表 改为 余额<0.01
+ // path: "/",
+ label: "menu.Currency11",
+ fullName: "menu.balanceData9", //全名
+ componentReq: "getDayBalanceAmountData",
+ radius: "btc",
+ id: "B08-1-7-1",
+ value: 0,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ parameter: 0,
+ },
+ {
+ // path: "/", 余额>=0.01 & < 0.1
+ label: "menu.Currency12",
+ fullName: "menu.balanceData10", //全名
+ componentReq: "getDayBalanceAmountData",
+ radius: "btc",
+ id: "B08-1-7-2",
+ value: 0.01,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ parameter: 0.01,
+ },
+ {
+ // path: "/",余额>=0.1 & < 1
+ label: "menu.Currency13",
+ fullName: "menu.balanceData11", //全名
+ componentReq: "getDayBalanceAmountData",
+ radius: "btc",
+ id: "B08-1-7-3",
+ value: 0.1,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ parameter: 0.1,
+ },
+ {
+ // path: "/", 余额>=1 & < 10
+ label: "menu.Currency14",
+ fullName: "menu.balanceData12", //全名
+ componentReq: "getDayBalanceAmountData",
+ radius: "btc",
+ id: "B08-1-7-4",
+ value: 1,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ parameter: 1,
+ },
+ {
+ // path: "/", 余额>=10 & < 100
+ label: "menu.Currency15",
+ fullName: "menu.balanceData13", //全名
+ componentReq: "getDayBalanceAmountData",
+ radius: "btc",
+ id: "B08-1-7-5",
+ value: 10,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ parameter: 10,
+ },
+ {
+ // path: "/", 余额>=100 & < 1000
+ label: "menu.Currency16",
+ fullName: "menu.balanceData14", //全名
+ componentReq: "getDayBalanceAmountData",
+ radius: "btc",
+ id: "B08-1-7-6",
+ value: 100,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ parameter: 100,
+ },
+ {
+ // path: "/", 余额>=1000 & < 10000
+ label: "menu.Currency17",
+ fullName: "menu.balanceData15", //全名
+ componentReq: "getDayBalanceAmountData",
+ radius: "btc",
+ id: "B08-1-7-7",
+ value: 1000,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ parameter: 1000,
+ },
+ {
+ // path: "/", 余额>=10000
+ label: "menu.Currency18",
+ fullName: "menu.balanceData16", //全名
+ componentReq: "getDayBalanceAmountData",
+ radius: "btc",
+ id: "B08-1-7-8",
+ value: 10000,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ parameter: 10000,
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ },
+ //#region
+ // {
+ // //链上数据
+ // label: "menu.onchain",
+ // icon: "i itubiao2",
+ // nested: "peers", //没有多层嵌套
+ // id: "01",
+ // children: [
+
+ // // {
+ // // //日交易统计
+ // // path: "/",
+ // // label: "menu.onchain19",
+ // // icon: "i igl-folderOpen",
+ // // componentReq: "BTCVolume",
+ // // radius: "btc",
+ // // id: "01-4",
+ // // introduce: "introduce.BTCVolume",
+ // // navigation: "volume", //导航组件名称
+ // // assets: "BTC、ETH",
+ // // interval: "menu.interval3",
+ // // },
+
+ // // { //暂时不渲染 累计币天销毁量(流通供应量)
+ // // path: "/",
+ // // label: "menu.technology22",
+ // // icon: "i igl-folderOpen",
+ // // componentReq: "sumcsupply",
+ // // radius: "btc",
+ // // id: "01-11",
+ // // introduce:
+ // // "Liveliness to vary between a value of 1 for a protocol where every coin is spent at once, and 0 for a protocol where no transaction has taken place. Analysis of metric values between the theoretical extremes of 1 and 0 can generally be considered within the following framework:Liveliness will decrease when a high proportion of coin supply is dormant (i.e. HODLing behaviour) and the global coin day accumulation outpaces coin days destroyed in on-chain activity. Liveliness will trend sideways where coin days destroyed are equal to the coin days accumulated by the circulating supply.Liveliness will increase when long term holders begin spending old coins that have accumulated large volumes of coin days that exceed the rate of global coin day accumulation.",
+ // // navigation: "sumcsupply", //导航组件名称
+ // // assets: "BTC",
+ // // interval: "menu.interval3",
+ // // },
+ // // {//暂时不渲染 累计币天销毁量
+ // // path: "/",
+ // // label: "menu.technology23",
+ // // icon: "i igl-folderOpen",
+ // // componentReq: "sumcdd",
+ // // radius: "btc",
+ // // id: "01-12",
+ // // introduce:
+ // // "Liveliness to vary between a value of 1 for a protocol where every coin is spent at once, and 0 for a protocol where no transaction has taken place. Analysis of metric values between the theoretical extremes of 1 and 0 can generally be considered within the following framework:Liveliness will decrease when a high proportion of coin supply is dormant (i.e. HODLing behaviour) and the global coin day accumulation outpaces coin days destroyed in on-chain activity. Liveliness will trend sideways where coin days destroyed are equal to the coin days accumulated by the circulating supply.Liveliness will increase when long term holders begin spending old coins that have accumulated large volumes of coin days that exceed the rate of global coin day accumulation.",
+ // // navigation: "sumcdd", //导航组件名称
+ // // assets: "BTC",
+ // // interval: "menu.interval3",
+ // // },
+
+ // // {
+ // // //矿工地址余额
+ // // path: "/",
+ // // label: "menu.onchain21",
+ // // icon: "i igl-folderOpen",
+ // // componentReq: "minerBalance",
+ // // radius: "btc",
+ // // id: "01-24",
+ // // introduce: "introduce.minerBalance",
+ // // navigation: "minerBalance", //导航组件名称
+ // // assets: "BTC",
+ // // interval: "menu.interval3",
+ // // },
+ // ],
+ // },
+ //#endregion
+ {
+ //市场技术指标 改为 市场指标
+ label: "menu.market",
+ icon: "i i-zhuzhuangtu",
+ nested: "peers", //判断是否多层嵌套
+ id: "2",
+ children: [
+ {
+ //江卓尔60日累计涨幅
+ path: "/",
+ label: "menu.technology6",
+ fullName: "menu.jzr60", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "jzr60",
+ radius: "btc",
+ id: "2-1",
+ // conditions: "arh", //不同请求方式筛选条件
+ introduce: "introduce.jzr60",
+ navigation: "jzr60",
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //arh999囤币及逃顶指标
+ path: "/",
+ label: "menu.technology7",
+ fullName: "menu.arh999", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "arh99",
+ radius: "btc",
+ id: "2-2",
+ navigation: "arh999",
+ // conditions: "arh", //不同请求方式筛选条件
+ introduce: "introduce.arh999",
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ // {
+ // //天针
+ // path: "/",
+ // label: "menu.technology8",
+ // icon: "i igl-folderOpen",
+ // componentReq: "天针",
+ // radius: "btc",
+ // id: "2-3",
+ // introduce: "introduce.DaysNeedle",
+ // navigation: "DaysNeedle", //导航组件名称
+ // assets: "无",
+ // interval: "menu.interval3",
+ // },
+ {
+ //2年移动平均价格乘数
+ path: "/",
+ label: "menu.technology11",
+ fullName: "menu.ma730", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "ma730",
+ radius: "btc",
+ id: "2-4",
+ introduce: "introduce.ma730",
+ navigation: "ma730", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //币价当前市值排名
+ path: "/",
+ label: "menu.onchain17",
+ fullName: "menu.coinmarketall", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "币价当前市值排名",
+ radius: "btc",
+ id: "2-5",
+ introduce: "introduce.coinmarketall",
+ navigation: "coinmarketall", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+
+ // {
+ // //日K线 删除不显示
+ // path: "/",
+ // label: "menu.technology5",
+ // icon: "i igl-folderOpen",
+ // componentReq: "OHLCPrice",
+ // radius: "BTC",
+ // id: "2-7",
+ // introduce: "introduce.OHLCPrice",
+ // navigation: "ETH",
+ // assets: "BTC, ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered", //注册用户
+ // },
+ // {
+ // //登录遮罩
+ // path: "/",
+ // label: "遮罩",
+ // icon: "i igl-folderOpen",
+ // componentReq: "mask",
+ // radius: "BTC",
+ // id: "2-8",
+ // introduce: "",
+ // navigation: "loginMask",
+ // assets: "BTC, ETH",
+ // interval: "menu.interval3",
+ // },
+ {
+ //PI周期顶指标
+ path: "/",
+ label: "menu.PiCycleTopIndicator",
+ fullName: "menu.PiCycleTopIndicator", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "piCycleTop",
+ radius: "btc",
+ id: "2-9",
+ introduce: "introduce.PiCycleTopIndicator",
+ navigation: "piCycleTop", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //稳定币供应比
+ path: "/",
+ label: "menu.ssr",
+ fullName: "menu.ssr", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "ssr",
+ radius: "btc",
+ id: "2-10",
+ introduce: "introduce.ssr",
+ navigation: "ssr", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ {
+ //稳定币供应比振荡器
+ path: "/",
+ label: "menu.ssro",
+ fullName: "menu.ssro", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "ssro",
+ radius: "btc",
+ id: "2-11",
+ introduce: "introduce.ssro",
+ navigation: "ssro", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ {
+ //库存/新发行比
+ path: "/",
+ label: "menu.stfRatio",
+ fullName: "menu.stfRatio", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "stfRatio",
+ radius: "btc",
+ id: "2-12",
+ introduce: "introduce.stfRatio",
+ navigation: "stfRatio", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest",
+ },
+ {
+ //库存/新发行偏差
+ path: "/",
+ label: "menu.stfDeflection",
+ fullName: "menu.stfDeflection", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "stfDeflection",
+ radius: "btc",
+ id: "2-13",
+ introduce: "introduce.stfDeflection",
+ navigation: "stfDeflection", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ {
+ //黄金比例乘数
+ path: "/",
+ label: "menu.goldenRatioMult",
+ fullName: "menu.goldenRatioMult", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "goldenRatioMult",
+ radius: "btc",
+ id: "2-14",
+ introduce: "introduce.goldenRatioMult",
+ navigation: "goldenRatioMult", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ ],
+ },
+
+ {
+ //交易所数据
+
+ label: "menu.exchange",
+ icon: "i itubiao2",
+ nested: "peers", //判断是否多层嵌套
+ id: "4",
+ children: [
+ //#region
+ // {
+ // //合约K线
+ // path: "/Bian",
+ // label: "menu.exchange1",
+ // icon: "i igl-folderOpen",
+ // // componentReq: "list",
+ // radius: "bian",
+ // id: "4-1",
+ // navigation: "bianController",
+ // introduce: "introduce.bian",
+ // assets:
+ // "'BTCUSDT,ETHUSDT,BCHUSDT,XRPUSDT,EOSUSDT,LTCUSDT,TRXUSDT,ETCUSDT,LINKUSDT,XLMUSDT,ADAUSDT,XMRUSDT,DASHUSDT,ZECUSDT,XTZUSDT,BNBUSDT,ATOMUSDT,ONTUSDT,IOTAUSDT,BATUSDT,VETUSDT,NEOUSDT,QTUMUSDT,IOSTUSDT,THETAUSDT,ALGOUSDT,ZILUSDT,KNCUSDT,ZRXUSDT,COMPUSDT,OMGUSDT,DOGEUSDT,SXPUSDT,KAVAUSDT,BANDUSDT,RLCUSDT,WAVESUSDT,MKRUSDT,SNXUSDT,DOTUSDT,DEFIUSDT,YFIUSDT,BALUSDT,CRVUSDT,TRBUSDT,RUNEUSDT,SUSHIUSDT,SRMUSDT,EGLDUSDT,SOLUSDT,ICXUSDT,STORJUSDT,BLZUSDT,UNIUSDT,AVAXUSDT,FTMUSDT,HNTUSDT,ENJUSDT,FLMUSDT,TOMOUSDT,RENUSDT,KSMUSDT,NEARUSDT,AAVEUSDT,FILUSDT,RSRUSDT,LRCUSDT,MATICUSDT,OCEANUSDT,CVCUSDT,BELUSDT,CTKUSDT,AXSUSDT,ALPHAUSDT,ZENUSDT,SKLUSDT,GRTUSDT,1INCHUSDT,CHZUSDT,SANDUSDT,ANKRUSDT,BTSUSDT,LITUSDT,UNFIUSDT,REEFUSDT,RVNUSDT,SFPUSDT,XEMUSDT,BTCSTUSDT,COTIUSDT,CHRUSDT,MANAUSDT,ALICEUSDT,HBARUSDT'",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // //交易量
+ // path: "/", //与Get Top List共用
+ // label: "menu.exchange2",
+ // icon: "i igl-folderOpen",
+ // componentReq: "priceValue",
+ // radius: "btc",
+ // id: "4-2",
+ // introduce: "introduce.priceValue",
+ // navigation: "priceValue", //导航组件名称
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // },
+ //#endregion
+ {
+ //资金费率
+ path: "/",
+ label: "menu.technology13",
+ fullName: "menu.technology13", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "fundingRate",
+ radius: "btc",
+ id: "4-3",
+ introduce: "introduce.fundingRate",
+ navigation: "fundingRate", //导航组件名称
+ assets: "BTCUSDT、ETHUSDT",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //注册用户
+ },
+ {
+ //未平仓合约数
+ path: "/",
+ label: "menu.technology14",
+ fullName: "menu.technology14", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "openInterest",
+ radius: "btc",
+ id: "4-4",
+ introduce: "introduce.openInterest",
+ navigation: "openInterest", //导航组件名称
+ assets: "BTCUSDT、ETHUSDT",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+
+ {
+ //合约主动买入量
+ path: "/",
+ label: "menu.technology15",
+ fullName: "menu.technology15", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "takerlongshortRatio",
+ radius: "btc",
+ id: "4-5",
+ introduce: "introduce.takerlongshortRatio",
+ navigation: "takerlongshortRatio", //导航组件名称
+ assets: "BTCUSDT、ETHUSDT",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //时区购买力
+ path: "/",
+ label: "menu.tzbp",
+ fullName: "menu.tzbp", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "tzbp",
+ radius: "btc",
+ id: "4-6",
+ introduce: "introduce.tzbp",
+ navigation: "tzbp", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //买入大单挂单
+ path: "/",
+ label: "menu.bobp",
+ fullName: "menu.bobp", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "bobp",
+ radius: "btc",
+ id: "4-7",
+ introduce: "introduce.bobp",
+ navigation: "bobp", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //卖出大单挂单
+ path: "/",
+ label: "menu.bosp",
+ fullName: "menu.bosp", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "bosp",
+ radius: "btc",
+ id: "4-8",
+ introduce: "introduce.bobp", //买入卖出都一样
+ navigation: "bosp", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ // {
+ // //成交量分布图
+ // path: "/",
+ // label: "menu.volumeProfile",
+ // fullName: "menu.volumeProfile", //全名
+ // icon: "i igl-folderOpen",
+ // componentReq: "volumeProfile",
+ // radius: "btc",
+ // id: "4-9",
+ // introduce: "introduce.volumeProfile",
+ // navigation: "volumeProfile", //导航组件名称
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // type: "L3",
+ // authority: "advance",
+ // },
+ {
+ //交易所余额
+ path: "/",
+ label: "menu.exchange10",
+ fullName: "menu.exchange10", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "exchange",
+ radius: "btc",
+ id: "4-10",
+ introduce: "introduce.exchange1",
+ navigation: "exchange", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ {
+ //合约主动买入量 拆分出来 合约主动买入量(买卖比率)
+ path: "/",
+ label: "menu.sellRatio",
+ fullName: "menu.sellRatio", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "sellRatio",
+ radius: "btc",
+ id: "4-11",
+ introduce: "introduce.takerlongshortRatio",
+ navigation: "sellRatio", //导航组件名称
+ assets: "BTCUSDT、ETHUSDT",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ ],
+ },
+ //#region
+ // {
+ // //持有者分布
+ // label: "menu.holders",
+ // icon: "i izhexiantu-xianxing",
+ // nested: "peers", //判断是否多层嵌套
+ // id: "5",
+ // children: [
+
+ // // {
+ // // //持有者地址数分布 这个就是多层的
+ // // label: "menu.holderAddress",
+ // // icon: "i izhexiantu-xianxing",
+ // // id: "B08-1-6",
+ // // children: [
+ // // {
+ // // //余额>=0 and <0.01的地址 币龄分布表
+ // // // path: "/",
+ // // label: "menu.Currency2",
+ // // componentReq: "getDayBalanceData",
+ // // radius: "btc",
+ // // id: "01-35-1",
+ // // value: 0,
+ // // introduce: "introduce.getDayBalanceData",
+ // // navigation: "balanceData",
+ // // assets: "BTC",
+ // // interval: "menu.interval3",
+ // // type: "L3",
+ // // authority: "advance", //付费用户
+ // // },
+
+ // // ],
+ // // },
+ // {
+ // //持有者地址数详细分布(按持有时间分段) 这个就是多层的
+ // label: "menu.Currency1",
+ // icon: "i izhexiantu-xianxing",
+ // id: "01-35",
+ // children: [
+
+ // ],
+ // },
+ // {
+ // //持有者币数量详细分布(按持有时间分段)
+
+ // label: "menu.Currency10",
+ // icon: "i izhexiantu-xianxing",
+ // id: "01-36",
+ // children: [
+
+ // ],
+ // },
+ // ],
+ // },
+
+ // {
+ // label: "待分配",
+ // icon: "i itubiao2",
+ // nested: "peers", //判断是否多层嵌套
+ // id: "100",
+ // children: [
+ // // {
+ // // //新的MVRV
+ // // path: "/",
+ // // label: "新的MVRV",
+ // // icon: "i igl-folderOpen",
+ // // componentReq: "ethbigtxcount",
+ // // radius: "btc",
+ // // id: "23-100",
+ // // introduce: "introduce.ethbigtxcount",
+ // // navigation: "mvrv",
+ // // assets: "BTC、ETH",
+ // // interval: "menu.interval3",
+ // // },
+
+ // // {//区块实时交易量 不显示
+ // // path: "/",
+ // // label: "menu.onchain3",
+ // // icon: "i igl-folderOpen",
+ // // componentReq: "blockAmount",
+ // // radius: "btc",
+ // // id: "23-13",
+ // // introduce: "introduce.blockAmount",
+ // // navigation: "blockAmount",
+ // // assets: "BTC",
+ // // interval: "menu.interval3",
+ // // },
+ // // {
+ // // //日交易详情
+ // // path: "/",
+ // // label: "menu.onchain4",
+ // // icon: "i igl-folderOpen",
+ // // componentReq: "dailyBuySell",
+ // // radius: "btc",
+ // // id: "23-14",
+ // // introduce: "introduce.dailyBuySell",
+ // // navigation: "dailyBuySell",
+ // // assets: "BTC",
+ // // interval: "menu.interval3",
+ // // },
+
+ // // {//暂时注释 巨鲸 币数量变动 /改为 巨鲸交易监控
+ // // path: "/", //与Get Top List共用
+ // // label: "menu.onchain16",
+ // // icon: "i igl-folderOpen",
+ // // componentReq: "getTopListWatch",
+ // // radius: "btc",
+ // // id: "23-26",
+ // // introduce: "introduce.getTopListWatch",
+ // // navigation: "topList", //导航组件名称
+ // // assets: "BTC",
+ // // interval: "menu.interval3",
+ // // },
+
+ // // {//地址对应标记持有者名称关系列表
+ // // path: "/",
+ // // label: "menu.onchain18",
+ // // icon: "i igl-folderOpen",
+ // // componentReq: "btcTags",
+ // // radius: "btc",
+ // // id: "23-32",
+ // // introduce: "introduce.btcTags",
+ // // navigation: "btctags", //导航组件名称
+ // // assets: "BTC、ETH",
+ // // interval: "menu.interval3",
+ // // },
+ // ],
+ // },
+ // {
+ // //技术指标
+ // label: "menu.technology",
+ // icon: "i izhexiantu-xianxing",
+ // nested: "peers", //判断是否多层嵌套 就是这些 多给他一个键 就是对应多语言的键 每个项都要有对把 对 先写两个试试
+ // id: "1",
+ // children: [
+ // // {
+ // // //MVRV
+ // // path: "/",
+ // // label: "menu.technology1",
+ // // icon: "i igl-folderOpen",
+ // // req: "market",
+ // // radius: `mvrv`,
+ // // coin: "BTC",
+ // // id: "23-1",
+ // // introduce: "introduce.MVRV",
+ // // assets: "BTC、ETH、LTC",
+ // // interval: "menu.interval3",
+ // // currencyNavigation: "USDT",
+ // // },
+
+ // // {//NVTRatio
+ // // path: "/",
+ // // label: "menu.technology3",
+ // // icon: "i igl-folderOpen",
+ // // req: "market",
+ // // radius: "NVTRatio",
+ // // coin: "BTC",
+ // // id: "1-3",
+ // // introduce: "introduce.NVTRatio",
+ // // assets: "BTC、ETH、LTC",
+ // // interval: "menu.interval3",
+ // // },
+ // // {//NVTSignal
+ // // path: "/",
+ // // label: "menu.technology4",
+ // // icon: "i igl-folderOpen",
+ // // req: "market",
+ // // radius: "NVTSignal",
+ // // coin: "BTC",
+ // // id: "1-4",
+ // // introduce: "introduce.NVTSignal",
+ // // assets: "BTC、ETH、LTC",
+ // // interval: "menu.interval3",
+ // // },
+
+ // // {
+ // // //ETF持有比特币
+ // // path: "/",
+ // // label: "menu.technology9",
+ // // icon: "i igl-folderOpen",
+ // // req: "ETF",
+ // // radius: "Holding",
+ // // id: "1-9",
+ // // introduce: "introduce.Holding",
+ // // assets: "无",
+ // // interval: "menu.interval3",
+ // // },
+ // // {
+ // // //ETF比特币变动
+ // // path: "/",
+ // // label: "menu.technology10",
+ // // icon: "i igl-folderOpen",
+ // // req: "ETF",
+ // // radius: "Flows",
+ // // id: "1-10",
+ // // introduce: "introduce.Flows",
+ // // assets: "无",
+ // // interval: "menu.interval3",
+ // // },
+
+ // // {
+ // // //已实现流通市值
+ // // path: "/",
+ // // label: "menu.technology12",
+ // // icon: "i igl-folderOpen",
+ // // componentReq: "capReal",
+ // // radius: "btc",
+ // // id: "1-12",
+ // // introduce: "introduce.capReal",
+ // // navigation: "capReal", //导航组件名称
+ // // assets: "BTC",
+ // // interval: "menu.interval3",
+ // // },
+
+ // ],
+ // },
+
+ // {//地址/活动地址/新增地址及下面的页面
+ // label: "menu.address",
+ // icon: "i iqianbao",
+ // id: "4",
+ // children: [
+ // {
+ // path: "/",
+ // label: "menu.address1",
+ // icon: "i 24igl-folderOpen",
+ // type: "L1",
+ // id: "4-1",
+ // children: [
+ // {
+ // // path: "/1",
+ // label: `menu.address2`,
+ // req: "activeAddress",
+ // radius: "btc",
+ // id: "4-1-1",
+ // introduce: "introduce.activeAddress",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // // path: "/2",
+ // label: "menu.address3",
+ // req: "sendingAddress",
+ // radius: "btc",
+ // id: "4-1-2",
+ // introduce: "introduce.sendingAddress",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // // path: "/3",
+ // label: "menu.address4",
+ // req: "receivingAddress",
+ // radius: "btc",
+ // id: "4-1-3",
+ // introduce: "introduce.receivingAddress",
+ // interval: "menu.interval3",
+ // },
+ // ],
+ // },
+ // {
+ // path: "/",
+ // label: "menu.address5",
+ // icon: "i 24igl-folderOpen",
+ // type: "L1",
+ // id: "4-2",
+ // children: [
+ // {
+ // path: "/1",
+ // label: "menu.address6",
+ // req: "newAddress",
+ // radius: "btc",
+ // id: "4-2-1",
+ // introduce: "introduce.newAddress",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // path: "/2",
+ // label: "menu.address7",
+ // req: "totalAddress",
+ // radius: "btc",
+ // id: "4-2-2",
+ // introduce: "introduce.totalAddress",
+ // interval: "menu.interval3",
+ // },
+ // ],
+ // },
+ // ],
+ // },
+
+ // {
+ // ///交易汇总
+ // label: "menu.transactions",
+ // icon: "i ijiantou_zuoyouqiehuan",
+ // id: "20",
+ // children: [
+ // {
+ // //交易规模
+ // // path: "/",
+ // label: "menu.transactions1",
+ // icon: "i iyonghuguanli_huaban",
+ // type: "L1",
+ // id: "20-1",
+ // children: [
+ // {
+ // //每天交易规模
+ // // path: "/",
+ // label: "menu.transactions2",
+ // req: "transsizetotal",
+ // radius: "btc",
+ // id: "20-1-1",
+ // introduce: "introduce.transsizetotal",
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // //每秒交易规模
+ // // path: "/",
+ // label: "menu.transactions3",
+ // req: "transsizemean",
+ // radius: "btc",
+ // id: "20-1-2",
+ // introduce: "introduce.transsizemean",
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // },
+ // ],
+ // },
+ // {
+ // //交易量
+ // // path: "/",
+ // label: "menu.transactions4",
+ // icon: "i iyonghuguanli_huaban",
+ // type: "L1",
+ // id: "20-2",
+ // children: [
+ // {
+ // //成交次数
+ // // path: "/",
+ // label: "menu.transactions5",
+ // req: "transactions",
+ // radius: "btc",
+ // id: "20-2-1",
+ // introduce: "introduce.transactions",
+ // assets: "BTC、ETH、LTC",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // //日成交率
+ // // path: "/",
+ // label: "menu.transactions6",
+ // req: "transrate",
+ // radius: "btc",
+ // id: "20-2-2",
+ // introduce: "introduce.transrate",
+ // assets: "BTC、ETH、LTC",
+ // interval: "menu.interval3",
+ // },
+ // ],
+ // },
+ // ],
+ // },
+
+ // {//分配数据
+ // label: "menu.Distribution",
+ // icon: "i izhexiantu_o",
+ // nested: "peers", //判断是否多层嵌套
+ // id: "33",
+ // children: [
+ // {
+ // path: "/",
+ // label: "menu.Distribution1",
+ // icon: "i iwenjianjia",
+ // type: "L2",
+ // req: "distribution",
+ // radius: "tenths",
+ // coin: "BTC",
+ // id: "33-1",
+ // assets: "BTC、ETH",
+ // introduce: "introduce.distribution",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // path: "/",
+ // label: "menu.Distribution2",
+ // icon: "i iwenjianjia",
+ // type: "L2",
+ // req: "distribution",
+ // radius: "hundredth",
+ // coin: "BTC",
+ // id: "33-2",
+ // assets: "BTC、ETH",
+ // introduce: "introduce.distribution1",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // path: "/",
+ // label: "menu.Distribution3",
+ // icon: "i iwenjianjia",
+ // type: "L2",
+ // req: "distribution",
+ // radius: "units",
+ // coin: "BTC",
+ // id: "33-3",
+ // assets: "BTC、ETH",
+ // introduce: "introduce.distribution2",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // path: "/",
+ // label: "menu.Distribution4",
+ // icon: "i iwenjianjia",
+ // type: "L2",
+ // req: "distribution",
+ // radius: "tens",
+ // coin: "BTC",
+ // id: "33-4",
+ // assets: "BTC、ETH",
+ // introduce: "introduce.distribution3",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // path: "/",
+ // label: "menu.Distribution5",
+ // icon: "i iwenjianjia",
+ // type: "L2",
+ // req: "distribution",
+ // radius: "hundreds",
+ // coin: "BTC",
+ // id: "33-5",
+ // assets: "BTC、ETH",
+ // introduce: "introduce.distribution4",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // path: "/",
+ // label: "menu.Distribution6",
+ // icon: "i iwenjianjia",
+ // type: "L2",
+ // req: "distribution",
+ // radius: "kilo",
+ // coin: "BTC",
+ // id: "33-6",
+ // assets: "BTC、ETH",
+ // introduce: "introduce.distribution5",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // path: "/",
+ // label: "menu.Distribution7",
+ // icon: "i iwenjianjia",
+ // type: "L2",
+ // req: "distribution",
+ // radius: "myriad",
+ // coin: "BTC",
+ // id: "33-7",
+ // assets: "BTC、ETH",
+ // introduce: "introduce.distribution6",
+ // interval: "menu.interval3",
+ // },
+ // ],
+ // },
+
+ // {
+ // //主要交易所衍生数据
+ // label: "menu.derivatives",
+ // icon: "i i-zhuzhuangtu",
+ // id: "22--1",
+ // children: [
+ // {
+ // //具体数据
+ // path: "/",
+ // label: "menu.derivatives1",
+ // icon: "i iyonghuguanli_huaban",
+ // type: "L2",
+ // id: "22-1",
+ // children: [
+ // {
+ // //交易所日交易量
+ // path: "/",
+ // label: "menu.derivatives2",
+ // req: "derivatives",
+ // radius: "dailyVolume",
+ // coin: "BTC",
+ // id: "22-1-1",
+ // assets: "BTC、ETH",
+ // introduce: "introduce.dailyVolume",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // //交易所笔数变动
+ // path: "/",
+ // label: "menu.derivatives3",
+ // req: "derivatives",
+ // radius: "openInterest",
+ // coin: "BTC",
+ // id: "22-1-2",
+ // assets: "BTC、ETH",
+ // introduce: "introduce.openInterest",
+ // interval: "menu.interval3",
+ // },
+ // ],
+ // },
+ // ],
+ // },
+
+ // {//持有者币龄地址数/币数量分布图
+ // label: "menu.Currency",
+ // icon: "i ijiantou_zuoyouqiehuan",
+ // id: "28",
+ // children: [
+ // {
+ // // path: "/",
+ // label: "menu.Currency1",
+ // icon: "i iyonghuguanli_huaban",
+ // type: "L1",
+ // id: "25-1",
+ // children: [
+ // {
+ // // path: "/",
+ // label: "menu.Currency2",
+ // componentReq: "getDayBalanceData",
+ // radius: "btc",
+ // id: "25-1-1",
+ // value: 0,
+ // introduce: "introduce.getDayBalanceData",
+ // navigation: "balanceData",
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // // path: "/",
+ // label: "menu.Currency3",
+ // componentReq: "getDayBalanceData",
+ // radius: "btc",
+ // id: "25-1-2",
+ // value: 0.01,
+ // introduce: "introduce.getDayBalanceData",
+ // navigation: "balanceData",
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // // path: "/",
+ // label: "menu.Currency4",
+ // componentReq: "getDayBalanceData",
+ // radius: "btc",
+ // id: "25-1-3",
+ // value: 0.1,
+ // introduce: "introduce.getDayBalanceData",
+ // navigation: "balanceData",
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // // path: "/",
+ // label: "menu.Currency5",
+ // componentReq: "getDayBalanceData",
+ // radius: "btc",
+ // id: "25-1-4",
+ // value: 1,
+ // introduce: "introduce.getDayBalanceData",
+ // navigation: "balanceData",
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // // path: "/",
+ // label: "menu.Currency6",
+ // componentReq: "getDayBalanceData",
+ // radius: "btc",
+ // id: "25-1-5",
+ // value: 10,
+ // introduce: "introduce.getDayBalanceData",
+ // navigation: "balanceData",
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // // path: "/",
+ // label: "menu.Currency7",
+ // componentReq: "getDayBalanceData",
+ // radius: "btc",
+ // id: "25-1-6",
+ // value: 100,
+ // introduce: "introduce.getDayBalanceData",
+ // navigation: "balanceData",
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // // path: "/",
+ // label: "menu.Currency8",
+ // componentReq: "getDayBalanceData",
+ // radius: "btc",
+ // id: "25-1-7",
+ // value: 1000,
+ // introduce: "introduce.getDayBalanceData",
+ // navigation: "balanceData",
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // // path: "/",
+ // label: "menu.Currency9",
+ // componentReq: "getDayBalanceData",
+ // radius: "btc",
+ // id: "25-1-8",
+ // value: 10000,
+ // introduce: "introduce.getDayBalanceData",
+ // navigation: "balanceData",
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // },
+ // ],
+ // },
+ // {
+ // // path: "/",
+ // label: "menu.Currency10",
+ // icon: "i iyonghuguanli_huaban",
+ // type: "L1",
+ // id: "25-2",
+ // children: [
+ // {
+ // // path: "/",
+ // label: "menu.Currency11",
+ // componentReq: "getDayBalanceAmountData",
+ // radius: "btc",
+ // id: "25-2-1",
+ // value: 0,
+ // introduce: "introduce.getDayBalanceAmountData",
+ // navigation: "balanceData",
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // // path: "/",
+ // label: "menu.Currency12",
+ // componentReq: "getDayBalanceAmountData",
+ // radius: "btc",
+ // id: "25-2-2",
+ // value: 0.01,
+ // introduce: "introduce.getDayBalanceAmountData",
+ // navigation: "balanceData",
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // // path: "/",
+ // label: "menu.Currency13",
+ // componentReq: "getDayBalanceAmountData",
+ // radius: "btc",
+ // id: "25-2-3",
+ // value: 0.1,
+ // introduce: "introduce.getDayBalanceAmountData",
+ // navigation: "balanceData",
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // // path: "/",
+ // label: "menu.Currency14",
+ // componentReq: "getDayBalanceAmountData",
+ // radius: "btc",
+ // id: "25-2-4",
+ // value: 1,
+ // introduce: "introduce.getDayBalanceAmountData",
+ // navigation: "balanceData",
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // // path: "/",
+ // label: "menu.Currency15",
+ // componentReq: "getDayBalanceAmountData",
+ // radius: "btc",
+ // id: "25-2-5",
+ // value: 10,
+ // introduce: "introduce.getDayBalanceAmountData",
+ // navigation: "balanceData",
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // // path: "/",
+ // label: "menu.Currency16",
+ // componentReq: "getDayBalanceAmountData",
+ // radius: "btc",
+ // id: "25-2-6",
+ // value: 100,
+ // introduce: "introduce.getDayBalanceAmountData",
+ // navigation: "balanceData",
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // // path: "/",
+ // label: "menu.Currency17",
+ // componentReq: "getDayBalanceAmountData",
+ // radius: "btc",
+ // id: "25-2-7",
+ // value: 1000,
+ // introduce: "introduce.getDayBalanceAmountData",
+ // navigation: "balanceData",
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // },
+ // {
+ // // path: "/",
+ // label: "menu.Currency18",
+ // componentReq: "getDayBalanceAmountData",
+ // radius: "btc",
+ // id: "25-2-8",
+ // value: 10000,
+ // introduce: "introduce.getDayBalanceAmountData",
+ // navigation: "balanceData",
+ // assets: "BTC",
+ // interval: "menu.interval3",
+ // },
+ // ],
+ // },
+ // ],
+ // },
+ //#endregion
+]
+export const ethMenu =[//组件跳转的权限
+
+
+]
+
+export const stableMenu =[//组件跳转的权限
+
+
+]
\ No newline at end of file
diff --git a/yq/src/util/ndqaMethod.js b/yq/src/util/ndqaMethod.js
new file mode 100644
index 0000000..ef77691
--- /dev/null
+++ b/yq/src/util/ndqaMethod.js
@@ -0,0 +1,65 @@
+//获取最近三个月时间
+export function getTimeMonth() {
+ // var end = new Date();
+ // var year = end.getFullYear();
+ // var month = end.getMonth() + 1; //0-11表示1-12月
+ // var day = end.getDate();
+ // var dateObj = {};
+ // dateObj.end = year + "-" + month + "-" + day;
+ // var endMonthDay = new Date(year, month, 0).getDate(); //当前月的总天数
+ // if (month - 2 <= 0) {
+ // //如果是1月,年数往前推一年
+ // dateObj.start = year - 1 + "-" + 12 + "-" + day;
+ // } else {
+ // var startMonthDay = new Date(year, parseInt(month) - 1, 0).getDate();
+ // if (startMonthDay < day) {
+ // //1个月前所在月的总天数小于现在的天日期
+ // if (day < endMonthDay) {
+ // //当前天日期小于当前月总天数
+ // dateObj.start =
+ // year +
+ // "-" +
+ // (month - 1) +
+ // "-" +
+ // (startMonthDay - (endMonthDay - day));
+ // } else {
+ // dateObj.start = year + "-" + (month - 1) + "-" + startMonthDay;
+ // }
+ // } else {
+ // dateObj.start = year + "-" + (month - 1) + "-" + day;
+ // }
+ // }
+ // // console.log(JSON.stringify(dateObj));
+ // return dateObj
+
+ var end = new Date();
+ var year = end.getFullYear();
+ var month = end.getMonth() + 1;//0-11表示1-12月
+ var day = end.getDate();
+ var dateObj = {};
+ dateObj.end = year + '-' + month + '-' + day;
+ var endMonthDay = new Date(year, month, 0).getDate(); //当前月的总天数
+ if (month - 3 <= 0) { //如果是1、2、3月,年数往前推一年
+ var start3MonthDay = new Date((year - 1), (12 - (3 - parseInt(month))), 0).getDate(); //3个月前所在月的总天数
+ if (start3MonthDay < day) { //3个月前所在月的总天数小于现在的天日期
+ dateObj.start = (year - 1) + '-' + (12 - (3 - month)) + '-' + start3MonthDay;
+ } else {
+ dateObj.start = (year - 1) + '-' + (12 - (3 - month)) + '-' + day;
+ }
+ } else {
+ var start3MonthDay = new Date(year, (parseInt(month) - 3), 0).getDate(); //3个月前所在月的总天数
+ if (start3MonthDay < day) { //3个月前所在月的总天数小于现在的天日期
+ if (day < endMonthDay) { //当前天日期小于当前月总天数,2月份比较特殊的月份
+ dateObj.start = year + '-' + (month - 3) + '-' + (start3MonthDay - (endMonthDay - day));
+ } else {
+ dateObj.start = year + '-' + (month - 3) + '-' + start3MonthDay;
+ }
+ } else {
+ dateObj.start = year + '-' + (month - 3) + '-' + day;
+ }
+ }
+ // console.log(JSON.stringify(dateObj))
+
+ return dateObj
+
+}
\ No newline at end of file
diff --git a/yq/src/util/processingData.js b/yq/src/util/processingData.js
new file mode 100644
index 0000000..faaa40d
--- /dev/null
+++ b/yq/src/util/processingData.js
@@ -0,0 +1,1555 @@
+
+
+
+
+// 时间月份差
+export function getMonth(startDate, endDate) {
+ startDate = startDate.split("-");
+ // 得到月数
+ startDate = parseInt(startDate[0]) * 12 + parseInt(startDate[1]);
+ // 拆分年月日
+ endDate = endDate.split("-");
+ // 得到月数
+ endDate = parseInt(endDate[0]) * 12 + parseInt(endDate[1]);
+ let times = Math.abs(startDate - endDate);
+ return times;
+}
+//处理NVTAFF数据
+export function handeNVTFFData(data) {
+ let times = data;
+ let itemTime = [];
+ let itemData = [];
+ // x 坐标赋值
+ times.forEach((item) => {
+ var now = item.time.split("T");
+ itemTime.push(now[0]);
+ itemData.push(item.NVTAdjFF90);
+ });
+ return itemData;
+}
+
+//处理NVTA数据
+export function handeNVTAData(data) {
+ let times = data;
+ let itemTime = [];
+ let itemData = [];
+ // x 坐标赋值
+ times.forEach((item) => {
+ var now = item.time.split("T");
+ itemTime.push(now[0]);
+ itemData.push(item.NVTAdj90);
+ });
+ return itemData;
+}
+
+//处理MVRV数据
+export function handelData(data) {
+ let times = data;
+
+ let itemTime = [];
+ let itemData = [];
+ // x 坐标赋值
+ times.forEach((item) => {
+ var now = item.time.split("T");
+ itemTime.push(now[0]);
+ itemData.push(Number(item.value).toFixed(2));
+ });
+
+ return itemData;
+}
+
+//处理capReal数据
+export function handelCapReal(data) {
+ let times = data;
+
+ // let itemTime = [];
+ let itemData = [];
+ // x 坐标赋值
+ times.forEach((item) => {
+ // var now = item.time.split("T");
+ // itemTime.push(now[0]);
+ itemData.push(Number(item.capReal.toFixed(2)));
+ });
+
+ return itemData;
+}
+
+//取时间天数
+export function getDiffDay(date_1, date_2) {
+ let totalDays, diffDate;
+ let myDate_1 = Date.parse(date_1);
+ let myDate_2 = Date.parse(date_2);
+ // 将两个日期都转换为毫秒格式,然后做差
+ diffDate = Math.abs(myDate_1 - myDate_2); // 取相差毫秒数的绝对值
+ totalDays = Math.floor(diffDate / (1000 * 3600 * 24)); // 向下取整
+ return totalDays; // 相差的天数
+}
+
+//分组求和年月的数据
+export function setGrouping(data) {
+ //分组求和
+ function groupBy(data) {
+ //月
+ let arrTime = [
+ ...new Set(
+ data.map((_) => {
+ //用反射把时间格式统一为yyyy-MM 并分组
+ Reflect.set(_, "time", formatDate(_.time));
+ return _.time;
+ })
+ ),
+ ].map((_) => {
+ return { time: _, month: {}, sumMonth: {} };
+ });
+
+ //双重循环计算月合计
+
+ arrTime.forEach((_) => {
+ var sumMonth = 0;
+ data.forEach((item) => {
+ if (_.time == item.time) {
+ sumMonth += item.CapMVRVCur;
+ _.sumMonth = sumMonth;
+ _.month = _.time.slice(-2);
+ }
+ });
+ });
+
+ //年
+
+ let arr = [
+ ...new Set(
+ arrTime.map((_) => {
+ //根据年分组
+ return _.time.slice(0, 4);
+ })
+ ),
+ ].map((_) => {
+ return { year: _, sumYear: {}, months: [] };
+ });
+ //双重循环计算年合计
+ arr.forEach((_) => {
+ var sumYear = 0;
+ arrTime.forEach((item) => {
+ if (_.year == item.time.slice(0, 4)) {
+ sumYear += item.sumMonth;
+ _.sumYear = sumYear;
+ _.year = _.year;
+ _.months.push(item);
+ }
+ });
+ });
+
+ return arr;
+ }
+ //格式化时间
+ function convertToDate(date) {
+ if (isNaN(new Date(date).getTime())) {
+ throw new Error(`${date} 不是一个有效的时间`);
+ }
+ if (!(date instanceof Date)) {
+ date = new Date(date);
+ }
+ return date;
+ }
+ function formatDate(date, format = "yyyy-MM") {
+ date = convertToDate(date);
+ const o = {
+ "y+": date.getFullYear(),
+ "M+": date.getMonth() + 1,
+ "d+": date.getDate(),
+ "h+": date.getHours(),
+ "m+": date.getMinutes(),
+ "s+": date.getSeconds(),
+ };
+ for (let k in o) {
+ if (new RegExp(`(${k})`).test(format)) {
+ format = format.replace(
+ RegExp.$1,
+ RegExp.$1.length === 1
+ ? o[k]
+ : `0${o[k]}`.substr(-RegExp.$1.length)
+ );
+ }
+ }
+ return format;
+ }
+ return groupBy(data);
+}
+
+//清理echarts 避免重复生成
+export function resetTheChart(_that) {
+ if (
+ _that.myChart != null &&
+ _that.myChart != "" &&
+ _that.myChart != undefined
+ ) {
+ _that.myChart.dispose();
+
+ }
+}
+//处理ALL的数据
+export function handelAllData(that, data, itemValueList) {
+
+ function setGrouping(data) {
+ //分组求和
+ function groupBy(data) {
+ //月
+ let arrTime = [
+ ...new Set(
+ data.map((_) => {
+ //用反射把时间格式统一为yyyy-MM 并分组
+ Reflect.set(_, "time", formatDate(_.time));
+ return _.time;
+ })
+ ),
+ ].map((_) => {
+ return { time: _, month: {}, sumMonth: {} };
+ });
+
+ //双重循环计算月合计
+
+ arrTime.forEach((_) => {
+ var sumMonth = 0;
+ data.forEach((item) => {
+ if (_.time == item.time) {
+ sumMonth += item.CapMVRVCur;
+ _.sumMonth = sumMonth;
+ _.month = _.time.slice(-2);
+ }
+ });
+ });
+
+ //年
+
+ let arr = [
+ ...new Set(
+ arrTime.map((_) => {
+ //根据年分组
+ return _.time.slice(0, 4);
+ })
+ ),
+ ].map((_) => {
+ return { year: _, sumYear: {}, months: [] };
+ });
+ //双重循环计算年合计
+ arr.forEach((_) => {
+ var sumYear = 0;
+ arrTime.forEach((item) => {
+ if (_.year == item.time.slice(0, 4)) {
+ sumYear += item.sumMonth;
+ _.sumYear = sumYear;
+ _.year = _.year;
+ _.months.push(item);
+ }
+ });
+ });
+
+ return arr;
+ }
+ //格式化时间
+ function convertToDate(date) {
+ if (isNaN(new Date(date).getTime())) {
+ throw new Error(`${date} 不是一个有效的时间`);
+ }
+ if (!(date instanceof Date)) {
+ date = new Date(date);
+ }
+ return date;
+ }
+ function formatDate(date, format = "yyyy-MM") {
+ date = convertToDate(date);
+ const o = {
+ "y+": date.getFullYear(),
+ "M+": date.getMonth() + 1,
+ "d+": date.getDate(),
+ "h+": date.getHours(),
+ "m+": date.getMinutes(),
+ "s+": date.getSeconds(),
+ };
+ for (let k in o) {
+ if (new RegExp(`(${k})`).test(format)) {
+ format = format.replace(
+ RegExp.$1,
+ RegExp.$1.length === 1
+ ? o[k]
+ : `0${o[k]}`.substr(-RegExp.$1.length)
+ );
+ }
+ }
+ return format;
+ }
+ return groupBy(data);
+ }
+ let newData = setGrouping(data);
+ let yearValue = []
+ let monthsValue = []
+ newData.forEach((yearItem) => {
+ yearValue.push(+yearItem.sumYear.toFixed(3));
+ yearItem.months.forEach((monthsItem) => {
+ monthsValue.push(+monthsItem.sumMonth.toFixed(3));
+ });
+ });
+
+ that.myChart = that.$echarts.init(document.getElementById("main"));
+ let startTime = newData[0].months[0].time + "-01";
+ let months = newData[newData.length - 1].months;
+ let endTime =
+ newData[newData.length - 1].months[months.length - 1].time + "-01";
+
+ let base = +new Date(startTime);
+
+ let oneDay = 24 * 31 * 3600 * 1000;
+ let totalDay = getMonth(startTime, endTime);
+
+ data = [[base, monthsValue[0]]];
+ for (let i = 1; i < totalDay; i++) {
+ let now = new Date((base += oneDay));
+ if (i - 1 == 0) {
+ data.push([+now, monthsValue[i]]);
+ itemValueList.splice(0, 1);
+ } else {
+ data.push([+now, monthsValue[i - 1]]);
+ }
+ }
+
+ return data;
+}
+//生成二维数组
+export function handelTotalData(data, value) {
+ let startTime = data[0].time.split("T")[0].replace(/-/g, ",");
+ let endTime = data[data.length - 1].time.split("T")[0].replace(/-/g, ",");
+ let base = +new Date(startTime);
+
+ let oneDay = 24 * 3600 * 1000;
+ let totalDay = getDiffDay(startTime, endTime) + 1;
+ let date = [[base, value[0]]];
+ for (let i = 1; i < totalDay; i++) {
+ let now = new Date((base += oneDay));
+ if (i - 1 == 0) {
+ date.push([+now, value[i]]);
+ value.splice(0, 1);
+ } else {
+ date.push([+now, value[i - 1]]);
+ }
+ }
+ return date;
+}
+
+
+
+
+//K线图生成二维数组
+export function handelKlineGraph(data, valueList) {
+
+ let value = []
+ let date
+ if (valueList) {
+ value = valueList
+ let startTime = data[0].time.split("T")[0].replace(/-/g, ",");
+ let endTime = data[data.length - 1].time.split("T")[0].replace(/-/g, ",");
+ let base = +new Date(startTime);
+ let oneDay = 24 * 3600 * 1000;
+ let totalDay = getDiffDay(startTime, endTime) + 1;
+ date = [[base, value[0]]];
+ for (let i = 1; i < totalDay; i++) {
+ let now = new Date((base += oneDay));
+ if (i - 1 == 0) {
+ date.push([+now, value[i]]);
+ value.splice(0, 1);
+ } else {
+ date.push([+now, value[i - 1]]);
+ }
+ }
+ } else {
+
+ data.forEach((item) => {
+ value.push([
+ //series数据处理
+ Number(item.openPrice).toFixed(2),
+ Number(item.closePrice).toFixed(2),
+ Number(item.lowestPrice).toFixed(2),
+ Number(item.highestPrice).toFixed(2),
+ ]);
+ });
+ let startTime = data[0].time.split("T")[0].replace(/-/g, ",");
+ let endTime = data[data.length - 1].time.split("T")[0].replace(/-/g, ",");
+ let base = +new Date(startTime);
+ let oneDay = 24 * 3600 * 1000;
+ let totalDay = getDiffDay(startTime, endTime) + 1;
+ date = [[base, ...value[0]]];
+ for (let i = 1; i < value.length; i++) {
+ let now = new Date((base += oneDay));
+ if (i - 1 == 0) {
+ date.push([+now, ...value[i]]);
+ value.splice(0, 1);
+ } else {
+ date.push([+now, ...value[i - 1]]);
+ }
+
+ }
+
+
+ }
+
+
+ return date;
+}
+
+//K线图closePrice单独取出处理
+export function handelClosePrice(data) {
+ let closePrice = []
+ data.forEach((item) => {
+ closePrice.push(Number(item.closePrice).toFixed(2))
+ });
+ return closePrice;
+}
+
+
+
+//Jzr接口统一处理方法返回三项值的大数组
+export function handelJzr(data) {
+ let price = []
+ let jzr60 = []
+ let arr = []
+ data.forEach(item => {
+ jzr60.push(item.jzr60)
+ price.push(item.price)
+ })
+ arr.push(jzr60, price)
+ return arr
+}
+
+//生成二维数组
+export function handelCddData(data, value) {
+ let startTime = data[0].date.split("T")[0].replace(/-/g, ",");
+ let endTime = data[data.length - 1].date.split("T")[0].replace(/-/g, ",");
+ let base = +new Date(startTime);
+
+ let oneDay = 24 * 3600 * 1000;
+ let totalDay = getDiffDay(startTime, endTime) + 1;
+ let date = [[base, value[0]]];
+ for (let i = 1; i < value.length; i++) {
+ let now = new Date((base += oneDay));
+ if (i - 1 == 0) {
+ date.push([+now, value[i]]);
+ value.splice(0, 1);
+ } else {
+ date.push([+now, value[i - 1]]);
+ }
+ }
+ return date;
+}
+//生成Profitrate二维数组
+export function handelProfitrate(data, value) {
+
+ let startTime = data[0].date.split("T")[0].replace(/-/g, ",");
+ let endTime = data[data.length - 1].date.split("T")[0].replace(/-/g, ",");
+ let base = +new Date(startTime);
+ let oneDay = 24 * 3600 * 1000;
+ let totalDay = getDiffDay(startTime, endTime) + 1;
+ let date = [[base, value[0]]];
+ for (let i = 1; i <= value.length; i++) {
+
+ let now = new Date((base += oneDay));
+ if (i - 1 == 0) {
+ date.push([+now, value[i]]);
+ value.splice(0, 1);
+ } else {
+ date.push([+now, value[i - 1]]);
+ }
+ }
+
+ return date;
+}
+//生成USDT二维数组 dateTime
+export function handelUsdt(data, value) {
+
+ let startTime = data[0].dateTime.split("T")[0].replace(/-/g, ",");
+ let endTime = data[data.length - 1].dateTime.split("T")[0].replace(/-/g, ",");
+ let base = +new Date(startTime);
+ let oneDay = 24 * 3600 * 1000;
+ let totalDay = getDiffDay(startTime, endTime) + 1;
+ let date = [[base, value[0]]];
+ for (let i = 1; i < totalDay; i++) {
+ let now = new Date((base += oneDay));
+ if (i - 1 == 0) {
+ date.push([+now, value[i]]);
+ value.splice(0, 1);
+ } else {
+ date.push([+now, value[i - 1]]);
+ }
+ }
+
+ return date;
+}
+//生成Profitrate二维数组
+export function handelBigDeals(data, value) {
+
+ let startTime = data[0].dataTime.split("T")[0].replace(/-/g, ",");
+ let endTime = data[data.length - 1].dataTime.split("T")[0].replace(/-/g, ",");
+ let base = +new Date(startTime);
+ let oneDay = 24 * 3600 * 1000;
+ let totalDay = getDiffDay(startTime, endTime) + 1;
+ let date = [[base, value[0]]];
+ for (let i = 1; i {
+ let day = item.date.split("T")[0]
+ let hours = item.date.split("T")[1].split(".")[0]
+ dayTime.push(`${day} ${hours}`)
+ })
+
+ let date = [[dayTime[0], value[0]]];
+ for (let i = 1; i < dayTime.length; i++) {
+ date.push([dayTime[i - 1], value[i - 1].toFixed(2)]);
+ // if (i - 1 == 0) {
+ // date.push([dayTime[i], value[i]]);
+ // value.splice(0, 1);
+ // } else {
+ // date.push([dayTime[i-1], value[i - 1]]);
+ // }
+ }
+
+ return date;
+}
+
+//按小时渲染生成维数组 Bi An Controller
+export function handelbian(bianData, value) {
+ let dayTime = []
+ bianData.forEach(item => {
+ let day = item.openTime.split("T")[0]
+ let hours = item.openTime.split("T")[1].split(".")[0]
+ dayTime.push(`${day} ${hours}`)
+ })
+
+ let date = [[dayTime[0], ...value[0]]];
+ for (let i = 1; i < dayTime.length; i++) {
+ date.push([dayTime[i - 1], ...value[i - 1]]);
+ }
+ return date;
+}
+
+//获取当前时间
+export function getcurDate() {
+ var today = new Date();
+ var year = today.getFullYear();
+ var month = today.getMonth() + 1;
+ var date = today.getDate();
+
+ var curDate = `${year}-${month}-${date}`
+ return curDate;
+}
+
+//newAddress接口统一处理方法返回四项值的大数组
+export function handelNewAddress(data) {
+ let newAddress = []
+ let activeAddress = []
+ let receiveAddress = []
+ let sendAddress = []
+ let newAddressVolume = []
+ let totalAddress = []
+ let arr = []
+ data.forEach(item => {
+ newAddress.push(Number(item.newAddress.toFixed(2)))
+ activeAddress.push(Number(item.activeAddress.toFixed(2)))
+ receiveAddress.push(Number(item.receiveAddress.toFixed(2)))
+ sendAddress.push(Number(item.sendAddress.toFixed(2)))
+ newAddressVolume.push(Number(item.newAddressVolume.toFixed(2)))
+ totalAddress.push(Number(item.totalAddress.toFixed(2)))
+
+ })
+ arr.push(newAddress, activeAddress, receiveAddress, sendAddress, newAddressVolume, totalAddress)
+ return arr
+}
+
+//NewAddress生成二维数组
+export function handelAddressData(data, value) {
+
+ let startTime = data[0].date.split("T")[0].replace(/-/g, ",");
+
+ let endTime = data[data.length - 1].date.split("T")[0].replace(/-/g, ",");
+ let base = +new Date(startTime);
+
+ let oneDay = 24 * 3600 * 1000;
+ let totalDay = getDiffDay(startTime, endTime) + 1;
+ let date = [[base, value[0]]];
+ for (let i = 0; i < value.length; i++) {
+ let now = new Date((base += oneDay));
+ if (i - 1 == 0) {
+ date.push([+now, value[i]]);
+ value.splice(0, 1);
+ } else {
+ date.push([+now, value[i - 1]]);
+ }
+ }
+
+ return date;
+}
+
+
+//blockAmount接口统一处理方法返回四项值的大数组
+export function handelBlockAmount(data) {
+ let amount = []
+ let height = []
+ let arr = []
+ data.forEach(item => {
+ amount.push(item.amount)
+ height.push(item.height)
+
+ })
+ arr.push(amount, height)
+ return arr
+}
+
+
+//BlockAmount生成二维数组
+export function handelBlock(data, value) {
+
+ let year = data[0].dateTime.split("T")[0];
+ let hours = data[0].dateTime.split("T")[1].split(".")[0]
+ let startTime = `${year} ${hours}`
+ let endYear = data[data.length - 1].dateTime.split("T")[0];
+ let endHours = data[data.length - 1].dateTime.split("T")[1].split(".")[0];
+ let endTime = `${endYear} ${endHours}`
+ let base = +new Date(startTime);
+
+ let oneDay = 24 * 3600 * 1000;
+ let totalDay = getDiffDay(startTime, endTime) + 1;
+ let date = [[base, value[0]]];
+ for (let i = 1; i < value.length; i++) {
+ let now = new Date((base += oneDay));
+ if (i - 1 == 0) {
+ date.push([+now, value[i]]);
+ value.splice(0, 1);
+ } else {
+ date.push([+now, value[i - 1]]);
+ }
+ }
+
+ return date;
+}
+//时间
+export function getDate(type = null, number = 0) {
+ var nowdate = new Date();
+ switch (type) {
+ case "day": //取number天前、后的时间
+ nowdate.setTime(nowdate.getTime() + 24 * 3600 * 1000 * number);
+ var y = nowdate.getFullYear();
+ var m =
+ nowdate.getMonth() + 1 >= 10
+ ? nowdate.getMonth() + 1
+ : "0" + (nowdate.getMonth() + 1);
+ var d =
+ nowdate.getDate() >= 10
+ ? nowdate.getDate()
+ : "0" + nowdate.getDate();
+ var retrundate = `${y}-${m}-${d}`;
+ break;
+ default:
+ //取当前时间
+ var y = nowdate.getFullYear();
+ var m =
+ nowdate.getMonth() + 1 >= 10
+ ? nowdate.getMonth() + 1
+ : "0" + (nowdate.getMonth() + 1);
+ var d =
+ nowdate.getDate() >= 10
+ ? nowdate.getDate()
+ : "0" + nowdate.getDate();
+ var retrundate = `${y}-${m}-${d}`;
+ }
+ return retrundate;
+
+
+}
+//时间戳转换成时间
+export function getDateTime(timer) {
+
+ let curDate = new Date(timer);
+ let Y = curDate.getFullYear();
+ let M = curDate.getMonth() + 1 < 10 ? `0${curDate.getMonth() + 1}` : `${curDate.getMonth() + 1}`;
+ let D = curDate.getDate() < 10 ? `0${curDate.getDate()}` : `${curDate.getDate()}`;
+ let H = curDate.getHours() < 10 ? `0${curDate.getHours()}` : `${curDate.getHours()}`;
+ let Min = curDate.getMinutes() < 10 ? `0${curDate.getMinutes()}` : `${curDate.getMinutes()}`;
+ let S = curDate.getSeconds() < 10 ? `0${curDate.getSeconds()}` : `${curDate.getSeconds()}`;
+
+ return `${Y}-${M}-${D} ${H}:${Min}:${S}`
+
+
+}
+//echats 图表折线图切换对数显示还是Linear 显示
+export function handelLineType(option, type) {
+ let options = JSON.parse(JSON.stringify(option))
+ let oldyAxis
+ if (type) {
+ oldyAxis = [...type] //深拷贝一开始传入的Y轴
+ }
+
+
+ if (Array.isArray(options.yAxis)) {
+
+
+ if (options.yAxis.some(item => item.type == "value")) {
+
+ options.yAxis.forEach(i => i.type = "log")
+ } else {//当Y轴都是log的时候点击按钮 进来就把Y轴换成
+ options.yAxis.forEach(i => i.type = "value")
+ // options.yAxis.forEach(i=> i.type ="value")
+ // if (oldyAxis) {
+ // options.yAxis = oldyAxis
+ // } else {
+ // options.yAxis.forEach(i => i.type = "value")
+ // }
+
+
+
+ }
+
+
+
+ } else {
+ if (options.yAxis.type == "value") {
+ options.yAxis.type = "log"
+ } else {
+ options.yAxis.type == "value"
+ // if (oldyAxis) {
+ // options.yAxis = oldyAxis
+ // } else {
+ // options.yAxis.type == "value"
+ // }
+ options.yAxis.min=(value)=>{
+ if (value.min <= 0) {
+
+ return 0.0001;
+ } else {
+ return value.min;
+ }
+ }
+
+
+
+ }
+ }
+
+ options.yAxis.forEach((item1)=>{//更改对数刻度 避免0和负数情况 线条超出页面
+
+ item1.axisLabel = {
+ formatter: (value) => {
+ let data
+ if (value >= 1000000000) {
+ data = `${(value / 1000000000).toFixed(2)}B`
+ } else if (value >= 1000000) {
+ data = `${(value / 1000000).toFixed(2)}M`
+ } else if (value >= 1000) {
+ data = `${(value / 1000).toFixed(2)}K`
+ } else if (value <= -1000000000) {
+ data = `${(value / 1000000000).toFixed(2)}B`
+ } else if (value <= -1000000) {
+ data = `${(value / 1000000).toFixed(2)}M`
+ } else if (value <= -1000) {
+ data = `${(value / 1000).toFixed(2)}K`
+ } else {
+ data = value
+
+
+ }
+
+
+ return data
+ }
+ }
+ // if (item1.type == "value") {
+ // item1.min="dataMin"
+ // }else{
+ // item1.min=(value)=>{
+ // if (value.min <= 0) {
+ // return 0.0001;
+ // } else {
+ // return value.min;
+ // }
+ // }
+ // }
+
+
+
+
+ })
+ //根据type类型修改数据 含0的都修改
+ if (options.yAxis.some(item => item.type == "log") && options.xAxis.type == "time") {
+ options.series.forEach((seriesItem) => {
+ seriesItem.data.forEach(itemData=>{
+ if (itemData[1] == 0) {
+
+ itemData[1]=0.1
+ }
+ })
+
+
+ })
+ }else if (options.yAxis.some(item => item.type == "value")){
+
+ }
+
+
+ return options
+}
+
+
+//echats //默认判断显示对数/线性
+export function handelSwitchs(data, switchs) {
+
+ //判断子级option是不是数组 并改变默认值(线性/对数)
+ if (Array.isArray(data.yAxis)) {
+
+
+ if (data.yAxis.some(item => item.type == "value")) {
+
+
+ switchs = "home.switch1";
+
+ } else {
+
+ switchs = "home.switch2";
+
+ }
+ } else {
+
+ data.yAxis.axisLabel = {
+ formatter: (value) => {
+ let data
+ if (value >= 1000000000) {
+ data = `${(value / 1000000000).toFixed(2)}B`
+ } else if (value >= 1000000) {
+ data = `${(value / 1000000).toFixed(2)}M`
+ } else if (value >= 1000) {
+ data = `${(value / 1000).toFixed(2)}K`
+ } else if (value <= -1000000000) {
+ data = `${(value / 1000000000).toFixed(2)}B`
+ } else if (value <= -1000000) {
+ data = `${(value / 1000000).toFixed(2)}M`
+ } else if (value <= -1000) {
+ data = `${(value / 1000).toFixed(2)}K`
+ } else {
+ data = value
+
+
+ }
+
+
+ return data
+ }
+ }
+
+ if (data.yAxis.type == "value") {
+
+ switchs = "home.switch1";
+ } else {
+
+ switchs = "home.switch2";
+ }
+ }
+
+
+ return switchs
+}
+//防抖函数
+export function debounce(fn, wait) {
+ let timeout = null;
+ wait = wait || 600;
+ return function () {
+ let that = this;
+ if (timeout !== null) clearTimeout(timeout);
+ timeout = setTimeout(() => {
+ fn.apply(that);
+ }, wait);
+ }
+}
+//点击BTC按钮请求
+export async function fetchBtcPrice(radius, option, start, end, methods, that, flag, series0, visualMap) {
+ let btcPrice
+ var series0Data = series0
+ var visualMap1 = visualMap
+ if (flag) {
+ //请求BTC价格
+ const price = await that.$API.getBtcPrice2(radius, start, end);
+
+ btcPrice = price.data.data
+ if (btcPrice.length == 0) {//价格未查询到数据的情况
+ option.data.length = 0
+ that.$message({
+ type: 'warning',
+ message: that.$t(`home.ethPrice`)
+ });
+ return
+ } else {
+
+ let priceValueList = []
+ let newPriceData = []
+ btcPrice.forEach(price => {
+ priceValueList.push(Number(parseInt(price.value * 100) / 100))
+ newPriceData.push(price)
+ })
+
+ if (option&&option.data) {
+ option.data = handelBtcPrice(newPriceData, priceValueList)
+ }
+
+
+ }
+ } else {
+ option.data.length = 0
+ }
+
+
+
+
+ methods()
+ return false
+
+}
+//点击ETH按钮请求
+export async function fetchEthPrice(radius, option, start, end, methods, that, flag, page) {
+
+ if (flag) {
+
+ //请求ETH价格
+ const price = await that.$API.getBtcPrice2(radius, start, end);
+ let ethPrice = price.data.data
+ if (ethPrice.length==0) {//价格未查询到数据的情况
+
+ // option.data.length = 0
+ that.$message({
+ type: 'warning',
+ message: that.$t(`home.ethPrice`)
+ });
+ return
+ } else {
+
+ let priceValueList = []
+ let newPriceData = []
+ ethPrice.forEach(price => {
+ priceValueList.push(Number(price.value.toFixed(2)))
+ newPriceData.push(price)
+ })
+
+ option.data = handelBtcPrice(newPriceData, priceValueList)
+
+ }
+
+
+ } else {
+ option.data.length = 0
+ }
+
+ methods()
+
+
+}
+//根据日期筛选对应的数据
+export function getDateArray(startDate, endDate, data) {
+ var dateArray = []
+ let currentDate = new Date(startDate)
+ let lastDay = new Date(endDate)
+
+ data.forEach((item, index) => {
+ let time = new Date(item.time.split("T")[0])
+
+ if (currentDate <= time && lastDay >= time) {
+ dateArray.push(item)
+ }
+ })
+
+ return dateArray;
+}
+//渲染平均线
+export function handelSmaData(smaData, option, methods, start, end, zoomStart, zoomEnd) {
+
+ let newsmaData = smaData
+ if (start) {
+ //根据日期渲染对应数据
+ function getDateArray(startDate, endDate, data) {
+ var dateArray = []
+ let currentDate = new Date(startDate)
+ let lastDay = new Date(endDate)
+
+ data.forEach((item, index) => {
+ let time = new Date(item.time.split("T")[0])
+
+ if (currentDate <= time && lastDay >= time) {
+ dateArray.push(item)
+ }
+ })
+
+ return dateArray;
+ }
+ //按照日期筛选出新的数据
+ newsmaData = getDateArray(start, end, smaData,)
+ }
+
+
+ let smaValueList = []
+ newsmaData.forEach(item => {
+ smaValueList.push(Number(item.value.toFixed(2)))
+ })
+ //生成二维数组
+ function handelBtcPrice(data, value) {
+ let startTime = data[0].time.split("T")[0].replace(/-/g, ",")
+ let endTime = data[data.length - 1].time.split("T")[0].replace(/-/g, ",");
+ let base = +new Date(startTime);
+ let oneDay = 24 * 3600 * 1000;
+
+ let totalDay = getDiffDay(startTime, endTime) + 1;
+ let date = [[base, value[0]]];
+ for (let i = 1; i < value.length; i++) {
+ let now = new Date((base += oneDay));
+ if (i - 1 == 0) {
+ date.push([+now, value[i]]);
+ value.splice(0, 1);
+ } else {
+ date.push([+now, value[i - 1]]);
+ }
+ }
+
+ return date;
+ }
+
+ option.data = handelBtcPrice(newsmaData, smaValueList)
+
+
+
+
+ methods()
+}
+
+//添加水印
+export function handelWatermark(option, r, t) {
+
+ option.graphic = [//添加水印
+ {
+ type: 'group',
+ // rotation: Math.PI / 2,
+ bounding: 'raw',
+ right: "50%",
+ top: "40%",
+ // z: 10,
+ // rotation: 6,
+ children: [
+ {
+ type: 'text',
+ left: 'center',
+ top: 'center',
+
+ silent: true,//不影响鼠标事件
+
+ style: {
+ fill: `rgba(0,0,0,0.1)`,
+ text: `coinbus.cc`,
+ font: 'bold 80px sans-serif',
+
+ }
+ }
+ ]
+ }
+
+ ]
+ // 高点选中的线条
+ option.series.forEach(item => {
+
+ if (item.name == "Price[BTC]") {
+ item.itemStyle.color = "#000"
+ item.lineStyle.color = "#000"
+ item.markLine={}
+ item.yAxisIndex=1
+ }else if(item.name== "Price [ETH]"){
+ item.yAxisIndex=1
+ item.markLine={}
+ }
+ item.emphasis = {
+ focus: 'series',
+ blurScope: 'coordinateSystem'
+
+ }
+ item.smooth = false
+ //圆点大小及样式
+ if (item.type == "line") {
+ item.symbolSize = 10
+ item.itemStyle.borderColor = "rgba(0,0,0,0.1)"
+ }
+
+ //加粗线条宽度
+ if (item.lineStyle) {
+ if (Number(item.lineStyle.width)) {//判断有线条的才加粗
+
+ item.lineStyle.width = "2"
+ }
+ }
+
+
+
+
+
+ })
+ if (Array.isArray(option.yAxis)) { //判断Y轴是数组的情况下 每个Y轴加上单位
+ option.yAxis.forEach((item,index) => {
+ //统一处理 Y轴的0、1项显示其他隐藏
+ if (index==0) {
+ // item.show = true //统一处理 Y轴的0、1项显示其他隐藏
+ item.position="left"
+ }else if(index==1){
+ // item.show = true //统一处理 Y轴的0、1项显示其他隐藏
+ item.position="right"
+ }else{
+ // item.show = false //统一处理 Y轴的0、1项显示其他隐藏
+ }
+ item.axisLabel = {
+ formatter: (value) => {
+ let data
+ if (value >= 1000000000) {
+ data = `${(value / 1000000000).toFixed(2)}B`
+ } else if (value >= 1000000) {
+ data = `${(value / 1000000).toFixed(2)}M`
+ } else if (value >= 1000) {
+ data = `${(value / 1000).toFixed(2)}K`
+ } else if (value <= -1000000000) {
+ data = `${(value / 1000000000).toFixed(2)}B`
+ } else if (value <= -1000000) {
+ data = `${(value / 1000000).toFixed(2)}M`
+ } else if (value <= -1000) {
+ data = `${(value / 1000).toFixed(2)}K`
+ } else {
+ data = value
+
+
+ }
+
+
+ return data
+ }
+ }
+ })
+ } else {
+ option.yAxis.axisLabel = {
+ formatter: (value) => {
+ let data
+ if (value >= 1000000000) {
+ data = `${(value / 1000000000).toFixed(2)}B`
+ } else if (value >= 1000000) {
+ data = `${(value / 1000000).toFixed(2)}M`
+ } else if (value >= 1000) {
+ data = `${(value / 1000).toFixed(2)}K`
+ } else if (value <= -1000000000) {
+ data = `${(value / 1000000000).toFixed(2)}B`
+ } else if (value <= -1000000) {
+ data = `${(value / 1000000).toFixed(2)}M`
+ } else if (value <= -1000) {
+ data = `${(value / 1000).toFixed(2)}K`
+ } else {
+ data = value
+
+
+ }
+
+
+ return data
+ }
+ }
+ }
+ // 鼠标移动添加十字线
+ option.tooltip.axisPointer = {
+
+ label: {
+ show: false,
+ // precision: 0, //坐标轴保留的位数
+ },
+
+
+ type: "cross",
+
+ // crossStyle: {
+ // //十字轴横线
+ // // opacity: "0",
+ // width: 1,
+ // },
+ // lineStyle: { //十字准星的竖线
+ // opacity: 0,
+ // },
+ }
+ //限制初始滚动范围 只对折线图 数据量较大
+ if (Array.isArray(option.dataZoom) && option.series[0].type == "line") {
+
+ option.dataZoom[0].start = 80
+ option.dataZoom[0].end = 100
+ }
+
+ // 限制滚动范围
+ if (Array.isArray(option.xAxis)) {//判断是否多个X轴
+ option.xAxis.forEach(item => {
+ if (!option.dataZoom) return
+
+ if (item.type == "time") {//最小滚动到7天就不能继续放大
+
+ option.dataZoom[0].minValueSpan = 3600 * 24 * 1000 * 7
+ } else {
+ option.dataZoom[0].minValueSpan = 6
+ }
+ })
+ } else {//单个X轴 类型判断
+
+ if (!option.dataZoom) return
+
+ if (option.xAxis.type == "time") {
+ option.dataZoom[0].minValueSpan = 3600 * 24 * 1000 * 7
+ } else {
+ option.dataZoom[0].minValueSpan = 6
+ }
+ }
+
+ //所有页面legend 默认只显示前1条数据和价格线对比
+
+ // let legendObj = {}
+ // if (option.series.length > 2 ) {
+ // for (let i = 0; i < option.series.length; i++) {
+ // if (i > 0 && (option.series[i].name !== `Price[BTC]` && option.series[i].name !== `Price [ETH]`)&&option.series[i].type !== `bar`) {
+ // legendObj[option.series[i].name] = false
+ // }
+ // }
+ // }
+ // if (option.legend) {
+ // option.legend.selected = legendObj
+ // }
+ // 滚动条文字处理
+ if (option.xAxis.type == "time" && option.dataZoom[1]) {
+
+ option.dataZoom[1].labelFormatter = (time)=>{
+
+ const date = new Date(time);
+
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let newTime = `${year}-${month}-${day}`;
+ return newTime
+ }
+ }else if(option.dataZoom){
+
+
+ option.dataZoom[1].labelFormatter={}
+ }
+
+
+ return option
+}
+
+//监听localstorage
+export const $addStorageEvent = function (type, key, data) {
+ // localStorage
+ if (type === 1) {
+ // 创建一个StorageEvent事件
+ var newStorageEvent = document.createEvent('StorageEvent');
+ const storage = {
+ setItem: function (k, val) {
+ localStorage.setItem(k, val);
+ // 初始化创建的事件
+ newStorageEvent.initStorageEvent('setItem', false, false, k, null, val, null, null);
+ // 派发对象
+ window.dispatchEvent(newStorageEvent);
+ }
+ }
+ return storage.setItem(key, data);
+ } else {
+ // sessionStorage
+ // 创建一个StorageEvent事件
+ var newStorageEvent = document.createEvent('StorageEvent');
+ const storage = {
+ setItem: function (k, val) {
+ sessionStorage.setItem(k, val);
+ // 初始化创建的事件
+ newStorageEvent.initStorageEvent('setItem', false, false, k, null, val, null, null);
+ // 派发对象
+ window.dispatchEvent(newStorageEvent);
+ }
+ }
+ return storage.setItem(key, data);
+ }
+}
+
+
+//记录滚动位置
+export function handelZoom(myChart, option, that, start, end) {
+ if (!myChart) {
+ return
+ }
+
+ if (Number(start) && Array.isArray(option.dataZoom)) {
+
+ option.dataZoom[0].start = start
+ option.dataZoom[0].end = end
+ } else if (Number(start) && !Array.isArray(option.dataZoom)) {
+ option.dataZoom.start = start
+ option.dataZoom.end = end
+ }
+
+
+
+ myChart.on("dataZoom", (e) => {
+
+ // start = e.start || e.end || e.batch[0].end;
+ // end = e.batch[0].end;
+
+ if (!e || (!e.start && !e.batch?.[0]?.start)) {
+ return;
+ }
+
+ start = e.start || e.batch[0].start;
+ end = e.end || e.batch[0].end;
+ // localStorage.setItem( "zoomStart", e.start || e.end || e.batch[0].end)
+ // localStorage.setItem( "zoomEnd", e.batch[0].end)
+ that.$addStorageEvent(1, "zoomStart", start);
+ that.$addStorageEvent(1, "zoomEnd", end);
+
+
+
+
+ });
+ return option
+
+
+}
+/**
+ * @desc 防抖函数
+ * @param {()=>void} fn 接收一个需要防抖的函数
+ * @param {number} delay 延迟时间,单位 ms。默认为 0。 可选参数,表示重复执行的时间间隔,
+ * @returns {()=>void} 返回一个实际执的函数
+ */
+
+export function Debounce(fn, delay) {
+ let timer = null;
+ return function () {
+ let context = this;
+ let args = arguments;
+ clearTimeout(timer);
+ timer = setTimeout(function () {
+ fn.apply(context, args);
+ }, delay);
+ };
+}
+import * as echarts from "echarts";
+import elementResizeDetectorMaker from "element-resize-detector";
+//echarts 图表根据页面宽度适应
+export function chartsWidth(id, that) {
+
+ // let erd = elementResizeDetectorMaker();//监听元素大小变化
+ // var chartContainer = document.getElementById(id);
+
+
+ // // 定义节流函数
+ // function throttle(fn, delay) {
+ // var timer = null;
+ // return function () {
+ // if (!timer) {
+ // timer = setTimeout(function () {
+ // fn.apply(this, arguments);
+ // timer = null;
+ // }, delay);
+ // }
+ // };
+ // }
+
+ // // 注册回调函数,并进行节流处理
+ // erd.listenTo(chartContainer, throttle(function(element){
+
+ // let dom = echarts.init(chartContainer).resize();
+ // if (dom) {
+ // dom.clear()
+ // }
+
+ // }, 200)); // 设置节流延迟时间为 100 毫秒
+ // --------------------------
+
+ const chartContainer = document.getElementById(id);
+ const resizeObserver = new ResizeObserver(entries => {
+ for (let entry of entries) {
+ if (entry.target === chartContainer) {
+ // 元素大小发生变化时,重新调整 echarts 大小
+ setTimeout(() => {
+ const chart = echarts.getInstanceByDom(chartContainer);
+ if (chart) {
+ chart.resize();
+ }
+
+ // resizeChart();
+ },0)
+
+ }
+ }
+ });
+ if (chartContainer) {
+ resizeObserver.observe(chartContainer);
+ }
+
+
+ // 调整 echarts 大小的方法
+ function resizeChart() {
+ const chart = echarts.getInstanceByDom(document.getElementById(id));
+ if (chart) {
+
+ chart.resize();
+ }
+ }
+
+
+
+
+}
+
+//对数线性切换含有0的数据替换成0.1
+export function logyAxis(data) {
+ let newData = []
+ data.forEach(item => {
+ if (item == 0) {
+ item = 0.1
+
+ } else {
+ item = item
+ }
+ newData.push(item)
+ })
+
+ return newData
+
+}
+
+//空数据处理
+export function emptyData(data, series, inCharts, that) {
+
+ if (data && data.length === 0) {//空数据处理
+
+ that.$message({
+ message: that.$t(`home.NoData`),
+ type: 'warning'
+ });
+
+
+ if (Array.isArray(series)) {
+ series.forEach(item => {
+ item.data = []
+ })
+ } else {
+ series.data = []
+ }
+
+ inCharts()
+
+
+ return true
+ }else if (!data) {
+ if (Array.isArray(series)) {
+ series.forEach(item => {
+ item.data = []
+ })
+ } else {
+ series.data = []
+ }
+
+ inCharts()
+ return true
+ }
+
+
+
+}
+
+
+//数据条数是否一致
+export function dataLength(option, num, inCharts, that) {
+
+ let length =num
+ let flag =false
+ for (let i = 0; i < option.series.length; i++) {
+ if (option.series[i].data.length == 0 ) {
+
+ flag=false
+
+ }else if (option.series[i].data.length !=length) {
+ flag=true
+ }
+
+ }
+ if (num== 0) {
+ flag =false
+
+ }
+
+
+
+ return flag
+
+
+}
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/util/request.js b/yq/src/util/request.js
new file mode 100644
index 0000000..be16157
--- /dev/null
+++ b/yq/src/util/request.js
@@ -0,0 +1,67 @@
+/*
+ 对 axios 进行二次封装
+*/
+
+import axios from "axios";
+
+const server = axios.create({
+ //创建一个axios实例
+ baseURL: "/", // 往后面发请求的路径
+ timeout: 60000, //超时时间
+ // headers: {
+ // //所有的请求都会带
+ // client: "web",
+ // },
+});
+
+/*
+ 拦截器:
+*/
+
+/*
+ 需求:用户的登录token信息
+*/
+
+// 添加请求拦截器
+
+// server.interceptors.request.use(
+// function (config) {
+// // 在发送请求之前做些什么
+// console.log(config);
+// //if(!getToken()) return config;
+// // console.log(getToken());
+// config.headers.Authorization = `Bearer werwerwerwer`;
+// return config;
+// },
+// function (error) {
+// // 对请求错误做些什么
+// return Promise.reject(error);
+// }
+// );
+
+
+
+// 添加响应拦截器
+// server.interceptors.response.use(
+// function (res) {
+// // 对响应数据做点什么,来做统一的code判断
+// console.log(res);
+// switch (res.data.code) {
+// case -1:
+// console.log("服务器错误");
+// break;
+// case -2:
+// console.log("访问被拒绝");
+// break;
+// default:
+// break;
+// }
+// return res;
+// },
+// function (error) {
+// // 对响应错误做点什么
+// return Promise.reject(error);
+// }
+// );
+
+export default server;
diff --git a/yq/src/util/rsa.js b/yq/src/util/rsa.js
new file mode 100644
index 0000000..dc5a4d7
--- /dev/null
+++ b/yq/src/util/rsa.js
@@ -0,0 +1,83 @@
+/* 产引入jsencrypt实现数据RSA加密 */
+import JSEncrypt from 'jsencrypt' // 处理长文本数据时报错 jsencrypt.js Message too long for RSA
+/* 产引入encryptlong实现数据RSA加密 */
+import Encrypt from 'encryptlong' // encryptlong是基于jsencrypt扩展的长文本分段加解密功能。
+
+// 密钥对生成 http://web.chacuo.net/netrsakeypair
+
+// 公钥key
+const publicKey = `MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzf8shQ65PrbUWFor3orc
+FOTN8eerzE1eoL/2xBbog0z2nn0nXNELDrZxuOfeN3+w6DX5IxKEo0l0hSFUKjtK
+6Rkv9Wp/+R6O9rPtSXprtvxsU9FYAkQJid6FJreS8kL/ulYV/CRTeh+o18i4FFKC
+puH97pIgWgNaF8sTVzrj9VFpWpXZLa3mFXffSprOhwswnT4SukZ6FZfaGw85gmTB
+1hty//RuSj3FYVbkDrVFl2pzzl2yw0twKN59tCVhXfJlRiaA9M4/lsanOjS+Avhf
+zN3F5z2N+sZTCxSjDvCjkCY1sm8cSJMIUBkezOUf0cOISLDTIOIJ8MUe4Au1JpYw
+JQIDAQAB`
+// 私钥key
+const privateKey = `MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDN/yyFDrk+ttRY
+WiveitwU5M3x56vMTV6gv/bEFuiDTPaefSdc0QsOtnG45943f7DoNfkjEoSjSXSF
+IVQqO0rpGS/1an/5Ho72s+1Jemu2/GxT0VgCRAmJ3oUmt5LyQv+6VhX8JFN6H6jX
+yLgUUoKm4f3ukiBaA1oXyxNXOuP1UWlaldktreYVd99Kms6HCzCdPhK6RnoVl9ob
+DzmCZMHWG3L/9G5KPcVhVuQOtUWXanPOXbLDS3Ao3n20JWFd8mVGJoD0zj+Wxqc6
+NL4C+F/M3cXnPY36xlMLFKMO8KOQJjWybxxIkwhQGR7M5R/Rw4hIsNMg4gnwxR7g
+C7UmljAlAgMBAAECggEAfT6WLNgE3RKADK/WWFoI8VMju95lX7Pywr20JQjgmWQj
+1by2QAKBPJLEle2z9/5U6vpV3XMW3ch9Zawb5glixFKiDA6SfD6OIYTH0pLyBrF2
+k4eGgOoo+oAmaKHYYB9IKFzKxSC4+FljaL8K3KBF+30PzQtfTBsZnbnEqpaNnsqn
+ZNM3XDH4WL6eoAa4EzasJ89ihWngPueoeRG8bnGqOQWf5/Fj58LB6V6Cgp3GjmGd
+l7Y1SzSntQqUf5asDc0/QEAh++Ya3UH24hBpt3pWLMHD9Da2nMDBZJ68SENnV7gq
+CxM8YzIE5XMSEOkd7263Ysf90L0O+2xofIHxqCerQQKBgQDtQV69FV/EPCqEIVqu
+lFyv4B48+KNVRKP9hMrRgv1a9YCwvLg4GJpF/wgpXmfO1CnvLSAgt2bPl+dcq5gN
+P2+8oiEh2nFlAH6RPIOZQmb3izaBq7g1oemddp13HJ7RL77Stm7h97c/zEgLgOaw
+2QPDlrryiW9zfLMCC5KmEFkJiQKBgQDeRZSggzRJ2Dq9w4nNkgk2Gx8F+a8icmgj
++VXVVSkhCTxL4hxOtAsunIaZenltYa9VA5d1fGCu2A9DZ5eSaQ393JNRblIReKHt
+seJ2E8SaDdGqS8VrjDMo20cy5Eb0I0TtB/fnoHIOppZrsEAtxRpWyLVA5Mhv0yXc
+4pd4+o12vQKBgQCbQxREmSA6w0TvgwRdCyo8zmX7cJsyyeCnn6c6xIYYaGD3SAkm
+bLNI60TkDavRZnaq1tUXk+3sHHSD6Kdww/rTbyZPiSx79H7ffMKCITpQ9QGOilna
+f0LqkR0rPceRDbXLHyghKIL7dSwQmyJcySf1b0aYQeh1oz1iMUCe/EPIQQKBgQCv
+CMo/ELNnh4DSmR52pQ7d7cOjd/lDviZmVd4S7kpCOryh4UB7dersXNTeHgVrbqac
+4wQtv7F/XqO+Z+CDqnkbNc1JLgAww/d4cEGuzGhhDIrUeXDQ/Yn4HZ3W5M8/SFrp
+8gF2BPJsuSDxUs1nfbT9LHcX0FJLRVKmvEWePmiSXQKBgGGGMqTPBgkMUbXOU0DI
+DfHyST52/8xK75K8p0j3A4ZJQOSO+biFF4NgeqYDoo6qww2f4gJCyvGHPtwWLeJz
+vc/8uKxB+heqCf+htBT3RvMSlARikkLXv/AmeTaNiLaOin+MUfjBcqmfS+ihpkbE
+jxDnSlsKpAqMdeunX/nImzC6`
+
+ /* JSEncrypt加密 */
+ export function rsaPublicData(data) {
+ let jsencrypt = new JSEncrypt()
+ jsencrypt.setPublicKey(publicKey)
+ // 如果是对象/数组的话,需要先JSON.stringify转换成字符串
+ let result = jsencrypt.encrypt(data)
+ return result
+ }
+ /* JSEncrypt解密 */
+ export function rsaPrivateData(data) {
+ let jsencrypt = new JSEncrypt()
+ jsencrypt.setPrivateKey(privateKey)
+ // 如果是对象/数组的话,需要先JSON.stringify转换成字符串
+ let result = jsencrypt.encrypt(data)
+ return result
+ }
+ /* 加密 */
+ export function encrypt(data) {
+ const PUBLIC_KEY = publicKey
+ let encryptor = new Encrypt()
+ encryptor.setPublicKey(PUBLIC_KEY)
+ // 如果是对象/数组的话,需要先JSON.stringify转换成字符串
+ const result = encryptor.encryptLong(data)
+ return result
+ }
+ /* 解密 - PRIVATE_KEY - 验证 */
+ export function decrypt(data) {
+ const PRIVATE_KEY = privateKey
+ let encryptor = new Encrypt()
+ encryptor.setPrivateKey(PRIVATE_KEY)
+ // 如果是对象/数组的话,需要先JSON.stringify转换成字符串
+ let result = encryptor.decryptLong(data)
+ return result
+ }
+let datas = rsaPublicData('你好')
+let a = `MMeI6N/ZWwsfe92XEfmRNWxe7WXVBz4uZz052Wo4NdvIlMNl/ag/9tKs0A1/8l8cgF5558yLs+Ql+3QPKvy8gay5hB18htMnkLTpkpAxclntS3Vpr7NtdSaoW1nz3P2OgHZ+ww22zcyox0MvCkLpge/20+KcomD/fxtiEK6NZ/PPQB5kNi2Uj3kJMhDz39tvdP9zytK3Po5QNGkw+CyoYPbQi80wplmurxQ/g0l9FBsqHuoCmBs7ZNtVLlG9pE4UkG8MmyV3tQTpIStEaF4TVHwb5XdlP3e9RQ+6rx2DLaunzzeBtNR1JGiNB9nrC5ImO77wzipdbuydCY8ZkILYlA==`
+console.log(datas == a)
+console.log(datas)
+ console.log('加密',datas)
+ console.log('解密',rsaPrivateData(datas))
\ No newline at end of file
diff --git a/yq/src/util/subscriptionMetrics.js b/yq/src/util/subscriptionMetrics.js
new file mode 100644
index 0000000..30f9db5
--- /dev/null
+++ b/yq/src/util/subscriptionMetrics.js
@@ -0,0 +1,142 @@
+export const subscriptionConfiguration = [
+
+ {
+ value: 'BTC',
+ label: 'BTC',
+ channel: "BTCOnChain",
+ children: [
+ {
+ value: '链上数据',
+ label: 'menu.onchain',
+ id: "ls",
+ children: [
+ {
+ value: '网络',
+ label: 'menu.Network',
+ id: "ls-1",
+ children: [
+ {
+
+ value: '交易量',
+ label: 'menu.TransactionVolume',
+ alarmType: [`subscribe.numericalValue`,],
+ alarmInterval: [`realTime`,],
+ channel: "BTCOnChain",
+ id: "ls-1-1",
+
+
+ },
+ {
+
+ value: '交易费',
+ label: 'menu.TransactionFee',
+ alarmType: [`subscribe.numericalValue`,],
+ alarmInterval: [`realTime`,],
+ channel: "BTCOnChain",
+ id: "ls-1-2",
+
+
+ },
+ {
+
+ value: '交易量(找零消除)',
+ label: 'menu.adjusted',
+ alarmType: [`subscribe.numericalValue`,],
+ alarmInterval: [`realTime`,],
+ channel: "BTCOnChain",
+ id: "ls-1-3",
+
+
+ },
+ ],
+ },
+ {
+ value: '地址',
+ label: 'menu.address',
+ id: "ls-2",
+ children: [
+ {
+
+ value: '地址统计',
+ label: 'menu.onchain2',
+ children: [{
+ value: '活跃地址数',
+ label: 'menu.activeAddresses',
+ alarmType: [`subscribe.numericalValue`,],//数值
+ alarmInterval: [`realTime`,],
+ channel: "BTCOnChain",
+ id: "ls-2-1",
+ },
+ {
+ value: '发送地址数',
+ label: 'menu.SendAddresses',
+ alarmType: [`subscribe.numericalValue`,],
+ alarmInterval: [`realTime`,],
+ channel: "BTCOnChain",
+ id: "ls-2-2",
+
+ },
+ {
+ value: '接收地址数',
+ label: 'menu.ReceiveAddresses',
+ alarmType: [`subscribe.numericalValue`,],
+ alarmInterval: [`realTime`,],
+ channel: "BTCOnChain",
+ id: "ls-2-3",
+ },
+
+ ]
+
+ },
+ {
+
+ value: '巨鲸地址列表',
+ label: 'menu2.onchain2',
+ alarmType: [`subscribe.address`,],//地址
+ alarmInterval: [`subscribe.day`,],//1天
+ channel: "BTCOnChain",
+ id: "ls-2-4",
+
+
+
+ },
+ ],
+ },
+ {
+ value: '币龄',
+ label: 'menu2.Lifetime',
+ id: "ls-3",
+ children: [
+ {
+
+ value: '已花费输出平均寿命',
+ label: 'menu2.asol',
+ alarmType: [`subscribe.ratio`,],//比值
+ alarmInterval: [`realTime`,],
+ channel: "BTCOnChain",
+ id: "ls-3-1",
+
+
+ },
+ {
+
+ value: '币天销毁量',
+ label: 'menu.technology37',
+ alarmType: [`subscribe.numericalValue`,],
+ alarmInterval: [`realTime`,],
+ channel: "BTCOnChain",
+ id: "ls-3-2",
+
+
+ },
+
+ ],
+ },
+ ],
+ },
+
+ ]
+ },
+
+
+]
\ No newline at end of file
diff --git a/yq/src/util/thousands.js b/yq/src/util/thousands.js
new file mode 100644
index 0000000..b932c45
--- /dev/null
+++ b/yq/src/util/thousands.js
@@ -0,0 +1,65 @@
+// 不带插槽的 保留两位小数
+export function stateFormat(row, column,number) {
+ let num = Number(row[column["property"]]);
+ let n=2
+ // if (number) {
+ // n = number;
+ // }else{
+ // n = 2
+ // }
+
+ let symbol = ",";
+ if(typeof num!=='number')throw new TypeError('num参数应该是一个number类型');
+ if(n<0)throw new Error('参数n不应该小于0');
+ var hasDot=parseInt(num)!=num;//这里检测num是否为小数,true表示小数
+ var m=(n!=undefined&&n!=null)?n:1;
+ num=m==0?num.toFixed(m)+'.':hasDot?(n?num.toFixed(n):num):num.toFixed(m);
+ symbol=symbol||',';
+ num=num.toString().replace(/(\d)(?=(\d{3})+\.)/g,function(match, p1,p2) {
+ return p1 + symbol;
+ });
+ if(n==0||(!hasDot&&!n)){//如果n为0或者传入的num是整数并且没有指定整数的保留位数,则去掉前面操作中的小数位
+ num=num.substring(0,num.indexOf('.'));
+ }
+ return num;6
+ }
+
+ export function stateFormat2(row, column,number) {
+ let num = Number(row[column["property"]]);
+ let n=0
+
+ let symbol = ",";
+ if(typeof num!=='number')throw new TypeError('num参数应该是一个number类型');
+ if(n<0)throw new Error('参数n不应该小于0');
+ var hasDot=parseInt(num)!=num;//这里检测num是否为小数,true表示小数
+ var m=(n!=undefined&&n!=null)?n:1;
+ num=m==0?num.toFixed(m)+'.':hasDot?(n?num.toFixed(n):num):num.toFixed(m);
+ symbol=symbol||',';
+ num=num.toString().replace(/(\d)(?=(\d{3})+\.)/g,function(match, p1,p2) {
+ return p1 + symbol;
+ });
+ if(n==0||(!hasDot&&!n)){//如果n为0或者传入的num是整数并且没有指定整数的保留位数,则去掉前面操作中的小数位
+ num=num.substring(0,num.indexOf('.'));
+ }
+ return num;6
+ }
+
+ //带插槽的
+ export function handleScopeFormat(num,n=2,symbol) {
+ // 保证为number类型
+ num = Number(num)
+ if(typeof num!=='number')throw new TypeError('num参数应该是一个number类型');
+ if(n<0)throw new Error('参数n不应该小于0');
+ var hasDot=parseInt(num)!=num;//这里检测num是否为小数,true表示小数
+ var m=(n!=undefined&&n!=null)?n:1;
+ num=m==0?num.toFixed(m)+'.':hasDot?(n?num.toFixed(n):num):num.toFixed(m);
+ symbol=symbol||',';
+ num=num.toString().replace(/(\d)(?=(\d{3})+\.)/g,function(match, p1,p2) {
+ return p1 + symbol;
+ });
+ if(n==0||(!hasDot&&!n)){//如果n为0或者传入的num是整数并且没有指定整数的保留位数,则去掉前面操作中的小数位
+ num=num.substring(0,num.indexOf('.'));
+ }
+ return num;
+ }
+
\ No newline at end of file
diff --git a/yq/src/views/AccountUpgrade/index.js b/yq/src/views/AccountUpgrade/index.js
new file mode 100644
index 0000000..9b120e4
--- /dev/null
+++ b/yq/src/views/AccountUpgrade/index.js
@@ -0,0 +1,217 @@
+import { LevelUp, GetNeedFunding } from "../../api/pay"
+import { GetUserAccount } from "../../api/help"
+export default {
+ data() {
+ return {
+
+ upgradeList: {
+ amount: "",
+ network: "TRX(Tron TRC20)",
+ address: "copy 地址",
+ id: "",
+ label: ""
+
+ },
+ AccountUpgradeLoading: false,
+ accounts: [{//L3 月度付费用户
+ id: "advance",
+ label: "login.monthlyPlay",
+ charges: "10(USDT、USDC、BUSD)",
+ amount: "10",
+ value: 0,
+ disabled: false,
+ },
+ {//L3 年度付费用户
+ id: "advance",
+ label: "login.yearsPlay",
+ charges: "100(USDT、USDC、BUSD)",
+ amount: "100",
+ value: 1,
+ disabled: false,
+ },
+ {//L4 vip年度付费用户
+ id: "vip",
+ label: "login.vipYearsPlay",
+ charges: "500(USDT、USDC、BUSD)",
+ amount: "500",
+ value: 2,
+ disabled: false,
+ },],
+ options: [{
+ value: 'USDT',
+ label: 'USDT'
+ }, {
+ value: 'USDC',
+ label: 'USDC'
+ }, {
+ value: 'BUSD',
+ label: 'BUSD'
+ }],
+ value: "",
+ dialogVisible: false,
+ account: "",
+ params: {
+ type: "",
+ amount: "0"
+ },
+ ConfirmationPaymentLoading: false,
+ balances: {
+ total: "",
+ usdc: "",
+ usdt: "",
+ userId: "",
+ userName: ""
+
+ },
+ balanceDialog: false,
+ memberBalances: [{
+
+ },],//等级对应金额
+ formula: "",
+ bthDisabled:""
+
+ }
+ },
+ mounted() {
+
+ this.fetchUserAccount()//请求当前余额
+ this.fetchNeedFunding()//获取对应等级所需金额
+ if (this.$route.params.amount) {
+ // this.params.type = this.$route.params.amount.value
+ this.params.type = this.accounts.find(item => item.amount == this.$route.params.amount.amount).value
+
+ }
+ this.level = JSON.parse(localStorage.getItem("identity")).level
+ //判断等级 禁用相应按钮
+ if (this.level == "L3") {
+ this.bthDisabled = 1
+ } else if (this.level == "L4") {
+ this.bthDisabled = 2
+ } else if (this.level == "L2" || this.level == "L1") {
+ this.bthDisabled = -1
+ } else if(!this.level) {
+ this.bthDisabled = -2
+ }else{
+ this.bthDisabled = 10
+ }
+
+
+
+
+ },
+ methods: {
+
+ //获取对应等级所需金额
+ async fetchNeedFunding(params) {
+ const { data } = await GetNeedFunding(params)
+ this.memberBalances = data.data
+ this.params.amount = this.memberBalances.find(item => item.type == this.params.type).value
+ this.formula = this.memberBalances.find(item => item.type == this.params.type).formula
+
+
+ },
+
+ //请求当前余额
+ async fetchUserAccount(params) {
+ const { data } = await GetUserAccount(params)
+ this.balances = data.data
+
+ },
+ //请求升级账户
+ async fetchLevelUp(params) {
+
+ this.ConfirmationPaymentLoading = true
+ const { data } = await LevelUp(params)
+
+
+ if (data.code == 200) {//升级成功提示 更新token 并跳转至个人中心
+ this.$message({
+ type: 'success',
+ message: this.$t(`pay.upgradeSuccessful`)
+ });
+ this.dialogVisible = false
+ this.$addStorageEvent(1, "token", data.data.access_token);
+ this.$addStorageEvent(1, "identity",JSON.stringify(data.data.role));
+ this.$addStorageEvent(1, "loginTime",data.data.expires_in);
+
+ setTimeout(() => {
+ this.$router.push(`/personal`)
+ }, 10)
+
+
+ }
+
+ this.ConfirmationPaymentLoading = false
+ },
+ //提交支付
+ handelPay() {
+ // if (!this.params.type || !this.params.amount) {//判空
+ // this.$message({
+ // message: this.$t(`help.resubmit`),
+ // type: "error",
+ // });
+ // return
+ // }
+ console.log( this.params,"就覅哦附加费");
+ for (let key in this.params) {
+ if (this.params.hasOwnProperty(key)) {
+ if (this.params[key] === null || this.params[key] === undefined || this.params[key] === '') {
+ this.$message({
+ message: this.$t(`pay.grade`),
+ type: "error",
+ });
+
+ return // 属性值为空
+ }
+ }
+ }
+
+
+
+ //判断总金额是否足够
+ if (this.balances.total - this.params.amount <= 0) {
+ this.balanceDialog = true
+ return
+ } else {
+ this.dialogVisible = true
+ }
+
+
+
+ },
+ //选择账户升级
+ handelAccounts(a) {
+
+ // this.upgradeList.amount = this.account
+
+ // this.upgradeList.label = this.accounts.find(item=>{ return item.amount == this.account }).label //确认支付弹窗显示账户等级
+ if (this.memberBalances[0]) {
+ this.params.amount = this.memberBalances.find(item => item.type == a).value
+ this.formula = this.memberBalances.find(item => item.type == a).formula
+ }
+
+
+
+ },
+ //处理对应等级label显示
+ handelLevel(value) {
+ if (value) {
+ return this.$t(this.accounts.find(item => item.value == value).label)
+ }
+
+
+
+ },
+ //点击弹窗的确认支付
+ handelConfirmPayment() {
+
+ this.fetchLevelUp(this.params)
+
+
+ },
+ //点击去充值
+ handelRecharge() {
+ this.$router.push(`/Recharge`)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/AccountUpgrade/index.vue b/yq/src/views/AccountUpgrade/index.vue
new file mode 100644
index 0000000..52f5924
--- /dev/null
+++ b/yq/src/views/AccountUpgrade/index.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+ {{$t(`pay.Payment`)}}
+
+
+
+
+ {{$t(`pay.AccountUpgrade`)}} :
+
+
+
+
+
+
+
+ {{$t(`pay.AmountPaid`)}} :
+
+
+ {{ formula }}
+
+
+
+ {{ $t(`pay.accountBalance`) }} :
+
+
USDC : {{ balances.usdc }}
+
USDT : {{ balances.usdt }}
+
BUSD : {{ balances.busd }}
+
{{ $t(`home.totalAmount`) }} : {{ balances.total }}
+
+
+
+
+
+
+ {{ $t(`pay.Reminder`) }}
+ {{ $t(`pay.Reminder_16`) }}
+ {{ $t(`pay.Reminder_17`) }}
+ {{ $t(`pay.Reminder_18`) }}
+
+
+
+
+
+
+
+ {{$t(`pay.SubmitPayment`)}}
+
+
+
+
+
+
+
+
{{$t(`pay.AccountLevel`)}} : {{handelLevel(params.type) }}
+
{{$t(`pay.AmountPaid`)}} : {{params.amount}}
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`pay.Insufficient`) }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/Alarm/index.js b/yq/src/views/Alarm/index.js
new file mode 100644
index 0000000..4e7e10e
--- /dev/null
+++ b/yq/src/views/Alarm/index.js
@@ -0,0 +1,520 @@
+
+import { subscriptionConfiguration } from "../../util/subscriptionMetrics";
+import { getSubscript, getSubscriptList, getSubscriptDelete } from "../../api/messageSubscription";
+export default {
+ data() {
+ return {
+ btLoading: false,
+ AlarmLoading: false,
+ activeName: "selectAlarm",
+ from: [{
+ date: `2023-12-02`,
+ indicators: "指标1",
+ threshold: "22000.05",
+ cycle: "10分钟",
+ notice: "Android App"
+ },
+ {
+ date: `2023-12-12`,
+ indicators: "指标5",
+ threshold: "22000.05",
+ cycle: "15分钟",
+ notice: "Android App、Email"
+ }
+ ],
+ currentPage1: 1,
+ pageSizes: [20, 50, 100,],
+ totalLimit1: 0,
+ formLabelAlign: {
+ // region: "",
+ // min: "",
+ // max: "",
+ // percentageMin: "",
+ // percentageMax: "",
+ // content: "",
+ addresses: "",
+ cycle: "",
+ noticeWay: "",
+ channel: "BTCOnChain",
+ metrics: "活跃地址数",
+
+ },
+ labelPosition: "left",
+ options: [{
+ value: '选项1',
+ label: '选项1'
+ }, {
+ value: '选项2',
+ label: '选项2'
+ }, {
+ value: '选项3',
+ label: '选项3'
+ },],
+ value: '',
+ radio: "",
+ cycle: "",
+ cycleList: [
+ {
+ value: '5m',
+ label: "5分钟",
+ },
+ {
+ value: '10m',
+ label: "10分钟",
+ },
+ {
+ value: '15m',
+ label: "15分钟",
+ },
+ {
+ value: '30m',
+ label: "30分钟",
+ },
+ {
+ value: '1h',
+ label: "1小时",
+ },
+ {
+ value: '4h',
+ label: "4小时",
+ },
+ {
+ value: '8h',
+ label: "8小时",
+ },
+ {
+ value: '12h',
+ label: "12小时",
+ },
+ {
+ value: '1d',
+ label: "1天",
+ },
+ {
+ value: '1w',
+ label: "1周",
+ },
+ {
+ value: '1M',
+ label: "1月",
+ },
+
+
+ ],
+ contactList: [`Email`,],//[`Email`, `Android App`, `站内信`]
+
+ contact: {
+ // Email:true,
+ },
+ contactWeekly: [],
+ contactMonthly: [],
+ contactMajor: {},
+ contactNotice: {
+ Email: true,
+ },
+ range: "",
+ rise: "",
+ dialogVisible: false,
+ newCycle: "",
+ modes: "Email",
+ reportDialogVisible: false,
+ daily: "",
+ WeeklyValue: "",
+ MonthlyValue: "",
+ MajorValue: "",
+ Text: "",
+ errorMessage: "请输入最多两位小数的数字",
+ threshold: "数值",
+ indexList: [],
+ show: false,
+ activeItem: {
+ value: '巨鲸钱包监控',
+ label: '巨鲸钱包监控',
+ alarmType: [`地址`,],
+ alarmInterval: [`1天`,],
+ },
+ threshold2: "",
+ defaultIndex: `交易量`,
+ threshold3: "",
+ alarmType: [],
+ alarmInterval: [],
+ address: "",
+ conditionList: [
+ {
+ value: '>',
+ label: "大于",
+ },
+ {
+ value: '<',
+ label: "小于",
+ },
+ {
+ value: '+',
+ label: "涨",
+ },
+ {
+ value: '-',
+ label: "跌",
+ },
+
+
+ ],
+ alarmCycleList: [
+ {
+ value: '1d',
+ label: "subscribe.day",
+
+ },
+ {
+ value: 'realTime',
+ label: "subscribe.realTimeData",
+
+ },
+
+ ],
+ flatIndexList:[],
+ }
+ },
+ created() {
+ this.indexList = subscriptionConfiguration
+ this.activeItem = this.indexList[0].children[0].children[0].children[0]
+ this.formLabelAlign.metrics = this.activeItem.id
+ this.formLabelAlign.channel = this.activeItem.channel
+ this.formLabelAlign.cycle = this.activeItem.alarmInterval
+ this.formLabelAlign.noticeWay = this.modes
+ this.formLabelAlign.cycle = `realTime`
+ },
+ mounted() {
+ this.indexList = subscriptionConfiguration
+ this.flatIndexList = this.handelAllMenu(this.indexList) //扁平化指标选择
+ this.handelChoice()
+ this.fetchSubscriptionList()
+ },
+
+ computed: {
+ getTranslatedOptions() {
+
+ return this.translateOptions(this.indexList);
+
+ }
+ },
+ methods: {
+ //扁平化导航数组 递归
+ handelAllMenu(arr) {
+ var result = [];
+ arr.forEach((item) => {
+ if (!item.children) {
+ result.push(item);
+ } else {
+ var nestedItems = this.handelAllMenu(item.children);
+ result = result.concat(nestedItems);
+ }
+ });
+
+ return result;
+ },
+ //映射I18n
+ translateOptions(options) {
+ return options.map(option => {
+ const translatedOption = {
+ ...option,
+ label: this.$t(option.label)
+ };
+ if (option.children) {
+ translatedOption.children = this.translateOptions(option.children);
+ }
+ return translatedOption;
+ });
+ },
+ async fetchSubscript(params) {
+
+ this.btLoading = true
+ const { data } = await getSubscript(params)
+ if (data && data.code == 200) {
+ this.$message({
+ message: data.msg,
+ type: "success",
+ });
+ this.fetchSubscriptionList()
+ this.address = ""
+ this.dialogVisible = false
+ }
+ this.btLoading = false
+ },
+
+ async fetchSubscriptionList(params) {
+ this.AlarmLoading = true
+ const { data } = await getSubscriptList(params)
+ this.from = data.rows
+ this.from.forEach(item => {
+ item.date = item.date.split(`T`)[0]
+ })
+ this.AlarmLoading = false
+ },
+
+ async fetchSubscriptionCancel(params) {
+ this.AlarmLoading = true
+ const { data } = await getSubscriptDelete(params)
+ if (data && data.code == 200) {
+ this.$message({
+ message: data.msg,
+ type: "success",
+ });
+ this.fetchSubscriptionList()
+
+ }
+
+ this.AlarmLoading = false
+
+ },
+ handelMetrics(metrics){
+
+ let obj = this.flatIndexList.find(item => item.id == metrics)
+ if (obj) {
+ return this.$t(obj.label);
+ }else{
+ return metrics
+ }
+ },
+ //处理告警周期
+ handelAlarmCycle(value) {
+
+
+ let obj = this.alarmCycleList.find(item => item.value == value)
+ if (obj) {
+ return this.$t(obj.label)
+ }
+
+ },
+ handleInputBlur() {
+
+ this.address = this.address.split("/")
+
+ this.address = this.address.filter(value => value !== "")
+
+ if (this.address.length > 5) {
+ this.address = this.address.slice(0, 5);
+ // console.log("不能超过五条");
+
+ // this.$message({
+ // message:"最多指定5个地址",
+ // type: "warning",
+ // });
+
+ }
+
+ this.address = this.address.join("/")
+ },
+ handleConfirm() {
+ this.reportDialogVisible = true
+ this.Text = `订阅确认`
+ },
+ handelUnsubscribe() {
+ this.reportDialogVisible = true
+ this.Text = `退订确认`
+ },
+ handleInput(value) {
+ let format = /^\d+(\.\d{0,2})?$/.test(value)
+ // 使用正则表达式验证输入的值
+ if (!format) {
+ this.formLabelAlign.region = this.formLabelAlign.region.slice(0, -1); // 不符合规定的格式,移除最后输入的字符
+ this.formLabelAlign.min = this.formLabelAlign.min.slice(0, -1); // 不符合规定的格式,移除最后输入的字符
+
+ }
+ },
+ handleMaxInput(value) {
+ let format = /^\d+(\.\d{0,2})?$/.test(value)
+ // 使用正则表达式验证输入的值
+ if (!format) {
+ this.formLabelAlign.max = this.formLabelAlign.max.slice(0, -1); // 不符合规定的格式,移除最后输入的字符
+
+ }
+ },
+ handleInputPercentage(value) {
+ let format1 = /^\d+(\.\d{0,1})?$/.test(value)
+ // 使用正则表达式验证输入的值
+ if (!format1) {
+ this.formLabelAlign.addresses = this.formLabelAlign.type.slice(0, -1); // 不符合规定的格式,移除最后输入的字符
+
+ }
+ },
+ handleInputPercentageMin(value) {
+ let format = /^\d+(\.\d{0,1})?$/.test(value)
+ // 使用正则表达式验证输入的值
+ if (!format) {
+ this.formLabelAlign.percentageMin = this.formLabelAlign.percentageMin.slice(0, -1); // 不符合规定的格式,移除最后输入的字符
+
+ }
+ },
+ handleInputPercentageMax(value) {
+ let format = /^\d+(\.\d{0,1})?$/.test(value)
+ // 使用正则表达式验证输入的值
+ if (!format) {
+ this.formLabelAlign.percentageMax = this.formLabelAlign.percentageMax.slice(0, -1); // 不符合规定的格式,移除最后输入的字符
+
+ }
+ },
+ // 日报订阅
+ handelCheckbox(value) {
+ if (value) {
+ this.formLabelAlign.channel = "Observations"
+ this.formLabelAlign.metrics = "日报订阅"
+ }
+ const checkedValues = Object.keys(this.contact).filter(key => this.contact[key]);
+ checkedValues.forEach(item => {
+ if (!this.daily.includes(item)) {
+ this.daily += item + `、`
+ }
+
+ })
+ this.formLabelAlign.noticeWay = this.daily
+
+ },
+ handelCheckboxWeekly() {
+ let checkedValuesWeekly = Object.keys(this.contactWeekly).filter(key => this.contactWeekly[key]);
+ checkedValuesWeekly.forEach(item => {
+ if (!this.WeeklyValue.includes(item)) {
+ this.WeeklyValue += item + `、`
+ }
+
+ })
+ },
+ handelCheckboxMonthly() {
+ let checkedValuesMonthly = Object.keys(this.contactMonthly).filter(key => this.contactMonthly[key]);
+ checkedValuesMonthly.forEach(item => {
+ if (!this.MonthlyValue.includes(item)) {
+ this.MonthlyValue += item + `、`
+ }
+
+ })
+ },
+ handelCheckboxMajor() {
+ let checkedValuesMajor = Object.keys(this.contactMajor).filter(key => this.contactMajor[key]);
+ checkedValuesMajor.forEach(item => {
+ if (!this.MajorValue.includes(item)) {
+ this.MajorValue += item + `、`
+ }
+
+ })
+ },
+ handelCheckboxNotice() {
+ let checkedValuesNotice = Object.keys(this.contactNotice).filter(key => this.contactNotice[key]);
+ this.modes = ""
+ checkedValuesNotice.forEach(item => {
+
+ this.modes += item + `、`
+ })
+
+ if (this.modes.charAt(this.modes.length - 1) === "、") {
+ // 删除最后一个字符
+ this.modes = this.modes.slice(0, -1);
+ }
+ this.formLabelAlign.noticeWay = this.modes
+ },
+ handelSubmit() {
+
+
+ if (this.cycle) {
+ this.newCycle = this.cycleList.find(item => item.value == this.cycle).label
+ }
+ if (this.formLabelAlign.type) {
+ this.formLabelAlign.type = this.formLabelAlign.type + `%`
+ }
+ if (this.threshold2 == `subscribe.address`) {//等于地址
+ // const regex = /[^\u4e00-\u9fa5]+/g;
+ const regex = /[\u4E00-\u9FA5]/
+
+ // 地址不能为空或输入中文字符
+ if (regex.test(this.address) || !this.address) {
+ this.$message({
+ message: this.$t(`subscribe.addressVerification`),
+ type: 'warning'
+ });
+
+ return
+ }
+
+
+ this.formLabelAlign.addresses = this.address.replace(/\//g, ",");
+
+ }
+ // 请至少选择一种通知方式
+ if (!this.formLabelAlign.noticeWay) {
+ this.$message({
+ message: this.$t(`subscribe.noticeVerification`),
+ type: 'warning'
+ });
+ return
+ }
+
+ this.dialogVisible = true
+
+
+ },
+ handelConfirm() {
+ // 该指标已订阅,不能重复订阅!
+ if (this.from.some(item=>item.metrics == this.formLabelAlign.metrics)) {
+ this.$message({
+ message: this.$t(`subscribe.repeatSubscription`),
+ type: 'warning'
+ });
+
+ return
+ }
+ if (this.formLabelAlign.cycle == "1天" || this.formLabelAlign.cycle == `subscribe.day` ) {
+ this.formLabelAlign.cycle = "1d"
+ }
+ this.fetchSubscript(this.formLabelAlign)
+
+ },
+ //订阅列表退订
+ deleteRow(rows) {
+ this.fetchSubscriptionCancel({ id: rows.id })
+ },
+ handelRadio() {
+ this.formLabelAlign.type = ""
+ this.formLabelAlign.percentageMax = ""
+ this.formLabelAlign.percentageMin = ""
+ this.formLabelAlign.max = ""
+ this.formLabelAlign.min = ""
+ this.formLabelAlign.region = ""
+ },
+ handelIndex(value) {
+ const selectedOptions = this.$refs.cascader.getCheckedNodes(value);
+
+ this.activeItem = selectedOptions[0].data
+ this.formLabelAlign.cycle = this.activeItem.alarmInterval[0]
+ this.formLabelAlign.metrics = this.activeItem.id
+ this.formLabelAlign.channel = this.activeItem.channel
+ this.address =""
+ this.formLabelAlign.addresses = ""
+
+ this.handelChoice()
+
+ },
+ handelChoice() {
+ this.indexList = subscriptionConfiguration
+ if (this.activeItem.children && this.activeItem.children[0]) {
+
+ this.threshold2 = this.activeItem.children[0].alarmType[0]
+ this.threshold2 = this.activeItem.children[0].alarmType[0]
+ this.threshold3 = this.activeItem.children[0].alarmInterval[0]
+ this.alarmType = this.activeItem.children[0].alarmType
+ this.alarmInterval = this.activeItem.children[0].alarmInterval
+
+ } else {
+ this.threshold2 = this.activeItem.alarmType[0]
+ this.threshold2 = this.activeItem.alarmType[0]
+ this.threshold3 = this.activeItem.alarmInterval[0]
+ this.alarmType = this.activeItem.alarmType
+ this.alarmInterval = this.activeItem.alarmInterval
+
+ }
+
+
+ }
+
+
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/Alarm/index.vue b/yq/src/views/Alarm/index.vue
new file mode 100644
index 0000000..49a1bed
--- /dev/null
+++ b/yq/src/views/Alarm/index.vue
@@ -0,0 +1,514 @@
+
+
+
+
+
+
+
+
{{ $t(`login.Alarm`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(item) }}
+
+
+
+
+ {{ $t(item) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`subscribe.addressWarning2`) }}
+
+
+ {{ $t(`subscribe.addressWarning`) }}
+
+
+
+ {{ item }}
+
+
+
+
{{$t(`subscribe.confirmSubmission`)}}
+
{{ $t(`subscribe.subscribedMetrics`) }}:
+
+
+
+
+
+
+ {{ handelMetrics(scope.row.metrics) }}
+
+
+
+
+
+
+
+
+
+ {{ handelAlarmCycle(scope.row.cycle) }}
+
+
+
+
+
+
+ {{$t(`subscribe.Unsubscribed`)}}
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`subscribe.indicatorSelection`)}}: {{$t(activeItem.label) }}
+
+
+
+ {{$t(`subscribe.alarmType`)}}: {{ $t(threshold2) }}
+
+
+ {{$t(`subscribe.alarmCycle`)}}: {{$t(threshold3) }}
+
+
+ {{$t(`subscribe.address`)}}: {{ address }}
+
+
+
+
+ {{$t(`subscribe.notificationMethod`)}}: {{ modes }}
+
+
+
+
+
+
+
+
+ {{$t(`subscribe.DailySubscription`)}}: {{ daily }}
+
+
+ {{$t(`subscribe.WeeklySubscription`)}}: {{ WeeklyValue }}
+
+
+ {{$t(`subscribe.monthlyReport`)}}: {{ MonthlyValue }}
+
+
+ {{$t(`subscribe.MajorSubscription`)}}: {{ MajorValue }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/BUSD/index.js b/yq/src/views/BUSD/index.js
new file mode 100644
index 0000000..9caee55
--- /dev/null
+++ b/yq/src/views/BUSD/index.js
@@ -0,0 +1,260 @@
+import * as echarts from "echarts";
+import { chartsWidth, dataLength, emptyData,handelProfitrate, handelZoom, handelLineType, handelSwitchs, handelUsdt, handelWatermark } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ BUSDLoading: false,
+ params: {
+ req: "busdVolume",
+ radius: "ETH",
+ start: "",
+ end: ""
+ },
+ tronParams: {
+ req: "",
+ radius: "ETH",
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ // data:[`sopr`,'asopr','easopr','lthsopr','sthsopr',],
+ // selected:{
+ // 'asopr': false,
+ // 'easopr': false,
+ // 'lthsopr': false,
+ // 'sthsopr': false,
+ // }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//万
+ value = `${e / 10000}W`;
+ } else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right",
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "BUSD on ETH",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ // {
+ // name: "BUSD on TRON",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // showSymbol: false,
+ // symbolSize: 5,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#f49495",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#f49495",
+ // width: "1",
+ // },
+ // data: [],
+ // yAxisIndex:1
+ // },
+
+
+ ],
+ },
+ switch3: "",
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+
+ this.fetchBUSD(this.params.req, this.params.radius)
+
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("BUSDBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("BUSDBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchBUSD(req, radius, start, end, sma) {
+ this.BUSDLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+ let busdData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.BUSDLoading = false
+ return
+ }
+
+
+ // const tron = await this.$API.getCsupply(this.tronParams.req, this.tronParams.radius, start, end)
+ // let tronData = tron.data.data
+
+ let usdtValueList = []
+ //添加水印
+ this.option = handelWatermark(this.option)
+
+ //渲染usdt
+ busdData.forEach(item => {
+ usdtValueList.push(parseInt(item.volume * 100) / 100)
+ })
+ let tronValueList = []
+ //渲染usdt USDt on TRON交易量
+ // tronData.forEach(item=>{
+ // if (!item.dateTime)return
+ // tronValueList.push(parseInt(item.volume*100)/100)
+ // })
+ this.option.series[0].data = handelUsdt(busdData, usdtValueList)
+ //判断USDt on TRON交易量 没有数据返回
+ // if (tronData[0].date){
+ // this.option.series[1].data = handelProfitrate(tronData, tronValueList)
+ // }
+
+
+ this.inCharts()
+
+ this.BUSDLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchBUSD(this.params.req, this.params.radius, this.params.start, this.params.end, this.sma)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级选择Sma
+ handelSonSma(smaNUm) {
+ this.sma = smaNUm
+ this.fetchBUSD(this.params.req, this.params.radius, this.params.start, this.params.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[3], this.inChart, this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/BUSD/index.vue b/yq/src/views/BUSD/index.vue
new file mode 100644
index 0000000..70b5a74
--- /dev/null
+++ b/yq/src/views/BUSD/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/BUSDMonitoring/index.js b/yq/src/views/BUSDMonitoring/index.js
new file mode 100644
index 0000000..c3454c9
--- /dev/null
+++ b/yq/src/views/BUSDMonitoring/index.js
@@ -0,0 +1,351 @@
+import * as echarts from "echarts";
+import { chartsWidth,dataLength, emptyData, handelBigDeals, handelZoom, handelSwitchs, handelWatermark } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ BUSDMonitoringLoading: false,
+ chartLoading: false,
+ params: {
+ req: "busdbigtx",
+ radius: "eth",
+ start: "",
+ end: ""
+ },
+ paramsCount: {
+ req: "busdbigtxcount",
+ radius: "eth",
+ },
+ tronParams: {//暂时无接口
+ // req: "tronBUSDBigTx",
+ radius: "eth",
+ },
+ tronParamsCount: {
+ // req: "tronBUSDBigTxCount",
+ radius: "eth",
+ },
+ dataCount: [],
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ // data:[`sopr`,'asopr','easopr','lthsopr','sthsopr',],
+ // selected:{
+ // 'asopr': false,
+ // 'easopr': false,
+ // 'lthsopr': false,
+ // 'sthsopr': false,
+ // }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure`),
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//万
+ value = `${e / 10000}W`;
+ } else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right",
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "BUSD on ETH",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ // {
+ // name: "BUSD on TRON",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // showSymbol: false,
+ // symbolSize: 5,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#f49495",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#f49495",
+ // width: "1",
+ // },
+ // data: [],
+ // yAxisIndex: 1
+ // },
+
+
+ ],
+ },
+ tabelloading: false,
+ tableData: [],
+ page: 1,
+ limit: 50,
+ search: "",
+ currentPage4: 1,
+ tronTabelloading: false,
+ tronTableData: [],
+ tronTotalPage: 0,
+ tronCurrentPage4: 1,
+ tronPage: 1,
+ tronLimit: 50,
+ totalPage: 0,
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+
+ this.fetchBusdbigtx(this.params.req, this.params.radius, this.search, this.params.start, this.params.end, this.page, this.limit)
+ // this.fetchTronbigtx(this.tronParams.req, this.tronParams.radius,this.search, this.params.start, this.params.end, this.page, this.limit)
+ this.fetchBusdbigtxcount()
+
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("BUSDMonitoringBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("BUSDMonitoringBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ //请求页面tabel数据 大额交易监控表格
+ async fetchBusdbigtx(req, radius, search, start, end, page, limit) {
+ this.BUSDMonitoringLoading = true
+ //大额交易监控表格
+ const { data } = await this.$API.getBigDeals2(req, radius, search, start, end, page, limit);
+ this.tableData = data.data.data
+ this.totalPage = data.data.totalPage
+ this.currentPage4 = page
+ this.BUSDMonitoringLoading = false
+ },
+ //请求页面tabel数据 BUSD on TRON大额交易 暂时无接口
+ // async fetchTronbigtx(req,radius, search, start, end, page, limit) {
+
+ // //大额交易监控表格
+ // const { data } = await this.$API.getBigDeals2( req,radius,search, start, end, page, limit);
+ // this.tronTableData = data.data.data
+
+ // this.tronTotalPage = data.data.totalPage
+ // this.tronCurrentPage4 = page
+
+ // },
+ //请求折线图数据
+ async fetchBusdbigtxcount(start, end, type, sma) {
+ this.chartLoading = true
+
+ // 大额交易监控曲线图
+ const { data } = await this.$API.getBigDealsCount(
+ this.paramsCount.req,
+ this.paramsCount.radius,
+ start,
+ end,
+ type,
+ sma
+ );
+ this.dataCount = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.chartLoading = false
+ return
+ }
+ //添加水印
+ this.option = handelWatermark(this.option)
+
+ let numValueList = []
+ this.dataCount.forEach(item => {
+ numValueList.push(parseInt(item.num * 100) / 100)
+ });
+ this.option.series[0].data = handelBigDeals(this.dataCount, numValueList)
+ // BUSD on TRON大额交易 曲线图
+ // const list = await this.$API.getBigDealsCount(
+ // this.tronParamsCount.req,
+ // this.tronParamsCount.radius,
+ // start,
+ // end
+ // );
+ // let tronData = list.data.data
+ // let tronValueList = []
+ // tronData.forEach(item => {
+ // tronValueList.push(parseInt(item.num * 100) / 100)
+ // });
+ // this.option.series[1].data = handelBigDeals(tronData, tronValueList)
+ this.inCharts();
+ this.chartLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ let type
+ this.fetchBusdbigtxcount(this.params.start, this.params.end, type, this.sma)
+ },
+ //处理表格里的时间
+ formatTime(value) {
+ let newTime = value.split(".")[0].replace("T", " ");
+ return newTime;
+ },
+
+ //点击的改变页数
+ handleCurrentChange(value) {
+ this.page = value;
+ this.fetchBusdbigtx(this.params.req, this.params.radius, this.search, this.params.start, this.params.end, this.page, this.limit)
+ },
+ //改变每页条数
+ handleSizeChange(val) {
+ this.page = 1;
+ this.limit = val;
+ this.fetchBusdbigtx(this.params.req, this.params.radius, this.search, this.params.start, this.params.end, this.page, this.limit)
+
+ },
+ //双击表格单元格复制
+ cellDblclick(row, column, cell, event) {
+ if (event.type === "dblclick") {
+ var save = (e) => {
+ e.clipboardData.setData("text/plain", event.target.innerText);
+ e.preventDefault(); //阻止默认行为
+ };
+ document.addEventListener("copy", save);
+ document.execCommand("copy");
+ document.removeEventListener("copy", save);
+ }
+ this.$message({ message: this.$t(`home.copy`), type: "success" }); //加提示
+ },
+
+ //点击的改变页数 Tron
+ // handleCurrentChangeTron(value) {
+ // this.tronPage = value;
+ // this.fetchTronbigtx(this.tronParams.req, this.tronParams.radius,this.search, this.params.start, this.params.end, this.tronPage, this.tronLimit)
+ // },
+ //改变每页条数 Tron
+ // handleSizeChangTron(val) {
+ // this.tronPage = 1;
+ // this.tronLimit = val;
+ // this.fetchTronbigtx(this.tronParams.req, this.tronParams.radius,this.search, this.params.start, this.params.end, this.tronPage, this.tronLimit)
+
+ // },
+ //父级选择Sma
+ handelSonSma(smaNUm) {
+ this.sma = smaNUm
+ let type
+ this.fetchBusdbigtxcount(this.params.start, this.params.end, type, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[3], this.inChart, this.start, this.end)
+
+ },
+
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/BUSDMonitoring/index.vue b/yq/src/views/BUSDMonitoring/index.vue
new file mode 100644
index 0000000..1914197
--- /dev/null
+++ b/yq/src/views/BUSDMonitoring/index.vue
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+ {{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
{{$t(`menu2.BUSDMonitoring2`)}}
+
+
+
+ {{$t(`home.table`)}}
+ {{ $t(`home.copyTabel`) }}
+
+
+
+
+
+ {{ formatTime(scope.row.date) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/BiAnController.vue b/yq/src/views/BiAnController.vue
new file mode 100644
index 0000000..3ea4a04
--- /dev/null
+++ b/yq/src/views/BiAnController.vue
@@ -0,0 +1,1464 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`bian.oneMinutes`)}}
+ {{$t(`bian.minutes15`)}}
+ {{$t(`bian.hours4`)}}
+ {{$t(`bian.day`)}}
+ {{$t(`bian.weekly`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dynamicTime || 0 }}
+
+ {{$t(`bian.open`)}}:
+ {{
+ dynamicValue[1] || 0
+ }}
+
+
+ {{$t(`bian.high`)}}:
+ {{
+ dynamicValue[4] || 0
+ }}
+
+
+ {{$t(`bian.low`)}}:
+ {{
+ dynamicValue[3] || 0
+ }}
+
+
+ {{$t(`bian.closed`)}}:
+ {{
+ dynamicValue[2] || 0
+ }}
+
+
+ {{$t(`bian.volume`)}}:
+ {{
+ dynamicBuyVolume || 0
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{$t(`bian.assets`)}}
+
{{ currencyAssets }}
+
{{$t(`bian.interval`)}}
+
{{$t(`bian.Real`)}}
+
{{$t(`bian.introduce`)}}
+
{{ introduce }}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/BigDealsSummary/index.js b/yq/src/views/BigDealsSummary/index.js
new file mode 100644
index 0000000..a1955e0
--- /dev/null
+++ b/yq/src/views/BigDealsSummary/index.js
@@ -0,0 +1,397 @@
+import * as echarts from "echarts";
+export default {
+ data() {
+ return {
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i <= params.length - 1; i++) {
+ // res += `${params[i].marker} ${params[i].value[1]} ${params[i].seriesName}`;
+ // }
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ type: "category",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ },
+ yAxis: [
+ {
+ name: this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ },
+ ],
+ dataZoom: [
+ {
+ type: "slider",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ series: [
+ {
+ type: "line",
+ name: "",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+
+ data: [],
+ },
+ ],
+ },
+ params: {
+ req: "",
+ radius: "eth",
+ },
+ paramsCount: {
+ req: "usdcbigtxcount",
+ radius: "eth",
+ },
+ searchParams: {
+ search: "",
+ start: "",
+ end: ""
+ },
+ times: {
+ start: "",
+ end: ""
+ },
+ tabelloading: false,
+ tableData: [],
+ usdcbigtxLoading: false,
+ dialog: false,
+ tabelUrl: "",
+ color: "",
+ introduce: "",
+ valueList: [
+ {
+ value: 500,
+ label: "amount > 500",
+ },
+ {
+ value: 1500,
+ label: "amount > 1500",
+ },
+ {
+ value: 5000,
+ label: "amount > 5000",
+ },
+ {
+ value: 10000,
+ label: "amount > 10000",
+ },
+ {
+ value: 15000,
+ label: "amount > 15000",
+ },
+ ],
+ state: "",
+ value: "",
+ tabelParams: {
+ req: "",
+ address: "",
+ txId: "",
+ type: "",
+ },
+ animate: false,
+ notice: "",
+ amountTxid: "",
+ amountTime: "",
+ dialogVisible: false,
+ dialogData: [],
+ dialogDate: "",
+ noticeList: [],
+ setInTimeout: null,
+ setInTime: null,
+ page:1,
+ limit:50,
+ currentPage4:1,
+ totalPage:0,
+ search:""
+
+ }
+ },
+ mounted() {
+
+ this.$addStorageEvent(1, "buttonShow", false)
+ let menuObj = localStorage.getItem("params");
+ this.params.req = JSON.parse(menuObj).componentReq;
+ this.introduce = JSON.parse(menuObj).introduce;
+ this.show = localStorage.getItem("currentTabComponent");
+ let obj = localStorage.getItem("src");
+ // this.color = JSON.parse(obj).color;
+ window.addEventListener("setItem", () => {
+ let menuObj = localStorage.getItem("params");
+ this.params.req = JSON.parse(menuObj).componentReq;
+ this.introduce = JSON.parse(menuObj).introduce;
+ let obj = localStorage.getItem("src");
+ // this.color = JSON.parse(obj).color;
+ });
+ this.fetchUsdtbigtxcount(this.paramsCount.req, this.paramsCount.radius)
+ this.fetchUsdtbigtx(this.params.req, this.params.radius,this.search,this.searchParams.start,this.searchParams.end,this.page,this.limit)
+
+
+ //通知栏滚动
+ if (this.setInTime || this.setInTimeout) {
+ clearInterval(this.setInTime);
+ clearTimeout(this.setInTimeout)
+ }
+ },
+
+ methods: {
+ initCharts() {
+ this.myChart = echarts.init(document.getElementById("usdcbigtx"));
+ // this.myChart.clear();
+ this.myChart.setOption(this.option);
+ // 当窗口或者大小发生改变时执行resize,重新绘制图表
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ //请求页面tabel数据
+ async fetchUsdtbigtx(req, radius, search, start, end,page,limit) {
+ this.usdcbigtxLoading = true
+ const { data } = await this.$API.getBigDeals2(req, radius, search,start, end,page,limit);
+
+ this.tableData = data.data.data
+ console.log( data,56565);
+ this.totalPage=data.data.totalPage
+ this.noticeList = [...data.data.data]
+
+ //通知栏滚动
+ if (this.setInTime || this.setInTimeout) {
+ clearInterval(this.setInTime);
+ clearTimeout(this.setInTimeout)
+ }
+
+ this.setInTime= setInterval(() => {
+ this.showMarquee(JSON.parse(JSON.stringify(this.tableData)))
+ }, 3000);
+ this.currentPage4 = page
+ this.usdcbigtxLoading = false
+ },
+ //请求折线图数据
+ async fetchUsdtbigtxcount(req, radius, start, end, type) {
+ // this.usdcbigtxLoading = true
+ const { data } = await this.$API.getBigDealsCount(
+ req,
+ radius,
+ start,
+ end,
+ type
+ );
+ this.dataCount = data.data
+ this.option.series[0].data.length = 0;
+ this.option.xAxis.data.length = 0;
+ this.dataCount.forEach(item => {
+ let time = item.dataTime.split("T")[0];
+ this.option.xAxis.data.push(time);
+ this.option.series[0].data.push(item.num);
+ })
+ this.option.series[0].name = req
+ // this.option.series[0].itemStyle.color = this.color;
+ // this.option.series[0].lineStyle.color = this.color;
+ this.initCharts();
+ // this.usdcbigtxLoading = false
+ },
+ //处理表格里的时间
+ formatTime(value) {
+ let newTime = value.split(".")[0].replace("T", " ");
+ return newTime;
+ },
+ //单独给点击单元格加class名字
+ cellClass({ row, column, rowIndex, columnIndex }) {
+ if (
+ column.label == "vout" ||
+ column.label == "txId" ||
+ column.label == "fromAddress" ||
+ column.label == "toAddress"
+ ) {
+ return "test";
+ }
+ },
+ //点击表格tabel 弹窗详情页
+ handleClick(row, column) {
+ this.tabelUrl = "";
+
+ this.dialogLoading = true;
+
+ if (column.label == "fromAddress") {
+ this.tabelParams.address = row.fromAddress;
+ this.tabelParams.type = "address";
+ } else if (column.label == "toAddress") {
+ this.tabelParams.address = row.toAddress;
+ this.tabelParams.type = "address";
+ } else if (column.label == "txId") {
+ this.tabelParams.txId = row.txId;
+ this.tabelParams.address = row.txId;
+ this.tabelParams.type = "tx";
+ } else if (column.label == "vout") {
+ this.tabelParams.address = row.vout;
+ this.tabelParams.type = "address";
+ }
+
+ this.tabelUrl = ` https://bitcoinexplorer.org/${this.tabelParams.type}/${this.tabelParams.address}`;
+ // this.dialogTableVisible=true
+ this.dialog = true;
+ this.dialogLoading = false;
+
+ // window.open(
+ // ` https://bitcoinexplorer.org/${this.tabelParams.type}/${this.tabelParams.address}`,
+ // "_top"
+ // );
+ // this.fetchTabel(this.tabelParams.req,this.params.radius,this.tabelParams.address,this.tabelParams.txId)
+ },
+ //关闭弹窗
+ handelClose() {
+ this.dialog = false;
+ },
+ //下拉框选择
+ handelChang(e) {
+ this.page =1
+ // this.searchParams.search = e
+ this.search=e
+ this.fetchUsdtbigtx(this.params.req, this.params.radius, this.value, this.searchParams.start, this.searchParams.end,this.page,this.limit)
+ this.state = ""
+ },
+ handelSearch() {
+ this.page =1
+ //搜索框输入参数
+ this.search= this.state
+ this.fetchUsdtbigtx(this.params.req, this.params.radius, this.state,this.searchParams.start, this.searchParams.end,this.page,this.limit)
+ // this.searchParams.search = this.state
+ // this.state = ""
+ this.value = ""
+ },
+ //获取父级时间
+ handelSonTime(start, end) {
+ this.page =1
+ this.searchParams.start = start;
+ this.searchParams.end = end;
+ this.fetchUsdtbigtx(this.params.req, this.params.radius,this.search,this.searchParams.start,this.searchParams.end,this.page,this.limit)
+ this.fetchUsdtbigtxcount(this.paramsCount.req, this.paramsCount.radius, this.searchParams.start, this.searchParams.end)
+
+ },
+ //点击滚动通知栏的查看详情
+ handelDetails() {
+ this.dialogVisible = true;
+
+ this.dialogData = this.noticeList.find((item) => {
+ return item.txId == this.amountTxid;
+ });
+ this.dialogDate = this.dialogData.date.split(".")[0].replace("T", " ");
+ },
+ // 通知栏滚动
+ showMarquee(data) {
+ this.animate = true;
+
+ // let rollingData = data
+ // setTimeout
+ // console.log(rollingData,633);
+ if (this.setInTimeout) {
+ clearTimeout(this.setInTimeout)
+ }
+ this.setInTimeout = setTimeout(() => {
+ this.amountTxid = this.noticeList[0].txId;
+ this.amountTime = this.noticeList[0].date
+ .split(".")[0]
+ .replace("T", " ");
+ this.notice = this.noticeList[0].amount.toFixed(3);
+ // this.currencyName = rollingData[0].abbr;
+ this.noticeList.push(this.noticeList[0]);
+ this.noticeList.shift();
+ this.animate = false;
+ // console.log(rollingData,56565);
+ }, 500);
+
+
+ },
+
+ //点击的改变页数
+ handleCurrentChange(value) {
+ this.page = value;
+ this.fetchUsdtbigtx(this.params.req, this.params.radius,this.search,this.searchParams.start,this.searchParams.end,this.page,this.limit)
+
+
+ },
+ //改变每页条数
+ handleSizeChange(val) {
+ this.page = 1;
+ this.limit = val;
+ this.fetchUsdtbigtx(this.params.req, this.params.radius,this.search,this.searchParams.start,this.searchParams.end,this.page,this.limit)
+
+
+ },
+
+
+
+ },
+
+ beforeDestroy() {
+ clearInterval(this.setInTime);
+ clearTimeout(this.setInTimeout)
+ console.log("离开");
+ },
+
+
+}
\ No newline at end of file
diff --git a/yq/src/views/BigDealsSummary/index.vue b/yq/src/views/BigDealsSummary/index.vue
new file mode 100644
index 0000000..8421556
--- /dev/null
+++ b/yq/src/views/BigDealsSummary/index.vue
@@ -0,0 +1,425 @@
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`home.tradingVolume`) }}:{{ notice || 0 }}
+
+
+ {{ $t(`home.tradingHours`) }}:{{ amountTime || 0 }}
+ {{
+ $t(`home.checkDetails`)
+ }}
+
+
+
+
+
+
+
+
+ {{ $t(`home.date`) }}: {{ dialogDate }}
+
+
+ {{ $t(`home.number`) }}:
+ {{ dialogData.amount }}
+
+
+ {{ $t(`home.address`) }}:
+ {{
+ (dialogData.vout = dialogData.vout
+ ? dialogData.vout
+ : $t(`home.no`))
+ }}
+
+
+
+ {{ $t(`home.height`) }}:
+ {{ dialogData.height }}
+
+
+
+ {{ $t(`home.transaction`) }}:
+ {{ dialogData.txId }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{$t(`home.searchResults`)}}
+
+
+
+ {{$t(`home.table`)}}
+
+
+
+
+
+ {{ formatTime(scope.row.date) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`home.shutDown`) }} X
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/CDD/index.js b/yq/src/views/CDD/index.js
new file mode 100644
index 0000000..8199d0b
--- /dev/null
+++ b/yq/src/views/CDD/index.js
@@ -0,0 +1,811 @@
+import * as echarts from "echarts";
+import { getCdd2} from "@/api/realTimeData"
+import { handelCddData,emptyData,dataLength,handelBtcPrice ,chartsWidth, getDateArray, handelZoom, handelLineType, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ cddLoading: false,
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i <= params.length - 1; i++) {
+ // res += `${params[i].marker} ${params[i].value[1]} ${params[i].seriesName}`;
+ // }
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ },
+ yAxis: [
+ {
+ position: "left",
+ type: "value",
+ // min: `dataMin`,
+ // max: `dataMax`,
+ axisLabel: {
+ formatter: function (value) {
+ let data
+ if (value > 10000000) {
+ data = `${(value / 10000000)} KW`
+ } else if (value > 1000000) {
+ data = `${(value / 1000000)} M`
+ } else if (value / 10000) {
+ data = `${(value / 10000)} W`
+ }
+ return data
+ }
+ }
+ },
+ {
+ position: "right",
+ // type: "log",
+ splitNumber: "5",
+ show: true,
+ },
+ {
+ position: "right",
+ // type: "log",
+ splitNumber: "5",
+ show: false,
+ },
+ {
+ position: "right",
+ // type: "log",
+ splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ type: "slider",
+ start: 10,
+ end: 100,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "CDD",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "CDD(CE)",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#379f71",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#379f71",
+ width: "1",
+ },
+ data: [],
+ },
+ // {
+ // name: "saCDD",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#9a60af",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#9a60af",
+ // width: "1",
+ // },
+ // yAxisIndex: 2,
+ // data: [],
+ // },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ labelLayout: {
+ hideOverlap: true,
+ moveOverlap: "shiftY"
+ },
+ data: [],
+ //绘制右侧Y轴
+ // markLine: {
+ // symbol: ["none", "none"], //去掉箭头
+ // itemStyle: {
+ // normal: {
+ // lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ // },
+ // },
+ // labelLayout:{
+ // hideOverlap:true,
+ // moveOverlap:"shiftY"
+ // },
+ // // lineStyle:{
+ // // opacity:0
+ // // },
+ // label: {
+ // formatter: "{b}",
+ // fontSize: 10,
+ // color: "rgba(0,0,0,0.8)",
+ // align: "left",
+ // },
+ // data: [
+ // // {
+ // // name: "$0.40",
+ // // yAxis: 0.4,
+ // // },
+ // // {
+ // // name: "$0.80",
+ // // yAxis: 0.8,
+ // // },
+ // {
+ // name: "$2",
+ // yAxis: 2,
+ // position: 'insideEndTop',
+ // },
+ // {
+ // name: "$6",
+ // yAxis: 6,
+ // position: 'insideEndTop',
+ // },
+ // {
+ // name: "$10",
+ // yAxis: 10,
+ // position: 'insideEndTop',
+ // },
+ // {
+ // name: "$15",
+ // yAxis: 15,
+
+ // },
+ // {
+ // name: "$20",
+ // yAxis: 20,
+
+ // },
+ // {
+ // name: "$25",
+ // yAxis: 25,
+
+ // },
+ // {
+ // name: "$30",
+ // yAxis: 30,
+
+ // },
+ // {
+ // name: "$35",
+ // yAxis: 35,
+ // },
+ // {
+ // name: "$40",
+ // yAxis: 40,
+
+ // },
+ // {
+ // name: "$80",
+ // yAxis: 80,
+
+ // },
+ // {
+ // name: "$200",
+ // yAxis: 200,
+
+ // },
+ // {
+ // name: "$600",
+ // yAxis: 600,
+ // },
+ // {
+ // name: "$0K",
+ // yAxis: 0,
+ // },
+ // {
+ // name: "$5K",
+ // yAxis: 5000,
+ // },
+ // {
+ // name: "$10K",
+ // yAxis: 10000,
+ // },
+ // {
+ // name: "$15K",
+ // yAxis: 15000,
+ // },
+ // {
+ // name: "$20K",
+ // yAxis: 20000,
+ // },
+ // {
+ // name: "$25K",
+ // yAxis: 25000,
+ // },
+ // {
+ // name: "$30K",
+ // yAxis: 30000,
+ // },
+ // {
+ // name: "$50K",
+ // yAxis: 50000,
+ // },
+ // {
+ // name: "$70K",
+ // yAxis: 70000,
+ // },
+ // {
+ // name: "$100K",
+ // yAxis: 100000,
+ // },
+ // ],
+ // },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 2,
+ // data: [],
+ // },
+
+ ],
+ },
+ option2: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i <= params.length - 1; i++) {
+ // res += `${params[i].marker} ${params[i].value[1]} ${params[i].seriesName}`;
+ // }
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ },
+ yAxis: [
+ {
+ position: "left",
+ type: "value",
+ // min: `dataMin`,
+ // max: `dataMax`,
+ axisLabel: {
+ formatter: function (value) {
+ let data
+ if (value > 10000000) {
+ data = `${(value / 10000000)} KW`
+ } else if (value > 1000000) {
+ data = `${(value / 1000000)} M`
+ } else if (value / 10000) {
+ data = `${(value / 10000)} W`
+ }
+ return data
+ }
+ }
+ },
+ {
+ position: "right",
+ // type: "log",
+ splitNumber: "5",
+ show: true,
+ },
+ {
+ position: "right",
+ // type: "log",
+ splitNumber: "5",
+ show: false,
+ },
+ {
+ position: "right",
+ // type: "log",
+ splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ type: "slider",
+ start: 10,
+ end: 100,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "CDD",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "eaCDD",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#379f71",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#379f71",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ labelLayout: {
+ hideOverlap: true,
+ moveOverlap: "shiftY"
+ },
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 2,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ req: "CDD",
+ radius: "BTC",
+ start: "",
+ end: ""
+ },
+ btcPrice: [],
+ priceTime: "",
+ time: "",
+ cddValueList: [],
+ priceValueList: [],
+ newPriceData: [],
+ eacddValueList: [],
+ sacddValueList: [],
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+ dataSelection: [
+ {
+ value: "1d",
+ label: "home.day1",
+ disabled:false,
+ authority:"guest",
+ grade:1,
+ },
+ {
+ value: "realTime",
+ label: "home.realTimeData",
+ disabled:false,
+ authority:"vip",
+ grade:4,
+ },
+ ],
+ realTimeData:"",
+
+
+
+ }
+ },
+ mounted() {
+
+ this.fetchCdd(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+ },
+ methods: {
+ handleSelect(activeValue){
+ if (activeValue=="1d") {
+ this.realTimeData = false
+ this.fetchCdd(this.params.req, this.params.radius)
+ }else{
+ this.realTimeData = true
+ this.fetchCdd2()
+ }
+ },
+ inChart() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("cddBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("cddBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+
+ inChart2() {
+ if (this.myChart2 == null) {
+ this.myChart2 = echarts.init(document.getElementById("cddBox"));
+ }
+ this.option2 = handelZoom(this.myChart2, this.option2, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart2.setOption(this.option2);
+ chartsWidth("cddBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart2) this.myChart2.resize();
+ });
+ },
+ async fetchCdd2(){
+ this.cddLoading = true
+ const { data } = await getCdd2()
+ console.log(Cdd2Data,"几佛教覅");
+ let Cdd2Data = data.data
+ if (!Cdd2Data) {
+ this.cddLoading = false
+ this.option.series.forEach(item => {
+ item.data =[]
+ })
+ this.inChart()
+ return
+ }
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.cddLoading = false
+ return
+ }
+
+ this.option2 = handelWatermark(this.option2)
+ let cdd =[]
+ let eacdd =[]
+ let xAxisData=[]
+ let price=[]
+ Cdd2Data.forEach(item=>{
+ item.date=`${item.date.split("T")[0]} ${
+ item.date.split("T")[1].split(`.`)[0]
+ } `;
+ cdd.push(item.cdd.toFixed(2))
+ eacdd.push(item.eacdd.toFixed(2))
+ xAxisData.push(item.date)
+ price.push(item.price.toFixed(2))
+ })
+
+ this.option2.xAxis.data = xAxisData
+ this.option2.series[0].data = cdd
+ this.option2.series[1].data = eacdd
+ this.option2.series[2].data = price
+
+ this.myChart.clear()
+ this.inChart2()
+ this.cddLoading = false
+
+ },
+ //请求渲染数据
+ async fetchCdd(req, radius, start, end, sma) {
+ this.cddLoading = true
+ const { data } = await this.$API.getMa370(req, radius, start, end, sma)
+ this.cddData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.cddLoading = false
+ return
+ }
+ this.start = this.cddData[0].date.split("T")[0]
+ this.end = this.cddData[this.cddData.length - 1].date.split("T")[0]
+
+ const price = await this.$API.getBtcPrice2(radius, this.start, this.end );
+
+ let priceData = price.data.data
+ //添加水印
+ this.option = handelWatermark(this.option)
+
+
+ let priceList=[]
+ priceData.forEach(item=>{
+ priceList.push(item.value.toFixed(2))
+ })
+ let cddValueList = []
+ let eacddValueList = []
+ let sacddValueList = []
+ let timeList=[]
+
+ this.cddData.forEach((item,index)=> {
+
+ // console.log(item.date);
+ cddValueList.push(Number(item.cdd.toFixed(2)))
+ eacddValueList.push(Number(item.eacdd.toFixed(2)))
+ sacddValueList.push(Number(item.sacdd.toFixed(2)))
+ timeList.push(item.date.split(`T`)[0])
+ // if (priceData[index].value) {
+ // priceList.push(priceData[index].value)
+ // }
+
+ // priceList.push(priceData[index].value)
+
+
+
+ })
+ this.option.xAxis.data= timeList
+ this.option.series[0].data=cddValueList
+ this.option.series[1].data=eacddValueList
+ // this.option.series[2].data=sacddValueList
+ if (priceList[0] !== undefined) {
+ this.option.series[2].data=priceList
+ }
+ if (this.myChart2) {
+ this.myChart2.clear()
+ }
+
+ this.inChart()
+
+ this.cddLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+
+ //父级时间
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchCdd(this.params.req, this.params.radius, this.params.start, this.params.end, this.sma)
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice(radius, this.option.series[3], this.start, this.end, this.inChart, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice(radius, this.option.series[4], this.start, this.end, this.inChart, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.sma = smaDataList
+
+ this.fetchCdd(this.params.req, this.params.radius, this.params.start, this.params.end, this.sma)
+
+ this.$addStorageEvent(1, "sma", this.sma);
+ this.realTimeData = false
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[3], this.inChart,this.start, this.end)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/CDD/index.vue b/yq/src/views/CDD/index.vue
new file mode 100644
index 0000000..c6355e4
--- /dev/null
+++ b/yq/src/views/CDD/index.vue
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+ CDD = value · lifespan [days] (of all spent outputs )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/CDDETH/index.js b/yq/src/views/CDDETH/index.js
new file mode 100644
index 0000000..e334335
--- /dev/null
+++ b/yq/src/views/CDDETH/index.js
@@ -0,0 +1,361 @@
+import * as echarts from "echarts";
+import { getCddEth, } from "../../api/pages"
+import { chartsWidth,emptyData, dataLength,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ CDDEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}E `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Coin Days Destroyed",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchCddEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("CDDEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("CDDEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchCddEth(params) {
+ this.CDDEthLoading = true
+ const { data } = await getCddEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.CDDEthLoading = false
+ return
+ }
+ let CDDEthData = data.data
+ this.start = CDDEthData[0].date.split("T")[0]
+ this.end = CDDEthData[CDDEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // // //移动平均线没值 才渲染正常价格数据
+ // // if (this.start && !this.fatherSmaData[0]) {
+ // // this.ethFlag = true
+ // // this.handelSonEthPrice("ETH", true);
+ // // this.$addStorageEvent(1, "ethFlag", JSON.stringify(true));
+ // // }
+ // // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // // if (this.fatherSmaData[0] && this.start) {
+ // // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ // // }
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ CDDEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(CDDEthData, ValueList)
+
+
+ this.inCharts()
+
+ this.CDDEthLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchCDDEthIndicator(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchCddEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/CDDETH/index.vue b/yq/src/views/CDDETH/index.vue
new file mode 100644
index 0000000..65b3458
--- /dev/null
+++ b/yq/src/views/CDDETH/index.vue
@@ -0,0 +1,48 @@
+
+
+
+
+ CDD = value · lifespan [days] (of all spent outputs )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/DaysNeedle.vue b/yq/src/views/DaysNeedle.vue
new file mode 100644
index 0000000..fe6643b
--- /dev/null
+++ b/yq/src/views/DaysNeedle.vue
@@ -0,0 +1,294 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatTime(scope.row.date) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/ETH.vue b/yq/src/views/ETH.vue
new file mode 100644
index 0000000..d92b13e
--- /dev/null
+++ b/yq/src/views/ETH.vue
@@ -0,0 +1,654 @@
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/Fees/index.js b/yq/src/views/Fees/index.js
new file mode 100644
index 0000000..907501f
--- /dev/null
+++ b/yq/src/views/Fees/index.js
@@ -0,0 +1,497 @@
+
+import * as echarts from "echarts";
+import { chartsWidth,emptyData, handelZoom,dataLength, handelProfitrate, handelLineType, handelSwitchs, handelSmaData, getDateArray, handelWatermark, fetchBtcPrice, fetchEthPrice } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ ETHvolumeLoading: false,
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i <= params.length - 1; i++) {
+ // res += `${params[i].marker} ${params[i].value[1]} ${params[i].seriesName}`;
+ // }
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ },
+ yAxis: [
+ {
+ position: "left",
+ type: "value",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${value / 10000} W`
+ }
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ min: "dataMin",
+ max: "dataMax",
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Transaction Volume",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Transaction Fee",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#e73f32",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#e73f32",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+ {
+ name: "EIP1559 burnt fees",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#9dd3e8",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#9dd3e8",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 3,
+ // data: [],
+ // //绘制右侧Y轴
+ // markLine: {
+ // symbol: ["none", "none"], //去掉箭头
+ // itemStyle: {
+ // normal: {
+ // lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ // },
+ // },
+ // // lineStyle:{
+ // // color:"red"
+ // // },
+
+ // label: {
+ // formatter: "{b}",
+ // fontSize: 10,
+ // color: "rgba(0,0,0,0.8)",
+ // align: "left",
+ // },
+ // data: [
+ // // {
+ // // name: "0",
+ // // yAxis: 0,
+ // // },
+ // // {
+ // // name: "$40W",
+ // // yAxis: 400000,
+ // // },
+ // {
+ // name: "$70W",
+ // yAxis: 700000,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+
+ // {
+ // name: "$10W",
+ // yAxis: 100000,
+ // },
+ // {
+ // name: "$100W",
+ // yAxis: 1000000,
+ // // position: ['100%', '50'],
+ // },
+ // {
+ // name: "$120W",
+ // yAxis: 1200000,
+ // },
+
+ // {
+ // name: "$140W",
+ // yAxis: 1400000,
+ // },
+ // ],
+ // },
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 4,
+ data: [],
+ },
+
+
+ ],
+ },
+ params: {
+ req: "ETHVolume",
+ radius: "eth"
+ },
+ feesParams: {
+ req: "ETHFees",
+ radius: "eth"
+ },
+ volumeData: [],
+ feesData: [],
+ times: {
+ start: "",
+ end: ""
+
+ },
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+
+ this.fetchVolume(this.params.req, this.params.radius)
+ this.fetchFees(this.feesParams.req, this.feesParams.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ inChart() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("ETHvolumeBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("ETHvolumeBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ //请求交易量数据渲染
+ async fetchVolume(req, radius, start, end, sma) {
+ this.ETHvolumeLoading = true
+ const { data } = await this.$API.getVolume(req, radius, start, end, sma)
+ this.volumeData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChart, this)
+ if (noData) {
+ this.ETHvolumeLoading = false
+ return
+ }
+
+
+
+ this.start = this.volumeData[0].date.split("T")[0]
+ this.end = this.volumeData[this.volumeData.length - 1].date.split("T")[0]
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // //移动平均线没值 才渲染正常价格数据
+ // if (this.start ) {
+ // this.handelSonEthPrice("ETH", false);
+
+ // }
+ // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // if (this.fatherSmaData[0] && this.start) {
+ // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC",this.btcFlag)
+ // }
+
+ // })
+
+ // this.handelSonEthPrice("ETH", false);
+ //添加水印
+ this.option = handelWatermark(this.option)
+
+ let volumeValueList = []
+ let priceList = []
+ this.volumeData.forEach(item => {
+ let time = item.date.split("T")[0]
+ this.option.xAxis.data.push(time)
+ volumeValueList.push(Number(item.volume.toFixed(2)))
+ priceList.push(Number(item.price.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(this.volumeData, volumeValueList)
+ this.option.series[3].data = handelProfitrate(this.volumeData, priceList)
+ this.inChart()
+ this.ETHvolumeLoading = false
+ },
+ //请求交易费数据渲染
+ async fetchFees(req, radius, start, end, sma) {
+ const { data } = await this.$API.getVolume(req, radius, start, end, sma)
+ this.feesData = data.data
+
+ let feesValueList = []
+ let burntsValueList = []
+
+ this.feesData.forEach(item => {
+ feesValueList.push(Number(item.fees.toFixed(2)))
+ burntsValueList.push(Number(item.burnts.toFixed(2)))
+
+ })
+ this.option.series[1].data = handelProfitrate(this.feesData, feesValueList)
+ this.option.series[2].data = handelProfitrate(this.feesData, burntsValueList)
+
+ this.inChart()
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchVolume(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.fetchFees(this.feesParams.req, this.feesParams.radius, this.times.start, this.times.end, this.sma)
+ // this.handelSonBtcPrice("BTC",true)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ //父级BTC默认是true 在ETH页面btcFlag 取反才能正常点击父级就渲染
+ // if (this.params.radius == "eth") {
+ // console.log("简历啊");
+ // this.btcFlag = !flag;
+ // } else {
+ // this.btcFlag = flag;
+ // }
+ this.btcFlag = flag;
+ fetchBtcPrice("BTC", this.option.series[3], this.start, this.end, this.inChart, this, this.btcFlag)
+
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+
+ this.ethFlag = !flag
+
+ fetchEthPrice("ETH", this.option.series[3], this.start, this.end, this.inChart, this, this.ethFlag, true)
+
+
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+
+ this.sma = smaDataList
+ this.fetchVolume(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.fetchFees(this.feesParams.req, this.feesParams.radius, this.times.start, this.times.end, this.sma)
+
+
+ this.$addStorageEvent(1, "sma", this.sma);
+
+
+
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList,this.option.series[3],this.inChart,this.start, this.end)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/yq/src/views/Fees/index.vue b/yq/src/views/Fees/index.vue
new file mode 100644
index 0000000..f9963bb
--- /dev/null
+++ b/yq/src/views/Fees/index.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/GDP1/index.js b/yq/src/views/GDP1/index.js
new file mode 100644
index 0000000..ee56437
--- /dev/null
+++ b/yq/src/views/GDP1/index.js
@@ -0,0 +1,424 @@
+import * as echarts from "echarts";
+import { getGDP, getGDPChart } from "../../api/pages"
+import { chartsWidth, emptyData, handelLineType, handelProfitrate, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ GDPLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // res += `${params[i].marker} ${params[i].seriesName}      $${params[i].value} `
+
+
+ // }
+
+
+ // return res;
+ // },
+
+ },
+ // legend: {
+ // right: "100",
+ // top: "10",
+
+
+ // },
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "GDP",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "2",
+ },
+ data: [],
+ },
+
+
+ ],
+ },
+ tableData: [{
+ date: "",
+ symbol: "",
+ value: "",
+ }],
+ params: {
+ start: "",
+ end: "",
+ symbol: "pce",
+ },
+ chartLoading: false,
+ timer: null,
+ zoomStart: 0,
+ zoomEnd: 0,
+ activeName: "",
+ activeName:"Personal consumption expenditures",
+
+ nameList: [{
+ label: "Personal consumption expenditures",
+ value: `1`,
+ },
+ {
+ label: "Goos",
+ value: `1`,
+ }, {
+ label: "Durable goods",
+ value: `1`,
+ }
+ ,
+ {
+ label: "Nondurable goods",
+ value: `1`,
+ },
+ {
+ label: "Services",
+ value: `1`,
+ }
+ ],
+ headData: [{ head: '2021', body: [{ prop: 'd2021q1', name: 'Q1' }, { prop: 'd2021q2', name: 'Q2' }] }, { head: '2022', body: [{ prop: 'd2022q1', name: 'Q1' }, { prop: 'd2022q2', name: 'Q2' }] }],
+ tableData: [
+ // {
+ // d2021q1: '2016-05-03',
+ // d2021q2: 'GRoss',
+ // d2022q2: '普陀区',
+ // d2022q1: 200333,
+ // id: 1
+ // }, {
+ // d2021q1: '2016-05-02',
+ // d2021q2: 'personal',
+ // d2022q2: '普陀区',
+ // d2022q1: 200333,
+ // id:2
+ // }, {
+ // d2021q1: '2016-05-04',
+ // d2021q2: 'Goods',
+ // d2022q2: '普陀区',
+ // address: '上海市普陀区金沙江路 1518 弄',
+ // d2022q1: 200333,
+ // id:3,
+ // children:[{
+ // d2021q1: '2016-05-01',
+ // d2021q2: 'Durable',
+ // d2022q2: '普陀区',
+ // address: '上海市普陀区金沙江路 1518 弄',
+ // d2022q1: 200333,
+ // id:31
+ // }, {
+ // d2021q1: '2016-05-08',
+ // d2021q2: 'Nondurable',
+ // d2022q2: '普陀区',
+ // address: '上海市普陀区金沙江路 1518 弄',
+ // d2022q1: 200333,
+ // id:32
+ // },]
+ // }, {
+ // d2021q1: '2016-05-06',
+ // d2021q2: 'Serv',
+ // d2022q2: '普陀区',
+ // address: '上海市普陀区金沙江路 1518 弄',
+ // d2022q1: 200333
+ // }, {
+ // d2021q1: '2016-05-07',
+ // d2021q2: 'Gross pr',
+ // d2022q2: '普陀区',
+ // address: '上海市普陀区金沙江路 1518 弄',
+ // d2022q1: 200333
+ // }
+ ],
+ directionData:[{
+ value:"pce",
+ label:"Personal consumption expenditures",
+ },
+ {
+ value:"pceg",
+ label:"Goods",
+ },
+ {
+ value:"pcedg",
+ label:"Durable goods",
+ },
+ {
+ value:"pcend",
+ label:"Nondurable goods",
+ },
+ {
+ value:"pces",
+ label:"Services",
+ },
+ {
+ value:"gpdi",
+ label:"Gross private domestic investment",
+ },
+ {
+ value:"fpi",
+ label:"Fixed investment",
+ },
+ {
+ value:"cbi",
+ label:"Change in private inventories",
+ },
+ {
+ value:"netexp",
+ label:"Net exports of goods and services",
+ },
+ {
+ value:"impgs",
+ label:"Imports",
+ },
+ {
+ value:"expgs",
+ label:"Exports",
+ },
+
+
+
+ ],
+
+
+
+
+ }
+ },
+ mounted() {
+ this.fetchGDP()
+
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ // this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ //监听localstorage变化
+ window.addEventListener("setItem", () => {
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+ });
+ this.oldY = this.option.yAxis
+ if (this.timer) {
+ clearInterval(this.timer)
+ }
+ //5分钟请求一次页面
+ // this.timer = setInterval(() => {
+ // this.fetchGDP()
+ // }, 300000)
+
+
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("GDPBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("GDPBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchGDP(params) {
+ this.GDPLoading = true
+
+ const { data } = await getGDP(params)
+ this.headData = data.data.head
+ this.tableData = data.data.list
+
+ this.fetchChart(this.params)
+ this.GDPLoading = false
+
+ },
+ async fetchChart(params) {
+ this.chartLoading = true
+ const { data } = await getGDPChart(params)
+
+ let chartData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.chartLoading = false
+ return
+ }
+
+
+ let ValueList = []
+ let timeList = []
+ chartData.forEach(item => {
+
+ ValueList.push(Number(item.value))
+ timeList.push(item.date)
+ })
+
+
+ this.option.series[0].data = ValueList
+ this.option.xAxis.data = timeList
+ this.option.series[0].name = this.activeName
+ this.inCharts()
+ this.chartLoading = false
+
+
+
+ },
+ //点击某个单元格
+ handleCellClick(row) {
+
+ this.activeName = row.name
+ let obj = this.directionData.find(item => item.label == row.name)
+ this.params.symbol = obj.value
+ this.fetchChart(this.params)
+ },
+ //加粗个别行字体
+ rowStyle({ row }){
+
+ if (row.name==`Personal consumption expenditures` || row.name==`Gross private domestic investment`) {
+
+
+ return { fontWeight: 'bold',cursor: `pointer`};
+ }else{
+ return {cursor: `pointer`}
+ }
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start.split("-")[0];
+ this.params.end = end.split("-")[0];
+ this.fetchGDP({start: this.params.start, end: this.params.end})
+ this.fetchChart(this.params)
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[2], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ // this.params.sma = smaDataList
+ // this.fetchGDP(this.params)
+ // this.$addStorageEvent(1, "sma", smaDataList);
+
+ },
+ handelRefresh() {
+ this.fetchChart(this.params)
+ }
+
+ },
+ beforeDestroy() {
+ clearInterval(this.timer)
+ }
+
+}
\ No newline at end of file
diff --git a/yq/src/views/GDP1/index.vue b/yq/src/views/GDP1/index.vue
new file mode 100644
index 0000000..2e73e3f
--- /dev/null
+++ b/yq/src/views/GDP1/index.vue
@@ -0,0 +1,132 @@
+
+
+
+
+
+
{{ $t(`home.GDPRemind`) }}
+
+
+
+
+
+
+ {{directionData[scope.$index].label}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ activeName }}
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/Home/index.js b/yq/src/views/Home/index.js
new file mode 100644
index 0000000..598dc68
--- /dev/null
+++ b/yq/src/views/Home/index.js
@@ -0,0 +1,16 @@
+export default {
+ data(){
+ return{
+
+
+
+ }
+ },
+ mounted(){},
+ methods:{
+ handelJump(path){
+ console.log("口服卡佛破");
+ this.$router.push(path)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/Home/index.vue b/yq/src/views/Home/index.vue
new file mode 100644
index 0000000..b26c36e
--- /dev/null
+++ b/yq/src/views/Home/index.vue
@@ -0,0 +1,192 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/MVRV/index.js b/yq/src/views/MVRV/index.js
new file mode 100644
index 0000000..d008496
--- /dev/null
+++ b/yq/src/views/MVRV/index.js
@@ -0,0 +1,508 @@
+import * as echarts from "echarts";
+import { handelBtcPrice,emptyData,dataLength, chartsWidth, handelLineType, handelZoom, handelSwitchs, getDateArray, handelWatermark, fetchBtcPrice, fetchEthPrice } from "../../util/processingData"
+import axios from "axios";
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ mvrvLoading: false,
+ params: {
+ req: "mvrv",
+ radius: "BTC",
+ start: "",
+ end: ""
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+
+ // position: function (point, params, dom, rect, size) {
+ // console.log(size,5656);
+ // // 鼠标坐标和提示框位置的参考坐标系是:以外层div的左上角那一点为原点,x轴向右,y轴向下
+ // // 提示框位置
+ // var x = 0; // x坐标位置
+ // var y = 0; // y坐标位置
+
+ // // 当前鼠标位置
+ // var pointX = point[0];
+ // var pointY = point[1];
+
+ // // 外层div大小
+ // // var viewWidth = size.viewSize[0];
+ // // var viewHeight = size.viewSize[1];
+
+ // // 提示框大小
+ // var boxWidth = size.contentSize[0];
+ // var boxHeight = size.contentSize[1];
+
+ // // boxWidth > pointX 说明鼠标左边放不下提示框
+ // if (boxWidth > pointX) {
+ // x = 5;
+ // } else {
+ // // 左边放的下
+
+ // x = pointX- boxWidth;
+ // }
+
+
+
+ // // boxHeight > pointY 说明鼠标上边放不下提示框
+ // if (boxHeight > pointY) {
+ // y = 5;
+ // } else {
+ // // 上边放得下
+ // y = pointY - boxHeight;
+ // }
+
+ // return [x, y];
+ // },
+ },
+ legend: {
+ right: "100",
+ // data:[`sopr`,'asopr','easopr','lthsopr','sthsopr',],
+ // selected:{
+ // 'asopr': false,
+ // 'easopr': false,
+ // 'lthsopr': false,
+ // 'sthsopr': false,
+ // }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//万
+ value = `${e / 10000}W`;
+ } else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right",
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ position: "right",
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "MVRV ratio",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ markArea: {
+ silent: true,
+ data: [
+ [
+ {
+ yAxis: "min",
+ itemStyle: {
+ color: "#e5f7f0",
+ },
+ },
+ {
+ yAxis: "1",
+ },
+ ],
+ [
+ {
+ yAxis: "5.55",
+ itemStyle: {
+ color: "#fde7e7",
+ },
+ },
+ {
+ yAxis: "3.7",
+ },
+ ],
+
+ // 如果有多种颜色,就继续在这里写区间数组,复制上面的下来改颜色
+ ],
+ }
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ markLine: {
+ symbol: ["none", "none"], //去掉箭头
+ itemStyle: {
+ normal: {
+ lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ },
+ },
+ // lineStyle:{
+ // color:"red"
+ // },
+
+ label: {
+ formatter: "{b}",
+ fontSize: 10,
+ color: "rgba(0,0,0,0.8)",
+ align: "left",
+ },
+ data: [
+ // {
+ // name: "0",
+ // yAxis: 0,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+ {
+ name: "$70W",
+ yAxis: 700000,
+ },
+ {
+ name: "$40W",
+ yAxis: 400000,
+ },
+
+ {
+ name: "$10W",
+ yAxis: 100000,
+ },
+ {
+ name: "$100W",
+ yAxis: 1000000,
+ // position: ['100%', '50'],
+ },
+ {
+ name: "$120W",
+ yAxis: 1200000,
+ },
+
+ {
+ name: "$140W",
+ yAxis: 1400000,
+ },
+ ],
+ },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 2,
+ // data: [],
+ // },
+
+
+ ],
+ },
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ startData: [],
+ endData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+
+
+ this.fetchMvrv(this.params.req, this.params.radius)
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("mvrvBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("mvrvBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+
+ async fetchMvrv(req, radius, start, end, sma) {
+ this.mvrvLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+ this.mvrvData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.mvrvLoading = false
+ return
+ }
+ this.start = this.mvrvData[0].time.split("T")[0]
+ this.end = this.mvrvData[this.mvrvData.length - 1].time.split("T")[0]
+ this.option = handelWatermark(this.option, 750, 300)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ //渲染ETH
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+ // const { BTCUSDT_list, BTCUSD_list } = await this.getData()
+ // // console.log(BTCUSDT_list,BTCUSD_list,"几点搜房价都是放假");
+ // this.option.series[0].data = BTCUSD_list
+ // this.option.series[1].data = BTCUSDT_list
+
+
+ //没有查询到数据
+ if (!this.mvrvData) {
+ this.option.series[0].data.length = 0
+ this.mvrvLoading = false
+
+ } else {
+ let time = ""
+ let MvrvValueList = []
+ this.mvrvData.forEach(item => {
+ time = item.time.split("T")[0]
+ MvrvValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelBtcPrice(this.mvrvData, MvrvValueList)
+ }
+
+
+
+
+ this.inCharts()
+
+ setTimeout(() => {
+
+ this.mvrvLoading = false
+ }, 0);
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchMvrv(this.params.req, this.params.radius, this.params.start, this.params.end, this.sma)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag, this.zoomStart, this.zoomEnd)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+
+
+ },
+ //选择Sma
+ handelSonSma(smaDataList) {
+
+
+ this.sma = smaDataList
+
+ this.fetchMvrv(this.params.req, this.params.radius, this.params.start, this.params.end, this.sma)
+
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // console.log(this.zoomStart, this.zoomEnd, "你的经典复刻能否");
+ // handelSmaData(smaDataList,this.option.series[1],this.inCharts,this.start, this.end,this.zoomStart,this.zoomEnd)
+
+ },
+
+
+
+ async getData() {
+ const data = await axios.get("http://10.168.2.199:7001/netData")
+ const result = data.data
+ const BTCUSDT = result.U_data.split("\n")
+ const BTCUSD = result.D_data.split("\n")
+ let BTCUSDT_list = []
+ let BTCUSD_list = []
+ for (let item of BTCUSDT) {
+ if (item !== "") {
+ BTCUSDT_list.push([Number(item.split(" ")[1]), Number(item.split(" ")[0])])
+ }
+ }
+ for (let item of BTCUSD) {
+ if (item !== "") {
+ BTCUSD_list.push([Number(item.split(" ")[1]), Number(item.split(" ")[0])])
+ }
+
+ }
+ return { BTCUSDT_list, BTCUSD_list }
+ }
+
+
+
+
+
+
+
+
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/MVRV/index.vue b/yq/src/views/MVRV/index.vue
new file mode 100644
index 0000000..26243fc
--- /dev/null
+++ b/yq/src/views/MVRV/index.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/MVRVZ/index.js b/yq/src/views/MVRVZ/index.js
new file mode 100644
index 0000000..32a2230
--- /dev/null
+++ b/yq/src/views/MVRVZ/index.js
@@ -0,0 +1,439 @@
+import * as echarts from "echarts";
+import { handelBtcPrice,dataLength, emptyData,chartsWidth, handelProfitrate, handelZoom, fetchBtcPrice, handelWatermark, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+import { MVRVZ } from "../../api/pages"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ MVRVZLoading: false,
+ params: {
+ start: "",
+ end: "",
+ sma: 0
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ // data:[`sopr`,'asopr','easopr','lthsopr','sthsopr',],
+ // selected:{
+ // 'asopr': false,
+ // 'easopr': false,
+ // 'lthsopr': false,
+ // 'sthsopr': false,
+ // }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//万
+ value = `${e / 10000}W`;
+ } else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right",
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ position: "right",
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "MVRV Z-Score",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ markArea: {
+ silent: true,
+ data: [
+ [
+ {
+ yAxis: "-0.25",
+ itemStyle: {
+ color: "#e5f7f0",
+ },
+ },
+ {
+ yAxis: "0",
+ },
+ ],
+ [
+ {
+ yAxis: "6.5",
+ itemStyle: {
+ color: "#fde7e7",
+ },
+ },
+ {
+ yAxis: "7.5",
+ },
+ ],
+
+ // 如果有多种颜色,就继续在这里写区间数组,复制上面的下来改颜色
+ ],
+ }
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ markLine: {
+ symbol: ["none", "none"], //去掉箭头
+ itemStyle: {
+ normal: {
+ lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ },
+ },
+ // lineStyle:{
+ // color:"red"
+ // },
+
+ label: {
+ formatter: "{b}",
+ fontSize: 10,
+ color: "rgba(0,0,0,0.8)",
+ align: "left",
+ },
+ data: [
+ // {
+ // name: "0",
+ // yAxis: 0,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+ {
+ name: "$70W",
+ yAxis: 700000,
+ },
+ {
+ name: "$40W",
+ yAxis: 400000,
+ },
+
+ {
+ name: "$10W",
+ yAxis: 100000,
+ },
+ {
+ name: "$100W",
+ yAxis: 1000000,
+ // position: ['100%', '50'],
+ },
+ {
+ name: "$120W",
+ yAxis: 1200000,
+ },
+
+ {
+ name: "$140W",
+ yAxis: 1400000,
+ },
+ ],
+ },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 2,
+ // data: [],
+ // },
+
+ ],
+ },
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+
+
+ this.fetchMVRVZ()
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("MVRVZBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("MVRVZBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchMVRVZ(params) {
+ this.MVRVZLoading = true
+ // const { data } = await this.$API.getActiveaddress(req, this.params.coin, start, end,sma)
+
+ const { data } = await MVRVZ(params)
+
+ let mvrvzData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.MVRVZLoading = false
+ return
+ }
+
+ this.start = mvrvzData[0].date.split("T")[0]
+ this.end = mvrvzData[mvrvzData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // //移动平均线没值 才渲染正常价格数据
+ // if (this.start && !this.fatherSmaData[0]) {
+ // this.handelSonBtcPrice("BTC", true)
+ // }
+ // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // if (this.fatherSmaData[0] && this.start) {
+ // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ // }
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH",this.ethFlag)
+ // }
+ // })
+
+ this.handelSonBtcPrice("BTC", true)
+ let MVRVZValueList = []
+ mvrvzData.forEach(item => {
+ MVRVZValueList.push(Number(item.value).toFixed(2))
+
+ })
+ this.option.series[0].data = handelProfitrate(mvrvzData, MVRVZValueList)
+
+ this.inCharts()
+ this.MVRVZLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+ // 请求BTC价格
+ async fetchBtcPrice(radius, start, end) {
+ //请求BTC价格
+ const price = await this.$API.getBtcPrice2(radius, start, end);
+ this.btcPrice = price.data.data
+ if (!this.btcPrice) {//价格未查询到数据的情况
+ this.option.series[1].data.length = 0
+
+ } else {
+
+ let priceValueList = []
+ let newPriceData = []
+ this.btcPrice.forEach(price => {
+ priceValueList.push(Number(parseInt(price.value * 100) / 100))
+ newPriceData.push(price)
+ })
+ this.option.series[1].data = handelBtcPrice(newPriceData, priceValueList)
+
+ }
+
+ this.inCharts()
+ },
+ // 请求Eth价格
+ async fetchEthPrice(radius, start, end) {
+ const price = await this.$API.getBtcPrice2(radius, start, end);
+ this.ethPrice = price.data.data
+ if (!this.ethPrice) {
+ this.option.series[2].data.length = 0
+ } else {
+ let priceValueList = []
+ let newPriceData = []
+ this.ethPrice.forEach(price => {
+ priceValueList.push(Number(parseInt(price.value * 100) / 100))
+ newPriceData.push(price)
+ })
+ this.option.series[2].data = handelBtcPrice(newPriceData, priceValueList)
+ }
+
+ this.inCharts()
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchMVRVZ(this.params)
+ },
+
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+
+
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.sma = smaDataList
+ this.params.sma = smaDataList
+ this.fetchMVRVZ(this.params)
+
+ this.$addStorageEvent(1, "sma", this.sma);
+
+
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/MVRVZ/index.vue b/yq/src/views/MVRVZ/index.vue
new file mode 100644
index 0000000..119a8d9
--- /dev/null
+++ b/yq/src/views/MVRVZ/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/MessageBoard/index.js b/yq/src/views/MessageBoard/index.js
new file mode 100644
index 0000000..8743de5
--- /dev/null
+++ b/yq/src/views/MessageBoard/index.js
@@ -0,0 +1,381 @@
+import * as echarts from "echarts";
+import { msgBoradTabel, msgBoradNum,responMsg } from "../../api/messageBoard"
+import { handelBtcPrice, handelWatermark,handelDimensionalArr,handelZoom,} from "../../util/processingData"
+
+
+export default {
+ data() {
+ return {
+ tabelMsg: {
+ status: 0
+ },
+ //未处理留言
+ tabelData0: [
+ {
+ id: "1",
+ userDate: "2022/03/01",
+ userName: "用户名",
+ userMsg: "留言内容",
+ msgPage: "留言所在页面",
+ coinType: "BTC",
+ respon: "回复内容",
+ responDate: "2022/03/02",
+ responser: "回复人"
+ },
+ {
+ id: "2",
+ userDate: "2022/03/01",
+ userName: "用户名",
+ userMsg: "留言内容",
+ msgPage: "留言所在页面",
+ coinType: "BTC",
+ respon: "回复内容",
+ responDate: "2022/03/02",
+ responser: "回复人"
+ },
+ {
+ id: "3",
+ userDate: "2022/03/01",
+ userName: "用户名",
+ userMsg: "留言内容",
+ msgPage: "留言所在页面",
+ coinType: "BTC",
+ respon: "回复内容",
+ responDate: "2022/03/02",
+ responser: "回复人"
+ },
+ ],
+ //已处理留言
+ tabelData1: [
+ {
+ id: "1",
+ userDate: "2022/03/01",
+ userName: "用户名",
+ userMsg: "留言内容",
+ msgPage: "留言所在页面",
+ coinType: "BTC",
+ respon: "回复内容",
+ responDate: "2022/03/02",
+ responser: "回复人"
+ },
+ {
+ id: "2",
+ userDate: "2022/03/01",
+ userName: "用户名",
+ userMsg: "留言内容",
+ msgPage: "留言所在页面",
+ coinType: "BTC",
+ respon: "回复内容",
+ responDate: "2022/03/02",
+ responser: "回复人"
+ },
+ {
+ id: "3",
+ userDate: "2022/03/01",
+ userName: "用户名",
+ userMsg: "留言内容",
+ msgPage: "留言所在页面",
+ coinType: "BTC",
+ respon: "回复内容",
+ responDate: "2022/03/02",
+ responser: "回复人"
+ },
+ ],
+ //留言数量
+ msgCount: {
+ total: "",
+ solvdCount: "",
+ pendingCount: ""
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//百万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: true,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+
+
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "未解决留言数",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "已解决留言数",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#a32140",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 1,
+ lineStyle: {
+ //线条样式
+ color: "#a32140",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "总留言数",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#7a5edf",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 2,
+ lineStyle: {
+ //线条样式
+ color: "#7a5edf",
+ width: "1",
+ },
+ data: [],
+ },
+
+ ],
+ },
+ dialogFormVisible: false,
+ submitReply: {//提交回复
+ message: '',
+ msg_id: "",
+
+ },
+ chartData:[],//所有留言数据(今日留言数)
+ MessageBoardLoading:false
+
+
+
+ }
+ },
+ mounted() {
+ this.tabelMsg.status = 0 //未处理
+ this.fetchMsgBoradTabe0(this.tabelMsg)
+ this.tabelMsg.status = 1//已处理
+ this.fetchMsgBoradTabel1(this.tabelMsg)
+ this.tabelMsg.status = 2//所有留言
+ this.fetchMsgBoradTabel2(this.tabelMsg)
+ //请求留言数量
+ this.fetchMsgBoradNum()
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("MessageBoardBox"));
+ }
+ this.option= handelZoom(this.myChart,this.option,this,this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ //tabel表格数据请求//未处理
+ async fetchMsgBoradTabe0(data) {
+ const list = await msgBoradTabel(data)
+ this.tabelData0 = list.data.data.data
+ if ( !this.tabelData0[0]) return
+ this.tabelData0.forEach(item=>{
+ item.userDate = `${item.userDate.split("T")[0]} ${item.userDate.split("T")[1].split(".")[0]}`
+ })
+ },
+ //已处理
+ async fetchMsgBoradTabel1(data) {
+ const list = await msgBoradTabel(data)
+ this.tabelData1 = list.data.data.data
+ if ( !this.tabelData1[0]) return
+ this.tabelData1.forEach(item=>{
+ item.userDate = `${item.userDate.split("T")[0]} ${item.userDate.split("T")[1].split(".")[0]}`
+ item.responDate = `${item.responDate.split("T")[0]} ${item.responDate.split("T")[1].split(".")[0]}`
+ })
+ },
+ //所有留言
+ async fetchMsgBoradTabel2(data) {
+ const list = await msgBoradTabel(data)
+
+ this.chartData = list.data.data.data
+ if (!this.chartData[0]) return
+
+ },
+ //回复留言
+ async fetchResponMsg(data) {
+ const list = await responMsg(data);
+
+ this.$message({
+ message: list.data.msg,
+ type: "success",
+ customClass: "messageClass",
+ });
+
+ if (list.data.code == 200) {
+ // this.$router.go(0) //处理数据以后 刷新一次更新数据
+ this.tabelMsg.status = 0 //未处理
+ this.fetchMsgBoradTabe0(this.tabelMsg)
+ this.tabelMsg.status = 1//已处理
+ this.fetchMsgBoradTabel1(this.tabelMsg)
+ this.tabelMsg.status = 2//所有留言
+ this.fetchMsgBoradTabel2(this.tabelMsg)
+ //请求留言数量
+ this.fetchMsgBoradNum()
+ }
+
+ },
+
+ //留言数量请求
+ async fetchMsgBoradNum(data) {
+ this.MessageBoardLoading =true
+ const list = await msgBoradNum(data)
+ if (list.data.data.length == 0){
+ this.MessageBoardLoading =false
+ return
+ }
+ //当前时间匹配今日留言
+ let todayTime = new Date()
+ todayTime = todayTime.toISOString().split("T")[0]
+
+ let chartDataList = list.data.data
+ // if (!this.chartDataList) return
+ this.option= handelWatermark(this.option,750,300) //加水印
+ let pendingCountValue = [] //未解决留言数
+ let solvdCountValue = []//已解决留言数
+ let totalValue = [] //总留言数
+ chartDataList.forEach(item=>{
+ // item.date = item.date.split("T")[0].replace(/-/g,"/")
+ if (todayTime ==item.date.split("T")[0] ) {//匹配当前日期 今日留言是否有数据
+ this.msgCount = item
+ }
+
+ pendingCountValue.push(item.pendingCount)
+ solvdCountValue.push(item.solvdCount)
+ totalValue.push(item.total)
+ })
+
+ this.option.series[0].data = handelDimensionalArr(chartDataList, pendingCountValue)
+ this.option.series[1].data = handelDimensionalArr(chartDataList, solvdCountValue)
+ this.option.series[2].data = handelDimensionalArr(chartDataList, totalValue)
+ this.inCharts()
+ this.MessageBoardLoading =false
+ },
+ //点击未处理留言的回复
+ clickRow(a, b) {
+ //每一行的ID
+ this.submitReply.msg_id=b[a].id
+
+ this.dialogFormVisible = true
+ },
+ //确定提交回复
+ handelSubmitReply() {
+
+ this.fetchResponMsg(this.submitReply)
+ this.dialogFormVisible = false
+
+
+
+
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/MessageBoard/index.vue b/yq/src/views/MessageBoard/index.vue
new file mode 100644
index 0000000..f463338
--- /dev/null
+++ b/yq/src/views/MessageBoard/index.vue
@@ -0,0 +1,205 @@
+
+
+
+
+
+
+ {{$t(`message.todayMessage`)}}:
+ {{ msgCount.total || 0 }}
+
+
+
+ {{$t(`message.processedMessage`)}}:
+ {{ tabelData1.length }}
+
+
+
+ {{$t(`message.unprocessedMessage`)}}: {{tabelData0.length}}
+
+
+
+
+
+ {{$t(`message.historyChart`)}}
+
+
+
+
+
+
+
+
+
+
+ {{$t(`message.unprocessedTabel`)}}
+
+
+
+
+
+
+
+
+
+ {{ $t(scope.row.msgPage) }}
+
+
+
+
+
+
+
+ {{$t(`message.reply`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`message.processedTabel`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/MoneyStockMeasures/index.js b/yq/src/views/MoneyStockMeasures/index.js
new file mode 100644
index 0000000..b509912
--- /dev/null
+++ b/yq/src/views/MoneyStockMeasures/index.js
@@ -0,0 +1,691 @@
+import * as echarts from "echarts";
+import { MoneyStockMeasures } from "../../api/pages"
+import { chartsWidth, emptyData, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ MoneyStockMeasuresLoading: false,
+ option: {
+ // tooltip: {
+ // trigger: "axis",
+ // //解决tooltip显示不全问题1
+ // confine: true,
+
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // res += `${params[i].marker} ${params[i].seriesName}      $${params[i].value} `
+
+
+ // }
+
+
+ // return res;
+ // },
+
+ // },
+ // legend: {
+ // right: "100",
+
+
+ // },
+ // xAxis: {
+ // // type: "time",
+ // boundaryGap: false,
+ // // axisLabel: {
+ // // formatter: `{yyyy}-{MM}-{dd}`,
+ // // },
+ // data: []
+ // },
+ // yAxis: [
+ // {
+ // type: "value",
+ // // boundaryGap: [0, "100%"],
+ // axisLabel: {
+ // formatter: function (e) {
+
+ // let value;
+ // if (e > 100000000) {
+ // value = `${e / 100000000}E`;
+ // } else if (e > 1000000) {//百万
+ // value = `${e / 1000000}M`;
+ // } else if (e >= 10000) {//万
+ // value = `${e / 10000}W`;
+ // } else if (e < -1000000) {//百万
+ // value = `${e / 1000000}M`;
+ // } else if (e < -10000) {//万
+ // value = `${e / 10000}W`;
+ // }
+ // else {
+ // value = e;
+ // }
+ // return value;
+ // },
+ // },
+ // min: "dataMin",
+ // max: "dataMax",
+ // },
+ // {
+ // type: "value",
+ // // boundaryGap: [0, "100%"],
+ // show: true,
+ // min: "dataMin",
+ // max: "dataMax",
+ // position: "right"
+ // },
+ // {
+ // type: "value",
+ // // boundaryGap: [0, "100%"],
+ // min: "dataMin",
+ // max: "dataMax",
+ // show: false,
+ // },
+ // {
+ // type: "value",
+ // // boundaryGap: [0, "100%"],
+ // min: "dataMin",
+ // max: "dataMax",
+ // show: false,
+ // },
+ // {
+ // type: "value",
+ // // boundaryGap: [0, "100%"],
+ // min: "dataMin",
+ // max: "dataMax",
+ // show: false,
+ // },
+ // ],
+ // dataZoom: [
+ // {
+ // type: "inside",
+ // start: 0,
+ // end: 100,
+ // },
+ // {
+ // start: 0,
+ // end: 100,
+ // },
+ // ],
+ // series: [
+ // {
+ // name: "M1",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // showSymbol: false,
+ // symbolSize: 5,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#f7864c",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // yAxisIndex: 0,
+ // lineStyle: {
+ // //线条样式
+ // color: "#f7864c",
+ // width: "2",
+ // },
+ // data: [],
+ // },
+ // {
+ // name: "M2",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // showSymbol: false,
+ // symbolSize: 5,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#e43961",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // yAxisIndex: 0,
+ // lineStyle: {
+ // //线条样式
+ // color: "#e43961",
+ // width: "2",
+ // },
+ // data: [],
+ // },
+ // {
+ // name: "Mb",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // showSymbol: false,
+ // symbolSize: 5,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#383d71",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // yAxisIndex: 0,
+ // lineStyle: {
+ // //线条样式
+ // color: "#383d71",
+ // width: "2",
+ // },
+ // data: [],
+ // },
+
+ // ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ ifAdjusted: 0
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ choiceList: [{
+ value: 0,
+ label: "home.Unadjusted",
+ }, {//经过季节性调整
+ value: 1,
+ label: "home.Adjusted",
+ },],
+ isactive: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchMoneyStockMeasuresIndicator(this.params)
+ //禁用时间框
+ // this.$addStorageEvent(1, "timeDisable", true);
+ // this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ chartsWidth("MoneyStockMeasuresBox", this);
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("MoneyStockMeasuresBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("MoneyStockMeasuresBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchMoneyStockMeasuresIndicator(params) {
+ this.MoneyStockMeasuresLoading = true
+ let timer
+ if (timer) {
+ clearTimeout(timer)
+ }
+ const { data } = await MoneyStockMeasures(params)
+ let MoneyStockMeasuresData = data.data
+ var option1
+ var option2
+ //空数据处理
+ if (MoneyStockMeasuresData.length == 0) {
+ this.$message({
+ message: this.$t(`home.NoData`),
+ type: 'warning'
+ });
+ if ( this.myChart) {
+ this.myChart.dispose();
+ }
+
+ this.MoneyStockMeasuresLoading = false
+ return
+ }
+
+
+
+
+ let m1ValueList = []
+ let m2ValueList = []
+ let mbValueList = []
+ let timeList = []
+ MoneyStockMeasuresData.forEach(item => {
+ m1ValueList.push(Number(item.m1.toFixed(2)))
+ m2ValueList.push(Number(item.m2.toFixed(2)))
+ if (item.mb) {
+ mbValueList.push(Number(item.mb.toFixed(2)))
+ }
+
+ item.date = `${item.date.split("T")[0].split("-")[0]}-${item.date.split("T")[0].split("-")[1]}`
+ timeList.push(item.date)
+
+ })
+ //有MB数据的情况 显示legend
+ if (MoneyStockMeasuresData[0].mb) {
+ if ( this.myChart) {
+ this.myChart.dispose();
+ }
+
+ this.myChart = echarts.init(document.getElementById("MoneyStockMeasuresBox"));
+
+ option1 = {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+
+ formatter: function (params) {
+ var res = params[0].axisValueLabel;
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      $${params[i].value} `
+
+
+ }
+
+
+ return res;
+ },
+
+ },
+ legend: {
+ right: "100",
+
+
+ },
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "M1",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "2",
+ },
+ data: [],
+ },
+ {
+ name: "M2",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#e43961",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#e43961",
+ width: "2",
+ },
+ data: [],
+ },
+ {
+ name: "Mb",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#383d71",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#383d71",
+ width: "2",
+ },
+ data: [],
+ },
+
+ ],
+ }
+ option1.series[0].data = m1ValueList
+ option1.series[1].data = m2ValueList
+ option1.series[2].data = mbValueList
+ option1.xAxis.data = timeList
+ option1= handelWatermark(option1) //添加水印
+ this.myChart.setOption(option1);
+
+ }else if (!MoneyStockMeasuresData[0].mb) {
+ if ( this.myChart) {
+ this.myChart.dispose();
+ }
+
+ this.myChart = echarts.init(document.getElementById("MoneyStockMeasuresBox"));
+
+ option2 = {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+
+ formatter: function (params) {
+ var res = params[0].axisValueLabel;
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      $${params[i].value} `
+
+
+ }
+
+
+ return res;
+ },
+
+ },
+ legend: {
+ right: "100",
+ selected: {
+ "Mb": false
+ }
+
+ },
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "M1",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "2",
+ },
+ data: [],
+ },
+ {
+ name: "M2",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#e43961",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#e43961",
+ width: "2",
+ },
+ data: [],
+ },
+
+
+ ],
+ }
+ option2.series[0].data = m1ValueList
+ option2.series[1].data = m2ValueList
+ option2.xAxis.data = timeList
+ option2= handelWatermark(option2) //添加水印
+ this.myChart.setOption(option2);
+
+ }
+
+
+ timer = setTimeout(() => {
+ //添加水印
+ // this.option = handelWatermark(this.option)
+
+
+ // this.inCharts()
+ this.MoneyStockMeasuresLoading = false
+ }, 1000)
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchMoneyStockMeasuresIndicator(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[2], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchMoneyStockMeasuresIndicator(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+
+ handelZone(value, index) {
+ this.params.ifAdjusted = value
+ this.isactive = index
+ // console.log(value, index,"尽快if就覅");
+
+
+
+
+ this.fetchMoneyStockMeasuresIndicator(this.params)
+
+ },
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/MoneyStockMeasures/index.vue b/yq/src/views/MoneyStockMeasures/index.vue
new file mode 100644
index 0000000..91ad544
--- /dev/null
+++ b/yq/src/views/MoneyStockMeasures/index.vue
@@ -0,0 +1,144 @@
+
+
+
+
+
+
+
+ MB = {{ $t(`home.cash`) }} + {{ $t(`home.deposit`) }}
+
+
+
+
+
+ M1 = {{ $t(`home.cash2`) }} + {{ $t(`home.current`) }} + {{ $t(`home.check`) }} + {{ $t(`home.depositCheck`) }}
+
+
+
+
+
+ M2 = M1 + {{ $t(`home.savings`) }} + {{ $t(`home.regular`) }} + {{ $t(`home.otherDeposits`) }}
+
+
+
+
+
+
+
+
+
+ {{ $t(item.label) }}
+
+
+
{{ $t(`home.unit`) }}: billion
+
+
+
+
+
+
+
+ {{ $t(`home.M1`) }}
+ {{ $t(`home.M1_1`) }}
+ {{ $t(`home.M1_2`) }}
+ {{ $t(`home.M1_3`) }}
+ {{ $t(`home.M1_4`) }}
+ {{ $t(`home.M1_5`) }}
+ {{ $t(`home.M1_6`) }}
+ {{ $t(`home.M1_7`) }}
+
+ {{ $t(`home.M2`) }}
+ {{ $t(`home.M2_1`) }}
+ {{ $t(`home.M2_2`) }}
+ {{ $t(`home.M2_3`) }}
+ {{ $t(`home.M2_4`) }}
+ {{ $t(`home.M2_5`) }}
+ {{ $t(`home.M2_6`) }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/NDAQ.vue b/yq/src/views/NDAQ.vue
new file mode 100644
index 0000000..ca2efeb
--- /dev/null
+++ b/yq/src/views/NDAQ.vue
@@ -0,0 +1,476 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/NDAQ/index.js b/yq/src/views/NDAQ/index.js
new file mode 100644
index 0000000..5c0146e
--- /dev/null
+++ b/yq/src/views/NDAQ/index.js
@@ -0,0 +1,477 @@
+import * as echarts from "echarts";
+import {handelWatermark ,handelZoom,chartsWidth,emptyData} from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ option: {
+ },
+ params: {
+ req: "NDAQohlc",
+ start: "",
+ end: ""
+ },
+ maParams: {
+ req: "NDAQma",
+ },
+ NDloading: false,
+ NDAQData: [],
+ lineData: [],
+ indicators05: "",
+ indicators10: "",
+ indicators20: "",
+ NDAQObj:{},
+ yesterday:{
+
+ },
+ sma:"",
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+
+ // created() {
+ // this.onOption();
+ // },
+ //对象为空的时候取值是undefind 这是时候他会显示默认值 但是用数组 [][0] 这是时候是undefind 再去取键会报错,因为不是一个对象嗦嘎
+ mounted() {
+ //初始化option
+ this.onOption();
+ this.fetchNdaqData(this.params.req, this.params.start, this.params.end)
+ this.fetchNDAQma(this.maParams.req, this.params.start, this.params.end)
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.zoomStart= localStorage.getItem("zoomStart")
+ this.zoomEnd= localStorage.getItem("zoomEnd")
+ })
+
+ },
+ methods: {
+ initEcharts() {
+ // myChart.clear();
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById(`chartsBox`));
+ }
+ this.option= handelZoom(this.myChart,this.option,this,this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("chartsBox", this);
+ // 当窗口或者大小发生改变时执行resize,重新绘制图表
+ window.addEventListener("resize", () => {
+ if (this.myChart)this.myChart.resize();
+ });
+ },
+ // 请求NDAQ数据
+ async fetchNdaqData(req, start, end,sma) {
+ this.NDloading = true;
+
+ const { data } = await this.$API.getPriceNDAQ(req, start, end,sma);
+ this.NDAQData = data.data
+
+ //空数据处理
+ let noData= emptyData(data.data,this.option.series,this.initEcharts, this)
+ if (noData) {
+ this.NDloading = false
+ return
+ }
+
+ //添加水印
+ this.option= handelWatermark(this.option)
+ this.NDAQObj=this.NDAQData[this.NDAQData.length-1]
+ this.yesterday=this.NDAQData[this.NDAQData.length-2]
+ this.option.xAxis.type = "category";
+ this.option.series[0].data.length = 0;
+ this.option.series[1].data.length = 0;
+ this.option.series[2].data.length = 0;
+ this.option.series[7].data.length = 0
+ this.option.xAxis[0].data.length = 0;
+ this.option.xAxis[1].data.length = 0;
+ this.NDAQData.forEach(item => {
+ //X轴数据处理
+ let time = item.date.split("T")[0];
+ this.option.xAxis[0].data.push(time);
+ this.option.xAxis[1].data.push(time);
+ this.option.series[0].data.push([
+ //series K线数据处理
+ item.openPrice,
+ item.closePrice,
+ item.lowestPrice,
+ item.highestPrice,
+ ]);
+ //涨跌额、涨跌幅
+ this.option.series[1].data.push(item.increase)
+ let netChangeRatio = `${item.netChangeRatio}%`
+
+ this.option.series[2].data.push(Number(item.netChangeRatio) )
+ //成交量处理 亿为单位
+ let amount = `${Number((item.amount / 100000000).toFixed(2))} 亿股`
+ this.option.series[3].data.push(Number((item.amount / 100000000).toFixed(2)))
+ this.option.series[7].data.push(Number(item.amount.toFixed(2)))
+
+ })
+
+ let barColor
+ //处理柱状图颜色
+ let arr = this.option.series[0].data.map((item) => {
+ return [item[0], item[1]];
+ });
+ this.option.series[7].itemStyle.color = function (params) {
+ if (
+ Number(arr[params.dataIndex][1] || 0) >=
+ Number(arr[params.dataIndex][0])
+ ) {
+ barColor = "#f64e56";
+ } else {
+ barColor = "#54ea92";
+ }
+
+ return barColor;
+ };
+ this.$forceUpdate();
+ // resetTheChart(this);
+ this.initEcharts();
+ this.NDloading = false;
+ },
+ //请求三条折线数据
+ async fetchNDAQma(req, start, end,sma) {
+ const { data } = await this.$API.getPriceNDAQ(req, start, end,sma);
+ this.lineData = data.data
+ this.indicators05 = this.lineData[0].ma5Price
+ this.indicators10 = this.lineData[0].ma10Price
+ this.indicators20 = this.lineData[0].ma20Price
+ this.option.series[4].data.length = 0
+ this.option.series[5].data.length = 0
+ this.option.series[6].data.length = 0
+ this.lineData.forEach(item => {
+ this.option.series[4].data.push(item.ma5Price)
+ this.option.series[5].data.push(item.ma10Price)
+ this.option.series[6].data.push(item.ma20Price)
+ })
+ this.initEcharts();
+
+ },
+ //定义OPtion
+ onOption() {
+ this.option = {
+
+ tooltip: {
+ trigger: "axis",
+ axisPointer: {
+ animation: false,
+ type: "cross",
+ lineStyle: {
+ color: "#376df4",
+ width: 2,
+ opacity: 0,
+ },
+
+ crossStyle: {
+ //十字轴横线
+ opacity: "0",
+ },
+ },
+
+ formatter: (params) => {
+ var res
+ // console.log(params,);
+ if (params[0].axisIndex !== 1) {
+ res = params[0].axisValueLabel;
+ this.indicators05 = params[4].data
+ this.indicators10 = params[5].data
+ this.indicators20 = params[6].data
+ res += `${params[0].marker} open \u00A0\u00A0\u00A0\u00A0 ${params[0].data[1]}
+ ${params[0].marker} close \u00A0\u00A0\u00A0\u00A0 ${params[0].data[2]}
+ ${params[0].marker} lowest \u00A0\u00A0\u00A0\u00A0 ${params[0].data[3]}
+ ${params[0].marker} highest \u00A0\u00A0\u00A0\u00A0 ${params[0].data[4]}
+ ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}%
+ ${params[3].marker} ${params[3].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[3].value}亿股`;
+
+ }
+
+
+ return res;
+ },
+ },
+ grid: [
+ {
+ // left: 0,
+ top: "3%",
+ right: "10%",
+ height: "77%",
+ // borderWidth: 10,
+ // containLabel: true,
+ },
+ {
+ // left: 0,
+ top: "85%",
+ right: "10%",
+ height: "20%",
+ // containLabel:true
+ },],
+ xAxis: [{
+ // type: "time",
+ data: [],
+ axisLine: { lineStyle: { color: "#8392A5" } },
+ //显示在第一个grid坐标上
+ gridIndex: 0,
+ },
+ {
+ //是否显示X轴
+ show: false,
+ //显示在第一个grid坐标上
+ gridIndex: 1,
+ // 网格线
+ splitLine: {
+ show: false,
+ lineStyle: {
+ color: "rgba(225,225,225)",
+ width: 1,
+ type: "solid",
+ },
+ },
+ // 数据
+ data: [],
+ }],
+ yAxis: [
+ {
+ //显示在第一个grid坐标上
+ gridIndex: 0,
+ scale: true,
+ axisLine: { lineStyle: { color: "#8392A5" } },
+ splitLine: { show: false },
+ },
+ {
+ //显示在第一个grid坐标上
+ gridIndex: 0,
+ position: "right",
+ type: "value",
+ show: false,
+ },
+ {
+ //显示在第一个grid坐标上
+ gridIndex: 0,
+ position: "right",
+ type: "value",
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ //显示在第一个grid坐标上
+ gridIndex: 0,
+ position: "right",
+ type: "value",
+ show: false,
+ },
+ {
+ //显示在第二个grid坐标上
+ gridIndex: 1,
+ position: "right",
+ type: "value",
+ show: true,
+ },
+ ],
+ dataZoom: [
+ {
+
+ type: "inside",
+ xAxisIndex: [0, 1],
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 8,
+ brushSelect: true,
+ minValueSpan:6,
+ },
+ {
+ type: "inside",
+ xAxisIndex: [0, 1],
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ series: [
+ {
+ type: "candlestick",
+ name: "Day",
+ symbol: "none",
+ data: [],
+ itemStyle: {
+ color: "#FD1050",
+ color0: "#0CF49B",
+ borderColor: "#FD1050",
+ borderColor0: "#0CF49B",
+ },
+ },
+ {//涨跌额
+ name: "Amount of rise and fall",
+ type: "line",
+ data: [],
+ smooth: false,
+ // symbol: "none",
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f5a622",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 1,
+ lineStyle: {
+ color: "#f5a622",
+ width: 2,
+ },
+ },
+ {//涨跌幅
+ name: "Rise and fall",
+ type: "line",
+ data: [],
+ smooth: false,
+ // symbol: "none",
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#235195",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 2,
+ lineStyle: {
+ color: "#235195",
+ width: 2,
+ },
+ },
+ {//成交量
+ name: "Volume of trading",
+ type: "line",
+ data: [],
+ smooth: false,
+ // symbol: "none",
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#ad70c8",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 3,
+ lineStyle: {
+ color: "#ad70c8",
+ width: 2,
+ },
+ },
+ {
+ // name: "close_price",
+ type: "line",
+ data: [],
+ // smooth: false,
+ symbol: "none",
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ itemStyle: {
+ color: "#faa90e",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ // yAxisIndex: 0,
+ lineStyle: {
+ color: "#faa90e",
+ width: 0,
+ },
+ },
+ {
+ // name: "close_price",
+ type: "line",
+ data: [],
+ smooth: false,
+ symbol: "none",
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ itemStyle: {
+ color: "#ff7e52",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ // yAxisIndex: 3,
+ lineStyle: {
+ color: "#ff7e52",
+ width: 0,
+ },
+ },
+ {
+ // name: "close_price",
+ type: "line",
+ data: [],
+ smooth: false,
+ symbol: "none", //none
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ itemStyle: {
+ color: "#416df9",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ // yAxisIndex: 3,
+ lineStyle: {
+ color: "#416df9",
+ width: 0,
+ },
+ },
+
+ {
+ type: "bar",
+ name: "成交量",
+ xAxisIndex: 1,
+ yAxisIndex: 4,
+ data: [],
+ barCategoryGap: "30%",
+ itemStyle: {
+ symbol: "none",
+ color: "",
+ },
+ }
+
+ ],
+
+ }
+ },
+ //时间接收
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchNdaqData(this.params.req, this.params.start, this.params.end,this.sma)
+ this.fetchNDAQma(this.maParams.req, this.params.start, this.params.end,this.sma)
+
+ },
+
+ //父级选择Sma
+ handelSonSma(smaNUm) {
+ this.sma = smaNUm
+ this.fetchNdaqData(this.params.req, this.params.start, this.params.end,this.sma)
+ this.fetchNDAQma(this.maParams.req, this.params.start, this.params.end,this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[3], this.inChart, this.start, this.end)
+
+ },
+
+
+ },
+
+ beforeDestroy() {
+ /* 页面组件销毁的时候,移除绑定的监听resize事件,多渲染几次 容易导致内存泄漏和额外CPU或GPU占用*/
+ window.removeEventListener("resize", () => {
+ if (this.myChart)this.myChart.resize();
+ });
+ },
+
+}
\ No newline at end of file
diff --git a/yq/src/views/NDAQ/index.vue b/yq/src/views/NDAQ/index.vue
new file mode 100644
index 0000000..a2169e5
--- /dev/null
+++ b/yq/src/views/NDAQ/index.vue
@@ -0,0 +1,179 @@
+
+
+
+
+ MA5:{{ indicators05 || 0 }}
+ MA10:{{ indicators10 || 0 }}
+ MA20:{{ indicators20 || 0 }}
+
+
+
+
+
+
+
+
+ {{$t(`home.open`)}}
+ {{ NDAQObj.openPrice || 0 }}
+
+
+
+ {{$t(`home.highestPrice`)}}
+ {{ NDAQObj.highestPrice || 0 }}
+
+
+
+
+ {{$t(`home.amplitude`)}}
+ --
+
+
+
+
+ {{$t(`home.ndaqAmount`)}}
+ {{NDAQObj.amount || 0 }}
+
+
+
+ {{$t(`home.rise`)}}
+ {{ NDAQObj.increase || 0 }}
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`home.closePrice`)}}
+ {{ yesterday.closePrice || 0 }}
+
+
+
+ {{$t(`home.lowestPrice`)}}
+ {{ NDAQObj.lowestPrice || 0 }}
+
+
+
+ {{$t(`home.clinch`)}}
+ --
+
+
+
+
+
+ {{$t(`home.picture`)}}
+ {{
+ `${NDAQObj.netChangeRatio} %` || 0
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/NdaqBtcDayKline/index.js b/yq/src/views/NdaqBtcDayKline/index.js
new file mode 100644
index 0000000..c147354
--- /dev/null
+++ b/yq/src/views/NdaqBtcDayKline/index.js
@@ -0,0 +1,370 @@
+import * as echarts from "echarts";
+import {handelWatermark,handelZoom ,chartsWidth,emptyData} from "../../util/processingData"
+export default {
+ data() {
+ return {
+ NdaqBtcDayKlineLoading: false,
+ option:{},
+ NDAQParams: "NDAQBTCPrice",
+ BTCParams:"BTCNDAQPrice",
+ requestTime: {
+ start: "",
+ end: ""
+ },
+ ys1:false,
+ ys2:true,
+ ys3:true,
+ ys4:false,
+ ndaqKlineData:[],
+ buttonState:"NDAQ",
+ sma:"",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.onOption()
+ this.fetchNdaqBtcDayKline(this.NDAQParams, this.requestTime.start, this.requestTime.end)
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+
+ this.zoomStart= localStorage.getItem("zoomStart")
+ this.zoomEnd= localStorage.getItem("zoomEnd")
+ })
+
+ },
+ methods: {
+ inChart() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("NdaqBtcDayKlineBox"));
+ }
+ this.option= handelZoom(this.myChart,this.option,this,this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("NdaqBtcDayKlineBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart)this.myChart.resize();
+ });
+ },
+ async fetchNdaqBtcDayKline(req, start, end,sma) {
+ this.NdaqBtcDayKlineLoading = true
+ const { data } = await this.$API.getNDAQBTCPrice(req, start, end,sma)
+ this.ndaqKlineData=data.data
+
+ //空数据处理
+ let noData= emptyData(data.data,this.option.series,this.inChart, this)
+ if (noData) {
+ this.NdaqBtcDayKlineLoading = false
+ return
+ }
+ //添加水印
+ this.option= handelWatermark(this.option)
+ this.option.xAxis[0].data.length=0
+ this.option.xAxis[1].data.length=0
+ this.option.series[0].data.length = 0
+ this.option.series[1].data.length = 0
+ this.option.series[2].data.length = 0
+ if (req=="NDAQBTCPrice") {
+ this.ndaqKlineData.forEach(item=>{
+ let time = item.date.split("T")[0]
+ this.option.xAxis[0].data.push(time)
+ this.option.xAxis[1].data.push(time)
+ this.option.series[0].data.push(
+ [item.ndaqOpenPrice,
+ item.ndaqClosePrice,
+ item.ndaqLowPrice,
+ item.ndaqHighPrice]
+ )
+ this.option.series[1].data.push(item.btcOpenPrice)
+ this.option.series[2].data.push(item.volume)
+ // this.option.series[2].data.push(item.volume)
+ })
+ this.option.series[1].name ="BTC open"
+ }else if(req=="BTCNDAQPrice"){
+ this.ndaqKlineData.forEach(item=>{
+ let time = item.date.split("T")[0]
+ this.option.xAxis[0].data.push(time)
+ this.option.xAxis[1].data.push(time)
+ this.option.series[0].data.push(
+ [item.btcOpenPrice,
+ item.btcClosePrice,
+ item.btcLowPrice,
+ item.btcHighPrice]
+ )
+ let itemTime = new Date(time).getTime()
+ //ndaq开盘价2021 9月22日之前的数据不渲染
+ let ndaqTime = new Date(`2021-09-22`).getTime()
+
+ if (itemTime < ndaqTime) {
+ this.option.series[1].data.push("")
+ }else{
+ this.option.series[1].data.push(item.ndaqOpenPrice)
+ }
+ // this.option.series[1].data.push(item.ndaqOpenPrice)
+
+ this.option.series[2].data.push(item.volume)
+ })
+ this.option.series[1].name ="NDAQ open"
+ }
+
+ let barColor
+ //处理柱状图颜色
+ let arr = this.option.series[0].data.map((item) => {
+ return [item[0], item[1]];
+ });
+ this.option.series[2].itemStyle.color = function (params) {
+ if (
+ Number(arr[params.dataIndex][1] || 0) >=
+ Number(arr[params.dataIndex][0])
+ ) {
+ barColor = "#f64e56";
+ } else {
+ barColor = "#54ea92";
+ }
+
+ return barColor;
+ };
+ this.inChart()
+
+
+
+ this.NdaqBtcDayKlineLoading = false
+ },
+ //定义OPtion
+ onOption() {
+ this.option = {
+
+ tooltip: {
+ trigger: "axis",
+ axisPointer: {
+ animation: false,
+ type: "cross",
+ lineStyle: {
+ color: "#376df4",
+ width: 2,
+ opacity: 0,
+ },
+
+ crossStyle: {
+ //十字轴横线
+ opacity: "0",
+ },
+ },
+
+ // formatter: (params) => {
+ // var res
+ // console.log(params[0].axisIndex !== 1,"sfjihfusihf");
+ // if (params[0].axisIndex !== 1) {
+ // res = params[0].axisValueLabel;
+ // // this.indicators05 = params[4].data
+ // // this.indicators10 = params[5].data
+ // // this.indicators20 = params[6].data
+ // res += `${params[0].marker} 开盘价 \u00A0\u00A0\u00A0\u00A0 ${params[0].data[1]}
+ // ${params[0].marker} 收盘价 \u00A0\u00A0\u00A0\u00A0 ${params[0].data[2]}
+ // ${params[0].marker} 最高价 \u00A0\u00A0\u00A0\u00A0 ${params[0].data[3]}
+ // ${params[0].marker} 最低价 \u00A0\u00A0\u00A0\u00A0 ${params[0].data[4]}
+ // ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ // ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}
+ // ${params[3].marker} ${params[3].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[3].value}`;
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ grid: [
+ {
+ // left: 0,
+ top: "3%",
+ right: "10%",
+ height: "77%",
+ // borderWidth: 10,
+ // containLabel: true,
+ },
+ {
+ // left: 0,
+ top: "82%",
+ right: "10%",
+ height: "20%",
+ // containLabel:true
+ },],
+ xAxis: [{
+ // type: "time",
+ data: [],
+ axisLine: { lineStyle: { color: "#8392A5" } },
+ //显示在第一个grid坐标上
+ gridIndex: 0,
+ },
+ {
+ //是否显示X轴
+ show: false,
+ //显示在第一个grid坐标上
+ gridIndex: 1,
+ // 网格线
+ splitLine: {
+ show: false,
+ lineStyle: {
+ color: "rgba(225,225,225)",
+ width: 1,
+ type: "solid",
+ },
+ },
+ // 数据
+ data: [],
+ }],
+ yAxis: [
+ {
+ //显示在第一个grid坐标上
+ gridIndex: 0,
+ scale: true,
+ axisLine: { lineStyle: { color: "#8392A5" } },
+ splitLine: { show: false },
+ },
+ {
+ //显示在第一个grid坐标上
+ gridIndex: 0,
+ position: "right",
+ type: "value",
+ show: true,
+ },
+ {
+ //显示在第二个grid坐标上
+ gridIndex: 1,
+ position: "right",
+ type: "value",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+
+ type: "inside",
+ xAxisIndex: [0, 1],
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 8,
+ brushSelect: true,
+ minValueSpan:6,
+ },
+ {
+ type: "inside",
+ xAxisIndex: [0, 1],
+ start: 0,
+ end: 20,
+ showDetail: false,
+
+ },
+ ],
+ series: [
+ {
+ type: "candlestick",
+ name: "Day",
+ data: [],
+ itemStyle: {
+ color: "#FD1050",
+ color0: "#0CF49B",
+ borderColor: "#FD1050",
+ borderColor0: "#0CF49B",
+ },
+ },
+ {
+ name: "开盘价",
+ type: "line",
+ data: [],
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#faa90e",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 1,
+ lineStyle: {
+ color: "#faa90e",
+ width: 1,
+ },
+ },
+ {
+ type: "bar",
+ name: "成交量",
+ xAxisIndex: 1,
+ yAxisIndex: 2,
+ data: [],
+ barCategoryGap: "30%",
+ itemStyle: {
+ color: "",
+ },
+ }
+
+ ],
+
+ }
+ },
+ //点击纳斯达克按钮
+ handelNdaqKline(){
+ this.buttonState="NDAQ"
+ //按钮选中样式
+ this.ys1 = !this.ys1
+ this.ys2 = !this.ys2
+ this.ys3 = !this.ys1
+ this.ys4 =!this.ys2
+ this.fetchNdaqBtcDayKline(this.NDAQParams, this.requestTime.start, this.requestTime.end,this.sma)
+ },
+ //点击BTC按钮
+ handelBtcKline(){
+ this.ys1 = true
+ this.ys2 = false
+ this.ys3 = false
+ this.ys4 = true
+ this.buttonState="BTC"
+ this.fetchNdaqBtcDayKline(this.BTCParams, this.requestTime.start, this.requestTime.end,this.sma)
+ },
+
+ //时间接收
+ handelSonTime(start, end) {
+ this.requestTime.start = start;
+ this.requestTime.end = end;
+ if (this.buttonState =="BTC") {
+ this.ys3 = false
+ this.ys4 = true
+ this.fetchNdaqBtcDayKline(this.BTCParams, this.requestTime.start, this.requestTime.end,this.sma)
+ }else if(this.buttonState =="NDAQ"){
+ this.ys1 = false
+ this.ys2 =true
+ this.fetchNdaqBtcDayKline(this.NDAQParams, this.requestTime.start, this.requestTime.end,this.sma)
+ }
+
+ // this.ys1=false
+ // this.ys2=true
+ },
+
+
+
+ //父级选择Sma
+ handelSonSma(smaNUm) {
+ this.sma = smaNUm
+ if (this.buttonState =="BTC") {
+ this.ys3 = false
+ this.ys4 = true
+ this.fetchNdaqBtcDayKline(this.BTCParams, this.requestTime.start, this.requestTime.end,this.sma)
+ }else if(this.buttonState =="NDAQ"){
+ this.ys1 = false
+ this.ys2 =true
+ this.fetchNdaqBtcDayKline(this.NDAQParams, this.requestTime.start, this.requestTime.end,this.sma)
+ }
+
+ this.$addStorageEvent(1, "sma", this.sma);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[3], this.inChart, this.start, this.end)
+
+ },
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/NdaqBtcDayKline/index.vue b/yq/src/views/NdaqBtcDayKline/index.vue
new file mode 100644
index 0000000..fafd356
--- /dev/null
+++ b/yq/src/views/NdaqBtcDayKline/index.vue
@@ -0,0 +1,79 @@
+
+
+
+
+ {{$t(`arh.ndaq`)}}
+
+
+ {{$t(`arh.btc`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/ProfitPercentEthsupply/index.js b/yq/src/views/ProfitPercentEthsupply/index.js
new file mode 100644
index 0000000..bb267bb
--- /dev/null
+++ b/yq/src/views/ProfitPercentEthsupply/index.js
@@ -0,0 +1,350 @@
+import * as echarts from "echarts";
+import { getSupplyProfitPercentEth, } from "../../api/pages"
+import { chartsWidth,emptyData, handelProfitrate,dataLength, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ supplyProfitPercentEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ var res = params[0].axisValueLabel;
+
+ for (let i = 0; i < params.length; i++) {
+ if (i == 0) {
+ res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}% `
+ } else {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ }
+
+ }
+
+
+ return res;
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Percent Supply in Profit",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchsupplyProfitPercentEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("supplyProfitPercentEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("supplyProfitPercentEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchsupplyProfitPercentEth(params) {
+ this.supplyProfitPercentEthLoading = true
+ const { data } = await getSupplyProfitPercentEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.supplyProfitPercentEthLoading = false
+ return
+ }
+ let supplyProfitPercentEthData = data.data
+ this.start = supplyProfitPercentEthData[0].date.split("T")[0]
+ this.end = supplyProfitPercentEthData[supplyProfitPercentEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ supplyProfitPercentEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(supplyProfitPercentEthData, ValueList)
+
+ this.inCharts()
+
+ this.supplyProfitPercentEthLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchsupplyProfitPercentEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchsupplyProfitPercentEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/ProfitPercentEthsupply/index.vue b/yq/src/views/ProfitPercentEthsupply/index.vue
new file mode 100644
index 0000000..ed2ed25
--- /dev/null
+++ b/yq/src/views/ProfitPercentEthsupply/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/Recharge/index.js b/yq/src/views/Recharge/index.js
new file mode 100644
index 0000000..60431da
--- /dev/null
+++ b/yq/src/views/Recharge/index.js
@@ -0,0 +1,420 @@
+import { Recharge, EndOrder, CancelOrder ,CheckOrderByTxid,LastUseTxid} from "../../api/pay"
+import { GetUserAccount } from "../../api/help"
+export default {
+ data() {
+ return {
+ formLabelAlign: {
+ coin: '',
+ chain: '',
+ amount: ''
+ },
+ value: "",
+ options: [{
+ value: '10',
+ label: '10'
+ }, {
+ value: '20',
+ label: '20'
+ }, {
+ value: '50',
+ label: '50'
+ }, {
+ value: '100',
+ label: '100'
+ }, {
+ value: '200',
+ label: '200'
+ }, {
+ value: '500',
+ label: '500'
+ }, {
+ value: '1000',
+ label: '1000'
+ }],
+ coinOptions: [{
+ value: 'USDT',
+ label: 'USDT',
+ disabled: false
+ }, {
+ value: 'USDC',
+ label: 'USDC'
+ }, {
+ value: 'BUSD',
+ label: 'BUSD'
+ }],
+ chainOptions: [{
+ value: 'TRX',
+ label: 'TRX-TRC20'
+ }, {
+ value: 'ETH',
+ label: 'ETH-ERC20'
+ }, {
+ value: 'BSC',
+ label: 'BSC-BEP20',
+ disabled: true
+ }],
+ outerVisible: false,
+ innerVisible: false,
+ transactionData: {
+ orderId: "",
+ address: ""
+ },
+ RechargeLoading: false,
+ ConfirmationLoading: false,
+ CloseTransferLoading: false,
+ ProblemLoading: false,
+ dialogVisibleSuccess: false,
+ balances: {
+ total: "",
+ usdc: "",
+ usdt: "",
+ userId: "",
+ userName: ""
+
+ },
+ Confirmation: false,
+ activeName: 'Recharge',
+ params: {
+ coin: '',
+ chain: '',
+ txid: ''
+ },
+ bthDisabled:false,
+ hashLoading:false,
+ btnText:"pay.confirmSubmission",
+ codeTimer:null,
+ txidLoading:false,
+ dialogVisibleTxid:false,
+ CountdownText:null
+
+ }
+ },
+ mounted() {
+
+ this.fetchlastUseTxid()
+
+
+ },
+
+ methods: {
+ //请求提交充值
+ async fetchRecharge(params) {
+ this.RechargeLoading = true
+ const { data } = await Recharge(params)
+ console.log(data, "及哦飞机佛");
+ if (data.code === 200) {
+ this.outerVisible = true
+ this.transactionData = data.data
+ }
+
+ this.RechargeLoading = false
+ },
+ // 订单支付确认
+ async fetchEndOrder(id) {
+ this.ConfirmationLoading = true
+ let time
+ const { data } = await EndOrder(id)
+
+ if (time) {//清除定时器
+ clearTimeout(time)
+ }
+
+
+ if (data.code === 200) {
+ this.outerVisible = false
+ this.dialogVisibleSuccess = true
+ this.fetchUserAccount()//请求当前余额
+ time = setTimeout(() => {
+ this.dialogVisibleSuccess = false
+ this.$router.push(`/personal`)
+ }, 4000);
+ } else if (data.code === 801) { //801为订单已被处理 禁用按钮
+ this.Confirmation = true
+ }
+
+ this.ConfirmationLoading = false
+
+ },
+ //请求订单取消 关闭转账交易
+ async fetchCancelOrder(params) {
+ this.CloseTransferLoading = true
+ const { data } = await CancelOrder(params)
+ let timer
+ if (timer) {//清除定时器
+ clearTimeout(timer)
+ }
+
+
+ if (data.code === 200) {//关闭以后提示信息 并跳转到个人中心
+ this.outerVisible = false
+ this.$message({
+ type: 'success',
+ message: this.$t(`pay.closeTransfer`)
+ });
+
+ timer = setTimeout(() => {
+ this.$router.push(`/personal`)
+ }, 2000)
+
+ }
+
+ this.CloseTransferLoading = false
+ },
+ //请求当前余额
+ async fetchUserAccount(params) {
+ const { data } = await GetUserAccount(params)
+ this.balances = data.data
+
+ },
+
+ //选择或输入金额
+ handelAmount(value) {
+ console.log(value, 65656);
+
+ },
+ //选择网络
+ handelChain() {
+ if (this.formLabelAlign.chain == "BSC") {
+ this.coinOptions[0].disabled = true
+
+ } else {
+ // this.coinOptions[0].disabled = false
+ }
+
+ },
+ //选择币种
+ handelCoin() {
+ if (this.formLabelAlign.coin == "USDT") {
+ this.chainOptions[2].disabled = true
+
+ } else {
+ // this.chainOptions[2].disabled = false
+ }
+ },
+ //提交充值
+ handelRecharge() {
+
+
+ for (const key in this.formLabelAlign) { //判空
+ if (key !== `files` && this.formLabelAlign[key] == "") {
+
+ switch (key) {
+ case "coin":
+ this.$message({
+ message: this.$t(`pay.paymentCurrency`),
+ type: "error",
+ });
+ break;
+ case "chain":
+ this.$message({
+ message: this.$t(`pay.paymentNetwork`),
+ type: "error",
+ });
+ break;
+ case "address":
+ this.$message({
+ message: this.$t(`pay.paymentAddress`),
+ type: "error",
+ });
+ break;
+ case "emailCode":
+ this.$message({
+ message: this.$t(`pay.paymentCode`),
+ type: "error",
+ });
+ break;
+ case "amount":
+ this.$message({
+ message: this.$t(`pay.paymentAmount`),
+ type: "error",
+ });
+ break;
+
+
+ default:
+ break;
+ }
+
+
+ return
+ }
+ }
+ let pattern = /^\d+$/; //只能是数字正则表达
+ if (!pattern.test(this.formLabelAlign.amount)) {
+ this.$message({
+ message: this.$t(`pay.rechargeAmount`),
+ type: "error",
+ });
+
+ return
+ }
+
+
+ this.fetchRecharge(this.formLabelAlign)
+ },
+ //点击确认已转账
+ handelConfirmation() {
+ this.fetchEndOrder({ orderId: this.transactionData.orderId })
+
+ },
+ //关闭转账交易
+ handelCloseTransfer() {
+
+ this.fetchCancelOrder({ orderId: this.transactionData.orderId })
+ },
+ //转账遇到问题
+ handelProblem() {
+ this.innerVisible = true
+ },
+ //点击联系客服
+ handelCustomerService() {
+ this.$router.push(`/help`)
+ },
+ //y验证TXID
+ handelTXID() {
+ // this.$router.push(`/TXID`)
+
+ this.activeName = "Txid"
+ this.outerVisible=false
+ this.innerVisible=false
+ },
+ //点击充值页面
+ Jump() {
+ this.outerVisible = false
+ },
+ //请求按钮状态是否禁用 及倒计时
+ async fetchlastUseTxid() {
+ this.hashLoading = true
+ const { data } = await LastUseTxid()
+ this.bthDisabled = !data.data.result
+ let tim = data.data.time
+
+
+
+
+
+
+ //判断定时器是否存在
+ if (this.codeTimer) {
+ clearInterval(this.codeTimer);
+ }
+ //倒计时
+ this.codeTimer = setInterval(() => {
+ tim--
+ if (tim <= 0) {
+ clearInterval(this.codeTimer)
+ this.btnText = "pay.confirmSubmission"
+ this.bthDisabled = false
+ } else {
+ this.btnText = `${this.$t(`pay.Disabled`)}`
+ this.bthDisabled = true
+ let times= this.getTime(tim)
+ this.CountdownText = `${this.$t(`pay.hash1`)} ${times[1]} ${this.$t(`pay.hash2`)} ${times[2]} ${this.$t(`pay.hash3`)} ${times[3]} ${this.$t(`pay.hash4`)}`
+ }
+
+ }, 1000)
+
+
+ this.hashLoading = false
+
+ },
+
+
+ //请求查询Txid
+ async fetchTxid(params) {
+ this.txidLoading = true
+ let timer
+ const { data } = await CheckOrderByTxid(params)
+ if (data.data) {
+ this.balances = data.data //接口无数据测试 后端告知与余额数据结构一致
+
+ }
+
+ this.fetchlastUseTxid()
+
+ if (timer) {
+ clearTimeout(timer)
+ }
+
+
+ if (data.code == 200) {
+ this.dialogVisibleTxid = true
+
+ timer = setTimeout(() => {
+ this.dialogVisibleTxid = false
+ this.$router.push(`/personal`)
+ }, 2000)
+
+ }
+
+
+ this.txidLoading = false
+
+
+ console.log(this.txidLoading, 456556);
+ },
+ //点击确认查询Txid
+ handelTxid() {
+
+ for (const key in this.params) { //判空
+ if (this.params[key] == "") {
+ if (key=="coin") {
+ this.$message({
+ message: this.$t(`pay.paymentCurrency`),
+ type: "error",
+ });
+ }else if(key=="chain"){
+ this.$message({
+ message: this.$t(`pay.paymentNetwork`),
+ type: "error",
+ });
+ }
+ else if(key=="txid"){
+ this.$message({
+ message: this.$t(`pay.hashError`),
+ type: "error",
+ });
+ }
+
+ return
+ }
+ }
+
+ // const regex = /^0x[a-fA-F0-9]{64}$/; //验证交易hash 固定64位 只允许英文字母和数字 前两位固定为字符串0x、
+ // const isValid = regex.test(this.params.txid);
+ // if (!isValid) {
+ // this.$message({
+ // message: this.$t(`pay.hashError`),
+ // type: "error",
+ // });
+ // return
+ // }
+
+
+
+
+
+
+ this.fetchTxid(this.params)
+
+ },
+ Jump1() {
+ this.$router.push(`/Help`)
+ },
+ //秒数转换成时分秒
+ getTime(time) {
+ // 转换为式分秒
+ let d= parseInt(time / 60 / 60 / 24) //天
+ let h = parseInt(time / 60 / 60 % 24)//小时
+ // h = h < 10 ? '0' + h : h
+ let m = parseInt(time / 60 % 60)//分钟
+ m = m < 10 ? '0' + m : m
+ let s = parseInt(time % 60)//秒
+ s = s < 10 ? '0' + s : s
+ // 作为返回值返回
+ return [d,h, m, s]
+ }
+
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/Recharge/index.vue b/yq/src/views/Recharge/index.vue
new file mode 100644
index 0000000..3c29a02
--- /dev/null
+++ b/yq/src/views/Recharge/index.vue
@@ -0,0 +1,415 @@
+
+
+
+
+
+
+
{{ $t(`pay.Recharge1`) }}
+
+
+
+
+
+ * {{ $t(`pay.currency`) }}
+
+
+
+
+
+
+
+
+
+ * {{ $t(`pay.network`) }}
+
+
+
+
+
+
+
+
+
+
+
+ * {{ $t(`pay.money`) }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`pay.Reminder`) }}
+ {{ $t(`pay.Reminder_5`) }}
+ {{ $t(`pay.Reminder_6`) }}
+ {{ $t(`pay.Reminder_7`) }}
+ {{ $t(`pay.Reminder_8`) }}
+ {{ $t(`pay.Reminder_9`) }}
+ {{ $t(`pay.Reminder_10`) }}
+ {{ $t(`pay.Reminder_11`) }}
+
+ {{ $t(`pay.Reminder_12`)
+ }}{{ $t(`pay.Reminder_13`) }} {{ $t(`pay.Reminder_14`) }}
+
+
+
+
+
+
{{ $t(`pay.confirmSubmission`) }}
+
+
+
+
+
+
{{ $t(`pay.Txid`) }}
+
+
+
+
+
+ * {{ $t(`pay.currency`) }}
+
+
+
+
+
+
+
+
+
+ * {{ $t(`pay.network`) }}
+
+
+
+
+
+
+
+
+
+ * {{ $t(`pay.Txid`) }}
+
+
+
+
+
+
+
+ {{ $t(`pay.Reminder_26`) }}
+ {{ $t(`pay.Reminder_27`) }}
+ {{ $t(`pay.Reminder_28`) }}
+ {{ $t(`pay.Reminder_29`) }}
+
+ {{ $t(`pay.Reminder_30`)
+ }}{{ $t(`pay.Reminder_31`) }} 。
+
+
+
+
+
+ {{ $t(btnText) }}
+ {{CountdownText}}
+
+
+
+
+
+
+
+ {{ $t(`pay.queryWasSuccessful`) }}
+
+
+ {{ $t(`pay.totalBalance`) }}:{{ balances.total ||($t(`pay.calculation`))}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ $t(`pay.transactions`)
+ }}
+ {{ $t(`pay.service`) }}
+
+
+
+ {{ $t(`pay.Address`) }}:{{ transactionData.address }}
+
+
+
+
+ {{ $t(`pay.Reminder`) }}
+ {{ $t(`pay.Reminder_19`) }}
+
+ {{ $t(`pay.Reminder_20`)
+ }}{{ $t(`pay.Reminder_21`) }} {{ $t(`pay.Reminder_22`) }}
+
+
+ {{ $t(`pay.Reminder_23`)
+ }}{{ $t(`pay.Reminder_13`) }} {{ $t(`pay.Reminder_24`) }}
+
+ {{ $t(`pay.Reminder_25`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`pay.rechargedSuccessfully`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/SLRVRatio/index.js b/yq/src/views/SLRVRatio/index.js
new file mode 100644
index 0000000..c0b398a
--- /dev/null
+++ b/yq/src/views/SLRVRatio/index.js
@@ -0,0 +1,326 @@
+import * as echarts from "echarts";
+import { fetchSLRVRatio } from "../../api/apiPost"
+import { chartsWidth,dataLength, emptyData,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ SLRVRatioLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "SLRV Ratio",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ this.fetchSLRVRatio(this.params.req, this.params.radius)
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("SLRVRatioBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("SLRVRatioBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchSLRVRatio(params) {
+ this.SLRVRatioLoading = true
+ const { data } = await fetchSLRVRatio(params)
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.SLRVRatioLoading = false
+ return
+ }
+ let SLRVRatioData = data.data
+ this.start = SLRVRatioData[0].date.split("T")[0]
+ this.end = SLRVRatioData[SLRVRatioData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ let profitValueList = []
+
+
+ SLRVRatioData.forEach(item => {
+
+ profitValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(SLRVRatioData, profitValueList)
+
+
+
+ this.inCharts()
+ this.SLRVRatioLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchSLRVRatio(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/SLRVRatio/index.vue b/yq/src/views/SLRVRatio/index.vue
new file mode 100644
index 0000000..a0e967b
--- /dev/null
+++ b/yq/src/views/SLRVRatio/index.vue
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/TXID/index.js b/yq/src/views/TXID/index.js
new file mode 100644
index 0000000..3ae722d
--- /dev/null
+++ b/yq/src/views/TXID/index.js
@@ -0,0 +1,162 @@
+import {CheckOrderByTxid,LastUseTxid} from "../../api/pay"
+export default {
+ data() {
+ return {
+ params: {
+ coin: '',
+ chain: '',
+ txid: ''
+ },
+ value:"",
+ options: [{
+ value: '10',
+ label: '10'
+ }, {
+ value: '20',
+ label: '20'
+ }, {
+ value: '50',
+ label: '50'
+ },{
+ value: '100',
+ label: '100'
+ },{
+ value: '200',
+ label: '200'
+ },{
+ value: '500',
+ label: '500'
+ },{
+ value: '1000',
+ label: '1000'
+ }],
+ coinOptions: [{
+ value: 'USDT',
+ label: 'USDT'
+ }, {
+ value: 'USDC',
+ label: 'USDC'
+ }, {
+ value: 'BUSD',
+ label: 'BUSD'
+ }],
+ chainOptions: [{
+ value: 'TRX',
+ label: 'TRX'
+ }, {
+ value: 'ETH',
+ label: 'ETH'
+ }, {
+ value: 'BSC',
+ label: 'BSC'
+ }],
+ outerVisible:false,
+ innerVisible:false,
+ transactionData:{
+ orderId:"",
+ address:""
+ },
+ txidLoading:false,
+ dialogVisibleSuccess:false,
+ balances:{
+ total:0,
+ usdc:"",
+ usdt:"",
+ userId:"",
+ userName:""
+
+ },
+ bthDisabled:true,
+ hashLoading:false,
+ btnText:"pay.confirmSubmission",
+ codeTimer:null,
+
+ }
+ },
+ mounted() {
+ this.fetchlastUseTxid()
+ },
+ methods: {
+ //请求按钮状态是否禁用 及倒计时
+ async fetchlastUseTxid(){
+ this.hashLoading = true
+ const {data} = await LastUseTxid()
+ this.bthDisabled = !data.data.result
+ let tim =data.data.time
+ //判断定时器是否存在
+ if (this.codeTimer) {
+ clearInterval(this.codeTimer);
+ }
+ //倒计时
+ this.codeTimer = setInterval(() => {
+ tim--
+ if (tim <= 0) {
+ clearInterval(this.codeTimer)
+ this.btnText = "pay.confirmSubmission"
+ this.bthDisabled=false
+ }else{
+ this.btnText=`${this.$t(`pay.Disabled`)}:${tim}`
+ this.bthDisabled=true
+
+ }
+
+ },1000)
+
+
+ this.hashLoading = false
+
+ },
+
+
+ //请求查询Txid
+ async fetchTxid(params){
+ this.txidLoading = true
+ let timer
+ const {data} = await CheckOrderByTxid(params)
+ if (data.data) {
+ this.balances=data.data //接口无数据测试 后端告知与余额数据结构一致
+ }
+
+
+
+ if (timer) {
+ clearTimeout(timer)
+ }
+
+
+ if (data.code == 200) {
+ this.dialogVisibleSuccess=true
+
+ timer=setTimeout(()=>{
+ this.dialogVisibleSuccess=false
+ this.$router.push(`/personal`)
+ },2000)
+
+ }
+
+
+ this.txidLoading = false
+
+
+ console.log( this.txidLoading,456556);
+ },
+ //点击确认查询Txid
+ handelTxid(){
+ for (const key in this.params) { //判空
+ if (this.params[key] == "") {
+ this.$message({
+ message: this.$t(`help.resubmit`),
+ type: "error",
+ });
+ return
+ }
+ }
+
+ this.fetchTxid(this.params)
+
+ },
+ Jump(){
+ this.$router.push(`/Help`)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/TXID/index.vue b/yq/src/views/TXID/index.vue
new file mode 100644
index 0000000..7ed6435
--- /dev/null
+++ b/yq/src/views/TXID/index.vue
@@ -0,0 +1,146 @@
+
+
+
+
+
{{$t(`pay.submit`)}}{{$t(`pay.Txid`)}}
+
+
+
+
+
+ * {{ $t(`pay.currency`) }}
+
+
+
+
+
+
+
+
+
+ * {{ $t(`pay.network`) }}
+
+
+
+
+
+
+
+
+
+
+ * {{ $t(`pay.Txid`) }}
+
+
+
+
+
+
+
+ {{$t(`pay.Reminder_26`) }}
+ {{$t(`pay.Reminder_27`) }}
+ {{$t(`pay.Reminder_28`) }}
+ {{$t(`pay.Reminder_29`) }}
+ {{$t(`pay.Reminder_30`) }}{{$t(`pay.Reminder_31`) }} 。
+
+
+
+
+
+
+ {{$t(btnText)}}
+
+
+
+
+
+
+ {{$t(`pay.queryWasSuccessful`) }}
+ {{$t(`pay.totalBalance`) }}:{{ balances.total }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/TransactionCount/index.js b/yq/src/views/TransactionCount/index.js
new file mode 100644
index 0000000..d3af617
--- /dev/null
+++ b/yq/src/views/TransactionCount/index.js
@@ -0,0 +1,354 @@
+
+import * as echarts from "echarts";
+import { $addStorageEvent } from '../../util/processingData'
+import { getMempool } from "../../api/apiPost"
+import {handelZoom, chartsWidth,emptyData,handelWatermark,handelLineType,handelSwitchs} from "../../util/processingData"
+
+export default {
+ data(){
+ return{
+ myChart:"",
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ },
+ yAxis: [
+ {
+ position: "left",
+ type: "value",
+ axisLabel: {
+ formatter: (value) => {
+ let data
+ if (value >= 1000000000) {
+ data = `${value / 1000000000}B`
+ } else if (value >= 1000000) {
+ data = `${value / 1000000}M`
+ } else {
+ data = `${value / 1000}K`
+ }
+ return data
+ }
+ }
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: true,
+ // min:`dataMin`,
+ // max:`dataMax`,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Mempool Transaction Count",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series',
+
+
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#000",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#000",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+
+
+
+ ],
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ TransactionCountLoading:false,
+ params: {
+ sma: "",
+ start:"",
+ end:"",
+
+ },
+ dataSelection: [
+ {
+ value: "1d",
+ label: "home.day1",
+ disabled:false,
+ authority:"guest",
+ grade:1,
+ },
+ {
+ value: "realTime",
+ label: "home.realTimeData",
+ disabled:false,
+ authority:"vip",
+ grade:4,
+ },
+ ],
+ realTimeData:"",
+ switch3: "",
+ start:"",
+ end:"",
+
+
+
+ }
+ },
+ mounted(){
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.fetchTransactionCount(this.params)
+ },
+ methods:{
+ // handleSelect(activeValue){
+ // if (activeValue == `1d`) {
+ // this.realTimeData =false
+ // this.fetchTransactionCount(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ // }else{
+ // this.fetchBTCVolume()
+ // this.realTimeData =true
+ // }
+ // },
+ inCharts(){
+ if (!this.myChart) {
+ this.myChart = echarts.init(document.getElementById("TransactionCountBox"));
+
+ }
+
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+ this.myChart.setOption(this.option);
+ chartsWidth("TransactionCountBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+
+ //请求交易量数据渲染
+ async fetchTransactionCount(params) {
+ this.TransactionCountLoading = true
+ const { data } = await getMempool(params)
+ let chartData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.TransactionCountLoading = false
+ return
+ }
+ //添加水印
+ handelWatermark(this.option, 750, 300)
+ this.start =chartData[0].date.split("T")[0]
+ this.end = chartData[chartData.length - 1].date.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ let volumeValueList = []
+ let xAxisData = []
+ chartData.forEach(item => {
+
+ volumeValueList.push(Number(item.mempoolSize.toFixed(2)))
+ xAxisData.push(item.date.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = volumeValueList
+ this.option.series[1].data = priceData
+ if (this.zoomStart) {
+ this.option.dataZoom[0].start = this.zoomStart
+ this.option.dataZoom[0].end = this.zoomEnd
+ } else {
+ this.option.dataZoom[0].start = 10
+ this.option.dataZoom[0].end = 100
+ }
+
+
+
+
+ this.inCharts()
+
+
+
+
+ setTimeout(() => {//监听echarts 图表滚动
+ this.myChart.on("dataZoom", function (e) {
+ this.zoomStart = e.start || e.batch[0].start;
+ this.zoomEnd = e.end|| e.batch[0].end;
+ $addStorageEvent(1, "zoomStart", this.zoomStart);
+ $addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ });
+
+
+ })
+
+ this.TransactionCountLoading = false
+
+
+
+
+
+ },
+ //实时数据
+ async fetchBTCVolume(){
+ this.TransactionCountLoading = true
+ const { data } = await getBTCVolume()
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.TransactionCountLoading = false
+ return
+ }
+ let BTCVolumeData = data.data
+ let Volume=[]
+ let xAxisData = []
+ let priceData =[]
+ BTCVolumeData.forEach(item=>{
+ item.date= `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ xAxisData.push(item.date)
+ Volume.push(item.value.toFixed(2))
+ priceData.push(Number(item.price.toFixed(2)))
+ })
+
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = Volume
+ this.option.series[1].data = priceData
+
+
+ this.inCharts()
+ this.TransactionCountLoading = false
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchTransactionCount(this.params)
+ },
+ //父级选择Sma
+ handelSonSma(smaNUm) {
+ this.params.sma = smaNUm
+ this.fetchTransactionCount(this.params)
+ this.$addStorageEvent(1, "sma",this.params.sma);
+ this.realTimeData =false
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+
+
+ },
+}
\ No newline at end of file
diff --git a/yq/src/views/TransactionCount/index.vue b/yq/src/views/TransactionCount/index.vue
new file mode 100644
index 0000000..07d05d2
--- /dev/null
+++ b/yq/src/views/TransactionCount/index.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/TransactionFee/index.js b/yq/src/views/TransactionFee/index.js
new file mode 100644
index 0000000..9bbf7b0
--- /dev/null
+++ b/yq/src/views/TransactionFee/index.js
@@ -0,0 +1,342 @@
+
+import * as echarts from "echarts";
+import { $addStorageEvent } from '../../util/processingData'
+import { getBTCFees, } from '../../api/realTimeData'
+import {handelZoom, chartsWidth,emptyData,handelWatermark,handelLineType,handelSwitchs} from "../../util/processingData"
+
+export default {
+ data(){
+ return{
+ myChart:"",
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ },
+ yAxis: [
+ {
+ position: "left",
+ type: "value",
+ axisLabel: {
+ formatter: (value) => {
+ let data
+ if (value >= 1000000000) {
+ data = `${value / 1000000000}B`
+ } else if (value >= 1000000) {
+ data = `${value / 1000000}M`
+ } else {
+ data = `${value / 1000}K`
+ }
+ return data
+ }
+ }
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: true,
+ // min:`dataMin`,
+ // max:`dataMax`,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Transaction Fee",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series',
+
+
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#000",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#000",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+
+
+
+ ],
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ TransactionFeeLoading:false,
+ params: {
+ req: "BTCFees",
+ radius: "btc",
+ sma: "",
+ start:"",
+ end:"",
+
+ },
+ dataSelection: [
+ {
+ value: "1d",
+ label: "home.day1",
+ disabled:false,
+ authority:"guest",
+ grade:1,
+ },
+ {
+ value: "realTime",
+ label: "home.realTimeData",
+ disabled:false,
+ authority:"vip",
+ grade:4,
+ },
+ ],
+ realTimeData:"",
+ switch3: "",
+ start:"",
+ end:"",
+
+
+ }
+ },
+ mounted(){
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.fetchFees(this.params.req, this.params.radius)
+ },
+ methods:{
+ handleSelect(activeValue){
+ if (activeValue == `1d`) {
+ this.realTimeData =false
+ this.fetchFees(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ }else{
+ this.fetchBTCFees()
+ this.realTimeData =true
+ }
+ },
+ inCharts(){
+ if (!this.myChart) {
+ this.myChart = echarts.init(document.getElementById("TransactionFeeBox"));
+
+ }
+
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+ this.myChart.setOption(this.option);
+ chartsWidth("TransactionFeeBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+
+ //请求交易费数据渲染
+ async fetchFees(req, radius, start, end, sma) {
+ this.TransactionFeeLoading = true
+ const { data } = await this.$API.getVolume(req, radius, start, end, sma)
+ let feesData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.TransactionFeeLoading = false
+ return
+ }
+
+ this.start =feesData[0].date.split("T")[0]
+ this.end = feesData[feesData.length - 1].date.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+
+
+ this.option = handelWatermark(this.option, 650, 300)
+
+
+ let feesValueList = []
+ let xAxisData = []
+ feesData.forEach(item => {
+ xAxisData.push(item.date.split("T")[0])
+ feesValueList.push(Number(item.value.toFixed(2)))
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = feesValueList
+ this.option.series[1].data = priceData
+ if (this.zoomStart) {
+ this.option.dataZoom[0].start = this.zoomStart
+ this.option.dataZoom[0].end = this.zoomEnd
+ } else {
+ this.option.dataZoom[0].start = 10
+ this.option.dataZoom[0].end = 100
+ }
+ this.inCharts()
+ this.TransactionFeeLoading = false
+
+ setTimeout(() => {//监听echarts 图表滚动
+ this.myChart.on("dataZoom", function (e) {
+ this.zoomStart = e.start || e.batch[0].start;
+ this.zoomEnd = e.end|| e.batch[0].end;
+ $addStorageEvent(1, "zoomStart", this.zoomStart);
+ $addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ });
+
+
+ })
+ },
+ //实时数据
+ async fetchBTCFees(){
+ this.TransactionFeeLoading = true
+ const { data } = await getBTCFees()
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.TransactionFeeLoading = false
+ return
+ }
+ let BTCFeesData = data.data
+ let Volume=[]
+ let xAxisData = []
+ let priceData =[]
+ BTCFeesData.forEach(item=>{
+ item.date= `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ xAxisData.push(item.date)
+ Volume.push(item.value.toFixed(2))
+ priceData.push(Number(item.price.toFixed(2)))
+ })
+
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = Volume
+ this.option.series[1].data = priceData
+
+
+ this.inCharts()
+ this.TransactionFeeLoading = false
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchFees(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ },
+ //父级选择Sma
+ handelSonSma(smaNUm) {
+ this.params.sma = smaNUm
+ this.fetchFees(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ this.$addStorageEvent(1, "sma",this.params.sma);
+ this.realTimeData =false
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+
+
+ },
+}
\ No newline at end of file
diff --git a/yq/src/views/TransactionFee/index.vue b/yq/src/views/TransactionFee/index.vue
new file mode 100644
index 0000000..130b7f9
--- /dev/null
+++ b/yq/src/views/TransactionFee/index.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/TransactionVolume/index.js b/yq/src/views/TransactionVolume/index.js
new file mode 100644
index 0000000..d4c7149
--- /dev/null
+++ b/yq/src/views/TransactionVolume/index.js
@@ -0,0 +1,354 @@
+
+import * as echarts from "echarts";
+import { $addStorageEvent } from '../../util/processingData'
+import { getBTCVolume, } from '../../api/realTimeData'
+import {handelZoom, chartsWidth,emptyData,handelWatermark,handelLineType,handelSwitchs} from "../../util/processingData"
+
+export default {
+ data(){
+ return{
+ myChart:"",
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ },
+ yAxis: [
+ {
+ position: "left",
+ type: "value",
+ axisLabel: {
+ formatter: (value) => {
+ let data
+ if (value >= 1000000000) {
+ data = `${value / 1000000000}B`
+ } else if (value >= 1000000) {
+ data = `${value / 1000000}M`
+ } else {
+ data = `${value / 1000}K`
+ }
+ return data
+ }
+ }
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: true,
+ // min:`dataMin`,
+ // max:`dataMax`,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Transaction Volume",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series',
+
+
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#000",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#000",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+
+
+
+ ],
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ TransactionVolumeLoading:false,
+ params: {
+ req: "BTCVolume",
+ radius: "btc",
+ sma: "",
+ start:"",
+ end:"",
+
+ },
+ dataSelection: [
+ {
+ value: "1d",
+ label: "home.day1",
+ disabled:false,
+ authority:"guest",
+ grade:1,
+ },
+ {
+ value: "realTime",
+ label: "home.realTimeData",
+ disabled:false,
+ authority:"vip",
+ grade:4,
+ },
+ ],
+ realTimeData:"",
+ switch3: "",
+ start:"",
+ end:"",
+
+
+
+ }
+ },
+ mounted(){
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.fetchVolume(this.params.req, this.params.radius)
+ },
+ methods:{
+ handleSelect(activeValue){
+ if (activeValue == `1d`) {
+ this.realTimeData =false
+ this.fetchVolume(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ }else{
+ this.fetchBTCVolume()
+ this.realTimeData =true
+ }
+ },
+ inCharts(){
+ if (!this.myChart) {
+ this.myChart = echarts.init(document.getElementById("TransactionVolumeBox"));
+
+ }
+
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+ this.myChart.setOption(this.option);
+ chartsWidth("TransactionVolumeBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+
+ //请求交易量数据渲染
+ async fetchVolume(req, radius, start, end, sma) {
+ this.TransactionVolumeLoading = true
+ const { data } = await this.$API.getVolume(req, radius, start, end, sma)
+ let chartData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.TransactionVolumeLoading = false
+ return
+ }
+ //添加水印
+ handelWatermark(this.option, 750, 300)
+ this.start =chartData[0].date.split("T")[0]
+ this.end = chartData[chartData.length - 1].date.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ let volumeValueList = []
+ let xAxisData = []
+ chartData.forEach(item => {
+
+ volumeValueList.push(Number(item.value.toFixed(2)))
+ xAxisData.push(item.date.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = volumeValueList
+ this.option.series[1].data = priceData
+ if (this.zoomStart) {
+ this.option.dataZoom[0].start = this.zoomStart
+ this.option.dataZoom[0].end = this.zoomEnd
+ } else {
+ this.option.dataZoom[0].start = 10
+ this.option.dataZoom[0].end = 100
+ }
+
+
+
+
+ this.inCharts()
+
+
+
+
+ setTimeout(() => {//监听echarts 图表滚动
+ this.myChart.on("dataZoom", function (e) {
+ this.zoomStart = e.start || e.batch[0].start;
+ this.zoomEnd = e.end|| e.batch[0].end;
+ $addStorageEvent(1, "zoomStart", this.zoomStart);
+ $addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ });
+
+
+ })
+
+ this.TransactionVolumeLoading = false
+
+
+
+
+
+ },
+ //实时数据
+ async fetchBTCVolume(){
+ this.TransactionVolumeLoading = true
+ const { data } = await getBTCVolume()
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.TransactionVolumeLoading = false
+ return
+ }
+ let BTCVolumeData = data.data
+ let Volume=[]
+ let xAxisData = []
+ let priceData =[]
+ BTCVolumeData.forEach(item=>{
+ item.date= `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ xAxisData.push(item.date)
+ Volume.push(item.value.toFixed(2))
+ priceData.push(Number(item.price.toFixed(2)))
+ })
+
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = Volume
+ this.option.series[1].data = priceData
+
+
+ this.inCharts()
+ this.TransactionVolumeLoading = false
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchVolume(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ },
+ //父级选择Sma
+ handelSonSma(smaNUm) {
+ this.params.sma = smaNUm
+ this.fetchVolume(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ this.$addStorageEvent(1, "sma",this.params.sma);
+ this.realTimeData =false
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+
+
+ },
+}
\ No newline at end of file
diff --git a/yq/src/views/TransactionVolume/index.vue b/yq/src/views/TransactionVolume/index.vue
new file mode 100644
index 0000000..f5a32bd
--- /dev/null
+++ b/yq/src/views/TransactionVolume/index.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/USDC/index.js b/yq/src/views/USDC/index.js
new file mode 100644
index 0000000..912b45e
--- /dev/null
+++ b/yq/src/views/USDC/index.js
@@ -0,0 +1,262 @@
+import * as echarts from "echarts";
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelZoom, handelLineType, handelSwitchs, handelUsdt, handelWatermark } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ USDCLoading: false,
+ params: {
+ req: "usdcVolume",
+ radius: "ETH",
+ start: "",
+ end: ""
+ },
+ tronParams: {
+ req: "tronUsdcVolume",
+ radius: "ETH",
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ // data:[`sopr`,'asopr','easopr','lthsopr','sthsopr',],
+ // selected:{
+ // 'asopr': false,
+ // 'easopr': false,
+ // 'lthsopr': false,
+ // 'sthsopr': false,
+ // }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//万
+ value = `${e / 10000}W`;
+ } else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right",
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "USDC on ETH",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "USDC on TRON",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f49495",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f49495",
+ width: "1",
+ },
+ data: [],
+ yAxisIndex: 0
+ },
+
+
+ ],
+ },
+ switch3: "",
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+
+ this.fetchUSDC(this.params.req, this.params.radius)
+
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("USDCBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("USDCBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchUSDC(req, radius, start, end, sma) {
+ this.USDCLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+ let usdtData = data.data
+
+ const tron = await this.$API.getCsupply(this.tronParams.req, this.tronParams.radius, start, end, sma)
+ let tronData = tron.data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.USDCLoading = false
+ return
+ }
+
+ let usdtValueList = []
+ //添加水印
+ this.option = handelWatermark(this.option)
+
+ //渲染usdt
+ usdtData.forEach(item => {
+ usdtValueList.push(parseInt(item.volume * 100) / 100)
+ })
+ let tronValueList = []
+ //渲染usdt USDt on TRON交易量
+ tronData.forEach(item => {
+ if (!item.date) return
+ tronValueList.push(parseInt(item.volumeSelf * 100) / 100)
+ })
+ this.option.series[0].data = handelUsdt(usdtData, usdtValueList)
+ //判断USDt on TRON交易量 没有数据返回
+ if (tronData[0].date) {
+ this.option.series[1].data = handelProfitrate(tronData, tronValueList)
+ }
+
+
+ this.inCharts()
+
+ this.USDCLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ let type
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchUSDC(this.params.req, this.params.radius, this.params.start, this.params.end, this.sma)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级选择Sma
+ handelSonSma(smaNUm) {
+ this.sma = smaNUm
+ let type
+ this.fetchUSDC(this.params.req, this.params.radius, this.params.start, this.params.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[3], this.inChart, this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/USDC/index.vue b/yq/src/views/USDC/index.vue
new file mode 100644
index 0000000..bf9473a
--- /dev/null
+++ b/yq/src/views/USDC/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/USDCMonitoring/index.js b/yq/src/views/USDCMonitoring/index.js
new file mode 100644
index 0000000..607da45
--- /dev/null
+++ b/yq/src/views/USDCMonitoring/index.js
@@ -0,0 +1,353 @@
+import * as echarts from "echarts";
+import { chartsWidth, emptyData, dataLength,handelBigDeals, handelZoom, handelSwitchs, handelWatermark } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ USDCMonitoringLoading: false,
+ lengthTimer:null,
+ chartLoading:false,
+ params: {
+ req: "usdcbigtx",
+ radius: "eth",
+ start: "",
+ end: ""
+ },
+ paramsCount: {
+ req: "usdcbigtxcount",
+ radius: "eth",
+ },
+ tronParams: {
+ req: "tronUSDCBigTx",
+ radius: "eth",
+ },
+ tronParamsCount: {
+ req: "tronUSDCBigTxCount",
+ radius: "eth",
+ },
+ dataCount: [],
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ // data:[`sopr`,'asopr','easopr','lthsopr','sthsopr',],
+ // selected:{
+ // 'asopr': false,
+ // 'easopr': false,
+ // 'lthsopr': false,
+ // 'sthsopr': false,
+ // }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure`),
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//万
+ value = `${e / 10000}W`;
+ } else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right",
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "USDC on ETH",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "USDC on TRON",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f49495",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f49495",
+ width: "1",
+ },
+ data: [],
+ yAxisIndex: 0
+ },
+
+
+ ],
+ },
+ tabelloading: false,
+ tableData: [],
+ page: 1,
+ limit: 50,
+ search: "",
+ currentPage4: 1,
+ tronTabelloading: false,
+ tronTableData: [],
+ tronTotalPage: 0,
+ tronCurrentPage4: 1,
+ tronPage: 1,
+ tronLimit: 50,
+ totalPage: 0,
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+
+ this.fetchUsdcbigtx(this.params.req, this.params.radius, this.search, this.params.start, this.params.end, this.page, this.limit)
+ this.fetchTronbigtx(this.tronParams.req, this.tronParams.radius, this.search, this.params.start, this.params.end, this.page, this.limit)
+ this.fetchUsdcbigtxcount()
+
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("USDCMonitoringBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("USDCMonitoringBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ //请求页面tabel数据 大额交易监控表格
+ async fetchUsdcbigtx(req, radius, search, start, end, page, limit) {
+ this.USDCMonitoringLoading = true
+ //大额交易监控表格
+ const { data } = await this.$API.getBigDeals2(req, radius, search, start, end, page, limit);
+ this.tableData = data.data.data
+ this.totalPage = data.data.totalPage
+ this.currentPage4 = page
+ this.USDCMonitoringLoading = false
+ },
+ //请求页面tabel数据 USDC on TRON大额交易
+ async fetchTronbigtx(req, radius, search, start, end, page, limit) {
+
+ //大额交易监控表格
+ const { data } = await this.$API.getBigDeals2(req, radius, search, start, end, page, limit);
+ this.tronTableData = data.data.data
+
+ this.tronTotalPage = data.data.totalPage
+ this.tronCurrentPage4 = page
+
+ },
+ //请求折线图数据
+ async fetchUsdcbigtxcount(start, end, type, sma) {
+ this.chartLoading = true
+ // 大额交易监控曲线图
+ const { data } = await this.$API.getBigDealsCount(
+ this.paramsCount.req,
+ this.paramsCount.radius,
+ start,
+ end,
+ type,
+ sma
+ );
+ this.dataCount = data.data
+
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.chartLoading = false
+ return
+ }
+ //添加水印
+ this.option = handelWatermark(this.option)
+
+ let numValueList = []
+ this.dataCount.forEach(item => {
+ numValueList.push(parseInt(item.num * 100) / 100)
+ });
+ this.option.series[0].data = handelBigDeals(this.dataCount, numValueList)
+ // USDC on TRON大额交易 曲线图
+ const list = await this.$API.getBigDealsCount(
+ this.tronParamsCount.req,
+ this.tronParamsCount.radius,
+ start,
+ end,
+ type,
+ sma,
+ );
+ let tronData = list.data.data
+ let tronValueList = []
+ tronData.forEach(item => {
+ tronValueList.push(parseInt(item.num * 100) / 100)
+ });
+ this.option.series[1].data = handelBigDeals(tronData, tronValueList)
+ this.inCharts();
+ this.chartLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ let type
+ this.fetchUsdcbigtxcount(this.params.start, this.params.end, type, this.sma)
+ },
+ //处理表格里的时间
+ formatTime(value) {
+ let newTime = value.split(".")[0].replace("T", " ");
+ return newTime;
+ },
+
+ //点击的改变页数
+ handleCurrentChange(value) {
+ this.page = value;
+ this.fetchUsdcbigtx(this.params.req, this.params.radius, this.search, this.params.start, this.params.end, this.page, this.limit)
+ },
+ //改变每页条数
+ handleSizeChange(val) {
+ this.page = 1;
+ this.limit = val;
+ this.fetchUsdcbigtx(this.params.req, this.params.radius, this.search, this.params.start, this.params.end, this.page, this.limit)
+
+ },
+
+ //点击的改变页数 Tron
+ handleCurrentChangeTron(value) {
+ this.tronPage = value;
+ this.fetchTronbigtx(this.tronParams.req, this.tronParams.radius, this.search, this.params.start, this.params.end, this.tronPage, this.tronLimit)
+ },
+ //改变每页条数 Tron
+ handleSizeChangTron(val) {
+ this.tronPage = 1;
+ this.tronLimit = val;
+ this.fetchTronbigtx(this.tronParams.req, this.tronParams.radius, this.search, this.params.start, this.params.end, this.tronPage, this.tronLimit)
+
+ },
+ //双击表格单元格复制
+ cellDblclick(row, column, cell, event) {
+ if (event.type === "dblclick") {
+ var save = (e) => {
+ e.clipboardData.setData("text/plain", event.target.innerText);
+ e.preventDefault(); //阻止默认行为
+ };
+ document.addEventListener("copy", save);
+ document.execCommand("copy");
+ document.removeEventListener("copy", save);
+ }
+ this.$message({ message: this.$t(`home.copy`), type: "success" }); //加提示
+ },
+ //父级选择Sma
+ handelSonSma(smaNUm) {
+ this.sma = smaNUm
+ let type
+ this.fetchUsdcbigtxcount(this.params.start, this.params.end, type, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[3], this.inChart, this.start, this.end)
+
+ },
+
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/USDCMonitoring/index.vue b/yq/src/views/USDCMonitoring/index.vue
new file mode 100644
index 0000000..deee23f
--- /dev/null
+++ b/yq/src/views/USDCMonitoring/index.vue
@@ -0,0 +1,188 @@
+
+
+
+
+
+
+ {{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
{{$t(`menu.USDCETH`)}}
+
+
+
+ {{$t(`home.table`)}}
+ {{ $t(`home.copyTabel`) }}
+
+
+
+
+
+ {{ formatTime(scope.row.date) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{$t(`menu2.tronUSDCBigTx`)}}
+
+
+
+ {{$t(`home.table2`)}}
+ {{ $t(`home.copyTabel`) }}
+
+
+
+
+
+ {{ formatTime(scope.row.date) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/USDT/index.js b/yq/src/views/USDT/index.js
new file mode 100644
index 0000000..01e46e4
--- /dev/null
+++ b/yq/src/views/USDT/index.js
@@ -0,0 +1,262 @@
+import * as echarts from "echarts";
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelSwitchs, handelUsdt, handelWatermark } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ USDTLoading: false,
+ params: {
+ req: "usdtVolume",
+ radius: "ETH",
+ start: "",
+ end: ""
+ },
+ tronParams: {
+ req: "tronUsdtVolume",
+ radius: "ETH",
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+
+ },
+ legend: {
+ right: "100",
+ // data:[`sopr`,'asopr','easopr','lthsopr','sthsopr',],
+ // selected:{
+ // 'asopr': false,
+ // 'easopr': false,
+ // 'lthsopr': false,
+ // 'sthsopr': false,
+ // }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//万
+ value = `${e / 10000}W`;
+ } else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right",
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "USDT on ETH",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "USDT on TRON",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f49495",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f49495",
+ width: "1",
+ },
+ data: [],
+ yAxisIndex: 0
+ },
+
+
+ ],
+ },
+ switch3: "",
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+
+ this.fetchUSDT(this.params.req, this.params.radius)
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("USDTBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("USDTBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchUSDT(req, radius, start, end, sma) {
+ this.USDTLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+ let usdtData = data.data
+
+ const tron = await this.$API.getCsupply(this.tronParams.req, this.tronParams.radius, start, end, sma)
+ let tronData = tron.data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ let noData1 = emptyData(tronData, this.option.series, this.inCharts, this)
+ if (noData || noData1) {
+ this.USDTLoading = false
+ return
+ }
+
+ let usdtValueList = []
+ //添加水印
+ this.option = handelWatermark(this.option)
+
+ //渲染usdt
+ usdtData.forEach(item => {
+ usdtValueList.push(parseInt(item.volume * 100) / 100)
+ })
+ let tronValueList = []
+ //渲染usdt USDt on TRON交易量
+ tronData.forEach(item => {
+ if (!item.date) return
+ tronValueList.push(parseInt(item.volumeSelf * 100) / 100)
+ })
+ this.option.series[0].data = handelUsdt(usdtData, usdtValueList)
+ //判断USDt on TRON交易量 没有数据返回
+ if (tronData[0].date) {
+ this.option.series[1].data = handelProfitrate(tronData, tronValueList)
+ }
+
+
+ this.inCharts()
+
+ this.USDTLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchUSDT(this.params.req, this.params.radius, this.params.start, this.params.end, this.sma)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级选择Sma
+ handelSonSma(smaNUm) {
+ this.sma = smaNUm
+ this.fetchUSDT(this.params.req, this.params.radius, this.params.start, this.params.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[3], this.inChart, this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/USDT/index.vue b/yq/src/views/USDT/index.vue
new file mode 100644
index 0000000..6604aba
--- /dev/null
+++ b/yq/src/views/USDT/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/USDTMonitoring/index.js b/yq/src/views/USDTMonitoring/index.js
new file mode 100644
index 0000000..fd5d7fa
--- /dev/null
+++ b/yq/src/views/USDTMonitoring/index.js
@@ -0,0 +1,353 @@
+import * as echarts from "echarts";
+import { chartsWidth,dataLength, emptyData, handelBigDeals, handelZoom, handelSwitchs, handelWatermark } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ USDTMonitoringLoading: false,
+ chartLoading: false,
+ params: {
+ req: "usdtbigtx",
+ radius: "eth",
+ start: "",
+ end: ""
+ },
+ paramsCount: {
+ req: "usdtbigtxcount",
+ radius: "eth",
+ },
+ tronParams: {
+ req: "tronUSDTBigTx",
+ radius: "eth",
+ },
+ tronParamsCount: {
+ req: "tronUSDTBigTxCount",
+ radius: "eth",
+ },
+ dataCount: [],
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ // data:[`sopr`,'asopr','easopr','lthsopr','sthsopr',],
+ // selected:{
+ // 'asopr': false,
+ // 'easopr': false,
+ // 'lthsopr': false,
+ // 'sthsopr': false,
+ // }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure`),
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//万
+ value = `${e / 10000}W`;
+ } else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right",
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "USDT on ETH",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "USDT on TRON",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f49495",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f49495",
+ width: "1",
+ },
+ data: [],
+ yAxisIndex: 0
+ },
+
+
+ ],
+ },
+ tabelloading: false,
+ tableData: [],
+ page: 1,
+ limit: 50,
+ search: "",
+ currentPage4: 1,
+ tronTabelloading: false,
+ tronTableData: [],
+ tronTotalPage: 0,
+ tronCurrentPage4: 1,
+ tronPage: 1,
+ tronLimit: 50,
+ totalPage: 0,
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ this.fetchUsdcbigtx(this.params.req, this.params.radius, this.search, this.params.start, this.params.end, this.page, this.limit)
+ this.fetchTronbigtx(this.tronParams.req, this.tronParams.radius, this.search, this.params.start, this.params.end, this.page, this.limit)
+ this.fetchUsdcbigtxcount()
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+ })
+
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("USDTMonitoringBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("USDTMonitoringBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ //请求页面tabel数据 大额交易监控表格
+ async fetchUsdcbigtx(req, radius, search, start, end, page, limit) {
+ this.USDTMonitoringLoading = true
+ //大额交易监控表格
+ const { data } = await this.$API.getBigDeals2(req, radius, search, start, end, page, limit);
+ this.tableData = data.data.data
+ this.totalPage = data.data.totalPage
+ this.currentPage4 = page
+ this.USDTMonitoringLoading = false
+ },
+ //请求页面tabel数据 USDC on TRON大额交易
+ async fetchTronbigtx(req, radius, search, start, end, page, limit) {
+
+ //大额交易监控表格
+ const { data } = await this.$API.getBigDeals2(req, radius, search, start, end, page, limit);
+ this.tronTableData = data.data.data
+ this.tronTotalPage = data.data.totalPage
+ this.tronCurrentPage4 = page
+
+ },
+ //请求折线图数据
+ async fetchUsdcbigtxcount(start, end, type, sma) {
+ this.chartLoading = true
+ // 大额交易监控曲线图
+ const { data } = await this.$API.getBigDealsCount(
+ this.paramsCount.req,
+ this.paramsCount.radius,
+ start,
+ end,
+ type,
+ sma
+ );
+
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.chartLoading = false
+ return
+ }
+ this.dataCount = data.data
+ //添加水印
+ this.option = handelWatermark(this.option)
+
+ let numValueList = []
+ this.dataCount.forEach(item => {
+ numValueList.push(parseInt(item.num * 100) / 100)
+ });
+ this.option.series[0].data = handelBigDeals(this.dataCount, numValueList)
+ // USDC on TRON大额交易 曲线图
+ const list = await this.$API.getBigDealsCount(
+ this.tronParamsCount.req,
+ this.tronParamsCount.radius,
+ start,
+ end,
+ type,
+ sma
+ );
+ let tronData = list.data.data
+ let tronValueList = []
+ tronData.forEach(item => {
+ tronValueList.push(parseInt(item.num * 100) / 100)
+ });
+ this.option.series[1].data = handelBigDeals(tronData, tronValueList)
+ this.inCharts();
+ this.chartLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ let type
+ this.fetchUsdcbigtxcount(this.params.start, this.params.end, type, this.sma)
+ },
+ //处理表格里的时间
+ formatTime(value) {
+ let newTime = value.split(".")[0].replace("T", " ");
+ return newTime;
+ },
+
+ //点击的改变页数
+ handleCurrentChange(value) {
+ this.page = value;
+ this.fetchUsdcbigtx(this.params.req, this.params.radius, this.search, this.params.start, this.params.end, this.page, this.limit)
+ },
+ //改变每页条数
+ handleSizeChange(val) {
+ this.page = 1;
+ this.limit = val;
+ this.fetchUsdcbigtx(this.params.req, this.params.radius, this.search, this.params.start, this.params.end, this.page, this.limit)
+
+ },
+
+ //点击的改变页数 Tron
+ handleCurrentChangeTron(value) {
+ this.tronPage = value;
+ this.fetchTronbigtx(this.tronParams.req, this.tronParams.radius, this.search, this.params.start, this.params.end, this.tronPage, this.tronLimit)
+ },
+ //改变每页条数 Tron
+ handleSizeChangTron(val) {
+ this.tronPage = 1;
+ this.tronLimit = val;
+ this.fetchTronbigtx(this.tronParams.req, this.tronParams.radius, this.search, this.params.start, this.params.end, this.tronPage, this.tronLimit)
+
+ },
+ //双击表格单元格复制
+ cellDblclick(row, column, cell, event) {
+ if (event.type === "dblclick") {
+ var save = (e) => {
+ e.clipboardData.setData("text/plain", event.target.innerText);
+ e.preventDefault(); //阻止默认行为
+ };
+ document.addEventListener("copy", save);
+ document.execCommand("copy");
+ document.removeEventListener("copy", save);
+ }
+ this.$message({ message: this.$t(`home.copy`), type: "success" }); //加提示
+ },
+
+ //父级选择Sma
+ handelSonSma(smaNUm) {
+ this.sma = smaNUm
+ let type
+ this.fetchUsdcbigtxcount(this.params.start, this.params.end, type, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[3], this.inChart, this.start, this.end)
+
+ },
+
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/USDTMonitoring/index.vue b/yq/src/views/USDTMonitoring/index.vue
new file mode 100644
index 0000000..a1a8d89
--- /dev/null
+++ b/yq/src/views/USDTMonitoring/index.vue
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+ {{ $t(`home.figure`) }}
+
+
+
+
+
+
+
{{$t(`menu.USDTETH`)}}
+
+
+
+ {{$t(`home.table`)}}
+ {{ $t(`home.copyTabel`) }}
+
+
+
+
+
+ {{ formatTime(scope.row.date) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{$t(`menu2.tronUSDTBigTx`)}}
+
+
+
+ {{$t(`home.table2`)}}
+ {{ $t(`home.copyTabel`) }}
+
+
+
+
+
+ {{ formatTime(scope.row.date) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/USTreasuriesYields/index.js b/yq/src/views/USTreasuriesYields/index.js
new file mode 100644
index 0000000..02363d5
--- /dev/null
+++ b/yq/src/views/USTreasuriesYields/index.js
@@ -0,0 +1,648 @@
+import * as echarts from "echarts";
+import { getUSTreasuriesYields } from "../../api/pages"
+import { chartsWidth, Debounce, emptyData, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ USTreasuriesYieldsLoading: false,
+ dataZoomStart: 1,
+ dataZoomEnd: 99,
+ option: {
+ graphic:[
+ {
+ type: 'group',
+ // rotation: Math.PI / 2,
+ bounding: 'raw',
+ right: "50%",
+ top: "40%",
+ // z: 10,
+ // rotation: 6,
+ children: [
+ {
+ type: 'text',
+ left: 'center',
+ top: 'center',
+
+ silent: true,//不影响鼠标事件
+
+ style: {
+ fill: `rgba(0,0,0,0.1)`,
+ text: `coinbus.cc`,
+ font: 'bold 80px sans-serif',
+
+ }
+ }
+ ]
+ }
+
+ ],
+
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: (params) => {
+
+
+ var res = params[0].axisValueLabel;
+
+ for (let i = 0; i < params.length; i++) {
+
+ res += `${params[i].marker} ${params[i].seriesName}-${this.params.limit.toUpperCase()}     ${params[i].value}% `
+
+
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}E `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ }
+
+
+ return res;
+ },
+ axisPointer:{
+ label: {
+ show: false,
+ // precision: 0, //坐标轴保留的位数
+ },
+ type: "cross",
+ }
+ },
+ legend: {
+
+ show: false,
+ right: "100",
+ selectable: true
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ // tooltip: {
+ // show: true
+ // }
+ },
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: (value) => {
+ let data
+ if (value >= 1000000000) {
+ data = `${(value / 1000000000).toFixed(2)}B`
+ } else if (value >= 1000000) {
+ data = `${(value / 1000000).toFixed(2)}M`
+ } else if (value >= 1000) {
+ data = `${(value / 1000).toFixed(2)}K`
+ } else if (value <= -1000000000) {
+ data = `${(value / 1000000000).toFixed(2)}B`
+ } else if (value <= -1000000) {
+ data = `${(value / 1000000).toFixed(2)}M`
+ } else if (value <= -1000) {
+ data = `${(value / 1000).toFixed(2)}K`
+ } else {
+ data = value
+
+ }
+
+ return data
+ }
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "slider",
+ start: 0,
+ end: 100,
+ },
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "TreasuriesYields",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "2",
+ },
+ data: [],
+ },
+
+
+
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ limit: "1m",
+
+ },
+ dataS: [{
+
+ }],
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ //K线总的数据
+ totalData: [],
+ timeIntervalList: [
+ {
+ value: "1m",
+ label: "home.month1",
+ },
+ {
+ value: "3m",
+ label: "home.month3",
+ },
+ {
+ value: "6m",
+ label: "home.month6",
+ },
+ {
+ value: "1y",
+ label: "home.year1",
+ },
+ {
+ value: "2y",
+ label: "home.year2",
+ },
+ {
+ value: "5y",
+ label: "home.year5",
+ },
+ {
+ value: "10y",
+ label: "home.year10",
+ },
+ {
+ value: "20y",
+ label: "home.year20",
+ },
+ {
+ value: "30y",
+ label: "home.year30",
+ },
+ ],
+ dragAndDrop: false,
+ USTData: [],
+ flagInterval: false,//判断是否点击改变了时间间隔 改变间隔option数据清空不拼接
+ startX: "",
+ loadingText: "",
+ draggingText: "",
+ draggingFlags: "",
+
+ }
+ },
+ mounted() {
+
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ //获取当前时间请求K线图
+ let nowTime = new Date()
+
+ // end 拿时间之前的1000条数据 start 拿时间之后的1000条数据
+ this.params.end = nowTime.toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai', hour12: false }).replace(/[/|年|月]/g, '-').replace(/[日|时]/g, '').replace(/分/g, ':')
+
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ //监听localstorage变化
+ window.addEventListener("setItem", () => {
+ this.zoomStart = localStorage.getItem("zoomStart");
+ this.zoomEnd = localStorage.getItem("zoomEnd");
+ });
+ this.fetchKline(this.params)
+
+
+
+
+ },
+ methods: {
+ // echarts鼠标事件
+ handelMouse(flag) {
+ // console.log("看if打开覅",flag);
+ // let mousePress
+ // mousePress = flag
+
+ // if (mousePress) {
+
+ // if ((this.dataZoomStart <10 || this.dataZoomEnd > 98) && this.option.series[0].data[0]) {
+ // Array(500).fill(1).forEach(item => {
+ // this.option.series[0].data.unshift(null)
+ // this.option.xAxis.data.unshift('')
+ // this.option.series[0].data.push(null)
+ // this.option.xAxis.data.push('')
+
+ // })
+
+ // }
+
+ // // this.dataZoomStart = this.dataZoomStart === 0 ? 25 : this.dataZoomStart
+ // // this.dataZoomEnd = this.dataZoomEnd = 100 ? 75 : this.dataZoomEnd
+ // }
+
+
+
+ // this.dragAndDrop = flag
+
+ // this.inCharts()
+ },
+
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("USTreasuriesYieldsBox"));
+ }
+ // this.option.dataZoom[0].start = this.dataZoomStart
+ // this.option.dataZoom[0].end = this.dataZoomEnd
+ this.option = handelZoom(
+ this.myChart,
+ this.option,
+ this,
+ this.zoomStart,
+ this.zoomEnd
+ );
+
+ this.myChart.setOption(this.option);
+
+ chartsWidth("USTreasuriesYieldsBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+
+
+ },
+
+ //请求数据 防抖Debounce函数
+ fetchKline: Debounce(async function (params) {
+ let { data } = await getUSTreasuriesYields(params)
+
+ // if (!data.data[0]) {//无数据
+ // this.$message({
+ // type: 'warning',
+ // message: this.$t(`home.NoData`)
+ // });
+ // this.option.xAxis.data.length = 0
+ // this.option.series[0].data.length = 0
+ // this.inCharts()
+
+ // }
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+
+ return
+ }
+
+ //添加水印
+ // this.option = handelWatermark(this.option)
+ // //减掉开头空白数据
+
+ // if (!this.USTData[0] === null) {
+ // console.log(this.USTData[0],"减掉了开头");
+ // this.USTData = this.USTData.splice(0, 499)
+
+ // }
+ // // 减掉结尾空白数据
+ // if (this.USTData[this.length - 1]) {
+ // console.log(this.USTData[this.length - 1],"减掉了结尾");
+ // this.USTData = this.USTData.splice(this.length - 500, 500)
+ // }
+ if (this.flagInterval) {
+ this.USTData = data.data
+ } else {
+
+ this.USTData = [...data.data, ...this.USTData]
+
+
+ }
+
+ // console.log("拼接数据", this.USTData);
+ this.flagInterval = false//确定是否拼接数据
+ this.USTData.forEach(item => {
+
+ if (item.date.includes("T")) {
+ item.date = item.date.split(`T`)[0]
+ }
+
+ })
+ //排序
+ this.USTData = this.dateSort(this.USTData)
+
+ //去重
+ this.USTData = this.removal(this.USTData)
+
+
+ this.params.start = await this.USTData[0].date
+ this.params.end = await this.USTData[this.USTData.length - 1].date
+ this.option.series[0].data.length = 0
+ this.option.xAxis.data.length = 0
+ this.USTData.forEach(item => {
+ this.option.series[0].data.push(item.value)
+ this.option.xAxis.data.push(item.date)
+ })
+
+ //判断是否是初始数据 ,是 则不处理,不是 则判断是否有空数据未处理,有则 处理空数据
+ // console.log(this.option.series[0].data[0]===null,"基督教地点");
+ if (!this.option.series[0].data[0] === null) {
+ // console.log(this.option.series[0].data[0],"基督教地点");
+ this.option.series[0].data = this.option.series[0].data.slice(500, this.option.series[0].data.length - 500)
+
+ this.option.xAxis.data = this.option.xAxis.data.slice(500, this.option.xAxis.data.length - 500)
+
+ }
+ //限制滚动最大范围
+ if (!this.option.dataZoom) return
+
+ if (this.option.xAxis.type == "time") {
+ this.option.dataZoom[0].minValueSpan = 3600 * 24 * 1000 * 7
+ } else {
+ this.option.dataZoom[0].minValueSpan = 6
+ }
+
+ this.inCharts()
+ // 添加鼠标事件监听器
+ this.myChart.getZr().on('mousedown', (params) => {
+ // 记录鼠标按下时的坐标
+ this.startX = params.offsetX;
+ });
+
+ this.myChart.getZr().on('mouseup', (params) => {
+ // console.log(params.target.type, "params.target");
+ if (params.target && params.target.type) {//拖动滚动条未到两边区域时不触发请求
+ return
+ }
+ // 获取鼠标松开时的坐标
+ const endX = params.offsetX;
+ // 获取提示文字的元素
+ this.loadingText = document.getElementById('loadingText');
+ // 判断拖拽方向
+ if (endX > this.startX) {// 左边
+ this.draggingFlags = "left"
+ console.log("左边",);
+ Array(500).fill(1).forEach(item => {
+ this.option.series[0].data.unshift(null)
+ this.option.xAxis.data.unshift('')
+ this.option.series[0].data.push(null)
+ this.option.xAxis.data.push('')
+
+ })
+ this.params.start = ""
+ this.params.end = this.USTData[0].date
+ this.draggingText = this.$t(`home.loading`) + this.params.end + this.$t(`home.ago`)
+ this.loadingText.style.display = 'block';
+ this.fetchKline(this.params)
+
+ } else if (endX < this.startX) {
+ // 右边
+
+ this.draggingFlags = "right"
+ Array(500).fill(1).forEach(item => {
+ this.option.series[0].data.unshift(null)
+ this.option.xAxis.data.unshift('')
+ this.option.series[0].data.push(null)
+ this.option.xAxis.data.push('')
+ })
+ this.loadingText.style.display = 'block';
+ this.params.end = ""
+ this.params.start = this.USTData[this.USTData.length - 1].date
+ this.draggingText = this.$t(`home.loading`) + this.params.start + this.$t(`home.after`)
+ this.fetchKline(this.params)
+ }
+ });
+
+
+
+
+
+
+
+ if (this.loadingText) {
+ this.loadingText.style.display = 'none';
+ }
+
+ setTimeout(() => {
+ //监听echarts 图表滚动
+ this.myChart.on("dataZoom", (e)=> {
+ if (!e || (!e.start && !e.batch?.[0]?.start)) {
+ return;
+ }
+ this.zoomStart = e.start || e.batch[0].start;
+ this.zoomEnd = e.end|| e.batch[0].end;
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ });
+ });
+
+
+ }, 1000),
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchUSTreasuriesYields(this.params)
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[5], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[6], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchUSTreasuriesYields(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[5], this.inCharts,this.start, this.end,)
+
+ },
+ //下拉选择
+ handelChang() {
+ this.flagInterval = true
+ this.fetchKline(this.KlineParams)
+
+ },
+
+ //处理时间栏导航
+ handelTimeList(event) {
+ if (!event.target.title) return;
+ this.KlineParams.interval = event.target.title;
+ this.flagInterval = true
+ this.fetchKline(this.KlineParams)
+
+ },
+ //处理弹窗的导航点击
+ handelPopupList(event) {
+ if (!event.target.title) return;
+ this.KlineParams.interval = event.target.title;
+ this.flagInterval = true
+ this.fetchKline(this.KlineParams)
+ },
+ //处理高亮时间显示
+ handelHighlight(data) {
+ if (data) {
+ return this.intervalList.find(item => item.value == data).label
+ }
+ },
+ activeInterval(interval) {
+ if (interval) {
+ return this.timeIntervalList.find(item => item.value == interval).label
+ }
+ },
+ handelTimeInterval(limit) {
+ this.flagInterval = true//选择时间不拼接之前的数据
+ this.params.start = "" //清空尾部时间
+ this.params.limit = limit
+ this.fetchKline(this.params)
+ },
+ //根据时间排序
+ dateSort(arr) {
+ let newArr = [...arr];
+
+ let temp = newArr.sort(function (obj1, obj2) {
+ let a = new Date(obj1.date) / 1000;
+ let b = new Date(obj2.date) / 1000;
+
+ return a - b;
+ });
+
+ return temp;
+ },
+ //去重
+ removal(str1) {
+
+ // 定义 Set 和比较函数
+ let uniqueArray = Array.from(
+ new Set(str1.map(obj => JSON.stringify(obj)))
+ ).map(str => JSON.parse(str));
+ return uniqueArray
+
+
+ },
+
+
+
+
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/USTreasuriesYields/index.vue b/yq/src/views/USTreasuriesYields/index.vue
new file mode 100644
index 0000000..dd9e974
--- /dev/null
+++ b/yq/src/views/USTreasuriesYields/index.vue
@@ -0,0 +1,179 @@
+
+
+
+
+
+ {{ draggingText }}
+
+
+
+
+
+ {{ $t(item.label) }}
+
+
+
+ {{ $t(activeInterval(params.limit)) }}
+
+
+
+
{{$t(`bian.selectCycle`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/UpdateContent/index.js b/yq/src/views/UpdateContent/index.js
new file mode 100644
index 0000000..e69de29
diff --git a/yq/src/views/UpdateContent/index.vue b/yq/src/views/UpdateContent/index.vue
new file mode 100644
index 0000000..3278c99
--- /dev/null
+++ b/yq/src/views/UpdateContent/index.vue
@@ -0,0 +1,384 @@
+
+
+
版本更新内容
+
+
+ 版本号:
+ V2.0.19
+
+
+ 更新日期:
+ 2025-02-11
+
+
+
更新内容:
+
1.seo英文版添加
+
+
+
+
+
+
+
+ 版本号:
+ V2.0.18
+
+
+ 更新日期:
+ 2025-01-09
+
+
+
更新内容:
+
1.路由添加seo描述、添加预渲染插件 、添加vue-meta-info插件、配置关键页面vue-meta-info信息内容
+
2.部分页面取消初始隐藏图表线条
+
3.添加seo静态页面
+
+
+
+
+
+
+ 版本号:
+ V2.0.17
+
+
+ 更新日期:
+ 2024-05-16
+
+
+
+
+
+
+ 版本号:
+ V2.0.16
+
+
+ 更新日期:
+ 2024-03-29
+
+
+
更新内容:
+
1.消息订阅:添加消息订阅地址填写提示、添加重复订阅验证
+
+
+
+
+
+
+
+ 版本号:
+ V2.0.15
+
+
+ 更新日期:
+ 2024-03-22
+
+
+
更新内容:
+
1.稳定币:BUSD大额交易隐藏
+
2.工单系统支付页面重新排版更新页面
+
3.BTC-网络-大额交易搜索框位置调整,搜索条件输入优化
+
4.检查所有页面英文状态下的显示优化
+
5.所有滚动条页面两侧显示时间,1天的数据不显示时分秒
+
+
+
+
+
+
+ 版本号:
+ V2.0.14
+
+
+ 更新日期:
+ 2024-03-13
+
+
+
更新内容:
+
1.检查所有页面图表优化显示调整保留小数:11个页面: a.短持者未实现的净收益损失比:改为保留4为小数 b.按余额划分 地址数分布 余额 >=100 & < 1000 比率分布:改为保留4为小数 c.按余额划分 币数量分布 8个页面比率分布:改为保留4为小数 d.市场指标:Arh999囤币及逃顶指标 24小时数据图:改为保留4为小数
+
2.redmine需求: a.未登录用户进入网站后不要直接弹登陆页面 b.未登录用户保持现有权限不变 c.未登录用户权限以外的页面,遮罩层应该跳转到登陆页面,而非升级页面 d.登陆页面的注册按钮应该显示更明显 e.导航栏 个人中心 应改为当前账号名称,下拉菜单中的账号名称应该为个人中心,只改显示名称,不改跳转和功能
+
3.优化登录成功 当前页面刷新
+
4.优化柱状图可以显示全部:买入大单挂单、卖出大单挂单
+
+
+
+
+
+
+
+
+
+ 版本号:
+ V2.0.13
+
+
+ 更新日期:
+ 2024-03-07
+
+
+
更新内容:
+
1.大额交易页面变更需求: (1).表格--利润:计算方式更改(数值-1)/100保留6位小数改为 数值*100 保留5位小数 (2).receive n表头改为 该笔交易索引号 vout.n
+
2.每日已实现盈利交易占比实时数据变更需求 变更前:直接用返回数值添加% 变更后:数值需要乘以100后添加百分号
+
3.已花费输出休眠平均天数(供应量调整):调整保留小数位数为8位,返回的科学计算法数据重新处理
+
4.BTC持有者分布-按余额划分币数量分布:所有页面的tooltip 显示添加 “/ Total”
+
5.新用户注册通知已添加
+
6.检查所有页面,数据按天返回的修改渲染方式,去掉tooltip时分秒
+
7. 统一所有页面,统一设置调整Y轴 (左侧Y轴数据,右侧Y轴价格):稳定币、宏观经济
+
8. 页面bug修复
+
+
+
+
+
+
+
+
+ 版本号:
+ V2.0.12
+
+
+ 更新日期:
+ 2024-03-01
+
+
+
更新内容:
+
1.修改版本号V2.1.2 改为V2.0.12
+
2.页面中英文导航根据拆分图例页面的excel对应修改
+
3.coinbus路由调整:(1)根据结构图修改导航栏及相关路由对应页面调整 (2)导航栏权限更新修改(目前没有客服权限、暂时设置admin权限) (3)转账记录、提现记录、充值、提现订单页面删除
+
4.消息订阅:订阅与告警已完成与后端联调,还需验证中英文传参是否有问题
+
+
+
+
+
+
+
+
+ 版本号:
+ V2.1.2
+
+
+ 更新日期:
+ 2024-02-20
+
+
+
更新内容:
+
1.BTC币种所有页面,统一设置调整Y轴 (左侧Y轴数据,右侧Y轴价格)
+
2.页面拆分:
+ 按余额划分-地址数分布拆分为:余额 <=0.01、余额 >=0.01 & < 0.1、余额 >=0.1 & < 1、余额 >=1 & < 10、余额 >=10 & < 100、余额 >=100 & < 1000、余额 >=1000 & < 10000、余额 >=10000
+ 按余额划分-币数量分布拆分为拆分为:余额 <=0.01、余额 >=0.01 & < 0.1、余额 >=0.1 & < 1、余额 >=1 & < 10、余额 >=10 & < 100、余额 >=100 & < 1000、余额 >=1000 & < 10000、余额 >=10000
+
+
+
+
+
+
+
+
+ 版本号:
+ V2.1.1
+
+
+ 更新日期:
+ 2024-02-20
+
+
+
更新内容:
+
1.页面拆分: 待交易池详情拆分为:交易内存池数量、交易内存池费用 币天销毁量拆分为:币天销毁量、币天销毁量(供应调整)
+ 已花费输出休眠平均天数拆分为:已花费输出休眠平均天数、已花费输出休眠平均天数(供应量调整)
+
+ 合约主动买入量拆分为:合约主动买入量、合约主动买入量(买卖比率)
+
+
+
+
+
+
+
+ 版本号:
+ V2.1.0
+
+
+ 更新日期:
+ 2024-02-06
+
+
+
更新内容:
+
1.未平仓合约数、合约主动买入量默认请求开始时间为当前日期减去一个月
+
2.页面拆分:交易统计拆分为:交易量、交易费、交易量(找零消除) 地址统计拆分为:地址统计、新地址数、新地址交易量、总地址数 矿工余额拆分为:矿工地址数、矿工地址余额
+
+
+
+
+
+
+ 版本号:
+ V2.0.9
+
+
+ 更新日期:
+ 2024-02-02
+
+
+
更新内容:
+
1.币天销毁量年龄分布处理价格后面百分号问题
+
2.每日已实现盈利交易占比 实时数据显示问题(价格返回数据问题已反馈)
+
3.宏观经济-货币金融-实时汇率页面,美元固定在第一行
+
4.交易所余额上方,将all固定在第一个
+
5.持有者分布-按持有时间划分页面24h变化未体现出来(已取消24H按钮)
+
6.资金费率增加图例,可以选择曲线或者柱状图
+
+
+
+
+
+ 版本号:
+ V2.0.8
+
+
+ 更新日期:
+ 2024-01-29
+
+
+
更新内容:
+
1.地址统计实时数据隐藏ew_address、total_address、new_address_volume数据为0
+
2.隐藏ETH币种所有页面
+
+
+
+
+
+ 版本号:
+ V2.0.7
+
+
+ 更新日期:
+ 2024-01-26
+
+
+
更新内容:
+
1.BTC以下页面添加实时数据:地址统计 、交易统计、已花费输出盈利比、已花费输出平均寿命、已花费输出休眠平均天数、币天销毁量、币天销毁量年龄分布、每日已实现盈利交易占比
+
+
+
+
+
+ 版本号:
+ V2.0.6
+
+
+ 更新日期:
+ 2024-01-23
+
+
+
更新内容:
+
1.隐藏未实现功能的静态页面
+
2.优化404页面
+
+
+
+
+
+ 版本号:
+ V2.0.5
+
+
+ 更新日期:
+ 2024-01-19
+
+
+
更新内容:
+
1.个人资料页面取消权限等级情况的标签页
+
2.单独新增权限等级页面
+
3.订阅与告警新增阈值类型选择(范围输入、数值输入)
+
4.后台管理--访问统计页面(数据监控)删除
+
+
+
+
+
+ 版本号:
+ V2.0.4
+
+
+ 更新日期:
+ 2024-1-11
+
+
+
更新内容:
+
1.BTC、ETH交易所余额修改渲染方式(无数据不补0)
+
2.消息订阅页面添加
+
+
+
+
+
+ 版本号:
+ V2.0.3
+
+
+ 更新日期:
+ 2023-12-21
+
+
+
更新内容:
+
1.页面数据长短不一致弹窗显示权限控制,只能admin权限用户显示
+
+
+
+
+
+ 版本号:
+ V2.0.2
+
+
+ 更新日期:
+ 2023-12-8
+
+
+
更新内容:
+
1.成交量分布图页面隐藏
+
2.宏观经济--国债收益率页面显示图表滚动条、优化页面添加拖拽提示
+
+
+
+
+
+ 版本号:
+ V2.0.1
+
+
+ 更新日期:
+ 2023-11-22
+
+
+ 更新内容:
+ 增加更新内容页面
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/VDD/index.js b/yq/src/views/VDD/index.js
new file mode 100644
index 0000000..5934782
--- /dev/null
+++ b/yq/src/views/VDD/index.js
@@ -0,0 +1,189 @@
+import * as echarts from "echarts";
+import { handelZoom, chartsWidth, emptyData, handelWatermark, handelLineType, handelSwitchs } from "../../util/processingData"
+import { getVDD } from "../../api/apiPost"
+export default {
+ data() {
+ return {
+ option: {
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'cross',
+ crossStyle: {
+ color: '#999'
+ }
+ }
+ },
+
+ legend: {
+ right: "100",
+ },
+ xAxis: [
+ {
+ type: 'category',
+ // data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
+ axisPointer: {
+ type: 'shadow'
+ },
+ data:[]
+ }
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ yAxis: [
+ {
+ type: 'value',
+ // name: 'Precipitation',
+ // min: 0,
+ // max: 250,
+ // interval: 50,
+ // axisLabel: {
+ // formatter: '{value} ml'
+ // }
+ },
+ {
+ type: 'value',
+ position: "right",
+ show:true,
+
+ }
+ ],
+ series: [
+ {
+ name: 'VDD Multiple',
+ type: 'bar',
+ // tooltip: {
+ // valueFormatter: function (value) {
+ // return value + ' ml';
+ // }
+ // },
+ data: [ ]
+
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#000",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#000",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+ ]
+ },
+ params: {
+ start:"",
+ end:"",
+ sma:"",
+ },
+ VDDLoading:false,
+ sma:"",
+ start:"",
+ end:"",
+ }
+ },
+ mounted() {
+ console.log("45646");
+ this.fetchVdd()
+ },
+ methods: {
+ //初始化折线图图表
+ inChartsLine() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("VDDBox"));
+ }
+ this.option= handelZoom(this.myChart,this.option,this,this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("VDDBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();;
+ });
+
+ },
+ async fetchVdd(params){
+ this.VDDLoading = true
+ const {data} = await getVDD(params)
+ let VDDdata = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChartsLine, this)
+ if (noData) {
+ emptyData(data.data, this.option.series, this.inChartsLine, this)
+
+ this.VDDLoading = false
+ return
+ }
+
+ this.start =VDDdata[0].date.split("T")[0]
+ this.end = VDDdata[VDDdata.length - 1].date.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+
+ this.option= handelWatermark(this.option)
+ let barValue = []
+ let xAxisData = []
+ VDDdata.forEach(item=>{
+
+ barValue.push(item.value)
+ xAxisData.push(item.date.split("T")[0])
+ })
+ this.option.xAxis[0].data = xAxisData
+ this.option.series[0].data = barValue
+ this.option.series[1].data = priceData
+ this.inChartsLine()
+ console.log(data,6666);
+
+ this.VDDLoading = false
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchVdd(this.params)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.sma = smaDataList
+ this.params.sma = smaDataList
+ this.fetchVdd(this.params)
+ this.$addStorageEvent(1, "sma", this.sma);
+ },
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/VDD/index.vue b/yq/src/views/VDD/index.vue
new file mode 100644
index 0000000..7473ca8
--- /dev/null
+++ b/yq/src/views/VDD/index.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/Withdrawal/index.js b/yq/src/views/Withdrawal/index.js
new file mode 100644
index 0000000..74d4b03
--- /dev/null
+++ b/yq/src/views/Withdrawal/index.js
@@ -0,0 +1,321 @@
+import { Apply ,getEmailCode} from "../../api/pay"
+import { GetUserAccount } from "../../api/help"
+export default {
+ data() {
+ return {
+ params: {
+ coin: 'USDT',
+ chain: '',
+ amount: '',
+ address: "",
+ emailCode: "",
+ },
+ value: "",
+ options: [{
+ value: '10',
+ label: '10'
+ }, {
+ value: '20',
+ label: '20'
+ }, {
+ value: '50',
+ label: '50'
+ }, {
+ value: '100',
+ label: '100'
+ }, {
+ value: '200',
+ label: '200'
+ }, {
+ value: '500',
+ label: '500'
+ }, {
+ value: '1000',
+ label: '1000'
+ }],
+ coinOptions: [{
+ value: 'USDT',
+ label: 'USDT'
+ }, {
+ value: 'USDC',
+ label: 'USDC'
+ }, {
+ value: 'BUSD',
+ label: 'BUSD'
+ }],
+ chainOptions: [{
+ value: 'TRX',
+ label: 'TRX-TRC20',
+ disabled: false
+ }, {
+ value: 'ETH',
+ label: 'ETH-ERC20',
+ disabled: false
+ }, {
+ value: 'BSC',
+ label: 'BSC-BEP20',
+ disabled: true
+ }],
+ outerVisible: false,
+ innerVisible: false,
+ transactionData: {
+ orderId: "",
+ address: ""
+ },
+ WithdrawalLoading: false,
+ ConfirmationLoading: false,
+ CloseTransferLoading: false,
+ ProblemLoading: false,
+ dialogVisibleSuccess: false,
+ codeBtn: {
+ btnStatus: false,
+ btnText: "login.getCode",
+ btnType: "primary",
+ },
+ balances: {
+ total: "",
+ usdc: "",
+ usdt: "",
+ userId: "",
+ userName: ""
+
+ },
+ outTimer: "",
+ codeTimer: null,
+
+ }
+ },
+ mounted() {
+ this.fetchUserAccount()//请求当前余额
+
+ },
+ methods: {
+ //请求邮箱验证码
+ async fetchCode(params) {
+
+ const { data } = await getEmailCode(params)
+
+ if (data.code === 200) {//提现成功
+ this.$message({
+ type: 'success',
+ message:this.$t(`pay.mailbox`),
+ duration: 3000,
+ showClose: true,
+ });
+
+
+ } else {
+ //获取验证码失败清除按钮倒计时
+ clearTimeout(this.outTimer);
+ clearInterval(this.codeTimer);
+ //取消按钮禁用
+ this.codeBtn.btnStatus = false;
+ //按钮文字改成获取验证码
+ this.codeBtn.btnText = "login.getCode";
+ }
+
+ },
+ //请求申请提现
+ async fetchWithdrawal(params) {
+ this.WithdrawalLoading = true
+ const { data } = await Apply(params)
+
+ if (data.code === 200) {//提现成功
+ this.$message({
+ type: 'success',
+ message: data.msg,
+ duration: 3000,
+ showClose: true,
+ });
+
+ this.$router.push(`/personal`)
+ }
+
+ this.WithdrawalLoading = false
+ },
+ //请求当前余额
+ async fetchUserAccount(params) {
+ const { data } = await GetUserAccount(params)
+ this.balances = data.data
+ this.params.amount = this.balances.usdt
+
+ },
+
+
+
+ //点击确认提交提现
+ handelWithdrawal() {
+
+ let pattern = /^\d+(\.\d+)?$/; //金额只能是数字正则表达
+ if (!pattern.test(this.params.amount)) {
+ this.$message({
+ message: this.$t(`pay.rechargeAmount`),
+ type: "error",
+ });
+
+ return
+ }
+ if (this.params.amount <= 0) {
+ this.$message({
+ message: this.$t(`pay.paymentAmount`),
+ type: "error",
+ });
+ return
+ }
+
+
+ for (const key in this.params) { //判空
+
+
+ if (this.params[key] == "") {
+ switch (key) {
+ case "coin":
+ this.$message({
+ message: this.$t(`pay.paymentCurrency`),
+ type: "error",
+ });
+ break;
+ case "chain":
+ this.$message({
+ message: this.$t(`pay.paymentNetwork`),
+ type: "error",
+ });
+ break;
+ case "address":
+ this.$message({
+ message: this.$t(`pay.paymentAddress`),
+ type: "error",
+ });
+ break;
+ case "emailCode":
+ this.$message({
+ message: this.$t(`pay.paymentCode`),
+ type: "error",
+ });
+ break;
+ case "amount":
+ this.$message({
+ message: this.$t(`pay.paymentAmount`),
+ type: "error",
+ });
+ break;
+
+
+ default:
+ break;
+ }
+
+
+ return
+ }
+ }
+
+
+
+
+ // 判断总金额是否足够
+ switch (this.params.coin) {
+ case "USDT":
+
+
+ if (this.balances.usdt - this.params.amount < 0) {
+ this.$message({
+ type: 'error',
+ message:this.$t(`pay.Insufficient`)
+ });
+ return
+ }
+ break;
+ case "USDC":
+
+ if (this.balances.usdc - this.params.amount < 0) {
+ this.$message({
+ type: 'error',
+ message:this.$t(`pay.Insufficient`)
+ });
+ return
+ }
+
+ break;
+ case "BUSD":
+
+ if (this.balances.busd - this.params.amount < 0) {
+ this.$message({
+ type: 'error',
+ message:this.$t(`pay.Insufficient`)
+ });
+ return
+ }
+
+ break;
+
+ default:
+ break;
+ }
+ this.fetchWithdrawal(this.params)
+ },
+ //选择币种 金额随之变化
+ handelCoin(value) {
+ // 币种变化 金额随之变化
+ // switch (this.params.coin) {
+ // case "USDT":
+ // this.params.amount = this.balances.usdt
+ // break;
+ // case "USDC":
+ // this.params.amount = this.balances.usdc
+
+
+ // break;
+ // case "BUSD":
+
+ // this.params.amount = this.balances.busd
+
+ // break;
+
+ // default:
+ // break;
+ // }
+ },
+ //获取邮箱验证
+ handelCodeBtn(){
+
+ this.fetchCode()
+ // 获取验证码后禁用按钮
+ this.codeBtn.btnStatus = true;
+ // 按钮倒计时
+ this.outTimer = setTimeout(() => {
+ this.countDown(60);
+ }, 5);
+
+ },
+ //验证码倒计时
+ countDown(val) {
+ //判断定时器是否存在
+ if (this.codeTimer) {
+ clearInterval(this.codeTimer);
+ }
+ //按钮文字改成发送中
+ this.codeBtn.btnText = "login.sending";
+ this.codeBtn.btnStatus = false;
+ //setTiemOut 执行一次
+ // setInterval 不断执行,需要条件才会停止
+ let tim = val;
+ this.codeTimer = setInterval(() => {
+ tim--;
+ if (tim === 0) {
+ clearInterval(this.codeTimer);
+ this.codeBtn.btnStatus = false;
+ //按钮文字改成获取验证码
+ this.codeBtn.btnText = "login.getCode";
+ } else {
+ this.codeBtn.btnStatus = true;
+ this.codeBtn.btnText = tim;
+ }
+ }, 1000);
+ },
+
+
+
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/Withdrawal/index.vue b/yq/src/views/Withdrawal/index.vue
new file mode 100644
index 0000000..be47bbd
--- /dev/null
+++ b/yq/src/views/Withdrawal/index.vue
@@ -0,0 +1,270 @@
+
+
+
+
{{ $t(`pay.withdrawal_1`) }}
+
+
+
+
+
+ * {{ $t(`pay.currency`) }}
+
+
+
+
+
+
+
+
+
+ * {{ $t(`pay.money`) }}
+
+
+
+
+
+
+
+
+
+
+
+ * {{ $t(`pay.network`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ * {{ $t("login.authCode") }}
+
+
+
+
+ {{ $t(codeBtn.btnText) }}
+
+
+
+
+
+ * {{ $t(`pay.receivingAddress`) }}
+
+
+
+
+
+
+ {{ $t(`pay.accountBalance`) }} :
+
+
+ USDC : {{ balances.usdc }}
+
+
+ USDT : {{ balances.usdt }}
+
+
+ BUSD : {{ balances.busd }}
+
+
+ {{ $t(`home.totalAmount`) }} :
+ {{ balances.total }}
+
+
+
+
+
+
+
+
+ {{ $t("pay.Reminder") }}:
+ {{ $t("pay.Reminder_1") }}
+
+ {{ $t("pay.Reminder_2") }}
+
+
+ {{ $t("pay.Reminder_3") }}
+
+ {{ $t("pay.Reminder_4") }}
+
+
+
+
+
{{ $t(`pay.confirmSubmission`) }}
+
+
+
+
+
+
diff --git a/yq/src/views/WorkOrderDetails/index.js b/yq/src/views/WorkOrderDetails/index.js
new file mode 100644
index 0000000..0ff82a1
--- /dev/null
+++ b/yq/src/views/WorkOrderDetails/index.js
@@ -0,0 +1,470 @@
+import { mapState } from "vuex";
+import axios from 'axios'
+import { getTicketDetails, getSubmitAuditTicket, getResubmitTicket,getEndTicket, getDownloadFile, getRetractTicket } from "../../api/help"
+export default {
+ data() {
+ return {
+ helpLoading: false,
+ imgSrc: "https://studio.glassnode.com/images/crypto-icons/btc.png",
+ navLabel: "Bitcoin (BTC)",
+ userName: "LX",
+ from: {
+ title: "",
+ kinds: "",
+ description: ""
+ },
+ kindsList: [{
+ value: "购买咨询",
+ label: "购买咨询",
+ }, {
+ value: "财务咨询",
+ label: "财务咨询",
+ }, {
+ value: "网页问题",
+ label: "网页问题",
+ },
+ {
+ value: "账户问题",
+ label: "账户问题",
+ },
+ {
+ value: "移动端问题",
+ label: "移动端问题",
+ },
+ {
+ value: "消息订阅",
+ label: "消息订阅",
+ },
+ {
+ value: "指标数据问题",
+ label: "指标数据问题",
+ },
+ {
+ value: "其他",
+ label: "其他",
+ }],
+ params: {
+ id: ""
+ },
+ input: 1,
+ tableData: [{
+ num: 1,
+ time: "2022-09-01 16:00",
+ problem: "账户问题",
+ questionTitle: "账户不能登录",
+ state: "已解决"
+ }],
+ textarea: "我是提交内容",
+ textarea1: "我是回复内容",
+ textarea2: "",
+ ticketDetails: {
+ id: "",
+ type: "",
+ title: "",
+ userName: "",
+ desc: "",
+ responName: "",
+ respon: "",
+ submitTime: "",
+ status: "",
+ fileIds: "",
+ files: "",
+ responTime: ""
+
+ },
+ paramsResubmit: {//继续提交参数
+ id: "",
+ desc: "",
+ files: "",
+ },
+ //上传后的文件列表
+ fileList: [],
+ // 允许的文件类型
+ fileType: ["rar", "doc", "txt", "png", "jpg", "jpeg",],
+ // 运行上传文件大小,单位 M
+ fileSize: 20,
+ // 附件数量限制
+ fileLimit: 3,
+ //请求头
+ headers: { "Content-Type": "multipart/form-data" },
+ FormDatas: null,
+ filesId: [],
+ paramsDownload: {
+ id: ""
+ },
+ //撤回工单参数
+ paramsRetractTicket: {
+ id: ""
+ },
+ WorkOrderDetailsLoading: false,
+ detailsID: "",
+ submitShow: true,// 继续提交部分是否显示
+ //提交审核参数
+ paramsSubmitAuditTicket: {
+ id: ""
+ },
+ //审核信息
+ auditList: {},
+ downloadUrl: "",
+ dialogVisible:false
+
+
+
+
+ }
+ },
+ computed: {
+ ...mapState({
+ current: (state) => state.tab.currentMenu,
+ }),
+ },
+ // created(){
+ // this.$addStorageEvent(1, "detailsID",this.$route.params.id );
+
+
+ // },
+ mounted() {
+ this.detailsID = localStorage.getItem("detailsID")
+ window.addEventListener("setItem", () => {
+ this.detailsID = localStorage.getItem("detailsID")
+ });
+ this.fetchTicketDetails({ id: this.detailsID })
+
+
+
+ },
+ methods: {
+ //请求工单详情
+ async fetchTicketDetails(data) {
+ this.WorkOrderDetailsLoading = true
+ const list = await getTicketDetails(data)
+ if (list.data.code !== 200) {
+ this.$message({
+ message: list.data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+ this.auditList = list.data.data.audit
+ this.ticketDetails = list.data.data
+ this.ticketDetails.submitTime = `${this.ticketDetails.submitTime.split(`T`)[0]} ${this.ticketDetails.submitTime.split(`T`)[1].split(`.`)[0]}`
+
+ if (this.ticketDetails.status == "撤回") {
+ this.submitShow = false
+ }
+ this.WorkOrderDetailsLoading = false
+ },
+
+ //请求继续提交工单
+ async fetchResubmitTicket(data) {
+ const list = await getResubmitTicket(data)
+ if (list.data.code == 200) {
+ this.$message({
+ message: list.data.msg,
+ type: "success",
+ customClass: "messageClass",
+ });
+
+ for (const key in this.paramsResubmit) {//清空工单
+ this.paramsResubmit[key] = ""
+ }
+ //再次请求工单详情
+ this.fetchTicketDetails({ id: this.detailsID })
+
+ this.fileList = [] // 清空已上传列表
+
+ }
+
+
+
+ },
+ //请求文件下载
+ async fetchDownloadFile(ids) {
+ this.WorkOrderDetailsLoading = true
+ // const list = await getDownloadFile(data)
+ const list = await this.$API.getDownloadFile(ids)
+ this.$message({
+ message: list.data.msg,
+ type: "warning",
+ customClass: "messageClass",
+ });
+
+ this.WorkOrderDetailsLoading = false
+ },
+ //请求提交审核
+ async fetchSubmitAuditTicket(data) {
+
+ this.WorkOrderDetailsLoading = true
+ const list = await getSubmitAuditTicket(data)
+ if (list.data.code == 200) {
+ this.$message({
+ message: list.data.msg,
+ type: "success",
+ customClass: "messageClass",
+ });
+
+ for (const key in this.ticketDetails) {//清空工单
+ this.ticketDetails[key] = ""
+ }
+
+ }
+ this.WorkOrderDetailsLoading = false
+
+ },
+ //请求撤回工单
+ async fetchRetractTicket(data) {
+ this.WorkOrderDetailsLoading = true
+ const list = await getRetractTicket(data)
+ if (list.data.code == 200) {
+ this.$message({
+ message: list.data.msg,
+ type: "success",
+ customClass: "messageClass",
+ });
+
+ for (const key in this.ticketDetails) {//清空工单
+ this.ticketDetails[key] = ""
+ }
+ this.$router.back()//回到上一个页面
+
+
+ }
+
+ this.WorkOrderDetailsLoading = false
+
+
+ },
+ //请求结束工单
+ async fetchEndTicket(data) {
+ this.WorkOrderDetailsLoading = true
+ const list = await getEndTicket(data)
+ if (list.data.code == 200) {
+ this.$message({
+ message: list.data.msg,
+ type: "success",
+ customClass: "messageClass",
+ });
+
+ for (const key in this.ticketDetails) {//清空工单
+ this.ticketDetails[key] = ""
+ }
+ this.WorkOrderDetailsLoading = false
+
+ this.$router.back()//回到上一个页面
+ }
+
+
+
+
+ },
+ //点击继续提交按钮
+ handelResubmit() {
+ if (!this.paramsResubmit.desc) {//判空
+ this.$message({
+ message: this.$t(`help.resubmit`),
+ type: "error",
+ });
+ return
+ }
+ this.paramsResubmit.id = this.ticketDetails.id
+
+
+ if (this.fileList[0]) {//有附件
+ //上传文件的需要formdata类型;所以要转
+ this.FormDatas = new FormData()
+ this.fileList.forEach(fileItem => {
+ this.FormDatas.append('file', fileItem);
+ })
+ // 上传选择附件
+ this.$axios({
+ method: 'post',
+ url: 'marketall/ticket/uploadFile',
+ headers: this.headers,
+ timeout: 30000,
+ data: this.FormDatas
+ }).then(res => {
+ this.paramsResubmit.files = res.data.data.id
+
+ if (this.paramsResubmit.files) {//成功拿到返回ID
+ this.fetchResubmitTicket(this.paramsResubmit) //提交工单
+ }
+ })
+ } else {
+
+ this.fetchResubmitTicket(this.paramsResubmit)
+
+ }
+
+
+
+
+
+
+ },
+ // 点击撤回按钮
+ handelRetractTicket() {
+ this.paramsRetractTicket.id = this.ticketDetails.id
+ this.fetchRetractTicket(this.paramsRetractTicket)
+ },
+ //点击请求审核按钮
+ handelSubmitAuditTicket() {
+ if (this.ticketDetails.status == "待审核") { //阻止待审核状态下重复提交
+ this.$message({
+ message: this.$t(`help.toAudit`),
+ type: "error",
+ });
+ return
+ }
+ this.paramsSubmitAuditTicket.id = this.ticketDetails.id
+ this.fetchSubmitAuditTicket(this.paramsSubmitAuditTicket)
+
+
+ },
+
+ //选择问题种类
+ handelKinds() {
+
+ },
+ onUpload() {
+
+ },
+ //点击下载附件
+ downloadExcel(id) {
+
+ this.downloadUrl = ` ${axios.defaults.baseURL}/marketall/ticket/downloadFile?ids=${id}`
+
+ // this.downloadUrl = ` http://10.168.2.125:7101/marketall/ticket/downloadFile?ids=${id}`
+ let a = document.createElement(`a`)
+ a.href = this.downloadUrl
+ a.click()
+ // console.log("及附加覅附件");
+ // window.location.href = "http://10.168.2.125:9300/statics/2023/04/03/image_2023_03_23T07_41_35_865Z_20230403165504A001.png";
+ // this.paramsDownload.id = id
+
+ // this.fetchDownloadFile(id)
+
+ },
+ //上传文件之前
+ beforeUpload(file) {
+ // 获取所有已上传的文件列表
+ // const uploadedFiles = this.fileList.map((f) => f.name);
+ // // 如果已上传的文件列表包含当前文件的名字,返回 false 阻止上传
+ // if (uploadedFiles.includes(file.name)) {//不能上传相同名字的文件!
+ // this.$message.warning(this.$t(`help.sameName`));
+ // return false;
+ // }
+
+
+ // 校验文件类型和大小
+ const fileType = file.name.slice(file.name.lastIndexOf('.') + 1).toLowerCase();
+ const isTypeValid = this.fileType.includes(fileType);
+ const isSizeValid = file.size / 1024 / 1024 <= this.fileSize;
+ if (!isTypeValid) {//不支持的文件类型
+ this.$message.error(`${this.$t(`help.fileType`)}:${fileType}`);
+ return false;
+ }
+ if (!isSizeValid) {//文件大小不能超过
+ this.$message.error(`${this.$t(`help.fileSize`)} ${this.fileSize} MB.`);
+ return false;
+ }
+
+ // if (file.type != "" && file.type != null && file.type != undefined) {
+ // //截取文件的后缀,判断文件类型
+ // const FileExt = file.name.replace(/.+\./, "").toLowerCase();
+ // //计算文件的大小
+ // const isLt2M = file.size / 1024 / 1024 < 20; //这里做文件大小限制
+ // //如果大于50M
+ // if (!isLt2M) {
+ // this.$message.error('上传文件大小不能超过 20MB!');
+ // return false;
+ // }
+ // //如果文件类型不在允许上传的范围内
+ // if (this.fileType.includes(FileExt)) {
+ // return true;
+ // }
+ // else {
+ // this.$message.error("上传文件格式不正确!");
+ // return false;
+ // }
+ // }
+
+
+
+ },
+ handelChange(file, fileList){ //控制显示上传显示列表
+ // 校验文件类型和大小
+ const fileType = file.name.slice(file.name.lastIndexOf('.') + 1).toLowerCase();
+ const isTypeValid = this.fileType.includes(fileType);
+ const isSizeValid = file.size / 1024 / 1024 <= this.fileSize;
+ if (!isTypeValid) {//不支持的文件类型
+ this.$message.error(`${this.$t(`help.fileType`)}:${fileType}`);
+ this.fileList = this.fileList.filter(item => item.name != file.name);
+ return false;
+ }
+ if (!isSizeValid) {//文件大小不能超过
+ this.$message.error(`${this.$t(`help.fileSize`)} ${this.fileSize} MB.`);
+ this.fileList = this.fileList.filter(item => item.name != file.name);
+ return false;
+ }
+
+ let flag = this.fileList.some(item => item.name == file.name )
+ if (flag){
+ this.$message.warning(this.$t(`help.sameName`));
+ this.$refs.upload.handleRemove(file)
+
+ return false
+ }
+ // this.fileName.push(file.name)
+ this.fileList.push(file.raw)
+
+ },
+ //上传了的文件给移除的事件
+ handleRemove(file, fileList) {
+
+ let index = this.fileList.indexOf(file); // 获取第一个重复元素的索引
+
+ if (index !== -1) {
+ this.fileList.splice(index, 1); // 删除第一个重复元素
+ }
+
+
+ },
+ //超出文件个数的回调
+ handleExceed() {
+ this.$message({
+ type: 'warning',
+ message: this.$t(`help.fileNum`)
+ }); return
+ },
+ // //上传文件的事件
+ // uploadFile(item) {
+ // // this.filesId.push(item.file.uid)
+ // // //上传文件的需要formdata类型;所以要转
+ // // this.FormDatas = new FormData()
+ // // this.FormDatas.append('file', item.file);
+ // console.log("上传文件");
+ // this.fileList.push(item.file)
+ // // this.fileName.push(item.file.name)
+ // },
+ //上传成功后的回调
+ handleSuccess() {
+
+ },
+ handelTime(time) {
+
+ if (time) {
+ return `${time.split(`T`)[0]} ${time.split(`T`)[1].split(`.`)[0]}`
+ }
+
+ },
+ //用户点击结束工单
+ handelEndWorkOrder(){
+
+ this.fetchEndTicket({id:this.ticketDetails.id})
+ }
+
+
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/WorkOrderDetails/index.vue b/yq/src/views/WorkOrderDetails/index.vue
new file mode 100644
index 0000000..d010c34
--- /dev/null
+++ b/yq/src/views/WorkOrderDetails/index.vue
@@ -0,0 +1,366 @@
+
+
+
+
+
+
+ {{ $t(`help.orderDetails`) }}
+
+
+
+ {{ $t(`help.orderNumber`) }}:
+ {{ ticketDetails.id }}
+
+
+
+
+
+ {{ $t(`help.problem`) }}:
+ {{ ticketDetails.type }}
+
+
+
+
+
+
+
+
+ {{ $t(`help.submitName`) }}: {{ ticketDetails.userName }}
+
+
+
+
+
+ {{ $t(`help.submissionTime`) }}: {{
+ ticketDetails.submitTime
+ }}
+
+
+
+
+
+ {{ $t(`help.dealWith`) }}: {{ ticketDetails.status }}
+
+
+
+
+
+
+
+
+
+ {{$t(`help.problemTitle`)}}:
+ {{ticketDetails.title}}
+
+
+
+
+
{{ $t(`help.submitContent`) }}:
+
+
+
+
+ {{ $t(`help.account`) }}: {{ item.name }}
+ {{ $t(`help.time`) }}: {{ handelTime(item.time) }}
+
+
+ {{ item.content }}
+
+
+
+ {{ $t(`help.download`) }}
+
+
+
+
+
+
+
{{ $t(`help.AuditContent`) }}
+
+ {{ $t(`help.account`) }}: {{ auditList.name }}
+ {{ $t(`help.time`) }}: {{ handelTime(auditList.time) }}
+
+
+ {{ auditList.content }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`help.Continue`) }}:
+
+
+
+
+
+
+
+
+
+ {{ $t("login.attachment") }}
+
+
+
+
+
+
+ {{ $t("login.Upload") }} {{ $t("login.Upload1") }}
+
+
+
+
+
+ {{ $t("help.solve") }} {{ $t("help.end") }}
+ {{ $t("login.submit") }}
+
+
+ {{ $t("help.recall") }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/address/index.js b/yq/src/views/address/index.js
new file mode 100644
index 0000000..657b3d9
--- /dev/null
+++ b/yq/src/views/address/index.js
@@ -0,0 +1,441 @@
+import * as echarts from "echarts";
+import { handelProfitrate,chartsWidth,dataLength, emptyData,handelLineType, handelSwitchs, handelZoom,fetchBtcPrice, handelWatermark,fetchEthPrice, handelSmaData, } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ addressLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ axisLabel: {
+ formatter: `{yyyy}-{MM}-{dd}`,
+ },
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+ let value;
+ if (e > 1000000) {
+ value = e / 100000;
+ } else if (e > 100000) {
+ value = e / 1000;
+ } else {
+ value = e / 100;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ position: "right",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ min: "dataMin",
+ max: "dataMax",
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 30,
+ end: 100,
+ },
+ {
+ start: 30,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Active Address",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Receive Address",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#9ed4e8",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#9ed4e8",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ // markLine: {
+ // symbol: ["none", "none"], //去掉箭头
+ // itemStyle: {
+ // normal: {
+ // lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ // },
+ // },
+ // // lineStyle:{
+ // // color:"red"
+ // // },
+
+ // label: {
+ // formatter: "{b}",
+ // fontSize: 10,
+ // color: "rgba(0,0,0,0.8)",
+ // align: "left",
+ // },
+ // data: [
+ // {
+ // name: "0",
+ // yAxis: 0,
+ // },
+ // // {
+ // // name: "$40W",
+ // // yAxis: 400000,
+ // // },
+ // {
+ // name: "$70W",
+ // yAxis: 700000,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+
+ // {
+ // name: "$10W",
+ // yAxis: 100000,
+ // },
+ // {
+ // name: "$100W",
+ // yAxis: 1000000,
+ // // position: ['100%', '50'],
+ // },
+ // {
+ // name: "$120W",
+ // yAxis: 1200000,
+ // },
+
+ // {
+ // name: "$140W",
+ // yAxis: 1400000,
+ // },
+ // ],
+ // },
+ },
+ {
+ name: "Send Address",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f29494",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 1,
+ lineStyle: {
+ //线条样式
+ color: "#f29494",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 4,
+ data: [],
+ },
+
+
+ ],
+ },
+ params: {
+ req: "address",
+ radius: "eth",
+ start: "",
+ end: "",
+ },
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma:"",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+
+ //进入页面发起请求
+ this.fetchAddress(
+ this.params.req,
+ this.params.radius,
+ this.params.start,
+ this.params.end
+ );
+
+
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart= localStorage.getItem("zoomStart")
+ this.zoomEnd= localStorage.getItem("zoomEnd")
+
+
+ })
+
+ },
+
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("addressBox"));
+ }
+ this.option= handelZoom(this.myChart,this.option,this,this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("addressBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchAddress(req, radius, start, end,sma) {
+ this.addressLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end,sma)
+ let addressData = data.data
+
+
+ //空数据处理
+ let noData= emptyData(data.data,this.option.series,this.inCharts, this)
+ if (noData) {
+ this.addressLoading = false
+ return
+ }
+
+ // if (data.data.length === 0) {//空数据处理
+
+ // this.$message({
+ // message: this.$t(`home.NoData`),
+ // type: 'warning'
+ // });
+
+
+ // if (Array.isArray(this.option.series)) {
+ // this.option.series.forEach(item=>{
+ // item.data=[]
+ // })
+ // }else{
+ // this.option.series.data=[]
+ // }
+
+ // this.inCharts()
+ // this.addressLoading = false
+ // return
+ // }
+
+ this.start = addressData[0].date.split("T")[0]
+ this.end = addressData[addressData.length - 1].date.split("T")[0]
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // if (this.start ) {
+ // this.handelSonEthPrice("ETH", false);
+
+ // }
+ // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // if (this.fatherSmaData[0] && this.start) {
+ // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC",this.btcFlag)
+ // }
+ // })
+
+ // this.handelSonEthPrice("ETH", false);//值取反的 false渲染ETH
+ this.option= handelWatermark(this.option,750,300)
+ let activeAddressList = []
+ let receiveAddressList = []
+ let sendAddressList = []
+ let PriceValueList = []
+ addressData.forEach(item => {
+
+ activeAddressList.push(Number(item.activeAddress.toFixed(2)))
+ receiveAddressList.push(Number(item.receiveAddress.toFixed(2)))
+ sendAddressList.push(Number(item.sendAddress.toFixed(2)))
+ PriceValueList.push(Number(item.price.toFixed(2)))
+
+
+ })
+
+ this.option.series[0].data = handelProfitrate(addressData, activeAddressList)
+ this.option.series[1].data = handelProfitrate(addressData, receiveAddressList)
+ this.option.series[2].data = handelProfitrate(addressData, sendAddressList)
+ this.option.series[3].data = handelProfitrate(addressData, PriceValueList)
+
+ this.inCharts()
+
+ this.addressLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchAddress(this.params.req, this.params.radius, this.params.start, this.params.end,this.sma)
+ // this.handelSonBtcPrice("BTC",true)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ //父级BTC默认是true 在ETH页面btcFlag 取反才能正常点击父级就渲染
+
+ // if (this.params.radius == "eth") {
+ // this.btcFlag = !flag;
+ // } else {
+ // this.btcFlag = flag;
+ // }
+ this.btcFlag = flag;
+ fetchBtcPrice("BTC", this.option.series[3], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = !flag
+ fetchEthPrice("ETH", this.option.series[3], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.sma = smaDataList
+ this.fetchAddress(this.params.req, this.params.radius, this.params.start, this.params.end,this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[3], this.inCharts, this.start, this.end,)
+
+ },
+ },
+
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+}
+}
\ No newline at end of file
diff --git a/yq/src/views/address/index.vue b/yq/src/views/address/index.vue
new file mode 100644
index 0000000..42f2b15
--- /dev/null
+++ b/yq/src/views/address/index.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/addressBalance/index.js b/yq/src/views/addressBalance/index.js
new file mode 100644
index 0000000..0dd9d7b
--- /dev/null
+++ b/yq/src/views/addressBalance/index.js
@@ -0,0 +1,782 @@
+import * as echarts from "echarts";
+import { handelLineType,dataLength, chartsWidth,emptyData, handelSwitchs, handelZoom, fetchBtcPrice, fetchEthPrice, handelWatermark, handelSmaData, getDateArray, handelUsdt } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ //柱状图配置
+ columnar: {
+ title: {
+ text: "",
+ left: "center",
+ textStyle: {
+ fontSize: 15,
+ fontWeight: "normal"
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ axisPointer: {
+ type: "cross",
+ crossStyle: {
+ color: "#999",
+ },
+ },
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i <= params.length - 1; i++) {
+ // res += `${params[i].marker} ${params[i].value[1]} ${params[i].seriesName}`;
+ // }
+ // return "111";
+ // },
+ },
+ toolbox: {
+ // feature: {
+ // dataView: { show: true, readOnly: false },
+ // magicType: { show: true, type: ["line", "bar"] },
+ // restore: { show: true },
+ // saveAsImage: { show: true },
+ // },
+ },
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ xAxis: [
+ {
+ type: "category",
+ data: [
+ "balance0",
+ "balance001",
+ "balance01",
+ "balance1",
+ "balance10",
+ "balance100",
+ "balance1000",
+ "balance10000",
+ ],
+ // axisPointer: {
+ // type: "shadow",
+ // },
+ },
+ ],
+ yAxis: [
+ {
+ type: "value",
+ // name: "Precipitation",
+ // min: 0,
+ // max: 250,
+ // interval: 50,
+ axisLabel: {
+ formatter: function (value) {
+
+ let label = value / 1000000
+ return `${label}M`
+ },
+ },
+ },
+ // {
+ // type: "value",
+ // // name: "Temperature",
+ // // min: 0,
+ // // max: 25,
+ // // interval: 5,
+ // // axisLabel: {
+ // // formatter: "{value} °C",
+ // // },
+ // },
+ ],
+ series: [
+ {
+ // name: "Futures Volume (Latest 24h) [USD]",
+ type: "bar",
+ colorBy: "data",
+ // tooltip: {
+ // valueFormatter: function (value) {
+ // return value + " ml";
+ // },
+ // },
+ data: [],
+ itemStyle: {
+ color: "#fdaa56",
+ },
+ },
+ {
+ name: "Change 24h",
+ type: "bar",
+ itemStyle: {
+ color: "#607d8b",
+ },
+ // tooltip: {
+ // valueFormatter: function (value) {
+ // return value + " ml";
+ // },
+ // },
+ data: [],
+ },
+ ],
+ },
+ params: {
+ req: "utxos",
+ radius: "btc"
+ },
+ utxosLoading: false,
+ //饼图配置
+ pieChart: {
+ legend: {
+ top: 'top'
+ },
+ toolbox: {
+ show: true,
+ feature: {
+ mark: { show: true },
+ dataView: { show: true, readOnly: false },
+ restore: { show: true },
+ saveAsImage: { show: true }
+ }
+ },
+ tooltip: {
+ trigger: 'item'
+ },
+ series: [
+ {
+ name: 'utxos',
+ type: 'pie',
+ radius: [50, 250],
+ center: ['50%', '50%'],
+ roseType: 'area',
+ itemStyle: {
+ borderRadius: 8
+ },
+ data: [
+ // { value: 40, name: 'rose 1' },
+ // { value: 38, name: 'rose 2' },
+ // { value: 32, name: 'rose 3' },
+ // { value: 30, name: 'rose 4' },
+ // { value: 28, name: 'rose 5' },
+ // { value: 26, name: 'rose 6' },
+ // { value: 22, name: 'rose 7' },
+ // { value: 18, name: 'rose 8' }
+ ]
+ }
+ ]
+ },
+ //折线图配置
+ option: {
+
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+
+ animation: false,
+ // formatter: function (params) {
+ // var res
+ // res = params[0].axisValueLabel;
+ // res += `${params[0].marker} ${params[0].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[0].value}%
+ // ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ // ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}`;
+
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value / 10000).toFixed(2)} W`
+ }
+ }
+ },
+ {
+
+ position: "right",
+ type: "value",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "balance < 0.01",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 5,
+ // data: [],
+ // },
+
+
+
+ ],
+ },
+
+ //折线图配置比率图
+ ratio: {
+
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ var res
+
+ res = params[0].axisValueLabel;
+ for (let i = 0; i < params.length; i++) {
+
+ res += `${params[i].marker} ${params[i].seriesName} \u00A0\u00A0\u00A0\u00A0 ${Number(parseInt(params[i].value * 1000000) / 1000000)}% `;
+
+ }
+
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 180, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure3`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value).toFixed(3)} %`
+ }
+ }
+ },
+ {
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "balance < 0.01",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+
+
+
+ ],
+ },
+
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+
+ this.fetchUtxos(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+ })
+
+
+
+ },
+ methods: {
+ //初始化折线图图表
+ inChartsLine() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("utxosLine"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("utxosLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart) this.myChart.resize();
+ // });
+ },
+ inChartsLine2() {
+ if (this.myChart2 == null) {
+ this.myChart2 = echarts.init(document.getElementById("utxosLine2"));
+ }
+ this.option2 = handelZoom(this.myChart2, this.option2, this, this.zoomStart, this.zoomEnd)
+ chartsWidth("utxosLine2", this);
+ this.myChart2.setOption(this.option2);
+
+ // window.addEventListener("resize", () => {
+ // if (this.myChart2) this.myChart2.resize();
+ // });
+ },
+ //初始化比率折线图图表
+ inChartSratioLine() {
+ if (this.myChart3 == null) {
+ this.myChart3 = echarts.init(document.getElementById("ratioLine"));
+ }
+ this.ratio = handelZoom(this.myChart3, this.ratio, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart3.setOption(this.ratio);
+ chartsWidth("ratioLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart3) this.myChart3.resize();;
+ // });
+ },
+ inChartSratioLine2() {
+ if (this.myChart4 == null) {
+ this.myChart4 = echarts.init(document.getElementById("ratioLine2"));
+ }
+ this.ratio2 = handelZoom(this.myChart4, this.ratio2, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart4.setOption(this.ratio2);
+ chartsWidth("ratioLine2", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart4) this.myChart4.resize();;
+ // });
+ },
+
+ //请求数据
+ async fetchUtxos(req, radius, start, end, sma) {
+ this.utxosLoading = true
+ let { data } = await this.$API.getNewAddress(req, radius, start, end, sma)
+
+ this.UtxosData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChartsLine, this)
+ if (noData) {
+ // emptyData(data.data, this.option2.series, this.inChartsLine2, this)
+ emptyData(data.data, this.ratio.series, this.inChartSratioLine, this)
+ // emptyData(data.data, this.ratio2.series, this.inChartSratioLine2, this)
+ this.utxosLoading = false
+ return
+ }
+
+ this.start = this.UtxosData[0].dateTime.split("T")[0]
+ this.end = this.UtxosData[this.UtxosData.length - 1].dateTime.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ //添加水印
+ this.option = handelWatermark(this.option)
+ this.ratio = handelWatermark(this.ratio)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+
+
+ let balance0List = []
+ let rate0List = []
+ let xAxisData= []
+ this.UtxosData.forEach(item => {
+ balance0List.push(item.balance0)
+ rate0List.push((item.rate0 * 100).toFixed(2))
+ xAxisData.push(item.dateTime.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = balance0List
+ this.option.series[1].data = priceData
+ this.ratio.xAxis.data = xAxisData
+ this.ratio.series[0].data =rate0List
+ // this.ratio.series[1].data = handelUsdt(this.UtxosData, rate001List)
+
+
+ this.inChartsLine()
+ // this.inChartsLine2()
+ this.inChartSratioLine()
+ // this.inChartSratioLine2()
+ console.log( this.ratio,"sfkgo ");
+ // this.inChartsPieChart()
+
+ this.utxosLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option2, this.option2.series[0].data.length), );
+
+
+ }, 10000)
+
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+
+
+ },
+
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ // this.option2 = handelLineType(this.option2)
+ this.ratio = handelLineType(this.ratio)
+ // this.ratio2 = handelLineType(this.ratio2)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+ // this.myChart2.setOption(this.option2);
+ this.myChart3.setOption(this.ratio);
+ // this.myChart4.setOption(this.ratio2);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[4], this.start, this.end, this.inChartsLine, this, this.btcFlag)
+ fetchBtcPrice("BTC", this.option2.series[4], this.start, this.end, this.inChartsLine2, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[5], this.start, this.end, this.inChartsLine, this, this.ethFlag)
+ fetchEthPrice("ETH", this.option2.series[5], this.start, this.end, this.inChartsLine2, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList, start, end) {
+
+ this.sma = smaDataList
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[4], this.inChartsLine, this.start, this.end)
+ // handelSmaData(smaDataList, this.option2.series[4], this.inChartsLine2, this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/addressBalance/index.vue b/yq/src/views/addressBalance/index.vue
new file mode 100644
index 0000000..6cd7b1b
--- /dev/null
+++ b/yq/src/views/addressBalance/index.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
{{$t(`menu.onchain5`)}}
+
{{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
+
{{ $t(`home.figure2`) }}
+
+
{{$t(`arh.ratio`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/addressBalance1/index.js b/yq/src/views/addressBalance1/index.js
new file mode 100644
index 0000000..1cebcc8
--- /dev/null
+++ b/yq/src/views/addressBalance1/index.js
@@ -0,0 +1,597 @@
+import * as echarts from "echarts";
+import { handelLineType,dataLength, chartsWidth,emptyData, handelSwitchs, handelZoom, fetchBtcPrice, fetchEthPrice, handelWatermark, handelSmaData, getDateArray, handelUsdt } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ params: {
+ req: "utxos",
+ radius: "btc"
+ },
+ utxosLoading: false,
+
+ //折线图配置
+ option: {
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+
+ animation: false,
+ // formatter: function (params) {
+ // var res
+ // res = params[0].axisValueLabel;
+ // res += `${params[0].marker} ${params[0].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[0].value}%
+ // ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ // ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}`;
+
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value / 10000).toFixed(2)} W`
+ }
+ }
+ },
+ {
+
+ position: "right",
+ type: "value",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=0.01 and Balance <0.1",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 5,
+ // data: [],
+ // },
+
+
+
+ ],
+ },
+
+ //折线图配置比率图
+ ratio: {
+
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ var res
+
+ res = params[0].axisValueLabel;
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName} \u00A0\u00A0\u00A0\u00A0 ${Number(parseInt(params[i].value * 1000000) / 1000000)}% `;
+
+ }
+
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 180, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure3`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value).toFixed(3)} %`
+ }
+ }
+ },
+ {
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=0.01 and Balance <0.1",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+
+
+
+ ],
+ },
+
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+
+ this.fetchUtxos(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+
+
+
+ },
+ methods: {
+ //初始化折线图图表
+ inChartsLine() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("utxosLine"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("utxosLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart) this.myChart.resize();
+ // });
+ },
+
+ //初始化比率折线图图表
+ inChartSratioLine() {
+ if (this.myChart3 == null) {
+ this.myChart3 = echarts.init(document.getElementById("ratioLine"));
+ }
+ this.ratio = handelZoom(this.myChart3, this.ratio, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart3.setOption(this.ratio);
+ chartsWidth("ratioLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart3) this.myChart3.resize();;
+ // });
+ },
+
+
+ //请求数据
+ async fetchUtxos(req, radius, start, end, sma) {
+ this.utxosLoading = true
+ let { data } = await this.$API.getNewAddress(req, radius, start, end, sma)
+
+ this.UtxosData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChartsLine, this)
+ if (noData) {
+ // emptyData(data.data, this.option2.series, this.inChartsLine2, this)
+ emptyData(data.data, this.ratio.series, this.inChartSratioLine, this)
+ // emptyData(data.data, this.ratio2.series, this.inChartSratioLine2, this)
+ this.utxosLoading = false
+ return
+ }
+
+ this.start = this.UtxosData[0].dateTime.split("T")[0]
+ this.end = this.UtxosData[this.UtxosData.length - 1].dateTime.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ //添加水印
+ this.option = handelWatermark(this.option)
+ this.ratio = handelWatermark(this.ratio)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+
+
+ let balance0List = []
+ let rate0List = []
+ let xAxisData= []
+ this.UtxosData.forEach(item => {
+ balance0List.push(item.balance001)
+
+ rate0List.push((item.rate001 * 100).toFixed(2))
+ xAxisData.push(item.dateTime.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = balance0List
+ this.option.series[1].data = priceData
+ this.ratio.xAxis.data = xAxisData
+ this.ratio.series[0].data =rate0List
+
+
+ this.inChartsLine()
+ this.inChartSratioLine()
+
+
+ this.utxosLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option2, this.option2.series[0].data.length), );
+
+
+ }, 10000)
+
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+
+
+ },
+
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.ratio = handelLineType(this.ratio)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+ this.myChart3.setOption(this.ratio);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[4], this.start, this.end, this.inChartsLine, this, this.btcFlag)
+ fetchBtcPrice("BTC", this.option2.series[4], this.start, this.end, this.inChartsLine2, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[5], this.start, this.end, this.inChartsLine, this, this.ethFlag)
+ fetchEthPrice("ETH", this.option2.series[5], this.start, this.end, this.inChartsLine2, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList, start, end) {
+
+ this.sma = smaDataList
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[4], this.inChartsLine, this.start, this.end)
+ // handelSmaData(smaDataList, this.option2.series[4], this.inChartsLine2, this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/addressBalance1/index.vue b/yq/src/views/addressBalance1/index.vue
new file mode 100644
index 0000000..6cd7b1b
--- /dev/null
+++ b/yq/src/views/addressBalance1/index.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
{{$t(`menu.onchain5`)}}
+
{{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
+
{{ $t(`home.figure2`) }}
+
+
{{$t(`arh.ratio`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/addressBalance2/index.js b/yq/src/views/addressBalance2/index.js
new file mode 100644
index 0000000..b2524b5
--- /dev/null
+++ b/yq/src/views/addressBalance2/index.js
@@ -0,0 +1,596 @@
+import * as echarts from "echarts";
+import { handelLineType,dataLength, chartsWidth,emptyData, handelSwitchs, handelZoom, fetchBtcPrice, fetchEthPrice, handelWatermark, handelSmaData, getDateArray, handelUsdt } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ params: {
+ req: "utxos",
+ radius: "btc"
+ },
+ utxosLoading: false,
+
+ //折线图配置
+ option: {
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+
+ animation: false,
+ // formatter: function (params) {
+ // var res
+ // res = params[0].axisValueLabel;
+ // res += `${params[0].marker} ${params[0].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[0].value}%
+ // ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ // ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}`;
+
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value / 10000).toFixed(2)} W`
+ }
+ }
+ },
+ {
+
+ position: "right",
+ type: "value",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=0.1 and Balance <1",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 5,
+ // data: [],
+ // },
+
+
+
+ ],
+ },
+
+ //折线图配置比率图
+ ratio: {
+
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ var res
+
+ res = params[0].axisValueLabel;
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName} \u00A0\u00A0\u00A0\u00A0 ${Number(parseInt(params[i].value * 1000000) / 1000000)}% `;
+
+ }
+
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 180, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure3`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value).toFixed(3)} %`
+ }
+ }
+ },
+ {
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=0.1 and Balance <1",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+
+
+
+ ],
+ },
+
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+
+ this.fetchUtxos(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+
+
+
+ },
+ methods: {
+ //初始化折线图图表
+ inChartsLine() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("utxosLine"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("utxosLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart) this.myChart.resize();
+ // });
+ },
+
+ //初始化比率折线图图表
+ inChartSratioLine() {
+ if (this.myChart3 == null) {
+ this.myChart3 = echarts.init(document.getElementById("ratioLine"));
+ }
+ this.ratio = handelZoom(this.myChart3, this.ratio, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart3.setOption(this.ratio);
+ chartsWidth("ratioLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart3) this.myChart3.resize();;
+ // });
+ },
+
+
+ //请求数据
+ async fetchUtxos(req, radius, start, end, sma) {
+ this.utxosLoading = true
+ let { data } = await this.$API.getNewAddress(req, radius, start, end, sma)
+
+ this.UtxosData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChartsLine, this)
+ if (noData) {
+ // emptyData(data.data, this.option2.series, this.inChartsLine2, this)
+ emptyData(data.data, this.ratio.series, this.inChartSratioLine, this)
+ // emptyData(data.data, this.ratio2.series, this.inChartSratioLine2, this)
+ this.utxosLoading = false
+ return
+ }
+
+ this.start = this.UtxosData[0].dateTime.split("T")[0]
+ this.end = this.UtxosData[this.UtxosData.length - 1].dateTime.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ //添加水印
+ this.option = handelWatermark(this.option)
+ this.ratio = handelWatermark(this.ratio)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+
+
+ let balance0List = []
+ let rate0List = []
+ let xAxisData= []
+ this.UtxosData.forEach(item => {
+ balance0List.push(item.balance01)
+ rate0List.push((item.rate01 * 100).toFixed(2))
+ xAxisData.push(item.dateTime.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = balance0List
+ this.option.series[1].data = priceData
+ this.ratio.xAxis.data = xAxisData
+ this.ratio.series[0].data =rate0List
+
+
+ this.inChartsLine()
+ this.inChartSratioLine()
+
+
+ this.utxosLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option2, this.option2.series[0].data.length), );
+
+
+ }, 10000)
+
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+
+
+ },
+
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.ratio = handelLineType(this.ratio)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+ this.myChart3.setOption(this.ratio);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[4], this.start, this.end, this.inChartsLine, this, this.btcFlag)
+ fetchBtcPrice("BTC", this.option2.series[4], this.start, this.end, this.inChartsLine2, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[5], this.start, this.end, this.inChartsLine, this, this.ethFlag)
+ fetchEthPrice("ETH", this.option2.series[5], this.start, this.end, this.inChartsLine2, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList, start, end) {
+
+ this.sma = smaDataList
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[4], this.inChartsLine, this.start, this.end)
+ // handelSmaData(smaDataList, this.option2.series[4], this.inChartsLine2, this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/addressBalance2/index.vue b/yq/src/views/addressBalance2/index.vue
new file mode 100644
index 0000000..6cd7b1b
--- /dev/null
+++ b/yq/src/views/addressBalance2/index.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
{{$t(`menu.onchain5`)}}
+
{{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
+
{{ $t(`home.figure2`) }}
+
+
{{$t(`arh.ratio`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/addressBalance3/index.js b/yq/src/views/addressBalance3/index.js
new file mode 100644
index 0000000..07f0792
--- /dev/null
+++ b/yq/src/views/addressBalance3/index.js
@@ -0,0 +1,596 @@
+import * as echarts from "echarts";
+import { handelLineType,dataLength, chartsWidth,emptyData, handelSwitchs, handelZoom, fetchBtcPrice, fetchEthPrice, handelWatermark, handelSmaData, getDateArray, handelUsdt } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ params: {
+ req: "utxos",
+ radius: "btc"
+ },
+ utxosLoading: false,
+
+ //折线图配置
+ option: {
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+
+ animation: false,
+ // formatter: function (params) {
+ // var res
+ // res = params[0].axisValueLabel;
+ // res += `${params[0].marker} ${params[0].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[0].value}%
+ // ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ // ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}`;
+
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value / 10000).toFixed(2)} W`
+ }
+ }
+ },
+ {
+
+ position: "right",
+ type: "value",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=1 and Balance <10",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 5,
+ // data: [],
+ // },
+
+
+
+ ],
+ },
+
+ //折线图配置比率图
+ ratio: {
+
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ var res
+
+ res = params[0].axisValueLabel;
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName} \u00A0\u00A0\u00A0\u00A0 ${Number(parseInt(params[i].value* 1000000) / 1000000)}% `;
+
+ }
+
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 180, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure3`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value).toFixed(3)} %`
+ }
+ }
+ },
+ {
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=1 and Balance <10",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+
+
+
+ ],
+ },
+
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+
+ this.fetchUtxos(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+
+
+
+ },
+ methods: {
+ //初始化折线图图表
+ inChartsLine() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("utxosLine"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("utxosLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart) this.myChart.resize();
+ // });
+ },
+
+ //初始化比率折线图图表
+ inChartSratioLine() {
+ if (this.myChart3 == null) {
+ this.myChart3 = echarts.init(document.getElementById("ratioLine"));
+ }
+ this.ratio = handelZoom(this.myChart3, this.ratio, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart3.setOption(this.ratio);
+ chartsWidth("ratioLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart3) this.myChart3.resize();;
+ // });
+ },
+
+
+ //请求数据
+ async fetchUtxos(req, radius, start, end, sma) {
+ this.utxosLoading = true
+ let { data } = await this.$API.getNewAddress(req, radius, start, end, sma)
+
+ this.UtxosData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChartsLine, this)
+ if (noData) {
+ // emptyData(data.data, this.option2.series, this.inChartsLine2, this)
+ emptyData(data.data, this.ratio.series, this.inChartSratioLine, this)
+ // emptyData(data.data, this.ratio2.series, this.inChartSratioLine2, this)
+ this.utxosLoading = false
+ return
+ }
+
+ this.start = this.UtxosData[0].dateTime.split("T")[0]
+ this.end = this.UtxosData[this.UtxosData.length - 1].dateTime.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ //添加水印
+ this.option = handelWatermark(this.option)
+ this.ratio = handelWatermark(this.ratio)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+
+
+ let balance0List = []
+ let rate0List = []
+ let xAxisData= []
+ this.UtxosData.forEach(item => {
+ balance0List.push(item.balance1)
+ rate0List.push((item.rate1 * 100).toFixed(4))
+ xAxisData.push(item.dateTime.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = balance0List
+ this.option.series[1].data = priceData
+ this.ratio.xAxis.data = xAxisData
+ this.ratio.series[0].data =rate0List
+
+
+ this.inChartsLine()
+ this.inChartSratioLine()
+
+
+ this.utxosLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option2, this.option2.series[0].data.length), );
+
+
+ }, 10000)
+
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+
+
+ },
+
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.ratio = handelLineType(this.ratio)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+ this.myChart3.setOption(this.ratio);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[4], this.start, this.end, this.inChartsLine, this, this.btcFlag)
+ fetchBtcPrice("BTC", this.option2.series[4], this.start, this.end, this.inChartsLine2, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[5], this.start, this.end, this.inChartsLine, this, this.ethFlag)
+ fetchEthPrice("ETH", this.option2.series[5], this.start, this.end, this.inChartsLine2, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList, start, end) {
+
+ this.sma = smaDataList
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[4], this.inChartsLine, this.start, this.end)
+ // handelSmaData(smaDataList, this.option2.series[4], this.inChartsLine2, this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/addressBalance3/index.vue b/yq/src/views/addressBalance3/index.vue
new file mode 100644
index 0000000..6cd7b1b
--- /dev/null
+++ b/yq/src/views/addressBalance3/index.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
{{$t(`menu.onchain5`)}}
+
{{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
+
{{ $t(`home.figure2`) }}
+
+
{{$t(`arh.ratio`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/addressBalance4/index.js b/yq/src/views/addressBalance4/index.js
new file mode 100644
index 0000000..73e2f85
--- /dev/null
+++ b/yq/src/views/addressBalance4/index.js
@@ -0,0 +1,596 @@
+import * as echarts from "echarts";
+import { handelLineType,dataLength, chartsWidth,emptyData, handelSwitchs, handelZoom, fetchBtcPrice, fetchEthPrice, handelWatermark, handelSmaData, getDateArray, handelUsdt } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ params: {
+ req: "utxos",
+ radius: "btc"
+ },
+ utxosLoading: false,
+
+ //折线图配置
+ option: {
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+
+ animation: false,
+ // formatter: function (params) {
+ // var res
+ // res = params[0].axisValueLabel;
+ // res += `${params[0].marker} ${params[0].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[0].value}%
+ // ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ // ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}`;
+
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value / 10000).toFixed(2)} W`
+ }
+ }
+ },
+ {
+
+ position: "right",
+ type: "value",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=10 and Balance <100",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 5,
+ // data: [],
+ // },
+
+
+
+ ],
+ },
+
+ //折线图配置比率图
+ ratio: {
+
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ var res
+
+ res = params[0].axisValueLabel;
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName} \u00A0\u00A0\u00A0\u00A0 ${Number(parseInt(params[i].value * 1000000) / 1000000)}% `;
+
+ }
+
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 180, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure3`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value).toFixed(3)} %`
+ }
+ }
+ },
+ {
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=10 and Balance <100",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+
+
+
+ ],
+ },
+
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+
+ this.fetchUtxos(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+
+
+
+ },
+ methods: {
+ //初始化折线图图表
+ inChartsLine() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("utxosLine"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("utxosLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart) this.myChart.resize();
+ // });
+ },
+
+ //初始化比率折线图图表
+ inChartSratioLine() {
+ if (this.myChart3 == null) {
+ this.myChart3 = echarts.init(document.getElementById("ratioLine"));
+ }
+ this.ratio = handelZoom(this.myChart3, this.ratio, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart3.setOption(this.ratio);
+ chartsWidth("ratioLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart3) this.myChart3.resize();;
+ // });
+ },
+
+
+ //请求数据
+ async fetchUtxos(req, radius, start, end, sma) {
+ this.utxosLoading = true
+ let { data } = await this.$API.getNewAddress(req, radius, start, end, sma)
+
+ this.UtxosData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChartsLine, this)
+ if (noData) {
+ // emptyData(data.data, this.option2.series, this.inChartsLine2, this)
+ emptyData(data.data, this.ratio.series, this.inChartSratioLine, this)
+ // emptyData(data.data, this.ratio2.series, this.inChartSratioLine2, this)
+ this.utxosLoading = false
+ return
+ }
+
+ this.start = this.UtxosData[0].dateTime.split("T")[0]
+ this.end = this.UtxosData[this.UtxosData.length - 1].dateTime.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ //添加水印
+ this.option = handelWatermark(this.option)
+ this.ratio = handelWatermark(this.ratio)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+
+
+ let balance0List = []
+ let rate0List = []
+ let xAxisData= []
+ this.UtxosData.forEach(item => {
+ balance0List.push(item.balance10)
+ rate0List.push((item.rate10 * 100).toFixed(4))
+ xAxisData.push(item.dateTime.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = balance0List
+ this.option.series[1].data = priceData
+ this.ratio.xAxis.data = xAxisData
+ this.ratio.series[0].data =rate0List
+
+
+ this.inChartsLine()
+ this.inChartSratioLine()
+
+
+ this.utxosLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option2, this.option2.series[0].data.length), );
+
+
+ }, 10000)
+
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+
+
+ },
+
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.ratio = handelLineType(this.ratio)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+ this.myChart3.setOption(this.ratio);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[4], this.start, this.end, this.inChartsLine, this, this.btcFlag)
+ fetchBtcPrice("BTC", this.option2.series[4], this.start, this.end, this.inChartsLine2, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[5], this.start, this.end, this.inChartsLine, this, this.ethFlag)
+ fetchEthPrice("ETH", this.option2.series[5], this.start, this.end, this.inChartsLine2, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList, start, end) {
+
+ this.sma = smaDataList
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[4], this.inChartsLine, this.start, this.end)
+ // handelSmaData(smaDataList, this.option2.series[4], this.inChartsLine2, this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/addressBalance4/index.vue b/yq/src/views/addressBalance4/index.vue
new file mode 100644
index 0000000..6cd7b1b
--- /dev/null
+++ b/yq/src/views/addressBalance4/index.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
{{$t(`menu.onchain5`)}}
+
{{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
+
{{ $t(`home.figure2`) }}
+
+
{{$t(`arh.ratio`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/addressBalance5/index.js b/yq/src/views/addressBalance5/index.js
new file mode 100644
index 0000000..7c89292
--- /dev/null
+++ b/yq/src/views/addressBalance5/index.js
@@ -0,0 +1,596 @@
+import * as echarts from "echarts";
+import { handelLineType,dataLength, chartsWidth,emptyData, handelSwitchs, handelZoom, fetchBtcPrice, fetchEthPrice, handelWatermark, handelSmaData, getDateArray, handelUsdt } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ params: {
+ req: "utxos",
+ radius: "btc"
+ },
+ utxosLoading: false,
+
+ //折线图配置
+ option: {
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+
+ animation: false,
+ // formatter: function (params) {
+ // var res
+ // res = params[0].axisValueLabel;
+ // res += `${params[0].marker} ${params[0].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[0].value}%
+ // ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ // ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}`;
+
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value / 10000).toFixed(2)} W`
+ }
+ }
+ },
+ {
+
+ position: "right",
+ type: "value",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=100 and Balance <1000",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 5,
+ // data: [],
+ // },
+
+
+
+ ],
+ },
+
+ //折线图配置比率图
+ ratio: {
+
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ var res
+
+ res = params[0].axisValueLabel;
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName} \u00A0\u00A0\u00A0\u00A0 ${Number(parseInt(params[i].value * 1000000) / 1000000)}% `;
+
+ }
+
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 180, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure3`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value).toFixed(3)} %`
+ }
+ }
+ },
+ {
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=100 and Balance <1000",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+
+
+
+ ],
+ },
+
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+
+ this.fetchUtxos(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+
+
+
+ },
+ methods: {
+ //初始化折线图图表
+ inChartsLine() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("utxosLine"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("utxosLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart) this.myChart.resize();
+ // });
+ },
+
+ //初始化比率折线图图表
+ inChartSratioLine() {
+ if (this.myChart3 == null) {
+ this.myChart3 = echarts.init(document.getElementById("ratioLine"));
+ }
+ this.ratio = handelZoom(this.myChart3, this.ratio, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart3.setOption(this.ratio);
+ chartsWidth("ratioLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart3) this.myChart3.resize();;
+ // });
+ },
+
+
+ //请求数据
+ async fetchUtxos(req, radius, start, end, sma) {
+ this.utxosLoading = true
+ let { data } = await this.$API.getNewAddress(req, radius, start, end, sma)
+
+ this.UtxosData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChartsLine, this)
+ if (noData) {
+ // emptyData(data.data, this.option2.series, this.inChartsLine2, this)
+ emptyData(data.data, this.ratio.series, this.inChartSratioLine, this)
+ // emptyData(data.data, this.ratio2.series, this.inChartSratioLine2, this)
+ this.utxosLoading = false
+ return
+ }
+
+ this.start = this.UtxosData[0].dateTime.split("T")[0]
+ this.end = this.UtxosData[this.UtxosData.length - 1].dateTime.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ //添加水印
+ this.option = handelWatermark(this.option)
+ this.ratio = handelWatermark(this.ratio)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+
+
+ let balance0List = []
+ let rate0List = []
+ let xAxisData= []
+ this.UtxosData.forEach(item => {
+ balance0List.push(item.balance100)
+ rate0List.push((item.rate100 * 100).toFixed(4))
+ xAxisData.push(item.dateTime.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = balance0List
+ this.option.series[1].data = priceData
+ this.ratio.xAxis.data = xAxisData
+ this.ratio.series[0].data =rate0List
+
+
+ this.inChartsLine()
+ this.inChartSratioLine()
+
+
+ this.utxosLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option2, this.option2.series[0].data.length), );
+
+
+ }, 10000)
+
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+
+
+ },
+
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.ratio = handelLineType(this.ratio)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+ this.myChart3.setOption(this.ratio);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[4], this.start, this.end, this.inChartsLine, this, this.btcFlag)
+ fetchBtcPrice("BTC", this.option2.series[4], this.start, this.end, this.inChartsLine2, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[5], this.start, this.end, this.inChartsLine, this, this.ethFlag)
+ fetchEthPrice("ETH", this.option2.series[5], this.start, this.end, this.inChartsLine2, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList, start, end) {
+
+ this.sma = smaDataList
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[4], this.inChartsLine, this.start, this.end)
+ // handelSmaData(smaDataList, this.option2.series[4], this.inChartsLine2, this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/addressBalance5/index.vue b/yq/src/views/addressBalance5/index.vue
new file mode 100644
index 0000000..6cd7b1b
--- /dev/null
+++ b/yq/src/views/addressBalance5/index.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
{{$t(`menu.onchain5`)}}
+
{{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
+
{{ $t(`home.figure2`) }}
+
+
{{$t(`arh.ratio`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/addressBalance6/index.js b/yq/src/views/addressBalance6/index.js
new file mode 100644
index 0000000..90886dc
--- /dev/null
+++ b/yq/src/views/addressBalance6/index.js
@@ -0,0 +1,596 @@
+import * as echarts from "echarts";
+import { handelLineType,dataLength, chartsWidth,emptyData, handelSwitchs, handelZoom, fetchBtcPrice, fetchEthPrice, handelWatermark, handelSmaData, getDateArray, handelUsdt } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ params: {
+ req: "utxos",
+ radius: "btc"
+ },
+ utxosLoading: false,
+
+ //折线图配置
+ option: {
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+
+ animation: false,
+ // formatter: function (params) {
+ // var res
+ // res = params[0].axisValueLabel;
+ // res += `${params[0].marker} ${params[0].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[0].value}%
+ // ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ // ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}`;
+
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value / 10000).toFixed(2)} W`
+ }
+ }
+ },
+ {
+
+ position: "right",
+ type: "value",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=1000 and Balance <10000",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 5,
+ // data: [],
+ // },
+
+
+
+ ],
+ },
+
+ //折线图配置比率图
+ ratio: {
+
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ var res
+
+ res = params[0].axisValueLabel;
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName} \u00A0\u00A0\u00A0\u00A0 ${Number(parseInt(params[i].value * 1000000) / 1000000)}% `;
+
+ }
+
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 180, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure3`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value).toFixed(3)} %`
+ }
+ }
+ },
+ {
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=1000 and Balance <10000",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+
+
+
+ ],
+ },
+
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+
+ this.fetchUtxos(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+
+
+
+ },
+ methods: {
+ //初始化折线图图表
+ inChartsLine() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("utxosLine"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("utxosLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart) this.myChart.resize();
+ // });
+ },
+
+ //初始化比率折线图图表
+ inChartSratioLine() {
+ if (this.myChart3 == null) {
+ this.myChart3 = echarts.init(document.getElementById("ratioLine"));
+ }
+ this.ratio = handelZoom(this.myChart3, this.ratio, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart3.setOption(this.ratio);
+ chartsWidth("ratioLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart3) this.myChart3.resize();;
+ // });
+ },
+
+
+ //请求数据
+ async fetchUtxos(req, radius, start, end, sma) {
+ this.utxosLoading = true
+ let { data } = await this.$API.getNewAddress(req, radius, start, end, sma)
+
+ this.UtxosData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChartsLine, this)
+ if (noData) {
+ // emptyData(data.data, this.option2.series, this.inChartsLine2, this)
+ emptyData(data.data, this.ratio.series, this.inChartSratioLine, this)
+ // emptyData(data.data, this.ratio2.series, this.inChartSratioLine2, this)
+ this.utxosLoading = false
+ return
+ }
+
+ this.start = this.UtxosData[0].dateTime.split("T")[0]
+ this.end = this.UtxosData[this.UtxosData.length - 1].dateTime.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ //添加水印
+ this.option = handelWatermark(this.option)
+ this.ratio = handelWatermark(this.ratio)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+
+
+ let balance0List = []
+ let rate0List = []
+ let xAxisData= []
+ this.UtxosData.forEach(item => {
+ balance0List.push(item.balance1000)
+ rate0List.push((item.rate1000 * 100).toFixed(6))
+ xAxisData.push(item.dateTime.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = balance0List
+ this.option.series[1].data = priceData
+ this.ratio.xAxis.data = xAxisData
+ this.ratio.series[0].data =rate0List
+
+
+ this.inChartsLine()
+ this.inChartSratioLine()
+
+
+ this.utxosLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option2, this.option2.series[0].data.length), );
+
+
+ }, 10000)
+
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+
+
+ },
+
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.ratio = handelLineType(this.ratio)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+ this.myChart3.setOption(this.ratio);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[4], this.start, this.end, this.inChartsLine, this, this.btcFlag)
+ fetchBtcPrice("BTC", this.option2.series[4], this.start, this.end, this.inChartsLine2, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[5], this.start, this.end, this.inChartsLine, this, this.ethFlag)
+ fetchEthPrice("ETH", this.option2.series[5], this.start, this.end, this.inChartsLine2, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList, start, end) {
+
+ this.sma = smaDataList
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[4], this.inChartsLine, this.start, this.end)
+ // handelSmaData(smaDataList, this.option2.series[4], this.inChartsLine2, this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/addressBalance6/index.vue b/yq/src/views/addressBalance6/index.vue
new file mode 100644
index 0000000..6cd7b1b
--- /dev/null
+++ b/yq/src/views/addressBalance6/index.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
{{$t(`menu.onchain5`)}}
+
{{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
+
{{ $t(`home.figure2`) }}
+
+
{{$t(`arh.ratio`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/addressBalance7/index.js b/yq/src/views/addressBalance7/index.js
new file mode 100644
index 0000000..6c8c83d
--- /dev/null
+++ b/yq/src/views/addressBalance7/index.js
@@ -0,0 +1,596 @@
+import * as echarts from "echarts";
+import { handelLineType,dataLength, chartsWidth,emptyData, handelSwitchs, handelZoom, fetchBtcPrice, fetchEthPrice, handelWatermark, handelSmaData, getDateArray, handelUsdt } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ params: {
+ req: "utxos",
+ radius: "btc"
+ },
+ utxosLoading: false,
+
+ //折线图配置
+ option: {
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+
+ animation: false,
+ // formatter: function (params) {
+ // var res
+ // res = params[0].axisValueLabel;
+ // res += `${params[0].marker} ${params[0].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[0].value}%
+ // ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ // ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}`;
+
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value / 10000).toFixed(2)} W`
+ }
+ }
+ },
+ {
+
+ position: "right",
+ type: "value",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=10000",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 5,
+ // data: [],
+ // },
+
+
+
+ ],
+ },
+
+ //折线图配置比率图
+ ratio: {
+
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ var res
+
+ res = params[0].axisValueLabel;
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName} \u00A0\u00A0\u00A0\u00A0 ${Number(parseInt(params[i].value * 1000000) / 1000000)}% `;
+
+ }
+
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 180, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure3`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value).toFixed(3)} %`
+ }
+ }
+ },
+ {
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=10000",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+
+
+
+ ],
+ },
+
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+
+ this.fetchUtxos(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+
+
+
+ },
+ methods: {
+ //初始化折线图图表
+ inChartsLine() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("utxosLine"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("utxosLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart) this.myChart.resize();
+ // });
+ },
+
+ //初始化比率折线图图表
+ inChartSratioLine() {
+ if (this.myChart3 == null) {
+ this.myChart3 = echarts.init(document.getElementById("ratioLine"));
+ }
+ this.ratio = handelZoom(this.myChart3, this.ratio, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart3.setOption(this.ratio);
+ chartsWidth("ratioLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart3) this.myChart3.resize();;
+ // });
+ },
+
+
+ //请求数据
+ async fetchUtxos(req, radius, start, end, sma) {
+ this.utxosLoading = true
+ let { data } = await this.$API.getNewAddress(req, radius, start, end, sma)
+
+ this.UtxosData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChartsLine, this)
+ if (noData) {
+ // emptyData(data.data, this.option2.series, this.inChartsLine2, this)
+ emptyData(data.data, this.ratio.series, this.inChartSratioLine, this)
+ // emptyData(data.data, this.ratio2.series, this.inChartSratioLine2, this)
+ this.utxosLoading = false
+ return
+ }
+
+ this.start = this.UtxosData[0].dateTime.split("T")[0]
+ this.end = this.UtxosData[this.UtxosData.length - 1].dateTime.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ //添加水印
+ this.option = handelWatermark(this.option)
+ this.ratio = handelWatermark(this.ratio)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+
+
+ let balance0List = []
+ let rate0List = []
+ let xAxisData= []
+ this.UtxosData.forEach(item => {
+ balance0List.push(item.balance10000)
+ rate0List.push((Number(item.rate10000)* 100).toFixed(6))
+ xAxisData.push(item.dateTime.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = balance0List
+ this.option.series[1].data = priceData
+ this.ratio.xAxis.data = xAxisData
+ this.ratio.series[0].data =rate0List
+
+
+ this.inChartsLine()
+ this.inChartSratioLine()
+
+
+ this.utxosLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option2, this.option2.series[0].data.length), );
+
+
+ }, 10000)
+
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+
+
+ },
+
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.ratio = handelLineType(this.ratio)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+ this.myChart3.setOption(this.ratio);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[4], this.start, this.end, this.inChartsLine, this, this.btcFlag)
+ fetchBtcPrice("BTC", this.option2.series[4], this.start, this.end, this.inChartsLine2, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[5], this.start, this.end, this.inChartsLine, this, this.ethFlag)
+ fetchEthPrice("ETH", this.option2.series[5], this.start, this.end, this.inChartsLine2, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList, start, end) {
+
+ this.sma = smaDataList
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[4], this.inChartsLine, this.start, this.end)
+ // handelSmaData(smaDataList, this.option2.series[4], this.inChartsLine2, this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/addressBalance7/index.vue b/yq/src/views/addressBalance7/index.vue
new file mode 100644
index 0000000..6cd7b1b
--- /dev/null
+++ b/yq/src/views/addressBalance7/index.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
{{$t(`menu.onchain5`)}}
+
{{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
+
{{ $t(`home.figure2`) }}
+
+
{{$t(`arh.ratio`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/adjusted/index.js b/yq/src/views/adjusted/index.js
new file mode 100644
index 0000000..16895d5
--- /dev/null
+++ b/yq/src/views/adjusted/index.js
@@ -0,0 +1,354 @@
+
+import * as echarts from "echarts";
+import { $addStorageEvent } from '../../util/processingData'
+import { getEaVolume2, } from '../../api/realTimeData'
+import {handelZoom, chartsWidth,emptyData,handelWatermark,handelLineType,handelSwitchs} from "../../util/processingData"
+
+export default {
+ data(){
+ return{
+ myChart:"",
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ },
+ yAxis: [
+ {
+ position: "left",
+ type: "value",
+ axisLabel: {
+ formatter: (value) => {
+ let data
+ if (value >= 1000000000) {
+ data = `${value / 1000000000}B`
+ } else if (value >= 1000000) {
+ data = `${value / 1000000}M`
+ } else {
+ data = `${value / 1000}K`
+ }
+ return data
+ }
+ }
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: true,
+ // min:`dataMin`,
+ // max:`dataMax`,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Transaction Volume (Entity-adjusted)",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series',
+
+
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#000",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#000",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+
+
+
+ ],
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ adjustedLoading:false,
+ params: {
+ req: "eaVolume",
+ radius: "btc",
+ sma: "",
+ start:"",
+ end:"",
+
+ },
+ dataSelection: [
+ {
+ value: "1d",
+ label: "home.day1",
+ disabled:false,
+ authority:"guest",
+ grade:1,
+ },
+ {
+ value: "realTime",
+ label: "home.realTimeData",
+ disabled:false,
+ authority:"vip",
+ grade:4,
+ },
+ ],
+ realTimeData:"",
+ switch3: "",
+ start:"",
+ end:"",
+
+
+
+ }
+ },
+ mounted(){
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.fetchEaVolume(this.params.req, this.params.radius)
+ },
+ methods:{
+ handleSelect(activeValue){
+ if (activeValue == `1d`) {
+ this.realTimeData =false
+ this.fetchEaVolume(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ }else{
+ this.fetchEaVolume2()
+ this.realTimeData =true
+ }
+ },
+ inCharts(){
+ if (!this.myChart) {
+ this.myChart = echarts.init(document.getElementById("adjustedBox"));
+
+ }
+
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+ this.myChart.setOption(this.option);
+ chartsWidth("adjustedBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+
+ //请求交易量数据渲染
+ async fetchEaVolume(req, radius, start, end, sma) {
+ this.adjustedLoading = true
+ const { data } = await this.$API.getVolume(req, radius, start, end, sma)
+ let volumeData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.adjustedLoading = false
+ return
+ }
+ //添加水印
+ handelWatermark(this.option, 750, 300)
+ this.start =volumeData[0].date.split("T")[0]
+ this.end = volumeData[volumeData.length - 1].date.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ let volumeValueList = []
+ let xAxisData = []
+ volumeData.forEach(item => {
+
+ volumeValueList.push(Number(item.value.toFixed(2)))
+ xAxisData.push(item.date.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = volumeValueList
+ this.option.series[1].data = priceData
+ if (this.zoomStart) {
+ this.option.dataZoom[0].start = this.zoomStart
+ this.option.dataZoom[0].end = this.zoomEnd
+ } else {
+ this.option.dataZoom[0].start = 10
+ this.option.dataZoom[0].end = 100
+ }
+
+
+
+
+ this.inCharts()
+
+
+
+
+ setTimeout(() => {//监听echarts 图表滚动
+ this.myChart.on("dataZoom", function (e) {
+ this.zoomStart = e.start || e.batch[0].start;
+ this.zoomEnd = e.end|| e.batch[0].end;
+ $addStorageEvent(1, "zoomStart", this.zoomStart);
+ $addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ });
+
+
+ })
+
+ this.adjustedLoading = false
+
+
+
+
+
+ },
+ //实时数据
+ async fetchEaVolume2(){
+ this.adjustedLoading = true
+ const { data } = await getEaVolume2()
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.adjustedLoading = false
+ return
+ }
+ let BTCVolumeData = data.data
+ let Volume=[]
+ let xAxisData = []
+ let priceData =[]
+ BTCVolumeData.forEach(item=>{
+ item.date= `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ xAxisData.push(item.date)
+ Volume.push(item.value.toFixed(2))
+ priceData.push(Number(item.price.toFixed(2)))
+ })
+
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = Volume
+ this.option.series[1].data = priceData
+
+
+ this.inCharts()
+ this.adjustedLoading = false
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchEaVolume(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ },
+ //父级选择Sma
+ handelSonSma(smaNUm) {
+ this.params.sma = smaNUm
+ this.fetchEaVolume(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ this.$addStorageEvent(1, "sma",this.params.sma);
+ this.realTimeData =false
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+
+
+ },
+}
\ No newline at end of file
diff --git a/yq/src/views/adjusted/index.vue b/yq/src/views/adjusted/index.vue
new file mode 100644
index 0000000..bb1be32
--- /dev/null
+++ b/yq/src/views/adjusted/index.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/arh999/index.js b/yq/src/views/arh999/index.js
new file mode 100644
index 0000000..2f9ddbd
--- /dev/null
+++ b/yq/src/views/arh999/index.js
@@ -0,0 +1,721 @@
+import * as echarts from "echarts";
+import { handelLineType,dataLength, chartsWidth, emptyData,handelSwitchs, fetchBtcPrice, handelZoom, fetchEthPrice, handelProfitrate, handelWatermark, handelSmaData, getDateArray } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ arhLoading: false,
+ option: {
+ legend: {
+ right: 100,
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 60, '14px Microsoft Yahei', '…');
+ // },
+ },
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ axisLabel: {
+ // formatter:function(value){
+
+ // return `${value/1000} k`
+ // }
+ },
+
+ },
+ {
+ position: "right",
+ // type: "log",
+ splitNumber: "5",
+ show: true,
+ },
+ {
+ position: "right",
+ // type: "log",
+ splitNumber: "5",
+ show: false,
+ },
+ {
+ position: "right",
+ // type: "log",
+ splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "arh999",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式#f7931a
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ markArea: {
+ silent: true,
+ data: [
+ [
+ {
+ yAxis: "0.45",
+ itemStyle: {
+ color: "#fde7e7",
+ },
+ },
+ {
+ yAxis: "0",
+ },
+ ],
+
+ ],
+ },
+ yAxisIndex: 0,
+
+ },
+ {
+ name: "arh99x",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#306f67",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式#e43961
+ color: "#306f67",
+ width: "1",
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ // markLine: {
+ // symbol: ["none", "none"], //去掉箭头
+ // itemStyle: {
+ // normal: {
+ // lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ // },
+ // },
+ // // lineStyle:{
+ // // opacity:0
+ // // },
+ // label: {
+ // formatter: "{b}",
+ // fontSize: 10,
+ // color: "rgba(0,0,0,0.8)",
+ // align: "left",
+ // },
+ // data: [
+ // {
+ // name: "$0",
+ // yAxis: 0,
+ // },
+ // {
+ // name: "$10k",
+ // yAxis: 10000,
+ // },
+ // {
+ // name: "$20K",
+ // yAxis: 20000,
+ // },
+ // {
+ // name: "$30K",
+ // yAxis: 30000,
+ // },
+ // {
+ // name: "$40K",
+ // yAxis: 40000,
+ // },
+ // {
+ // name: "$50K",
+ // yAxis: 50000,
+ // },
+ // {
+ // name: "$60K",
+ // yAxis: 60000,
+ // },
+ // {
+ // name: "$70K",
+ // yAxis: 70000,
+ // },
+ // {
+ // name: "$80K",
+ // yAxis: 80000,
+ // },
+ // {
+ // name: "$90K",
+ // yAxis: 90000,
+ // },
+ // {
+ // name: "$100K",
+ // yAxis: 100000,
+ // },
+
+ // ],
+ // },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 2,
+ // data: [],
+ // },
+ {
+ name: "定投线",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#2c2f90",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式#e43961
+ color: "#2c2f90",
+ width: "2",
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+ {
+ name: "抄底线",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f5839e",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式#e43961
+ color: "#f5839e",
+ width: "2",
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+
+ ],
+ },
+ dayOption: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i <= params.length - 1; i++) {
+ // res += `${params[i].marker} ${params[i].value[1]} ${params[i].seriesName}`;
+ // }
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ axisLabel: {
+ formatter: function (value) {
+ let hours = value.split(" ")[1].split(":")[0];
+ let min = value.split(" ")[1].split(":")[1];
+ return `${hours}:${min}`;
+ },
+ },
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure2`),
+ position: "left",
+ type: "value",
+ // min: `dataMin`,
+ // max: `dataMax`,
+ // axisLabel:{
+ // formatter:function(value){
+ // let data = (value/10000).toFixed(3)
+ // return `${data} W`
+ // }
+ // }
+ min:`dataMin`,
+ max:`dataMax`,
+ },
+ {
+ position: "right",
+ type: "value",
+ // min: `dataMin`,
+ // max: `dataMax`,
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ min: `dataMin`,
+ max: `dataMax`,
+ // splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "arh99",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "arh99x",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#e43961",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#e43961",
+ width: "1",
+ },
+ data: [],
+ yAxisIndex: 0,
+ },
+
+
+ ],
+ },
+ timeParams: {
+ req: "arh99",
+ start: "",
+ end: ""
+ },
+ dayParams: {
+ req: "arh99day",
+ start: "",
+ end: ""
+ },
+ arhData: [],
+ arhDayData: [],
+ radius: "BTC",
+ timer: "",
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ watch: {
+ radius: {
+ handler(val) {
+ // if (val=="BTC") {
+ // this.radius = "BTC"
+ // }else if (val=="ETH") {
+ // this.radius = "ETH"
+ // }
+ this.fetchArh(this.timeParams.req, val)
+ this.fetchArhDay(this.dayParams.req, val)
+ },
+ deep: true,
+ immediate: true,
+ }
+
+ },
+ mounted() {
+
+ this.radius = localStorage.getItem("radius");
+ //监听localstorage变化
+ window.addEventListener("setItem", () => {
+ this.radius = localStorage.getItem("radius");
+ });
+ if (this.timer) {
+ clearInterval(this.timer)
+ }
+ //5分钟请求一次页面
+ this.timer = setInterval(() => {
+ this.fetchArh(this.timeParams.req, this.radius)
+ this.fetchArhDay(this.dayParams.req, this.radius)
+ }, 300000)
+
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化arh999图表
+ inChart() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("arhBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("arhBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ //初始化arh999day图表
+ inChartDay() {
+ if (this.myChartDay == null) {
+ this.myChartDay = echarts.init(document.getElementById("arhDayBox"));
+ }
+ this.dayOption = handelZoom(this.myChartDay, this.dayOption, this, this.zoomStart, this.zoomEnd)
+
+ this.myChartDay.setOption(this.dayOption);
+ chartsWidth("arhDayBox", this);
+ window.addEventListener("resize", () => {
+ this.myChartDay.resize();
+ });
+ },
+ //请求arh999渲染数据
+ async fetchArh(req, radius, start, end, sma) {
+ this.arhLoading = true
+ const { data } = await this.$API.getMa370(req, radius, start, end, sma)
+ this.arhData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChart, this)
+ if (noData) {
+ this.arhLoading = false
+ return
+ }
+ this.start = this.arhData[0].date.split("T")[0]
+ this.end = this.arhData[this.arhData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ //渲染ETH
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+ let arh99ValueList = []
+ let arh99xValueList = []
+ let investmentList = []
+ let bottomLine = []
+ this.arhData.forEach(item => {
+ arh99ValueList.push(Number(item.arh99.toFixed(2)))
+ arh99xValueList.push(Number(item.arh99x.toFixed(2)))
+ investmentList.push(1.2)
+ bottomLine.push(0.45)
+ })
+
+ this.option.series[0].data = handelProfitrate(this.arhData, arh99ValueList)
+ this.option.series[1].data = handelProfitrate(this.arhData, arh99xValueList)
+ this.option.series[3].data = handelProfitrate(this.arhData, investmentList)
+ this.option.series[4].data = handelProfitrate(this.arhData, bottomLine)
+
+ this.inChart()
+ this.arhLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.dayOption, this.dayOption.series[0].data.length), );
+
+ }, 20000)
+
+
+ },
+ //请求arh999day渲染数据
+ async fetchArhDay(req, radius, start, end) {
+ // this.arhLoading = true
+ const { data } = await this.$API.getMa370(req, radius, start, end)
+ this.arhDayData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.dayOption.series, this.inChartDay, this)
+ if (noData) {
+ this.arhLoading = false
+ return
+ }
+ this.dayOption.xAxis.data.length = 0
+ this.dayOption.series[0].data.length = 0
+ this.dayOption.series[1].data.length = 0
+ //添加水印
+ this.dayOption = handelWatermark(this.dayOption)
+ this.arhDayData.forEach(item => {
+ let year = item.date.split("T")[0]
+ let hour = item.date.split("T")[1].split(".")[0]
+ let time = `${year} ${hour}`
+ this.dayOption.xAxis.data.push(time)
+ this.dayOption.series[0].data.push([time, Number(item.arh99.toFixed(4))])
+ this.dayOption.series[1].data.push([time, Number(item.arh99x.toFixed(4))])
+
+ })
+ this.inChartDay()
+ // this.arhLoading = false
+ },
+
+ //父级时间
+ handelSonTime(start, end) {
+ this.timeParams.start = start;
+ this.timeParams.end = end;
+ this.fetchArh(this.timeParams.req, this.radius, this.timeParams.start, this.timeParams.end, this.sma)
+ if (this.radius == "BTC") {
+ // this.handelSonEthPrice()
+ }
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.dayOption = handelLineType(this.dayOption)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+ this.myChartDay.setOption(this.dayOption);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[2], this.start, this.end, this.inChart, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[3], this.start, this.end, this.inChart, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.sma = smaDataList
+ this.fetchArh(this.timeParams.req, this.radius, this.timeParams.start, this.timeParams.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inChart, this.start, this.end,)
+
+ },
+
+ },
+ beforeDestroy() {
+ // console.log("销毁咯 清除定时器");
+ clearInterval(this.timer)
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+
+
+
+
+}
\ No newline at end of file
diff --git a/yq/src/views/arh999/index.vue b/yq/src/views/arh999/index.vue
new file mode 100644
index 0000000..82ddf58
--- /dev/null
+++ b/yq/src/views/arh999/index.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+ {{$t(`arh.graph`)}}
+ {{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
+ {{$t(`arh.dayGraph`)}}
+ {{ $t(`home.figure2`) }}
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/asol/index.js b/yq/src/views/asol/index.js
new file mode 100644
index 0000000..6ec974a
--- /dev/null
+++ b/yq/src/views/asol/index.js
@@ -0,0 +1,533 @@
+import * as echarts from "echarts";
+import {getAsol2} from "../../api/realTimeData";
+import { chartsWidth,dataLength, emptyData,handelBtcPrice, handelProfitrate, handelZoom, handelLineType, handelWatermark, handelSwitchs, handelSmaData, getDateArray, fetchBtcPrice, fetchEthPrice } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ asolLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+
+
+ if (params[0].axisType == `xAxis.time`) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+ }else{
+ var res = params[0].axisValue
+ }
+
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 60, '14px Microsoft Yahei', '…');
+ // },
+ // data:[`sopr`,'asopr','easopr','lthsopr','sthsopr',],
+ // selected:{
+ // 'asopr': false,
+ // 'easopr': false,
+ // 'lthsopr': false,
+ // 'sthsopr': false,
+ // }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ // axisLabel: {
+ // formatter: function (e) {
+
+ // let value;
+ // if (e > 1000000) {
+ // value = e / 100000;
+ // } else if (e > 100000) {
+ // value = e / 1000;
+ // } else {
+ // value = e / 100;
+ // }
+ // return value;
+ // },
+ // },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "ASOL",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ yAxisIndex: 0,
+ },
+ {
+ name: "ASOL(CE)",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#3aa46e",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#3aa46e",
+ width: "1",
+ },
+ data: [],
+ yAxisIndex: 0,
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ // markLine: {
+ // symbol: ["none", "none"], //去掉箭头
+ // itemStyle: {
+ // normal: {
+ // lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ // },
+ // },
+ // // lineStyle:{
+ // // color:"red"
+ // // },
+
+ // label: {
+ // formatter: "{b}",
+ // fontSize: 10,
+ // color: "rgba(0,0,0,0.8)",
+ // align: "left",
+ // },
+ // data: [
+ // // {
+ // // name: "0",
+ // // yAxis: 0,
+ // // },
+ // // {
+ // // name: "$40W",
+ // // yAxis: 400000,
+ // // },
+ // {
+ // name: "$70W",
+ // yAxis: 700000,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+
+ // {
+ // name: "$10W",
+ // yAxis: 100000,
+ // },
+ // {
+ // name: "$100W",
+ // yAxis: 1000000,
+ // // position: ['100%', '50'],
+ // },
+ // {
+ // name: "$120W",
+ // yAxis: 1200000,
+ // },
+
+ // {
+ // name: "$140W",
+ // yAxis: 1400000,
+ // },
+ // ],
+ // },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 3,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ req: "asol",
+ radius: "btc"
+ },
+ asolData: [],
+ priceTime: "",
+ btcPrice: [],
+ parmesTime: {
+ start: "",
+ end: ""
+ },
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+ dataSelection: [
+ {
+ value: "1d",
+ label: "home.day1",
+ disabled:false,
+ authority:"guest",
+ grade:1,
+ },
+ {
+ value: "realTime",
+ label: "home.realTimeData",
+ disabled:false,
+ authority:"vip",
+ grade:4,
+ },
+ ],
+ realTimeData:"",
+ }
+ },
+ mounted() {
+
+ this.fetchAsol(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+ })
+
+ },
+ methods: {
+ handleSelect(activeValue){
+ if (activeValue=="1d") {
+ this.realTimeData = false
+ this.fetchAsol(this.params.req, this.params.radius)
+ }else{
+ this.realTimeData = true
+ this.fetchAsol2()
+ }
+ },
+ //初始化图表
+ inCharts() {
+ // this.myChart = echarts.init(document.getElementById("asolBox"));
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("asolBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("asolBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchAsol2(){
+ this.asolLoading = true
+ const { data } = await getAsol2()
+ let Asol2Data = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.asolLoading = false
+ return
+ }
+ this.option.xAxis.type="category"
+ this.option = handelWatermark(this.option)
+ let asol =[]
+ let eaasol =[]
+ let xAxisData=[]
+ let price=[]
+ Asol2Data.forEach(item=>{
+ item.date=`${item.date.split("T")[0]} ${
+ item.date.split("T")[1].split(`.`)[0]
+ } `;
+ asol.push(item.asol.toFixed(2))
+ eaasol.push(item.eaasol.toFixed(2))
+ xAxisData.push(item.date)
+ price.push(item.price.toFixed(2))
+ })
+
+
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = asol
+ this.option.series[1].data = eaasol
+ this.option.series[2].data = price
+ this.inCharts()
+ console.log(this.option,"揭谛揭谛");
+ this.asolLoading = false
+ },
+
+ async fetchAsol(req, radius, start, end, sma) {
+ this.asolLoading = true
+ const { data } = await this.$API.getAsol(req, radius, start, end, sma)
+ this.asolData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.asolLoading = false
+ return
+ }
+ this.start = this.asolData[0].date.split("T")[0]
+ this.end = this.asolData[this.asolData.length - 1].date.split("T")[0]
+
+ this.option.xAxis.type="time"
+ //添加水印
+ this.option = handelWatermark(this.option)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ //渲染ETH
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+ // //请求BTC价格
+ // const price = await this.$API.getBtcPrice(start, end);
+ // this.btcPrice = price.data.data
+
+
+ let asolValueList = []
+ let eaasolValueList = []
+
+ this.asolData.forEach(item => {
+ asolValueList.push(Number(item.asol.toFixed(2)))
+ eaasolValueList.push(Number(item.eaasol.toFixed(2)))
+
+
+ //判断渲染与上面数据时间一致得价格数据
+ // this.btcPrice.forEach(price => {
+
+ // this.priceTime = price.time.split("T")[0]
+ // // console.log(this.timer === this.priceTime);
+ // if (time === this.priceTime) {
+
+ // priceValueList.push(Number(parseInt(price.value*100)/100))
+ // newPriceData.push(price)
+ // }
+ // })
+ })
+
+ this.option.series[0].data = handelProfitrate(this.asolData, asolValueList)
+ this.option.series[1].data = handelProfitrate(this.asolData, eaasolValueList)
+ // this.option.series[2].data = handelBtcPrice(newPriceData, priceValueList)
+
+ this.inCharts()
+ this.asolLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.parmesTime.start = start;
+ this.parmesTime.end = end;
+ this.fetchAsol(this.params.req, this.params.radius, this.parmesTime.start, this.parmesTime.end, this.sma)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ // 请求BTC价格
+ async fetchBtcPrice(radius, start, end) {
+ //请求BTC价格
+ const price = await this.$API.getBtcPrice2(radius, start, end);
+ this.btcPrice = price.data.data
+ if (!this.btcPrice) {//价格未查询到数据的情况
+ this.option.series[2].data.length = 0
+
+ } else {
+
+ let priceValueList = []
+ let newPriceData = []
+ this.btcPrice.forEach(price => {
+ priceValueList.push(Number(parseInt(price.value * 100) / 100))
+ newPriceData.push(price)
+ })
+ this.option.series[2].data = handelBtcPrice(newPriceData, priceValueList)
+
+ }
+ this.inCharts()
+ },
+ // 请求Eth价格
+ async fetchEthPrice(radius, start, end) {
+ const price = await this.$API.getBtcPrice2(radius, start, end);
+ this.ethPrice = price.data.data
+ if (!this.ethPrice) {
+ this.option.series[3].data.length = 0
+ } else {
+ let priceValueList = []
+ let newPriceData = []
+ this.ethPrice.forEach(price => {
+ priceValueList.push(Number(parseInt(price.value * 100) / 100))
+ newPriceData.push(price)
+ })
+ this.option.series[3].data = handelBtcPrice(newPriceData, priceValueList)
+ }
+
+ this.inCharts()
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+
+ fetchBtcPrice("BTC", this.option.series[2], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[3], this.start, this.end, this.inCharts, this, this.ethFlag)
+
+
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.sma = smaDataList
+
+ this.fetchAsol(this.params.req, this.params.radius, this.parmesTime.start, this.parmesTime.end, this.sma)
+
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ this.realTimeData = false
+
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/asol/index.vue b/yq/src/views/asol/index.vue
new file mode 100644
index 0000000..76d8966
--- /dev/null
+++ b/yq/src/views/asol/index.vue
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+ ASOL = Mean{ lifespan [days] (of all spent outputs) }
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/asolEth/index.js b/yq/src/views/asolEth/index.js
new file mode 100644
index 0000000..5f748ad
--- /dev/null
+++ b/yq/src/views/asolEth/index.js
@@ -0,0 +1,360 @@
+import * as echarts from "echarts";
+import { getAsolEth, } from "../../api/pages"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ asolEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}M `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Average Spent Output Lifespan",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchasolEth()
+ //禁用时间框
+ // this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("asolEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("asolEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchasolEth(params) {
+ this.asolEthLoading = true
+ const { data } = await getAsolEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.asolEthLoading = false
+ return
+ }
+ let asolEthData = data.data
+ this.start = asolEthData[0].date.split("T")[0]
+ this.end = asolEthData[asolEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // // //移动平均线没值 才渲染正常价格数据
+ // // if (this.start && !this.fatherSmaData[0]) {
+ // // this.ethFlag = true
+ // // this.handelSonEthPrice("ETH", true);
+ // // this.$addStorageEvent(1, "ethFlag", JSON.stringify(true));
+ // // }
+ // // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // // if (this.fatherSmaData[0] && this.start) {
+ // // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ // // }
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ asolEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(asolEthData, ValueList)
+
+ this.inCharts()
+
+ this.asolEthLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchasolEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchasolEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/asolEth/index.vue b/yq/src/views/asolEth/index.vue
new file mode 100644
index 0000000..1264831
--- /dev/null
+++ b/yq/src/views/asolEth/index.vue
@@ -0,0 +1,38 @@
+
+
+
+
+ ASOL = Mean{ lifespan [days] (of all spent outputs) }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/backendPayment/index.js b/yq/src/views/backendPayment/index.js
new file mode 100644
index 0000000..7ae1d4d
--- /dev/null
+++ b/yq/src/views/backendPayment/index.js
@@ -0,0 +1,76 @@
+import * as echarts from "echarts";
+import { msgBoradTabel, msgBoradNum, responMsg } from "../../api/messageBoard"
+export default {
+ data() {
+ return {
+ tableData: [{
+ date: '2016-05-03',
+ name: '王小虎',
+ province: '上海',
+ city: '普陀区',
+ address: '上海市普陀区金沙江路 1518 弄',
+ zip: 200333
+ }, {
+ date: '2016-05-02',
+ name: '王小虎',
+ province: '上海',
+ city: '普陀区',
+ address: '上海市普陀区金沙江路 1518 弄',
+ zip: 200333
+ }, {
+ date: '2016-05-04',
+ name: '王小虎',
+ province: '上海',
+ city: '普陀区',
+ address: '上海市普陀区金沙江路 1518 弄',
+ zip: 200333
+ }, {
+ date: '2016-05-01',
+ name: '王小虎',
+ province: '上海',
+ city: '普陀区',
+ address: '上海市普陀区金沙江路 1518 弄',
+ zip: 200333
+ }, {
+ date: '2016-05-08',
+ name: '王小虎',
+ province: '上海',
+ city: '普陀区',
+ address: '上海市普陀区金沙江路 1518 弄',
+ zip: 200333
+ }, {
+ date: '2016-05-06',
+ name: '王小虎',
+ province: '上海',
+ city: '普陀区',
+ address: '上海市普陀区金沙江路 1518 弄',
+ zip: 200333
+ }, {
+ date: '2016-05-07',
+ name: '王小虎',
+ province: '上海',
+ city: '普陀区',
+ address: '上海市普陀区金沙江路 1518 弄',
+ zip: 200333
+ }],
+ msg:"",
+ dialogVisible:false
+
+ }
+ },
+ mounted() {
+
+ },
+ methods: {
+ handleEdit(){
+ this.dialogVisible=true
+ this.msg="确认支付?"
+
+ },
+ handleDelete(){
+ this.dialogVisible=true
+ this.msg="拒绝支付?"
+
+ },
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/backendPayment/index.vue b/yq/src/views/backendPayment/index.vue
new file mode 100644
index 0000000..6f697c7
--- /dev/null
+++ b/yq/src/views/backendPayment/index.vue
@@ -0,0 +1,140 @@
+
+
+
+
+
+ {{ $t(`login.backendPayment`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 确认
+ 拒绝
+
+
+
+
+
+
+ {{ msg }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/backendRefund/index.js b/yq/src/views/backendRefund/index.js
new file mode 100644
index 0000000..8e59078
--- /dev/null
+++ b/yq/src/views/backendRefund/index.js
@@ -0,0 +1,68 @@
+import * as echarts from "echarts";
+import { msgBoradTabel, msgBoradNum, responMsg } from "../../api/messageBoard"
+export default {
+ data() {
+ return {
+ tableData: [{
+ date: '2016-05-03',
+ name: '王小虎',
+ province: '上海',
+ city: '普陀区',
+ address: '上海市普陀区金沙江路 1518 弄',
+ zip: 200333
+ }, {
+ date: '2016-05-02',
+ name: '王小虎',
+ province: '上海',
+ city: '普陀区',
+ address: '上海市普陀区金沙江路 1518 弄',
+ zip: 200333
+ }, {
+ date: '2016-05-04',
+ name: '王小虎',
+ province: '上海',
+ city: '普陀区',
+ address: '上海市普陀区金沙江路 1518 弄',
+ zip: 200333
+ }, {
+ date: '2016-05-01',
+ name: '王小虎',
+ province: '上海',
+ city: '普陀区',
+ address: '上海市普陀区金沙江路 1518 弄',
+ zip: 200333
+ }, {
+ date: '2016-05-08',
+ name: '王小虎',
+ province: '上海',
+ city: '普陀区',
+ address: '上海市普陀区金沙江路 1518 弄',
+ zip: 200333
+ }, {
+ date: '2016-05-06',
+ name: '王小虎',
+ province: '上海',
+ city: '普陀区',
+ address: '上海市普陀区金沙江路 1518 弄',
+ zip: 200333
+ }, {
+ date: '2016-05-07',
+ name: '王小虎',
+ province: '上海',
+ city: '普陀区',
+ address: '上海市普陀区金沙江路 1518 弄',
+ zip: 200333
+ }],
+ dialogVisible:false
+
+ }
+ },
+ mounted() {
+
+ },
+ methods: {
+ handleEdit(){
+ this.dialogVisible=true
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/backendRefund/index.vue b/yq/src/views/backendRefund/index.vue
new file mode 100644
index 0000000..bf76fd5
--- /dev/null
+++ b/yq/src/views/backendRefund/index.vue
@@ -0,0 +1,132 @@
+
+
+
+
+
+ {{ $t(`login.backendRefund`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 完成退款
+
+
+
+
+
+ 是否完成退款?
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/backendWithdrawal/index.js b/yq/src/views/backendWithdrawal/index.js
new file mode 100644
index 0000000..9bccf47
--- /dev/null
+++ b/yq/src/views/backendWithdrawal/index.js
@@ -0,0 +1,337 @@
+import * as echarts from "echarts";
+import { msgBoradTabel, msgBoradNum, responMsg } from "../../api/messageBoard"
+import { historyAll, Handle } from "../../api/pay"
+import { Debounce } from "../../util/processingData"
+import Vue from 'vue'
+export default {
+ data() {
+ return {
+ tableData0: [{
+ date: '2016-05-03',
+ name: '王小虎',
+ province: '上海',
+ city: '普陀区',
+ address: '上海市普陀区金沙江路 1518 弄',
+ zip: 200333
+ }, {
+ date: '2016-05-02',
+ name: '王小虎',
+ province: '上海',
+ city: '普陀区',
+ address: '上海市普陀区金沙江路 1518 弄',
+ zip: 200333
+ }, {
+ date: '2016-05-04',
+ name: '王小虎',
+ province: '上海',
+ city: '普陀区',
+ address: '上海市普陀区金沙江路 1518 弄',
+ zip: 200333
+ }, {
+ date: '2016-05-01',
+ name: '王小虎',
+ province: '上海',
+ city: '普陀区',
+ address: '上海市普陀区金沙江路 1518 弄',
+ zip: 200333
+ }, {
+ date: '2016-05-08',
+ name: '王小虎',
+ province: '上海',
+ city: '普陀区',
+ address: '上海市普陀区金沙江路 1518 弄',
+ zip: 200333
+ }, {
+ date: '2016-05-06',
+ name: '王小虎',
+ province: '上海',
+ city: '普陀区',
+ address: '上海市普陀区金沙江路 1518 弄',
+ zip: 200333
+ }, {
+ date: '2016-05-07',
+ name: '王小虎',
+ province: '上海',
+ city: '普陀区',
+ address: '上海市普陀区金沙江路 1518 弄',
+ zip: 200333
+ }],
+ msg: "",
+ dialogVisible: false,
+ tableData: [{
+ appliedAmount: "50",
+ coin: "BUSD",
+ chain: "",
+ userAddress: "",
+ fromAddres: "",
+ appliedTime: "",
+ id: "1",
+ }],
+ tableData: [{
+ appliedAmount: "50",
+ coin: "BUSD",
+ chain: "",
+ userAddress: "",
+ fromAddres: "",
+ appliedTime: "",
+ id: "1",
+ }],
+ successData: [{
+ appliedAmount: "50",
+ coin: "BUSD",
+ chain: "",
+ userAddress: "",
+ fromAddres: "",
+ appliedTime: "",
+ id: "1",
+ }],
+ failData: [{
+ appliedAmount: "50",
+ coin: "BUSD",
+ chain: "",
+ userAddress: "",
+ fromAddres: "",
+ appliedTime: "",
+ id: "1",
+ }],
+ params: {
+ status: "",
+ page: 1,
+ limit: 300,
+ address: ""
+ },
+ backendWithdrawalLoading: false,
+ handleParams: {
+ id: "",
+ oper: "",
+ refundTxid: "",
+ msg: "",
+ refundAddress: "",
+ },
+ refuseDialogVisible: false,
+ backendLoading: false,
+ appliedAmount: "",
+ activeName: "",
+
+
+ }
+ },
+
+ mounted() {
+ this.fetchWithdrawal2({ page: 1, limit: 300, status: 2 })
+ this.fetchWithdrawal0({ page: 1, limit: 300, status: 0 })
+ this.fetchWithdrawal1({ page: 1, limit: 300, status: 1 })
+
+ this.activeName = sessionStorage.getItem('WithdrawalActiveName')
+ if (!this.activeName) {
+ this.activeName="pending"
+ }
+
+ },
+ watch: {
+ activeName(val){
+ console.log(val,3333);
+ }
+ },
+ methods: {
+ //请求待处理订单
+ async fetchWithdrawal2(params) {
+ this.backendWithdrawalLoading = true
+ const { data } = await historyAll(params)
+
+
+ this.tableData = data.rows
+ // this.params.address = ""
+ this.backendWithdrawalLoading = false
+
+ },
+ //请求成功订单
+ async fetchWithdrawal1(params) {
+ this.backendWithdrawalLoading = true
+ const { data } = await historyAll(params)
+
+
+ this.successData = data.rows
+ // this.params.address = ""
+ this.backendWithdrawalLoading = false
+
+ },
+ //请求失败订单
+ async fetchWithdrawal0(params) {
+ this.backendWithdrawalLoading = true
+ const { data } = await historyAll(params)
+
+
+ this.failData = data.rows
+ // this.params.address = ""
+ this.backendWithdrawalLoading = false
+
+ },
+ //请求处理提现订单
+ async fetchHandle(params) {
+ this.backendLoading = true
+ const { data } = await Handle(params)
+
+ if (data.code == 200) {
+ this.$message({
+ type: 'success',
+ message: data.msg,
+ duration: 5000,
+ showClose: true,
+ });
+ this.dialogVisible = false
+ this.refuseDialogVisible = false
+
+ Object.keys(this.handleParams).forEach(key => {//值清空
+ this.handleParams[key] = "";
+ });
+
+ this.fetchWithdrawal0({ page: 1, limit: 300, status: 2 })//处理成功后重新请求一遍 刷新数据
+ }
+
+
+
+ this.backendLoading = false
+
+ },
+
+ //点击搜索
+ handelSearch(status) {
+
+ for (const key in this.params) { //判空
+ if (key !== `status` && this.params[key] == "") {
+ this.$message({
+ message: this.$t(`pay.search`),
+ type: "error",
+ });
+ return
+ }
+ }
+
+ switch (status) {
+ case 0:
+ this.params.status = 0
+ this.fetchWithdrawal0(this.params)
+ break;
+ case 1:
+ this.params.status = 1
+ this.fetchWithdrawal1(this.params)
+
+ break;
+ case 2:
+ this.params.status = 2
+ this.fetchWithdrawal2(this.params)
+ break;
+
+ default:
+ break;
+ }
+
+
+ },
+
+ //点击表格提现按钮
+ handleEdit(index, row) {
+ this.appliedAmount = row.appliedAmount
+ this.dialogVisible = true
+ this.msg = "确认提现"
+ this.handleParams.id = row.id
+ },
+ //点击表格拒绝按钮
+ handleDelete(index, row) {
+ this.refuseDialogVisible = true
+ this.msg = "拒绝提现"
+ this.handleParams.id = row.id
+
+ },
+ handelTime(date) {
+ if (date) {
+ return `${date.split("T")[0]} ${date.split("T")[1].split(".")[0]}`
+ }
+ },
+ //确认通过提现
+ handelConfirm() {
+ this.handleParams.oper = 1
+
+ for (const key in this.handleParams) { //判空
+ if (this.handleParams[key] == "" && key !== "oper" && key !== "msg") {
+
+
+ switch (key) {
+ case "refundTxid":
+ this.$message({
+ message: this.$t(`pay.hashError`),
+ type: "error",
+ });
+ break;
+
+ case "refundAddress":
+ this.$message({
+ message: this.$t(`pay.paymentAddress`),
+ type: "error",
+ });
+ break;
+
+
+
+
+ default:
+ break;
+ }
+
+
+
+
+ return
+ }
+ }
+
+ // this.handleParams.refund = Number(this.handleParams.refund)
+
+
+ this.fetchHandle(this.handleParams)
+ },
+ //确认拒绝提现
+ handelRefuse() {
+ this.handleParams.oper = 0
+
+ if (!this.handleParams.msg) { //备注不能为空
+ this.$message({
+ message: this.$t(`help.resubmit`),
+ type: "error",
+ });
+ return
+ }
+
+
+ this.fetchHandle(this.handleParams)
+ },
+ //弹窗取消
+ handelCancel() {
+ this.dialogVisible = false
+ this.backendLoading = false
+ Object.keys(this.handleParams).forEach(key => {//值清空
+ this.handleParams[key] = "";
+ });
+ },
+ //点击查看提现详情
+ handelDetails(row) {
+ this.$router.push({ path: "/withdrawalDetails", query: { id: row.id } })
+ },
+
+ //点击刷新
+ handelRefresh: Debounce(function () {
+ this.fetchWithdrawal2({ page: 1, limit: 300, status: 2 })
+ this.fetchWithdrawal0({ page: 1, limit: 300, status: 0 })
+ this.fetchWithdrawal1({ page: 1, limit: 300, status: 1 })
+ }, 1000),
+
+ handleClick(activeName2) {
+ this.params.address = ""
+ // 将activeName添加到浏览器的历史记录中
+ let activeName = activeName2.name
+ sessionStorage.setItem(`WithdrawalActiveName`,activeName)
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/backendWithdrawal/index.vue b/yq/src/views/backendWithdrawal/index.vue
new file mode 100644
index 0000000..da74ed6
--- /dev/null
+++ b/yq/src/views/backendWithdrawal/index.vue
@@ -0,0 +1,860 @@
+
+
+
+
+
+
+ {{ $t(`login.backendWithdrawal`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ handelTime(scope.row.appliedTime) }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`pay.confirm`) }}
+ {{ $t(`pay.refuse`) }}
+
+
+ {{ $t(`help.details`) }}
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`pay.refundAmount`) }}
+
+
+
+
+
+ * {{ $t(`pay.refundTxid`) }}
+
+
+
+
+
+
+ * {{ $t(`pay.refundAddress`) }}
+
+
+
+
+ {{ $t(`pay.Remarks`) }}
+
+
+
+
+
+
+
+
+
+ * {{ $t(`pay.Remarks`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ handelTime(scope.row.appliedTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`help.details`) }}
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`pay.refundAmount`) }}
+
+
+
+
+
+ * {{ $t(`pay.refundTxid`) }}
+
+
+
+
+
+
+ * {{ $t(`pay.refundAddress`) }}
+
+
+
+
+ {{ $t(`pay.Remarks`) }}
+
+
+
+
+
+
+
+
+
+ * {{ $t(`pay.Remarks`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ handelTime(scope.row.appliedTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`help.details`) }}
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`pay.refundAmount`) }}
+
+
+
+
+
+ * {{ $t(`pay.refundTxid`) }}
+
+
+
+
+
+
+ * {{ $t(`pay.refundAddress`) }}
+
+
+
+
+ {{ $t(`pay.Remarks`) }}
+
+
+
+
+
+
+
+
+
+ * {{ $t(`pay.Remarks`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/backgroundAddress/index.js b/yq/src/views/backgroundAddress/index.js
new file mode 100644
index 0000000..6892ffe
--- /dev/null
+++ b/yq/src/views/backgroundAddress/index.js
@@ -0,0 +1,86 @@
+import * as echarts from "echarts";
+import { AddNewAddress } from "../../api/pay"
+export default {
+ data() {
+ return {
+ activeName: "second",
+ labelPosition: 'top',
+ params: {
+ addresses: []
+ },
+ dialogVisible: false,
+ inputText: "",
+ num: "",
+ AddLoading:false,
+ address:""
+ }
+ },
+ mounted() {
+
+
+ },
+ methods: {
+ //请求新增用户可用地址
+ async fetchAddNewAddress(params) {
+ this.AddLoading = true
+ const { data } = await AddNewAddress(params)
+ console.log(data,"54545");
+ if (data.code === 200) {//提现成功
+ this.$message({
+ type: 'success',
+ message: data.msg,
+ duration: 3000,
+ showClose: true,
+ });
+
+ this.dialogVisible =false
+ this.params.addresses=[]
+ this.address=""
+ }
+
+ this.AddLoading = false
+ },
+
+
+
+
+ handelValue() {
+ // let num = document.getElementById('lines').value
+ // console.log(num.split("\n"), "看i哦分积分");
+ },
+ handelAddress() {
+
+ this.params.addresses = this.address.split("\n")
+
+ this.params.addresses = this.params.addresses.filter(item => item !== null && item !== undefined && item !== "");
+ this.num = this.params.addresses.length
+
+ if (!this.num) {
+
+ this.$message({
+ type: 'error',
+ message:this.$t(`pay.empty`),
+ duration: 5000,
+ showClose: true,
+ });
+
+
+ return
+ }
+
+
+ this.dialogVisible = true
+ },
+ //确认新增 发起请求
+ handelConfirm(){
+
+ this.fetchAddNewAddress(this.params)
+ }
+
+
+
+
+
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/backgroundAddress/index.vue b/yq/src/views/backgroundAddress/index.vue
new file mode 100644
index 0000000..7d3ca5c
--- /dev/null
+++ b/yq/src/views/backgroundAddress/index.vue
@@ -0,0 +1,164 @@
+
+
+
+
+
+ {{ $t(`pay.receivingAddress`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`pay.remind`) }}
+
+ {{$t(`pay.submit`) }}
+
+
+
+
+
+
+ {{$t(`pay.confirmAddition`) }} {{num}} {{$t(`pay.confirmAddition2`) }} ?
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/balanceData/index.js b/yq/src/views/balanceData/index.js
new file mode 100644
index 0000000..440b1fa
--- /dev/null
+++ b/yq/src/views/balanceData/index.js
@@ -0,0 +1,552 @@
+import * as echarts from "echarts";
+import { handelWatermark, chartsWidth ,emptyData} from "../../util/processingData"
+export default {
+ data() {
+ return {
+ //柱状图配置
+ columnar: {
+
+ },
+ //饼图配置
+ pieChart: {
+ // title: {
+ // text: '同名数量统计',
+ // subtext: '纯属虚构',
+ // left: 'center'
+ // },
+ tooltip: {
+ trigger: 'item',
+ // formatter: '{a} {b} : {c} ({d}%)'
+ },
+ legend: {
+ type: 'scroll',
+ orient: 'vertical',
+ right: 150,
+ // top: 20,
+ // bottom: 20,
+ // data: []
+ },
+ series: [
+ {
+ // name: '姓名',
+ type: 'pie',
+ radius: '55%',
+ center: ['40%', '50%'],
+ data: [],
+ emphasis: {
+ itemStyle: {
+ shadowBlur: 10,
+ shadowOffsetX: 0,
+ shadowColor: 'rgba(0, 0, 0, 0.5)'
+ }
+ }
+ }
+ ]
+ },
+
+ params: {
+ req: "getDayBalanceData",
+ radius: "btc",
+ value: "",
+ },
+ //折线图
+ option: {
+ tooltip: {
+ trigger: "axis",
+ position: function (pt) {
+ return [pt[0], "10%"];
+ },
+ // formatter:(value)=>{
+ // console.log(value,"交多少就覅");
+ // }
+
+ },
+ legend: {
+ right: "100",
+ // data:[`sopr`,'asopr','easopr','lthsopr','sthsopr',],
+ // selected:{
+ // 'asopr': false,
+ // 'easopr': false,
+ // 'lthsopr': false,
+ // 'sthsopr': false,
+ // }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//万
+ value = `${e / 10000}W`;
+ } else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right",
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ position: "right",
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "MVRV",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ markLine: {
+ symbol: ["none", "none"], //去掉箭头
+ itemStyle: {
+ normal: {
+ lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ },
+ },
+ // lineStyle:{
+ // color:"red"
+ // },
+
+ label: {
+ formatter: "{b}",
+ fontSize: 10,
+ color: "rgba(0,0,0,0.8)",
+ align: "left",
+ },
+ data: [
+ // {
+ // name: "0",
+ // yAxis: 0,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+ {
+ name: "$70W",
+ yAxis: 700000,
+ },
+ {
+ name: "$40W",
+ yAxis: 400000,
+ },
+
+ {
+ name: "$10W",
+ yAxis: 100000,
+ },
+ {
+ name: "$100W",
+ yAxis: 1000000,
+ // position: ['100%', '50'],
+ },
+ {
+ name: "$120W",
+ yAxis: 1200000,
+ },
+
+ {
+ name: "$140W",
+ yAxis: 1400000,
+ },
+ ],
+ },
+ },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 2,
+ data: [],
+ },
+
+
+ ],
+ },
+ paramsTime: {
+ start: "",
+ end: ""
+ },
+ balanceData: [],
+ balanceLoading: false,
+ introduce: "",//接口介绍
+ timeFlag: "",//时间变化的时候才发起请求
+ value1: "",
+ DateTime: "",
+ pickerOptions: {
+ disabledDate: (time) => {
+ return time.getTime() > new Date(this.DateTime).getTime()
+ },
+ },
+
+
+ }
+ },
+ created() {
+ this.onOption();
+ },
+ mounted() {
+
+ this.$addStorageEvent(1, "buttonShow", false);
+ let menuObj = localStorage.getItem("params");
+ this.params.req = JSON.parse(menuObj).componentReq;
+ this.introduce = JSON.parse(menuObj).introduce;
+ this.params.value = JSON.parse(menuObj).parameter;
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ //监听localstorage变化
+ window.addEventListener("setItem", () => {
+ let menuObj = localStorage.getItem("params");
+ this.params.req = JSON.parse(menuObj).componentReq;
+ this.introduce = JSON.parse(menuObj).introduce;
+ this.params.value = JSON.parse(menuObj).parameter;
+ });
+ },
+ watch: {
+
+ params: {
+ handler(val) {
+
+ if (val.req == "getDayBalanceData" || val.req == "getDayBalanceAmountData") {
+
+
+ this.fetchBalanceData(this.params.req, this.params.radius, val.value)
+
+
+ this.value1 = ""
+ } else {
+ return
+ }
+ },
+ deep: true
+
+ },
+ //监听时间变化发起请求
+ timeFlag: {
+ handler(time) {
+ if (this.params.req == "getDayBalanceData" || this.params.req == "getDayBalanceAmountData") {
+ this.fetchBalanceData(this.params.req, this.params.radius, this.params.value, this.paramsTime.start, this.paramsTime.end)
+ this.paramsTime.start = ""
+ this.paramsTime.end = ""
+ }
+ },
+ deep: true
+
+ }
+ },
+ methods: {
+ //初始化柱状图图表
+ inCharts() {
+ this.myChart = echarts.init(document.getElementById("balanceData"));
+ this.myChart.setOption(this.columnar);
+ chartsWidth("balanceData", this);
+ },
+ //初始化饼图
+ inChartsPieChart() {
+ this.myChart = echarts.init(document.getElementById("balanceDataPieChart"));
+
+ this.myChart.setOption(this.pieChart);
+ chartsWidth("balanceDataPieChart", this);
+ },
+ async fetchBalanceData(req, radius, value, start, end) {
+ this.balanceLoading = true
+ const { data } = await this.$API.getBalanceData(req, radius, value, start, end)
+
+ this.balanceData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.columnar.series, this.inCharts, this)
+ if (noData) {
+ this.balanceLoading = false
+ emptyData(data.data, this.pieChart.series, this.inChartsPieChart, this)
+ return
+ }
+ this.columnar.xAxis.data.length = 0
+ this.columnar.series[0].data.length = 0
+ //添加水印
+ this.columnar = handelWatermark(this.columnar)
+
+ //更新数据后渲染
+
+
+ let arr = Object.entries(this.balanceData[0])
+
+ arr.forEach(item => {
+ if (item[0] == "id" || item[0] == "dateTime") {
+ if (item[0] == "dateTime") {
+
+ this.DateTime = item[1].split(" ")[0]
+ this.columnar.title.text = `${this.DateTime}`
+ }
+ return
+
+ } else {
+
+ let days = item[0].split("y")[1]
+ if (days >= 365) {
+
+
+ this.columnar.xAxis.data.push(`${(days / 365).toFixed(0)}years`)
+ } else {
+
+ this.columnar.xAxis.data.push(`${days}days`)
+ }
+
+ this.columnar.series[0].data.push(Number(item[1]).toFixed(2))
+ }
+ })
+
+ this.inCharts()
+ this.balanceLoading = false
+ },
+ onOption() {
+ let that = this
+ this.columnar = {
+ animation: false,
+ title: {
+ text: "",
+ left: "center",
+ textStyle: {
+ fontSize: 15,
+ fontWeight: "normal"
+ },
+ },
+ grid: {
+ right: 80,
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ axisPointer: {
+ type: "cross",
+ crossStyle: {
+ color: "#999",
+ },
+ },
+ },
+ xAxis: {
+ // type:"category",
+ splitLine: {
+ color: "rgba(0,0,0,0.1)"
+ },
+ // axisLabel: {
+ // formatter: function (a) {
+ // let value
+ // if (a>=10000) {
+ // value = `${a / 1000}k`
+ // }else{
+ // value =a
+ // }
+
+ // return value
+ // }
+ // },
+ data: [],
+ //最大值和最小值显示
+ // showMinLabel: true,
+ // showMaxLabel: true
+
+ },
+ yAxis: {
+ name: this.$t(`home.figure`),
+ // type: "log",
+ position: "left",
+ //坐标两边留白
+
+ //网格线设置
+ // splitLine: {
+ // color: "rgba(0,0,0,0.1)",
+ // },
+
+ axisLabel: {
+ // interval:0
+ // formatter: function (value) {
+ // let label
+ // label = value / 1000000
+
+ // return `${label}M`
+ // },
+ },
+ axisLine: {
+ onZero: false
+ }
+ },
+ dataZoom: [
+ {
+ show: true,
+ type: 'inside',
+ // minSpan: 10,
+ start: 1,
+ end: 100
+ },
+ {
+ show: true,
+ type: 'inside',
+ // filterMode: 'none',
+ // minSpan: 0.1,
+ // maxSpan: 99,
+ // yAxisIndex: [0],
+ // startValue: -20,
+ // endValue: 20
+ }
+ ],
+ series: [
+ {
+ type: 'bar',
+ showSymbol: false,
+ // clip: true,
+ data: [],
+ itemStyle: {
+ color: "#fdaa56",
+ },
+ }
+ ]
+ }
+ },
+ //替换对象的key
+ objKeyReplace(obj) {
+ let time = obj.dateTime.split(" ")[0]
+ let keyMap = {
+ "dateTime": "dateTime",
+ "day0": `${time}_0`,
+ "day1": `${time}_1`,
+ "day2": `${time}_2`,
+ "day3": `${time}_3`,
+ "day4": `${time}_4`,
+ "day5": `${time}_5`,
+ "day6": `${time}_6`,
+ "day7": `${time}_7`,
+ "day15": `${time}_15`,
+ "day30": `${time}_30`,
+ "day60": `${time}_60`,
+ "day90": `${time}_90`,
+ "day180": `${time}_180`,
+ "day360": `${time}_360`,
+ "day540": `${time}_540`,
+ "day720": `${time}_720`,
+ "day1080": `${time}_1080`,
+ "day1440": `${time}_1440`,
+ "day1880": `${time}_1880`,
+ "day2160": `${time}_2160`,
+ "day2520": `${time}_2520`,
+ "day2880": `${time}_2880`,
+ "day3240": `${time}_3240`,
+ "day3600": `${time}_3600`,
+ "day3960": `${time}_3960`,
+ }
+ for (const key in obj) {
+ let newKey = keyMap[key]
+ if (newKey) {
+ obj[newKey] = obj[key]
+ delete obj[key]
+ }
+ }
+ return obj
+ },
+ handelSonTime(start, end) {
+ this.paramsTime.start = start;
+ this.paramsTime.end = end;
+ this.timeFlag = start
+ },
+ //时间选择
+ handeldate() {
+
+ this.fetchBalanceData(this.params.req, this.params.radius, this.params.value, this.value1)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/balanceData/index.vue b/yq/src/views/balanceData/index.vue
new file mode 100644
index 0000000..0838411
--- /dev/null
+++ b/yq/src/views/balanceData/index.vue
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/balancedPrice/index.js b/yq/src/views/balancedPrice/index.js
new file mode 100644
index 0000000..0083f0d
--- /dev/null
+++ b/yq/src/views/balancedPrice/index.js
@@ -0,0 +1,326 @@
+import * as echarts from "echarts";
+import { fetchBalancedPrice } from "../../api/apiPost"
+import { chartsWidth, emptyData,dataLength,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ balancedPriceLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Balanced Price",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 0,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ this.fetchBalancedPrice(this.params.req, this.params.radius)
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("balancedPriceBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("balancedPriceBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchBalancedPrice(params) {
+ this.balancedPriceLoading = true
+ const { data } = await fetchBalancedPrice(params)
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.balancedPriceLoading = false
+ return
+ }
+ let balancedPriceData = data.data
+ this.start = balancedPriceData[0].date.split("T")[0]
+ this.end = balancedPriceData[balancedPriceData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ let profitValueList = []
+
+
+ balancedPriceData.forEach(item => {
+
+ profitValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(balancedPriceData, profitValueList)
+
+
+
+ this.inCharts()
+ this.balancedPriceLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchBalancedPrice(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/balancedPrice/index.vue b/yq/src/views/balancedPrice/index.vue
new file mode 100644
index 0000000..4924deb
--- /dev/null
+++ b/yq/src/views/balancedPrice/index.vue
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+
+ BalancedPriceUSD = RealisedPriceUSD 一 TransferredPriceUSD
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/bigDeals.vue b/yq/src/views/bigDeals.vue
new file mode 100644
index 0000000..4c66cd3
--- /dev/null
+++ b/yq/src/views/bigDeals.vue
@@ -0,0 +1,1585 @@
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`home.tradingVolume`) }}:{{ notice || 0 }}
+
+
+ {{ $t(`home.tradingHours`) }}:{{ amountTime || 0 }}
+ {{
+ $t(`home.checkDetails`)
+ }}
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+ {{ $t(`home.date`) }}: {{ dialogDate }}
+
+
+ {{ $t(`home.number`) }}:
+ {{ dialogData.amount }}
+
+
+ {{ $t(`home.address`) }}:
+ {{
+ (dialogData.vout = dialogData.vout
+ ? dialogData.vout
+ : $t(`home.no`))
+ }}
+
+
+
+ {{ $t(`home.height`) }}:
+ {{ dialogData.height }}
+
+
+
+ {{ $t(`home.transaction`) }}:
+ {{ dialogData.txId }}
+
+
+
+
+
+
+
+
+ {{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
+
+
+
{{ $t(`home.bigTable`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`home.table`) }}
+
+
+
+
+
+
+
+ {{ formatTime(scope.row.date) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatTime(scope.row.date) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`home.shutDown`) }} X
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/blockamount.vue b/yq/src/views/blockamount.vue
new file mode 100644
index 0000000..fa88753
--- /dev/null
+++ b/yq/src/views/blockamount.vue
@@ -0,0 +1,295 @@
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/bobp/index.js b/yq/src/views/bobp/index.js
new file mode 100644
index 0000000..204530d
--- /dev/null
+++ b/yq/src/views/bobp/index.js
@@ -0,0 +1,259 @@
+import * as echarts from "echarts";
+import { getBobp } from "../../api/apiPost"
+import { chartsWidth, emptyData, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ bobpLoading: false,
+ option: {
+ color: ['#5470c6', '#91cc75', '#73c0de', '#fac858', '#e87e82', `#9a60b4`, `#a80000`, `#191a46`, `#2d993b`,`#fe0000`],
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'shadow'
+ }
+ },
+ legend: {
+ right: 100,
+ },
+ graphic: [],//水印
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ xAxis: [
+ {
+ type: 'category',
+ // data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+ data: []
+ }
+ ],
+ yAxis: [
+ {
+ type: 'value'
+ }
+ ],
+ series: [
+ // {
+ // name: "1",
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // // data: [120, 132, 101, 134, 90, 230, 210]
+ // data:[]
+ // },
+ // {
+ // name: '2',
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // // data: [220, 182, 191, 234, 290, 330, 310]
+ // data:[]
+ // },
+ // {
+ // name: '3',
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // // data: [150, 232, 201, 154, 190, 330, 410]
+ // data:[]
+ // },
+ // {
+ // name: '4',
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // // data: [150, 232, 201, 154, 190, 330, 410]
+ // data:[]
+ // },
+ // {
+ // name: '5',
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+
+ // data:[]
+ // },
+ // {
+ // name: '6',
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // data:[]
+ // },
+
+ ]
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ coin: "BTC"
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+
+
+ this.fetchBobp(this.params)
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("bobpBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("bobpBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchBobp(params) {
+
+ this.bobpLoading = true
+ const { data } = await getBobp(params)
+ let bobpData = data.data.list
+ //空数据处理
+ let noData = emptyData(bobpData, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.bobpLoading = false
+ return
+ }
+
+
+ let seriesNum = bobpData[0].value.length
+
+ //动态添加series个数
+ if (this.option.series.length == 0) {
+ for (let i = 0; i < seriesNum; i++) {
+ this.option.series.push({
+ name: "",
+ type: 'bar',
+ stack: 'Ad',
+ emphasis: {
+ focus: 'series'
+ },
+ data: []
+ },)
+
+ }
+ }
+ // 清空 xAxis.data 和 series 中各个元素的 data 属性
+ this.option.xAxis[0].data = [];
+ for (let i = 0; i < this.option.series.length; i++) {
+ this.option.series[i].data = [];
+ }
+
+ bobpData.forEach((item, index) => {
+ item.date = `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ this.option.xAxis[0].data.push(item.date)
+
+ for (let i = 0; i < this.option.series.length; i++) {
+ if (!item.value[i]) {
+ this.option.series[i].data.push(Number(0));
+ } else {
+ this.option.series[i].data.push(
+ Number(Number(item.value[i].num).toFixed(2))
+ );
+ this.option.series[i].name = item.value[i].price;
+ }
+ }
+ });
+
+
+ // // //添加水印
+ this.option = handelWatermark(this.option)
+
+
+
+ this.inCharts()
+
+ this.bobpLoading = false
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchBobp(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchBobp(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ handelZone() {
+ this.fetchBobp(this.params)
+ },
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/bobp/index.vue b/yq/src/views/bobp/index.vue
new file mode 100644
index 0000000..87183c1
--- /dev/null
+++ b/yq/src/views/bobp/index.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/bobpEth/index.js b/yq/src/views/bobpEth/index.js
new file mode 100644
index 0000000..81673ac
--- /dev/null
+++ b/yq/src/views/bobpEth/index.js
@@ -0,0 +1,269 @@
+import * as echarts from "echarts";
+import { getBobp } from "../../api/apiPost"
+import { chartsWidth, emptyData, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ bobpEthLoading: false,
+ option: {
+ color: ['#5470c6', '#91cc75', '#73c0de', '#fac858', '#e87e82', `#9a60b4`, `#a80000`, `#191a46`, `#2d993b`],
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'shadow'
+ }
+ },
+ legend: {
+ right: 100,
+ },
+ graphic: [],//水印
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ xAxis: [
+ {
+ type: 'category',
+ // data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+ data: []
+ }
+ ],
+ yAxis: [
+ {
+ type: 'value'
+ }
+ ],
+ series: [
+ // {
+ // name: "1",
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // // data: [120, 132, 101, 134, 90, 230, 210]
+ // data:[]
+ // },
+ // {
+ // name: '2',
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // // data: [220, 182, 191, 234, 290, 330, 310]
+ // data:[]
+ // },
+ // {
+ // name: '3',
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // // data: [150, 232, 201, 154, 190, 330, 410]
+ // data:[]
+ // },
+ // {
+ // name: '4',
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // // data: [150, 232, 201, 154, 190, 330, 410]
+ // data:[]
+ // },
+ // {
+ // name: '5',
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+
+ // data:[]
+ // },
+ // {
+ // name: '6',
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // data:[]
+ // },
+
+ ]
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ coin: "ETH"
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+
+
+ this.fetchBobpEth(this.params)
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("bobpEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("bobpEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchBobpEth(params) {
+
+ this.bobpEthLoading = true
+ const { data } = await getBobp(params)
+ let bobpEthData = data.data.list
+
+ // if (!bobpEthData[0]) {
+ // this.$message({
+ // type: 'warning',
+ // message: this.$t(`home.NoData`)
+ // });
+ // this.inCharts()
+ // this.bobpEthLoading = false
+ // return
+ // }
+ //空数据处理
+ let noData = emptyData(bobpEthData, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.bobpEthLoading = false
+ return
+ }
+
+
+ let seriesNum = bobpEthData[0].value.length
+
+ //动态添加series个数
+ if (this.option.series.length == 0) {
+ for (let i = 0; i < seriesNum; i++) {
+ this.option.series.push({
+ name: "",
+ type: 'bar',
+ stack: 'Ad',
+ emphasis: {
+ focus: 'series'
+ },
+ data: []
+ },)
+
+ }
+ }
+ // 清空 xAxis.data 和 series 中各个元素的 data 属性
+ this.option.xAxis[0].data = [];
+ for (let i = 0; i < this.option.series.length; i++) {
+ this.option.series[i].data = [];
+ }
+
+ bobpEthData.forEach((item, index) => {
+ item.date = `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ this.option.xAxis[0].data.push(item.date)
+ for (let i = 0; i < this.option.series.length; i++) {
+ if (!item.value[i]) {
+ this.option.series[i].data.push(Number(0));
+ } else {
+ this.option.series[i].data.push(
+ Number(Number(item.value[i].num).toFixed(2))
+ );
+ this.option.series[i].name = item.value[i].price;
+ }
+ }
+ });
+
+
+
+ //添加水印
+ this.option = handelWatermark(this.option)
+
+
+
+ this.inCharts()
+
+ this.bobpEthLoading = false
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchBobpEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchBobpEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ handelZone() {
+ this.fetchBobpEth(this.params)
+ },
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/bobpEth/index.vue b/yq/src/views/bobpEth/index.vue
new file mode 100644
index 0000000..4780892
--- /dev/null
+++ b/yq/src/views/bobpEth/index.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/bosp/index.js b/yq/src/views/bosp/index.js
new file mode 100644
index 0000000..5651994
--- /dev/null
+++ b/yq/src/views/bosp/index.js
@@ -0,0 +1,260 @@
+import * as echarts from "echarts";
+import { getBosp } from "../../api/apiPost"
+import { chartsWidth, emptyData, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ bospLoading: false,
+ option: {
+ color: ['#5470c6', '#00ff01', '#73c0de', '#fac858', '#e87e82', `#9a60b4`, `#a80000`, `#3397f9`, `#2d993b`,`#640063`,`#fe0000`],
+
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'shadow'
+ }
+ },
+ legend: {
+ right: 100,
+ },
+ graphic: [],//水印
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ xAxis: [
+ {
+ type: 'category',
+ // data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+ data: []
+ }
+ ],
+ yAxis: [
+ {
+ type: 'value'
+ }
+ ],
+ series: [
+ // {
+ // name: "1",
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // // data: [120, 132, 101, 134, 90, 230, 210]
+ // data:[]
+ // },
+ // {
+ // name: '2',
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // // data: [220, 182, 191, 234, 290, 330, 310]
+ // data:[]
+ // },
+ // {
+ // name: '3',
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // // data: [150, 232, 201, 154, 190, 330, 410]
+ // data:[]
+ // },
+ // {
+ // name: '4',
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // // data: [150, 232, 201, 154, 190, 330, 410]
+ // data:[]
+ // },
+ // {
+ // name: '5',
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+
+ // data:[]
+ // },
+ // {
+ // name: '6',
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // data:[]
+ // },
+
+ ]
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ coin: "BTC"
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+
+
+ this.fetchBosp(this.params)
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("bospBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("bospBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchBosp(params) {
+
+ this.bospLoading = true
+ const { data } = await getBosp(params)
+ let bospData = data.data.list
+ //空数据处理
+ let noData = emptyData(bospData, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.bospLoading = false
+ return
+ }
+
+
+ let seriesNum = bospData[0].value.length
+
+ //动态添加series个数
+ if (this.option.series.length == 0) {
+ for (let i = 0; i < seriesNum; i++) {
+ this.option.series.push({
+ name: "",
+ type: 'bar',
+ stack: 'Ad',
+ emphasis: {
+ focus: 'series'
+ },
+ data: []
+ },)
+
+ }
+ }
+ // 清空 xAxis.data 和 series 中各个元素的 data 属性
+ this.option.xAxis[0].data = [];
+ for (let i = 0; i < this.option.series.length; i++) {
+ this.option.series[i].data = [];
+ }
+
+ bospData.forEach((item, index) => {
+ item.date = `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ this.option.xAxis[0].data.push(item.date)
+
+ for (let i = 0; i < this.option.series.length; i++) {
+ if (!item.value[i]) {
+ this.option.series[i].data.push(Number(0));
+ } else {
+ this.option.series[i].data.push(
+ Number(Number(item.value[i].num).toFixed(2))
+ );
+ this.option.series[i].name = item.value[i].price;
+ }
+ }
+ });
+
+
+ // // //添加水印
+ this.option = handelWatermark(this.option)
+
+
+
+ this.inCharts()
+
+ this.bospLoading = false
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchBosp(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchBosp(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ handelZone() {
+ this.fetchBosp(this.params)
+ },
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/bosp/index.vue b/yq/src/views/bosp/index.vue
new file mode 100644
index 0000000..d30609a
--- /dev/null
+++ b/yq/src/views/bosp/index.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/bospEth/index.js b/yq/src/views/bospEth/index.js
new file mode 100644
index 0000000..6102469
--- /dev/null
+++ b/yq/src/views/bospEth/index.js
@@ -0,0 +1,269 @@
+import * as echarts from "echarts";
+import { getBosp } from "../../api/apiPost"
+import { chartsWidth, emptyData, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ bospEthLoading: false,
+ option: {
+ color: ['#5470c6', '#91cc75', '#73c0de', '#fac858', '#e87e82', `#9a60b4`, `#a80000`, `#191a46`, `#2d993b`],
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'shadow'
+ }
+ },
+ legend: {
+ right: 100,
+ },
+ graphic: [],//水印
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ xAxis: [
+ {
+ type: 'category',
+ // data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+ data: []
+ }
+ ],
+ yAxis: [
+ {
+ type: 'value'
+ }
+ ],
+ series: [
+ // {
+ // name: "1",
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // // data: [120, 132, 101, 134, 90, 230, 210]
+ // data:[]
+ // },
+ // {
+ // name: '2',
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // // data: [220, 182, 191, 234, 290, 330, 310]
+ // data:[]
+ // },
+ // {
+ // name: '3',
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // // data: [150, 232, 201, 154, 190, 330, 410]
+ // data:[]
+ // },
+ // {
+ // name: '4',
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // // data: [150, 232, 201, 154, 190, 330, 410]
+ // data:[]
+ // },
+ // {
+ // name: '5',
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+
+ // data:[]
+ // },
+ // {
+ // name: '6',
+ // type: 'bar',
+ // stack: 'Ad',
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // data:[]
+ // },
+
+ ]
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ coin: "ETH"
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+
+
+ this.fetchBospEth(this.params)
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("bospEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("bospEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchBospEth(params) {
+
+ this.bospEthLoading = true
+ const { data } = await getBosp(params)
+ let bospEthData = data.data.list
+
+ // if (!bospEthData[0]) {
+ // this.$message({
+ // type: 'warning',
+ // message: this.$t(`home.NoData`)
+ // });
+ // this.inCharts()
+ // this.bospEthLoading = false
+ // return
+ // }
+
+
+ //空数据处理
+ let noData = emptyData(bospEthData, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.bospEthLoading = false
+ return
+ }
+ let seriesNum = bospEthData[0].value.length
+
+ //动态添加series个数
+ if (this.option.series.length == 0) {
+ for (let i = 0; i < seriesNum; i++) {
+ this.option.series.push({
+ name: "",
+ type: 'bar',
+ stack: 'Ad',
+ emphasis: {
+ focus: 'series'
+ },
+ data: []
+ },)
+
+ }
+ }
+ // 清空 xAxis.data 和 series 中各个元素的 data 属性
+ this.option.xAxis[0].data = [];
+ for (let i = 0; i < this.option.series.length; i++) {
+ this.option.series[i].data = [];
+ }
+
+ bospEthData.forEach((item, index) => {
+ item.date = `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ this.option.xAxis[0].data.push(item.date)
+ for (let i = 0; i < this.option.series.length; i++) {
+ if (!item.value[i]) {
+ this.option.series[i].data.push(Number(0));
+ } else {
+ this.option.series[i].data.push(
+ Number(Number(item.value[i].num).toFixed(2))
+ );
+ this.option.series[i].name = item.value[i].price;
+ }
+ }
+ });
+
+
+
+ //添加水印
+ this.option = handelWatermark(this.option)
+
+
+
+ this.inCharts()
+
+ this.bospEthLoading = false
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchBospEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchBospEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ handelZone() {
+ this.fetchBospEth(this.params)
+ },
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/bospEth/index.vue b/yq/src/views/bospEth/index.vue
new file mode 100644
index 0000000..fd657cf
--- /dev/null
+++ b/yq/src/views/bospEth/index.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/btctags/index.js b/yq/src/views/btctags/index.js
new file mode 100644
index 0000000..5db660b
--- /dev/null
+++ b/yq/src/views/btctags/index.js
@@ -0,0 +1,74 @@
+import { TimeSelect } from "element-ui"
+
+export default {
+ data() {
+ return {
+ tableData: [],
+ btctagsLoding: false,
+ totalPage: 0,
+ currentPage4: 1,//当前页数
+ params: {
+ req: "",
+ page: 1,
+ limit: 50
+ },
+ radius:"btc"
+
+ }
+ },
+ watch:{
+ radius(val){
+ if (val=="BTC") {
+ this.params.req="btcTags"
+
+ }else if (val=="ETH") {
+ this.params.req="ethTags"
+ }
+ let radius = val.toLowerCase()
+
+ this.fetchTabelData(this.params.req, radius, this.params.page, this.params.limit)
+ }
+ },
+ mounted() {
+ //不显示时间框
+ this.$addStorageEvent(1, "timeShow", false);
+ let menuObj = localStorage.getItem("params");
+ this.params.req = JSON.parse(menuObj).componentReq;
+ this.radius = localStorage.getItem("radius");
+
+ //监听localstorage变化
+ window.addEventListener("setItem", () => {
+ let menuObj = localStorage.getItem("params");
+ this.params.req = JSON.parse(menuObj).componentReq;
+ this.radius = localStorage.getItem("radius");
+ // this.introduce = JSON.parse(menuObj).introduce;
+ });
+ // this.fetchTabelData(this.params.req, this.radius, this.params.page, this.params.limit)
+ },
+ methods: {
+ async fetchTabelData(req, radius, page,limit) {
+
+ this.btctagsLoding = true
+ this.currentPage4 = page
+ const { data } = await this.$API.getBtctags(req, radius, page,limit);
+ this.tableData = data.data.data
+ this.totalPage = data.data.totalPage
+
+ this.btctagsLoding = false
+ },
+ //点击的改变页数
+ handleCurrentChange(value) {
+ this.params.page = value
+ this.fetchTabelData(this.params.req, this.radius, this.params.page, this.params.limit)
+ this.params.page = 1
+ this.currentPage4 = this.params.page
+ },
+ //改变每页条数
+ handleSizeChange(val) {
+ this.params.limit = val
+ this.fetchTabelData(this.params.req, this.radius, this.params.page,val)
+ // this.params.limit = 50
+
+ },
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/btctags/index.vue b/yq/src/views/btctags/index.vue
new file mode 100644
index 0000000..c9ef2ed
--- /dev/null
+++ b/yq/src/views/btctags/index.vue
@@ -0,0 +1,260 @@
+
+
+
+
+
{{$t(`home.relationship`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/burnedSupplyEth/index.js b/yq/src/views/burnedSupplyEth/index.js
new file mode 100644
index 0000000..3c62398
--- /dev/null
+++ b/yq/src/views/burnedSupplyEth/index.js
@@ -0,0 +1,348 @@
+import * as echarts from "echarts";
+import { getBurnedSupplyEth, } from "../../api/pages"
+import { chartsWidth,emptyData, dataLength,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ burnedSupplyEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}% `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Burned Supply",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchburnedSupplyEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("burnedSupplyEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("burnedSupplyEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchburnedSupplyEth(params) {
+ this.burnedSupplyEthLoading = true
+ const { data } = await getBurnedSupplyEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.burnedSupplyEthLoading = false
+ return
+ }
+ let burnedSupplyEthData = data.data
+ this.start = burnedSupplyEthData[0].date.split("T")[0]
+ this.end = burnedSupplyEthData[burnedSupplyEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ burnedSupplyEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(burnedSupplyEthData, ValueList)
+
+ this.inCharts()
+
+ this.burnedSupplyEthLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchburnedSupplyEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchburnedSupplyEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/burnedSupplyEth/index.vue b/yq/src/views/burnedSupplyEth/index.vue
new file mode 100644
index 0000000..83f3258
--- /dev/null
+++ b/yq/src/views/burnedSupplyEth/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/capReal/index.js b/yq/src/views/capReal/index.js
new file mode 100644
index 0000000..31d9b2b
--- /dev/null
+++ b/yq/src/views/capReal/index.js
@@ -0,0 +1,315 @@
+import * as echarts from "echarts";
+import { handelLineType,handelSwitchs } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ capRealLoading: false,
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ // console.log(params,565612);
+ var res = params[0].axisValueLabel;
+
+ res += `${params[0].marker} ${params[0].seriesName} \u00A0\u00A0\u00A0\u00A0 ${( params[0].value/100000000).toFixed(2)} 亿`
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ },
+ yAxis: [
+ {
+ position: "left",
+ type: "value",
+ min: `dataMin`,
+ max: `dataMax`,
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${value / 100000000} E`
+ }
+ }
+ },
+ {
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "capReal",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price [USD]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ markLine: {
+ symbol: ["none", "none"], //去掉箭头
+ itemStyle: {
+ normal: {
+ lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ },
+ },
+ // lineStyle:{
+ // opacity:0
+ // },
+ label: {
+ formatter: "{b}",
+ fontSize: 10,
+ color: "rgba(0,0,0,0.8)",
+ align: "left",
+ },
+ data: [
+ // {
+ // name: "$0.40",
+ // yAxis: 0.4,
+ // },
+ // {
+ // name: "$0.80",
+ // yAxis: 0.8,
+ // },
+ // {
+ // name: "$2",
+ // yAxis: 2,
+ // },
+ // {
+ // name: "$6",
+ // yAxis: 6,
+ // },
+ // {
+ // name: "$10",
+ // yAxis: 10,
+ // },
+ // {
+ // name: "$40",
+ // yAxis: 40,
+ // },
+ // {
+ // name: "$80",
+ // yAxis: 80,
+ // },
+ // {
+ // name: "$200",
+ // yAxis: 200,
+ // },
+ // {
+ // name: "$600",
+ // yAxis: 600,
+ // },
+ {
+ name: "$0K",
+ yAxis: 0,
+ },
+ {
+ name: "$5K",
+ yAxis: 5000,
+ },
+ {
+ name: "$10K",
+ yAxis: 10000,
+ },
+ {
+ name: "$15K",
+ yAxis: 15000,
+ },
+ {
+ name: "$20K",
+ yAxis: 20000,
+ },
+ {
+ name: "$25K",
+ yAxis: 25000,
+ },
+ {
+ name: "$30K",
+ yAxis: 30000,
+ },
+ {
+ name: "$50K",
+ yAxis: 50000,
+ },
+ {
+ name: "$70K",
+ yAxis: 70000,
+ },
+ {
+ name: "$100K",
+ yAxis: 100000,
+ },
+ ],
+ },
+ },
+
+
+ ],
+ },
+ capRealData: [],
+ parmesTime: {
+ start: "",
+ end: ""
+ },
+ time: "",
+ priceTime: "",
+ switch3:""
+
+ }
+ },
+ mounted() {
+ this.fetchCapReal()
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ },
+ methods: {
+ inChart() {
+ this.myChart = echarts.init(document.getElementById("capRealChart"));
+
+ this.myChart.setOption(this.option);
+
+ window.addEventListener("resize", () => {
+ if (this.myChart)this.myChart.resize();
+ });
+ },
+
+ //请求数据渲染
+ async fetchCapReal(start, end) {
+ this.capRealLoading = true
+ const capReal = await this.$API.getCapReal(start, end);
+ const price = await this.$API.getBtcPrice(start, end);
+ this.btcPrice = price.data.data
+ this.capRealData = capReal.data.data
+
+
+ this.option.xAxis.data.length = 0
+ this.option.series[0].data.length = 0
+ this.option.series[1].data.length = 0
+ //市值数据处理
+ this.capRealData.forEach((item, index) => {
+ this.time = item.time.split("T")[0]
+ this.option.xAxis.data.push(this.time)
+ // let capReal =`${Number((item.capReal/100000000).toFixed(2))} 亿`
+ this.option.series[0].data.push(Number(item.capReal.toFixed(2)))
+ // this.option.series[0].data.push(capReal)
+ //重置时间格式 处理价格数据
+ this.btcPrice.forEach(price => {
+ this.priceTime = price.time.split("T")[0]
+ if (this.time == this.priceTime) {
+
+ this.option.series[1].data.push(Number(parseInt(price.value*100)/100))
+ }
+ })
+
+ })
+
+
+
+ this.inChart()
+
+ this.capRealLoading = false
+ },
+
+
+ //父级时间
+ handelSonTime(start, end) {
+ this.parmesTime.start = start;
+ this.parmesTime.end = end;
+ this.fetchCapReal(this.parmesTime.start, this.parmesTime.end)
+ this.parmesTime.start = ""
+ this.parmesTime.end = ""
+ },
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/capReal/index.vue b/yq/src/views/capReal/index.vue
new file mode 100644
index 0000000..f095fad
--- /dev/null
+++ b/yq/src/views/capReal/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/cddwaveEth/index.js b/yq/src/views/cddwaveEth/index.js
new file mode 100644
index 0000000..115e963
--- /dev/null
+++ b/yq/src/views/cddwaveEth/index.js
@@ -0,0 +1,745 @@
+import * as echarts from "echarts";
+import { getCddwaveEth, } from "../../api/pages"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ cddwaveEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}M `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: true,
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 80,
+ end: 100,
+ // minSpan:70
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ graphic: [//添加水印
+ {
+ type: 'group',
+ // rotation: Math.PI / 2,
+ bounding: 'raw',
+ right: "50%",
+ top: "40%",
+ // z: 10,
+ // rotation: 6,
+ children: [
+ {
+ type: 'text',
+ left: 'center',
+ top: 'center',
+
+ silent: true,//不影响鼠标事件
+
+ style: {
+ fill: `rgba(0,0,0,0.1)`,
+ text: `coinbus.cc`,
+ font: 'bold 80px sans-serif',
+
+ }
+ }
+ ]
+ }
+
+ ],
+ series: [
+ {
+ name: "cdd > 1 day and cdd <= 1 week",
+ type: "line",
+ smooth: true,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // stack: 'Total',
+ // areaStyle: {},
+ itemStyle: {
+ // color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ color: 'rgb(255, 0, 135)',
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ // color: "#f7864c",
+ width: "0",
+ color: 'rgb(255, 0, 135)',
+ },
+ data: [],
+ areaStyle: {
+ opacity: 0.8,
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 0,
+ color: 'rgb(255, 0, 135)'
+ },
+ {
+ offset: 1,
+ color: 'rgb(135, 0, 157)'
+ }
+ ])
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ },
+ {
+ name: "cdd > 1 week and cdd <= 1 month",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ // stack: 'Total',
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ // color: "#40200d",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ color: 'rgb(55, 162, 255)',
+ },
+ yAxisIndex: 1,
+ lineStyle: {
+ //线条样式
+ // color: "#40200d",
+ width: "0",
+ color: 'rgb(55, 162, 255)',
+ },
+ data: [],
+ areaStyle: {
+ opacity: 0.8,
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 0,
+ color: 'rgb(55, 162, 255)'
+ },
+ {
+ offset: 1,
+ color: 'rgb(116, 21, 219)'
+ }
+ ])
+ },
+
+ emphasis: {
+ focus: 'series'
+ },
+ },
+ {
+ name: "cdd > 1 month and cdd <= 2 months",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ // stack: 'Total',
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ // color: "#13a72c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ color: 'rgb(255, 191, 0)'
+ },
+ yAxisIndex: 2,
+ lineStyle: {
+ //线条样式
+ // color: "#13a72c",
+ width: "0",
+ color: 'rgb(255, 191, 0)'
+ },
+ data: [],
+ areaStyle: {
+ opacity: 0.8,
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 0,
+ color: 'rgb(255, 191, 0)'
+ },
+ {
+ offset: 1,
+ color: 'rgb(224, 62, 76)'
+ }
+ ])
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ },
+ {
+ name: "cdd > 2 month and cdd <= 3 months",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // stack: 'Total',
+ // areaStyle: {},
+ itemStyle: {
+ // color: "#595856",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ color: 'rgb(0, 221, 255)',
+ },
+ yAxisIndex: 3,
+ lineStyle: {
+ //线条样式
+ // color: "#595856",
+ width: "0",
+ color: 'rgb(0, 221, 255)',
+ },
+ data: [],
+ areaStyle: {
+ opacity: 0.8,
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 0,
+ color: 'rgb(0, 221, 255)'
+ },
+ {
+ offset: 1,
+ color: 'rgb(77, 119, 255)'
+ }
+ ])
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ },
+ {
+ name: "cdd > 3 month and cdd <= 6 months",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ // stack: 'Total',
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ // color: "#1d2088",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ color: 'rgb(128, 255, 165)'
+ },
+ yAxisIndex: 4,
+ lineStyle: {
+ //线条样式
+ color: "#1d2088",
+ width: "1",
+ color: 'rgb(128, 255, 165)'
+ },
+ data: [],
+ areaStyle: {
+ opacity: 0.8,
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 0,
+ color: 'rgb(128, 255, 165)'
+ },
+ {
+ offset: 1,
+ color: 'rgb(1, 191, 236)'
+ }
+ ])
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ },
+ {
+ name: "cdd > 6 months and cdd <= 1 year",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ // color: "#8618c6",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ color: '#d9315f'
+ },
+ yAxisIndex: 5,
+ lineStyle: {
+ //线条样式
+ // color: "#8618c6",
+ width: "0",
+ color: '#d9315f'
+ },
+ data: [],
+ areaStyle: {
+ opacity: 0.8,
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 0,
+ color: '#fa1e04'
+ },
+ {
+ offset: 1,
+ color: '#d9315f'
+ }
+ ])
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ },
+ {
+ name: "cdd > 1 year and cdd <= 2 year",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // stack: 'Total',
+ // areaStyle: {},
+ itemStyle: {
+ // color: "#d732a7",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ color: '#331970'
+ },
+ yAxisIndex: 6,
+ lineStyle: {
+ //线条样式
+ // color: "#d732a7",
+ width: "0",
+ color: '#331970'
+ },
+ data: [],
+ areaStyle: {
+ opacity: 0.8,
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 0,
+ color: '#331970'
+ },
+ {
+ offset: 1,
+ color: '#3273a0'
+ }
+ ])
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ },
+ {
+ name: "cdd > 2 year",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // stack: 'Total',
+ // areaStyle: {},
+ itemStyle: {
+ // color: "#d90013",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ color: '#f3c8d7'
+ },
+ yAxisIndex: 7,
+ lineStyle: {
+ //线条样式
+ // color: "#d90013",
+ width: "0",
+ color: '#f3c8d7'
+ },
+ data: [],
+ areaStyle: {
+ opacity: 0.8,
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 0,
+ color: '#f3c8d7'
+ },
+ {
+ offset: 1,
+ color: '#f2597f'
+ }
+ ])
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 8,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "2",
+ },
+ yAxisIndex: 9,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchcddwaveEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("cddwaveEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("cddwaveEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchcddwaveEth(params) {
+ this.cddwaveEthLoading = true
+ const { data } = await getCddwaveEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.cddwaveEthLoading = false
+ return
+ }
+ let cddwaveEthData = data.data
+ this.start = cddwaveEthData[0].date.split("T")[0]
+ this.end = cddwaveEthData[cddwaveEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+ this.handelSonEthPrice("ETH", true)
+ let cdd1ValueList = []
+ let cdd7ValueList = []
+ let cdd30ValueList = []
+ let cdd60ValueList = []
+ let cdd90ValueList = []
+ let cdd180ValueList = []
+ let cdd365ValueList = []
+ let cdd730ValueList = []
+
+ cddwaveEthData.forEach(item => {
+
+
+
+
+ cdd1ValueList.push(Number(item.cdd1.toFixed(2)))
+ cdd7ValueList.push(Number(item.cdd7.toFixed(2)))
+ cdd30ValueList.push(Number(item.cdd30.toFixed(2)))
+ cdd60ValueList.push(Number(item.cdd60.toFixed(2)))
+ cdd90ValueList.push(Number(item.cdd90.toFixed(2)))
+ cdd180ValueList.push(Number(item.cdd180.toFixed(2)))
+ cdd365ValueList.push(Number(item.cdd365.toFixed(2)))
+ cdd730ValueList.push(Number(item.cdd730.toFixed(2)))
+
+
+ })
+ this.option.series[0].data = handelProfitrate(cddwaveEthData, cdd1ValueList)
+ this.option.series[1].data = handelProfitrate(cddwaveEthData, cdd7ValueList)
+ this.option.series[2].data = handelProfitrate(cddwaveEthData, cdd30ValueList)
+ this.option.series[3].data = handelProfitrate(cddwaveEthData, cdd60ValueList)
+ this.option.series[4].data = handelProfitrate(cddwaveEthData, cdd90ValueList)
+ this.option.series[5].data = handelProfitrate(cddwaveEthData, cdd180ValueList)
+ this.option.series[6].data = handelProfitrate(cddwaveEthData, cdd365ValueList)
+ this.option.series[7].data = handelProfitrate(cddwaveEthData, cdd730ValueList)
+
+ this.inCharts()
+
+ this.cddwaveEthLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchcddwaveEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[8], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[8], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchcddwaveEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+}
+}
\ No newline at end of file
diff --git a/yq/src/views/cddwaveEth/index.vue b/yq/src/views/cddwaveEth/index.vue
new file mode 100644
index 0000000..7642af2
--- /dev/null
+++ b/yq/src/views/cddwaveEth/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/circulationBUSD/index.js b/yq/src/views/circulationBUSD/index.js
new file mode 100644
index 0000000..b2a0bcb
--- /dev/null
+++ b/yq/src/views/circulationBUSD/index.js
@@ -0,0 +1,318 @@
+import * as echarts from "echarts";
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelZoom, handelLineType, handelSwitchs, handelSmaData, getDateArray, handelWatermark, fetchBtcPrice, fetchEthPrice } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100"
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: true,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // show:"false",
+ // boundaryGap: [0, "100%"],
+ // axisLabel: {
+ // formatter: function (e) {
+
+ // let value;
+ // if (e > 1000000) {
+ // value = e / 100000;
+ // } else if (e > 100000) {
+ // value = e / 1000;
+ // } else {
+ // value = e / 100;
+ // }
+ // return value;
+ // },
+ // },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Circulating Supplyn (BUSD)",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 2,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ req: "csbusd",
+ radius: "eth"
+ },
+ circulationBUSDLoading: false,
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ parmesTime: {
+ start: "",
+ end: ""
+ },
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+ this.fetchCirculation(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("circulationBUSDBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("circulationBUSDBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ //请求数据并渲染
+ async fetchCirculation(req, radius, start, end, sma) {
+ this.circulationBUSDLoading = true
+ const { data } = await this.$API.getProfitrate(req, radius, start, end, sma)
+ let busdData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.circulationBUSDLoading = false
+ return
+ }
+ this.start = busdData[0].date.split("T")[0]
+ this.end = busdData[busdData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // //移动平均线没值 才渲染正常价格数据
+ // if (this.start && !this.fatherSmaData[0]) {
+ // this.handelSonBtcPrice("BTC", true)
+
+
+ // }
+ // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // if (this.fatherSmaData[0] && this.start) {
+ // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+
+ // }
+ // })
+ // //渲染ETH
+ // if (this.ethFlag) {
+
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+ this.handelSonBtcPrice("BTC", true)
+ let ValueList = []
+ busdData.forEach(item => {
+ ValueList.push(Number(item.value.toFixed(2)))
+ })
+ this.option.series[0].data = handelProfitrate(busdData, ValueList)
+
+ this.inCharts()
+ this.circulationBUSDLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.parmesTime.start = start;
+ this.parmesTime.end = end;
+ this.fetchCirculation(this.params.req, this.params.radius, this.parmesTime.start, this.parmesTime.end, this.sma)
+ // this.handelSonEthPrice()
+
+ },
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+
+ this.ethFlag = flag
+
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag, true)
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+
+
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.sma = smaDataList
+ this.fetchCirculation(this.params.req, this.params.radius, this.parmesTime.start, this.parmesTime.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList,this.option.series[1],this.inCharts,this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/circulationBUSD/index.vue b/yq/src/views/circulationBUSD/index.vue
new file mode 100644
index 0000000..106acd9
--- /dev/null
+++ b/yq/src/views/circulationBUSD/index.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/circulationTotalCSupply/index.js b/yq/src/views/circulationTotalCSupply/index.js
new file mode 100644
index 0000000..cc507f0
--- /dev/null
+++ b/yq/src/views/circulationTotalCSupply/index.js
@@ -0,0 +1,385 @@
+import * as echarts from "echarts";
+import { chartsWidth, emptyData,handelProfitrate,dataLength, handelZoom, handelLineType, handelSwitchs, handelSmaData, getDateArray, handelWatermark, fetchBtcPrice, fetchEthPrice } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ show: false,
+ precision: 0, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 1,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100"
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // show:"false",
+ // boundaryGap: [0, "100%"],
+ // axisLabel: {
+ // formatter: function (e) {
+
+ // let value;
+ // if (e > 1000000) {
+ // value = e / 100000;
+ // } else if (e > 100000) {
+ // value = e / 1000;
+ // } else {
+ // value = e / 100;
+ // }
+ // return value;
+ // },
+ // },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Circulating Supplyn (total)",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 2,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ req: "totalCSupply",
+ radius: "eth"
+ },
+ circulationTotalCSupplyLoading: false,
+ switch3: "",
+ btcFlag: false,
+ ethFlag: true,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ parmesTime: {
+ start: "",
+ end: ""
+ },
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+ isComponentMounted: false,
+ chartInitialized: false,
+ // 添加数据缓存
+ cachedData: null,
+ }
+ },
+ mounted() {
+ this.isComponentMounted = true;
+ // 确保DOM已经渲染完成
+ this.$nextTick(() => {
+ this.fetchCirculation(this.params.req, this.params.radius);
+ });
+ this.switch3 = handelSwitchs(this.option, this.switch3);
+
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (!this.isComponentMounted) {
+ console.warn('组件未挂载,跳过图表初始化');
+ return;
+ }
+ try {
+ const chartDom = document.getElementById("circulationTotalCSupplyBox");
+ if (!chartDom) {
+ console.warn('图表容器不存在');
+ return;
+ }
+
+ // 如果实例已存在,先销毁
+ if (this.myChart) {
+ this.myChart.dispose();
+ }
+
+ // 创建新实例
+ this.myChart = echarts.init(chartDom);
+
+ // 确保option数据存在
+ if (!this.option.series[0].data || this.option.series[0].data.length === 0) {
+ console.warn('图表数据为空,尝试使用缓存数据');
+ if (this.cachedData) {
+ this.option.series[0].data = this.cachedData;
+ }
+ }
+
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd);
+ this.myChart.setOption(this.option);
+
+ this.chartInitialized = true;
+
+ // 添加窗口大小变化监听
+ chartsWidth("circulationTotalCSupplyBox", this);
+ window.addEventListener("resize", this.handleResize);
+ } catch (error) {
+ console.error('图表初始化失败:', error);
+ }
+ // if (this.myChart == null) {
+ // this.myChart = echarts.init(document.getElementById("circulationTotalCSupplyBox"));
+ // }
+ // this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ // this.myChart.setOption(this.option);
+ // chartsWidth("circulationTotalCSupplyBox", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart) this.myChart.resize();
+ // });
+ },
+ //请求数据并渲染
+ async fetchCirculation(req, radius, start, end, sma) {
+ this.circulationTotalCSupplyLoading = true
+ const { data } = await this.$API.getProfitrate(req, radius, start, end, sma)
+ let totalData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.circulationTotalCSupplyLoading = false
+ return
+ }
+
+
+ this.start = totalData[0].date.split("T")[0]
+ this.end = totalData[totalData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+ console.log(this.ethFlag, "eth价格渲染");
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // //移动平均线没值 才渲染正常价格数据
+ // if (this.start && !this.fatherSmaData[0]) {
+ // this.handelSonBtcPrice("BTC", true)
+
+
+ // }
+ // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // if (this.fatherSmaData[0] && this.start) {
+ // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+
+ // }
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // console.log("eth价格渲染");
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+ // })
+ this.handelSonBtcPrice("BTC", true)
+
+
+ let ValueList = []
+ totalData.forEach(item => {
+ ValueList.push(Number(item.value.toFixed(2)))
+ })
+ this.option.series[0].data = handelProfitrate(totalData, ValueList)
+
+ this.inCharts()
+ this.circulationTotalCSupplyLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+
+ this.parmesTime.start = start;
+ this.parmesTime.end = end;
+ this.fetchCirculation(this.params.req, this.params.radius, this.parmesTime.start, this.parmesTime.end, this.sma)
+ // this.handelSonEthPrice()
+ // if (this.ethFlag) {//ETH渲染情况下选择时间渲染
+ // fetchEthPrice("ETH", this.option.series[2], start, end, this.inCharts, this, this.ethFlag)
+ // }
+ },
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+
+ this.ethFlag = flag
+
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag, true)
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.sma = smaDataList
+ this.fetchCirculation(this.params.req, this.params.radius, this.parmesTime.start, this.parmesTime.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList,this.option.series[1],this.inCharts,this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/circulationTotalCSupply/index.vue b/yq/src/views/circulationTotalCSupply/index.vue
new file mode 100644
index 0000000..c0443cc
--- /dev/null
+++ b/yq/src/views/circulationTotalCSupply/index.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/circulationUSDC/index.js b/yq/src/views/circulationUSDC/index.js
new file mode 100644
index 0000000..7db64d9
--- /dev/null
+++ b/yq/src/views/circulationUSDC/index.js
@@ -0,0 +1,330 @@
+import * as echarts from "echarts";
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelZoom, handelLineType, handelSwitchs, handelWatermark, handelSmaData, getDateArray, fetchBtcPrice, fetchEthPrice } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100"
+ },
+ xAxis: {
+ type: "time",
+ // boundaryGap: [0.1, 0.1],
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // show:"false",
+ // boundaryGap: [0, "100%"],
+ // axisLabel: {
+ // formatter: function (e) {
+
+ // let value;
+ // if (e > 1000000) {
+ // value = e / 100000;
+ // } else if (e > 100000) {
+ // value = e / 1000;
+ // } else {
+ // value = e / 100;
+ // }
+ // return value;
+ // },
+ // },
+ min: "dataMin",
+ max: "dataMax",
+ // axisLine: {
+ // show: true, // 显示 Y 轴线条
+ // },
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right",
+ // axisLine: {
+ // show: true, // 显示 Y 轴线条
+ // },
+
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ },
+ ],
+
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Circulating Supply (USDC)",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 2,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ req: "csusdc",
+ radius: "eth"
+ },
+ circulationUSDCLoading: false,
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ parmesTime: {
+ start: "",
+ end: ""
+ },
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+ this.fetchCirculation(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("circulationUSDCBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("circulationUSDCBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ //请求数据并渲染
+ async fetchCirculation(req, radius, start, end, sma) {
+ this.circulationUSDCLoading = true
+ const { data } = await this.$API.getProfitrate(req, radius, start, end, sma)
+ let usdcData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.circulationUSDCLoading = false
+ return
+ }
+ this.start = usdcData[0].date.split("T")[0]
+ this.end = usdcData[usdcData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+
+
+
+
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // //移动平均线没值 才渲染正常价格数据
+ // if (this.start && !this.fatherSmaData[0]) {
+ // this.handelSonBtcPrice("BTC", true)
+
+
+ // }
+ // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // if (this.fatherSmaData[0] && this.start) {
+ // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+
+ // }
+ // //渲染ETH
+ // if (this.ethFlag) {
+
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+ // })
+ this.handelSonBtcPrice("BTC", true)
+ let ValueList = []
+ usdcData.forEach(item => {
+ ValueList.push(Number(item.value.toFixed(2)))
+ })
+ this.option.series[0].data = handelProfitrate(usdcData, ValueList)
+
+ this.inCharts()
+
+ console.log(this.option,"机密级");
+
+ this.circulationUSDCLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.parmesTime.start = start;
+ this.parmesTime.end = end;
+ this.fetchCirculation(this.params.req, this.params.radius, this.parmesTime.start, this.parmesTime.end, this.sma)
+ // this.handelSonEthPrice()
+
+ },
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+
+ this.ethFlag = flag
+
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag, true)
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.sma = smaDataList
+ this.fetchCirculation(this.params.req, this.params.radius, this.parmesTime.start, this.parmesTime.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList,this.option.series[1],this.inCharts,this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/circulationUSDC/index.vue b/yq/src/views/circulationUSDC/index.vue
new file mode 100644
index 0000000..98e476f
--- /dev/null
+++ b/yq/src/views/circulationUSDC/index.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/circulationUSDT/index.js b/yq/src/views/circulationUSDT/index.js
new file mode 100644
index 0000000..37a5cac
--- /dev/null
+++ b/yq/src/views/circulationUSDT/index.js
@@ -0,0 +1,320 @@
+import * as echarts from "echarts";
+import { chartsWidth,emptyData, dataLength,handelProfitrate, handelZoom, handelLineType, handelSwitchs, handelSmaData, getDateArray, handelWatermark, fetchBtcPrice, fetchEthPrice } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ option: {
+ lengthTimer:null,
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100"
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: true,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // show:"false",
+ // boundaryGap: [0, "100%"],
+ // axisLabel: {
+ // formatter: function (e) {
+
+ // let value;
+ // if (e > 1000000) {
+ // value = e / 100000;
+ // } else if (e > 100000) {
+ // value = e / 1000;
+ // } else {
+ // value = e / 100;
+ // }
+ // return value;
+ // },
+ // },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Circulating Supply (USDT)",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 2,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ req: "csusdt",
+ radius: "eth"
+ },
+ circulationUSDTLoading: false,
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ parmesTime: {
+ start: "",
+ end: ""
+ },
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ this.fetchCirculation(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("circulationUSDTBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("circulationUSDTBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ //请求数据并渲染
+ async fetchCirculation(req, radius, start, end, sma) {
+ this.circulationUSDTLoading = true
+ const { data } = await this.$API.getProfitrate(req, radius, start, end, sma)
+ let usdtData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.circulationUSDTLoading = false
+ return
+ }
+
+ this.start = usdtData[0].date.split("T")[0]
+ this.end = usdtData[usdtData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // // //移动平均线没值 才渲染正常价格数据
+ // // if (this.start && !this.fatherSmaData[0]) {
+ // // this.handelSonBtcPrice("BTC", true)
+
+
+ // // }
+ // // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // // if (this.fatherSmaData[0] && this.start) {
+ // // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+
+ // // }
+ // //渲染ETH
+ // if (this.ethFlag) {
+
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+ // })
+ this.handelSonBtcPrice("BTC", true)
+ let ValueList = []
+ usdtData.forEach(item => {
+ ValueList.push(Number(item.value.toFixed(2)))
+ })
+ this.option.series[0].data = handelProfitrate(usdtData, ValueList)
+
+ this.inCharts()
+ this.circulationUSDTLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.parmesTime.start = start;
+ this.parmesTime.end = end;
+ this.fetchCirculation(this.params.req, this.params.radius, this.parmesTime.start, this.parmesTime.end, this.sma)
+
+ // this.handelSonEthPrice()
+ },
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+
+ this.ethFlag = flag
+
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag, true)
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.sma = smaDataList
+ this.fetchCirculation(this.params.req, this.params.radius, this.parmesTime.start, this.parmesTime.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList,this.option.series[1],this.inCharts,this.start, this.end)
+
+ },
+
+ },
+
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+}
+}
\ No newline at end of file
diff --git a/yq/src/views/circulationUSDT/index.vue b/yq/src/views/circulationUSDT/index.vue
new file mode 100644
index 0000000..2576db1
--- /dev/null
+++ b/yq/src/views/circulationUSDT/index.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/cnew/index.js b/yq/src/views/cnew/index.js
new file mode 100644
index 0000000..02e02d2
--- /dev/null
+++ b/yq/src/views/cnew/index.js
@@ -0,0 +1,382 @@
+import * as echarts from "echarts";
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ cnewLoading: false,
+ params: {
+ req: "cnew",
+ radius: "ETH",
+ start: "",
+ end: ""
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ position: function (pt) {
+ return [pt[0], "10%"];
+ },
+ },
+ legend: {
+ right: "100",
+ // data:[`sopr`,'asopr','easopr','lthsopr','sthsopr',],
+ // selected:{
+ // 'asopr': false,
+ // 'easopr': false,
+ // 'lthsopr': false,
+ // 'sthsopr': false,
+ // }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//万
+ value = `${e / 10000}W`;
+ } else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ position: "right",
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right",
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Number of New Contract",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 1,
+ // data: [],
+ // //绘制右侧Y轴
+ // markLine: {
+ // symbol: ["none", "none"], //去掉箭头
+ // itemStyle: {
+ // normal: {
+ // lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ // },
+ // },
+ // // lineStyle:{
+ // // color:"red"
+ // // },
+
+ // label: {
+ // formatter: "{b}",
+ // fontSize: 10,
+ // color: "rgba(0,0,0,0.8)",
+ // align: "left",
+ // },
+ // data: [
+ // // {
+ // // name: "0",
+ // // yAxis: 0,
+ // // },
+ // // {
+ // // name: "$40W",
+ // // yAxis: 400000,
+ // // },
+ // {
+ // name: "$70W",
+ // yAxis: 700000,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+
+ // {
+ // name: "$10W",
+ // yAxis: 100000,
+ // },
+ // {
+ // name: "$100W",
+ // yAxis: 1000000,
+ // // position: ['100%', '50'],
+ // },
+ // {
+ // name: "$120W",
+ // yAxis: 1200000,
+ // },
+
+ // {
+ // name: "$140W",
+ // yAxis: 1400000,
+ // },
+ // ],
+ // },
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 2,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: ""
+ }
+ },
+ mounted() {
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+
+ this.fetchCnew(this.params.req, this.params.radius)
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("cnewBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("cnewBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchCnew(req, radius, start, end, sma) {
+ this.cnewLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+ let cnewData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.cnewLoading = false
+ return
+ }
+
+ this.start = cnewData[0].date.split("T")[0]
+ this.end = cnewData[cnewData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // //移动平均线没值 才渲染正常价格数据
+ // if (this.start && !this.fatherSmaData[0]) {
+ // if (radius == "BTC") {
+ // this.btcFlag = true
+ // this.handelSonBtcPrice("BTC", true);
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(true));
+ // } else if (radius == "ETH") {
+ // this.ethFlag = true
+ // this.handelSonEthPrice("ETH", true);
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(true));
+ // }
+ // }
+ // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // if (this.fatherSmaData[0] && this.start) {
+ // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ // }
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+ // })
+
+ // this.handelSonEthPrice("ETH", true);
+ let cnewValueList = []
+ let priceValueList = []
+ cnewData.forEach(item => {
+
+ cnewValueList.push(Number(item.value.toFixed(2)))
+ priceValueList.push(Number(item.price.toFixed(2)))
+
+
+ })
+ this.option.series[0].data = handelProfitrate(cnewData, cnewValueList)
+ this.option.series[1].data = handelProfitrate(cnewData, priceValueList)
+ // this.option.series[1].data = handelBtcPrice(newPriceData, priceValueList)
+
+ this.inCharts()
+ this.cnewLoading = false
+
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchCnew(this.params.req, this.params.radius, this.params.start, this.params.end, this.sma)
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+
+ this.btcFlag = flag;
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+
+ this.ethFlag = flag;
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.sma = smaDataList
+ this.fetchCnew(this.params.req, this.params.radius, this.params.start, this.params.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts, this.start, this.end,)
+
+ },
+
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/cnew/index.vue b/yq/src/views/cnew/index.vue
new file mode 100644
index 0000000..df80b83
--- /dev/null
+++ b/yq/src/views/cnew/index.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/coinmarketall/index.js b/yq/src/views/coinmarketall/index.js
new file mode 100644
index 0000000..8e90464
--- /dev/null
+++ b/yq/src/views/coinmarketall/index.js
@@ -0,0 +1,575 @@
+import * as echarts from "echarts";
+import { minLine } from "../../util/echarts"
+import { handelWatermark,chartsWidth } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ allData: [],
+ imgSrc: "",
+ option: { ...minLine },
+ dayData: [],
+ activeNames: "",
+ coinmarketallLoading: false,
+
+ lst: [ // 假数据
+ {
+ id: 1,
+ price: {
+ name: '项目一',
+ resData: [
+ { name: '订购费用', value: 12 },
+ { name: '饲养费用', value: 18 },
+ { name: '实验费用', value: 8 },
+ { name: '其他费用', value: 10 },
+ ]
+ }
+ }, {
+ id: 2,
+ price: {
+ name: '项目二',
+ resData: [
+ { name: '订购费用', value: 18 },
+ { name: '饲养费用', value: 10 },
+ { name: '实验费用', value: 20 },
+ { name: '其他费用', value: 9 },
+ ]
+ }
+ }
+
+ ],
+ seriesData: [],
+ list: [],
+ chartDom: [],
+ type: "",
+ params: {
+ start: "",
+ end: ""
+ },
+ bigLine: {
+ tooltip: {
+ trigger: 'axis',
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ grid: {
+ top: 1,
+ bottom: 20,
+ left: 50,
+ right: 5,
+ },
+
+ xAxis: {
+ // type: 'time',
+ boundaryGap: false,
+ data: []
+ },
+ yAxis: {
+ // type:"value",
+ show: true,
+ scale: true,
+ position: 'left',
+ axisLine: { show: false },
+ axisTick: { show: false },
+ splitLine: { show: false },
+ axisLabel: { inside: false, interval: 0 }
+ },
+ dataZoom: [
+ {
+ type: 'inside',
+ start: 0,
+ end: 100
+ },
+
+ ],
+ series: [
+ {
+ name: '币价',
+ type: 'line',
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#ffa3a8",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ color: "#ffa3a8",
+ width: 1,
+ },
+ areaStyle: {
+ normal: {
+ color: new echarts.graphic.LinearGradient(
+ 0, 0, 0, 1,
+ [
+ { offset: 0, color: 'red' },
+ { offset: 0.5, color: 'pink' },
+ { offset: 1, color: '#ddd' }
+ ]
+ )
+ }
+ },
+
+ data: []
+ }
+ ]
+
+ },
+ timeData: [],
+ ids: "",
+ chartLoading: false
+ }
+ },
+ // watch: {
+ // //监听手风琴展开时间选择框启用
+ // type(val) {
+ // //日期选择框禁用
+ // if (!val) {
+ // this.$addStorageEvent(1, "timeDisable", true);
+ // } else {
+ // this.$addStorageEvent(1, "timeDisable", false);
+
+ // }
+ // }
+ // },
+ mounted() {
+ //进页面默认禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+
+ this.fetchCoinmarketall()
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ this.myChart = echarts.init(document.getElementById("echartsBox"));
+
+ this.myChart.setOption(this.option);
+ chartsWidth("echartsBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ //请求数据
+ async fetchCoinmarketall() {
+ this.coinmarketallLoading = true
+ const { data } = await this.$API.getCoinmarketall()
+ this.allData = data.data
+ //空数据处理
+ if (data.data.length===0) {
+ this.$message({
+ message: this.$t(`home.NoData`),
+ type: 'warning'
+ });
+
+ this.coinmarketallLoading = false
+ return
+ }
+ this.allData.forEach(item => {
+ let year = item.time.split("T")[0]
+ let hours = item.time.split("T")[1].split(".")[0]
+ item.time = `${year} ${hours}`
+ item.value = Number(item.value).toFixed(2)
+ let name = item.param.toLowerCase()
+
+ if (this.handelTrading().indexOf(name) == -1) {
+ item.src = `https://studio.glassnode.com/images/crypto-icons/${name}.png`
+ } else {
+ item.src = ""
+ }
+
+ })
+
+
+ this.allData.forEach(item => {
+ this.list.push([item.list, item.param])
+ this.chartDom.push({ params: item.param })
+ })
+ //处理数据格式
+ this.seriesData = this.handelLIst(this.list)
+
+ // 小折线图
+ this.$nextTick(() => {
+ var minChart = document.getElementsByClassName("chart");
+ for (var i = 0; i < this.allData.length; i++) { // 通过for循环,在相同class的dom内绘制元素
+ let myMinChart = echarts.init(minChart[i]);
+ this.handelMinChart(myMinChart, i)
+ }
+ })
+ this.coinmarketallLoading = false
+ },
+ //处理小折线图渲染
+ handelMinChart(charts, i) {
+ let minOption = {
+ xAxis: {
+ boundaryGap: false,
+ show: false,
+ axisLine: { onZero: false },
+ axisTick: { show: false },
+ axisLabel: { show: false, interval: 0 },
+ data: this.seriesData[i].map(item => item[0]),
+
+ },
+ yAxis: {
+ type: "value",
+ show: false,
+ scale: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: 'right',
+ axisLine: { show: false },
+ axisTick: { show: false },
+ splitLine: { show: false },
+ axisLabel: { inside: false, interval: 0 }
+ },
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ ],
+ grid: {
+ top: 1,
+ bottom: 3,
+ left: 3,
+ right: 3,
+ },
+ series: [
+ {
+ name: 'Fake Data',
+ type: 'line',
+ showSymbol: false,
+ lineStyle: {
+ color: "#d84d65"
+ },
+ data: this.seriesData[i].map(item => item[1])
+ }
+ ]
+ }
+
+ charts.setOption(minOption, true)
+ },
+ //请求选择时间数据
+ async fetchCoinmarket(coin, start, end) {
+ this.chartLoading = true
+ const { data } = await this.$API.getCoinmarket(coin, start, end)
+ this.timeData = data.data
+ // let ids = `echarts${id}`
+ this.bigEchart = echarts.init(document.getElementById(this.ids))
+ this.bigLine.xAxis.data.length = 0
+ this.bigLine.series[0].data.length = 0
+ this.timeData.forEach(item => {
+ let year = item.time.split("T")[0];
+ let hours = item.time.split("T")[1].split(".")[0];
+ let date = `${year} ${hours}`;
+ this.bigLine.xAxis.data.push(date)
+ this.bigLine.series[0].data.push(Number(item.value).toFixed(2))
+ })
+
+ this.bigEchart.setOption(this.bigLine, true)
+
+ this.chartLoading = false
+ // console.log(data, "lishi");
+ },
+ //点击每一行
+ handelChang(a,b) {
+ // console.log(a, this.activeNames,b, 899);
+
+ },
+
+ //大折线图渲染
+ handelClick(currency, id, index) {
+ console.log(currency, id, index,5445);
+ if (currency !== this.type) {
+ this.type = currency
+ this.ids = `echarts${id}`
+ this.bigEchart = echarts.init(document.getElementById(this.ids))
+ this.bigLine = {
+ tooltip: {
+ trigger: 'axis',
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ // grid: {
+ // top: 1,
+ // bottom: 20,
+ // left: 50,
+ // right: 5,
+ // },
+
+ xAxis: {
+ // type: 'time',
+ boundaryGap: false,
+ data: this.seriesData[index].map(item => item[0]),
+ axisLabel: {
+ formatter: (value) => {
+ let time = value.split(" ")[1]
+
+
+ return `${time.split(`:`)[0]}:${time.split(`:`)[1]}`
+ }
+ }
+ },
+ yAxis: {
+ // type:"value",
+ show: true,
+ scale: true,
+ position: 'left',
+ axisLine: { show: false },
+ axisTick: { show: false },
+ splitLine: { show: false },
+ axisLabel: {
+ formatter: (value) => {
+ let data
+ if (value >= 1000000000) {
+ data = `${(value / 1000000000).toFixed(2)}B`
+ } else if (value >= 1000000) {
+ data = `${(value / 1000000).toFixed(2)}M`
+ } else if (value >= 1000) {
+ data = `${(value / 1000).toFixed(2)}K`
+ } else {
+ data = value
+ }
+ return data
+ }
+ }
+ },
+ graphic: [
+ {
+ type: 'group',
+ // rotation: Math.PI / 2,
+ bounding: 'raw',
+ right: "50%",
+ top: "40%",
+ z: 10,
+ // rotation: 6,
+ children: [
+ {
+ type: 'text',
+ left: 'center',
+ top: 'center',
+ silent: true,//不影响鼠标事件
+ // z: 100,
+ style: {
+ fill: `rgba(0,0,0,0.1)`,
+ text: `coinbus.cc`,
+ font: 'bold 80px sans-serif',
+
+ }
+ }
+ ]
+ }
+ ],
+ dataZoom: [
+ {
+ type: 'inside',
+ start: 0,
+ end: 100
+ },
+
+ ],
+ series: [
+ {
+ name: 'currency',
+ type: 'line',
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#ffa3a8",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ color: "#ffa3a8",
+ width: 1,
+ },
+ areaStyle: {
+ normal: {
+ color: new echarts.graphic.LinearGradient(
+ 0, 0, 0, 1,
+ [
+ { offset: 0, color: 'red' },
+ { offset: 0.5, color: 'pink' },
+ { offset: 1, color: '#ddd' }
+ ]
+ )
+ }
+ },
+
+ data: this.seriesData[index].map(item => item[1])
+ }
+ ]
+
+ }
+ this.bigEchart.setOption(this.bigLine, true)
+ chartsWidth(this.ids, this);
+
+
+ // echart.setOption(this.bigLine);
+ // 当窗口或者大小发生改变时执行resize,重新绘制图表
+ window.addEventListener("resize", () => {
+ this.bigEchart.resize();
+ });
+
+ } else {
+ this.type = ''
+ // echart.dispose()
+ }
+
+ },
+
+ //处理没有图片的交易对
+ handelTrading() {
+
+ let str = "AVAX,NEAR,FLOW,HBAR,CHZ,EGLD,AXS,XEC,HNT,USTC,USDD,FTM,KLAY,USDN,RUNE,CAKE,MINA,KAVA,FEI,XDC,TWT,GMT,1INCH,CELO,GALA,AR,GT,CVX,ROSE"
+ str = str.toLowerCase()
+ let arr = str.split(",")
+ return arr
+ },
+
+ //加载失败图表不显示
+ imageLoad(event) {
+ var img = event.srcElement
+ img.onerror = null
+ img.outerHTML = ''
+ },
+ //循环渲染下拉折线图
+ handelDropDownChart(seriesData) {
+ let roseCharts = document.getElementsByClassName('DropDownChart');
+
+ for (let i = 0; i < roseCharts.length; i++) { // 通过for循环,在相同class的dom内绘制元素
+ let myChart = echarts.init(roseCharts[i]);
+ var option = {
+ tooltip: {
+ trigger: "axis",
+ position: function (pt) {
+ return [pt[0], "10%"];
+ },
+ },
+ legend: {},
+ xAxis: {
+ // type: "time",
+ // data: xData[i],
+ // boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ // axisLabel: {
+ // formatter: function (e) {
+
+ // let value;
+ // if (e > 1000000) {
+ // value = e / 100000;
+ // } else if (e > 100000) {
+ // value = e / 1000;
+ // } else {
+ // value = e / 100;
+ // }
+ // return value;
+ // },
+ // },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "1",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: seriesData[i],
+ },
+
+ ],
+
+ }
+ myChart.setOption(option)
+
+ }
+
+ },
+
+ //处理折线图数据格式
+ handelLIst(data) {
+ let sumArr = []
+ let arr = []
+ data.forEach(item => {
+ item[0].forEach(item => {
+ // Number(item.price).toFixed(2)
+ //
+ let price = Number(parseInt(item.price * 10000) / 10000)
+ let year = item.date.split("T")[0]
+ let hours = item.date.split("T")[1].split(".")[0]
+ let time = `${year} ${hours} `
+ arr.push([time, Number(price), item.coinSymbol])
+ })
+ })
+ // sumArr.push(arr)
+
+
+ let newArr = []
+ let a = []
+ for (const i of arr) {
+ if (a.indexOf(i[2]) === -1) {
+ newArr.push([[i[0], i[1]]])
+ a.push(i[2])
+ } else {
+ newArr[a.indexOf(i[2])].push([i[0], i[1]])
+ }
+ }
+
+ newArr.forEach(item => {
+ item.sort((a, b) => {
+
+ return a[0] > b[0] ? 1 : -1
+ })
+ })
+
+
+ return newArr
+
+ },
+
+ handelSonTime(start, end) {
+ this.fetchCoinmarket(this.type, start, end)
+ },
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/coinmarketall/index.vue b/yq/src/views/coinmarketall/index.vue
new file mode 100644
index 0000000..83896aa
--- /dev/null
+++ b/yq/src/views/coinmarketall/index.vue
@@ -0,0 +1,182 @@
+
+
+
+
+
+
+
+ {{$t(`home.ranking`)}}
+ {{$t(`home.date`)}}
+ {{$t(`home.trading`)}}
+ {{$t(`home.currency`)}}(USD)
+ {{$t(`home.dayCurrency`)}}
+
+
+
+
+
+
+
+
{{ index+1 }}
+
{{ item.time }}
+
+
+
+ {{ item.param }}
+
+
{{ item.value }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/consumptionRecords/index.js b/yq/src/views/consumptionRecords/index.js
new file mode 100644
index 0000000..a8b3489
--- /dev/null
+++ b/yq/src/views/consumptionRecords/index.js
@@ -0,0 +1,106 @@
+import { PrivateConsume } from "../../api/pay"
+import { GetUserAccount } from "../../api/help"
+import { Debounce } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ params: {
+ page: "1",
+ limit: "300",
+ status: "",
+ },
+ successData: [],
+ failData: [],
+ PendingData: [],
+ activeName:"pending",
+
+ }
+ },
+ mounted() {
+ this.params.status = 0
+ this.fetchPrivateConsume0(this.params)
+ this.params.status = 1
+ this.fetchPrivateConsume1(this.params)
+ this.params.status = 2
+ this.fetchPrivateConsume2(this.params)
+
+
+
+ },
+ methods: {
+ //请求消费记录 失败
+ async fetchPrivateConsume0(params) {
+ // this.WithdrawalLoading = true
+ const { data } = await PrivateConsume(params)
+
+ this.failData = data.rows
+ // if (data.code === 200) {//提现成功
+ // this.$message({
+ // type: 'success',
+ // message: data.msg,
+ // duration: 0,
+ // showClose: true,
+ // });
+
+ // this.$router.push(`/personal`)
+ // }
+
+ // this.WithdrawalLoading = false
+ },
+ //请求消费记录 成功
+ async fetchPrivateConsume1(params) {
+ // this.WithdrawalLoading = true
+ const { data } = await PrivateConsume(params)
+ this.successData = data.rows
+
+ // if (data.code === 200) {//提现成功
+ // this.$message({
+ // type: 'success',
+ // message: data.msg,
+ // duration: 0,
+ // showClose: true,
+ // });
+
+ // this.$router.push(`/personal`)
+ // }
+
+ // this.WithdrawalLoading = false
+ },
+
+ //请求消费记录 处理中
+ async fetchPrivateConsume2(params) {
+ // this.WithdrawalLoading = true
+ const { data } = await PrivateConsume(params)
+ this.PendingData = data.rows
+
+
+ // this.WithdrawalLoading = false
+ },
+
+
+
+
+
+
+
+ handelTime(date) {
+ if (date) {
+ return `${date.split("T")[0]} ${date.split("T")[1].split(".")[0]}`
+ }
+ },
+
+
+
+ //点击刷新
+ handelRefresh: Debounce(function () {
+ this.params.status = 0
+ this.fetchPrivateConsume0(this.params)
+ this.params.status = 1
+ this.fetchPrivateConsume1(this.params)
+ this.params.status = 2
+ this.fetchPrivateConsume2(this.params)
+ }, 1000)
+
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/consumptionRecords/index.vue b/yq/src/views/consumptionRecords/index.vue
new file mode 100644
index 0000000..6cb5214
--- /dev/null
+++ b/yq/src/views/consumptionRecords/index.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
+ {{ $t(`pay.consumption`) }}
+
+
+
+
+
+
+
+
+
+ {{ $t(`pay.pendingProcessing`) }}
+
+
+
+
+
+ {{ handelTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`pay.successfulOrder`) }}
+
+
+
+
+
+ {{ handelTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`pay.withdrawalFailed`) }}
+
+
+
+
+
+ {{ handelTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/csupply/index.js b/yq/src/views/csupply/index.js
new file mode 100644
index 0000000..92acdd3
--- /dev/null
+++ b/yq/src/views/csupply/index.js
@@ -0,0 +1,435 @@
+import * as echarts from "echarts";
+import { chartsWidth, dataLength,emptyData,handelProfitrate, handelZoom, handelLineType, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ csupplyLoading: false,
+ params: {
+ req: "csupply",
+ radius: "btc"
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",//处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 120, '14px Microsoft Yahei', '…');
+ // },
+ // data:[`sopr`,'asopr','easopr','lthsopr','sthsopr',],
+ // selected:{
+ // 'asopr': false,
+ // 'easopr': false,
+ // 'lthsopr': false,
+ // 'sthsopr': false,
+ // }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//万
+ value = `${e / 10000}W`;
+ } else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right",
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ position: "right",
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Circulating Supply",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#fb8513",
+ borderColor: "rgba(221,220,107,0.5)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#fb8513",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.4)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ markLine: {
+ symbol: ["none", "none"], //去掉箭头
+ itemStyle: {
+ normal: {
+ lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ },
+ },
+ // lineStyle:{
+ // color:"red"
+ // },
+
+ label: {
+ formatter: "{b}",
+ fontSize: 10,
+ color: "rgba(0,0,0,0.8)",
+ align: "left",
+ },
+ data: [
+ // {
+ // name: "0",
+ // yAxis: 0,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+ {
+ name: "$70W",
+ yAxis: 700000,
+ },
+ {
+ name: "$40W",
+ yAxis: 400000,
+ },
+
+ {
+ name: "$10W",
+ yAxis: 100000,
+ },
+ {
+ name: "$100W",
+ yAxis: 1000000,
+ // position: ['100%', '50'],
+ },
+ {
+ name: "$120W",
+ yAxis: 1200000,
+ },
+
+ {
+ name: "$140W",
+ yAxis: 1400000,
+ },
+ ],
+ },
+ },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 2,
+ data: [],
+ },
+
+ ],
+ },
+ btcPrice: [],
+ priceTime: "",
+ parmesTime: {
+ start: "",
+ end: ""
+ },
+ switch3: "",
+ radius: "",
+ color: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+
+ mounted() {
+ // this.fetchCsupply(this.params.req,this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ let obj = localStorage.getItem("src");
+ this.radius = localStorage.getItem("radius");
+ // this.color = JSON.parse(obj).color;
+ this.fetchCsupply(this.params.req, this.radius)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+ let obj = localStorage.getItem("src");
+ this.radius = localStorage.getItem("radius");
+ // this.color = JSON.parse(obj).color;
+
+ })
+ console.log(this.params.req, this.radius,"就覅反馈if");
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("csupplyBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("csupplyBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchCsupply(req, radius, start, end, sma) {
+ this.csupplyLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.csupplyLoading = false
+ return
+ }
+
+
+ this.csupplyData = data.data
+ this.start = this.csupplyData[0].date.split("T")[0]
+ this.end = this.csupplyData[this.csupplyData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // //移动平均线没值 才渲染正常价格数据
+ // // if (this.start && !this.fatherSmaData[0] && this.radius == "BTC") {
+ // // this.btcFlag = true
+ // // this.handelSonBtcPrice("BTC", true);
+ // // this.$addStorageEvent(1, "btcFlag", JSON.stringify(true));
+ // // } else if (this.start && this.radius == "ETH") {
+ // // this.ethFlag = true
+ // // this.handelSonEthPrice("ETH", true);
+ // // this.$addStorageEvent(1, "ethFlag", JSON.stringify(true));
+ // // }
+
+ // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // if (this.fatherSmaData[0] && this.start) {
+ // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ // }
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+ // })
+ //不同币种显示不同价格曲线
+ if (radius == "BTC") {
+ this.option.series = this.option.series.filter(item => item.name !== "Price [ETH]")
+ this.handelSonBtcPrice("BTC", true)
+ } else if (radius == "ETH") {
+ this.option.series = this.option.series.filter(item => item.name !== "Price[BTC]")
+ this.handelSonEthPrice("ETH", true)
+ }
+
+ let csupplyValueList = []
+
+ this.csupplyData.forEach(item => {
+
+ csupplyValueList.push(Number(item.value.toFixed(2)))
+
+
+ })
+ this.option.series[0].data = handelProfitrate(this.csupplyData, csupplyValueList)
+ // this.option.series[0].itemStyle.color = this.color;
+ // this.option.series[0].lineStyle.color = this.color;
+ this.inCharts()
+ this.csupplyLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.parmesTime.start = start;
+ this.parmesTime.end = end;
+ this.fetchCsupply(this.params.req, this.radius, this.parmesTime.start, this.parmesTime.end, this.sma)
+ // if (this.radius == "BTC") {
+ // // this.handelSonEthPrice()
+ // } else {
+ // this.handelSonBtcPrice("BTC", true)
+ // }
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ //父级BTC默认是true 在ETH页面btcFlag 取反才能正常点击父级就渲染
+ // if (this.radius== "ETH") {
+ // console.log(this.radius,4545);
+ // this.btcFlag = !flag;
+ // } else {
+ // this.btcFlag = flag;
+ // }
+ this.btcFlag = flag;
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ //父级BTC默认是true 在ETH页面btcFlag 取反才能正常点击父级就渲染
+ // if (this.radius== "ETH") {
+ // this.ethFlag = !flag;
+ // } else {
+ // this.ethFlag = flag;
+ // }
+ this.ethFlag = flag;
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+
+ this.sma = smaDataList
+
+ this.fetchCsupply(this.params.req, this.radius, this.parmesTime.start, this.parmesTime.end, this.sma)
+
+ this.$addStorageEvent(1, "sma", this.sma);
+
+
+
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts, this.start, this.end)
+
+ },
+
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/csupply/index.vue b/yq/src/views/csupply/index.vue
new file mode 100644
index 0000000..fe6971b
--- /dev/null
+++ b/yq/src/views/csupply/index.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/currencyGroup1/index.js b/yq/src/views/currencyGroup1/index.js
new file mode 100644
index 0000000..4bd704d
--- /dev/null
+++ b/yq/src/views/currencyGroup1/index.js
@@ -0,0 +1,596 @@
+import * as echarts from "echarts";
+import { handelLineType,dataLength, chartsWidth,emptyData, handelSwitchs, handelZoom, fetchBtcPrice, fetchEthPrice, handelWatermark, handelSmaData, getDateArray, handelUsdt } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ params: {
+ req: "utxos2nd",
+ radius: "btc"
+ },
+ utxosLoading: false,
+
+ //折线图配置
+ option: {
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+
+ animation: false,
+ // formatter: function (params) {
+ // var res
+ // res = params[0].axisValueLabel;
+ // res += `${params[0].marker} ${params[0].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[0].value}%
+ // ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ // ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}`;
+
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value / 10000).toFixed(2)} W`
+ }
+ }
+ },
+ {
+
+ position: "right",
+ type: "value",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance < 0.01/ Total",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 5,
+ // data: [],
+ // },
+
+
+
+ ],
+ },
+
+ //折线图配置比率图
+ ratio: {
+
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ var res
+
+ res = params[0].axisValueLabel;
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName} \u00A0\u00A0\u00A0\u00A0 ${Number(parseInt(params[i].value * 1000000) / 1000000)}% `;
+
+ }
+
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 180, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure3`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value).toFixed(3)} %`
+ }
+ }
+ },
+ {
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance < 0.01/ Total",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+
+
+
+ ],
+ },
+
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+
+ this.fetchUtxos(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+
+
+
+ },
+ methods: {
+ //初始化折线图图表
+ inChartsLine() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("utxosLine"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("utxosLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart) this.myChart.resize();
+ // });
+ },
+
+ //初始化比率折线图图表
+ inChartSratioLine() {
+ if (this.myChart3 == null) {
+ this.myChart3 = echarts.init(document.getElementById("ratioLine"));
+ }
+ this.ratio = handelZoom(this.myChart3, this.ratio, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart3.setOption(this.ratio);
+ chartsWidth("ratioLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart3) this.myChart3.resize();;
+ // });
+ },
+
+
+ //请求数据
+ async fetchUtxos(req, radius, start, end, sma) {
+ this.utxosLoading = true
+ let { data } = await this.$API.getNewAddress(req, radius, start, end, sma)
+
+ this.UtxosData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChartsLine, this)
+ if (noData) {
+ // emptyData(data.data, this.option2.series, this.inChartsLine2, this)
+ emptyData(data.data, this.ratio.series, this.inChartSratioLine, this)
+ // emptyData(data.data, this.ratio2.series, this.inChartSratioLine2, this)
+ this.utxosLoading = false
+ return
+ }
+
+ this.start = this.UtxosData[0].dateTime.split("T")[0]
+ this.end = this.UtxosData[this.UtxosData.length - 1].dateTime.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ //添加水印
+ this.option = handelWatermark(this.option)
+ this.ratio = handelWatermark(this.ratio)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+
+
+ let balance0List = []
+ let rate0List = []
+ let xAxisData= []
+ this.UtxosData.forEach(item => {
+ balance0List.push(item.balanceAmount0)
+ rate0List.push((Number(item.rateAmount0)* 100).toFixed(4))
+ xAxisData.push(item.dateTime.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = balance0List
+ this.option.series[1].data = priceData
+ this.ratio.xAxis.data = xAxisData
+ this.ratio.series[0].data =rate0List
+
+
+ this.inChartsLine()
+ this.inChartSratioLine()
+
+
+ this.utxosLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option2, this.option2.series[0].data.length), );
+
+
+ }, 10000)
+
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+
+
+ },
+
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.ratio = handelLineType(this.ratio)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+ this.myChart3.setOption(this.ratio);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[4], this.start, this.end, this.inChartsLine, this, this.btcFlag)
+ fetchBtcPrice("BTC", this.option2.series[4], this.start, this.end, this.inChartsLine2, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[5], this.start, this.end, this.inChartsLine, this, this.ethFlag)
+ fetchEthPrice("ETH", this.option2.series[5], this.start, this.end, this.inChartsLine2, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList, start, end) {
+
+ this.sma = smaDataList
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[4], this.inChartsLine, this.start, this.end)
+ // handelSmaData(smaDataList, this.option2.series[4], this.inChartsLine2, this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/currencyGroup1/index.vue b/yq/src/views/currencyGroup1/index.vue
new file mode 100644
index 0000000..1c6ded8
--- /dev/null
+++ b/yq/src/views/currencyGroup1/index.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
{{$t(`arh.ratio1`)}}
+
{{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
+
{{ $t(`home.figure2`) }}
+
+
{{$t(`arh.ratio2`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/currencyGroup2/index.js b/yq/src/views/currencyGroup2/index.js
new file mode 100644
index 0000000..1e828a8
--- /dev/null
+++ b/yq/src/views/currencyGroup2/index.js
@@ -0,0 +1,596 @@
+import * as echarts from "echarts";
+import { handelLineType,dataLength, chartsWidth,emptyData, handelSwitchs, handelZoom, fetchBtcPrice, fetchEthPrice, handelWatermark, handelSmaData, getDateArray, handelUsdt } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ params: {
+ req: "utxos2nd",
+ radius: "btc"
+ },
+ utxosLoading: false,
+
+ //折线图配置
+ option: {
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+
+ animation: false,
+ // formatter: function (params) {
+ // var res
+ // res = params[0].axisValueLabel;
+ // res += `${params[0].marker} ${params[0].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[0].value}%
+ // ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ // ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}`;
+
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value / 10000).toFixed(2)} W`
+ }
+ }
+ },
+ {
+
+ position: "right",
+ type: "value",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=0.01 and Balance <0.1/ Total",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 5,
+ // data: [],
+ // },
+
+
+
+ ],
+ },
+
+ //折线图配置比率图
+ ratio: {
+
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ var res
+
+ res = params[0].axisValueLabel;
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName} \u00A0\u00A0\u00A0\u00A0 ${Number(parseInt(params[i].value * 1000000) / 1000000)}% `;
+
+ }
+
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 180, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure3`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value).toFixed(3)} %`
+ }
+ }
+ },
+ {
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=0.01 and Balance <0.1/ Total",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+
+
+
+ ],
+ },
+
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+
+ this.fetchUtxos(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+
+
+
+ },
+ methods: {
+ //初始化折线图图表
+ inChartsLine() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("utxosLine"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("utxosLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart) this.myChart.resize();
+ // });
+ },
+
+ //初始化比率折线图图表
+ inChartSratioLine() {
+ if (this.myChart3 == null) {
+ this.myChart3 = echarts.init(document.getElementById("ratioLine"));
+ }
+ this.ratio = handelZoom(this.myChart3, this.ratio, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart3.setOption(this.ratio);
+ chartsWidth("ratioLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart3) this.myChart3.resize();;
+ // });
+ },
+
+
+ //请求数据
+ async fetchUtxos(req, radius, start, end, sma) {
+ this.utxosLoading = true
+ let { data } = await this.$API.getNewAddress(req, radius, start, end, sma)
+
+ this.UtxosData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChartsLine, this)
+ if (noData) {
+ // emptyData(data.data, this.option2.series, this.inChartsLine2, this)
+ emptyData(data.data, this.ratio.series, this.inChartSratioLine, this)
+ // emptyData(data.data, this.ratio2.series, this.inChartSratioLine2, this)
+ this.utxosLoading = false
+ return
+ }
+
+ this.start = this.UtxosData[0].dateTime.split("T")[0]
+ this.end = this.UtxosData[this.UtxosData.length - 1].dateTime.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ //添加水印
+ this.option = handelWatermark(this.option)
+ this.ratio = handelWatermark(this.ratio)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+
+
+ let balance0List = []
+ let rate0List = []
+ let xAxisData= []
+ this.UtxosData.forEach(item => {
+ balance0List.push(item.balanceAmount001)
+ rate0List.push((Number(item.rateAmount001)* 100).toFixed(4))
+ xAxisData.push(item.dateTime.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = balance0List
+ this.option.series[1].data = priceData
+ this.ratio.xAxis.data = xAxisData
+ this.ratio.series[0].data =rate0List
+
+
+ this.inChartsLine()
+ this.inChartSratioLine()
+
+
+ this.utxosLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option2, this.option2.series[0].data.length), );
+
+
+ }, 10000)
+
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+
+
+ },
+
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.ratio = handelLineType(this.ratio)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+ this.myChart3.setOption(this.ratio);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[4], this.start, this.end, this.inChartsLine, this, this.btcFlag)
+ fetchBtcPrice("BTC", this.option2.series[4], this.start, this.end, this.inChartsLine2, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[5], this.start, this.end, this.inChartsLine, this, this.ethFlag)
+ fetchEthPrice("ETH", this.option2.series[5], this.start, this.end, this.inChartsLine2, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList, start, end) {
+
+ this.sma = smaDataList
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[4], this.inChartsLine, this.start, this.end)
+ // handelSmaData(smaDataList, this.option2.series[4], this.inChartsLine2, this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/currencyGroup2/index.vue b/yq/src/views/currencyGroup2/index.vue
new file mode 100644
index 0000000..1c6ded8
--- /dev/null
+++ b/yq/src/views/currencyGroup2/index.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
{{$t(`arh.ratio1`)}}
+
{{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
+
{{ $t(`home.figure2`) }}
+
+
{{$t(`arh.ratio2`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/currencyGroup3/index.js b/yq/src/views/currencyGroup3/index.js
new file mode 100644
index 0000000..dfc69a2
--- /dev/null
+++ b/yq/src/views/currencyGroup3/index.js
@@ -0,0 +1,596 @@
+import * as echarts from "echarts";
+import { handelLineType,dataLength, chartsWidth,emptyData, handelSwitchs, handelZoom, fetchBtcPrice, fetchEthPrice, handelWatermark, handelSmaData, getDateArray, handelUsdt } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ params: {
+ req: "utxos2nd",
+ radius: "btc"
+ },
+ utxosLoading: false,
+
+ //折线图配置
+ option: {
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+
+ animation: false,
+ // formatter: function (params) {
+ // var res
+ // res = params[0].axisValueLabel;
+ // res += `${params[0].marker} ${params[0].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[0].value}%
+ // ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ // ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}`;
+
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value / 10000).toFixed(2)} W`
+ }
+ }
+ },
+ {
+
+ position: "right",
+ type: "value",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=0.1 and Balance <1/ Total",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 5,
+ // data: [],
+ // },
+
+
+
+ ],
+ },
+
+ //折线图配置比率图
+ ratio: {
+
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ var res
+
+ res = params[0].axisValueLabel;
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName} \u00A0\u00A0\u00A0\u00A0 ${Number(parseInt(params[i].value * 1000000) / 1000000)}% `;
+
+ }
+
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 180, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure3`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value).toFixed(3)} %`
+ }
+ }
+ },
+ {
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=0.1 and Balance <1/ Total",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+
+
+
+ ],
+ },
+
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+
+ this.fetchUtxos(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+
+
+
+ },
+ methods: {
+ //初始化折线图图表
+ inChartsLine() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("utxosLine"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("utxosLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart) this.myChart.resize();
+ // });
+ },
+
+ //初始化比率折线图图表
+ inChartSratioLine() {
+ if (this.myChart3 == null) {
+ this.myChart3 = echarts.init(document.getElementById("ratioLine"));
+ }
+ this.ratio = handelZoom(this.myChart3, this.ratio, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart3.setOption(this.ratio);
+ chartsWidth("ratioLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart3) this.myChart3.resize();;
+ // });
+ },
+
+
+ //请求数据
+ async fetchUtxos(req, radius, start, end, sma) {
+ this.utxosLoading = true
+ let { data } = await this.$API.getNewAddress(req, radius, start, end, sma)
+
+ this.UtxosData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChartsLine, this)
+ if (noData) {
+ // emptyData(data.data, this.option2.series, this.inChartsLine2, this)
+ emptyData(data.data, this.ratio.series, this.inChartSratioLine, this)
+ // emptyData(data.data, this.ratio2.series, this.inChartSratioLine2, this)
+ this.utxosLoading = false
+ return
+ }
+
+ this.start = this.UtxosData[0].dateTime.split("T")[0]
+ this.end = this.UtxosData[this.UtxosData.length - 1].dateTime.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ //添加水印
+ this.option = handelWatermark(this.option)
+ this.ratio = handelWatermark(this.ratio)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+
+
+ let balance0List = []
+ let rate0List = []
+ let xAxisData= []
+ this.UtxosData.forEach(item => {
+ balance0List.push(item.balanceAmount01)
+ rate0List.push((Number(item.rateAmount01)* 100).toFixed(4))
+ xAxisData.push(item.dateTime.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = balance0List
+ this.option.series[1].data = priceData
+ this.ratio.xAxis.data = xAxisData
+ this.ratio.series[0].data =rate0List
+
+
+ this.inChartsLine()
+ this.inChartSratioLine()
+
+
+ this.utxosLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option2, this.option2.series[0].data.length), );
+
+
+ }, 10000)
+
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+
+
+ },
+
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.ratio = handelLineType(this.ratio)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+ this.myChart3.setOption(this.ratio);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[4], this.start, this.end, this.inChartsLine, this, this.btcFlag)
+ fetchBtcPrice("BTC", this.option2.series[4], this.start, this.end, this.inChartsLine2, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[5], this.start, this.end, this.inChartsLine, this, this.ethFlag)
+ fetchEthPrice("ETH", this.option2.series[5], this.start, this.end, this.inChartsLine2, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList, start, end) {
+
+ this.sma = smaDataList
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[4], this.inChartsLine, this.start, this.end)
+ // handelSmaData(smaDataList, this.option2.series[4], this.inChartsLine2, this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/currencyGroup3/index.vue b/yq/src/views/currencyGroup3/index.vue
new file mode 100644
index 0000000..1c6ded8
--- /dev/null
+++ b/yq/src/views/currencyGroup3/index.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
{{$t(`arh.ratio1`)}}
+
{{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
+
{{ $t(`home.figure2`) }}
+
+
{{$t(`arh.ratio2`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/currencyGroup4/index.js b/yq/src/views/currencyGroup4/index.js
new file mode 100644
index 0000000..eb07a94
--- /dev/null
+++ b/yq/src/views/currencyGroup4/index.js
@@ -0,0 +1,596 @@
+import * as echarts from "echarts";
+import { handelLineType,dataLength, chartsWidth,emptyData, handelSwitchs, handelZoom, fetchBtcPrice, fetchEthPrice, handelWatermark, handelSmaData, getDateArray, handelUsdt } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ params: {
+ req: "utxos2nd",
+ radius: "btc"
+ },
+ utxosLoading: false,
+
+ //折线图配置
+ option: {
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+
+ animation: false,
+ // formatter: function (params) {
+ // var res
+ // res = params[0].axisValueLabel;
+ // res += `${params[0].marker} ${params[0].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[0].value}%
+ // ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ // ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}`;
+
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value / 10000).toFixed(2)} W`
+ }
+ }
+ },
+ {
+
+ position: "right",
+ type: "value",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=1 and Balance <10/ Total",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 5,
+ // data: [],
+ // },
+
+
+
+ ],
+ },
+
+ //折线图配置比率图
+ ratio: {
+
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ var res
+
+ res = params[0].axisValueLabel;
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName} \u00A0\u00A0\u00A0\u00A0 ${Number(parseInt(params[i].value * 1000000) / 1000000)}% `;
+
+ }
+
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 180, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure3`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value).toFixed(3)} %`
+ }
+ }
+ },
+ {
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=1 and Balance <10/ Total",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+
+
+
+ ],
+ },
+
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+
+ this.fetchUtxos(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+
+
+
+ },
+ methods: {
+ //初始化折线图图表
+ inChartsLine() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("utxosLine"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("utxosLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart) this.myChart.resize();
+ // });
+ },
+
+ //初始化比率折线图图表
+ inChartSratioLine() {
+ if (this.myChart3 == null) {
+ this.myChart3 = echarts.init(document.getElementById("ratioLine"));
+ }
+ this.ratio = handelZoom(this.myChart3, this.ratio, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart3.setOption(this.ratio);
+ chartsWidth("ratioLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart3) this.myChart3.resize();;
+ // });
+ },
+
+
+ //请求数据
+ async fetchUtxos(req, radius, start, end, sma) {
+ this.utxosLoading = true
+ let { data } = await this.$API.getNewAddress(req, radius, start, end, sma)
+
+ this.UtxosData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChartsLine, this)
+ if (noData) {
+ // emptyData(data.data, this.option2.series, this.inChartsLine2, this)
+ emptyData(data.data, this.ratio.series, this.inChartSratioLine, this)
+ // emptyData(data.data, this.ratio2.series, this.inChartSratioLine2, this)
+ this.utxosLoading = false
+ return
+ }
+
+ this.start = this.UtxosData[0].dateTime.split("T")[0]
+ this.end = this.UtxosData[this.UtxosData.length - 1].dateTime.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ //添加水印
+ this.option = handelWatermark(this.option)
+ this.ratio = handelWatermark(this.ratio)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+
+
+ let balance0List = []
+ let rate0List = []
+ let xAxisData= []
+ this.UtxosData.forEach(item => {
+ balance0List.push(item.balanceAmount1)
+ rate0List.push((Number(item.rateAmount1)* 100).toFixed(4))
+ xAxisData.push(item.dateTime.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = balance0List
+ this.option.series[1].data = priceData
+ this.ratio.xAxis.data = xAxisData
+ this.ratio.series[0].data =rate0List
+
+
+ this.inChartsLine()
+ this.inChartSratioLine()
+
+
+ this.utxosLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option2, this.option2.series[0].data.length), );
+
+
+ }, 10000)
+
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+
+
+ },
+
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.ratio = handelLineType(this.ratio)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+ this.myChart3.setOption(this.ratio);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[4], this.start, this.end, this.inChartsLine, this, this.btcFlag)
+ fetchBtcPrice("BTC", this.option2.series[4], this.start, this.end, this.inChartsLine2, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[5], this.start, this.end, this.inChartsLine, this, this.ethFlag)
+ fetchEthPrice("ETH", this.option2.series[5], this.start, this.end, this.inChartsLine2, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList, start, end) {
+
+ this.sma = smaDataList
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[4], this.inChartsLine, this.start, this.end)
+ // handelSmaData(smaDataList, this.option2.series[4], this.inChartsLine2, this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/currencyGroup4/index.vue b/yq/src/views/currencyGroup4/index.vue
new file mode 100644
index 0000000..1c6ded8
--- /dev/null
+++ b/yq/src/views/currencyGroup4/index.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
{{$t(`arh.ratio1`)}}
+
{{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
+
{{ $t(`home.figure2`) }}
+
+
{{$t(`arh.ratio2`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/currencyGroup5/index.js b/yq/src/views/currencyGroup5/index.js
new file mode 100644
index 0000000..8d40c71
--- /dev/null
+++ b/yq/src/views/currencyGroup5/index.js
@@ -0,0 +1,596 @@
+import * as echarts from "echarts";
+import { handelLineType,dataLength, chartsWidth,emptyData, handelSwitchs, handelZoom, fetchBtcPrice, fetchEthPrice, handelWatermark, handelSmaData, getDateArray, handelUsdt } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ params: {
+ req: "utxos2nd",
+ radius: "btc"
+ },
+ utxosLoading: false,
+
+ //折线图配置
+ option: {
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+
+ animation: false,
+ // formatter: function (params) {
+ // var res
+ // res = params[0].axisValueLabel;
+ // res += `${params[0].marker} ${params[0].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[0].value}%
+ // ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ // ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}`;
+
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value / 10000).toFixed(2)} W`
+ }
+ }
+ },
+ {
+
+ position: "right",
+ type: "value",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=10 and Balance <100/ Total",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 5,
+ // data: [],
+ // },
+
+
+
+ ],
+ },
+
+ //折线图配置比率图
+ ratio: {
+
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ var res
+
+ res = params[0].axisValueLabel;
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName} \u00A0\u00A0\u00A0\u00A0 ${Number(parseInt(params[i].value * 1000000) / 1000000)}% `;
+
+ }
+
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 180, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure3`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value).toFixed(3)} %`
+ }
+ }
+ },
+ {
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=10 and Balance <100/ Total",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+
+
+
+ ],
+ },
+
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+
+ this.fetchUtxos(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+
+
+
+ },
+ methods: {
+ //初始化折线图图表
+ inChartsLine() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("utxosLine"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("utxosLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart) this.myChart.resize();
+ // });
+ },
+
+ //初始化比率折线图图表
+ inChartSratioLine() {
+ if (this.myChart3 == null) {
+ this.myChart3 = echarts.init(document.getElementById("ratioLine"));
+ }
+ this.ratio = handelZoom(this.myChart3, this.ratio, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart3.setOption(this.ratio);
+ chartsWidth("ratioLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart3) this.myChart3.resize();;
+ // });
+ },
+
+
+ //请求数据
+ async fetchUtxos(req, radius, start, end, sma) {
+ this.utxosLoading = true
+ let { data } = await this.$API.getNewAddress(req, radius, start, end, sma)
+
+ this.UtxosData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChartsLine, this)
+ if (noData) {
+ // emptyData(data.data, this.option2.series, this.inChartsLine2, this)
+ emptyData(data.data, this.ratio.series, this.inChartSratioLine, this)
+ // emptyData(data.data, this.ratio2.series, this.inChartSratioLine2, this)
+ this.utxosLoading = false
+ return
+ }
+
+ this.start = this.UtxosData[0].dateTime.split("T")[0]
+ this.end = this.UtxosData[this.UtxosData.length - 1].dateTime.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ //添加水印
+ this.option = handelWatermark(this.option)
+ this.ratio = handelWatermark(this.ratio)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+
+
+ let balance0List = []
+ let rate0List = []
+ let xAxisData= []
+ this.UtxosData.forEach(item => {
+ balance0List.push(item.balanceAmount10)
+ rate0List.push((Number(item.rateAmount10)* 100).toFixed(4))
+ xAxisData.push(item.dateTime.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = balance0List
+ this.option.series[1].data = priceData
+ this.ratio.xAxis.data = xAxisData
+ this.ratio.series[0].data =rate0List
+
+
+ this.inChartsLine()
+ this.inChartSratioLine()
+
+
+ this.utxosLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option2, this.option2.series[0].data.length), );
+
+
+ }, 10000)
+
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+
+
+ },
+
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.ratio = handelLineType(this.ratio)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+ this.myChart3.setOption(this.ratio);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[4], this.start, this.end, this.inChartsLine, this, this.btcFlag)
+ fetchBtcPrice("BTC", this.option2.series[4], this.start, this.end, this.inChartsLine2, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[5], this.start, this.end, this.inChartsLine, this, this.ethFlag)
+ fetchEthPrice("ETH", this.option2.series[5], this.start, this.end, this.inChartsLine2, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList, start, end) {
+
+ this.sma = smaDataList
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[4], this.inChartsLine, this.start, this.end)
+ // handelSmaData(smaDataList, this.option2.series[4], this.inChartsLine2, this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/currencyGroup5/index.vue b/yq/src/views/currencyGroup5/index.vue
new file mode 100644
index 0000000..1c6ded8
--- /dev/null
+++ b/yq/src/views/currencyGroup5/index.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
{{$t(`arh.ratio1`)}}
+
{{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
+
{{ $t(`home.figure2`) }}
+
+
{{$t(`arh.ratio2`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/currencyGroup6/index.js b/yq/src/views/currencyGroup6/index.js
new file mode 100644
index 0000000..7eda6d1
--- /dev/null
+++ b/yq/src/views/currencyGroup6/index.js
@@ -0,0 +1,596 @@
+import * as echarts from "echarts";
+import { handelLineType,dataLength, chartsWidth,emptyData, handelSwitchs, handelZoom, fetchBtcPrice, fetchEthPrice, handelWatermark, handelSmaData, getDateArray, handelUsdt } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ params: {
+ req: "utxos2nd",
+ radius: "btc"
+ },
+ utxosLoading: false,
+
+ //折线图配置
+ option: {
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+
+ animation: false,
+ // formatter: function (params) {
+ // var res
+ // res = params[0].axisValueLabel;
+ // res += `${params[0].marker} ${params[0].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[0].value}%
+ // ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ // ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}`;
+
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value / 10000).toFixed(2)} W`
+ }
+ }
+ },
+ {
+
+ position: "right",
+ type: "value",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=100 and Balance <1000/ Total",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 5,
+ // data: [],
+ // },
+
+
+
+ ],
+ },
+
+ //折线图配置比率图
+ ratio: {
+
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ var res
+
+ res = params[0].axisValueLabel;
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName} \u00A0\u00A0\u00A0\u00A0 ${Number(parseInt(params[i].value * 1000000) / 1000000)}% `;
+
+ }
+
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 180, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure3`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value).toFixed(3)} %`
+ }
+ }
+ },
+ {
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=100 and Balance <1000/ Total",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+
+
+
+ ],
+ },
+
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+
+ this.fetchUtxos(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+
+
+
+ },
+ methods: {
+ //初始化折线图图表
+ inChartsLine() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("utxosLine"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("utxosLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart) this.myChart.resize();
+ // });
+ },
+
+ //初始化比率折线图图表
+ inChartSratioLine() {
+ if (this.myChart3 == null) {
+ this.myChart3 = echarts.init(document.getElementById("ratioLine"));
+ }
+ this.ratio = handelZoom(this.myChart3, this.ratio, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart3.setOption(this.ratio);
+ chartsWidth("ratioLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart3) this.myChart3.resize();;
+ // });
+ },
+
+
+ //请求数据
+ async fetchUtxos(req, radius, start, end, sma) {
+ this.utxosLoading = true
+ let { data } = await this.$API.getNewAddress(req, radius, start, end, sma)
+
+ this.UtxosData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChartsLine, this)
+ if (noData) {
+ // emptyData(data.data, this.option2.series, this.inChartsLine2, this)
+ emptyData(data.data, this.ratio.series, this.inChartSratioLine, this)
+ // emptyData(data.data, this.ratio2.series, this.inChartSratioLine2, this)
+ this.utxosLoading = false
+ return
+ }
+
+ this.start = this.UtxosData[0].dateTime.split("T")[0]
+ this.end = this.UtxosData[this.UtxosData.length - 1].dateTime.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ //添加水印
+ this.option = handelWatermark(this.option)
+ this.ratio = handelWatermark(this.ratio)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+
+
+ let balance0List = []
+ let rate0List = []
+ let xAxisData= []
+ this.UtxosData.forEach(item => {
+ balance0List.push(item.balanceAmount100)
+ rate0List.push((Number(item.rateAmount100)* 100).toFixed(4))
+ xAxisData.push(item.dateTime.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = balance0List
+ this.option.series[1].data = priceData
+ this.ratio.xAxis.data = xAxisData
+ this.ratio.series[0].data =rate0List
+
+
+ this.inChartsLine()
+ this.inChartSratioLine()
+
+
+ this.utxosLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option2, this.option2.series[0].data.length), );
+
+
+ }, 10000)
+
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+
+
+ },
+
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.ratio = handelLineType(this.ratio)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+ this.myChart3.setOption(this.ratio);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[4], this.start, this.end, this.inChartsLine, this, this.btcFlag)
+ fetchBtcPrice("BTC", this.option2.series[4], this.start, this.end, this.inChartsLine2, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[5], this.start, this.end, this.inChartsLine, this, this.ethFlag)
+ fetchEthPrice("ETH", this.option2.series[5], this.start, this.end, this.inChartsLine2, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList, start, end) {
+
+ this.sma = smaDataList
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[4], this.inChartsLine, this.start, this.end)
+ // handelSmaData(smaDataList, this.option2.series[4], this.inChartsLine2, this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/currencyGroup6/index.vue b/yq/src/views/currencyGroup6/index.vue
new file mode 100644
index 0000000..1c6ded8
--- /dev/null
+++ b/yq/src/views/currencyGroup6/index.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
{{$t(`arh.ratio1`)}}
+
{{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
+
{{ $t(`home.figure2`) }}
+
+
{{$t(`arh.ratio2`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/currencyGroup7/index.js b/yq/src/views/currencyGroup7/index.js
new file mode 100644
index 0000000..89405be
--- /dev/null
+++ b/yq/src/views/currencyGroup7/index.js
@@ -0,0 +1,596 @@
+import * as echarts from "echarts";
+import { handelLineType,dataLength, chartsWidth,emptyData, handelSwitchs, handelZoom, fetchBtcPrice, fetchEthPrice, handelWatermark, handelSmaData, getDateArray, handelUsdt } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ params: {
+ req: "utxos2nd",
+ radius: "btc"
+ },
+ utxosLoading: false,
+
+ //折线图配置
+ option: {
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+
+ animation: false,
+ // formatter: function (params) {
+ // var res
+ // res = params[0].axisValueLabel;
+ // res += `${params[0].marker} ${params[0].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[0].value}%
+ // ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ // ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}`;
+
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value / 10000).toFixed(2)} W`
+ }
+ }
+ },
+ {
+
+ position: "right",
+ type: "value",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=1000 and Balance <10000/ Total",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 5,
+ // data: [],
+ // },
+
+
+
+ ],
+ },
+
+ //折线图配置比率图
+ ratio: {
+
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ var res
+
+ res = params[0].axisValueLabel;
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName} \u00A0\u00A0\u00A0\u00A0 ${Number(parseInt(params[i].value * 1000000) / 1000000)}% `;
+
+ }
+
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 180, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure3`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value).toFixed(3)} %`
+ }
+ }
+ },
+ {
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=1000 and Balance <10000/ Total",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+
+
+
+ ],
+ },
+
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+
+ this.fetchUtxos(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+
+
+
+ },
+ methods: {
+ //初始化折线图图表
+ inChartsLine() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("utxosLine"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("utxosLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart) this.myChart.resize();
+ // });
+ },
+
+ //初始化比率折线图图表
+ inChartSratioLine() {
+ if (this.myChart3 == null) {
+ this.myChart3 = echarts.init(document.getElementById("ratioLine"));
+ }
+ this.ratio = handelZoom(this.myChart3, this.ratio, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart3.setOption(this.ratio);
+ chartsWidth("ratioLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart3) this.myChart3.resize();;
+ // });
+ },
+
+
+ //请求数据
+ async fetchUtxos(req, radius, start, end, sma) {
+ this.utxosLoading = true
+ let { data } = await this.$API.getNewAddress(req, radius, start, end, sma)
+
+ this.UtxosData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChartsLine, this)
+ if (noData) {
+ // emptyData(data.data, this.option2.series, this.inChartsLine2, this)
+ emptyData(data.data, this.ratio.series, this.inChartSratioLine, this)
+ // emptyData(data.data, this.ratio2.series, this.inChartSratioLine2, this)
+ this.utxosLoading = false
+ return
+ }
+
+ this.start = this.UtxosData[0].dateTime.split("T")[0]
+ this.end = this.UtxosData[this.UtxosData.length - 1].dateTime.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ //添加水印
+ this.option = handelWatermark(this.option)
+ this.ratio = handelWatermark(this.ratio)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+
+
+ let balance0List = []
+ let rate0List = []
+ let xAxisData= []
+ this.UtxosData.forEach(item => {
+ balance0List.push(item.balanceAmount1000)
+ rate0List.push((Number(item.rateAmount1000)* 100).toFixed(4))
+ xAxisData.push(item.dateTime.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = balance0List
+ this.option.series[1].data = priceData
+ this.ratio.xAxis.data = xAxisData
+ this.ratio.series[0].data =rate0List
+
+
+ this.inChartsLine()
+ this.inChartSratioLine()
+
+
+ this.utxosLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option2, this.option2.series[0].data.length), );
+
+
+ }, 10000)
+
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+
+
+ },
+
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.ratio = handelLineType(this.ratio)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+ this.myChart3.setOption(this.ratio);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[4], this.start, this.end, this.inChartsLine, this, this.btcFlag)
+ fetchBtcPrice("BTC", this.option2.series[4], this.start, this.end, this.inChartsLine2, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[5], this.start, this.end, this.inChartsLine, this, this.ethFlag)
+ fetchEthPrice("ETH", this.option2.series[5], this.start, this.end, this.inChartsLine2, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList, start, end) {
+
+ this.sma = smaDataList
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[4], this.inChartsLine, this.start, this.end)
+ // handelSmaData(smaDataList, this.option2.series[4], this.inChartsLine2, this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/currencyGroup7/index.vue b/yq/src/views/currencyGroup7/index.vue
new file mode 100644
index 0000000..1c6ded8
--- /dev/null
+++ b/yq/src/views/currencyGroup7/index.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
{{$t(`arh.ratio1`)}}
+
{{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
+
{{ $t(`home.figure2`) }}
+
+
{{$t(`arh.ratio2`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/currencyGroup8/index.js b/yq/src/views/currencyGroup8/index.js
new file mode 100644
index 0000000..794ffdc
--- /dev/null
+++ b/yq/src/views/currencyGroup8/index.js
@@ -0,0 +1,596 @@
+import * as echarts from "echarts";
+import { handelLineType,dataLength, chartsWidth,emptyData, handelSwitchs, handelZoom, fetchBtcPrice, fetchEthPrice, handelWatermark, handelSmaData, getDateArray, handelUsdt } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ params: {
+ req: "utxos2nd",
+ radius: "btc"
+ },
+ utxosLoading: false,
+
+ //折线图配置
+ option: {
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+
+ animation: false,
+ // formatter: function (params) {
+ // var res
+ // res = params[0].axisValueLabel;
+ // res += `${params[0].marker} ${params[0].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[0].value}%
+ // ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ // ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}`;
+
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value / 10000).toFixed(2)} W`
+ }
+ }
+ },
+ {
+
+ position: "right",
+ type: "value",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=10000/ Total",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 5,
+ // data: [],
+ // },
+
+
+
+ ],
+ },
+
+ //折线图配置比率图
+ ratio: {
+
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ var res
+
+ res = params[0].axisValueLabel;
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName} \u00A0\u00A0\u00A0\u00A0 ${Number(parseInt(params[i].value * 1000000) / 1000000)}% `;
+
+ }
+
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 180, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure3`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value).toFixed(3)} %`
+ }
+ }
+ },
+ {
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ // min: "dataMin",
+ // max: "dataMax",
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance >=10000/ Total",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+
+
+
+ ],
+ },
+
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+
+ this.fetchUtxos(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+
+
+
+ },
+ methods: {
+ //初始化折线图图表
+ inChartsLine() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("utxosLine"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("utxosLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart) this.myChart.resize();
+ // });
+ },
+
+ //初始化比率折线图图表
+ inChartSratioLine() {
+ if (this.myChart3 == null) {
+ this.myChart3 = echarts.init(document.getElementById("ratioLine"));
+ }
+ this.ratio = handelZoom(this.myChart3, this.ratio, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart3.setOption(this.ratio);
+ chartsWidth("ratioLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart3) this.myChart3.resize();;
+ // });
+ },
+
+
+ //请求数据
+ async fetchUtxos(req, radius, start, end, sma) {
+ this.utxosLoading = true
+ let { data } = await this.$API.getNewAddress(req, radius, start, end, sma)
+
+ this.UtxosData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChartsLine, this)
+ if (noData) {
+ // emptyData(data.data, this.option2.series, this.inChartsLine2, this)
+ emptyData(data.data, this.ratio.series, this.inChartSratioLine, this)
+ // emptyData(data.data, this.ratio2.series, this.inChartSratioLine2, this)
+ this.utxosLoading = false
+ return
+ }
+
+ this.start = this.UtxosData[0].dateTime.split("T")[0]
+ this.end = this.UtxosData[this.UtxosData.length - 1].dateTime.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ //添加水印
+ this.option = handelWatermark(this.option)
+ this.ratio = handelWatermark(this.ratio)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+
+
+ let balance0List = []
+ let rate0List = []
+ let xAxisData= []
+ this.UtxosData.forEach(item => {
+ balance0List.push(item.balanceAmount10000)
+ rate0List.push((Number(item.rateAmount10000)* 100).toFixed(4))
+ xAxisData.push(item.dateTime.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = balance0List
+ this.option.series[1].data = priceData
+ this.ratio.xAxis.data = xAxisData
+ this.ratio.series[0].data =rate0List
+
+
+ this.inChartsLine()
+ this.inChartSratioLine()
+
+
+ this.utxosLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option2, this.option2.series[0].data.length), );
+
+
+ }, 10000)
+
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+
+
+ },
+
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.ratio = handelLineType(this.ratio)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+ this.myChart3.setOption(this.ratio);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[4], this.start, this.end, this.inChartsLine, this, this.btcFlag)
+ fetchBtcPrice("BTC", this.option2.series[4], this.start, this.end, this.inChartsLine2, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[5], this.start, this.end, this.inChartsLine, this, this.ethFlag)
+ fetchEthPrice("ETH", this.option2.series[5], this.start, this.end, this.inChartsLine2, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList, start, end) {
+
+ this.sma = smaDataList
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[4], this.inChartsLine, this.start, this.end)
+ // handelSmaData(smaDataList, this.option2.series[4], this.inChartsLine2, this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/currencyGroup8/index.vue b/yq/src/views/currencyGroup8/index.vue
new file mode 100644
index 0000000..1c6ded8
--- /dev/null
+++ b/yq/src/views/currencyGroup8/index.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
{{$t(`arh.ratio1`)}}
+
{{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
+
{{ $t(`home.figure2`) }}
+
+
{{$t(`arh.ratio2`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/cvdd/index.js b/yq/src/views/cvdd/index.js
new file mode 100644
index 0000000..a1f2248
--- /dev/null
+++ b/yq/src/views/cvdd/index.js
@@ -0,0 +1,325 @@
+import * as echarts from "echarts";
+import { fetchCvdd } from "../../api/apiPost"
+import { chartsWidth, emptyData,dataLength,handelProfitrate, handelZoom, handelLineType, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ cvddLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Cumulative Value-Days Destroyed (CVDD)",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ this.fetchCvdd(this.params.req, this.params.radius)
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("cvddBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("cvddBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchCvdd(params) {
+ this.cvddLoading = true
+ const { data } = await fetchCvdd(params)
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.cvddLoading = false
+ return
+ }
+ let cvddData = data.data
+ this.start = cvddData[0].date.split("T")[0]
+ this.end = cvddData[cvddData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ let profitValueList = []
+
+
+ cvddData.forEach(item => {
+
+ profitValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(cvddData, profitValueList)
+
+
+
+ this.inCharts()
+ this.cvddLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchCvdd(this.params)
+
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/cvdd/index.vue b/yq/src/views/cvdd/index.vue
new file mode 100644
index 0000000..6a51084
--- /dev/null
+++ b/yq/src/views/cvdd/index.vue
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/dailyBuySell .vue b/yq/src/views/dailyBuySell .vue
new file mode 100644
index 0000000..ce3b15d
--- /dev/null
+++ b/yq/src/views/dailyBuySell .vue
@@ -0,0 +1,189 @@
+
+
+
+
+ {{ $t(`bian.details`) }}
+
+
+
+
+ {{ formatTime(scope.row.dateTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/dataDisplay/index.js b/yq/src/views/dataDisplay/index.js
new file mode 100644
index 0000000..cd14283
--- /dev/null
+++ b/yq/src/views/dataDisplay/index.js
@@ -0,0 +1,7 @@
+export default{
+ data(){
+ return{
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/dataDisplay/index.vue b/yq/src/views/dataDisplay/index.vue
new file mode 100644
index 0000000..81a6504
--- /dev/null
+++ b/yq/src/views/dataDisplay/index.vue
@@ -0,0 +1,251 @@
+
+
+
+
+
+
欢迎来到 coinbus 数据分析平台
+
+
+
+
+
+
+ 网站主要功能
+
+
+
+
我们的平台提供全面的区块链数据分析服务,包括但不限于以下功能:
+
+
+ 实时监控区块链网络上的交易数据。
+
+
+ 深入分析各种加密货币的市场指标。
+
+
+ 提供大额交易监控,及时掌握重要资金动向。
+
+
+ 分析加密货币的流通量变化趋势。
+
+
+ 对宏观经济与加密货币的关联进行深度剖析。
+
+
+
+
+
+
+
+
+
+ 网站优点
+
+
+
+
关于我们:
+
+
+ 精准的数据来源:我们从可靠的渠道获取数据,确保分析结果的准确性。
+
+
+ 直观的可视化展示:通过清晰的图表和图形,让用户轻松理解复杂的数据。
+
+
+ 个性化的订阅服务:用户可以根据自己的需求定制数据分析报告和通知。
+
+
+ 强大的后台管理:确保数据的安全性和稳定性,同时提供高效的问题处理机制。
+
+
+
+
+
+
+
+
+ 为什么选择我们网站
+
+
+
+
在众多的数据分析平台中,我们脱颖而出的原因有以下几点:
+
+
+ 专业的团队:我们拥有一支经验丰富的数据分析专家和技术团队。
+
+
+ 持续的更新与改进:不断跟进市场动态,为用户提供最新的数据分析和功能。
+
+
+ 用户友好的界面:即使是没有专业技术背景的用户也能轻松上手。
+
+
+ 优质的客户服务:及时响应用户的问题和需求,提供全方位的支持。
+
+
+
+
+
+
+
+
+ 我们的网站是做什么的
+
+
+
+
我们致力于为用户提供专业的区块链数据分析服务,帮助用户更好地理解加密货币市场和区块链技术。通过我们的平台,用户可以:
+
+
+ 深入了解加密货币的价格走势和市场趋势。
+
+
+ 分析区块链网络的安全性和稳定性。
+
+
+ 评估不同加密货币项目的潜力和风险。
+
+
+ 制定更明智的投资决策和风险管理策略。
+
+
+
+
+
+
+
+
+ 包含哪些数据分析
+
+
+
+
我们的平台涵盖了广泛的数据分析内容,包括:
+
+
+ 链上数据:如交易数量、交易金额、活跃地址、长/短期持有者交易量、供应量、盈亏比等。
+
+
+ 市场指标:价格走势、市值、交易量、币价市值排名等。
+
+
+ 交易所数据:交易所的交易量、持仓量、资金流入流出、资金费率等。
+
+
+ 宏观经济数据:与加密货币相关的宏观经济指标分析、纳斯达克指数、GDP、债券、资讯等。
+
+
+ 大额交易监控:跟踪大额交易,分析资金流向。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/dataMonitoring/index.js b/yq/src/views/dataMonitoring/index.js
new file mode 100644
index 0000000..70a200d
--- /dev/null
+++ b/yq/src/views/dataMonitoring/index.js
@@ -0,0 +1,427 @@
+import * as echarts from "echarts";
+import { msgBoradTabel, msgBoradNum, responMsg } from "../../api/messageBoard"
+
+export default {
+ data() {
+ return {
+ tableData: [
+
+ ],
+ msg: "",
+ dialogVisible: false,
+ socketData: null,
+ intervalName: [{
+ value: "1m",
+ label: "1分钟K线"
+ },
+ {
+ value: "3m",
+ label: "3分钟K线"
+ },
+ {
+ value: "5m",
+ label: "5分钟K线"
+ },
+ {
+ value: "15m",
+ label: "15分钟K线"
+ },
+ {
+ value: "30m",
+ label: "30分钟K线"
+ },
+ {
+ value: "1h",
+ label: "1小时K线"
+ },
+ {
+ value: "2h",
+ label: "2小时K线"
+ },
+ {
+ value: "4h",
+ label: "4小时K线"
+ },
+ {
+ value: "6h",
+ label: "6小时K线"
+ },
+ {
+ value: "8h",
+ label: "8小时K线"
+ },
+ {
+ value: "12h",
+ label: "12小时K线"
+ },
+ {
+ value: "1d",
+ label: "1天K线"
+ },
+ {
+ value: "3d",
+ label: "3天K线"
+ },
+ {
+ value: "1w",
+ label: "周K线"
+ },
+ {
+ value: "1M",
+ label: "月K线"
+ },
+
+ ],
+ tablesName: [{
+ value: "btcusdt",
+ label: "U本位BTC合约",
+ },
+ {
+ value: "btcstocks",
+ label: "BTC现货",
+ },
+ {
+ value: "btcusd",
+ label: "币本位BTC合约",
+ },
+ {
+ value: "ethusdt",
+ label: "U本位ETH合约",
+ },
+ {
+ value: "ethstocks",
+ label: "ETH现货",
+ },
+ {
+ value: "ethusd",
+ label: "币本位ETH合约",
+ },
+
+ ],
+ tables: ["btcstocks", "btcusd", "btcusdt", "ethstocks", "ethusd", "ethusdt"],
+ tablesZh: ["BTC现货", "币本位BTC合约", "U本位BTC合约", "ETH现货", "币本位ETH合约", "U本位ETH合约"],
+ ws: null,
+ tableData2: [],
+ timer:null,
+ heartbeat:0,
+ heartbeatDetection:null,//心跳检测
+
+
+ }
+ },
+ mounted() {
+
+
+
+ this.handelWebSocket()
+ },
+ methods: {
+
+ // 连接WebSocket 处理数据
+ handelWebSocket() {
+
+ this.ws = new WebSocket(`ws://18.139.234.105:12345`);
+ //连接成功
+ this.ws.onopen = () => {
+ console.log("连接成功");
+ //连接成功发送消息
+ let obj = {
+ id: 1,
+ channel: "check"
+ }
+ this.ws.send(JSON.stringify(obj))
+ //清除定时器
+ clearInterval(this.timer)
+ clearTimeout(this.heartbeatDetection)
+ //心跳
+ this.timer = setInterval(() => {
+ this.ws.send('ping');
+ this.heartbeat = 0
+ //心跳检测
+ this.heartbeatDetection=setTimeout(()=>{
+ if (this.heartbeat===0) {//心跳断开 重连
+ this.ws = new WebSocket(`ws://18.139.234.105:12345`);
+ }
+ },3000)
+ }, 900*1000); // 15分钟 发送一个心跳包
+
+
+ }
+ //连接失败重连
+ this.ws.onerror = () => {
+ this.heartbeat = 0
+ //清除定时器
+ clearInterval(this.timer)
+ clearTimeout(this.heartbeatDetection)
+ this.ws = new WebSocket(`ws://18.139.234.105:12345`);
+ }
+ this.ws.onmessage = (data) => {//优化做数据验证
+ console.log(data, 65623);
+ if (data.data == "pong") {
+ this.heartbeat = 1 //心跳未断开 赋值
+ }else{
+ this.socketData = JSON.parse(data.data)
+ if (this.socketData.update_time) {//确认有值 在初始化结构对象
+ //初始化数据结构对象
+ this.handelTables()
+ }
+
+ this.tableData.forEach(item => {//赋值显示
+ if (item.interval == this.socketData.interval) {
+ item.newTime = this.socketData.update_interval //更新时间
+ item.time = this.socketData.update_time//查询时间
+ item.update_interval = this.socketData.update_interval//更新间隔
+ this.socketData.tables.forEach(subItem => {
+ if (subItem.name == item.currency) {
+ item.tableTime = subItem.time
+ }
+
+ })
+
+
+ }
+ //状态赋值
+ switch (item.interval) {
+ case "1m":
+ let queryTime
+ let updateTime
+ let interval
+ interval = 60 * 1000
+ queryTime = new Date(item.time).getTime();
+ updateTime = new Date(item.tableTime).getTime();
+
+ if (item.time && (updateTime + interval) > queryTime) {
+ item.state = "正常"
+ } else {
+ item.state = "异常"
+ }
+
+ break;
+ case "3m":
+
+ let interval3 = 3 * 60 * 1000
+
+ if (item.time && (new Date(item.tableTime).getTime() + interval3) > new Date(item.time).getTime()) {
+ item.state = "正常"
+ } else {
+ item.state = "异常"
+ }
+
+ break;
+ case "5m":
+ let interval5 = 5 * 60 * 1000
+ if (item.time && (new Date(item.tableTime).getTime() + interval5) > new Date(item.time).getTime()) {
+ item.state = "正常"
+ } else {
+ item.state = "异常"
+ }
+
+ break;
+ case "15m":
+ let interval15 = 15 * 60 * 1000
+ if (item.time && (new Date(item.tableTime).getTime() + interval15) > new Date(item.time).getTime()) {
+ item.state = "正常"
+ } else {
+ item.state = "异常"
+ }
+
+ break;
+ case "30m":
+ let interval30 = 30 * 60 * 1000
+ if (item.time && (new Date(item.tableTime).getTime() + interval30) > new Date(item.time).getTime()) {
+ item.state = "正常"
+ } else {
+ item.state = "异常"
+ }
+
+ break;
+ case "1h":
+ let interval1h = 60 * 60 * 1000
+ if (item.time && (new Date(item.tableTime).getTime() + interval1h) > new Date(item.time).getTime()) {
+ item.state = "正常"
+ } else {
+ item.state = "异常"
+ }
+
+ break;
+ case "2h":
+ let interval2h = 2 * 60 * 60 * 1000
+ if (item.time && (new Date(item.tableTime).getTime() + interval2h) > new Date(item.time).getTime()) {
+ item.state = "正常"
+ } else {
+ item.state = "异常"
+ }
+
+ break;
+ case "4h":
+
+ let interval4h = 4 * 60 * 60 * 1000
+ if (item.time && (new Date(item.tableTime).getTime() + interval4h) > new Date(item.time).getTime()) {
+ item.state = "正常"
+ } else {
+ item.state = "异常"
+ }
+
+ break;
+ case "6h":
+ let interval6h = 6 * 60 * 60 * 1000
+ if (item.time && (new Date(item.tableTime).getTime() + interval6h) > new Date(item.time).getTime()) {
+ item.state = "正常"
+ } else {
+ item.state = "异常"
+ }
+
+ break;
+ case "8h":
+ let interval8h = 8 * 60 * 60 * 1000
+ if (item.time && (new Date(item.tableTime).getTime() + interval8h) > new Date(item.time).getTime()) {
+ item.state = "正常"
+ } else {
+ item.state = "异常"
+ }
+
+ break;
+ case "12h":
+ let interval12h = 12 * 60 * 60 * 1000
+ if (item.time && (new Date(item.tableTime).getTime() + interval12h) > new Date(item.time).getTime()) {
+ item.state = "正常"
+ } else {
+ item.state = "异常"
+ }
+
+ break;
+ case "1d":
+ let interval1d = 24 * 60 * 60 * 1000
+ if (item.time && (new Date(item.tableTime).getTime() + interval1d) > new Date(item.time).getTime()) {
+ item.state = "正常"
+ } else {
+ item.state = "异常"
+ }
+
+ break;
+ case "3d":
+ let interval3d = 3 * 24 * 60 * 60 * 1000
+ if (item.time && (new Date(item.tableTime).getTime() + interval3d) > new Date(item.time).getTime()) {
+ item.state = "正常"
+ } else {
+ item.state = "异常"
+ }
+
+ break;
+ case "1w":
+ let interval1w = 7 * 24 * 60 * 60 * 1000
+ if (item.time && (new Date(item.tableTime).getTime() + interval1w) > new Date(item.time).getTime()) {
+ item.state = "正常"
+ } else {
+ item.state = "异常"
+ }
+
+ break;
+ case "1M":
+ let interval1M = 30 * 24 * 60 * 60 * 1000
+ if (item.time && (new Date(item.tableTime).getTime() + interval1M) > new Date(item.time).getTime()) {
+ item.state = "正常"
+ } else {
+ item.state = "异常"
+ }
+ break;
+ default:
+
+ break;
+ }
+ //异常状态排序
+ let state = "异常"
+ this.tableData.sort((a, b) => {
+ if (a.time && b.time) {//保证有值得情况下在排序
+ if (a.state === state && b.state !== state) {
+ return -1; // a 在前
+ }
+ if (a.state !== state && b.state === state) { // 如果 b 的 state 值等于指定值,而 a 的不等于
+ return 1; // b 在前
+ }
+
+ return 0; // 保持原来的顺序
+ }
+
+ })
+
+ })
+ //过滤空数据
+ this.tableData2 = this.tableData.filter(item => item.newTime)
+
+ }
+
+
+ // 判断消息类型,如果是心跳包则进行处理
+ // if (this.socketData.type === 'ping') {
+ // const pongData = { type: 'pong' };
+ // socket.send(JSON.stringify(pongData));
+ // lastHeartbeatTime = Date.now();
+ // }
+
+
+
+
+ }
+
+
+
+ },
+ //处理表格对象动态生成
+ handelTables() {
+ if (this.tableData.length > 0) return //判断有值不在重复初始化
+ this.intervalName.forEach((item, index) => {
+ for (let i = 0; i < this.tables.length; i++) {
+ let obj = {}
+ obj[this.tables[i]] = ""
+ obj.name = `${this.tablesZh[i]} ${item.label}`
+ obj.time = ""
+ obj.interval = item.value
+ obj.newTime = ""
+ obj.state = ""
+ obj.update_interval = ""
+ obj.currency = this.tables[i]
+ obj.tableTime = ""
+
+ this.tableData.push(obj)
+ }
+
+ });
+
+ },
+
+ cellStyle(row) {//改变正常异常颜色
+ if (row.row.state == "正常" && row.column.label === "状态") {
+ return "color:#000"
+ } else if (row.row.state == "异常" && row.column.label === "状态") {
+ return "color:red"
+ }
+ },
+ //定时向服务器发送心跳信息
+ onSend(socket) {
+ const heartbeatInterval = 10000; // 心跳间隔,单位毫秒
+ const pingData = { type: 'ping' }; // 心跳包数据
+
+ let lastHeartbeatTime; // 上次心跳时间
+
+ const sendPing = () => {
+ socket.send(JSON.stringify(pingData));
+ lastHeartbeatTime = Date.now();
+ };
+ setInterval(sendPing, heartbeatInterval);
+ }
+
+ },
+ beforeDestroy() {
+ //关闭WebSocket
+ if (this.ws) {
+ this.ws.close();
+
+ }
+ },
+
+
+
+
+
+}
\ No newline at end of file
diff --git a/yq/src/views/dataMonitoring/index.vue b/yq/src/views/dataMonitoring/index.vue
new file mode 100644
index 0000000..076a132
--- /dev/null
+++ b/yq/src/views/dataMonitoring/index.vue
@@ -0,0 +1,132 @@
+
+
+
+
+
+ {{ $t(`menu.dataMonitoring`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ msg }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/demo copy/index.js b/yq/src/views/demo copy/index.js
new file mode 100644
index 0000000..220a527
--- /dev/null
+++ b/yq/src/views/demo copy/index.js
@@ -0,0 +1,8 @@
+import * as echarts from "echarts";
+export default {
+ data(){
+ return {
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/demo copy/index.vue b/yq/src/views/demo copy/index.vue
new file mode 100644
index 0000000..390b29b
--- /dev/null
+++ b/yq/src/views/demo copy/index.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/demo.vue b/yq/src/views/demo.vue
new file mode 100644
index 0000000..69ea7f2
--- /dev/null
+++ b/yq/src/views/demo.vue
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/diffData/index.js b/yq/src/views/diffData/index.js
new file mode 100644
index 0000000..4ac9f86
--- /dev/null
+++ b/yq/src/views/diffData/index.js
@@ -0,0 +1,415 @@
+import * as echarts from "echarts";
+import { handelWatermark, chartsWidth ,emptyData} from "../../util/processingData"
+export default {
+ data() {
+ return {
+ // option: {
+ // animation: false,
+ // title: {
+ // text: "",
+ // left: "center",
+ // textStyle: {
+ // fontSize: 15,
+ // fontWeight: "normal"
+ // },
+ // },
+ // grid: {
+ // right: 80,
+ // },
+ // tooltip: {
+ // trigger: "axis",
+ // textStyle: {
+ // align: "left",
+ // },
+ // axisPointer: {
+ // type: "cross",
+ // crossStyle: {
+ // color: "#999",
+ // },
+ // },
+ // },
+ // xAxis: {
+ // data:[],
+ // // splitLine: {
+ // // color: "rgba(0,0,0,0.1)"
+ // // },
+ // // boundaryGap:true,
+ // axisLabel: {
+ // formatter: function (a) {
+ // let value = a / 1000
+ // return `${value}k`
+ // }
+ // }
+ // },
+ // yAxis: {
+ // position: "left",
+ // // offset:3,//Y轴偏移
+
+ // //网格线设置
+ // // splitLine: {
+ // // color: "rgba(0,0,0,0.1)",
+ // // },
+ // // axisTick: {
+ // // color: "red"
+ // // },
+ // axisLabel: {
+ // formatter: function (value) {
+
+ // let label = value / 1000000
+ // return `${label}M`
+ // },
+ // },
+ // // axisLine:{
+ // // onZero:false
+ // // }
+ // },
+ // dataZoom: [
+ // {
+ // show: false,
+ // type: 'inside',
+ // minSpan: 30,
+ // start: 10,
+ // end: 95
+ // },
+ // {
+ // show: false,
+ // type: 'inside',
+ // start: 10,
+ // end: 95
+ // // filterMode: 'none',
+ // // minSpan: 0.1,
+ // // maxSpan: 99,
+ // // yAxisIndex: [0],
+ // // startValue: -20,
+ // // endValue: 20
+ // }
+ // ],
+ // series: [
+ // {
+ // type: 'bar',
+ // showSymbol: false,
+ // // clip: true,
+ // data: [],
+ // itemStyle: {
+ // color: "#fdaa56",
+ // },
+ // }
+ // ]
+ // },
+ params: {
+ req: "",
+ radius: "btc"
+ },
+ diffData: [],
+ diffDataLoading: false,
+ introduce: "",
+ xData: [],
+ value1: "",
+ //柱状图配置
+ columnar: {
+ title: {
+ text: "",
+ left: "center",
+ textStyle: {
+ fontSize: 15,
+ fontWeight: "normal"
+ },
+ },
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ { type: "inside",
+ start: 0,
+ end: 100,
+ },
+ ],
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ axisPointer: {
+ type: "cross",
+ crossStyle: {
+ color: "#999",
+ },
+ },
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i <= params.length - 1; i++) {
+ // res += `${params[i].marker} ${params[i].value[1]} ${params[i].seriesName}`;
+ // }
+ // return "111";
+ // },
+ },
+
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ xAxis: [
+ {
+
+ // type: "category",
+ data: [],
+ axisLabel: {
+ formatter: function (a) {
+ let value = a / 1000
+ return `${value}k`
+ }
+ }
+
+ },
+
+ ],
+ yAxis: [
+ {
+ type: "value",
+ // name: "Precipitation",
+ // min: 0,
+ // max: 250,
+ // interval: 50,
+ // axisLabel: {
+ // formatter: function (value) {
+
+ // let label = value / 1000000
+ // return `${label}M`
+ // },
+ // },
+ },
+
+ ],
+ series: [
+ {
+
+ type: "bar",
+ colorBy: "data",
+ // tooltip: {
+ // valueFormatter: function (value) {
+ // return value + " ml";
+ // },
+ // },
+ data: [],
+ itemStyle: {
+ color: "#fdaa56",
+ },
+ },
+ // {
+ // name: "Change 24h",
+ // type: "bar",
+ // itemStyle: {
+ // color: "#607d8b",
+ // },
+ // // tooltip: {
+ // // valueFormatter: function (value) {
+ // // return value + " ml";
+ // // },
+ // // },
+ // data: [],
+ // },
+
+ ],
+ },
+ DateTime: "",
+ pickerOptions: {
+ disabledDate: (time) => {
+ return time.getTime() > new Date(this.DateTime).getTime()
+ },
+ },
+
+ }
+ },
+ // created() {
+ // this.onOption();
+ // },
+ mounted() {
+
+ let menuObj = localStorage.getItem("params");
+ this.params.req = JSON.parse(menuObj).componentReq;
+ this.introduce = JSON.parse(menuObj).introduce;
+
+ //监听localstorage变化
+ window.addEventListener("setItem", () => {
+ let menuObj = localStorage.getItem("params");
+ this.params.req = JSON.parse(menuObj).componentReq;
+ this.introduce = JSON.parse(menuObj).introduce;
+
+ });
+ },
+ watch: {
+ params: {
+ handler(val) {
+ if (val.req == "getDiffData" || val.req == "getDiffAmountData") {
+ this.params.req = val.req
+ this.fetchDiffData(this.params.req, this.params.radius)
+ this.value1 = ""
+ } else {
+ return
+ }
+ },
+ deep: true,
+
+
+ }
+ },
+ methods: {
+ //初始化柱状图图表
+ inCharts() {
+ this.myChart = echarts.init(document.getElementById("diffData"));
+
+ this.myChart.setOption(this.columnar);
+ chartsWidth("diffData", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchDiffData(req, radius, start) {
+ this.diffDataLoading = true
+ const { data } = await this.$API.getHolder(req, radius, start)
+ this.diffData = data.data.list
+ //空数据处理
+ let noData = emptyData(this.diffData, this.columnar.series, this.inCharts, this)
+ if (noData) {
+ this.diffDataLoading = false
+ return
+ }
+ this.columnar.xAxis[0].data.length = 0
+ this.columnar.series[0].data.length = 0
+ this.columnar.title.text = data.data.date
+ this.DateTime = data.data.date
+
+ //添加水印
+ this.columnar = handelWatermark(this.columnar)
+ //key改成对应数字
+ this.diffData.forEach(item => {
+ if (req == "getDiffData") {
+ item.key = Number(item.key.split("f")[2])
+ } else {
+ item.key = Number(item.key.split("t")[1])
+ }
+
+
+ })
+ //数组根据Key排序
+ let newArr = this.sortKey(this.diffData, 'key')
+ newArr.forEach(item => {
+
+ this.columnar.xAxis[0].data.push(item.key.toString())
+ this.columnar.series[0].data.push(Number(item.value).toFixed(2))
+ })
+
+ // let obj = {}
+ //obj 根据key排序
+ // let res = this.objectToArray({ ...this.diffData })
+ // console.log({ ...this.diffData },"及第三方1技术附件");
+ // for (let index = res.length - 1; index > -1; index--) {
+ // let a = res[index]
+ // obj[a[0]] = a[1]
+ // }
+ //对象转数组
+ // let arr = Object.entries(obj)
+ // let newData = []
+ // arr.forEach(item => {
+ // if (item[0] == "id" || item[0] == "date") {
+ // if (item[0] == "date") {
+ // let time = item[1].split("T")[0]
+ // this.option.title.text = `${time}`
+ // }
+ // return
+
+ // } else {
+ // if (item[0].split("t")[0] == "diffAmoun") {//getDiffAmountData 页面数据
+ // if (item[0].split("M")[0]=="diffAmount") {//负数
+ // item[0] = Number(`-${item[0].split("M")[1]}`)
+ // }else{
+ // item[0] = Number(item[0].split("t")[1])
+ // }
+ // } else {//getDiffData 页面数据
+ // if (item[0].split("M")[0] == "diff") {
+ // item[0] = Number(`-${item[0].split("M")[1]}`)
+
+ // } else {
+
+ // item[0] = Number(item[0].split("ff")[1])
+
+ // }
+ // }
+ // newData.push(item)
+ // }
+ // })
+
+ // this.option.series[0].data = newData
+
+ this.inCharts()
+
+ console.log(this.columnar, 556);
+ this.diffDataLoading = false
+ },
+
+ formatName(name) {
+ let arr = [...name]
+ let a
+ for (let i = 0; i < arr.length; i++) {
+ if (!isNaN(arr[i])) {
+ let str = name.slice(i) //这是数字
+ if (arr[i - 1] === 'M') {
+ return {
+ isM: true,
+ value: str,
+ name
+ }
+ } else {
+ return {
+ isM: false,
+ value: str,
+ name
+ }
+ }
+ }
+ }
+ },
+ objectToArray(obj = {}) {
+ const res = [];
+ const keys = Object.keys(obj);
+
+ for (let key of keys) {
+ res.push([
+ key, obj[key]
+ ]);
+ };
+ return res;
+ },
+
+ func(x) {
+ x /= 10;
+ return Math.sin(x) * Math.cos(x * 2 + 1) * Math.sin(x * 3 + 2) * 50;
+ },
+ generateData() {
+ let data = [];
+ for (let i = -200; i <= 200; i += 0.1) {
+ data.push([i, this.func(i)]);
+ }
+ return data;
+ },
+ //时间选择
+ handeldate() {
+
+ this.fetchDiffData(this.params.req, this.params.radius, this.value1)
+ },
+ //数组Key排序
+ sortKey(array, key) {
+ return array.sort(function (a, b) {
+ var x = a[key];
+ var y = b[key];
+ return ((x < y) ? -1 : (x > y) ? 1 : 0)
+ })
+ },
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/diffData/index.vue b/yq/src/views/diffData/index.vue
new file mode 100644
index 0000000..c8af8a8
--- /dev/null
+++ b/yq/src/views/diffData/index.vue
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/distributionEth/index.js b/yq/src/views/distributionEth/index.js
new file mode 100644
index 0000000..f8895b6
--- /dev/null
+++ b/yq/src/views/distributionEth/index.js
@@ -0,0 +1,512 @@
+import * as echarts from "echarts";
+import { getDistributionEth, } from "../../api/pages"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ distributionEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}M `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: true,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: true,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "balance >= 0 and balance < 1",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#aa3550",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 5,
+ lineStyle: {
+ //线条样式
+ color: "#aa3550",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "balance >= 1 and balance < 10 ",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "balance >= 10 and balance < 100",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#40200d",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 1,
+ lineStyle: {
+ //线条样式
+ color: "#40200d",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "balance >= 100 and balance < 1000",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#13a72c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 2,
+ lineStyle: {
+ //线条样式
+ color: "#13a72c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "balance >= 1000 and balance < 10000",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#595856",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 3,
+ lineStyle: {
+ //线条样式
+ color: "#595856",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "balance >= 10000",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#1d2088",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 4,
+ lineStyle: {
+ //线条样式
+ color: "#1d2088",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 8,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 9,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchDistributionEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("distributionEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("distributionEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchDistributionEth(params) {
+ this.distributionEthLoading = true
+ const { data } = await getDistributionEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.distributionEthLoading = false
+ return
+ }
+ let distributionEthData = data.data
+ this.start = distributionEthData[0].date.split("T")[0]
+ this.end = distributionEthData[distributionEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+ this.handelSonEthPrice("ETH", true)
+ let balance1ValueList = []
+ let balance1kValueList = []
+ let balance10ValueList = []
+ let balance10kValueList = []
+ let balance100ValueList = []
+ let nozeroValueList = []
+
+
+ distributionEthData.forEach(item => {
+
+ balance1ValueList.push(Number(item.balance1.toFixed(2)))
+ balance1kValueList.push(Number(item.balance1k.toFixed(2)))
+ balance10ValueList.push(Number(item.balance10.toFixed(2)))
+ balance10kValueList.push(Number(item.balance10k.toFixed(2)))
+ balance100ValueList.push(Number(item.balance100.toFixed(2)))
+ nozeroValueList.push(Number(item.nozero.toFixed(2)))
+
+
+ })
+ this.option.series[1].data = handelProfitrate(distributionEthData, balance1ValueList)
+ this.option.series[2].data = handelProfitrate(distributionEthData, balance10ValueList)
+ this.option.series[3].data = handelProfitrate(distributionEthData, balance100ValueList)
+ this.option.series[4].data = handelProfitrate(distributionEthData, balance1kValueList)
+ this.option.series[5].data = handelProfitrate(distributionEthData, balance10kValueList)
+ this.option.series[0].data = handelProfitrate(distributionEthData, nozeroValueList)
+
+
+ this.inCharts()
+
+ this.distributionEthLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchDistributionEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[6], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[6], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchDistributionEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/distributionEth/index.vue b/yq/src/views/distributionEth/index.vue
new file mode 100644
index 0000000..9c81e2b
--- /dev/null
+++ b/yq/src/views/distributionEth/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/distributionLthSth/index.js b/yq/src/views/distributionLthSth/index.js
new file mode 100644
index 0000000..a67f19c
--- /dev/null
+++ b/yq/src/views/distributionLthSth/index.js
@@ -0,0 +1,476 @@
+import * as echarts from "echarts";
+import { DistributionLthSth } from "../../api/apiPost"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ distributionLthSthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "LTH Profit Supply",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ // stack: 'Total',
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ // color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ color: 'rgb(55, 162, 255)',
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ // color: "#f7864c",
+ width: "0",
+ color: 'rgb(55, 162, 255)',
+ },
+ data: [],
+ areaStyle: {
+ opacity: 0.8,
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 0,
+ color: 'rgb(55, 162, 255)'
+ },
+ {
+ offset: 1,
+ color: 'rgb(116, 21, 219)'
+ }
+ ])
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ },
+ {
+ name: "LTH Loss Supply",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ // stack: 'Total',
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ // color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ color: 'rgb(255, 0, 135)',
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "0",
+ color: 'rgb(255, 0, 135)',
+ },
+ data: [],
+ areaStyle: {
+ opacity: 0.8,
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 0,
+ color: 'rgb(255, 0, 135)'
+ },
+ {
+ offset: 1,
+ color: 'rgb(135, 0, 157)'
+ }
+ ])
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ },
+ {
+ name: "STH Profit Supply",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ // stack: 'Total',
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ // color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ color: 'rgb(255, 191, 0)'
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ // color: "#f7864c",
+ width: "0",
+ color: 'rgb(255, 191, 0)'
+ },
+ data: [],
+ areaStyle: {
+ opacity: 0.8,
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 0,
+ color: 'rgb(255, 191, 0)'
+ },
+ {
+ offset: 1,
+ color: 'rgb(224, 62, 76)'
+ }
+ ])
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ },
+ {
+ name: "STH Loss Supply",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ // stack: 'Total',
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ // color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ color: '#ecabc1',
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ // color: "#f7864c",
+ width: "0",
+ color: '#ecabc1',
+ },
+ data: [],
+ areaStyle: {
+ opacity: 0.8,
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 0,
+ color: '#ecabc1'
+ },
+ {
+ offset: 1,
+ color: '#ecabc1'
+ }
+ ])
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ this.fetchDistributionLthSth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("distributionLthSthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("distributionLthSthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchDistributionLthSth(params) {
+ this.distributionLthSthLoading = true
+ const { data } = await DistributionLthSth(params)
+
+ let distributionLthSthData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.distributionLthSthLoading = false
+ return
+ }
+ this.start = distributionLthSthData[0].date.split("T")[0]
+ this.end = distributionLthSthData[distributionLthSthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ let lthProfitSuppValueList = []
+ let lthLossSupplyValueList = []
+ let sthProfitSupplyValueList = []
+ let sthLossSupplyValueList = []
+
+
+ distributionLthSthData.forEach(item => {
+
+ lthProfitSuppValueList.push(Number(item.lthProfitSupply.toFixed(2)))
+ lthLossSupplyValueList.push(Number(item.lthLossSupply.toFixed(2)))
+ sthProfitSupplyValueList.push(Number(item.sthProfitSupply.toFixed(2)))
+ sthLossSupplyValueList.push(Number(item.sthLossSupply.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(distributionLthSthData, lthProfitSuppValueList)
+ this.option.series[1].data = handelProfitrate(distributionLthSthData, lthLossSupplyValueList)
+ this.option.series[2].data = handelProfitrate(distributionLthSthData, sthProfitSupplyValueList)
+ this.option.series[3].data = handelProfitrate(distributionLthSthData, sthLossSupplyValueList)
+
+
+
+
+
+ this.inCharts()
+ this.distributionLthSthLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[4], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[5], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchDistributionLthSth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/distributionLthSth/index.vue b/yq/src/views/distributionLthSth/index.vue
new file mode 100644
index 0000000..b0a1893
--- /dev/null
+++ b/yq/src/views/distributionLthSth/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/dormancy/index.js b/yq/src/views/dormancy/index.js
new file mode 100644
index 0000000..15a1344
--- /dev/null
+++ b/yq/src/views/dormancy/index.js
@@ -0,0 +1,731 @@
+import * as echarts from "echarts";
+import { getDormancy2 } from "@/api/realTimeData"
+import { chartsWidth, emptyData, dataLength, handelProfitrate, handelZoom, handelLineType, handelSwitchs, handelWatermark, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer: null,
+ dormancyLoading: false,
+ params: {
+ req: "dormancy",
+ radius: "btc"
+ },
+ dormancyData: [],
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ formatter: function (name) {
+
+ return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ },
+ // data:[`sopr`,'asopr','easopr','lthsopr','sthsopr',],
+ // selected:{
+ // 'asopr': false,
+ // 'easopr': false,
+ // 'lthsopr': false,
+ // 'sthsopr': false,
+ // }
+ },
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ // axisLabel: {
+ // formatter: function (e) {
+
+ // let value;
+ // if (e > 1000000) {
+ // value = e / 100000;
+ // } else if (e > 100000) {
+ // value = e / 1000;
+ // } else {
+ // value = e / 100;
+ // }
+ // return value;
+ // },
+ // },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Dormancy",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ // {
+ // name: "saDormancy",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // showSymbol: false,
+ // symbolSize: 5,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#3ba173",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#3ba173",
+ // width: "1",
+ // },
+ // yAxisIndex: 1,
+ // data: [],
+ // },
+ {
+ name: "Dormancy(CE)",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#9a60b4",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#9a60b4",
+ width: "1",
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ // markLine: {
+ // symbol: ["none", "none"], //去掉箭头
+ // itemStyle: {
+ // normal: {
+ // lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ // },
+ // },
+ // // lineStyle:{
+ // // color:"red"
+ // // },
+
+ // label: {
+ // formatter: "{b}",
+ // fontSize: 10,
+ // color: "rgba(0,0,0,0.8)",
+ // align: "left",
+ // },
+ // data: [
+ // // {
+ // // name: "0",
+ // // yAxis: 0,
+ // // },
+ // // {
+ // // name: "$40W",
+ // // yAxis: 400000,
+ // // },
+ // {
+ // name: "$70W",
+ // yAxis: 700000,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+
+ // {
+ // name: "$10W",
+ // yAxis: 100000,
+ // },
+ // {
+ // name: "$100W",
+ // yAxis: 1000000,
+ // // position: ['100%', '50'],
+ // },
+ // {
+ // name: "$120W",
+ // yAxis: 1200000,
+ // },
+
+ // {
+ // name: "$140W",
+ // yAxis: 1400000,
+ // },
+ // ],
+ // },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ option2: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ formatter: function (name) {
+
+ return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ },
+ // data:[`sopr`,'asopr','easopr','lthsopr','sthsopr',],
+ // selected:{
+ // 'asopr': false,
+ // 'easopr': false,
+ // 'lthsopr': false,
+ // 'sthsopr': false,
+ // }
+ },
+ xAxis: {
+ type: "category",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ // axisLabel: {
+ // formatter: function (e) {
+
+ // let value;
+ // if (e > 1000000) {
+ // value = e / 100000;
+ // } else if (e > 100000) {
+ // value = e / 1000;
+ // } else {
+ // value = e / 100;
+ // }
+ // return value;
+ // },
+ // },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Dormancy",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "eaDormancy",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#9a60b4",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#9a60b4",
+ width: "1",
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ markLine: {
+ symbol: ["none", "none"], //去掉箭头
+ itemStyle: {
+ normal: {
+ lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ },
+ },
+ // lineStyle:{
+ // color:"red"
+ // },
+
+ label: {
+ formatter: "{b}",
+ fontSize: 10,
+ color: "rgba(0,0,0,0.8)",
+ align: "left",
+ },
+ data: [
+ // {
+ // name: "0",
+ // yAxis: 0,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+ {
+ name: "$70W",
+ yAxis: 700000,
+ },
+ {
+ name: "$40W",
+ yAxis: 400000,
+ },
+
+ {
+ name: "$10W",
+ yAxis: 100000,
+ },
+ {
+ name: "$100W",
+ yAxis: 1000000,
+ // position: ['100%', '50'],
+ },
+ {
+ name: "$120W",
+ yAxis: 1200000,
+ },
+
+ {
+ name: "$140W",
+ yAxis: 1400000,
+ },
+ ],
+ },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ parmesTime: {
+ start: "",
+ end: ""
+ },
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+ dataSelection: [
+ {
+ value: "1d",
+ label: "home.day1",
+ disabled: false,
+ authority: "guest",
+ grade: 1,
+ },
+ {
+ value: "realTime",
+ label: "home.realTimeData",
+ disabled: false,
+ authority: "vip",
+ grade: 4,
+ },
+ ],
+ realTimeData: "",
+ }
+ },
+ mounted() {
+ this.fetchDormancy(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ handleSelect(activeValue) {
+ if (activeValue == "1d") {
+ this.realTimeData = false
+ this.fetchDormancy(this.params.req, this.params.radius)
+ } else {
+ this.realTimeData = true
+ this.fetchDormancy2()
+ }
+ },
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("dormancyBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("dormancyBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ //初始化图表
+ inCharts2() {
+ if (this.myChart2 == null) {
+ this.myChart2 = echarts.init(document.getElementById("dormancyBox"));
+ }
+ this.option2 = handelZoom(this.myChart2, this.option2, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart2.setOption(this.option2);
+ chartsWidth("dormancyBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart2) this.myChart2.resize();
+ });
+ },
+ //实时数据
+ async fetchDormancy2() {
+ const { data } = await getDormancy2()
+ let Dormancy2Data = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.dormancyLoading = false
+ return
+ }
+
+ this.option2 = handelWatermark(this.option2)
+ let dormancy =[]
+ let eadormancy =[]
+ let xAxisData=[]
+ let price=[]
+ Dormancy2Data.forEach(item=>{
+ item.date=`${item.date.split("T")[0]} ${
+ item.date.split("T")[1].split(`.`)[0]
+ } `;
+ dormancy.push(item.dormancy.toFixed(2))
+ eadormancy.push(item.eadormancy.toFixed(2))
+ xAxisData.push(item.date)
+ price.push(item.price.toFixed(2))
+ })
+
+ this.option2.xAxis.data = xAxisData
+ this.option2.series[0].data = dormancy
+ this.option2.series[1].data = eadormancy
+ this.option2.series[2].data = price
+ this.myChart.clear()
+ console.log();
+ this.inCharts2()
+ },
+
+ async fetchDormancy(req, radius, start, end, sma) {
+ this.dormancyLoading = true
+ const { data } = await this.$API.getDormancy(req, radius, start, end, sma)
+ this.dormancyData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.dormancyLoading = false
+ return
+ }
+ this.start = this.dormancyData[0].date.split("T")[0]
+ this.end = this.dormancyData[this.dormancyData.length - 1].date.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // //移动平均线没值 才渲染正常价格数据
+ // if (this.start && !this.fatherSmaData[0]) {
+ // this.handelSonBtcPrice("BTC", true)
+ // }
+ // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // if (this.fatherSmaData[0] && this.start) {
+ // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ // }
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // })
+
+
+ let dormancyValueList = []
+ let eadormancyValueList = []
+ let sadormancyValueList = []
+ let xAxisData = []
+ this.dormancyData.forEach(item => {
+ xAxisData.push(item.date.split("T")[0])
+ dormancyValueList.push(Number(item.dormancy.toFixed(2)))
+ eadormancyValueList.push(Number(item.eadormancy.toFixed(2)))
+ sadormancyValueList.push(Number(item.sadormancy).toFixed(6))
+
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = dormancyValueList
+ // this.option.series[1].data = sadormancyValueList
+ this.option.series[1].data = eadormancyValueList
+ this.option.series[2].data = priceData
+
+ // this.option.series[0].data = handelProfitrate(this.dormancyData, dormancyValueList)
+ // this.option.series[1].data = handelProfitrate(this.dormancyData, sadormancyValueList)
+ // this.option.series[2].data = handelProfitrate(this.dormancyData, eadormancyValueList)
+
+ this.inCharts()
+ this.dormancyLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length),);
+
+ }, 10000)
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.parmesTime.start = start;
+ this.parmesTime.end = end;
+ this.fetchDormancy(this.params.req, this.params.radius, this.parmesTime.start, this.parmesTime.end, this.sma)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice(radius, this.option.series[3], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice(radius, this.option.series[4], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.sma = smaDataList
+
+ this.fetchDormancy(this.params.req, this.params.radius, this.parmesTime.start, this.parmesTime.end, this.sma)
+
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ this.realTimeData = false
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[3], this.inCharts,this.start, this.end)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/dormancy/index.vue b/yq/src/views/dormancy/index.vue
new file mode 100644
index 0000000..734eda3
--- /dev/null
+++ b/yq/src/views/dormancy/index.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/dormancyEth/index.js b/yq/src/views/dormancyEth/index.js
new file mode 100644
index 0000000..c972765
--- /dev/null
+++ b/yq/src/views/dormancyEth/index.js
@@ -0,0 +1,352 @@
+import * as echarts from "echarts";
+import { getDormancyEth, } from "../../api/pages"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ dormancyEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}M `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Average Coin Dormancy",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchdormancyEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("dormancyEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("dormancyEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchdormancyEth(params) {
+ this.dormancyEthLoading = true
+ const { data } = await getDormancyEth(params)
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.dormancyEthLoading = false
+ return
+ }
+
+ let dormancyEthData = data.data
+ this.start = dormancyEthData[0].date.split("T")[0]
+ this.end = dormancyEthData[dormancyEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // // //移动平均线没值 才渲染正常价格数据
+ // // if (this.start && !this.fatherSmaData[0]) {
+ // // this.ethFlag = true
+ // // this.handelSonEthPrice("ETH", true);
+ // // this.$addStorageEvent(1, "ethFlag", JSON.stringify(true));
+ // // }
+ // // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // // if (this.fatherSmaData[0] && this.start) {
+ // // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ // // }
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ dormancyEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(dormancyEthData, ValueList)
+
+ this.inCharts()
+
+ this.dormancyEthLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchdormancyEthIndicator(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchdormancyEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/dormancyEth/index.vue b/yq/src/views/dormancyEth/index.vue
new file mode 100644
index 0000000..6fa0612
--- /dev/null
+++ b/yq/src/views/dormancyEth/index.vue
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/earcap1/index.js b/yq/src/views/earcap1/index.js
new file mode 100644
index 0000000..fab3df1
--- /dev/null
+++ b/yq/src/views/earcap1/index.js
@@ -0,0 +1,351 @@
+import * as echarts from "echarts";
+import { fetchEarcap } from "../../api/apiPost"
+import { chartsWidth,emptyData,dataLength,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ earcapLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Entity-adjusted Realized Cap",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchEarcap({})
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("earcapBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("earcapBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchEarcap(params) {
+ this.earcapLoading = true
+ const { data } = await fetchEarcap(params)
+ let earcapData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.earcapLoading = false
+ return
+ }
+
+ this.start = earcapData[0].date.split("T")[0]
+ this.end = earcapData[earcapData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ this.$nextTick(() => {
+ //渲染ETH
+ if (this.ethFlag) {
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+
+ }
+ //渲染BTC价格
+ if (this.btcFlag) {
+ this.handelSonBtcPrice("BTC", this.btcFlag)
+ this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+
+ }
+ })
+ let ValueList = []
+ earcapData.forEach(item => {
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(earcapData, ValueList)
+
+
+ this.inCharts()
+
+ this.earcapLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchEarcap(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchEarcap(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/earcap1/index.vue b/yq/src/views/earcap1/index.vue
new file mode 100644
index 0000000..922c12d
--- /dev/null
+++ b/yq/src/views/earcap1/index.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/economics/index.js b/yq/src/views/economics/index.js
new file mode 100644
index 0000000..e69de29
diff --git a/yq/src/views/economics/index.vue b/yq/src/views/economics/index.vue
new file mode 100644
index 0000000..714991c
--- /dev/null
+++ b/yq/src/views/economics/index.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/ercBigDeals/index.js b/yq/src/views/ercBigDeals/index.js
new file mode 100644
index 0000000..8a82470
--- /dev/null
+++ b/yq/src/views/ercBigDeals/index.js
@@ -0,0 +1,449 @@
+import * as echarts from "echarts";
+import {handelWatermark,handelZoom} from "../../util/processingData"
+export default {
+ data() {
+ return {
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i <= params.length - 1; i++) {
+ // res += `${params[i].marker} ${params[i].value[1]} ${params[i].seriesName}`;
+ // }
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ type: "category",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ },
+ yAxis: [
+ {
+ name:this.$t(`home.figure`),
+ // name: "MVRV",
+ position: "left",
+ type: "value",
+ },
+ ],
+ dataZoom: [
+ {
+ type: "slider",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ series: [
+ {
+ type: "line",
+ name: "tx count",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+
+ data: [],
+ },
+ ],
+ },
+ params: {
+ req: "ETHTokenBigtx",
+ radius: "eth",
+ page: 1,
+ limit:50,
+ },
+ paramsCount: {
+ req: "ETHTokenBigtxcount",
+ radius: "eth",
+ },
+ searchParams: {
+ search: "",
+ start: "",
+ end: "",
+ value: "",
+ state: ""
+ },
+ times: {
+ start: "",
+ end: ""
+ },
+ tabelloading: false,
+ tableData: [],
+ ercBigDealsLoading: false,
+ dialog: false,
+ tabelUrl: "",
+ color: "",
+ introduce: "",
+ valueList: [
+ {
+ value: 50000,
+ label: "余额 > 5W",
+ },
+ {
+ value: 100000,
+ label: "余额 > 10W",
+ },
+ {
+ value: 150000,
+ label: "余额 > 15W",
+ },
+ {
+ value: 250000,
+ label: "余额 > 25W",
+ },
+ {
+ value: 500000,
+ label: "余额 > 50W",
+ },
+ {
+ value: 1000000,
+ label: "余额 > 100W",
+ },
+ ],
+ state: "",
+ value: "",
+ tabelParams: {
+ req: "",
+ address: "",
+ txId: "",
+ type: "",
+ },
+ animate: false,
+ notice: "",
+ amountTxid: "",
+ amountTime: "",
+ dialogVisible: false,
+ dialogData: [],
+ dialogDate: "",
+ rollingData: [],
+ setInTime: null,
+ currencyName: "",
+ currentPage4: 1,//当前页数
+ totalPage: 0,
+ list:[],
+ setInTimeout:null,
+ abbrs:"",
+ abbrList:[],
+ sma:"",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+
+ //请求数据
+ this.fetchErhbigDeals(this.params.req, this.params.radius, this.searchParams.search, this.searchParams.start, this.searchParams.end, this.params.page,this.params.limit,this.abbrs)
+ this.fetchErhbigDealsxcount(this.paramsCount.req, this.paramsCount.radius)
+
+
+ let menuObj = localStorage.getItem("params");
+ this.introduce = JSON.parse(menuObj).introduce;
+ this.show = localStorage.getItem("currentTabComponent");
+ let obj = localStorage.getItem("src");
+ // this.color = JSON.parse(obj).color;
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ let menuObj = localStorage.getItem("params");
+ // this.params.req = JSON.parse(menuObj).componentReq;
+ this.introduce = JSON.parse(menuObj).introduce;
+ let obj = localStorage.getItem("src");
+ // this.color = JSON.parse(obj).color;
+ this.zoomStart= localStorage.getItem("zoomStart")
+ this.zoomEnd= localStorage.getItem("zoomEnd")
+ });
+ this.$addStorageEvent(1, "buttonShow", false)
+ this.$addStorageEvent(1, "introduce", this.introduce);
+ if (this.setInTimeout || this.setInTime) {
+ clearInterval(this.setInTime)
+ clearTimeout(this.setInTimeout)
+ }
+
+ },
+
+ methods: {
+ initCharts() {
+ // this.myChart.clear();
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("ercBigDeals"));
+ }
+ this.option= handelZoom(this.myChart,this.option,this,this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ // 当窗口或者大小发生改变时执行resize,重新绘制图表
+ window.addEventListener("resize", () => {
+ if (this.myChart)this.myChart.resize();
+ });
+ },
+ //请求页面tabel数据
+ async fetchErhbigDeals(req, radius, search, start, end, page,limit,abbr) {
+ this.ercBigDealsLoading = true
+ const { data } = await this.$API.getETHTokenBigtx(req, radius, search, start, end, page,limit,abbr);
+
+ //判断没有数据的时候
+ if (!data.data.count) {
+ this.ercBigDealsLoading = false
+ this.tableData=[]
+ this.totalPage=0
+ return
+ }
+ //请求erc20 token大额交易 前50的token
+ const abbrs = await this.$API.getETHTokenAbbrs();
+ this.abbrList =abbrs.data.data
+
+
+ this.tableData = data.data.data
+
+
+ this.list = [...data.data.data]
+ this.totalPage = data.data.totalPage
+
+ // this.rollingData = data.data
+ //通知栏滚动
+ if (this.setInTimeout || this.setInTime) {
+ clearInterval(this.setInTime)
+ clearTimeout(this.setInTimeout)
+ }
+
+ setInterval(() => {
+ this.showMarquee(JSON.parse(JSON.stringify(this.tableData)))
+ }, 3000);
+ // console.log(this.tableData ,111111);
+ if (page) {
+ this.currentPage4 = page
+ } else {
+ this.currentPage4 = 1
+ }
+
+ this.ercBigDealsLoading = false
+ },
+ //请求折线图数据
+ async fetchErhbigDealsxcount(req, radius, start, end, type,sma) {
+ // this.usdtbigtxLoading = true
+ const { data } = await this.$API.getBigDealsCount(
+ req,
+ radius,
+ start,
+ end,
+ type,
+ sma
+ );
+ // console.log(data, 98);
+ //添加水印
+ this.option= handelWatermark(this.option)
+ this.dataCount = data.data
+ this.option.series[0].data.length = 0;
+ this.option.xAxis.data.length = 0;
+ this.dataCount.forEach(item => {
+ let time = item.dataTime.split("T")[0];
+ this.option.xAxis.data.push(time);
+ this.option.series[0].data.push(item.num);
+ })
+ // this.option.series[0].itemStyle.color = this.color;
+ // this.option.series[0].lineStyle.color = this.color;
+ this.currentPage4 = 1
+ this.initCharts();
+
+ // this.usdtbigtxLoading = false
+ },
+ //处理表格里的时间
+ formatTime(value) {
+ let newTime = value.split(".")[0].replace("T", " ");
+ return newTime;
+ },
+
+ //关闭弹窗
+ handelClose() {
+ this.dialog = false;
+ },
+ //选择下拉币种
+ handelAbbrList(){
+
+ this.fetchErhbigDeals(this.params.req, this.params.radius, this.searchParams.search, this.searchParams.start, this.searchParams.end, this.params.page,this.params.limit,this.abbrs)
+
+
+ },
+ //下拉框选择
+ handelChang(e) {
+ this.state = ""
+ this.params.page=1
+ this.searchParams.search = this.value
+ this.fetchErhbigDeals(this.params.req, this.params.radius, this.value, this.searchParams.start, this.searchParams.end, this.params.page,this.params.limit,this.abbrs)
+ // this.value = ""
+ },
+ handelSearch(b) {
+ //搜索框输入参数
+ this.value = ""
+ this.params.page=1
+ this.searchParams.search = this.state
+ this.fetchErhbigDeals(this.params.req, this.params.radius, this.state, this.searchParams.start, this.searchParams.end, this.params.page,this.params.limit,this.abbrs)
+ // this.state = ""
+ },
+ //获取父级时间
+ handelSonTime(start, end) {
+ this.searchParams.start = start;
+ this.searchParams.end = end;
+ let search
+ if (this.state) {
+ search = this.state
+ } else if (this.value) {
+ search = this.value
+ }
+ let type
+ this.fetchErhbigDeals(this.params.req, this.params.radius,search, this.searchParams.start, this.searchParams.end, this.params.page,this.params.limit,this.abbrs)
+ this.fetchErhbigDealsxcount(this.paramsCount.req, this.paramsCount.radius, this.searchParams.start, this.searchParams.end,type,this.sma)
+ // this.searchParams.start = "";
+ // this.searchParams.end = "";
+ },
+ //点击滚动通知栏的查看详情
+ handelDetails() {
+ this.dialogVisible = true;
+ this.dialogData = this.list.find((item) => {
+ return item.txId == this.amountTxid;
+ });
+ this.dialogDate = this.dialogData.dateTime.split(".")[0].replace("T", " ");
+ },
+ // 通知栏滚动
+ showMarquee(data) {
+ this.animate = true;
+ // this.$nextTick(() => {
+ // console.log(this.rollingData[0], 9222222222898);
+ // this.rollingData.forEach(item => {
+ // console.log(item, 9898);
+ // })
+
+ // })
+ // this.rollingData = data
+ // let rollingData = data
+ // setTimeout
+ this.setInTimeout = setTimeout(() => {
+ // this.notice.push(rollingData[0].label);
+
+ this.amountTxid = this.list[0].txId;
+ this.amountTime = this.list[0].dateTime
+ .split(".")[0]
+ .replace("T", " ");
+ this.notice = this.list[0].amount.toFixed(3);
+ this.currencyName = this.list[0].abbr;
+ this.list.push(this.list[0]);
+ this.list.shift();
+ this.animate = false;
+
+ }, 500);
+
+ },
+ //点击的改变页数
+ handleCurrentChange(value) {
+ this.params.page = value
+ this.fetchErhbigDeals(this.params.req, this.params.radius, this.searchParams.search, this.searchParams.start, this.searchParams.end, this.params.page,this.params.limit,this.abbrs)
+
+ // this.currentPage4 = this.params.page
+ },
+ //改变每页条数
+ handleSizeChange(val) {
+ this.params.page = 1;
+ this.params.limit = val;
+ this.fetchErhbigDeals(this.params.req, this.params.radius, this.searchParams.search, this.searchParams.start, this.searchParams.end, this.params.page,this.params.limit,this.abbrs)
+
+ },
+ //双击表格单元格复制
+ cellDblclick(row, column, cell, event) {
+ if (event.type === "dblclick") {
+ var save = (e) => {
+ e.clipboardData.setData("text/plain", event.target.innerText);
+ e.preventDefault(); //阻止默认行为
+ };
+ document.addEventListener("copy", save);
+ document.execCommand("copy");
+ document.removeEventListener("copy", save);
+ }
+ this.$message({ message: this.$t(`home.copy`), type: "success" }); //加提示
+ },
+ //父级选择Sma
+ handelSonSma(smaNUm) {
+ this.sma = smaNUm
+ let type
+ this.fetchErhbigDealsxcount(this.paramsCount.req, this.paramsCount.radius, this.searchParams.start, this.searchParams.end,type,this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[3], this.inChart, this.start, this.end)
+
+ },
+
+ },
+
+ beforeDestroy(){
+ clearInterval(this.setInTime)
+ clearTimeout(this.setInTimeout)
+ console.log("组件离开");
+ },
+ //组件激活唤醒函数
+ activated() {
+ console.log("组件激活");
+ },
+ //组件销毁唤醒函数
+ deactivated() {
+ clearInterval(this.setInTime)
+ clearTimeout(this.setInTimeout)
+ console.log("组件离开");
+
+ },
+
+
+}
\ No newline at end of file
diff --git a/yq/src/views/ercBigDeals/index.vue b/yq/src/views/ercBigDeals/index.vue
new file mode 100644
index 0000000..660f3fe
--- /dev/null
+++ b/yq/src/views/ercBigDeals/index.vue
@@ -0,0 +1,513 @@
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`home.tradingVolume`) }}:{{ notice || 0 }}
+
+
+ {{ $t(`home.tradingHours`) }}:{{ amountTime || 0 }}
+
+ {{ $t(`home.currencyName`) }}:{{ currencyName || 0 }}
+ {{
+ $t(`home.checkDetails`)
+ }}
+
+
+
+
+
+
+
+
+ {{ $t(`home.date`) }}: {{ dialogDate }}
+
+
+ {{ $t(`home.number`) }}:
+ {{ dialogData.amount }}
+
+
+ {{ $t(`home.currencyName`) }}:
+ {{ dialogData.abbr }}
+
+
+ {{ $t(`home.contractAddress`) }}:
+ {{ dialogData.caddress }}
+
+
+ {{ $t(`home.address`) }}:
+ {{
+ (dialogData.vout = dialogData.vout
+ ? dialogData.vout
+ : $t(`home.no`))
+ }}
+
+
+ {{ $t(`home.aAddress`) }}:
+ {{
+ (dialogData.fromAddress = dialogData.fromAddress
+ ? dialogData.fromAddress
+ : $t(`home.no`))
+ }}
+
+
+ {{ $t(`home.height`) }}:
+ {{ dialogData.height }}
+
+
+ {{ $t(`home.targetAddress`) }}:
+ {{
+ (dialogData.toAddress = dialogData.toAddress
+ ? dialogData.toAddress
+ : $t(`home.no`))
+ }}
+
+
+ {{ $t(`home.transaction`) }}:
+ {{ dialogData.txId }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ $t(`home.bigTable`) }}
+
+
+
+ {{$t(`home.table`)}}
+ {{ $t(`home.copyTabel`) }}
+
+
+
+
+
+
+ {{ formatTime(scope.row.dateTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`home.down`) }} X
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/ercVolume/index.js b/yq/src/views/ercVolume/index.js
new file mode 100644
index 0000000..83182cd
--- /dev/null
+++ b/yq/src/views/ercVolume/index.js
@@ -0,0 +1,535 @@
+import * as echarts from "echarts";
+import { handelZoom, handelSonSma } from "../../util/processingData"
+import { getErcVolume } from "../../api/pages"
+export default {
+ data() {
+ return {
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ type: "category",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ },
+ yAxis: [
+ {
+ // name: "MVRV",
+ position: "left",
+ type: "value",
+ // min: `dataMin`,
+ // max: `dataMax`,
+ },
+ {
+ // name: "MVRV",
+ position: "right",
+ type: "value",
+ // min: `dataMin`,
+ // max: `dataMax`,
+ show: true,
+ axisLabel: {
+ formatter: function (value) {
+ let data
+ if (value > 100000000) {
+ data = `${value / 100000000} E`
+ } else {
+ data = value
+ }
+ return data
+ }
+ }
+
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ series: [
+ {
+ type: "line",
+ name: "活跃地址数",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+ {
+ type: "line",
+ name: "交易量",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#24acf2",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#24acf2",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ TokenVolumeLoading: false,
+ params: {
+ req: "ETHTokenVolume",
+ radius: "eth",
+ },
+ times: {
+ start: "",
+ end: ""
+ },
+ dataCount: [],
+ introduce: "",
+ activeNames: "",
+ ercVolumeData: [],
+ chartLoading: false,
+ seriesData: [],
+ list: [],
+ chartDom: [],
+ type: "",
+
+ bigLine: {
+ tooltip: {
+ trigger: 'axis',
+ position: function (pt) {
+ return [pt[0], '10%'];
+ }
+ },
+ // grid: {
+ // top: 1,
+ // bottom: 20,
+ // left: 50,
+ // right: 5,
+ // },
+
+ xAxis: {
+ // type: 'time',
+ boundaryGap: false,
+ data: []
+ },
+ yAxis: {
+ // type:"value",
+ show: true,
+ scale: true,
+ position: 'left',
+ axisLine: { show: false },
+ axisTick: { show: false },
+ splitLine: { show: false },
+ axisLabel: { inside: false, interval: 0 }
+ },
+ dataZoom: [
+ {
+ type: 'inside',
+ start: 0,
+ end: 100
+ },
+
+ ],
+ series: [
+ {
+ name: '币价',
+ type: 'line',
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#ffa3a8",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ color: "#ffa3a8",
+ width: 1,
+ },
+ areaStyle: {
+ normal: {
+ color: new echarts.graphic.LinearGradient(
+ 0, 0, 0, 1,
+ [
+ { offset: 0, color: 'red' },
+ { offset: 0.5, color: 'pink' },
+ { offset: 1, color: '#ddd' }
+ ]
+ )
+ }
+ },
+
+ data: []
+ }
+ ]
+
+ },
+ timeData: [],
+ ids: "",
+ chartLoading: false,
+ abbrArr: [],
+ zoomStart: 0,
+ zoomEnd: 0,
+ params1: {
+ abbr: "TUSD",
+ sma: 0
+ }
+
+ }
+ },
+ mounted() {
+
+ this.$addStorageEvent(1, "timeShow", true);
+ this.$addStorageEvent(1, "timeDisable", true);
+ //按钮禁用
+ this.$addStorageEvent(1, "buttonShow", false);
+
+ // this.fetchTokenVolume(this.params.req, this.params.radius, this.times.start, this.times.end)
+ this.fetchTokenVolume()
+
+
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+ })
+
+ },
+
+ methods: {
+ initCharts() {
+ // this.myChart.clear();
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("TokenVolume"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ // 当窗口或者大小发生改变时执行resize,重新绘制图表
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ //请求折线图数据
+ async fetchTokenVolume(params) {
+
+ this.TokenVolumeLoading = true
+
+
+
+ const { data } = await getErcVolume(params)
+
+
+ this.dataCount = data.data
+
+
+ if (this.dataCount.length == 0) {
+ this.$message({
+ message: this.$t(`home.NoData`),
+ type: 'warning'
+ });
+ this.TokenVolumeLoading=false
+ return
+ }
+
+
+
+ this.dataCount.forEach(item => {
+ this.list.push([item.list, item.abbr])
+ this.chartDom.push({ params: item.abbr })
+ })
+
+ //处理数据格式
+ this.seriesData = this.handelLIst(this.list)
+
+
+
+ this.TokenVolumeLoading = false
+ },
+ //下拉折线图渲染
+ handelClick(currency, id, index) {
+ this.chartLoading = true
+
+ if (currency !== this.type) {
+ this.type = currency
+ this.ids = `echarts${id}`
+ this.bigEchart = echarts.init(document.getElementById(this.ids))
+ this.bigLine = {
+ tooltip: {
+ trigger: 'axis',
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ // grid: {
+ // top: 1,
+ // bottom: 20,
+ // left: 50,
+ // right: 5,
+ // },
+ graphic: [
+ {
+ type: 'group',
+ // rotation: Math.PI / 2,
+ bounding: 'raw',
+ right: "50%",
+ top: "40%",
+
+ // z: 10,
+ // rotation: 6,
+ children: [
+ {
+ type: 'text',
+ left: 'center',
+ top: 'center',
+ silent: true,
+ // z: 100,
+ style: {
+ fill: `rgba(0,0,0,0.1)`,
+ text: `coinbus.cc`,
+ font: 'bold 80px sans-serif',
+
+ }
+ }
+ ]
+ }
+ ],
+
+
+ xAxis: {
+ // type: 'time',
+ boundaryGap: false,
+ data: this.seriesData[index].map(item => item[0]),
+ // axisLabel:{
+ // formatter: (value)=>{
+ // let time =value.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: {
+ // type:"value",
+ show: true,
+ scale: true,
+ position: 'left',
+ axisLine: { show: false },
+ axisTick: { show: false },
+ splitLine: { show: false },
+ // axisLabel: { inside: false, interval: 0 },
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//万
+ value = `${e / 10000}W`;
+ } else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ dataZoom: [
+ {
+ type: 'inside',
+ start: 0,
+ end: 100
+ },
+
+ ],
+ series: [
+ {
+ name: 'Transaction volume for token',
+ type: 'line',
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#ffa3a8",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ color: "#ffa3a8",
+ width: 1,
+ },
+ areaStyle: {
+ normal: {
+ color: new echarts.graphic.LinearGradient(
+ 0, 0, 0, 1,
+ [
+ { offset: 0, color: 'red' },
+ { offset: 0.5, color: 'pink' },
+ { offset: 1, color: '#ddd' }
+ ]
+ )
+ }
+ },
+
+ data: this.seriesData[index].map(item => item[1])
+ }
+ ]
+
+ }
+ this.bigEchart.setOption(this.bigLine, true)
+
+ this.$nextTick(() => {
+ this.bigEchart.resize();
+ });
+ // echart.setOption(this.bigLine);
+ // 当窗口或者大小发生改变时执行resize,重新绘制图表
+ window.addEventListener("resize", () => {
+ this.bigEchart.resize();
+ });
+
+ } else {
+ this.type = ''
+ // echart.dispose()
+ }
+
+ this.chartLoading = false
+ },
+ handelChang() {
+
+ },
+ //获取父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchTokenVolume(this.params.req, this.params.radius, this.times.start, this.times.end)
+ this.times.start = "";
+ this.times.end = "";
+ },
+
+ //处理折线图数据格式
+ handelLIst(data) {
+
+ let sumArr = []
+ let arr = []
+ data.forEach(item => {
+ if (item[0]) {
+ item[0].forEach(item => {
+ // Number(item.price).toFixed(2)
+ //
+ let price = Number(parseInt(item.volume * 10000) / 10000)
+ let year = item.dateTime.split("T")[0]
+ let hours = item.dateTime.split("T")[1].split(".")[0]
+ // let time = `${year} ${hours} `
+ let time = year
+
+ arr.push([time, Number(price), item.abbr])
+ })
+ } else {
+ arr.push(["", "", item[1]])
+ }
+
+ })
+ // sumArr.push(arr)
+
+ this.abbrArr = arr
+ let newArr = []
+ let a = []
+ for (const i of arr) {
+ if (a.indexOf(i[2]) === -1) {
+ newArr.push([[i[0], i[1]]])
+ a.push(i[2])
+ } else {
+ newArr[a.indexOf(i[2])].push([i[0], i[1]])
+ }
+ }
+
+ newArr.forEach(item => {
+ item.sort((a, b) => {
+
+ return a[0] > b[0] ? 1 : -1
+ })
+ })
+
+
+ return newArr
+
+ },
+ //选择Sma
+ handelSonSma(smaDataList) {
+
+
+ this.params1.sma = smaDataList
+
+ this.fetchTokenVolume(this.params1)
+
+ this.$addStorageEvent(1, "sma", this.params1.sma);
+
+ },
+
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/ercVolume/index.vue b/yq/src/views/ercVolume/index.vue
new file mode 100644
index 0000000..3977af8
--- /dev/null
+++ b/yq/src/views/ercVolume/index.vue
@@ -0,0 +1,153 @@
+
+
+
+
+
+
+
{{$t(`home.currencyName`)}}
+
{{$t(`home.activeAddress`)}}
+
+
+
+
+
+
+
+
+
+ {{ item.abbr }}
+
+
+ {{ item.address }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/ethTopAddrMonitorList/index.js b/yq/src/views/ethTopAddrMonitorList/index.js
new file mode 100644
index 0000000..48451c0
--- /dev/null
+++ b/yq/src/views/ethTopAddrMonitorList/index.js
@@ -0,0 +1,121 @@
+
+export default {
+ data(){
+ return {
+ ethTopAddrMonitorListLoading:false,
+ params:{
+ req:"ethTopAddrMonitorList",
+ radius:"ETH",
+ },
+ tabelData:[],
+ page:1,
+ limit:50,
+ currentPage4:1,
+ totalPage:0,
+ value:"",
+ valueList: [
+ {
+ value: 50000,
+ label: "value > 5W",
+ },
+ {
+ value: 100000,
+ label: "value > 10W",
+ },
+ {
+ value: 150000,
+ label: "value > 15W",
+ },
+ {
+ value: 250000,
+ label: "value > 25W",
+ },
+ {
+ value: 500000,
+ label: "value > 50W",
+ },
+ {
+ value: 1000000,
+ label: "value > 100W",
+ },
+ ],
+ state:"",
+ }
+ },
+ mounted(){
+
+ //不显示时间框
+ this.$addStorageEvent(1, "timeShow", false);
+ this.fetchMonitorList(this.params.req,this.params.radius,this.page,this.limit)
+ },
+ methods:{
+
+ async fetchMonitorList(req, radius, page,limit,total){
+ this.ethTopAddrMonitorListLoading = true
+ const { data } = await this.$API.getNewContract(req, radius, page,limit,total)
+ this.tabelData = data.data.data
+
+
+
+
+
+ this.tabelData.forEach(item=>{
+ item.amount = Number(parseInt(item.amount*100)/100)
+ if (item.fromAbbr) {
+ item.fromAddress = `${item.fromAddress}(${item.fromAbbr})`
+ }
+ if (item.toAbbr) {
+ item.toAddress = `${item.toAddress}(${item.toAbbr})`
+ }
+ })
+ this.totalPage=data.data.totalPage
+ this.currentPage4 =page
+
+ this.ethTopAddrMonitorListLoading = false
+ },
+
+ formatTime(time){
+ let date = time.split("T")[0]
+ let hour = time.split("T")[1].split(".")[0]
+ return `${date} ${hour}`
+ },
+ //点击的改变页数
+ handleCurrentChange(value) {
+ this.page = value;
+ this.fetchMonitorList(this.params.req,this.params.radius,this.page,this.limit)
+ },
+ //改变每页条数
+ handleSizeChange(val) {
+ this.page = 1;
+ this.limit = val;
+ this.fetchMonitorList(this.params.req,this.params.radius,this.page,this.limit)
+
+ },
+ //双击表格单元格复制
+ cellDblclick(row, column, cell, event) {
+ if (event.type === "dblclick") {
+ var save = (e) => {
+ e.clipboardData.setData("text/plain", event.target.innerText);
+ e.preventDefault(); //阻止默认行为
+ };
+ document.addEventListener("copy", save);
+ document.execCommand("copy");
+ document.removeEventListener("copy", save);
+ }
+ this.$message({ message: this.$t(`home.copy`), type: "success" }); //加提示
+ },
+ //下拉框选择
+ handelChang(e) {
+ // this.fetchEthTopAddrList(this.value,this.params.page,this.params.limit)
+ this.fetchMonitorList(this.params.req,this.params.radius,this.page,this.limit,this.value)
+ this.state = ""
+ },
+ //搜索框输入参数
+ handelSearch() {
+ this.fetchMonitorList(this.params.req,this.params.radius,this.page,this.limit,this.state)
+ this.value = ""
+ },
+
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/ethTopAddrMonitorList/index.vue b/yq/src/views/ethTopAddrMonitorList/index.vue
new file mode 100644
index 0000000..f14da10
--- /dev/null
+++ b/yq/src/views/ethTopAddrMonitorList/index.vue
@@ -0,0 +1,193 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`home.copyTabel`) }}
+
+
+
+
+
+ {{ formatTime(scope.row.date) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/exchange/index.js b/yq/src/views/exchange/index.js
new file mode 100644
index 0000000..a4b4aac
--- /dev/null
+++ b/yq/src/views/exchange/index.js
@@ -0,0 +1,393 @@
+import * as echarts from "echarts";
+import { getExchange, getExchanges } from "../../api/apiPost"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ exchangeLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Exchange Balance - All Exchanges [BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ exchange: "all",
+ sma: 0
+
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ value: "all",
+ options: []
+
+
+
+ }
+ },
+ mounted() {
+
+ this.fetchSelectData()
+ this.fetchExchange(this.params)
+
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("exchangeBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("exchangeBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+
+ async fetchExchange(params) {
+
+ this.exchangeLoading = true
+ const { data } = await getExchange(params)
+
+
+ let exchangeData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.exchangeLoading = false
+ return
+ }
+
+
+
+ this.start = exchangeData[0].date.split("T")[0]
+ this.end = exchangeData[exchangeData.length - 1].date.split("T")[0]
+ let price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+ let priceData = price.data.data
+ priceData.forEach(item=>{
+ item.time= item.time.split(`T`)[0]
+ })
+
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag);
+ // }
+
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // })
+
+ let ValueList = []
+ let Xdata = []
+ exchangeData.forEach(item => {
+ if (item.value !== null) {
+ item.value= Number(item.value).toFixed(2)
+ }
+ ValueList.push(item.value)
+ item.date= item.date.split("T")[0]
+ Xdata.push(item.date)
+ })
+ let newPriceData = priceData.filter(item1 =>exchangeData.some(item2 => item1.time == item2.date))
+ // this.option.series[0].data = handelProfitrate(exchangeData, ValueList)
+ this.option.series[0].data = ValueList
+ this.option.series[1].data = newPriceData
+ this.option.xAxis.data = Xdata
+ let name = this.value.charAt(0).toUpperCase() + this.value.slice(1);
+ this.option.series[0].name = `Exchange Balance - ${name} Exchanges [BTC]`
+
+ this.inCharts()
+ this.exchangeLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //请求下拉框数据
+ async fetchSelectData() {
+ const selectData = await getExchanges()//下拉框数据
+
+ selectData.data.data.forEach(item => {
+ this.options.push({ value: item, label: item })
+ })
+ this.options.sort((a,b)=> //排序all在最前面
+ {
+ if (a.value=="all") {
+ return -1
+ }else if (b.value=="all") {
+ return 1
+ }else{
+ return 0
+ }
+ })
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchExchange(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchExchange(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ handelZone() {
+ this.fetchExchange(this.params)
+ },
+ //下拉框选择
+ handelChang(value) {
+ // this.params.exchange = this.value
+ this.params.exchange = value.paneName
+ if (this.params.exchange) {
+ this.fetchExchange(this.params)
+ }
+
+ }
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/exchange/index.vue b/yq/src/views/exchange/index.vue
new file mode 100644
index 0000000..1c2fc0e
--- /dev/null
+++ b/yq/src/views/exchange/index.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/exchangeETH/index.js b/yq/src/views/exchangeETH/index.js
new file mode 100644
index 0000000..a1ffb8f
--- /dev/null
+++ b/yq/src/views/exchangeETH/index.js
@@ -0,0 +1,384 @@
+import * as echarts from "echarts";
+import { getExchangeETH, getExchangesETH,ethPrice } from "../../api/apiPost"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType,handelBtcPrice, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ exchangeETHLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Exchange Balance - All Exchanges [ETH]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 1,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 4,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ exchange: "all",
+ sma: 0
+
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ value: "all",
+ options: []
+
+
+
+ }
+ },
+ mounted() {
+
+ this.fetchSelectData()
+ this.fetchExchangeETH(this.params)
+
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("exchangeETHBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("exchangeETHBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+
+ async fetchExchangeETH(params) {
+
+ this.exchangeETHLoading = true
+ const { data } = await getExchangeETH(params)
+ let exchangeETHData = data.data
+
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.exchangeETHLoading = false
+ return
+ }
+
+
+ this.start = exchangeETHData[0].date.split("T")[0]
+ this.end = exchangeETHData[exchangeETHData.length - 1].date.split("T")[0]
+ const price= await ethPrice({start:this.start,end:this.end})
+ let ethPriceData=price.data.data
+ let ethPriceValueList = []
+ ethPriceData.forEach(item=>{
+ // ethPriceValueList.push(item.value.toFixed(2))
+ item.time=item.time.split("T")[0]
+ })
+ // this.option.series[1].data = handelBtcPrice(ethPriceData,ethPriceValueList)
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag);
+ // }
+
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH",this.ethFlag)
+ // }
+ // this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ let Xdata =[]
+ exchangeETHData.forEach(item => {
+ if (item.value !== null) {
+ item.value=Number(item.value).toFixed(2)
+ }
+ ValueList.push(item.value)
+ item.date = item.date.split("T")[0]
+ Xdata.push(item.date)
+ })
+
+ let newEthPriceData = ethPriceData.filter(item1 => exchangeETHData.some(item2 => item1.time == item2.date))
+ // this.option.series[0].data = handelProfitrate(exchangeETHData, ValueList)
+ this.option.series[0].data = ValueList
+ this.option.series[1].data = newEthPriceData
+ this.option.xAxis.data = Xdata
+ let name = this.value.charAt(0).toUpperCase() + this.value.slice(1);
+ this.option.series[0].name = `Exchange Balance - ${name} Exchanges [ETH]`
+
+
+ this.inCharts()
+
+ this.exchangeETHLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //请求下拉框数据
+ async fetchSelectData() {
+ const selectData = await getExchangesETH()//下拉框数据
+ selectData.data.data
+ selectData.data.data.forEach(item => {
+ this.options.push({ value: item, label: item })
+ })
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchExchangeETH(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchExchangeETH(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ handelZone() {
+ this.fetchExchangeETH(this.params)
+ },
+ //下拉框选择
+ handelChang(value) {
+ // this.params.exchangeETH = this.value
+ this.params.exchangeETH = value.name
+ if (this.params.exchangeETH) {
+ this.fetchExchangeETH(this.params)
+ }
+
+ }
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/exchangeETH/index.vue b/yq/src/views/exchangeETH/index.vue
new file mode 100644
index 0000000..de09322
--- /dev/null
+++ b/yq/src/views/exchangeETH/index.vue
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/exchangeRate/index.js b/yq/src/views/exchangeRate/index.js
new file mode 100644
index 0000000..5e7dfa2
--- /dev/null
+++ b/yq/src/views/exchangeRate/index.js
@@ -0,0 +1,313 @@
+import * as echarts from "echarts";
+import { exchangeRate,exchangeRateChart } from "../../api/pages"
+import { chartsWidth, emptyData, handelLineType,handelProfitrate, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ exchangeRateLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // res += `${params[i].marker} ${params[i].seriesName}      $${params[i].value} `
+
+
+ // }
+
+
+ // return res;
+ // },
+
+ },
+ legend: {
+ right: "100",
+ top:"10",
+
+
+ },
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "ExchangeRate",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "2",
+ },
+ data: [],
+ },
+
+
+ ],
+ },
+ tableData:[{
+ date:"",
+ symbol:"",
+ value:"",
+ }],
+ params:{
+ start:"",
+ end:"",
+ symbol:"",
+ },
+ chartLoading:false,
+ timer:null,
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+
+
+ }
+ },
+ mounted() {
+
+ this.fetchexchangeRate()
+
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ // this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ //监听localstorage变化
+ window.addEventListener("setItem", () => {
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+ });
+ this.oldY = this.option.yAxis
+ if (this.timer) {
+ clearInterval(this.timer)
+ }
+ // 1分钟请求一次页面
+ this.timer = setInterval(() => {
+ this.fetchexchangeRate()
+ }, 60000)
+
+
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("exchangeRateBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("exchangeRateBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchexchangeRate(params) {
+ this.exchangeRateLoading = true
+
+ const { data } = await exchangeRate(params)
+ this.tableData = data.data
+
+ if (this.tableData.length == 0) {
+
+ this.exchangeRateLoading = false
+ return
+ }else{
+ this.tableData.sort((a, b)=>{
+ if (a.cn === "美元指数") {
+ return -1; // "美元指数" 排在前面
+ } else if (b.cn === "美元指数") {
+ return 1; // "美元指数" 排在前面
+ } else {
+ return 0; // 其他项保持原有顺序
+ }
+ });
+ if (!this.params.symbol) {
+ this.params.symbol=this.tableData[0].symbol
+ }
+
+ this.fetchChart(this.params)
+ this.tableData.forEach(item => {
+ item.date = `${item.date.split(`T`)[1].split(`.`)[0]}`
+ });
+
+ }
+
+
+
+ //添加水印
+ this.option = handelWatermark(this.option)
+
+ this.exchangeRateLoading = false
+
+ },
+ async fetchChart(params) {
+ this.chartLoading=true
+ const {data} = await exchangeRateChart(params)
+ let chartData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.chartLoading = false
+ return
+ }
+
+
+ let ValueList = []
+ let timeList = []
+ chartData.forEach(item => {
+ let time =`${item.date.split("T")[0]} ${item.date.split("T")[1].split(".")[0]} `
+ ValueList.push(Number(item.value))
+ timeList.push(time)
+ })
+
+
+ this.option.series[0].data =ValueList
+ this.option.xAxis.data=timeList
+ this.inCharts()
+ this.chartLoading=false
+
+ },
+
+ //点击对应行
+ handelLi(row){
+ // this.$addStorageEvent(1, "symbol", JSON.stringify(row.symbol));
+ this.params.symbol = row.symbol
+ this.fetchChart(this.params)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchChart(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[2], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ // this.params.sma = smaDataList
+ // this.fetchexchangeRate(this.params)
+ // this.$addStorageEvent(1, "sma", smaDataList);
+
+ },
+ handelRefresh(){
+ this.fetchChart(this.params)
+ }
+
+ },
+ beforeDestroy(){
+ clearInterval(this.timer)
+ }
+
+}
\ No newline at end of file
diff --git a/yq/src/views/exchangeRate/index.vue b/yq/src/views/exchangeRate/index.vue
new file mode 100644
index 0000000..f2580d7
--- /dev/null
+++ b/yq/src/views/exchangeRate/index.vue
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+ {{$t(`formula.name`)}}
+ {{$t(`formula.name`)}}
+ {{$t(`formula.newData`)}}
+ {{$t(`arh.time`)}}
+
+
+ {{ item.cn }}
+ {{ item.symbol }}
+ {{ item.value }}
+ {{ item.date }}
+
+
+
+
+
+
+ {{ params.symbol }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/frm/index.js b/yq/src/views/frm/index.js
new file mode 100644
index 0000000..3f10d18
--- /dev/null
+++ b/yq/src/views/frm/index.js
@@ -0,0 +1,328 @@
+import * as echarts from "echarts";
+import { fetchFrm } from "../../api/apiPost"
+import { chartsWidth,emptyData, dataLength,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ frmLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Fee Ratio Multiple (FRM)",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ this.fetchFrm(this.params.req, this.params.radius)
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("frmBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("frmBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchFrm(params) {
+ this.frmLoading = true
+ const { data } = await fetchFrm(params)
+
+ let frmData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.frmLoading = false
+ return
+ }
+
+ this.start = frmData[0].date.split("T")[0]
+ this.end = frmData[frmData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ let profitValueList = []
+
+
+ frmData.forEach(item => {
+
+ profitValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(frmData, profitValueList)
+
+
+
+ this.inCharts()
+ this.frmLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchFrm(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/frm/index.vue b/yq/src/views/frm/index.vue
new file mode 100644
index 0000000..75f9254
--- /dev/null
+++ b/yq/src/views/frm/index.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/frmEth/index.js b/yq/src/views/frmEth/index.js
new file mode 100644
index 0000000..d5cf43f
--- /dev/null
+++ b/yq/src/views/frmEth/index.js
@@ -0,0 +1,352 @@
+import * as echarts from "echarts";
+import { getFrmEth, } from "../../api/pages"
+import { chartsWidth,emptyData,dataLength,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ frmEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}% `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Fee Ratio Multiple",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchfrmEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("frmEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("frmEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchfrmEth(params) {
+ this.frmEthLoading = true
+ const { data } = await getFrmEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.frmEthLoading = false
+ return
+ }
+ let frmEthData = data.data
+ this.start = frmEthData[0].date.split("T")[0]
+ this.end = frmEthData[frmEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ frmEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(frmEthData, ValueList)
+
+ this.inCharts()
+
+ this.frmEthLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchfrmEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchfrmEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/frmEth/index.vue b/yq/src/views/frmEth/index.vue
new file mode 100644
index 0000000..32bbf87
--- /dev/null
+++ b/yq/src/views/frmEth/index.vue
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/fundingRate/index.js b/yq/src/views/fundingRate/index.js
new file mode 100644
index 0000000..3f64067
--- /dev/null
+++ b/yq/src/views/fundingRate/index.js
@@ -0,0 +1,413 @@
+import * as echarts from "echarts";
+import { getFundingRate } from "../../api/pages"
+import { chartsWidth, emptyData, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+
+export default {
+ data() {
+ return {
+ fundingRateLoading: false,
+ num: 0,
+ option: {
+ xAxis: {
+ type: 'category',
+ data: []
+ },
+ legend: {
+ right: "100",
+ data: [{
+ name:"bar",
+ icon: 'rect', // 设置折线图的图例图标为线型
+ itemStyle: {
+ color: 'green', // 设置折线图的图例文本颜色
+ },
+ },
+ {
+ name:"line",
+
+ },
+ ],
+ selected: {
+ 'bar': true, // 默认显示折线图系列
+ 'line': true, // 默认隐藏柱状图系列
+ },
+ },
+
+ yAxis: {
+ type: 'value'
+ },
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+
+ var res = params[0].name;
+ let value = params[0].value + ""
+ if (value.length > 4) {
+ value = value.slice(0, 6)
+ } else {
+ value = value
+ }
+ // console.log(value,value.length,565);
+ res += `${params[0].marker} fundingRate \u00A0\u00A0\u00A0\u00A0 ${value}%
+ `;
+
+ // for (let i = 0; i <= params.length - 1; i++) {
+ // res += `${params[0].marker} ${params[0].seriesName} ${params[0].value}`;
+ // }
+ return res;
+ },
+
+ },
+ dataZoom: [
+ {
+ type: "inside",
+ start: 80,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 5,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: 'bar',
+ type: 'bar',
+ data: [],
+ itemStyle: {
+ normal: {
+ // 使用函数返回颜色值
+ color: function (params) {
+ var val = params.value;
+ if (val > 0) {
+ // 正数柱状图染成红色
+ return 'green';
+ } else if (val < 0) {
+ // 负数柱状图染成绿色
+ return 'red';
+ }
+ // 0 值不染色
+ return '';
+ }
+ }
+ },
+ z: 1
+ },
+
+ {
+ name: 'line',
+ type: 'line',
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ data: [],
+ itemStyle: {
+ color: "#FF8C00",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ // 线条样式
+ color: '#FF8C00',
+ width: 2
+ },
+ yAxixIndex: 1,
+ z: 2
+ }
+ ]
+ },
+ params: {
+
+ symbol: "BTCUSDT",
+ start: "",
+ end: "",
+ sma: "",
+
+ },
+ symbolList: [{
+ value: "BTCUSDT",
+ label: "BTCUSDT",
+ },
+ {
+ value: "ETHUSDT",
+ label: "ETHUSDT",
+ },
+ ],
+ priceTime: {
+ start: "2022-08-25",
+ end: "2022-09-20",
+ },
+ time: "",
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ //默认渲染当前时间一个月的数据
+ // this.params.start=getDate("day", -30);
+
+ // this.params.end = getDate()
+ this.fetchFundingRate(this.params)
+ //禁用时间框
+ // this.$addStorageEvent(1, "timeDisable", true);
+ // this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+ },
+ methods: {
+ inChart() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("fundingRateBox"));
+ }
+
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+ this.myChart.setOption(this.option);
+ chartsWidth("fundingRateBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ //请求数据
+ async fetchFundingRate(params) {
+
+ this.fundingRateLoading = true
+
+ const data = await getFundingRate(params)
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ let fundingRate = data.data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChart, this)
+ if (noData) {
+ this.fundingRateLoading = false
+ return
+ }
+
+ this.option.xAxis.data.length = 0
+
+ this.option.series[0].data.length = 0
+ fundingRate.forEach((item, index) => {
+
+ let time = `${item.date.split("T")[0]} ${item.date.split("T")[1].split(`.`)[0]}`
+ this.option.xAxis.data.push(time)
+ this.option.series[0].data.push(Number(item.value * 100))
+ this.option.series[1].data.push(Number(item.value * 100))
+ })
+
+ this.inChart()
+
+ this.fundingRateLoading = false
+ },
+ //时间戳转换
+ filterTime(time) {
+ const date = new Date(time)
+ const Y = date.getFullYear()
+ const M = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
+ const D = date.getDate()
+ return `${Y}-${M}-${D}`
+ },
+ getData(n) {
+ n = new Date(n)
+ return n.toLocaleDateString().replace(/\//g, "-") + " " + n.toTimeString().substr(0, 8)
+ },
+ //初始化option
+ onOption() {
+ this.option = {
+ // legend: {
+ // // data: ['bar', 'bar2', 'bar3', 'bar4'],
+ // // left: '10%'
+ // },
+ // brush: {
+ // toolbox: ['rect', 'polygon', 'lineX', 'lineY', 'keep', 'clear'],
+ // xAxisIndex: 0
+ // },
+ // toolbox: {
+ // feature: {
+ // magicType: {
+ // type: ['stack']
+ // },
+ // dataView: {}
+ // }
+ // },
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 5,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // console.log(params,33);
+ // var res = params.name;
+ // let value = params.value + ""
+ // if (value.length > 4) {
+ // value = value.slice(0, 6)
+ // } else {
+ // value = value
+ // }
+ // // console.log(value,value.length,565);
+ // res += `${params.marker} ${params.seriesName} \u00A0\u00A0\u00A0\u00A0 ${value}%
+ // `;
+
+ // // for (let i = 0; i <= params.length - 1; i++) {
+ // // res += `${params[0].marker} ${params[0].seriesName} ${params[0].value}`;
+ // // }
+ // return res;
+ // },
+ },
+ xAxis: {
+ data: [],
+ // type:"time",
+ // name: 'X Axis',
+ axisLine: { onZero: true },
+ splitLine: { show: false },
+ splitArea: { show: false }
+ },
+ // grid: {
+ // top: "5%",
+ // // right: "10%",
+ // // height: "77%",
+ // },
+ yAxis: [
+ {
+
+ axisLabel: {
+ formatter: (value, index) => {
+ // if(this.num < value){
+ // this.num = value
+ // return value + 0.1
+ // }else{
+ // return value
+ // }
+
+
+ return `${value}%`
+ }
+ },
+ // max:this.num
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ grid: {
+ // bottom: 100
+ },
+ series: [
+ {
+ name: 'fundingRate',
+ type: 'bar',
+ stack: 'one',
+ emphasis: "",
+ itemStyle: {//颜色设置
+ normal: {
+ color: function (params) { //根据数值大小设置相关颜色
+ if (params.value > 0) {
+ return 'green'
+ } else {
+ return 'red'
+ }
+ }
+ }
+ },
+
+ data: [],
+ z: 1
+ },
+ {
+ name: "fundingRate",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 1,
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ z: 2
+ },
+
+ ]
+ }
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ // let dateStart = new Date(start);
+ // let dateEnd = new Date(end);
+ // this.params.start = dateStart.getTime()
+ // this.params.end = dateEnd.getTime()
+ this.params.start = start
+ this.params.end = end
+ this.fetchFundingRate(this.params)
+ this.params.start = "";
+ this.params.end = "";
+ },
+ //选择Symbol
+ handelSymbol(val) {
+
+ this.fetchFundingRate(this.params)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchFundingRate(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+
+
+ },
+
+ }
+
+}
\ No newline at end of file
diff --git a/yq/src/views/fundingRate/index.vue b/yq/src/views/fundingRate/index.vue
new file mode 100644
index 0000000..5879b69
--- /dev/null
+++ b/yq/src/views/fundingRate/index.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/fundingRateETH/index.js b/yq/src/views/fundingRateETH/index.js
new file mode 100644
index 0000000..5ca9068
--- /dev/null
+++ b/yq/src/views/fundingRateETH/index.js
@@ -0,0 +1,397 @@
+import * as echarts from "echarts";
+import { getFundingRate } from "../../api/pages"
+import { chartsWidth,emptyData, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+
+export default {
+ data() {
+ return {
+ fundingRateLoading: false,
+ num: 0,
+ option: {
+ xAxis: {
+ type: 'category',
+ data: []
+ },
+
+ yAxis: {
+ type: 'value'
+ },
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+
+ var res = params[0].name;
+ let value = params[0].value + ""
+ if (value.length > 4) {
+ value = value.slice(0, 6)
+ } else {
+ value = value
+ }
+ // console.log(value,value.length,565);
+ res += `${params[0].marker} ${params[0].seriesName} \u00A0\u00A0\u00A0\u00A0 ${value}%
+ `;
+
+ // for (let i = 0; i <= params.length - 1; i++) {
+ // res += `${params[0].marker} ${params[0].seriesName} ${params[0].value}`;
+ // }
+ return res;
+ },
+
+ },
+ dataZoom: [
+ {
+ type: "inside",
+ start: 80,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 5,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: 'funding rate',
+ type: 'bar',
+ data: [],
+ itemStyle: {
+ normal: {
+ // 使用函数返回颜色值
+ color: function (params) {
+ var val = params.value;
+ if (val > 0) {
+ // 正数柱状图染成红色
+ return 'green';
+ } else if (val < 0) {
+ // 负数柱状图染成绿色
+ return 'red';
+ }
+ // 0 值不染色
+ return '';
+ }
+ }
+ },
+ z: 1
+ },
+
+ {
+ name: 'fundingRate',
+ type: 'line',
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ data: [],
+ itemStyle: {
+ color: "#FF8C00",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ // 线条样式
+ color: '#FF8C00',
+ width: 2
+ },
+ yAxixIndex: 1,
+ z: 2
+ }
+ ]
+ },
+ params: {
+
+ symbol: "ETHUSDT",
+ start: "",
+ end: "",
+ sma: "",
+
+ },
+ symbolList: [{
+ value: "BTCUSDT",
+ label: "BTCUSDT",
+ },
+ {
+ value: "ETHUSDT",
+ label: "ETHUSDT",
+ },
+ ],
+ priceTime: {
+ start: "2022-08-25",
+ end: "2022-09-20",
+ },
+ time: "",
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ //默认渲染当前时间一个月的数据
+ // this.params.start=getDate("day", -30);
+
+ // this.params.end = getDate()
+ this.fetchFundingRate(this.params)
+ //禁用时间框
+ // this.$addStorageEvent(1, "timeDisable", true);
+ // this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+ },
+ methods: {
+ inChart() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("fundingRateBox"));
+ }
+
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+ this.myChart.setOption(this.option);
+ chartsWidth("fundingRateBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ //请求数据
+ async fetchFundingRate(params) {
+
+ this.fundingRateLoading = true
+
+ const data = await getFundingRate(params)
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ let fundingRate = data.data.data
+
+ //空数据处理
+ let noData = emptyData(fundingRate, this.option.series, this.inChart, this)
+ if (noData) {
+ this.fundingRateLoading = false
+ return
+ }
+
+
+
+ this.option.xAxis.data.length = 0
+
+ this.option.series[0].data.length = 0
+ fundingRate.forEach((item, index) => {
+
+ let time = `${item.date.split("T")[0]} ${item.date.split("T")[1].split(`.`)[0]}`
+ this.option.xAxis.data.push(time)
+ this.option.series[0].data.push(Number(item.value * 100))
+ this.option.series[1].data.push(Number(item.value * 100))
+ })
+
+ this.inChart()
+
+ this.fundingRateLoading = false
+ },
+ //时间戳转换
+ filterTime(time) {
+ const date = new Date(time)
+ const Y = date.getFullYear()
+ const M = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
+ const D = date.getDate()
+ return `${Y}-${M}-${D}`
+ },
+ getData(n) {
+ n = new Date(n)
+ return n.toLocaleDateString().replace(/\//g, "-") + " " + n.toTimeString().substr(0, 8)
+ },
+ //初始化option
+ onOption() {
+ this.option = {
+ // legend: {
+ // // data: ['bar', 'bar2', 'bar3', 'bar4'],
+ // // left: '10%'
+ // },
+ // brush: {
+ // toolbox: ['rect', 'polygon', 'lineX', 'lineY', 'keep', 'clear'],
+ // xAxisIndex: 0
+ // },
+ // toolbox: {
+ // feature: {
+ // magicType: {
+ // type: ['stack']
+ // },
+ // dataView: {}
+ // }
+ // },
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 5,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // console.log(params,33);
+ // var res = params.name;
+ // let value = params.value + ""
+ // if (value.length > 4) {
+ // value = value.slice(0, 6)
+ // } else {
+ // value = value
+ // }
+ // // console.log(value,value.length,565);
+ // res += `${params.marker} ${params.seriesName} \u00A0\u00A0\u00A0\u00A0 ${value}%
+ // `;
+
+ // // for (let i = 0; i <= params.length - 1; i++) {
+ // // res += `${params[0].marker} ${params[0].seriesName} ${params[0].value}`;
+ // // }
+ // return res;
+ // },
+ },
+ xAxis: {
+ data: [],
+ // type:"time",
+ // name: 'X Axis',
+ axisLine: { onZero: true },
+ splitLine: { show: false },
+ splitArea: { show: false }
+ },
+ // grid: {
+ // top: "5%",
+ // // right: "10%",
+ // // height: "77%",
+ // },
+ yAxis: [
+ {
+
+ axisLabel: {
+ formatter: (value, index) => {
+ // if(this.num < value){
+ // this.num = value
+ // return value + 0.1
+ // }else{
+ // return value
+ // }
+
+
+ return `${value}%`
+ }
+ },
+ // max:this.num
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ grid: {
+ // bottom: 100
+ },
+ series: [
+ {
+ name: 'fundingRate',
+ type: 'bar',
+ stack: 'one',
+ emphasis: "",
+ itemStyle: {//颜色设置
+ normal: {
+ color: function (params) { //根据数值大小设置相关颜色
+ if (params.value > 0) {
+ return 'green'
+ } else {
+ return 'red'
+ }
+ }
+ }
+ },
+
+ data: [],
+ z: 1
+ },
+ {
+ name: "fundingRate",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 1,
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ z: 2
+ },
+
+ ]
+ }
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ // let dateStart = new Date(start);
+ // let dateEnd = new Date(end);
+ // this.params.start = dateStart.getTime()
+ // this.params.end = dateEnd.getTime()
+ this.params.start = start
+ this.params.end = end
+ this.fetchFundingRate(this.params)
+ this.params.start = "";
+ this.params.end = "";
+ },
+ //选择Symbol
+ handelSymbol(val) {
+
+ this.fetchFundingRate(this.params)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchFundingRate(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+
+
+ },
+
+ }
+
+}
\ No newline at end of file
diff --git a/yq/src/views/fundingRateETH/index.vue b/yq/src/views/fundingRateETH/index.vue
new file mode 100644
index 0000000..e5047ac
--- /dev/null
+++ b/yq/src/views/fundingRateETH/index.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/getBuyData/index.js b/yq/src/views/getBuyData/index.js
new file mode 100644
index 0000000..a963a6a
--- /dev/null
+++ b/yq/src/views/getBuyData/index.js
@@ -0,0 +1,209 @@
+import * as echarts from "echarts";
+import { handelWatermark, chartsWidth,emptyData } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ //柱状图配置
+ //柱状图配置
+ columnar: {},
+ params: {
+ req: "",
+ radius: "btc"
+ },
+ BuyData: [],
+ buyDataLoading: false,
+ introduce: "",//接口介绍
+ value1: "",
+ pickerOptions: {
+ disabledDate: (time) => {
+ return time.getTime() > new Date(this.DateTime).getTime()
+ },
+ },
+ DateTime: "",
+
+ }
+ },
+ created() {
+ this.onOption();
+ },
+ mounted() {
+
+ let menuObj = localStorage.getItem("params");
+ this.params.req = JSON.parse(menuObj).componentReq;
+ this.introduce = JSON.parse(menuObj).introduce;
+ //监听localstorage变化
+ window.addEventListener("setItem", () => {
+ let menuObj = localStorage.getItem("params");
+ this.params.req = JSON.parse(menuObj).componentReq;
+ this.introduce = JSON.parse(menuObj).introduce;
+ });
+ },
+ watch: {
+ params: {
+ handler(val) {
+ if (val.req == "getBuyData" || val.req == "getBuyAmountData") {
+ this.value1 = ""
+ this.fetchBuyData(this.params.req, this.params.radius)
+ } else {
+ return
+ }
+
+ },
+ deep: true
+
+ }
+ },
+ methods: {
+ //初始化柱状图图表
+ inCharts() {
+ this.myChart = echarts.init(document.getElementById("BuyData"));
+
+ this.myChart.setOption(this.columnar);
+ chartsWidth("BuyData", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchBuyData(req, radius, start) {
+ this.buyDataLoading = true
+ const { data } = await this.$API.getHolder(req, radius, start)
+ this.BuyData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.columnar.series, this.inCharts, this)
+ if (noData) {
+ this.buyDataLoading = false
+ return
+ }
+ // this.columnar.xAxis[0].data.length = 0
+ this.columnar.series[0].data.length = 0
+ //添加水印
+ this.columnar = handelWatermark(this.columnar)
+ //对象数据转换成数组
+ let arr = Object.entries(this.BuyData)
+ let newData = []
+ arr.forEach(item => {
+ if (item[0] == "id" || item[0] == "date") {
+ if (item[0] == "date") {
+ this.DateTime = item[1].split("T")[0]
+ this.columnar.title.text = `${this.DateTime}`
+ }
+ return
+
+ } else {
+
+ if (item[0].split("t")[0] == "buyAmoun") {
+ item[0] = Number(item[0].split("t")[1])
+ } else {
+ item[0] = Number(item[0].split("y")[1])
+ }
+ newData.push(item)
+ }
+
+ })
+ this.columnar.series[0].data = newData
+
+ this.inCharts()
+
+
+ this.buyDataLoading = false
+ },
+ onOption() {
+ this.columnar = {
+ // animation: false,
+ title: {
+ text: "",
+ left: "center",
+ textStyle: {
+ fontSize: 15,
+ fontWeight: "normal"
+ },
+ },
+ // grid: {
+ // right: 80,
+ // },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ axisPointer: {
+ type: "cross",
+ crossStyle: {
+ color: "#999",
+ },
+ },
+ },
+
+ xAxis: {
+ type: "category",
+ // splitLine: {
+ // color: "rgba(0,0,0,0.1)"
+ // },
+ axisLabel: {
+ formatter: function (a) {
+ let value = a / 1000
+ return `${value}k`
+ }
+ },
+
+ },
+ yAxis: {
+ // position: "left",
+ //坐标两边留白
+ // boundaryGap: true,
+ //网格线设置
+ // splitLine: {
+ // color: "rgba(0,0,0,0.1)",
+ // },
+ // axisTick: {
+ // color: "red"
+ // },
+ axisLabel: {
+ formatter: function (value) {
+
+ let label = value / 1000000
+ return `${label}M`
+ },
+ },
+ // axisLine: {
+ // onZero: false
+ // }
+ },
+ dataZoom: [
+ {
+ show: false,
+ type: 'inside',
+ minSpan: 30,
+ start: 0,
+ end: 95
+ },
+ {
+ show: false,
+ type: 'inside',
+ // filterMode: 'none',
+ // minSpan: 0.1,
+ // maxSpan: 99,
+ // yAxisIndex: [0],
+ // startValue: -20,
+ // endValue: 20
+ }
+ ],
+ series: [
+ {
+ type: 'bar',
+ showSymbol: false,
+ // clip: true,
+ data: [],
+ itemStyle: {
+ color: "#fdaa56",
+ },
+ }
+ ]
+ }
+ },
+ //时间选择
+ handeldate() {
+ this.fetchBuyData(this.params.req, this.params.radius, this.value1)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/getBuyData/index.vue b/yq/src/views/getBuyData/index.vue
new file mode 100644
index 0000000..ceaa270
--- /dev/null
+++ b/yq/src/views/getBuyData/index.vue
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/goldenRatioMult/index.js b/yq/src/views/goldenRatioMult/index.js
new file mode 100644
index 0000000..89e811c
--- /dev/null
+++ b/yq/src/views/goldenRatioMult/index.js
@@ -0,0 +1,471 @@
+import * as echarts from "echarts";
+import { takeGoldenRatioMult } from "../../api/pages"
+import { chartsWidth,dataLength, emptyData,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ goldenRatioMultLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "350DMA",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "1.6 Accumulation High",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#2ca02c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#2ca02c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "2 Low Bull High",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#d62728",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#d62728",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "3 Upper Bull High",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#9467bd",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#9467bd",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "350DMA x5",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#75c1df",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#75c1df",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 0,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 0,
+ // data: [],
+ // },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ dataS: [{
+
+ }],
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchGoldenRatioMult({})
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("goldenRatioMultBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("goldenRatioMultBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchGoldenRatioMult(params) {
+ this.goldenRatioMultLoading = true
+ const { data } = await takeGoldenRatioMult(params)
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.goldenRatioMultLoading = false
+ return
+ }
+ let goldenRatioMultData = data.data
+ this.start = goldenRatioMultData[0].date.split("T")[0]
+ this.end = goldenRatioMultData[goldenRatioMultData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+ let ma350x1ValueList = []
+ let ma3501r6ValueList = []
+ let ma350x2ValueList = []
+ let ma350x3ValueList = []
+ let ma350x5ValueList = []
+
+ goldenRatioMultData.forEach(item => {
+ if (item.ma3501r6 == null) {
+ item.ma3501r6 = 0
+ }
+ ma350x1ValueList.push(Number(item.ma350x1.toFixed(2)))
+ ma3501r6ValueList.push(Number(item.ma350x1r6.toFixed(2)))
+ ma350x2ValueList.push(Number(item.ma350x2.toFixed(2)))
+ ma350x3ValueList.push(Number(item.ma350x3.toFixed(2)))
+ ma350x5ValueList.push(Number(item.ma350x5.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(goldenRatioMultData, ma350x1ValueList)
+ this.option.series[1].data = handelProfitrate(goldenRatioMultData, ma3501r6ValueList)
+ this.option.series[2].data = handelProfitrate(goldenRatioMultData, ma350x2ValueList)
+ this.option.series[3].data = handelProfitrate(goldenRatioMultData, ma350x3ValueList)
+ this.option.series[4].data = handelProfitrate(goldenRatioMultData, ma350x5ValueList)
+
+
+ this.inCharts()
+ console.log(this.option);
+ this.goldenRatioMultLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchGoldenRatioMult(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[5], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[6], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchGoldenRatioMult(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[5], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/goldenRatioMult/index.vue b/yq/src/views/goldenRatioMult/index.vue
new file mode 100644
index 0000000..f83cdbd
--- /dev/null
+++ b/yq/src/views/goldenRatioMult/index.vue
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/goldenRatioMultEth/index.js b/yq/src/views/goldenRatioMultEth/index.js
new file mode 100644
index 0000000..be57887
--- /dev/null
+++ b/yq/src/views/goldenRatioMultEth/index.js
@@ -0,0 +1,462 @@
+import * as echarts from "echarts";
+import { takegoldenRatioMultEth } from "../../api/pages"
+import { chartsWidth,dataLength, emptyData,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ goldenRatioMultEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "350DMA",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "1.6 Accumulation High",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#2ca02c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#2ca02c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "2 Low Bull High",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#d62728",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#d62728",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "3 Upper Bull High",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#9467bd",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#9467bd",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "350DMA x5",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#75c1df",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#75c1df",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 0,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchGoldenRatioMultEth({})
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("goldenRatioMultEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("goldenRatioMultEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchGoldenRatioMultEth(params) {
+ this.goldenRatioMultEthLoading = true
+ const { data } = await takegoldenRatioMultEth(params)
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.goldenRatioMultEthLoading = false
+ return
+ }
+
+
+ let goldenRatioMultEthData = data.data
+ this.start = goldenRatioMultEthData[0].date.split("T")[0]
+ this.end = goldenRatioMultEthData[goldenRatioMultEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+ // })
+
+ // this.handelSonEthPrice("ETH", true)
+ let ma350x1ValueList = []
+ let ma3501r6ValueList = []
+ let ma350x2ValueList = []
+ let ma350x3ValueList = []
+ let ma350x5ValueList = []
+ let priceValueList = []
+ goldenRatioMultEthData.forEach(item => {
+ if (item.ma3501r6 == null) {
+ item.ma3501r6 = 0
+ }
+ ma350x1ValueList.push(Number(item.ma350x1.toFixed(2)))
+ ma3501r6ValueList.push(Number(item.ma350x1r6.toFixed(2)))
+ ma350x2ValueList.push(Number(item.ma350x2.toFixed(2)))
+ ma350x3ValueList.push(Number(item.ma350x3.toFixed(2)))
+ ma350x5ValueList.push(Number(item.ma350x5.toFixed(2)))
+ priceValueList.push(Number(item.price.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(goldenRatioMultEthData, ma350x1ValueList)
+ this.option.series[1].data = handelProfitrate(goldenRatioMultEthData, ma3501r6ValueList)
+ this.option.series[2].data = handelProfitrate(goldenRatioMultEthData, ma350x2ValueList)
+ this.option.series[3].data = handelProfitrate(goldenRatioMultEthData, ma350x3ValueList)
+ this.option.series[4].data = handelProfitrate(goldenRatioMultEthData, ma350x5ValueList)
+ this.option.series[5].data = handelProfitrate(goldenRatioMultEthData, priceValueList)
+
+
+
+ this.inCharts()
+
+ this.goldenRatioMultEthLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchGoldenRatioMultEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[5], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[5], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+
+ this.params.sma = smaDataList
+ this.fetchGoldenRatioMultEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[5], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/goldenRatioMultEth/index.vue b/yq/src/views/goldenRatioMultEth/index.vue
new file mode 100644
index 0000000..3bc4892
--- /dev/null
+++ b/yq/src/views/goldenRatioMultEth/index.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/help/index.js b/yq/src/views/help/index.js
new file mode 100644
index 0000000..d4f33ed
--- /dev/null
+++ b/yq/src/views/help/index.js
@@ -0,0 +1,372 @@
+import { mapState } from "vuex";
+import { getQuestionType, getSubmitTicket, getPrivateTicket } from "../../api/help"
+export default {
+ data() {
+ return {
+ helpLoading: false,
+ imgSrc: "https://studio.glassnode.com/images/crypto-icons/btc.png",
+ navLabel: "Bitcoin (BTC)",
+ userName: "LX",
+ from: {
+ title: "",
+ desc: "",
+ type: "",
+ files: ""
+ },
+ kindsList: [{
+ id: "购买咨询",
+ type: "购买咨询",
+ }, {
+ id: "财务咨询",
+ type: "财务咨询",
+ }, {
+ id: "网页问题",
+ type: "网页问题",
+ },
+ {
+ id: "账户问题",
+ type: "账户问题",
+ },
+ {
+ id: "移动端问题",
+ type: "移动端问题",
+ },
+ {
+ id: "消息订阅",
+ type: "消息订阅",
+ },
+ {
+ id: "指标数据问题",
+ type: "指标数据问题",
+ },
+ {
+ id: "其他",
+ type: "其他",
+ }],
+ tableData: [{
+ id: 1,
+ time: "2022-09-01 16:00",
+ type: "账户问题",
+ title: "账户不能登录",
+ status: "已解决",
+ userName: "",//用户名
+ date: "",//提交时间戳
+
+ }],
+ //上传后的文件列表
+ fileList: [],
+ // 允许的文件类型
+ fileType: ["rar", "doc", "txt", "png", "jpg", "jpeg",],
+ // 运行上传文件大小,单位 M
+ fileSize: 20,
+ // 附件数量限制
+ fileLimit: 3,
+ //请求头
+ headers: { "Content-Type": "multipart/form-data" },
+ FormDatas: null,
+ helpDialogVisible: false,
+ fileName: [],
+ filesId: [],
+ statusList: [{
+ value: "4",
+ label: "已处理",
+ }, {
+ value: "5",
+ label: "已回复",
+ }, {
+ value: "2",
+ label: "撤回",
+ }, {
+ value: "3",
+ label: "正在处理/待处理",
+ }, {
+ value: "7",
+ label: "超时",
+ }, {
+ value: "8",
+ label: "待审核",
+ }, {
+ value: "11",
+ label: "审核完成",
+ },],
+ fileItem: "",
+ uploadedFiles: [],
+ inputLimit:160,
+
+
+
+ }
+ },
+ computed: {
+ ...mapState({
+ current: (state) => state.tab.currentMenu,
+ }),
+ },
+ mounted() {
+ this.fetchQuestionType()
+ this.fetchPrivateTicket()
+
+ this.userName = localStorage.getItem("username")
+ window.addEventListener("setItem", () => {
+ this.userName = localStorage.getItem("username")
+ this.filesId = []
+ })
+
+ },
+ methods: {
+
+ //获取问题分类
+ async fetchQuestionType() {
+ const { data } = await getQuestionType()
+ this.kindsList = data.data
+ },
+ //请求提交工单
+ async fetchSubmitTicket(data) {
+ const list = await getSubmitTicket(data)
+
+ if (list.data.code == 200) {
+ this.$message({
+ message: list.data.msg,
+ type: "success",
+ customClass: "messageClass",
+ });
+ //清空数据
+ for (const key in this.from) {
+ this.from[key] = ""
+ }
+
+ this.fetchPrivateTicket()//刷新历史工单
+ this.fileList = []//上传成功清空附件
+
+
+ }
+
+ },
+ //请求个人工单列表(历史)
+ async fetchPrivateTicket(data) {
+ const list = await getPrivateTicket(data)
+ this.tableData = list.data.data
+ this.tableData.forEach(item => {
+ item.date = `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ })
+ // console.log(list, "请求个人工单列表(历史)");
+ },
+
+ //选择问题种类
+ handelKinds() {
+
+ },
+ //点击历史工单详情 "/WorkOrderDetails"
+ handelDetails(row) {//跳转时将该行参数带过去
+ this.$addStorageEvent(1, "detailsID", row.id);
+ this.$router.push({
+ path: "/WorkOrderDetails",
+ name: "WorkOrderDetails",
+ params: row
+ })
+
+
+ },
+ //上传文件之前
+ beforeUpload(file) {
+ // 校验文件类型和大小
+ const fileType = file.name.slice(file.name.lastIndexOf('.') + 1).toLowerCase();
+ const isTypeValid = this.fileType.includes(fileType);
+ const isSizeValid = file.size / 1024 / 1024 <= this.fileSize;
+ if (!isTypeValid) {//不支持的文件类型
+ this.$message.error(`${this.$t(`help.fileType`)}:${fileType}`);
+ return false;
+ }
+ if (!isSizeValid) {//文件大小不能超过
+ this.$message.error(`${this.$t(`help.fileSize`)} ${this.fileSize} MB.`);
+ return false;
+ }
+
+ },
+ handelChange(file, fileList){ //控制显示上传显示列表
+ // 校验文件类型和大小
+ const fileType = file.name.slice(file.name.lastIndexOf('.') + 1).toLowerCase();
+ const isTypeValid = this.fileType.includes(fileType);
+ const isSizeValid = file.size / 1024 / 1024 <= this.fileSize;
+ if (!isTypeValid) {//不支持的文件类型
+ this.$message.error(`${this.$t(`help.fileType`)}:${fileType}`);
+ this.fileList = this.fileList.filter(item => item.name != file.name);
+ return false;
+ }
+ if (!isSizeValid) {//文件大小不能超过
+ this.$message.error(`${this.$t(`help.fileSize`)} ${this.fileSize} MB.`);
+ this.fileList = this.fileList.filter(item => item.name != file.name);
+ return false;
+ }
+
+ let flag = this.fileList.some(item => item.name == file.name )
+ console.log();
+ if (flag){
+ this.$message.warning(this.$t(`help.sameName`));
+ this.$refs.upload.handleRemove(file)
+
+ return false
+ }
+ this.fileName.push(file.name)
+ this.fileList.push(file.raw)
+ console.log( this.fileName,"name" ,this.fileList);
+ },
+
+ //上传了的文件给移除的事件,
+ handleRemove(file, fileList) {
+
+ let nameIndex = this.fileName.indexOf(file.name); // 获取第一个重复元素的索引
+ if (nameIndex !== -1) {
+ this.fileName.splice(nameIndex, 1); // 删除第一个重复元素
+ }
+
+
+
+
+ let index = this.fileList.indexOf(file); // 获取第一个重复元素的索引
+
+ if (index !== -1) {
+ this.fileList.splice(index, 1); // 删除第一个重复元素
+ }
+
+
+
+ },
+
+ //超出文件个数的回调
+ handleExceed() {
+ this.$message({
+ type: 'warning',
+ message: this.$t(`help.fileNum`)
+ }); return
+ },
+ //上传文件的事件
+ uploadFile(item) {
+ this.fileItem = item
+
+ this.fileList.push(item.file);
+ this.fileName.push(item.file.name)
+
+ },
+ //上传成功后的回调
+ handleSuccess() {
+
+ },
+ //点击提交按钮
+ handelSubmit() {
+
+ for (const key in this.from) { //判空
+ if (key !== `files` && this.from[key] == "") {
+ switch (key) {
+ case "title":
+ this.$message({
+ message: this.$t(`help.problemTitle1`),
+ type: "error",
+ });
+ break;
+
+ case "type":
+ this.$message({
+ message: this.$t(`help.problem2`),
+ type: "error",
+ });
+ break;
+ case "desc":
+ this.$message({
+ message: this.$t(`help.describe`),
+ type: "error",
+ });
+ break;
+ default:
+ break;
+ }
+
+ return
+ }
+ }
+
+ this.helpDialogVisible = true
+
+ },
+ //点击弹窗确认提交按钮
+ handelConfirm() {
+
+ if (this.fileList[0]) { //附件有值就走上传附件成功 提交工单
+
+ //上传文件的需要formdata类型;所以要转
+ this.FormDatas = new FormData()
+ this.fileList.forEach(fileItem => {
+
+ this.FormDatas.append('file', fileItem);
+
+
+ })
+
+ console.log(this.FormDatas,"文件");
+ // 上传选择附件
+ this.$axios({
+ method: 'post',
+ url: 'marketall/ticket/uploadFile',
+ headers: this.headers,
+ timeout: 30000,
+ data: this.FormDatas
+ }).then(res => {
+ console.log(res,"上传附件");
+ this.from.files = res.data.data.id
+
+ if (this.from.files) {//成功拿到返回ID
+ this.fetchSubmitTicket(this.from) //提交工单
+ }
+
+ })
+
+
+ } else {
+
+ this.fetchSubmitTicket(this.from) //没有附件提交工单
+ }
+
+
+
+
+
+
+
+
+
+
+
+ // this.fetchSubmitTicket(this.from)
+ this.helpDialogVisible = false
+ },
+ //处理时间格式
+ handelTime(date) {
+ return `${date.split(`T`)[0]} ${date.split(`T`)[1].split(`.`)[0]}`
+ },
+ //选择问题种类
+ handelType(id) {
+
+ if (id) {
+ return this.kindsList.find(item => item.id == id).type
+ }
+
+ },
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/help/index.vue b/yq/src/views/help/index.vue
new file mode 100644
index 0000000..7c9567e
--- /dev/null
+++ b/yq/src/views/help/index.vue
@@ -0,0 +1,335 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ * {{ $t("login.userName") }}
+
+
+
+
+
+
+ * {{ $t("login.title") }}
+
+
+
+
+
+
+ * {{ $t("login.kinds") }}
+
+
+
+
+
+
+
+
+
+
+ * {{ $t("login.description") }}
+
+
+
+ {{ $t("login.description1") }}
+
+
+
+
+ {{ $t("login.attachment") }}
+
+
+
+
+
+ {{ $t("login.Upload") }} {{ $t("login.Upload1") }}
+
+
+
+
+
+ {{
+ $t("login.submit")
+ }}
+
+
+
+
+
+
+ {{$t(`help.historyTable`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`help.details`)}}
+
+
+
+
+
+
+
+
+
+
+
{{$t("login.userName")}} : {{userName}}
+
{{ $t("login.title") }} : {{from.title}}
+
{{ $t("login.kinds") }} : {{ handelType(from.type) ||""}}
+
{{ $t("login.description") }} : {{from.desc}}
+
+
{{ $t("login.attachment") }}
+
+ {{item}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/helpBackstage/index.js b/yq/src/views/helpBackstage/index.js
new file mode 100644
index 0000000..e706102
--- /dev/null
+++ b/yq/src/views/helpBackstage/index.js
@@ -0,0 +1,447 @@
+import * as echarts from "echarts";
+import { getDailyCount, getTicketList } from "../../api/help"
+import { handelProfitrate,handelZoom,handelWatermark,emptyData} from "../../util/processingData"
+export default {
+ data() {
+ return {
+ tableData2: [{
+ id: 1,
+ time: "2022-09-01 16:00",
+ type: "账户问题",
+ title: "账户不能登录",
+ userName:"",//提交用户名
+ date:"",//提交时间
+ status: "已解决"
+ }],
+ tableData3: [{
+ id: 1,
+ time: "2022-09-01 16:00",
+ type: "账户问题",
+ title: "账户不能登录",
+ userName:"",//提交用户名
+ date:"",//提交时间
+ status: "已解决"
+ }],
+ tableData4: [{
+ id: 1,
+ time: "2022-09-01 16:00",
+ type: "账户问题",
+ title: "账户不能登录",
+ userName:"",//提交用户名
+ date:"",//提交时间
+ status: "已解决"
+ }],
+ tableData7: [{
+ id: 1,
+ time: "2022-09-01 16:00",
+ type: "账户问题",
+ title: "账户不能登录",
+ userName:"",//提交用户名
+ date:"",//提交时间
+ status: "已解决"
+ }],
+ tableData8: [{
+ id: 1,
+ time: "2022-09-01 16:00",
+ type: "账户问题",
+ title: "账户不能登录",
+ userName:"",//提交用户名
+ date:"",//提交时间
+ status: "已解决"
+ }],
+ tableData11: [{
+ id: 1,
+ time: "2022-09-01 16:00",
+ type: "账户问题",
+ title: "账户不能登录",
+ userName:"",//提交用户名
+ date:"",//提交时间
+ status: "已解决"
+ }],
+ tableData12: [{
+ id: 1,
+ time: "",
+ type: "",
+ title: "",
+ userName:"",//提交用户名
+ date:"",//提交时间
+ status: ""
+ }],
+ data: [{
+
+ }],
+ dailyCount: {
+ submitNum: "",//今日提交工单数
+ solvedNum: "",//已处理工单数
+ pendingNum: "",//未处理工单数
+ checkingNum: "",//待审核工单数
+ checkedNum: "", //已审核工单数
+ },
+ dayWorkOrder:"",//今日工单
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//百万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: true,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+
+
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "今日提交工单数",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "已处理工单数",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#a32140",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 1,
+ lineStyle: {
+ //线条样式
+ color: "#a32140",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "未处理工单数",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#7a5edf",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 2,
+ lineStyle: {
+ //线条样式
+ color: "#7a5edf",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "待审核工单数",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#040404",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 3,
+ lineStyle: {
+ //线条样式
+ color: "#040404",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "已审核工单数",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#12a62b",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 4,
+ lineStyle: {
+ //线条样式
+ color: "#12a62b",
+ width: "1",
+ },
+ data: [],
+ },
+
+
+ ],
+ },
+ helpBackstageLoading:false
+
+ }
+ },
+ mounted() {
+ this.fetchTicketList7({status:7})
+ this.fetchTicketList2({status:2})
+ this.fetchTicketList3({status:3})
+ this.fetchTicketList4({status:4})
+ this.fetchTicketList8({status:8})
+ this.fetchTicketList11({status:11})
+ this.fetchTicketList12({status:12})
+ this.fetchDailyCount()
+
+ },
+ methods: {
+
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("helpBackstageBox"));
+ }
+ this.option= handelZoom(this.myChart,this.option,this,this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ //请求每日工单数 图表使用 .replace(/-/g,"/")
+ async fetchDailyCount(data) {
+ this.helpBackstageLoading =true
+ const list = await getDailyCount(data)
+ //空数据处理
+ let noData = emptyData(list.data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.helpBackstageLoading = false
+ return
+ }
+ let today = new Date()
+ today= today.toISOString().split("T")[0] //拿到当前日期 年月日
+
+ // //添加水印
+ this.option= handelWatermark(this.option)
+ let chartData = list.data.data
+ let submitNumValueList = []
+ let solvedNumValueList = []
+ let pendingNumValueList = []
+ let checkingNumValueList = []
+ let checkedNumValueList = []
+ chartData.forEach(item => {
+ if (item.date.split("T")[0] == today) {
+ console.log(item,6+6+6);
+ this.dailyCount=item
+ }
+
+ submitNumValueList.push(Number(item.submitNum.toFixed(2)))
+ solvedNumValueList.push(Number(item.solvedNum.toFixed(2)))
+ pendingNumValueList.push(Number(item.pendingNum.toFixed(2)))
+ checkingNumValueList.push(Number(item.checkingNum.toFixed(2)))
+ checkedNumValueList.push(Number(item.checkedNum.toFixed(2)))
+
+ });
+
+ this.option.series[0].data = handelProfitrate(chartData, submitNumValueList)
+ this.option.series[1].data = handelProfitrate(chartData, solvedNumValueList)
+ this.option.series[2].data = handelProfitrate(chartData, pendingNumValueList)
+ this.option.series[3].data = handelProfitrate(chartData, checkingNumValueList)
+ this.option.series[4].data = handelProfitrate(chartData, checkedNumValueList)
+
+
+ this.inCharts()
+ this.helpBackstageLoading =false
+
+
+ },
+ //请求超时工单列表
+ async fetchTicketList7(data) {
+ const list = await getTicketList(data)
+ // console.log(list,"超时工单列表");
+ this.tableData7 = list.data.data
+ this.tableData7.forEach(item=>{
+ item.date = `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ })
+
+ },
+ //请求撤回工单列表
+ async fetchTicketList2(data) {
+ const list = await getTicketList(data)
+ // console.log(list,"撤回工单列表");
+ this.tableData2 = list.data.data
+ this.tableData2.forEach(item=>{
+ item.date = `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ })
+ },
+ //请求待处理工单列表
+ async fetchTicketList3(data) {
+ const list = await getTicketList(data)
+ // console.log(list,"待处理工单");
+ this.tableData3 =list.data.data
+ this.tableData3.forEach(item=>{
+ item.date = `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ })
+
+ },
+ //请求已处理工单列表
+ async fetchTicketList4(data) {
+ const list = await getTicketList(data)
+ this.tableData4 = list.data.data
+ this.tableData4.forEach(item=>{
+ item.date = `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ })
+ },
+ //请求待审核工单列表
+ async fetchTicketList8(data) {
+ const list = await getTicketList(data)
+ this.tableData8 = list.data.data
+ this.tableData8.forEach(item=>{
+ item.date = `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ })
+ },
+ //请求审核完成工单列表
+ async fetchTicketList11(data) {
+ const list = await getTicketList(data)
+ this.tableData11 = list.data.data
+ this.tableData11.forEach(item=>{
+ item.date = `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ })
+ },
+ //请求已关闭工单列表
+ async fetchTicketList12(data) {
+ const list = await getTicketList(data)
+ this.tableData12 = list.data.data
+ this.tableData12.forEach(item=>{
+ item.date = `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ })
+ },
+
+
+
+ //点击详情 跳转工单处理页面
+ handelDetails(row) {
+ this.$addStorageEvent(1, "detailsID",row.id );
+ this.$router.push({
+ path: "/HelpDetails",
+ name: "HelpDetails",
+ params: row
+ })
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/helpBackstage/index.vue b/yq/src/views/helpBackstage/index.vue
new file mode 100644
index 0000000..017b684
--- /dev/null
+++ b/yq/src/views/helpBackstage/index.vue
@@ -0,0 +1,318 @@
+
+
+
+
+
+
+
+
+ {{$t(`help.SubmitToday`)}}: {{dailyCount.submitNum||0}}
+
+
+ {{$t(`help.processed`)}}: {{tableData4.length}}
+
+
+ {{$t(`help.unprocessed`)}}: {{tableData3.length}}
+
+
+ {{$t(`help.beReviewed`)}}: {{tableData8.length}}
+
+
+ {{$t(`help.reviewed`)}}: {{tableData11.length}}
+
+
+
+
+
+ {{$t(`help.chart`)}}
+
+
+
+
+
+
+
+
+ {{$t(`help.timeout`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`help.details`)}}
+
+
+
+
+
+
+
+
+
+ {{$t(`help.beProcessed`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`help.details`)}}
+
+
+
+
+
+
+
+
+
+ {{$t(`help.processedTable`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`help.details`)}}
+
+
+
+
+
+
+
+
+
+ {{$t(`help.beReviewedTable`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`help.details`)}}
+
+
+
+
+
+
+
+
+
+ {{$t(`help.reviewedTable`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`help.details`)}}
+
+
+
+
+
+
+
+
+
+ {{$t(`help.withdrawTable`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`help.details`)}}
+
+
+
+
+
+
+
+
+
+ {{$t(`help.closedTable`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`help.details`)}}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/helpDetails/index.js b/yq/src/views/helpDetails/index.js
new file mode 100644
index 0000000..d0fc25b
--- /dev/null
+++ b/yq/src/views/helpDetails/index.js
@@ -0,0 +1,441 @@
+import { mapState } from "vuex";
+import axios from 'axios'
+import { getTicketDetails, getDownloadFile, getResponTicket, getAuditTicket, getSubmitAuditTicket } from "../../api/help"
+export default {
+ data() {
+ return {
+ helpDetailsLoading: false,
+ imgSrc: "https://studio.glassnode.com/images/crypto-icons/btc.png",
+ navLabel: "Bitcoin (BTC)",
+ userName: "LX",
+ from: {
+ title: "",
+ kinds: "",
+ description: ""
+ },
+ kindsList: [{
+ value: "购买咨询",
+ label: "购买咨询",
+ }, {
+ value: "财务咨询",
+ label: "财务咨询",
+ }, {
+ value: "网页问题",
+ label: "网页问题",
+ },
+ {
+ value: "账户问题",
+ label: "账户问题",
+ },
+ {
+ value: "移动端问题",
+ label: "移动端问题",
+ },
+ {
+ value: "消息订阅",
+ label: "消息订阅",
+ },
+ {
+ value: "指标数据问题",
+ label: "指标数据问题",
+ },
+ {
+ value: "其他",
+ label: "其他",
+ }],
+ params: [],
+ input: 1,
+ tableData: [{
+ num: 1,
+ time: "2022-09-01 16:00",
+ problem: "账户问题",
+ questionTitle: "账户不能登录",
+ state: "已解决"
+ }],
+ textarea: "我是提交内容",
+ textarea1: "我是回复内容",
+ textarea2: "",
+ replyInput: true,
+ ticketDetails: {
+ id: "",
+ type: "",
+ title: "",
+ userName: "",
+ desc: "",
+ responName: "",
+ respon: "",
+ submitTime: "",
+ status: "",
+ fileIds: "",
+ files: "",
+ responTime: ""
+
+ },
+ //上传后的文件列表
+ fileList: [],
+ // 允许的文件类型
+ fileType: ["rar", "doc", "txt", "png", "jpg", "jpeg",],
+ // 运行上传文件大小,单位 M
+ fileSize: 20,
+ // 附件数量限制
+ fileLimit: 3,
+ //请求头
+ headers: { "Content-Type": "multipart/form-data" },
+ FormDatas: null,
+ filesId: [],
+ paramsDownload: {
+ id: ""
+ },
+ //回复工单参数
+ paramsResponTicket: {
+ id: "",
+ files: "",
+ respon: "",
+
+ },
+ //审核工单参数
+ paramsAuditTicket: {
+ id: "",
+ msg: ""
+ },
+ //提交审核参数
+ paramsSubmitAuditTicket: {
+ id: ""
+ },
+ identity: {},
+ detailsID: "",
+ auditList: {},//审核信息
+ downloadUrl:""
+
+
+
+
+ }
+ },
+ computed: {
+ ...mapState({
+ current: (state) => state.tab.currentMenu,
+ }),
+ },
+ mounted() {
+
+
+ if (localStorage.getItem("identity")) {
+ this.identity = JSON.parse(localStorage.getItem("identity"));
+ }
+
+ this.detailsID = localStorage.getItem("detailsID")
+ window.addEventListener("setItem", () => {
+ if (localStorage.getItem("identity")) {
+ this.identity = JSON.parse(localStorage.getItem("identity"));
+ }
+ this.detailsID = localStorage.getItem("detailsID")
+ });
+
+ this.fetchTicketDetails({ id: this.detailsID })
+ },
+ methods: {
+ //请求工单详情
+ async fetchTicketDetails(data) {
+ // this.helpDetailsLoading =true
+ const list = await getTicketDetails(data)
+
+ if (list.data.code !== 200) {
+ this.$message({
+ message: list.data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+
+ }
+ this.auditList = list.data.data.audit
+ this.ticketDetails = list.data.data
+ console.log(this.ticketDetails,6666);
+ this.ticketDetails.submitTime = `${this.ticketDetails.submitTime.split("T")[0]} ${this.ticketDetails.submitTime.split("T")[1].split(".")[0]}`
+ this.helpDetailsLoading = false
+ },
+ //请求文件下载
+ async fetchDownloadFile(ids) {
+ // const list = await getDownloadFile(data)
+ const list = await this.$API.getDownloadFile(ids)
+ this.$message({
+ message: list.data.msg,
+ type: "warning",
+ customClass: "messageClass",
+ });
+
+ },
+ //请求回复工单
+ async fetchResponTicket(data) {
+ const list = await getResponTicket(data)
+
+ if (list.data.code == 200) {
+ this.$message({
+ message: list.data.msg,
+ type: "success",
+ customClass: "messageClass",
+ });
+ for (const key in this.paramsResponTicket) {//清空工单
+ this.paramsResponTicket[key] = ""
+ }
+ //回复成功刷新工单
+ this.fetchTicketDetails({ id: this.detailsID })
+ this.fileList =[] // 清空已上传列表
+ }
+
+
+
+ },
+ //请求审核人员审核工单
+ async fetchAuditTicket(data) {
+ const list = await getAuditTicket(data)
+ if (list.data.code == 200) {
+ this.$message({
+ message: list.data.msg,
+ type: "success",
+ customClass: "messageClass",
+ });
+
+ for (const key in this.ticketDetails) {//清空工单
+ this.ticketDetails[key] = ""
+ }
+
+ this.$router.back()//回到上一级页面
+
+
+ }
+
+
+
+ },
+ //请求提交审核
+ async fetchSubmitAuditTicket(data) {
+ // this.helpDetailsLoading =true
+ const list = await getSubmitAuditTicket(data)
+ if (list.data.code == 200) {
+ this.$message({
+ message: list.data.msg,
+ type: "success",
+ customClass: "messageClass",
+ });
+
+ for (const key in this.ticketDetails) {//清空工单
+ this.ticketDetails[key] = ""
+ }
+ //审核成功跳回后台管理页面
+ this.$router.push(`/HelpBackstage`)
+
+
+ }
+ this.helpDetailsLoading = false
+
+ },
+ //选择问题种类
+ handelKinds() {
+
+ },
+ //点击编辑回复内容
+ handelEdit() {
+ //输入框可编辑
+ this.replyInput = false
+ },
+ //点击下载附件
+ downloadExcel(id) {
+
+ this.downloadUrl = ` ${axios.defaults.baseURL}/marketall/ticket/downloadFile?ids=${id}`
+ let a= document.createElement(`a`)
+ a.href = this.downloadUrl
+ a.click()
+
+
+
+
+ // this.paramsDownload.id = id
+
+ // this.fetchDownloadFile(id)
+
+ },
+ //点击提交回复按钮
+ handelResponTicket() {
+ if (!this.paramsResponTicket.respon) {//判空
+ this.$message({
+ message: this.$t(`help.resubmit`),
+ type: "error",
+ });
+ return
+ }
+ this.paramsResponTicket.id = this.ticketDetails.id
+
+
+ if (this.fileList[0]) {
+ //上传文件的需要formdata类型;所以要转
+ this.FormDatas = new FormData()
+ this.fileList.forEach(fileItem => {
+ this.FormDatas.append('file', fileItem);
+ })
+ // 上传选择附件
+ this.$axios({
+ method: 'post',
+ url: 'marketall/ticket/uploadFile',
+ headers: this.headers,
+ timeout: 30000,
+ data: this.FormDatas
+ }).then(res => {
+ this.paramsResponTicket.files = res.data.data.id
+
+ if (this.paramsResponTicket.files) {//成功拿到返回ID
+ this.fetchResponTicket(this.paramsResponTicket) //提交工单
+ }
+ })
+ } else {
+ this.fetchResponTicket(this.paramsResponTicket)
+ }
+
+
+
+
+
+
+
+
+
+ },
+ //点击请求审核按钮
+ handelSubmitAuditTicket() {
+ if (this.ticketDetails.status == "待审核") { //阻止待审核状态下重复提交
+ this.$message({
+ message: this.$t(`help.toAudit`),
+ type: "error",
+ });
+ return
+ }
+
+
+ this.paramsSubmitAuditTicket.id = this.ticketDetails.id
+ this.fetchSubmitAuditTicket(this.paramsSubmitAuditTicket)
+
+
+ },
+ //审核人员 点击审核按钮
+ handelAuditTicket() {
+ if (!this.paramsAuditTicket.msg) {//判空
+ this.$message({
+ message: this.$t(`help.resubmit`),
+ type: "error",
+ });
+ return
+ }
+ this.paramsAuditTicket.id = this.ticketDetails.id
+ this.fetchAuditTicket(this.paramsAuditTicket)
+
+ },
+
+
+
+
+ //上传文件之前
+ beforeUpload(file) {
+
+ // // 获取所有已上传的文件列表
+ // const uploadedFiles = this.fileList.map((f) => f.name);
+ // // 如果已上传的文件列表包含当前文件的名字,返回 false 阻止上传
+ // if (uploadedFiles.includes(file.name)) {
+ // this.$message.warning(this.$t(`help.sameName`));
+ // return false;
+ // }
+
+
+ // 校验文件类型和大小
+ const fileType = file.name.slice(file.name.lastIndexOf('.') + 1).toLowerCase();
+ const isTypeValid = this.fileType.includes(fileType);
+ const isSizeValid = file.size / 1024 / 1024 <= this.fileSize;
+ if (!isTypeValid) {//不支持的文件类型
+ this.$message.error(`${this.$t(`help.fileType`)}:${fileType}`);
+ return false;
+ }
+ if (!isSizeValid) {//文件大小不能超过
+ this.$message.error(`${this.$t(`help.fileSize`)} ${this.fileSize} MB.`);
+ return false;
+ }
+
+ // if (file.type != "" || file.type != null || file.type != undefined) {
+ // //截取文件的后缀,判断文件类型
+ // const FileExt = file.name.replace(/.+\./, "").toLowerCase();
+ // //计算文件的大小
+ // const isLt2M = file.size / 1024 / 1024 < 20; //这里做文件大小限制
+ // //如果大于50M
+ // if (!isLt2M) {
+ // this.$message.error('上传文件大小不能超过 20MB!');
+ // return false;
+ // }
+ // //如果文件类型不在允许上传的范围内
+ // if (this.fileType.includes(FileExt)) {
+ // return true;
+ // }
+ // else {
+ // this.$message.error("上传文件格式不正确!");
+ // return false;
+ // }
+ // }
+ },
+ handelChange(file, fileList){ //控制显示上传显示列表
+ // 校验文件类型和大小
+ const fileType = file.name.slice(file.name.lastIndexOf('.') + 1).toLowerCase();
+ const isTypeValid = this.fileType.includes(fileType);
+ const isSizeValid = file.size / 1024 / 1024 <= this.fileSize;
+ if (!isTypeValid) {//不支持的文件类型
+ this.$message.error(`${this.$t(`help.fileType`)}:${fileType}`);
+ this.fileList = this.fileList.filter(item => item.name != file.name);
+ return false;
+ }
+ if (!isSizeValid) {//文件大小不能超过
+ this.$message.error(`${this.$t(`help.fileSize`)} ${this.fileSize} MB.`);
+ this.fileList = this.fileList.filter(item => item.name != file.name);
+ return false;
+ }
+
+ let flag = this.fileList.some(item => item.name == file.name )
+ if (flag){
+ this.$message.warning(this.$t(`help.sameName`));
+ this.$refs.upload.handleRemove(file)
+
+ return false
+ }
+ // this.fileName.push(file.name)
+ this.fileList.push(file.raw)
+
+ },
+ //上传了的文件给移除的事件
+ handleRemove(file, fileList) {
+ // this.fileList = this.fileList.filter(item => item.name !== file.name)
+ // this.fileName = this.fileName.filter(item => item !== file.name)
+
+ let index = this.fileList.indexOf(file); // 获取第一个重复元素的索引
+
+ if (index !== -1) {
+ this.fileList.splice(index, 1); // 删除第一个重复元素
+ }
+ },
+
+ //超出文件个数的回调
+ handleExceed() {
+ this.$message({
+ type: 'warning',
+ message: this.$t(`help.fileNum`)
+ }); return
+ },
+
+ //上传成功后的回调
+ handleSuccess() {
+
+ },
+
+ handelTime(time) {
+ if (time) {
+ return `${time.split(`T`)[0]} ${time.split(`T`)[1].split(`.`)[0]}`
+ }
+
+ },
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/helpDetails/index.vue b/yq/src/views/helpDetails/index.vue
new file mode 100644
index 0000000..1206e67
--- /dev/null
+++ b/yq/src/views/helpDetails/index.vue
@@ -0,0 +1,345 @@
+
+
+
+
+
+
+
+
+ {{$t(`help.processing`)}}
+
+
+ {{$t(`help.orderNumber`)}}:
+ {{ticketDetails.id}}
+
+
+
+
+ {{$t(`help.problem`)}}:
+ {{ticketDetails.type}}
+
+
+
+
+
+
+
+ {{$t(`help.submitName`)}}: {{ticketDetails.userName}}
+
+
+
+
+
+ {{$t(`help.submissionTime`)}}: {{ticketDetails.submitTime}}
+
+
+
+
+
+ {{$t(`help.dealWith`)}}: {{ticketDetails.status}}
+
+
+
+
+
+
+
+
+ {{$t(`help.problemTitle`)}}:
+ {{ticketDetails.title}}
+
+
+
+
+
+
{{$t(`help.submitContent`)}}:
+
+
+
+
{{$t(`help.account`)}}: {{item.name}} {{$t(`help.time`)}}: {{ handelTime(item.time)}}
+
+
{{item.content}}
+
+
{{$t(`help.download`)}}
+
+
+
+
+
+
{{$t(`help.AuditContent`)}}
+
{{$t(`help.account`)}}: {{auditList.name}} {{$t(`help.time`)}}: {{handelTime(auditList.time)}}
+
{{auditList.content}}
+
+
+
+
+
+
+
+ {{$t(`help.Continue`)}}:
+
+
+
+
+
+
+
+
+
+ {{ $t("login.attachment") }}
+
+
+
+
+
+
+ {{ $t("login.Upload") }} {{ $t("login.Upload1") }}
+
+
+
+
+
+
{{$t(`help.submitReply`)}}
+
{{$t(`help.requestReview`)}}
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`help.AuditOpinion`)}}:
+
+
+
+
+
+ {{$t(`help.audit`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/holder/index.js b/yq/src/views/holder/index.js
new file mode 100644
index 0000000..12fe525
--- /dev/null
+++ b/yq/src/views/holder/index.js
@@ -0,0 +1,220 @@
+import * as echarts from "echarts";
+import { handelWatermark, chartsWidth ,emptyData} from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ //柱状图配置
+ columnar: {
+ title: {
+ text: "",
+ left: "center",
+ textStyle: {
+ fontSize: 15,
+ fontWeight: "normal"
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ axisPointer: {
+ type: "cross",
+ crossStyle: {
+ color: "#999",
+ },
+ },
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i <= params.length - 1; i++) {
+ // res += `${params[i].marker} ${params[i].value[1]} ${params[i].seriesName}`;
+ // }
+ // return "111";
+ // },
+ },
+
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ { type: "inside",
+ start: 0,
+ end: 100,
+ },
+ ],
+ xAxis: [
+ {
+
+ type: "category",
+ data: [],
+ // axisLabel:{
+ // formatter:(value)=>{
+ // let label = null
+ // if (value.search("y") !== -1) {
+ // if (value.search("p") !== -1) {
+ // label = value.replace("p",".").replace("y","years")
+
+ // }else{
+ // label = value.replace("y","years")
+ // }
+
+ // }else{
+ // label=`${value}days`
+ // }
+ // return label
+ // }
+ // }
+ },
+
+ ],
+ yAxis: [
+ {
+ type: "value",
+ // name: "Precipitation",
+ // min: 0,
+ // max: 250,
+ // interval: 50,
+ axisLabel: {
+ formatter: function (value) {
+
+ let label = value / 1000000
+ return `${label}M`
+ },
+ },
+ },
+
+ ],
+ series: [
+ {
+
+ type: "bar",
+ colorBy: "data",
+ // tooltip: {
+ // valueFormatter: function (value) {
+ // return value + " ml";
+ // },
+ // },
+ data: [],
+ itemStyle: {
+ color: "#fdaa56",
+ },
+ },
+ // {
+ // name: "Change 24h",
+ // type: "bar",
+ // itemStyle: {
+ // color: "#607d8b",
+ // },
+ // // tooltip: {
+ // // valueFormatter: function (value) {
+ // // return value + " ml";
+ // // },
+ // // },
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ req: "holder",
+ radius: "btc"
+ },
+ holderLoading: false,
+ holderData: [],
+ value1: "",
+ DateTime: "",
+ pickerOptions: {
+ disabledDate: (time) => {
+ return time.getTime() > new Date(this.DateTime).getTime()
+ },
+ },
+
+ }
+ },
+ mounted() {
+
+ this.fetchHolder(this.params.req, this.params.radius, this.value1)
+ },
+ methods: {
+ //初始化柱状图图表
+ inCharts() {
+ this.myChart = echarts.init(document.getElementById("holderColumnar"));
+
+ this.myChart.setOption(this.columnar);
+ chartsWidth("holderColumnar", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchHolder(req, radius, start) {
+ this.holderLoading = true
+ const { data } = await this.$API.getHolder(req, radius, start)
+ this.holderData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.columnar.series, this.inCharts, this)
+ if (noData) {
+ this.holderLoading = false
+ return
+ }
+ this.columnar.xAxis[0].data.length = 0
+ this.columnar.series[0].data.length = 0
+ //添加水印
+ this.columnar = handelWatermark(this.columnar)
+
+ //对象数据转换成数组
+ let arr = Object.entries(this.holderData)
+ arr.forEach(item => {
+ if (item[0] == "id" || item[0] == "dateTime") {
+ if (item[0] == "dateTime") {
+ let time = item[1].split("T")[0]
+ this.DateTime = item[1].split("T")[0]
+ this.columnar.title.text = `${time} `
+ }
+ return
+
+ } else {
+
+ // this.columnar.xAxis[0].data.push( item[0].split("r")[1])
+ //X轴显示处理
+ let xLabel = item[0].split("r")[1]
+
+
+ if (xLabel.search("y") !== -1) {
+ if (xLabel.search("p") !== -1) {
+ this.columnar.xAxis[0].data.push(xLabel.replace("p", ".").replace("y", "years"))
+
+ } else {
+ this.columnar.xAxis[0].data.push(xLabel.replace("y", "years"))
+ }
+
+ } else {
+ this.columnar.xAxis[0].data.push(`${xLabel}days`)
+ }
+ // let days = item[0].split("r")[1]
+ // console.log('days',days)
+ this.columnar.series[0].data.push(item[1])
+ }
+ })
+
+ this.inCharts()
+ console.log(this.columnar);
+ this.holderLoading = false
+
+ },
+ //时间选择
+ handeldate() {
+
+ this.fetchHolder(this.params.req, this.params.radius, this.value1)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/holder/index.vue b/yq/src/views/holder/index.vue
new file mode 100644
index 0000000..50bdcbc
--- /dev/null
+++ b/yq/src/views/holder/index.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/holderBalance/index.js b/yq/src/views/holderBalance/index.js
new file mode 100644
index 0000000..9935e42
--- /dev/null
+++ b/yq/src/views/holderBalance/index.js
@@ -0,0 +1,210 @@
+import * as echarts from "echarts";
+import { handelWatermark, chartsWidth,emptyData} from "../../util/processingData"
+export default {
+ data() {
+ return {
+ //柱状图配置
+ columnar: {
+ title: {
+ text: "",
+ left: "center",
+ textStyle: {
+ fontSize: 15,
+ fontWeight: "normal"
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ axisPointer: {
+ type: "cross",
+ crossStyle: {
+ color: "#999",
+ },
+ },
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i <= params.length - 1; i++) {
+ // res += `${params[i].marker} ${params[i].value[1]} ${params[i].seriesName}`;
+ // }
+ // return "111";
+ // },
+ },
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ { type: "inside",
+ start: 0,
+ end: 100,
+ },
+ ],
+
+
+ legend: {
+ right: 100,
+ formatter: function (name) {
+
+ return name;
+ },
+ },
+ xAxis: [
+ {
+ type: "category",
+ data: [],
+ // axisLabel:{
+ // formatter:(value)=>{
+ // let label = null
+ // if (value.search("y") !== -1) {
+ // if (value.search("p") !== -1) {
+ // label = value.replace("p",".").replace("y","years")
+
+ // }else{
+ // label = value.replace("y","years")
+ // }
+
+ // }else{
+ // label=`${value}days`
+ // }
+ // return label
+ // }
+ // }
+ },
+ ],
+ yAxis: [
+ {
+ type: "value",
+ // name: "Precipitation",
+ // min: 0,
+ // max: 250,
+ // interval: 50,
+ axisLabel: {
+ formatter: function (value) {
+
+ let label = value / 1000000
+ return `${label}M`
+ },
+ },
+ },
+
+ ],
+ series: [
+ {
+
+ type: "bar",
+ colorBy: "data",
+ // tooltip: {
+ // valueFormatter: function (value) {
+ // return value + " ml";
+ // },
+ // },
+ data: [],
+ itemStyle: {
+ color: "#fdaa56",
+ },
+ },
+ // {
+ // name: "Change 24h",
+ // type: "bar",
+ // itemStyle: {
+ // color: "#607d8b",
+ // },
+ // // tooltip: {
+ // // valueFormatter: function (value) {
+ // // return value + " ml";
+ // // },
+ // // },
+ // data: [],
+ // },
+ ],
+ },
+ params: {
+ req: "holderBalance",
+ radius: "btc"
+ },
+ BalanceLoading: false,
+ value1: "",
+ pickerOptions: {//指定时间以前的日期禁用
+ disabledDate: (time) => {
+ return time.getTime() > new Date(this.DateTime).getTime()
+ },
+ },
+ DateTime: "",
+
+ }
+ },
+ mounted() {
+ this.fetchHolderBalance(this.params.req, this.params.radius)
+ },
+ methods: {
+ //初始化柱状图图表
+ inCharts() {
+ this.myChart = echarts.init(document.getElementById("holderBalance"));
+
+ this.myChart.setOption(this.columnar);
+ chartsWidth("holderBalance", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchHolderBalance(req, radius, start) {
+ this.BalanceLoading = true
+ const { data } = await this.$API.getHolder(req, radius, start)
+ this.balanceData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.columnar.series, this.inCharts, this)
+ if (noData) {
+ this.BalanceLoading = false
+ return
+ }
+ this.columnar.xAxis[0].data.length = 0
+ this.columnar.series[0].data.length = 0
+ //添加水印
+ this.columnar = handelWatermark(this.columnar)
+
+ //对象数据转换成数组
+ let arr = Object.entries(this.balanceData)
+ arr.forEach(item => {
+ if (item[0] == "id" || item[0] == "dateTime") {
+ if (item[0] == "dateTime") {
+ this.DateTime = item[1].split("T")[0]
+ this.columnar.title.text = `${this.DateTime}`
+ }
+ return
+
+ } else {
+ // this.columnar.xAxis[0].data.push(item[0].replace("holderBalance",""))
+ //X轴显示处理
+ let xLabel = item[0].replace("holderBalance", "")
+ if (xLabel.search("y") !== -1) {
+ if (xLabel.search("p") !== -1) {
+ this.columnar.xAxis[0].data.push(xLabel.replace("p", ".").replace("y", "years"))
+
+ } else {
+ this.columnar.xAxis[0].data.push(xLabel.replace("y", "years"))
+ }
+
+ } else {
+ this.columnar.xAxis[0].data.push(`${xLabel}days`)
+ }
+
+ this.columnar.series[0].data.push(item[1])
+ }
+ })
+
+ this.inCharts()
+
+ this.BalanceLoading = false
+ },
+ //时间选择
+ handeldate() {
+
+ this.fetchHolderBalance(this.params.req, this.params.radius, this.value1)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/holderBalance/index.vue b/yq/src/views/holderBalance/index.vue
new file mode 100644
index 0000000..1f01fdd
--- /dev/null
+++ b/yq/src/views/holderBalance/index.vue
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/indexIntroduce/index.js b/yq/src/views/indexIntroduce/index.js
new file mode 100644
index 0000000..9a3bbda
--- /dev/null
+++ b/yq/src/views/indexIntroduce/index.js
@@ -0,0 +1,3152 @@
+export default {
+ data() {
+ return {
+ whichIndex: 0, // 动态显示左侧菜单栏高亮
+ leftArr: [], // 左侧菜单栏的数据
+ rightArr: [], // 右侧详情展示对应的数据
+ rightHeightArr: [], // 右侧每一项的高度数组
+ rightHeightSumArr: [], // 右侧每一项的高度累加数组
+ r: 0, // 滚动的距离
+ leftHeightArr: [],// 左侧每一项的高度数组
+ leftHeightSumArr: [], // 右侧每一项的高度累加数组
+ newIntroduce: "",
+ state: "",
+ menuId: "B01-1-4",
+ newMEnu1: [
+ { //BTC币种
+ label: "BTC币种",
+ icon: "i itubiao2",
+ nested: "peers", //判断是否多层嵌套
+ id: "B1",
+ children: [
+ {
+ //地址统计
+ path: "/",
+ label: "menu.onchain2",
+ fullName: "menu.onchain2",
+ icon: "i igl-folderOpen",
+ componentReq: "newAddress2",
+ radius: "btc",
+ id: "B01-1-4",
+ introduce: "introduce.address",
+ navigation: "newAddress",
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //盈利地址数
+ path: "/",
+ label: "menu.profitAddress",
+ fullName: "menu.profitAddress",
+ icon: "i igl-folderOpen",
+ componentReq: "profitAddress",
+ radius: "btc",
+ id: "B01-1-1",
+ introduce: "introduce.profitAddress",
+ navigation: "profitAddress",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //匿名用户
+ },
+ {
+ //亏损地址数
+ path: "/",
+ label: "menu.lossAddress",
+ fullName: "menu.lossAddress",
+ icon: "i igl-folderOpen",
+ componentReq: "lossAddress",
+ radius: "btc",
+ id: "B01-1-2",
+ introduce: "introduce.lossAddress",
+ navigation: "lossAddress",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //匿名用户
+ },
+ {
+ //地址盈亏比
+ path: "/",
+ label: "menu.profitRatio",
+ fullName: "menu.profitRatio",
+ icon: "i igl-folderOpen",
+ componentReq: "profitRatio",
+ radius: "btc",
+ id: "B01-1-3",
+ introduce: "introduce.profitRatio",
+ navigation: "profitRatio",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //匿名用户
+ },
+
+ {
+ //暂时注释 持有比特币超过100个的地址列表 改为 巨鲸地址列表 无权限
+ path: "/",
+ label: "menu.onchain15",
+ fullName: "menu.onchain15",
+ icon: "i igl-folderOpen",
+ componentReq: "getTopList",
+ radius: "btc",
+ id: "B01-1-5",
+ introduce: "introduce.getTopList",
+ navigation: "topList", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //发行价值(USD) 改为日发行价值 中英文都是 puell multiple
+ path: "/",
+ label: "menu.technology38",
+ fullName: "menu.technology38",
+ icon: "i igl-folderOpen",
+ componentReq: "mintusd",
+ radius: "btc",
+ id: "B02-1-1",
+ introduce: "introduce.mintusd",
+ navigation: "mintusd", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户"
+ },
+ {
+ //矿工地址数 与矿工地址余额 合并 改为矿工余额
+ path: "/",
+ label: "menu.onchain20",
+ fullName: "menu.technology38",
+ icon: "i igl-folderOpen",
+ componentReq: "minerAddress",
+ radius: "btc",
+ id: "B02-1-2",
+ introduce: "introduce.minerAddress",
+ navigation: "minerAddress", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3", //1天
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //日交易统计 更改名字 交易统计
+ path: "/",
+ label: "menu.onchain19",
+ fullName: "menu.onchain19",
+ icon: "i igl-folderOpen",
+ componentReq: "BTCVolume",
+ radius: "btc",
+ id: "B03-1-1",
+ introduce: "introduce.BTCVolume",
+ navigation: "volume", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //交易汇率乘数
+ path: "/",
+ label: "menu.frm",
+ fullName: "menu.frm",
+ icon: "i igl-folderOpen",
+ componentReq: "frm",
+ radius: "btc",
+ id: "B03-1-2",
+ introduce: "introduce.frm",
+ navigation: "frm",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ {
+ //流通供应量
+ path: "/",
+ label: "menu.technology21",
+ fullName: "menu.technology21",
+ icon: "i igl-folderOpen",
+ componentReq: "csupply",
+ radius: "btc",
+ id: "B03-1-3",
+ introduce: "introduce.csupply",
+ navigation: "csupply", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ path: "/", //大额交易
+ label: "menu.onchain1",
+ fullName: "menu.onchain1",
+ icon: "i igl-folderOpen",
+ componentReq: "ethbigtxcount",
+ radius: "btc",
+ id: "B03-1-4",
+ introduce: "introduce.btcbigtxcount",
+ navigation: "bigDeals",
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //待交易池详情
+ path: "/",
+ label: "menu.mempool",
+ fullName: "menu.mempool",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "mempool",
+ radius: "btc",
+ id: "B03-1-5",
+ introduce: "introduce.mempool",
+ navigation: "mempool", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+
+
+ },
+ {
+ //长期持有者每日交易量
+ path: "/",
+ label: "menu.lthVolume",//简写
+ fullName: "menu.lthVolume2",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "lthVolume",
+ radius: "btc",
+ id: "B04-1-1",
+ introduce: "introduce.lthVolume",
+ navigation: "lthVolume",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //长期持有者供应量
+ path: "/",
+ label: "menu.lthSupply",
+ fullName: "menu.lthSupply2",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "lthSupply",
+ radius: "btc",
+ id: "B04-1-2",
+ introduce: "introduce.lthSupply",
+ navigation: "lthSupply",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //长期持有者盈利总供应量 改为 长期持有者盈利供应量
+ path: "/",
+ label: "menu.lthProfitSupply",
+ fullName: "menu.lthProfitSupply2",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "lthProfitSupply",
+ radius: "btc",
+ id: "B04-1-3",
+ introduce: "introduce.lthProfitSupply",
+ navigation: "lthProfitSupply",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //长期持有者亏损总供应量 改为 长期持有者亏损供应量
+ path: "/",
+ label: "menu.lthLossSupply",
+ fullName: "menu.lthLossSupply2",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "lthLossSupply",
+ radius: "btc",
+ id: "B04-1-4",
+ introduce: "introduce.lthLossSupply",
+ navigation: "lthLossSupply",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //长期持有者盈亏比
+ path: "/",
+ label: "menu.lthProfitRatio",
+ fullName: "menu.lthProfitRatio2",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "lthProfitRatio",
+ radius: "btc",
+ id: "B04-1-5",
+ introduce: "introduce.lthProfitRatio",
+ navigation: "lthProfitRatio",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //短期持有者供应量
+ path: "/",
+ label: "menu.sthSupply",
+ fullName: "menu.sthSupply2",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "sthSupply",
+ radius: "btc",
+ id: "B04-1-13",
+ introduce: "introduce.sthSupply",
+ navigation: "sthSupply",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //短期持有者盈利总供应量 改为短期持有者盈利供应量
+ path: "/",
+ label: "menu.sthProfitSupply",
+ fullName: "menu.sthProfitSupply2",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "sthProfitSupply",
+ radius: "btc",
+ id: "B04-1-6",
+ introduce: "introduce.sthProfitSupply",
+ navigation: "sthProfitSupply",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //短期持有者亏损总供应量 改为短期持有者亏损供应量
+ path: "/",
+ label: "menu.sthLossSupply",
+ fullName: "menu.sthLossSupply2",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "sthLossSupply",
+ radius: "btc",
+ id: "B04-1-7",
+ introduce: "introduce.sthLossSupply",
+ navigation: "sthLossSupply",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //短期持有者盈亏比
+ path: "/",
+ label: "menu.sthProfitRatio",
+ fullName: "menu.sthProfitRatio2",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "sthProfitRatio",
+ radius: "btc",
+ id: "B04-1-8",
+ introduce: "introduce.sthProfitRatio",
+ navigation: "sthProfitRatio",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //长/短期持有者供应量盈亏比
+ path: "/",
+ label: "menu.relativeLthSth",
+ fullName: "menu.relativeLthSth2",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "relativeLthSth",
+ radius: "btc",
+ id: "B04-1-9",
+ introduce: "introduce.relativeLthSth",
+ navigation: "relativeLthSth",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //短期到长期实现价值比率
+ path: "/",
+ label: "menu.SLRVRatio",
+ fullName: "menu.SLRVRatio2",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "SLRVRatio",
+ radius: "btc",
+ id: "B04-1-10",
+ introduce: "introduce.SLRVRatio",
+ navigation: "SLRVRatio",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //长持者流通市值-已实现流通市值比 改为 长期持有者 MVRV Ratio
+ path: "/",
+ label: "menu.technology30",
+ fullName: "menu.lthmvrv",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "lthmvrv",
+ radius: "btc",
+ id: "B04-1-11",
+ introduce: "introduce.lthmvrv",
+ navigation: "lthmvrv", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //短持者流通市值-已实现流通市值比 改为 短期持有者 MVRV Ratio
+ path: "/",
+ label: "menu.technology31",
+ fullName: "menu.sthmvrv",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "sthmvrv",
+ radius: "btc",
+ id: "B04-1-12",
+ introduce: "introduce.sthmvrv",
+ navigation: "sthmvrv", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //流通市值
+ path: "/",
+ label: "menu.technology28",
+ fullName: "menu.marketcap",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "marketcap",
+ radius: "btc",
+ id: "B05-1-1",
+ introduce: "introduce.marketcap",
+ navigation: "marketcap", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ // 已实现流通市值 改为和流通市值合并显示在一个页面 后期修改拆分
+ path: "/",
+ label: "menu.technology29",
+ fullName: "menu.rcap",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "rcap",
+ radius: "btc",
+ id: "B05-1-17",
+ introduce: "introduce.rcap",
+ navigation: "rcap", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest",
+
+ },
+ {
+ // 已实现流通市值(找零消除)
+ path: "/",
+ label: "menu.earcap",
+ fullName: "menu.earcap2",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "earcap",
+ radius: "btc",
+ id: "B05-1-18",
+ introduce: "introduce.earcap1",
+ navigation: "earcap1", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+
+ },
+ {
+ //新的MVRV 改名 MVRV Ratio
+
+ path: "/",
+ label: "menu.technology1",
+ fullName: "menu.mvrv",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "market",
+ radius: "mvrv",
+ id: "B05-1-3",
+ introduce: "introduce.MVRV",
+ navigation: "mvrv",
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //MVRVZ MVRV Z-Score
+ path: "/",
+ label: "menu.technology2",
+ fullName: "menu.technology2",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "market",
+ // req: "market",
+ radius: "MVRVZ",
+ coin: "BTC",
+ id: "B05-1-4",
+ introduce: "introduce.MVRVZ",
+ navigation: "MVRVZ", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //流通速度
+ path: "/",
+ label: "menu.velocity",
+ fullName: "menu.velocity",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "velocity",
+ radius: "btc",
+ id: "B05-1-2",
+ introduce: "introduce.velocity",
+ navigation: "velocity",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+
+ {
+ //已实现盈利量
+ path: "/",
+ label: "menu.technology25",
+ fullName: "menu.technology25",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "rprofit",
+ radius: "btc",
+ id: "B05-1-5",
+ formula: "",//介绍公式
+ introduce: "introduce.rprofit",
+ navigation: "rprofit", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //已实现亏损量
+ path: "/",
+ label: "menu.technology26",
+ fullName: "menu.technology26",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "rloss",
+ radius: "btc",
+ id: "B05-1-6",
+ introduce: "introduce.rloss",
+ navigation: "rloss", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //已实现净收益损失比
+ path: "/",
+ label: "menu.technology27",
+ fullName: "menu.technology27",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "rplRate",
+ radius: "btc",
+ id: "B05-1-7",
+ introduce: "introduce.rplRate",
+ navigation: "rplRate", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //已实现价格
+ path: "/",
+ label: "menu.realizedPrice",
+ fullName: "menu.realizedPrice",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "realizedPrice",
+ radius: "btc",
+ id: "B05-1-8",
+ introduce: "introduce.realizedPrice",
+ navigation: "realizedPrice",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ {
+ //已平衡价格
+ path: "/",
+ label: "menu.balancedPrice",
+ fullName: "menu.balancedPrice",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "balancedPrice",
+ radius: "btc",
+ id: "B05-1-9",
+ introduce: "introduce.balancedPrice",
+ navigation: "balancedPrice",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //累积价值-销毁天数比
+ path: "/",
+ label: "menu.cvdd",
+ fullName: "menu.cvdd2",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "cvdd",
+ radius: "btc",
+ id: "B05-1-10",
+ introduce: "introduce.cvdd",
+ navigation: "cvdd",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ {
+ //未实现的净收益量
+ path: "/",
+ label: "menu.technology33",
+ fullName: "menu.technology33",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "uprofit",
+ radius: "btc",
+ id: "B05-1-12",
+ introduce: "introduce.uprofit",
+ navigation: "uprofit", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //未实现的净亏损量
+ path: "/",
+ label: "menu.technology34",
+ fullName: "menu.technology34",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "uloss",
+ radius: "btc",
+ id: "B05-1-13",
+ introduce: "introduce.uloss",
+ navigation: "uloss", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //未实现的净收益损失比
+ path: "/",
+ label: "menu.technology32",
+ fullName: "menu.nupl",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "nupl",
+ radius: "btc",
+ id: "B05-1-11",
+ introduce: "introduce.nupl",
+ navigation: "nupl", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+
+
+
+ {
+ //长持者未实现的净收益量 改为 长持者未实现的净收益损失比
+ path: "/",
+ label: "menu.technology35",
+ fullName: "menu.lthnupl",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "lthnupl",
+ radius: "btc",
+ id: "B05-1-14",
+ introduce: "introduce.lthnupl",
+ navigation: "lthnupl", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3", //改为1天
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //短持者未实现的净收益量 改为 短持者未实现的净收益损失比
+ path: "/",
+ label: "menu.technology36",
+ fullName: "menu.sthnupl",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "sthnupl",
+ radius: "btc",
+ id: "B05-1-15",
+ introduce: "introduce.sthnupl",
+ navigation: "sthnupl", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3", //改为1天
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //市值/交易价值比 NVT Ratio 改为 市盈率
+ path: "/",
+ label: "menu.nvtRatio",
+ fullName: "menu.nvtRatio2",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "nvtRatio",
+ radius: "btc",
+ id: "B05-1-16",
+ introduce: "introduce.nvtRatio",
+ navigation: "nvtRatio",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ {
+ //NVT信号
+ path: "/",
+ label: "menu.nvtSign",
+ fullName: "menu.nvtSign",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "nvtSign",
+ radius: "btc",
+ id: "B05-1-19",
+ introduce: "introduce.nvtSign",
+ navigation: "nvtSign",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ {
+ //已花费输出平均寿命
+ path: "/",
+ label: "menu.technology18",
+ fullName: "menu.asol",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "asol",
+ radius: "btc",
+ id: "B06-1-1",
+ introduce: "introduce.asol",
+ navigation: "asol", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //币天销毁量
+ path: "/",
+ label: "menu.technology37",
+ fullName: "menu.CDD",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "CDD",
+ radius: "btc",
+ id: "B06-1-2",
+ introduce: "introduce.CDD",
+ navigation: "CDD", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //币天销毁量年龄分布
+ path: "/",
+ label: "menu.technology20",
+ fullName: "menu.soag",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "soag",
+ radius: "btc",
+ id: "B06-1-3",
+ introduce: "introduce.soag",
+ navigation: "soag", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //已花费输出休眠平均天数
+ path: "/",
+ label: "menu.technology19",
+ fullName: "menu.technology19",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "dormancy",
+ radius: "btc",
+ id: "B06-1-4",
+ introduce: "introduce.dormancy",
+ navigation: "dormancy", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //活跃度
+ path: "/",
+ label: "menu.technology24",
+ fullName: "menu.technology24",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "liveliness",
+ radius: "btc",
+ id: "B06-1-5",
+ introduce: "introduce.Liveliness",
+ navigation: "liveliness", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户"
+ },
+ {
+ //已实现盈利交易占比
+ path: "/",
+ label: "menu.technology16",
+ fullName: "menu.technology16",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "profitrate",
+ radius: "btc",
+ id: "B07-1-1",
+ introduce: "introduce.profitrate",
+ navigation: "profitrate", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //已花费输出盈利比
+ path: "/",
+ label: "menu.technology17",
+ fullName: "menu.SOPR",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "sopr",
+ radius: "btc",
+ id: "B07-1-2",
+ introduce: "introduce.sopr",
+ navigation: "sopr", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //持有者地址数分布( 按余额分段) 改为 地址数分布
+ path: "/",
+ label: "menu.onchain5I",
+ fullName: "menu.onchain5",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "utxos",
+ radius: "btc",
+ id: "B08-1-1-1",
+ introduce: "introduce.balanceDistribution",
+ navigation: "utxos",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //持有者币数量分布(按余额分段) 改为 币数量分布
+ path: "/",
+ label: "menu.onchain6I",
+ fullName: "menu.onchain6",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "utxos2nd",
+ radius: "btc",
+ id: "B08-1-1-2",
+ introduce: "introduce.balanceDistribution",
+ navigation: "utxos2nd",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //持有者地址数分布( 按持有时间分段) 改为 地址数分布
+ path: "/",
+ label: "menu.onchain7I",
+ fullName: "menu.onchain7",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "holder",
+ radius: "btc",
+ id: "B08-1-2-1",
+ introduce: "introduce.timeDivision",
+ navigation: "holder",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //持有者币数量分布( 按持有时间分段) 改为 币数量分布
+ path: "/",
+ label: "menu.onchain8I",
+ fullName: "menu.onchain8",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "holderBalance",
+ radius: "btc",
+ id: "B08-1-2-2",
+ introduce: "introduce.timeDivision",
+ navigation: "holderBalance",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //持有者地址数分布( 按买入价格分段) 改为 地址数分布
+ path: "/",
+ label: "menu.onchain9I",
+ fullName: "menu.onchain9",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "getBuyData",
+ radius: "btc",
+ id: "B08-1-3-1",
+ introduce: "introduce.priceDivision",
+ navigation: "buyData", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //持有者币数量分布( 按买入价格分段) 改为 币数量分布
+ path: "/", //与Buy Data共用
+ label: "menu.onchain10I",
+ fullName: "menu.onchain10",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "getBuyAmountData",
+ radius: "btc",
+ id: "B08-1-3-2",
+ introduce: "introduce.priceDivision",
+ navigation: "buyData", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //持有者地址数分布(盈亏) 改为 地址数分布 按买卖价差划分
+ path: "/",
+ label: "menu.onchain11I",
+ fullName: "menu.onchain11",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "getDiffData",
+ radius: "btc",
+ id: "B08-1-4-1",
+ introduce: "introduce.priceDivision",
+ navigation: "diffData", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //持有者币数量分布(盈亏) 改为 币数量分布 按买卖价差划分
+ path: "/", //与Diff Data共用
+ label: "menu.onchain12I",
+ fullName: "menu.onchain12",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "getDiffAmountData",
+ radius: "btc",
+ id: "B08-1-4-2",
+ introduce: "introduce.priceDivision",
+ navigation: "diffData", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //持有者地址数分布(利润率) 改为 地址数分布 按盈利划分
+ path: "/",
+ label: "menu.onchain13I",
+ fullName: "menu.onchain13",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "getProfitData",
+ radius: "btc",
+ id: "B08-1-5-1",
+ introduce: "introduce.profitDistribution",
+ navigation: "profitData", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //持有者币数量分布(利润率) 改为 币数量分布 按按盈利划分
+ path: "/", //与Profit Data共用
+ label: "menu.onchain14I",
+ fullName: "menu.onchain14",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "getProfitAmountData",
+ radius: "btc",
+ id: "B08-1-5-2",
+ introduce: "introduce.profitDistribution",
+ navigation: "profitData", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ //地址详细分布
+ {
+ //余额>=0 and <0.01的地址 币龄分布表 改为 余额<0.01
+ // path: "/",
+ label: "menu.Currency2I",
+ componentReq: "getDayBalanceData",
+ fullName: "menu.balanceData1",//全名
+ radius: "btc",
+ id: "B08-1-6-1",
+ value: 0,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ // path: "/", 改为 余额>=0.01 & < 0.1
+ label: "menu.Currency3I",
+ componentReq: "getDayBalanceData",
+ fullName: "menu.balanceData2",//全名
+ radius: "btc",
+ id: "B08-1-6-2",
+ value: 0.01,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ // path: "/", 改为 余额>=0.1 & < 1
+ label: "menu.Currency4I",
+ fullName: "menu.balanceData3",//全名
+ componentReq: "getDayBalanceData",
+ radius: "btc",
+ id: "B08-1-6-3",
+ value: 0.1,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ // path: "/", 余额>=1 & < 10
+ label: "menu.Currency5I",
+ fullName: "menu.balanceData4",//全名
+ componentReq: "getDayBalanceData",
+ radius: "btc",
+ id: "B08-1-6-4",
+ value: 1,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ // path: "/", 余额>=10 & < 100
+ label: "menu.Currency6I",
+ fullName: "menu.balanceData5",//全名
+ componentReq: "getDayBalanceData",
+ radius: "btc",
+ id: "B08-1-6-5",
+ value: 10,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ // path: "/",余额>=100 & < 1000
+ label: "menu.Currency7I",
+ fullName: "menu.balanceData6",//全名
+ componentReq: "getDayBalanceData",
+ radius: "btc",
+ id: "B08-1-6-6",
+ value: 100,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ // path: "/", 余额>=1000 & < 10000
+ label: "menu.Currency8I",
+ fullName: "menu.balanceData7",//全名
+ componentReq: "getDayBalanceData",
+ radius: "btc",
+ id: "B08-1-6-7",
+ value: 1000,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ // path: "/", 余额>=10000
+ label: "menu.Currency9I",
+ fullName: "menu.balanceData8",//全名
+ componentReq: "getDayBalanceData",
+ radius: "btc",
+ id: "B08-1-6-8",
+ value: 10000,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ //币数量详细分布
+ {
+ //余额>=0 and <0.01的币数量 币龄分布表 改为 余额<0.01
+ // path: "/",
+ label: "menu.Currency11I",
+ fullName: "menu.balanceData9",//全名
+ componentReq: "getDayBalanceAmountData",
+ radius: "btc",
+ id: "B08-1-7-1",
+ value: 0,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ // path: "/", 余额>=0.01 & < 0.1
+ label: "menu.Currency12I",
+ fullName: "menu.balanceData10",//全名
+ componentReq: "getDayBalanceAmountData",
+ radius: "btc",
+ id: "B08-1-7-2",
+ value: 0.01,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ // path: "/",余额>=0.1 & < 1
+ label: "menu.Currency13I",
+ fullName: "menu.balanceData11",//全名
+ componentReq: "getDayBalanceAmountData",
+ radius: "btc",
+ id: "B08-1-7-3",
+ value: 0.1,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ // path: "/", 余额>=1 & < 10
+ label: "menu.Currency14I",
+ fullName: "menu.balanceData12",//全名
+ componentReq: "getDayBalanceAmountData",
+ radius: "btc",
+ id: "B08-1-7-4",
+ value: 1,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ // path: "/", 余额>=10 & < 100
+ label: "menu.Currency15I",
+ fullName: "menu.balanceData13",//全名
+ componentReq: "getDayBalanceAmountData",
+ radius: "btc",
+ id: "B08-1-7-5",
+ value: 10,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ // path: "/", 余额>=100 & < 1000
+ label: "menu.Currency16I",
+ fullName: "menu.balanceData14",//全名
+ componentReq: "getDayBalanceAmountData",
+ radius: "btc",
+ id: "B08-1-7-6",
+ value: 100,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ // path: "/", 余额>=1000 & < 10000
+ label: "menu.Currency17I",
+ fullName: "menu.balanceData15",//全名
+ componentReq: "getDayBalanceAmountData",
+ radius: "btc",
+ id: "B08-1-7-7",
+ value: 1000,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ // path: "/", 余额>=10000
+ label: "menu.Currency18I",
+ fullName: "menu.balanceData16",//全名
+ componentReq: "getDayBalanceAmountData",
+ radius: "btc",
+ id: "B08-1-7-8",
+ value: 10000,
+ introduce: "introduce.detailedDistribution",
+ navigation: "balanceData",
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+ {
+ //江卓尔60日累计涨幅
+ path: "/",
+ label: "menu.technology6",
+ fullName: "menu.jzr60",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "jzr60",
+ radius: "btc",
+ id: "2-1",
+ // conditions: "arh", //不同请求方式筛选条件
+ introduce: "introduce.jzr60",
+ navigation: "jzr60",
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //arh999囤币及逃顶指标
+ path: "/",
+ label: "menu.technology7",
+ fullName: "menu.arh999",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "arh99",
+ radius: "btc",
+ id: "2-2",
+ navigation: "arh999",
+ // conditions: "arh", //不同请求方式筛选条件
+ introduce: "introduce.arh999",
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //2年移动平均价格乘数
+ path: "/",
+ label: "menu.technology11",
+ fullName: "menu.ma730",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "ma730",
+ radius: "btc",
+ id: "2-4",
+ introduce: "introduce.ma730",
+ navigation: "ma730", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //币价当前市值排名
+ path: "/",
+ label: "menu.onchain17",
+ fullName: "menu.coinmarketall",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "币价当前市值排名",
+ radius: "btc",
+ id: "2-5",
+ introduce: "introduce.coinmarketall",
+ navigation: "coinmarketall", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //PI周期顶指标
+ path: "/",
+ label: "menu.PiCycleTopIndicator",
+ fullName: "menu.PiCycleTopIndicator",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "piCycleTop",
+ radius: "btc",
+ id: "2-9",
+ introduce: "introduce.PiCycleTopIndicator",
+ navigation: "piCycleTop", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //稳定币供应比
+ path: "/",
+ label: "menu.ssr",
+ fullName: "menu.ssr",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "ssr",
+ radius: "btc",
+ id: "2-10",
+ introduce: "introduce.ssr",
+ navigation: "ssr", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ {
+ //稳定币供应比振荡器
+ path: "/",
+ label: "menu.ssro",
+ fullName: "menu.ssro",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "ssro",
+ radius: "btc",
+ id: "2-11",
+ introduce: "introduce.ssro",
+ navigation: "ssro", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ {
+ //库存/新发行比
+ path: "/",
+ label: "menu.stfRatio",
+ fullName: "menu.stfRatio",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "stfRatio",
+ radius: "btc",
+ id: "2-12",
+ introduce: "introduce.stfRatio",
+ navigation: "stfRatio", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest",
+ },
+ {
+ //库存/新发行偏差
+ path: "/",
+ label: "menu.stfDeflection",
+ fullName: "menu.stfDeflection",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "stfDeflection",
+ radius: "btc",
+ id: "2-13",
+ introduce: "introduce.stfDeflection",
+ navigation: "stfDeflection", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ {
+ //黄金比例乘数
+ path: "/",
+ label: "menu.goldenRatioMult",
+ fullName: "menu.goldenRatioMult",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "goldenRatioMult",
+ radius: "btc",
+ id: "2-14",
+ introduce: "introduce.goldenRatioMult",
+ navigation: "goldenRatioMult", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ {
+ //纳斯达克指数
+ path: "/",
+ label: "menu.macro1",
+ fullName: "menu.macro1",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "NDAQohlc",
+ id: "3-1",
+ introduce: "introduce.NDAQohlc",
+ navigation: "ndaqOhlc",
+ assets: "无",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //纳斯达克/BTC日K线 改为 纳斯达克指数 vs BTC
+ path: "/",
+ label: "menu.macro2",
+ fullName: "menu.macro2",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "NDAQBTCPrice",
+ id: "3-2",
+ introduce: "introduce.NDAQBTCPrice",
+ navigation: "NdaqBtcDayKline",
+ assets: "无",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //市场快讯 金十数据
+ path: "/",
+ label: "menu.quickNews",
+ fullName: "menu.quickNews",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "NDAQBTCPrice",
+ id: "3-3",
+ introduce: "introduce.quickNews",
+ navigation: "quickNews",
+ assets: "无",
+ interval: "home.no",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //财经日历 金十数据
+ path: "/",
+ label: "menu.economics",
+ fullName: "menu.economics",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "NDAQBTCPrice",
+ id: "3-4",
+ introduce: "introduce.quickNews",
+ navigation: "economics",
+ assets: "无",
+ interval: "home.no",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //资金费率
+ path: "/",
+ label: "menu.technology13",
+ fullName: "menu.technology13",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "fundingRate",
+ radius: "btc",
+ id: "4-3",
+ introduce: "introduce.fundingRate",
+ navigation: "fundingRate", //导航组件名称
+ assets: "BTCUSDT、ETHUSDT",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //注册用户
+ },
+ {
+ //未平仓合约数
+ path: "/",
+ label: "menu.technology14",
+ fullName: "menu.technology14",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "openInterest",
+ radius: "btc",
+ id: "4-4",
+ introduce: "introduce.openInterest",
+ navigation: "openInterest", //导航组件名称
+ assets: "BTCUSDT、ETHUSDT",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+
+ {
+ //合约主动买入量
+ path: "/",
+ label: "menu.technology15",
+ fullName: "menu.technology15",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "takerlongshortRatio",
+ radius: "btc",
+ id: "4-5",
+ introduce: "introduce.takerlongshortRatio",
+ navigation: "takerlongshortRatio", //导航组件名称
+ assets: "BTCUSDT、ETHUSDT",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //时区购买力
+ path: "/",
+ label: "menu.tzbp",
+ fullName: "menu.tzbp",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "tzbp",
+ radius: "btc",
+ id: "4-6",
+ introduce: "introduce.tzbp",
+ navigation: "tzbp", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //买入大单挂单
+ path: "/",
+ label: "menu.bobp",
+ fullName: "menu.bobp",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "bobp",
+ radius: "btc",
+ id: "4-7",
+ introduce: "introduce.bobp",
+ navigation: "bobp", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //卖出大单挂单
+ path: "/",
+ label: "menu.bosp",
+ fullName: "menu.bosp",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "bosp",
+ radius: "btc",
+ id: "4-8",
+ introduce: "introduce.bobp",//买入卖出都一样
+ navigation: "bosp", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //成交量分布图
+ path: "/",
+ label: "menu.volumeProfile",
+ fullName: "menu.volumeProfile",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "volumeProfile",
+ radius: "btc",
+ id: "4-9",
+ introduce: "introduce.volumeProfile",
+ navigation: "volumeProfile", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //交易所余额
+ path: "/",
+ label: "menu.exchange10",
+ fullName: "menu.exchange10",//全名
+ icon: "i igl-folderOpen",
+ componentReq: "exchange",
+ radius: "btc",
+ id: "4-10",
+ introduce: "introduce.exchange1",
+ navigation: "exchange", //导航组件名称
+ assets: "BTC、ETH",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered",
+ },
+ {
+ //长/短期持有者供应量盈亏分布
+ path: "/",
+ label: "menu.distributionLthSth",
+ fullName: "menu.distributionLthSth", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "distributionLthSth",
+ radius: "btc",
+ id: "B04-1-14",
+ introduce: "introduce.distributionLthSth",
+ navigation: "distributionLthSth", //导航组件名称
+ assets: "BTC",
+ interval: "menu.interval3",
+ type: "L3",
+ authority: "advance", //付费用户
+ },
+
+ ],
+ },
+ // { //ETH币种
+ // label: "ETH币种",
+ // icon: "i itubiao2",
+ // nested: "peers", //判断是否多层嵌套
+ // id: "E1",
+ // children: [
+ // {
+ // //地址统计
+ // path: "/",
+ // label: "menu.onchain2",
+ // fullName: "menu.onchain2",
+ // icon: "i igl-folderOpen",
+ // componentReq: "address",
+ // radius: "eth",
+ // id: "E01-1-1",
+ // introduce: "introduce.ethAddress",
+ // navigation: "ethAddress",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L1",
+ // authority: "guest", //匿名用户
+ // },
+ // {
+ // //盈利地址数
+ // path: "/",
+ // label: "menu2.profit",
+ // fullName: "menu2.profit",
+ // icon: "i igl-folderOpen",
+ // componentReq: "profit",
+ // radius: "eth",
+ // id: "E01-1-3",
+ // introduce: "introduce.profitAddress",
+ // navigation: "profitEth",
+ // assets: "ETH",
+ // interval: "menu.interval3",
+ // type: "L3",
+ // authority: "advance",
+ // },
+ // {
+ // //亏损地址数
+ // path: "/",
+ // label: "menu2.loss",
+ // fullName: "menu2.loss",
+ // icon: "i igl-folderOpen",
+ // componentReq: "loss",
+ // radius: "eth",
+ // id: "E01-1-4",
+ // introduce: "introduce.lossAddress",
+ // navigation: "lossEth",
+ // assets: "ETH",
+ // interval: "menu.interval3",
+ // type: "L3",
+ // authority: "advance",
+ // },
+ // {
+ // //盈利地址百分比
+ // path: "/",
+ // label: "menu2.profitPercent",
+ // fullName: "menu2.profitPercent",
+ // icon: "i igl-folderOpen",
+ // componentReq: "profitPercent",
+ // radius: "eth",
+ // id: "E01-1-2",
+ // introduce: "introduce.profitPercentEth",
+ // navigation: "profitPercentEth",
+ // assets: "ETH",
+ // interval: "menu.interval3",
+ // type: "L3",
+ // authority: "advance",
+ // },
+
+ // {
+ // //巨鲸地址跟踪 改为 巨鲸地址交易历史
+ // path: "/",
+ // label: "menu2.ethTopAddrMonitorList",
+ // fullName: "menu2.ethTopAddrMonitorList",
+ // icon: "i igl-folderOpen",
+ // componentReq: "ethTopAddrMonitorList",
+ // radius: "eth",
+ // id: "E01-1-5",
+ // introduce: "introduce.ethTopAddrMonitorList", //无
+ // navigation: "ethTopAddrMonitorList",
+ // assets: "ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered", //注册用户
+ // },
+ // {
+ // //巨鲸列表 改为 巨鲸地址列表
+ // path: "/",
+ // label: "menu2.onchain2",
+ // fullName: "menu2.onchain2",
+ // icon: "i igl-folderOpen",
+ // componentReq: "ethTopAddrList",
+ // radius: "eth",
+ // id: "E01-1-6",
+ // introduce: "introduce.getTopList",
+ // navigation: "ethTopAddrList", //导航组件名称
+ // assets: "ETH",
+ // interval: "menu.interval3",
+ // type: "L1",
+ // authority: "guest", //匿名用户
+ // },
+ // {
+ // //日交易统计 更改名字 交易统计
+ // path: "/",
+ // label: "menu2.onchain19",
+ // fullName: "menu2.onchain19",
+ // icon: "i igl-folderOpen",
+ // componentReq: "ETHVolume",
+ // radius: "btc",
+ // id: "E02-1-1",
+ // introduce: "introduce.ETHVolume",
+ // navigation: "Fees", //导航组件名称
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L1",
+ // authority: "guest", //匿名用户
+ // },
+ // {
+ // //交易费率乘数
+ // path: "/",
+ // label: "menu2.frm",
+ // fullName: "menu2.frm",
+ // icon: "i igl-folderOpen",
+ // componentReq: "frm",
+ // radius: "eth",
+ // id: "E02-1-2",
+ // introduce: "introduce.frm",
+ // navigation: "frmEth",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered",
+ // },
+ // {
+ // //燃烧量
+ // path: "/",
+ // label: "menu2.burnedSupply",
+ // fullName: "menu2.burnedSupply",
+ // icon: "i igl-folderOpen",
+ // componentReq: "burnedSupply",
+ // radius: "eth",
+ // id: "E02-1-3",
+ // introduce: "introduce.burnedSupplyEth",
+ // navigation: "burnedSupplyEth",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered",
+ // },
+ // {
+ // //发行量
+ // path: "/",
+ // label: "menu2.mintedSupply",
+ // fullName: "menu2.mintedSupply",
+ // icon: "i igl-folderOpen",
+ // componentReq: "mintedSupply",
+ // radius: "eth",
+ // id: "E02-1-4",
+ // introduce: "introduce.mintedSupplyEth",
+ // navigation: "mintedSupplyEth",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered",
+ // },
+ // {
+ // //新币发行量
+ // path: "/",
+ // label: "menu2.issuance",
+ // fullName: "menu2.issuance",
+ // icon: "i igl-folderOpen",
+ // componentReq: "issuance",
+ // radius: "eth",
+ // id: "E02-1-5",
+ // introduce: "introduce.issuanceEth",
+ // navigation: "issuanceEth",
+ // assets: "ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered",
+ // },
+ // {
+ // //流通供应量
+ // path: "/",
+ // label: "menu.technology21",
+ // fullName: "menu.technology21",
+ // icon: "i igl-folderOpen",
+ // componentReq: "csupply",
+ // radius: "btc",
+ // id: "E02-1-6",
+ // introduce: "introduce.csupply",
+ // navigation: "csupply", //导航组件名称
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3", //历史数据
+ // type: "L1",
+ // authority: "guest", //匿名用户
+ // },
+ // {
+ // //抵押奖励
+ // path: "/",
+ // label: "menu2.reward",
+ // fullName: "menu2.reward",
+ // icon: "i igl-folderOpen",
+ // componentReq: "reward",
+ // radius: "eth",
+ // id: "E02-1-7",
+ // introduce: "introduce.reward",
+ // navigation: "reward",
+ // assets: "ETH",
+ // interval: "menu.interval3",
+ // type: "L1",
+ // authority: "guest", //匿名用户
+ // },
+ // {
+ // //通货膨胀率
+ // path: "/",
+ // label: "menu2.inflationRate",
+ // fullName: "menu2.inflationRate",
+ // icon: "i igl-folderOpen",
+ // componentReq: "inflactionRate",
+ // radius: "eth",
+ // id: "E02-1-8",
+ // introduce: "introduce.inflactionRateEth",
+ // navigation: "inflactionRateEth",
+ // assets: "ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered",
+ // },
+ // {
+ // //新合约数
+ // path: "/",
+ // label: "menu2.cnew",
+ // fullName: "menu2.cnew",
+ // icon: "i igl-folderOpen",
+ // componentReq: "cnew",
+ // radius: "eth",
+ // id: "E02-1-9",
+ // introduce: "introduce.cnew",
+ // navigation: "cnew",
+ // assets: "ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered", //注册用户
+ // },
+ // {
+ // //新合约地址
+ // path: "/",
+ // label: "menu2.newContract",
+ // fullName: "menu2.newContract",
+ // icon: "i igl-folderOpen",
+ // componentReq: "newContract",
+ // radius: "eth",
+ // id: "E02-1-10",
+ // introduce: "introduce.newContract", //无
+ // navigation: "newContract",
+ // assets: "ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered", //注册用户
+ // },
+ // {
+ // //大额交易
+ // path: "/",
+ // label: "menu2.onchain1",
+ // fullName: "menu2.onchain1",
+ // icon: "i igl-folderOpen",
+ // componentReq: "ethbigtxcount",
+ // radius: "eth",
+ // id: "E02-1-11",
+ // introduce: "introduce.btcbigtxcount",
+ // navigation: "bigDeals",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L1",
+ // authority: "guest", //匿名用户
+ // },
+ // {
+ // //erc20 token 日交易量 改为代币交易量
+ // path: "/",
+ // label: "menu2.large6",
+ // fullName: "menu2.large6",
+ // icon: "i igl-folderOpen",
+ // componentReq: "ETHTokenVolume",
+ // radius: "eth",
+ // id: "E03-1-1",
+ // introduce: "introduce.ETHTokenVolume",
+ // navigation: "ercVolume",
+ // assets: "ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered", //注册用户
+ // },
+
+ // {
+ // //erc20 token 大额交易监控 改为 代币大额交易
+ // path: "/",
+ // label: "menu2.large5",
+ // fullName: "menu2.ercBigDeals",
+ // icon: "i igl-folderOpen",
+ // componentReq: "ETHTokenBigtx",
+ // radius: "eth",
+ // id: "E03-1-2",
+ // introduce: "introduce.ETHTokenBigtx",
+ // navigation: "ercBigDeals",
+ // assets: "ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered", //注册用户
+ // },
+ // {
+ // //流通市值
+ // path: "/",
+ // label: "menu2.marketcap",
+ // fullName: "menu2.marketcap2",
+ // icon: "i igl-folderOpen",
+ // componentReq: "marketcap",
+ // radius: "eth",
+ // id: "E04-1-1",
+ // introduce: "introduce.marketcap",
+ // navigation: "marketcapEth",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L1",
+ // authority: "guest",
+ // },
+ // {
+ // //已实现流通市值
+ // path: "/",
+ // label: "menu2.rcap",
+ // fullName: "menu2.rcap2",
+ // icon: "i igl-folderOpen",
+ // componentReq: "rcap",
+ // radius: "eth",
+ // id: "E04-1-4",
+ // introduce: "introduce.rcapEth",
+ // navigation: "rcapEth",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered",
+ // },
+ // {
+ // //流通市值-已实现流通市值比 改为 MVRV Ratio
+ // path: "/",
+ // label: "menu2.mvrvRatio",
+ // fullName: "menu2.mvrvRatio2",
+ // icon: "i igl-folderOpen",
+ // componentReq: "mvrvRatio",
+ // radius: "eth",
+ // id: "E04-1-11",
+ // introduce: "introduce.MVRV",
+ // navigation: "mvrvRatioEth",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered",
+ // },
+ // {
+ // //已实现价格
+ // path: "/",
+ // label: "menu2.rprice",
+ // fullName: "menu2.rprice",
+ // icon: "i igl-folderOpen",
+ // componentReq: "rprice",
+ // radius: "eth",
+ // id: "E04-1-5",
+ // introduce: "introduce.realizedPrice",
+ // navigation: "rpriceEth",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered",
+ // },
+ // {
+ // //市值/交易价值比 NVT Ratio 改为 市盈率
+ // path: "/",
+ // label: "menu2.nvtRatio",
+ // fullName: "menu2.nvtRatio2",
+ // icon: "i igl-folderOpen",
+ // componentReq: "nvtRatio",
+ // radius: "eth",
+ // id: "E04-1-2",
+ // introduce: "introduce.nvtRatio",
+ // navigation: "nvtRatioEth",
+ // assets: "ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered",
+ // },
+ // {
+ // //流通速度
+ // path: "/",
+ // label: "menu2.velocity",
+ // fullName: "menu2.velocity",
+ // icon: "i igl-folderOpen",
+ // componentReq: "velocity",
+ // radius: "eth",
+ // id: "E04-1-3",
+ // introduce: "introduce.velocity",
+ // navigation: "velocityEth",
+ // assets: "ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered",
+ // },
+ // {
+ // //未实现的净收益量
+ // path: "/",
+ // label: "menu2.relativeUProfit",
+ // fullName: "menu2.relativeUProfit",
+ // icon: "i igl-folderOpen",
+ // componentReq: "relativeUProfit",
+ // radius: "eth",
+ // id: "E04-1-7",
+ // introduce: "introduce.uprofit",
+ // navigation: "relativeUProfitEth",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered",
+ // },
+ // {
+ // //未实现的净亏损量
+ // path: "/",
+ // label: "menu2.relativeULoss",
+ // fullName: "menu2.relativeULoss",
+ // icon: "i igl-folderOpen",
+ // componentReq: "relativeULoss",
+ // radius: "eth",
+ // id: "E04-1-8",
+ // introduce: "introduce.uloss",
+ // navigation: "relativeULossEth",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered",
+ // },
+
+ // {
+ // //未实现的净收益损失比
+ // path: "/",
+ // label: "menu2.nupl",
+ // fullName: "menu2.nupl2",
+ // icon: "i igl-folderOpen",
+ // componentReq: "nupl",
+ // radius: "eth",
+ // id: "E04-1-6",
+ // introduce: "introduce.nupl",
+ // navigation: "nuplEth",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered",
+ // },
+
+ // {
+ // //长持者未实现的净收益量 修改为 长持者未实现的净收益损失比
+ // path: "/",
+ // label: "menu2.lthNUPL",
+ // fullName: "menu2.lthNUPL2",
+ // icon: "i igl-folderOpen",
+ // componentReq: "lthNUPL",
+ // radius: "eth",
+ // id: "E04-1-9",
+ // introduce: "introduce.lthnupl",
+ // navigation: "lthNUPLEth",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L3",
+ // authority: "advance",
+ // },
+ // {
+ // //短持者未实现的净亏损量 改为 短持者未实现的净亏损损失比
+ // path: "/",
+ // label: "menu2.sthNUPL",
+ // fullName: "menu2.sthNUPL2",
+ // icon: "i igl-folderOpen",
+ // componentReq: "sthNUPL",
+ // radius: "eth",
+ // id: "E04-1-10",
+ // introduce: "introduce.sthnupl",
+ // navigation: "sthNUPLEth",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L3",
+ // authority: "advance",
+ // },
+ // {
+ // //币天销毁量
+ // path: "/",
+ // label: "menu2.cdd",
+ // fullName: "menu2.cdd2",
+ // icon: "i igl-folderOpen",
+ // componentReq: "cdd",
+ // radius: "eth",
+ // id: "E05-1-2",
+ // introduce: "introduce.CDD",
+ // navigation: "CDDETH",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered", //注册用户
+ // },
+ // {
+ // //币天销毁量分布 修改为BTC一样 币天销毁量年龄分布
+ // path: "/",
+ // label: "menu2.cddwave",
+ // fullName: "menu2.cddwave2",
+ // icon: "i igl-folderOpen",
+ // componentReq: "cddwave",
+ // radius: "eth",
+ // id: "E05-1-3",
+ // introduce: "introduce.soag",
+ // navigation: "cddwaveEth",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered", //注册用户
+ // },
+ // {
+ // //已花费输出平均寿命
+ // path: "/",
+ // label: "menu2.asol",
+ // fullName: "menu2.asol2",
+ // icon: "i igl-folderOpen",
+ // componentReq: "asol",
+ // radius: "eth",
+ // id: "E05-1-4",
+ // introduce: "introduce.asol",
+ // navigation: "asolEth",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered", //注册用户
+ // },
+ // {
+ // //已花费输出休眠平均天数
+ // path: "/",
+ // label: "menu2.dormancy",
+ // fullName: "menu2.dormancy",
+ // icon: "i igl-folderOpen",
+ // componentReq: "dormancy",
+ // radius: "eth",
+ // id: "E05-1-5",
+ // introduce: "introduce.dormancy",
+ // navigation: "dormancyEth",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered", //注册用户
+ // },
+ // {
+ // //活跃度
+ // path: "/",
+ // label: "menu2.liveliness",
+ // fullName: "menu2.liveliness",
+ // icon: "i igl-folderOpen",
+ // componentReq: "liveliness",
+ // radius: "eth",
+ // id: "E05-1-6",
+ // introduce: "introduce.Liveliness",
+ // navigation: "livelinessEth",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered",
+ // },
+ // {
+ // //已花费输出盈利比
+ // path: "/",
+ // label: "menu2.sopr",
+ // fullName: "menu2.sopr2",
+ // icon: "i igl-folderOpen",
+ // componentReq: "sopr",
+ // radius: "eth",
+ // id: "E06-1-1",
+ // introduce: "introduce.soprEth",
+ // navigation: "soprEth",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L1",
+ // authority: "guest",
+ // },
+ // {
+ // //盈利供应量
+ // path: "/",
+ // label: "menu2.supplyprofit",
+ // fullName: "menu2.supplyprofit",
+ // icon: "i igl-folderOpen",
+ // componentReq: "supplyprofit",
+ // radius: "eth",
+ // id: "E06-1-2",
+ // introduce: "introduce.supplyProfitEth",
+ // navigation: "supplyProfitEth",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered",
+ // },
+ // {
+ // //盈利亏损量
+ // path: "/",
+ // label: "menu2.supplyloss",
+ // fullName: "menu2.supplyloss",
+ // icon: "i igl-folderOpen",
+ // componentReq: "supplyLoss",
+ // radius: "eth",
+ // id: "E06-1-3",
+ // introduce: "introduce.supplyLossEth",
+ // navigation: "supplyLossEth",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered",
+ // },
+
+ // {
+ // //盈利百分比
+ // path: "/",
+ // label: "menu2.supplyprofitPercent",
+ // fullName: "menu2.supplyprofitPercent",
+ // icon: "i igl-folderOpen",
+ // componentReq: "supplyprofitPercent",
+ // radius: "eth",
+ // id: "E06-1-4",
+ // introduce: "introduce.supplyProfitPercentEth",
+ // navigation: "supplyProfitPercentEth", //ProfitPercentEthsupply
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered",
+ // },
+ // {
+ // //按余额分段的地址数分布 改为 地址数分布
+ // path: "/",
+ // label: "menu2.distribution",
+ // fullName: "menu2.distribution",
+ // icon: "i igl-folderOpen",
+ // componentReq: "distribution",
+ // radius: "eth",
+ // id: "E07-1-1-1",
+ // introduce: "introduce.balanceDistribution",
+ // navigation: "distributionEth",
+ // assets: "ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered", //注册用户
+ // },
+ // {
+ // //持有者地址的供应分布 改为 币数量分布
+ // path: "/",
+ // label: "menu2.supplyDistribution",
+ // fullName: "menu2.supplyDistribution",
+ // icon: "i igl-folderOpen",
+ // componentReq: "supplyDistribution",
+ // radius: "eth",
+ // id: "E07-1-1-2",
+ // introduce: "introduce.balanceDistribution",
+ // navigation: "supplyDistributionEth",
+ // assets: "ETH",
+ // interval: "menu.interval3",
+ // type: "L3",
+ // authority: "advance",
+ // },
+ // {
+ // //江卓尔60日累计涨幅
+ // path: "/",
+ // label: "menu2.technology6",
+ // fullName: "menu2.jzr60",
+ // icon: "i igl-folderOpen",
+ // componentReq: "jzr60",
+ // radius: "ETH",
+ // id: "1-6",
+ // // conditions: "arh", //不同请求方式筛选条件
+ // introduce: "introduce.jzr60",
+ // navigation: "jzr60",
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered", //注册用户
+ // },
+ // {
+ // //2年移动平均价格乘数
+ // path: "/",
+ // label: "menu2.technology11",
+ // fullName: "menu2.ma730",
+ // icon: "i igl-folderOpen",
+ // componentReq: "ma730",
+ // radius: "eth",
+ // id: "1-11",
+ // introduce: "introduce.ma730",
+ // navigation: "ma730ETH", //导航组件名称
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered", //注册用户
+ // },
+ // {
+ // //PI周期顶指标 ETH
+ // path: "/",
+ // label: "menu2.PiCycleTopIndicator",
+ // fullName: "menu2.PiCycleTopIndicator",
+ // icon: "i igl-folderOpen",
+ // componentReq: "PiCycleTopIndicator",
+ // radius: "eth",
+ // id: "1-12",
+ // introduce: "introduce.PiCycleTopIndicator",
+ // navigation: "piCycleTopEth", //导航组件名称
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L1",
+ // authority: "guest",
+ // },
+ // {
+ // //黄金比例乘数 ETH
+ // path: "/",
+ // label: "menu2.goldenRatioMult",
+ // fullName: "menu2.goldenRatioMult",
+ // icon: "i igl-folderOpen",
+ // componentReq: "goldenRatioMult",
+ // radius: "eth",
+ // id: "1-13",
+ // introduce: "introduce.goldenRatioMult",
+ // navigation: "goldenRatioMultEth", //导航组件名称
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered", //注册用户
+ // },
+ // {
+ // //资金费率
+ // path: "/",
+ // label: "menu.technology13",
+ // fullName: "menu.technology13", //全名
+ // icon: "i igl-folderOpen",
+ // componentReq: "fundingRateETH",
+ // radius: "eth",
+ // id: "E03-5",
+ // introduce: "introduce.fundingRate",
+ // navigation: "fundingRateETH", //导航组件名称
+ // assets: "BTCUSDT、ETHUSDT",
+ // interval: "menu.interval3",
+ // type: "L1",
+ // authority: "guest", //注册用户
+ // },
+ // {
+ // //未平仓合约数
+ // path: "/",
+ // label: "menu.technology14",
+ // fullName: "menu.technology14", //全名
+ // icon: "i igl-folderOpen",
+ // componentReq: "openInterestETH",
+ // radius: "eth",
+ // id: "E03-6",
+ // introduce: "introduce.openInterest",
+ // navigation: "openInterestETH", //导航组件名称
+ // assets: "BTCUSDT、ETHUSDT",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered", //注册用户
+ // },
+ // {
+ // //合约主动买入量
+ // path: "/",
+ // label: "menu.technology15",
+ // fullName: "menu.technology15", //全名
+ // icon: "i igl-folderOpen",
+ // componentReq: "takerlongshortRatioETH",
+ // radius: "eth",
+ // id: "E03-7",
+ // introduce: "introduce.takerlongshortRatio",
+ // navigation: "takerlongshortRatioETH", //导航组件名称
+ // assets: "BTCUSDT、ETHUSDT",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered", //注册用户
+ // },
+
+ // {
+ // //时区购买力
+ // path: "/",
+ // label: "menu.tzbp",
+ // fullName: "menu.tzbp",
+ // icon: "i igl-folderOpen",
+ // componentReq: "tzbpEth",
+ // radius: "btc",
+ // id: "E03-1",
+ // introduce: "introduce.tzbp",
+ // navigation: "tzbpEth", //导航组件名称
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L3",
+ // authority: "advance",
+ // },
+ // {
+ // //买入大单挂单
+ // path: "/",
+ // label: "menu.bobp",
+ // fullName: "menu.bobp",
+ // icon: "i igl-folderOpen",
+ // componentReq: "bobp",
+ // radius: "btc",
+ // id: "E03-2",
+ // introduce: "introduce.bobp",
+ // navigation: "bobpEth", //导航组件名称
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L3",
+ // authority: "advance",
+ // },
+ // {
+ // //卖出大单挂单
+ // path: "/",
+ // label: "menu.bosp",
+ // fullName: "menu.bosp",
+ // icon: "i igl-folderOpen",
+ // componentReq: "bosp",
+ // radius: "btc",
+ // id: "E03-3",
+ // introduce: "introduce.bobp",
+ // navigation: "bospEth", //导航组件名称
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L3",
+ // authority: "advance",
+ // },
+ // {
+ // //成交量分布图
+ // path: "/",
+ // label: "menu.volumeProfile",
+ // fullName: "menu.volumeProfile", //全名
+ // icon: "i igl-folderOpen",
+ // componentReq: "volumeProfileETH",
+ // radius: "ETH",
+ // id: "E03-8",
+ // introduce: "introduce.volumeProfile",
+ // navigation: "volumeProfileETH", //导航组件名称
+ // assets: "BTCUSDT、ETHUSDT",
+ // interval: "menu.interval3",
+ // type: "L3",
+ // authority: "advance",
+ // },
+ // {
+ // //交易所余额
+ // path: "/",
+ // label: "menu.exchange10",
+ // fullName: "menu.exchange10",
+ // icon: "i igl-folderOpen",
+ // componentReq: "exchange",
+ // radius: "btc",
+ // id: "E03-4",
+ // introduce: "introduce.exchange1",
+ // navigation: "exchangeETH", //导航组件名称
+ // assets: "BTC、ETH",
+ // interval: "menu.interval3",
+ // type: "L2",
+ // authority: "registered",
+ // },
+ // ],
+ // },
+ { //稳定币
+ label: "稳定币",
+ icon: "i itubiao2",
+ nested: "peers", //判断是否多层嵌套
+ id: "W1",
+ children: [
+ {
+ //总流通量
+ path: "/",
+ label: "menu2.cstotal",
+ fullName: "menu2.cstotal",
+ icon: "i igl-folderOpen",
+ componentReq: "",
+ radius: "eth",
+ id: "w1-1",
+ introduce: "introduce.circulationTotalCSupply",
+ navigation: "circulationTotalCSupply",
+ assets: "USDC、USDT、BUSD",
+ interval: "menu.interval3", //历史数据
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //USDC
+ path: "/",
+ label: "menu2.csusdc",
+ fullName: "menu2.csusdc",
+ icon: "i igl-folderOpen",
+ componentReq: "",
+ radius: "eth",
+ id: "w1-2",
+ introduce: "introduce.circulationUSDC", //无介绍
+ navigation: "circulationUSDC",
+ assets: "USDC",
+ interval: "menu.interval3", //历史数据
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //USDT
+ path: "/",
+ label: "menu2.csusdt",
+ fullName: "menu2.csusdt",
+ icon: "i igl-folderOpen",
+ componentReq: "",
+ radius: "eth",
+ id: "w1-3",
+ introduce: "introduce.circulationUSDT", //无介绍
+ navigation: "circulationUSDT",
+ assets: "USDT",
+ interval: "menu.interval3", //历史数据
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //BUSD
+ // path: "/",
+ label: "menu2.csbusd",
+ fullName: "menu2.csbusd",
+ icon: "i igl-folderOpen",
+ componentReq: "",
+ radius: "eth",
+ id: "w1-4",
+ introduce: "introduce.circulationBUSD", //无介绍
+ navigation: "circulationBUSD",
+ assets: "BUSD",
+ interval: "menu.interval3", //历史数据
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //USDC铸造量
+ path: "/",
+ label: "menu2.USDCCasting",
+ fullName: "menu2.USDCCasting2",
+ icon: "i igl-folderOpen",
+ componentReq: "",
+ radius: "USDC",
+ id: "w2-2",
+ introduce: "introduce.USDCCasting", //无介绍
+ navigation: "mintedUSDC",
+ assets: "USDC",
+ interval: "menu.interval3", //历史数据
+ type: "L3",
+ authority: "advance",
+ },
+ {
+ //USDT铸造量
+ path: "/",
+ label: "menu2.USDTCasting",
+ fullName: "menu2.USDTCasting2",
+ icon: "i igl-folderOpen",
+ componentReq: "",
+ radius: "USDT",
+ id: "w2-1",
+ introduce: "introduce.USDTCasting", //无介绍
+ navigation: "mintedUSDT",
+ assets: "USDT",
+ interval: "menu.interval3", //历史数据
+ type: "L3",
+ authority: "advance",
+ },
+
+ {
+ //BUSD铸造量
+ path: "/",
+ label: "menu2.BUSDCasting",
+ fullName: "menu2.BUSDCasting2",
+ icon: "i igl-folderOpen",
+ componentReq: "",
+ radius: "BUSD",
+ id: "w2-3",
+ introduce: "introduce.BUSDCasting", //无介绍
+ navigation: "mintedBUSD",
+ assets: "BUSD",
+ interval: "menu.interval3", //历史数据
+ type: "L3",
+ authority: "advance",
+ },
+ { //USDC交易量
+ path: "/",
+ label: "menu2.usdc",
+ fullName: "menu2.usdc2",
+ icon: "i igl-folderOpen",
+ componentReq: "",
+ radius: "eth",
+ id: "w3-1",
+ introduce: "introduce.dayUsdc", //无介绍
+ navigation: "USDC",
+ assets: "USDC",
+ interval: "menu.interval3", //无介绍
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {//USDT交易量
+ path: "/",
+ label: "menu2.usdt",
+ fullName: "menu2.usdt2",
+ icon: "i igl-folderOpen",
+ componentReq: "",
+ radius: "eth",
+ id: "w3-2",
+ introduce: "introduce.dayUsdt", //无介绍
+ navigation: "USDT",
+ assets: "USDT",
+ interval: "menu.interval3", //无
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {//BUSD交易量
+ path: "/",
+ label: "menu2.busd",
+ fullName: "menu2.busd2",
+ icon: "i igl-folderOpen",
+ componentReq: "",
+ radius: "eth",
+ id: "w3-3",
+ introduce: "introduce.dayBusd", //无介绍
+ navigation: "BUSD",
+ assets: "BUSD",
+ interval: "menu.interval3", //1天
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //USDC大额交易
+ path: "/",
+ label: "menu2.USDCMonitoring",
+ fullName: "menu2.USDCMonitoring2",
+ icon: "i igl-folderOpen",
+ componentReq: "",
+ radius: "eth",
+ id: "w4-1",
+ introduce: "introduce.bigUsdc",
+ navigation: "USDCMonitoring",
+ assets: "USDC",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册
+ },
+ {
+ //USDT大额交易
+ path: "/",
+ label: "menu2.USDTMonitoring",
+ fullName: "menu2.USDTMonitoring2",
+ icon: "i igl-folderOpen",
+ componentReq: "",
+ radius: "eth",
+ id: "w4-2",
+ introduce: "introduce.bigUsdt",
+ navigation: "USDTMonitoring",
+ assets: "USDT",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册
+ },
+ {
+ //BUSD大额交易
+ path: "/",
+ label: "menu2.BUSDMonitoring",
+ fullName: "menu2.BUSDMonitoring2",
+ icon: "i igl-folderOpen",
+ componentReq: "",
+ radius: "eth",
+ id: "w4-3",
+ introduce: "introduce.bigBusd",
+ navigation: "BUSDMonitoring",
+ assets: "BUSD",
+ interval: "menu.interval3", //1天
+ type: "L2",
+ authority: "registered", //注册
+ },
+ ],
+ },
+ { //宏观经济指标导航
+ label: "宏观经济指标",
+ icon: "i itubiao2",
+ nested: "peers", //判断是否多层嵌套
+ id: "H1",
+ children: [
+ {//货币供应量
+ path: "/",
+ label: "menu.MoneyStockMeasures",
+ fullName: "menu.MoneyStockMeasures", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "MoneyStockMeasures",
+ id: "H1-1",
+ introduce: "introduce.MoneyStockMeasures",
+ navigation: "MoneyStockMeasures",
+ assets: "无",
+ interval: "home.no",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //私营部门贷款
+ path: "/",
+ label: "menu.loanPsi",
+ fullName: "menu.loanPsi", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "loanPsi",
+ id: "3-7",
+ introduce: "introduce.loanPsi",
+ navigation: "loanPsi",
+ assets: "无",
+ interval: "home.no",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //私人债务占GDP比重
+ path: "/",
+ label: "menu.loanGdp",
+ fullName: "menu.loanGdp", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "loanGdp",
+ id: "3-8",
+ introduce: "introduce.loanGdp",
+ navigation: "loanGdp",
+ assets: "无",
+ interval: "home.no",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //国债收益率
+ path: "/",
+ label: "menu.USTreasuriesYields",
+ fullName: "menu.USTreasuriesYields", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "USTreasuriesYields",
+ id: "H2-1",
+ introduce: "introduce.USTreasuriesYields",
+ navigation: "USTreasuriesYields",
+ assets: "无",
+ interval: "home.no",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //纳斯达克指数
+ path: "/",
+ label: "menu.macro1",
+ fullName: "menu.macro1", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "NDAQohlc",
+ id: "H3-1",
+ introduce: "introduce.NDAQohlc",
+ navigation: "ndaqOhlc",
+ assets: "无",
+ interval: "menu.interval3",
+ type: "L1",
+ authority: "guest", //匿名用户
+ },
+ {
+ //纳斯达克/BTC日K线 改为 纳斯达克指数 vs BTC
+ path: "/",
+ label: "menu.macro2",
+ fullName: "menu.macro2", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "NDAQBTCPrice",
+ id: "H3-2",
+ introduce: "introduce.NDAQBTCPrice",
+ navigation: "NdaqBtcDayKline",
+ assets: "无",
+ interval: "menu.interval3",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //每周经济指数
+ path: "/",
+ label: "menu.wei",
+ fullName: "menu.wei", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "wei",
+ id: "H4-1",
+ introduce: "introduce.wei",
+ navigation: "wei",
+ assets: "无",
+ interval: "home.no",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //市场快讯 金十数据
+ path: "/",
+ label: "menu.quickNews",
+ fullName: "menu.quickNews", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "NDAQBTCPrice",
+ id: "H5-1",
+ introduce: "introduce.quickNews",
+ navigation: "quickNews",
+ assets: "无",
+ interval: "home.no",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+ {
+ //财经日历 金十数据
+ path: "/",
+ label: "menu.economics",
+ fullName: "menu.economics", //全名
+ icon: "i igl-folderOpen",
+ componentReq: "NDAQBTCPrice",
+ id: "H5-2",
+ introduce: "introduce.quickNews",
+ navigation: "economics",
+ assets: "无",
+ interval: "home.no",
+ type: "L2",
+ authority: "registered", //注册用户
+ },
+
+
+ ],
+ },
+
+ ],
+ newMEnu: [
+ { //BTC币种
+ label: "menu.BTCMenu",
+ icon: "i itubiao2",
+ nested: "peers", //判断是否多层嵌套
+ id: "B1",
+ children: []
+ },
+ // { //ETH币种
+ // label: "menu.ETHMenu",
+ // icon: "i itubiao2",
+ // nested: "peers", //判断是否多层嵌套
+ // id: "E1",
+ // children: []
+ // },
+ { //稳定币
+ label: "menu.stableMenu",
+ icon: "i itubiao2",
+ nested: "peers", //判断是否多层嵌套
+ id: "W1",
+ children: []
+ },
+ { //宏观经济指标导航
+ label: "menu.macroscopicMenu",
+ icon: "i itubiao2",
+ nested: "peers", //判断是否多层嵌套
+ id: "H1",
+ children: []
+ },
+
+
+ ],
+ activeMenuItem: "B01-1-4", // 当前选中的菜单项
+ menuRefHeight: 0, // 菜单的高度
+ menuChildren: [],
+ topArr: [],//元素自身距离父级的高度、
+ scrollListenerEnabled: true,//是否启用滚动事件监听
+ flag: false,
+ BTCmenu: [],
+ ETHmenu: [],
+ stableMenu: [],
+ macroscopicMenu: [],
+ oldMenu: []
+
+ };
+ },
+
+ created() {
+ this.handelNewMenu()//处理需要渲染的数据
+ },
+ mounted() {
+ this.flag = sessionStorage.getItem("Whether")
+ if (this.flag) {
+ this.menuId = "B01-1-4"
+ } else {
+ this.menuId = localStorage.getItem("open")
+ }
+ this.handleMenuSelect(this.menuId)
+ this.handelIntroduce()
+ this.handelScrollHeight()
+ this.restaurants = this.handelMenu(this.menuChildren)
+ sessionStorage.setItem("Whether", "true");
+ },
+ watch: {
+ // 监听语言切换
+ "$i18n.locale"(newValue) {
+
+
+ this.restaurants = this.handelMenu(this.menuChildren)
+
+ },
+
+ },
+ computed: {
+ menuStyle() {
+ return {
+ position: 'fixed',
+ left: '0',
+ top: '0',
+ height: this.menuRefHeight + 'px',
+ };
+ },
+ contentStyle() {
+ return {
+ paddingLeft: this.menuRefHeight + 'px',
+ };
+ },
+ },
+ methods: {
+
+ //处理接口介绍换行
+ handelIntroduce(introduce) {
+
+ if (this.$t(introduce).indexOf("///") !== -1) {
+ this.newIntroduce = this.$t(introduce).split("///");
+ //计算公式 和单位 不显示
+ var filteredArray = this.$t(introduce).split("///").filter(item => {
+ return !item.includes("计算公式") && !item.includes("千=K") && !item.includes("Calculation formula:") && !item.includes("thousands =K");
+ })
+
+ return filteredArray
+
+ // return this.$t(introduce).split("///");
+ } else {
+ this.newIntroduce = [this.$t(this.introduce)];
+
+ return this.$t(introduce)
+ }
+
+
+ },
+
+ //回到顶部
+ scrollToTop() {
+ const container = this.$refs.menuItemBox;
+ const container1 = this.$refs.wrapper;
+ container.scrollTop = 0;
+ container1.scrollTop = 0;
+ },
+ menuClose(index) { //保留一个菜单总保持打开状态
+
+ // if(this.$refs.elMenuRef.openedMenus.length < 1){
+ // this.$refs.elMenuRef.open(index)
+ // }
+ },
+ //搜素框默认显示的内容
+ querySearchAsync(queryString, cb) {
+ var restaurants = this.restaurants;
+ var results = queryString
+ ? restaurants.filter(this.createStateFilter(queryString))
+ : restaurants;
+
+ clearTimeout(this.timeout);
+ this.timeout = setTimeout(() => {
+ cb(results);
+ }, 3000 * Math.random());
+ },
+ //查找有关键字的项目
+ createStateFilter(queryString) {
+
+ return (state) => {
+
+ return state.label.toLowerCase().includes(queryString.toLowerCase());
+ };
+ },
+
+
+ // 按照搜索格式调整Menu
+ handelMenu(menu) {
+ let newMenu = []
+ menu.map((item, index) => {
+
+ newMenu.push({ value: item.id, label: this.$t(item.label), index: index })
+ })
+ return newMenu
+ },
+
+
+ //选中导航搜索结果中的某一项
+ handleSelect(item) {
+
+ let newObj = item;
+ if (!item.label) {
+ //点击了搜索图标
+ newObj = this.restaurants.find((item1) => item1.value == item.value);
+ }
+ this.handleMenuSelect(newObj.value)
+ this.state = "";
+ },
+ //点击左侧菜单右侧内容对应滚动位置
+ handleMenuSelect(index) {
+ this.activeMenuItem = index
+ this.scrollListenerEnabled = false
+ const contentRef = this.$refs.wrapper;
+ const menuRef = this.$refs[`menu${index}`][0]
+
+ menuRef.scrollIntoView({
+ behavior: 'smooth',
+ block: 'start',
+ });
+
+
+
+ setTimeout(() => {//当点击左侧菜单项目的时候 就不执行滚动函数的内容
+ this.scrollListenerEnabled = true;
+ }, 500); // 这里使用一个适当的延迟时间,根据实际情况进行调整
+
+
+
+
+ },
+ //监听右侧滚动位置 高亮左侧导航栏
+ handleContentScroll(event) {
+
+ this.flag = true
+ if (!this.scrollListenerEnabled) {
+ return;
+ }
+ const contentRef = this.$refs.wrapper;
+ if (!contentRef) return;
+ const menuBox = this.$refs.menuItemBox
+ const scrollTop = contentRef.scrollTop; // 获取右侧内容的滚动位置
+
+
+ let AIndex = this.topArr.findIndex((item, index) => {
+ return (
+ scrollTop > this.topArr[index - 1] &&
+ scrollTop < this.topArr[index]
+ );
+ });
+ if (AIndex < 0) {
+ AIndex = 0
+ }
+
+ this.activeMenuItem = this.menuChildren[AIndex].id
+ // const activeItem = document.querySelector('.el-menu-item.is-active');//拿到高龄元素
+ // activeItem.scrollIntoView({ behavior: 'smooth', block: 'center' });//滚动到高亮元素
+
+ },
+ handelScrollHeight() {
+ //扁平化导航
+ this.newMEnu.forEach(item => {
+ if (item.children) {
+ this.menuChildren.push(...item.children)
+ }
+ })
+ this.newMEnu.map((item) => {
+ item.children.map((subItem) => {
+
+ if (subItem.id) {
+ const element = this.$refs['menu' + subItem.id][0]; // 获取对应的元素对象
+ const rect = element.getBoundingClientRect(); // 获取元素的位置和尺寸信息
+ this.topArr.push(element.offsetTop)
+ }
+
+
+ });
+ });
+
+ },
+ //扁平化导航数组 递归
+ handelAllMenu(arr) {
+ var result = [];
+ arr.forEach((item) => {
+ if (!item.children) {
+ result.push(item);
+ } else {
+ var nestedItems = this.handelAllMenu(item.children);
+ result = result.concat(nestedItems);
+ }
+ });
+
+ return result;
+ },
+ //拿取内存中最新的导航进行处理数据生成新导航
+ handelNewMenu() {
+ //拿到侧边导航的每个分类导航
+ this.BTCmenu = JSON.parse(localStorage.getItem("BTCMenu"))
+ this.ETHmenu = JSON.parse(localStorage.getItem("ETHmenu"))
+ this.stableMenu = JSON.parse(localStorage.getItem("stableMenu"))
+ this.macroscopicMenu = JSON.parse(localStorage.getItem("macroscopicMenu"))
+ this.newMEnu[0].children = this.handelAllMenu(this.BTCmenu)
+ // this.newMEnu[1].children = this.handelAllMenu(this.ETHmenu)
+ this.newMEnu[1].children = this.handelAllMenu(this.stableMenu)
+ this.newMEnu[2].children = this.handelAllMenu(this.macroscopicMenu)
+
+ // --------------地址数、币数量等加上对应分类-----------------------------
+ this.oldMenu = this.handelAllMenu(this.newMEnu1)
+ //需要更换名字的几个导航项
+ let arr = `B08-1-1-1,B08-1-1-2,B08-1-2-1,B08-1-2-2,B08-1-3-1,B08-1-3-2,B08-1-4-1,B08-1-4-2,B08-1-5-1,B08-1-5-2,B08-1-6-1,B08-1-6-2,B08-1-6-3,B08-1-6-4,B08-1-6-5,B08-1-6-6,B08-1-6-7,B08-1-6-8,B08-1-7-1,B08-1-7-2,B08-1-7-3,B08-1-7-4,B08-1-7-5,B08-1-7-6,B08-1-7-7,B08-1-7-8`
+ arr = arr.split(",")
+
+ let replaceArr = []//筛选出替换的对象
+ arr.map((item) => {
+ replaceArr.push(this.oldMenu.find((itemB) => {
+ return itemB.id == item
+ }))
+
+ })
+ // 使用 map() 方法替换指定项
+ this.newMEnu[0].children = this.newMEnu[0].children.map( (itemA) =>{
+ var matchingItem = replaceArr.find((itemB)=>{
+ return itemA.id === itemB.id;
+ });
+
+ if (matchingItem) {
+ return matchingItem;
+ } else {
+ return itemA;
+ }
+ });
+
+
+
+
+ }
+
+
+
+
+ },
+ beforeDestroy() {
+
+ localStorage.setItem("Whether", "false");
+ }
+};
\ No newline at end of file
diff --git a/yq/src/views/indexIntroduce/index.vue b/yq/src/views/indexIntroduce/index.vue
new file mode 100644
index 0000000..3e06912
--- /dev/null
+++ b/yq/src/views/indexIntroduce/index.vue
@@ -0,0 +1,437 @@
+
+
+
+
+
+
+
{{ $t(`home.welcome`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
{{$t(subItem.label) }}
+
+
+
+
+
+
+
+
+
+
+ {{ introduceItem }}
+
+
+
+
+
+ {{ handelIntroduce(subItem.introduce) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/inflactionRateEth/index.js b/yq/src/views/inflactionRateEth/index.js
new file mode 100644
index 0000000..5acc58a
--- /dev/null
+++ b/yq/src/views/inflactionRateEth/index.js
@@ -0,0 +1,351 @@
+import * as echarts from "echarts";
+import { getInflactionRateEth, } from "../../api/pages"
+import { chartsWidth,emptyData, dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ inflactionRateEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ var res = params[0].axisValueLabel;
+
+ for (let i = 0; i < params.length; i++) {
+ if (i == 0) {
+ res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}% `
+ } else {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ }
+
+ }
+
+
+ return res;
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Inflation Rate",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchinflactionRateEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("inflactionRateEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("inflactionRateEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchinflactionRateEth(params) {
+ this.inflactionRateEthLoading = true
+ const { data } = await getInflactionRateEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.inflactionRateEthLoading = false
+ return
+ }
+ let inflactionRateEthData = data.data
+ this.start = inflactionRateEthData[0].date.split("T")[0]
+ this.end = inflactionRateEthData[inflactionRateEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ inflactionRateEthData.forEach(item => {
+
+
+ item.value = item.value * 100
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(inflactionRateEthData, ValueList)
+
+ this.inCharts()
+
+ this.inflactionRateEthLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchinflactionRateEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchinflactionRateEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/inflactionRateEth/index.vue b/yq/src/views/inflactionRateEth/index.vue
new file mode 100644
index 0000000..9eb9d01
--- /dev/null
+++ b/yq/src/views/inflactionRateEth/index.vue
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/issuanceEth/index.js b/yq/src/views/issuanceEth/index.js
new file mode 100644
index 0000000..a64f16c
--- /dev/null
+++ b/yq/src/views/issuanceEth/index.js
@@ -0,0 +1,351 @@
+import * as echarts from "echarts";
+import { getIssuanceEth, } from "../../api/pages"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ issuanceEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}% `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Issuance",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchissuanceEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("issuanceEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("issuanceEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchissuanceEth(params) {
+ this.issuanceEthLoading = true
+ const { data } = await getIssuanceEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.issuanceEthLoading = false
+ return
+ }
+ let issuanceEthData = data.data
+ this.start = issuanceEthData[0].date.split("T")[0]
+ this.end = issuanceEthData[issuanceEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ issuanceEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(issuanceEthData, ValueList)
+
+ this.inCharts()
+
+ this.issuanceEthLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchissuanceEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchissuanceEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+}
+}
\ No newline at end of file
diff --git a/yq/src/views/issuanceEth/index.vue b/yq/src/views/issuanceEth/index.vue
new file mode 100644
index 0000000..54d5944
--- /dev/null
+++ b/yq/src/views/issuanceEth/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/jzr60/index.js b/yq/src/views/jzr60/index.js
new file mode 100644
index 0000000..1e6044a
--- /dev/null
+++ b/yq/src/views/jzr60/index.js
@@ -0,0 +1,885 @@
+import * as echarts from "echarts";
+import {
+ handelLineType, emptyData,
+ fetchBtcPrice, fetchEthPrice, dataLength, handelProfitrate, chartsWidth, handelZoom, getDateArray, handelWatermark
+} from "../../util/processingData";
+export default {
+ data() {
+ return {
+ lengthTimer: null,
+ jzr60Loading: false,
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+ console.log(params,"就覅积分覅就");
+ for (let i = 0; i <= params.length - 1; i++) {
+ console.log(i,params.length - 1);
+ if (i == params.length - 1) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ } else {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]}% `
+
+ }
+
+ }
+
+
+
+ // if (params[1]) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}%
+ // ${params[1].marker} ${params[1].seriesName}      ${params[1].value[1]} `;
+
+ // } else {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}%
+ // `;
+
+ // }
+
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ axisLabel: {
+ // formatter:function(value){
+
+ // return `${value/1000} k`
+ // }
+ }
+ },
+ {
+ position: "right",
+ type: "value",
+ splitNumber: "5",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "7 days of cumulative gains",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "30 days of cumulative gains",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#b82eae",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#b82eae",
+ width: "1",
+ },
+
+ data: [],
+ },
+ {
+ name: "60 days of cumulative gains",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#ab334f",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#ab334f",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "90 days of cumulative gains",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#1a7f54",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#1a7f54",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ markLine: {
+ symbol: ["none", "none"], //去掉箭头
+ itemStyle: {
+ normal: {
+ lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ },
+ },
+ // lineStyle:{
+ // opacity:0
+ // },
+ label: {
+ formatter: "{b}",
+ fontSize: 10,
+ color: "rgba(0,0,0,0.8)",
+ align: "left",
+ },
+ data: [
+ {
+ name: "$0",
+ yAxis: 0,
+ },
+ {
+ name: "$10k",
+ yAxis: 10000,
+ },
+ {
+ name: "$20K",
+ yAxis: 20000,
+ },
+ {
+ name: "$30K",
+ yAxis: 30000,
+ },
+ {
+ name: "$40K",
+ yAxis: 40000,
+ },
+ {
+ name: "$50K",
+ yAxis: 50000,
+ },
+ {
+ name: "$60K",
+ yAxis: 60000,
+ },
+ {
+ name: "$70K",
+ yAxis: 70000,
+ },
+ {
+ name: "$80K",
+ yAxis: 80000,
+ },
+ {
+ name: "$90K",
+ yAxis: 90000,
+ },
+ {
+ name: "$100K",
+ yAxis: 100000,
+ },
+
+ ],
+ },
+ },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 2,
+ data: [],
+ },
+
+ ],
+ },
+ dayOption: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ var res = params[0].axisValueLabel;
+
+ for (let i = 0; i <= params.length - 1; i++) {
+ if (i == params.length - 1) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value} `
+
+ } else {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value}% `
+
+ }
+
+ }
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ axisLabel: {
+ formatter: function (value) {
+ let hours = value.split(" ")[1].split(":")[0];
+ let min = value.split(" ")[1].split(":")[1];
+ return `${hours}:${min}`;
+ },
+ },
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure2`),
+ position: "left",
+ type: "value",
+ // min: `dataMin`,
+ // max: `dataMax`,
+ // axisLabel:{
+ // formatter:function(value){
+ // let data = (value/10000).toFixed(3)
+ // return `${data} W`
+ // }
+ // }
+ },
+ {
+ position: "right",
+ type: "value",
+ min: `dataMin`,
+ max: `dataMax`,
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ min: `dataMin`,
+ max: `dataMax`,
+ // splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "7 days of cumulative gains",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "30 days of cumulative gains",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#b82eae",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#b82eae",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "60 days of cumulative gains",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#ab334f",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#ab334f",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "90 days of cumulative gains",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#1a7f54",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#1a7f54",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 0,
+ data: [],
+ // markLine: {
+ // symbol: ["none", "none"], //去掉箭头
+ // itemStyle: {
+ // normal: {
+ // lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ // },
+ // },
+ // // lineStyle:{
+ // // opacity:0
+ // // },
+ // label: {
+ // formatter: "{b}",
+ // fontSize: 10,
+ // color: "rgba(0,0,0,0.8)",
+ // align: "left",
+ // },
+ // data: [
+ // {
+ // name: "$0",
+ // yAxis: 0,
+ // },
+ // {
+ // name: "$10k",
+ // yAxis: 10000,
+ // },
+ // {
+ // name: "$20K",
+ // yAxis: 20000,
+ // },
+ // {
+ // name: "$30K",
+ // yAxis: 30000,
+ // },
+ // {
+ // name: "$40K",
+ // yAxis: 40000,
+ // },
+ // {
+ // name: "$50K",
+ // yAxis: 50000,
+ // },
+ // {
+ // name: "$60K",
+ // yAxis: 60000,
+ // },
+ // {
+ // name: "$70K",
+ // yAxis: 70000,
+ // },
+ // {
+ // name: "$80K",
+ // yAxis: 80000,
+ // },
+ // {
+ // name: "$90K",
+ // yAxis: 90000,
+ // },
+ // {
+ // name: "$100K",
+ // yAxis: 100000,
+ // },
+
+ // ],
+ // },
+ },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+
+
+ ],
+ },
+ timeParams: {
+ req: "jzr60",
+ start: "",
+ end: ""
+ },
+ dayParams: {
+ req: "jzr60day",
+ start: "",
+ end: ""
+ },
+ jzrData: [],
+ jzrDayData: [],
+ radius: "btc",
+ timer: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+
+ }
+ },
+ watch: {
+ radius(val) {
+
+ this.fetchJzr(this.timeParams.req, this.radius)
+ this.fetchJzrDay(this.dayParams.req, this.radius)
+
+ }
+
+ },
+ mounted() {
+ this.radius = localStorage.getItem("radius");
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+
+
+ //监听localstorage变化
+ window.addEventListener("setItem", () => {
+ this.radius = localStorage.getItem("radius");
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+
+
+ });
+
+ if (this.timer) {
+ clearInterval(this.timer)
+ }
+ //5分钟请求一次页面
+ this.timer = setInterval(() => {
+ this.fetchJzr(this.timeParams.req, this.radius)
+ this.fetchJzrDay(this.dayParams.req, this.radius)
+ }, 300000)
+
+
+
+
+ },
+ methods: {
+ //初始化
+ inChart() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("jzr60Box"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("jzr60Box", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ //初始化
+ inChartDay() {
+ if (this.myChartDay == null) {
+ this.myChartDay = echarts.init(document.getElementById("jzr60DayBox"));
+ }
+ this.dayOption = handelZoom(this.myChartDay, this.dayOption, this, this.zoomStart, this.zoomEnd)
+
+ this.myChartDay.setOption(this.dayOption);
+ chartsWidth("jzr60DayBox", this);
+ window.addEventListener("resize", () => {
+ this.myChartDay.resize();
+ });
+ },
+ //请求
+ async fetchJzr(req, radius, start, end, sma) {
+ this.jzr60Loading = true
+ const { data } = await this.$API.getMa370(req, radius, start, end, sma)
+ this.jzrData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChart, this)
+ if (noData) {
+ this.jzr60Loading = false
+ return
+ }
+
+ this.start = this.jzrData[0].date.split("T")[0]
+ this.end = this.jzrData[this.jzrData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+
+
+ //不同币种显示不同价格曲线
+ if (radius == "BTC") {
+ this.option.series = this.option.series.filter(item => item.name !== "Price [ETH]")
+ // this.handelSonBtcPrice("BTC", true)
+ } else if (radius == "ETH") {
+ this.option.series = this.option.series.filter(item => item.name !== "Price[BTC]")
+ // this.handelSonEthPrice("ETH", true)
+ }
+
+ let jzr7ValueList = []
+ let jzr30ValueList = []
+ let jzr60ValueList = []
+ let jzr90ValueList = []
+ let priceList = []
+ this.jzrData.forEach(item => {
+
+ jzr7ValueList.push(Number((item.jzr7 * 100).toFixed(2)))
+ jzr30ValueList.push(Number((item.jzr30 * 100).toFixed(2)))
+ jzr60ValueList.push(Number((item.jzr60 * 100).toFixed(2)))
+ jzr90ValueList.push(Number((item.jzr90 * 100).toFixed(2)))
+ priceList.push(item.price.toFixed(2))
+ })
+
+
+ this.option.series[0].data = handelProfitrate(this.jzrData, jzr7ValueList)
+ this.option.series[1].data = handelProfitrate(this.jzrData, jzr30ValueList)
+ this.option.series[2].data = handelProfitrate(this.jzrData, jzr60ValueList)
+ this.option.series[3].data = handelProfitrate(this.jzrData, jzr90ValueList)
+ this.option.series[4].data = handelProfitrate(this.jzrData, priceList)
+
+ this.inChart()
+ this.jzr60Loading = false
+
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length),);
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.dayOption, this.dayOption.series[0].data.length),);
+
+ }, 15000)
+ },
+ //请求JzrDay渲染数据
+ async fetchJzrDay(req, radius, start, end, sma) {
+
+ const { data } = await this.$API.getMa370(req, radius, start, end, sma)
+
+ //空数据处理
+ let noData = emptyData(data.data, this.dayOption.series, this.inChartDay, this)
+ if (noData) {
+
+ return
+ }
+
+ this.jzrDayData = data.data
+ this.dayOption.xAxis.data.length = 0
+ this.dayOption.series[0].data.length = 0
+ // this.dayOption.series[1].data.length = 0
+ //添加水印
+ this.dayOption = handelWatermark(this.dayOption)
+
+ //不同币种显示不同价格曲线
+ if (radius == "BTC") {
+ this.dayOption.series = this.dayOption.series.filter(item => item.name !== "Price [ETH]")
+ // this.handelSonBtcPrice("BTC", true)
+ } else if (radius == "ETH") {
+ this.dayOption.series = this.dayOption.series.filter(item => item.name !== "Price[BTC]")
+ // this.handelSonEthPrice("ETH", true)
+ }
+
+ this.dayOption.series[0].data = []
+ this.dayOption.series[1].data = []
+ this.dayOption.xAxis.data = []
+ this.jzrDayData.forEach(item => {
+ let year = item.date.split("T")[0]
+ let hour = item.date.split("T")[1].split(".")[0]
+ let time = `${year} ${hour}`
+ this.dayOption.xAxis.data.push(time)
+ //判断负数保留两位小数处理
+ // if (item.jzr60.toString().indexOf("-") !== -1) {
+ // item.jzr60 = 0 - Number(Math.abs(item.jzr60).toFixed(4))
+ // } else {
+ // item.jzr60 = Number(item.jzr60.toFixed(4))
+ // }
+ this.dayOption.series[0].data.push(Number(item.jzr7 * 100).toFixed(4))
+ this.dayOption.series[1].data.push(Number(item.jzr30 * 100).toFixed(4))
+ this.dayOption.series[2].data.push(Number(item.jzr60 * 100).toFixed(4))
+ this.dayOption.series[3].data.push(Number(item.jzr90 * 100).toFixed(4))
+ this.dayOption.series[4].data.push(item.price)
+ // this.dayOption.series[1].data.push(Number(item.price.toFixed(2)))
+ })
+ this.inChartDay()
+
+ },
+
+ //父级时间
+ handelSonTime(start, end) {
+ this.timeParams.start = start;
+ this.timeParams.end = end;
+ this.fetchJzr(this.timeParams.req, this.radius, this.timeParams.start, this.timeParams.end, this.sma)
+ // if (this.radius =="BTC") {
+ // //this.handelSonEthPrice()
+ // }else{
+ // this.handelSonBtcPrice("BTC",true)
+ // }
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ //父级BTC默认是true 在ETH页面btcFlag 取反才能正常点击父级就渲染
+
+ // if (this.radius == "ETH") {
+ // this.btcFlag = !flag;
+ // } else {
+ // this.btcFlag = flag;
+ // }
+ this.btcFlag = flag;
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inChart, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ //父级BTC默认是true 在ETH页面btcFlag 取反才能正常点击父级就渲染
+ // if (this.radius== "ETH") {
+ // this.ethFlag = !flag;
+ // } else {
+ // this.ethFlag = flag;
+ // }
+ this.ethFlag = flag;
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inChart, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.sma = smaDataList
+ this.fetchJzr(this.timeParams.req, this.radius, this.timeParams.start, this.timeParams.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inChart, this.start, this.end,)
+
+ },
+
+
+ },
+ beforeDestroy() {
+ // console.log("销毁咯 清除定时器");
+ clearInterval(this.timer)
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ },
+}
\ No newline at end of file
diff --git a/yq/src/views/jzr60/index.vue b/yq/src/views/jzr60/index.vue
new file mode 100644
index 0000000..71f9a1b
--- /dev/null
+++ b/yq/src/views/jzr60/index.vue
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+ {{ $t(`arh.jzr`) }}
+
+ {{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
+ {{ $t(`arh.dayGraph`) }}
+
+ {{ $t(`home.figure2`) }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/liveliness/index.js b/yq/src/views/liveliness/index.js
new file mode 100644
index 0000000..3933911
--- /dev/null
+++ b/yq/src/views/liveliness/index.js
@@ -0,0 +1,379 @@
+import * as echarts from "echarts";
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelZoom, handelLineType, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ livelinessLoading: false,
+ params: {
+ req: "liveliness",
+ radius: "btc"
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ // type: "time",
+ // type: 'category',
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//百万
+ value = `${e / 10000}W`;
+ } else {
+ value = e;
+ }
+ return value;
+ },
+ },
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right"
+ },
+
+ ],
+ dataZoom: [
+
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Liveliness",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ // stack: 'Total',
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "2",
+ },
+ // areaStyle: {
+ // opacity: 0.8,
+ // color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ // {//接近数据轴线
+ // offset: 0,
+ // color: 'rgba(247,147,26,0.7)'
+ // },
+ // {//接近X轴
+ // offset: 1,
+ // color: 'rgba(247,147,26,0.2)'
+ // }
+ // ])
+ // },
+ // emphasis: {
+ // focus: 'series'
+ // },
+ data: [],
+ yAxisIndex: 0,
+ },
+ {
+ name: "liveliness(CE)",
+ type: "line",
+ smooth: false,
+ // stack: 'Total',
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#b9332b",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#b9332b",
+ width: "1",
+ },
+ yAxisIndex: 0,
+ // areaStyle: {
+ // opacity: 0.8,
+ // color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ // {//接近数据轴线
+ // offset: 0,
+ // color: 'rgba(185,51,43,0.7)'
+ // },
+ // {//接近X轴
+ // offset: 1,
+ // color: 'rgba(185,51,43,0.2)'
+ // }
+ // ])
+ // },
+ // emphasis: {
+ // focus: 'series'
+ // },
+ yAxisIndex: 0,
+ data: []
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 3,
+ // data: [],
+ // },
+
+ ],
+ },
+ livelinessData: [],
+ parmesTime: {
+ start: "",
+ end: ""
+ },
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+
+ this.fetchLiveliness(this.params.req, this.params.radius)
+ // setTimeout(() => {
+ // this.pass()
+ // }, 3000);
+
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("livelinessBox"));
+
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("livelinessBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchLiveliness(req, radius, start, end, sma) {
+ this.livelinessLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+ this.livelinessData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.livelinessLoading = false
+ return
+ }
+ this.start = this.livelinessData[0].date.split("T")[0]
+ this.end = this.livelinessData[this.livelinessData.length - 1].date.split("T")[0]
+
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ //添加水印
+ this.option = handelWatermark(this.option)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // //移动平均线没值 才渲染正常价格数据
+ // if (this.start && !this.fatherSmaData[0]) {
+ // this.handelSonBtcPrice("BTC", true)
+ // }
+ // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // if (this.fatherSmaData[0] && this.start) {
+ // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ // }
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // })
+
+ let livelinessValueList = []
+ let ealivelinessValueList = []
+ let xAxisData=[]
+ this.livelinessData.forEach(item => {
+
+ livelinessValueList.push(Number(item.ealiveliness.toFixed(6)))
+ ealivelinessValueList.push(Number(item.liveliness.toFixed(6)))
+ //判断渲染与上面数据时间一致得价格数据
+ xAxisData.push(item.date.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = livelinessValueList
+ this.option.series[1].data =ealivelinessValueList
+ this.option.series[2].data = priceData
+ this.inCharts()
+ this.livelinessLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.parmesTime.start = start;
+ this.parmesTime.end = end;
+ this.fetchLiveliness(this.params.req, this.params.radius, this.parmesTime.start, this.parmesTime.end, this.sma)
+ },
+ //传值给父组件改变Ecarts 图表的线性和对数显示
+ // pass(){
+ // this.$emit("handelSwitch",this.option)
+ // },
+ //接收父级改变后的option
+ handelFatherSwitch(val) {
+ this.option.yAxis = val.yAxis
+ this.myChart.setOption(this.option);
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[2], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[3], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.sma = smaDataList
+
+ this.fetchLiveliness(this.params.req, this.params.radius, this.parmesTime.start, this.parmesTime.end, this.sma)
+
+ this.$addStorageEvent(1, "sma", this.sma);
+
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/liveliness/index.vue b/yq/src/views/liveliness/index.vue
new file mode 100644
index 0000000..bf51125
--- /dev/null
+++ b/yq/src/views/liveliness/index.vue
@@ -0,0 +1,198 @@
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/livelinessEth/index.js b/yq/src/views/livelinessEth/index.js
new file mode 100644
index 0000000..1069322
--- /dev/null
+++ b/yq/src/views/livelinessEth/index.js
@@ -0,0 +1,443 @@
+import * as echarts from "echarts";
+import { getLivelinessEth, } from "../../api/pages"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ livelinessEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}E `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ // type: 'category',
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//百万
+ value = `${e / 10000}W`;
+ } else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: true,
+ },
+ ],
+ dataZoom: [
+
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Liveliness",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ stack: 'Total',
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "2",
+ },
+ // areaStyle: {
+ // opacity: 0.8,
+ // color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ // {//接近数据轴线
+ // offset: 0,
+ // color: 'rgba(247,147,26,0.7)'
+ // },
+ // {//接近X轴
+ // offset: 1,
+ // color: 'rgba(247,147,26,0.2)'
+ // }
+ // ])
+ // },
+ // emphasis: {
+ // focus: 'series'
+ // },
+ data: []
+ },
+ // {
+ // name: "Entity-adjusted Liveliness",
+ // type: "line",
+ // smooth: false,
+ // stack: 'Total',
+ // symbol: "circle",
+ // showSymbol: false,
+ // symbolSize: 5,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#b9332b",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#b9332b",
+ // width: "1",
+ // },
+ // areaStyle: {
+ // opacity: 0.8,
+ // color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ // {//接近数据轴线
+ // offset: 0,
+ // color: 'rgba(185,51,43,0.7)'
+ // },
+ // {//接近X轴
+ // offset: 1,
+ // color: 'rgba(185,51,43,0.2)'
+ // }
+ // ])
+ // },
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // yAxisIndex: 0,
+ // data: []
+ // },
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 1,
+ // data: [],
+ // //绘制右侧Y轴
+ // markLine: {
+ // symbol: ["none", "none"], //去掉箭头
+ // itemStyle: {
+ // normal: {
+ // lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ // },
+ // },
+ // // lineStyle:{
+ // // color:"red"
+ // // },
+
+ // label: {
+ // formatter: "{b}",
+ // fontSize: 10,
+ // color: "rgba(0,0,0,0.8)",
+ // align: "left",
+ // },
+ // data: [
+ // // {
+ // // name: "0",
+ // // yAxis: 0,
+ // // },
+ // // {
+ // // name: "$40W",
+ // // yAxis: 400000,
+ // // },
+ // {
+ // name: "$70W",
+ // yAxis: 700000,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+
+ // {
+ // name: "$10W",
+ // yAxis: 100000,
+ // },
+ // {
+ // name: "$100W",
+ // yAxis: 1000000,
+ // // position: ['100%', '50'],
+ // },
+ // {
+ // name: "$120W",
+ // yAxis: 1200000,
+ // },
+
+ // {
+ // name: "$140W",
+ // yAxis: 1400000,
+ // },
+ // ],
+ // },
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 3,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchlivelinessEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("livelinessEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("livelinessEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchlivelinessEth(params) {
+ this.livelinessEthLoading = true
+ const { data } = await getLivelinessEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.livelinessEthLoading = false
+ return
+ }
+ let livelinessEthData = data.data
+ this.start = livelinessEthData[0].date.split("T")[0]
+ this.end = livelinessEthData[livelinessEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ livelinessEthData.forEach(item => {
+
+
+ // item.value= item.value/100000000
+
+
+ ValueList.push(Number(item.value.toFixed(8)))
+
+ })
+ this.option.series[0].data = handelProfitrate(livelinessEthData, ValueList)
+
+ this.inCharts()
+
+ this.livelinessEthLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchlivelinessEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchlivelinessEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/livelinessEth/index.vue b/yq/src/views/livelinessEth/index.vue
new file mode 100644
index 0000000..90355c3
--- /dev/null
+++ b/yq/src/views/livelinessEth/index.vue
@@ -0,0 +1,187 @@
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/loanGdp/index.js b/yq/src/views/loanGdp/index.js
new file mode 100644
index 0000000..d1dea0a
--- /dev/null
+++ b/yq/src/views/loanGdp/index.js
@@ -0,0 +1,302 @@
+import * as echarts from "echarts";
+import { loanGdp } from "../../api/pages"
+import { chartsWidth, emptyData, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ loanGdpLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ var res = params[0].axisValueLabel;
+
+ for (let i = 0; i <= params.length - 1; i++) {
+
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value}% `
+
+
+ }
+
+ return res;
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Private debt as a percentage of GDP",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 1,
+ // data: [],
+
+
+ // },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchloanGdpIndicator(this.params)
+ //禁用时间框
+ // this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("loanGdpBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("loanGdpBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchloanGdpIndicator(params) {
+ this.loanGdpLoading = true
+ const { data } = await loanGdp(params)
+ let loanGdpEthData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.loanGdpLoading = false
+ return
+ }
+
+ //添加水印
+ this.option = handelWatermark(this.option)
+
+
+
+ let ValueList = []
+ let timeList = []
+ loanGdpEthData.forEach(item => {
+ ValueList.push(Number(item.value.toFixed(2)))
+ timeList.push(item.date)
+
+ })
+ this.option.series[0].data = ValueList
+ this.option.xAxis.data = timeList
+
+
+ this.inCharts()
+
+ this.loanGdpLoading = false
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchloanGdpIndicator(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[2], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchloanGdpIndicator(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/loanGdp/index.vue b/yq/src/views/loanGdp/index.vue
new file mode 100644
index 0000000..fae4468
--- /dev/null
+++ b/yq/src/views/loanGdp/index.vue
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+ Private debt as a percentage of GDP = {{ $t(`home.private`) }} /
+ {{ $t(`home.GDP`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/loanPsi/index.js b/yq/src/views/loanPsi/index.js
new file mode 100644
index 0000000..66a2f16
--- /dev/null
+++ b/yq/src/views/loanPsi/index.js
@@ -0,0 +1,290 @@
+import * as echarts from "echarts";
+import { loanPsi } from "../../api/pages"
+import { chartsWidth, emptyData, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ loanPsiLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "loans to private sector",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 1,
+ // data: [],
+
+
+ // },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchloanPsiIndicator(this.params)
+ //禁用时间框
+ // this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("loanPsiBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("loanPsiBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchloanPsiIndicator(params) {
+ this.loanPsiLoading = true
+ const { data } = await loanPsi(params)
+ console.log(data, 666129821545645);
+ let loanPsiEthData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.loanPsiLoading = false
+ return
+ }
+ //添加水印
+ this.option = handelWatermark(this.option)
+
+
+
+ let ValueList = []
+ let timeList = []
+ loanPsiEthData.forEach(item => {
+ ValueList.push(Number(item.value.toFixed(2)))
+ timeList.push(item.date)
+
+ })
+ this.option.series[0].data = ValueList
+ this.option.xAxis.data = timeList
+
+
+ this.inCharts()
+
+ this.loanPsiLoading = false
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchloanPsiIndicator(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[2], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchloanPsiIndicator(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/loanPsi/index.vue b/yq/src/views/loanPsi/index.vue
new file mode 100644
index 0000000..32082d6
--- /dev/null
+++ b/yq/src/views/loanPsi/index.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
{{ $t(`home.unit`) }}: billion
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/lossAddress/index.js b/yq/src/views/lossAddress/index.js
new file mode 100644
index 0000000..27508d1
--- /dev/null
+++ b/yq/src/views/lossAddress/index.js
@@ -0,0 +1,341 @@
+import * as echarts from "echarts";
+import { fetchLossAddress } from "../../api/apiPost"
+import { chartsWidth, emptyData,dataLength, handelProfitrate, handelZoom, handelLineType, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lossAddressLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Address in Loss",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+ lengthTimer:null
+
+ }
+ },
+ mounted() {
+ this.fetchLossAddress()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("lossAddressBox"));
+ chartsWidth("lossAddressBox", this);
+
+ }
+
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+
+
+
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchLossAddress(params) {
+ this.lossAddressLoading = true
+
+ const { data } = await fetchLossAddress(params)
+ // const { data } = await this.$API.getProfitAddress(req, radius)
+
+ let lossAddressData = data.data
+
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.lossAddressLoading = false
+ return
+ }
+ if (lossAddressData) {
+ this.start = lossAddressData[0].date.split("T")[0]
+ this.end = lossAddressData[lossAddressData.length - 1].date.split("T")[0]
+ }
+
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+
+
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ let profitValueList = []
+
+
+ lossAddressData.forEach(item => {
+
+ profitValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(lossAddressData, profitValueList)
+
+
+
+ this.inCharts()
+ this.lossAddressLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchLossAddress(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/lossAddress/index.vue b/yq/src/views/lossAddress/index.vue
new file mode 100644
index 0000000..de3de10
--- /dev/null
+++ b/yq/src/views/lossAddress/index.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+ Address in Loss = total address where Price < Price_ created
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/lossEth/index.js b/yq/src/views/lossEth/index.js
new file mode 100644
index 0000000..625ab2a
--- /dev/null
+++ b/yq/src/views/lossEth/index.js
@@ -0,0 +1,351 @@
+import * as echarts from "echarts";
+import { getLossEth, } from "../../api/pages"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ lossEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}M `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Number of Addresses in Loss",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchlossEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("lossEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("lossEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchlossEth(params) {
+ this.lossEthLoading = true
+ const { data } = await getLossEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.lossEthLoading = false
+ return
+ }
+
+
+ let lossEthData = data.data
+ this.start = lossEthData[0].date.split("T")[0]
+ this.end = lossEthData[lossEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ lossEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(lossEthData, ValueList)
+
+ this.inCharts()
+
+ this.lossEthLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchlossEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchlossEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/lossEth/index.vue b/yq/src/views/lossEth/index.vue
new file mode 100644
index 0000000..31ddc0b
--- /dev/null
+++ b/yq/src/views/lossEth/index.vue
@@ -0,0 +1,38 @@
+
+
+
+
+ Address in Loss = total address where Price < Price_ created
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/lthLossSupply/index.js b/yq/src/views/lthLossSupply/index.js
new file mode 100644
index 0000000..f1c6c6e
--- /dev/null
+++ b/yq/src/views/lthLossSupply/index.js
@@ -0,0 +1,327 @@
+import * as echarts from "echarts";
+import { fetchLthLossSupply } from "../../api/apiPost"
+import { chartsWidth,emptyData, dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ lthLossSupplyLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Long-Term Holder Supply in Loss",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ this.fetchLthLossSupply(this.params.req, this.params.radius)
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("lthLossSupplyBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("lthLossSupplyBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchLthLossSupply(params) {
+ this.lthLossSupplyLoading = true
+ const { data } = await fetchLthLossSupply(params)
+
+ let lthLossSupplyData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.lthLossSupplyLoading = false
+ return
+ }
+
+ this.start = lthLossSupplyData[0].date.split("T")[0]
+ this.end = lthLossSupplyData[lthLossSupplyData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ let profitValueList = []
+
+
+ lthLossSupplyData.forEach(item => {
+
+ profitValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(lthLossSupplyData, profitValueList)
+
+
+
+ this.inCharts()
+ this.lthLossSupplyLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchLthLossSupply(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/lthLossSupply/index.vue b/yq/src/views/lthLossSupply/index.vue
new file mode 100644
index 0000000..47fdea2
--- /dev/null
+++ b/yq/src/views/lthLossSupply/index.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
+ Loss for LTH = number of balance where Price <= Price_created and Holder Time >= 155days
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/lthNUPLEth/index.js b/yq/src/views/lthNUPLEth/index.js
new file mode 100644
index 0000000..5d6f8e4
--- /dev/null
+++ b/yq/src/views/lthNUPLEth/index.js
@@ -0,0 +1,351 @@
+import * as echarts from "echarts";
+import { getLthNUPLEth, } from "../../api/pages"
+import { chartsWidth, emptyData,handelProfitrate, dataLength,handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ lthNUPLEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}% `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Long Term Holder NUPL",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchlthNUPLEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("lthNUPLEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("lthNUPLEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchlthNUPLEth(params) {
+ this.lthNUPLEthLoading = true
+ const { data } = await getLthNUPLEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.lthNUPLEthLoading = false
+ return
+ }
+ let lthNUPLEthData = data.data
+ this.start = lthNUPLEthData[0].date.split("T")[0]
+ this.end = lthNUPLEthData[lthNUPLEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ lthNUPLEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(lthNUPLEthData, ValueList)
+
+ this.inCharts()
+
+ this.lthNUPLEthLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchlthNUPLEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchlthNUPLEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/lthNUPLEth/index.vue b/yq/src/views/lthNUPLEth/index.vue
new file mode 100644
index 0000000..f8b62f8
--- /dev/null
+++ b/yq/src/views/lthNUPLEth/index.vue
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/lthProfitRatio/index.js b/yq/src/views/lthProfitRatio/index.js
new file mode 100644
index 0000000..a0bb617
--- /dev/null
+++ b/yq/src/views/lthProfitRatio/index.js
@@ -0,0 +1,330 @@
+import * as echarts from "echarts";
+import { fetchLthProfitRatio } from "../../api/apiPost"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ lthProfitRatioLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Long-Term Holder (LTH) Profit/Loss Ratio",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ this.fetchLthProfitRatio(this.params.req, this.params.radius)
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("lthProfitRatioBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("lthProfitRatioBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchLthProfitRatio(params) {
+ this.lthProfitRatioLoading = true
+ const { data } = await fetchLthProfitRatio(params)
+
+ let lthProfitRatioData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.lthProfitRatioLoading = false
+ return
+ }
+
+ this.start = lthProfitRatioData[0].date.split("T")[0]
+ this.end = lthProfitRatioData[lthProfitRatioData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ let profitValueList = []
+
+
+ lthProfitRatioData.forEach(item => {
+
+ profitValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(lthProfitRatioData, profitValueList)
+
+
+
+ this.inCharts()
+ this.lthProfitRatioLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+
+ this.fetchLthProfitRatio(this.params)
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/lthProfitRatio/index.vue b/yq/src/views/lthProfitRatio/index.vue
new file mode 100644
index 0000000..d51901b
--- /dev/null
+++ b/yq/src/views/lthProfitRatio/index.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/lthProfitSupply/index.js b/yq/src/views/lthProfitSupply/index.js
new file mode 100644
index 0000000..bd7ac6c
--- /dev/null
+++ b/yq/src/views/lthProfitSupply/index.js
@@ -0,0 +1,331 @@
+import * as echarts from "echarts";
+import { fetchLthProfitSupply } from "../../api/apiPost"
+import { chartsWidth,dataLength, emptyData,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ lthProfitSupplyLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Long-Term Holder Supply in Profit",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchLthProfitSupply(this.params.req, this.params.radius)
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("lthProfitSupplyBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("lthProfitSupplyBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchLthProfitSupply(params) {
+ this.lthProfitSupplyLoading = true
+ const { data } = await fetchLthProfitSupply(params)
+
+ let lthProfitSupplyData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.lthProfitSupplyLoading = false
+ return
+ }
+
+ this.start = lthProfitSupplyData[0].date.split("T")[0]
+ this.end = lthProfitSupplyData[lthProfitSupplyData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ let profitValueList = []
+
+
+ lthProfitSupplyData.forEach(item => {
+
+ profitValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(lthProfitSupplyData, profitValueList)
+
+
+
+ this.inCharts()
+ this.lthProfitSupplyLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+
+ this.fetchLthProfitSupply(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+}
+}
\ No newline at end of file
diff --git a/yq/src/views/lthProfitSupply/index.vue b/yq/src/views/lthProfitSupply/index.vue
new file mode 100644
index 0000000..b88a4d5
--- /dev/null
+++ b/yq/src/views/lthProfitSupply/index.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
+ Profit for LTH = number of balance where Price > Price_created and Holder Time >= 155days
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/lthSupply/index.js b/yq/src/views/lthSupply/index.js
new file mode 100644
index 0000000..e810276
--- /dev/null
+++ b/yq/src/views/lthSupply/index.js
@@ -0,0 +1,332 @@
+import * as echarts from "echarts";
+import { fetchLthSupply } from "../../api/apiPost"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ lthSupplyLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Long-Term Holder Supply",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchLthSupply()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("lthSupplyBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("lthSupplyBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchLthSupply(params) {
+ this.lthSupplyLoading = true
+ const { data } = await fetchLthSupply(params)
+
+ let lthSupplyData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.lthSupplyLoading = false
+ return
+ }
+
+ this.start = lthSupplyData[0].date.split("T")[0]
+ this.end = lthSupplyData[lthSupplyData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ let profitValueList = []
+
+
+ lthSupplyData.forEach(item => {
+
+ profitValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(lthSupplyData, profitValueList)
+
+
+
+ this.inCharts()
+ this.lthSupplyLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchLthSupply(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+}
+}
\ No newline at end of file
diff --git a/yq/src/views/lthSupply/index.vue b/yq/src/views/lthSupply/index.vue
new file mode 100644
index 0000000..b8aa3d7
--- /dev/null
+++ b/yq/src/views/lthSupply/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/lthVolume/index.js b/yq/src/views/lthVolume/index.js
new file mode 100644
index 0000000..d221558
--- /dev/null
+++ b/yq/src/views/lthVolume/index.js
@@ -0,0 +1,328 @@
+import * as echarts from "echarts";
+import { fetchLthVolume } from "../../api/apiPost"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ lthVolumeLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Long-Term Holder Daily Volume",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ this.fetchLthVolume(this.params.req, this.params.radius)
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("lthVolumeBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("lthVolumeBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchLthVolume(params) {
+ this.lthVolumeLoading = true
+ const { data } = await fetchLthVolume(params)
+
+ let lthVolumeData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.lthVolumeLoading = false
+ return
+ }
+
+ this.start = lthVolumeData[0].date.split("T")[0]
+ this.end = lthVolumeData[lthVolumeData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ let profitValueList = []
+
+
+ lthVolumeData.forEach(item => {
+
+ profitValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(lthVolumeData, profitValueList)
+
+
+
+ this.inCharts()
+ this.lthVolumeLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+
+ this.fetchLthVolume(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/lthVolume/index.vue b/yq/src/views/lthVolume/index.vue
new file mode 100644
index 0000000..5c9ebdb
--- /dev/null
+++ b/yq/src/views/lthVolume/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/lthmvrv/index.js b/yq/src/views/lthmvrv/index.js
new file mode 100644
index 0000000..6ed53f4
--- /dev/null
+++ b/yq/src/views/lthmvrv/index.js
@@ -0,0 +1,523 @@
+import * as echarts from "echarts";
+import { chartsWidth, dataLength,emptyData,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ lthmvrvLoading: false,
+ params: {
+ req: "lthmvrv",
+ radius: "btc"
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ formatter: function (name) {
+
+ return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "log",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: " LTH-MVRV",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ // {
+ // name: "LTH_MV",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // showSymbol: false,
+ // symbolSize: 5,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#8e62b2",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // yAxisIndex: 3,
+ // lineStyle: {
+ // //线条样式
+ // color: "#8e62b2",
+ // width: "1",
+ // },
+ // data: [],
+ // },
+ // {
+ // name: "LTH_RV",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // showSymbol: false,
+ // symbolSize: 5,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#b73127",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // yAxisIndex: 2,
+ // lineStyle: {
+ // //线条样式
+ // color: "#b73127",
+ // width: "1",
+ // },
+ // data: [],
+ // },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ markLine: {
+ symbol: ["none", "none"], //去掉箭头
+ itemStyle: {
+ normal: {
+ lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ },
+ },
+ // lineStyle:{
+ // color:"red"
+ // },
+
+ label: {
+ formatter: "{b}",
+ fontSize: 10,
+ color: "rgba(0,0,0,0.8)",
+ align: "left",
+ },
+ data: [
+ {
+ name: "$0.02",
+ yAxis: 0.02,
+ },
+ {
+ name: "$0.06",
+ yAxis: 0.06,
+ },
+ {
+ name: "$0.1",
+ yAxis: 0.1,
+ },
+ {
+ name: "$0.4",
+ yAxis: 0.4,
+ },
+ {
+ name: "$0.8",
+ yAxis: 0.8,
+ },
+ {
+ name: "$2",
+ yAxis: 2,
+ },
+ {
+ name: "$6",
+ yAxis: 6,
+ },
+ {
+ name: "$10",
+ yAxis: 10,
+ },
+ {
+ name: "$40",
+ yAxis: 40,
+ },
+ {
+ name: "$80",
+ yAxis: 80,
+ },
+ // {
+ // name: "$120",
+ // yAxis: 120,
+ // },
+ {
+ name: "$160",
+ yAxis: 160,
+ },
+ // {
+ // name: "$200",
+ // yAxis: 200,
+ // },
+ {
+ name: "$240",
+ yAxis: 240,
+ },
+ {
+ name: "$300",
+ yAxis: 300,
+ },
+ {
+ name: "$500",
+ yAxis: 500,
+ },
+ {
+ name: "$700",
+ yAxis: 700,
+ },
+ {
+ name: "$900",
+ yAxis: 900,
+ },
+ {
+ name: "$1100",
+ yAxis: 1100,
+ },
+ // {
+ // name: "$1200",
+ // yAxis: 1200,
+ // },
+ {
+ name: "$1800",
+ yAxis: 1800,
+ },
+ {
+ name: "$3000",
+ yAxis: 3000,
+ },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+ {
+ name: "$70W",
+ yAxis: 700000,
+ },
+ {
+ name: "$40W",
+ yAxis: 400000,
+ },
+
+ {
+ name: "$10W",
+ yAxis: 100000,
+ },
+ {
+ name: "$100W",
+ yAxis: 1000000,
+ // position: ['100%', '50'],
+ },
+ {
+ name: "$120W",
+ yAxis: 1200000,
+ },
+
+ {
+ name: "$140W",
+ yAxis: 1400000,
+ },
+ ],
+ },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+ this.fetchLthmvrv(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("lthmvrvBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("lthmvrvBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchLthmvrv(req, radius, start, end, sma) {
+ this.lthmvrvLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+ let lthmvrvData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.lthmvrvLoading = false
+ return
+ }
+ this.start = lthmvrvData[0].date.split("T")[0]
+ this.end = lthmvrvData[lthmvrvData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ //渲染ETH
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+ let lthmvrvValueList = []
+ let marketcapValueList = []
+ let rcapValueList = []
+
+ lthmvrvData.forEach(item => {
+
+ lthmvrvValueList.push(Number(item.mvrv.toFixed(2)))
+ marketcapValueList.push(Number(item.marketcap.toFixed(2)))
+ rcapValueList.push(Number(item.rcap.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(lthmvrvData, lthmvrvValueList)
+ // this.option.series[1].data = handelProfitrate(lthmvrvData, marketcapValueList)
+ // this.option.series[2].data = handelProfitrate(lthmvrvData, rcapValueList)
+
+
+ this.inCharts()
+ this.lthmvrvLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchLthmvrv(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.sma = smaDataList
+ this.fetchLthmvrv(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[3], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/yq/src/views/lthmvrv/index.vue b/yq/src/views/lthmvrv/index.vue
new file mode 100644
index 0000000..207211b
--- /dev/null
+++ b/yq/src/views/lthmvrv/index.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/lthnupl/index.js b/yq/src/views/lthnupl/index.js
new file mode 100644
index 0000000..c2a87a2
--- /dev/null
+++ b/yq/src/views/lthnupl/index.js
@@ -0,0 +1,470 @@
+import * as echarts from "echarts";
+import { chartsWidth,emptyData,dataLength, handelLineType,handelSwitchs,handelProfitrate, handelZoom, fetchBtcPrice, handelWatermark, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ lthnuplLoading: false,
+ params: {
+ req: "lthnupl",
+ radius: "btc"
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true,
+
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ // min: "dataMin",
+ // max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "LTH-NUPL",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ // markLine: {
+ // symbol: ["none", "none"], //去掉箭头
+ // itemStyle: {
+ // normal: {
+ // lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ // },
+ // },
+ // // lineStyle:{
+ // // color:"red"
+ // // },
+
+ // label: {
+ // formatter: "{b}",
+ // fontSize: 10,
+ // color: "rgba(0,0,0,0.8)",
+ // align: "left",
+ // },
+ // data: [
+ // {
+ // name: "$0.02",
+ // yAxis: 0.02,
+ // },
+ // {
+ // name: "$0.06",
+ // yAxis: 0.06,
+ // },
+ // {
+ // name: "$0.1",
+ // yAxis: 0.1,
+ // },
+ // {
+ // name: "$0.4",
+ // yAxis: 0.4,
+ // },
+ // {
+ // name: "$0.8",
+ // yAxis: 0.8,
+ // },
+ // {
+ // name: "$2",
+ // yAxis: 2,
+ // },
+ // {
+ // name: "$6",
+ // yAxis: 6,
+ // },
+ // {
+ // name: "$10",
+ // yAxis: 10,
+ // },
+ // {
+ // name: "$40",
+ // yAxis: 40,
+ // },
+ // {
+ // name: "$80",
+ // yAxis: 80,
+ // },
+ // // {
+ // // name: "$120",
+ // // yAxis: 120,
+ // // },
+ // {
+ // name: "$160",
+ // yAxis: 160,
+ // },
+ // // {
+ // // name: "$200",
+ // // yAxis: 200,
+ // // },
+ // {
+ // name: "$240",
+ // yAxis: 240,
+ // },
+ // {
+ // name: "$300",
+ // yAxis: 300,
+ // },
+ // {
+ // name: "$500",
+ // yAxis: 500,
+ // },
+ // {
+ // name: "$700",
+ // yAxis: 700,
+ // },
+ // {
+ // name: "$900",
+ // yAxis: 900,
+ // },
+ // {
+ // name: "$1100",
+ // yAxis: 1100,
+ // },
+ // // {
+ // // name: "$1200",
+ // // yAxis: 1200,
+ // // },
+ // {
+ // name: "$1800",
+ // yAxis: 1800,
+ // },
+ // {
+ // name: "$3000",
+ // yAxis: 3000,
+ // },
+ // // {
+ // // name: "$40W",
+ // // yAxis: 400000,
+ // // },
+ // {
+ // name: "$70W",
+ // yAxis: 700000,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+
+ // {
+ // name: "$10W",
+ // yAxis: 100000,
+ // },
+ // {
+ // name: "$100W",
+ // yAxis: 1000000,
+ // // position: ['100%', '50'],
+ // },
+ // {
+ // name: "$120W",
+ // yAxis: 1200000,
+ // },
+
+ // {
+ // name: "$140W",
+ // yAxis: 1400000,
+ // },
+ // ],
+ // },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 2,
+ // data: [],
+ // },
+
+ ],
+ },
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ switch3: "",
+ oldY: null,
+
+ }
+ },
+ mounted() {
+
+ this.fetchLthnupl(this.params.req, this.params.radius)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("lthnuplBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("lthnuplBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchLthnupl(req, radius, start, end, sma) {
+ this.lthnuplLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+ let lthnuplData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.lthnuplLoading = false
+ return
+ }
+ this.start = lthnuplData[0].date.split("T")[0]
+ this.end = lthnuplData[lthnuplData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ //渲染ETH
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ let lthnuplValueList = []
+
+ lthnuplData.forEach(item => {
+
+ lthnuplValueList.push(Number(item.value.toFixed(2)))
+
+
+ })
+ this.option.series[0].data = handelProfitrate(lthnuplData, lthnuplValueList)
+
+
+
+ this.inCharts()
+ this.lthnuplLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchLthnupl(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.sma = smaDataList
+ this.fetchLthnupl(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+ console.log(this.option,6565);
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/lthnupl/index.vue b/yq/src/views/lthnupl/index.vue
new file mode 100644
index 0000000..cd9bcc2
--- /dev/null
+++ b/yq/src/views/lthnupl/index.vue
@@ -0,0 +1,166 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/ma730/index.js b/yq/src/views/ma730/index.js
new file mode 100644
index 0000000..d51c0b7
--- /dev/null
+++ b/yq/src/views/ma730/index.js
@@ -0,0 +1,750 @@
+import * as echarts from "echarts";
+import { handelLineType, dataLength, handelSwitchs, emptyData,chartsWidth, fetchBtcPrice, handelZoom, fetchEthPrice, handelWatermark, handelProfitrate, handelSmaData, getDateArray } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ maLoading: false,
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ },
+ yAxis: [
+ {
+ // name:this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${value / 10000} W`
+ }
+ }
+ },
+ {
+ position: "right",
+ // type: "log",
+ splitNumber: "5",
+ show: true,
+ },
+ {
+ position: "right",
+ // type: "log",
+ splitNumber: "5",
+ show: false,
+ },
+ {
+ position: "right",
+ // type: "log",
+ splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "200-days MA Multiplier",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "1-Year MA Multiplier",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#aa069f",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#aa069f",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "2-Year MA Multiplier",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#ab334f",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#ab334f",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "2-Year MA Multiplier X 5",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#1a7f54",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#1a7f54",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+
+ ],
+ },
+ dayoption: {
+ legend: {
+ right: 140,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i <= params.length - 1; i++) {
+ // res += `${params[i].marker} ${params[i].value[1]} ${params[i].seriesName}`;
+ // }
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ axisLabel: {
+ formatter: function (value) {
+ let hours = value.split(" ")[1].split(":")[0];
+ let min = value.split(" ")[1].split(":")[1];
+ return `${hours}:${min}`;
+ },
+ },
+ },
+ yAxis: [
+ {
+ // name:this.$t(`home.figure2`),
+ position: "left",
+ type: "value",
+ min: `dataMin`,
+ max: `dataMax`,
+ axisLabel: {
+ formatter: function (value) {
+
+ let data = (value / 1000).toFixed(4)
+ return `${data} K`
+ }
+ }
+ },
+ {
+ position: "right",
+ type: "value",
+ min: `dataMin`,
+ // max: `dataMax`,
+ show: true,
+ },
+ {
+ position: "left",
+ type: "value",
+ min: `dataMin`,
+ max: `dataMax`,
+ // splitNumber: "5",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ min: `dataMin`,
+ max: `dataMax`,
+ // splitNumber: "5",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ min: `dataMin`,
+ max: `dataMax`,
+ // splitNumber: "5",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "200-days MA Multiplier",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "1-Year MA Multiplier",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#aa069f",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#aa069f",
+ width: "1",
+ },
+ data: [],
+ yAxisIndex: 0,
+ },
+ {
+ name: "2-Year MA Multiplier",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#ab334f",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#ab334f",
+ width: "1",
+ },
+ data: [],
+ yAxisIndex: 0,
+ },
+ {
+ name: "2-Year MA Multiplier X 5",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#1a7f54",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#1a7f54",
+ width: "1",
+ },
+ data: [],
+ yAxisIndex: 0,
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+
+ ],
+ },
+ maData: [],
+ maDayData: [],
+ timeParams: {
+ req: "ma730",
+ start: "",
+ end: ""
+ },
+ dayParams: {
+ req: "ma730day",
+ start: "",
+ end: ""
+ },
+ timer: null,
+ radius: "btc",
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ watch: {
+ radius(val) {
+
+ this.fetchMaData(this.timeParams.req, this.radius)
+ this.fetchMaDayData(this.dayParams.req, this.radius)
+
+ }
+
+ },
+ mounted() {
+ if (this.timer) {
+ clearInterval(this.timer)
+ }
+ this.radius = localStorage.getItem("radius");
+ //监听localstorage变化
+ window.addEventListener("setItem", () => {
+ this.radius = localStorage.getItem("radius");
+ });
+ //清除定时器
+ if (this.timer) {
+ clearInterval(this.timer)
+ }
+ //5分钟请求一次
+ this.timer = setInterval(() => {
+ this.fetchMaData(this.timeParams.req, this.radius)
+ this.fetchMaDayData(this.dayParams.req, this.radius)
+ }, 300000)
+
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+
+
+ },
+ methods: {
+ inChart() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("maBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("maBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ dayinChart() {
+ if (this.myChartday == null) {
+ this.myChartday = echarts.init(document.getElementById("maDayBox"));
+ }
+ this.dayoption = handelZoom(this.myChartday, this.dayoption, this, this.zoomStart, this.zoomEnd)
+
+ this.myChartday.setOption(this.dayoption);
+ chartsWidth("maDayBox", this);
+ window.addEventListener("resize", () => {
+ this.myChartday.resize();
+ });
+ },
+ //请求渲染数据
+ async fetchMaData(req, radius, start, end, sma) {
+ this.maLoading = true
+ const { data } = await this.$API.getMa370(req, radius, start, end, sma)
+ this.maData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChart, this)
+ if (noData) {
+ this.maLoading = false
+ return
+ }
+ this.start = this.maData[0].date.split("T")[0]
+ this.end = this.maData[this.maData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // //移动平均线没值 才渲染正常价格数据
+ // // if (this.start && !this.fatherSmaData[0]) {
+ // // if (radius == "BTC") {
+ // // this.btcFlag = true
+ // // this.handelSonBtcPrice("BTC", true);
+ // // this.$addStorageEvent(1, "btcFlag", JSON.stringify(true));
+ // // } else if (radius == "ETH") {
+ // // this.ethFlag = true
+ // // this.handelSonEthPrice("ETH", true);
+ // // this.$addStorageEvent(1, "ethFlag", JSON.stringify(true));
+ // // }
+ // // }
+ // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // if (this.fatherSmaData[0] && this.start) {
+ // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ // }
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH",this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+ // })
+
+ //不同币种显示不同价格曲线
+ if (radius == "BTC") {
+ this.option.series = this.option.series.filter(item => item.name !== "Price [ETH]")
+ // this.handelSonBtcPrice("BTC", true)
+ } else if (radius == "ETH") {
+ this.option.series = this.option.series.filter(item => item.name !== "Price[BTC]")
+ // this.handelSonEthPrice("ETH", true)
+ }
+
+
+ let ma200ValueList = []
+ let ma365ValueList = []
+ let ma730ValueList = []
+ let ma730x5ValueList = []
+ let priceList = []
+ this.maData.forEach(item => {
+ ma200ValueList.push(Number(item.ma200.toFixed(2)))
+ ma365ValueList.push(Number(item.ma365.toFixed(2)))
+ ma730ValueList.push(Number(item.ma730.toFixed(2)))
+ ma730x5ValueList.push(Number(item.ma730x5.toFixed(2)))
+ priceList.push(Number(item.price.toFixed(2)))
+ })
+
+ this.option.series[0].data = handelProfitrate(this.maData, ma200ValueList)
+ this.option.series[1].data = handelProfitrate(this.maData, ma365ValueList)
+ this.option.series[2].data = handelProfitrate(this.maData, ma730ValueList)
+ this.option.series[3].data = handelProfitrate(this.maData, ma730x5ValueList)
+ this.option.series[4].data = handelProfitrate(this.maData, priceList)
+ this.inChart()
+ this.maLoading = false
+
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 20000)
+ },
+ //请求渲染day数据
+ async fetchMaDayData(req, radius, start, end) {
+
+ const { data } = await this.$API.getMa370(req, radius, start, end)
+ this.maDayData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.dayoption.series, this.dayinChart, this)
+ if (noData) {
+ this.maLoading = false
+ return
+ }
+ this.dayoption.xAxis.data.length = 0
+ this.dayoption.series[0].data.length = 0
+ this.dayoption.series[1].data.length = 0
+ this.dayoption.series[2].data.length = 0
+ this.dayoption.series[3].data.length = 0
+ this.dayoption.series[4].data.length = 0
+
+ //添加水印
+ this.dayoption = handelWatermark(this.dayoption)
+ this.maDayData.forEach(item => {
+ let year = item.date.split("T")[0]
+ let hour = item.date.split("T")[1].split(".")[0]
+ let time = `${year} ${hour}`
+ this.dayoption.xAxis.data.push(time)
+ this.dayoption.series[0].data.push([time, Number(item.ma200.toFixed(2))])
+ this.dayoption.series[1].data.push([time, Number(item.ma365.toFixed(2))])
+ this.dayoption.series[2].data.push([time, Number(item.ma730.toFixed(2))])
+ this.dayoption.series[3].data.push([time, Number(item.ma730x5.toFixed(2))])
+ this.dayoption.series[4].data.push([time, Number(item.price.toFixed(2))])
+
+ })
+ this.dayinChart()
+
+
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.timeParams.start = start;
+ this.timeParams.end = end;
+ this.fetchMaData(this.timeParams.req, this.radius, this.timeParams.start, this.timeParams.end, this.sma)
+ // if (this.radius =="BTC") {
+ // // this.handelSonEthPrice()
+ // }else{
+ // this.handelSonBtcPrice("BTC",true)
+ // }
+ },
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.dayoption = handelLineType(this.dayoption)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+ this.myChartday.setOption(this.dayoption);
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ //父级BTC默认是true 在ETH页面btcFlag 取反才能正常点击父级就渲染
+ // if (this.radius == "ETH") {
+ // this.btcFlag = !flag
+ // }else{
+ // this.btcFlag = flag
+ // }
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[2], this.start, this.end, this.inChart, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ //父级BTC默认是true 在ETH页面btcFlag 取反才能正常点击父级就渲染
+ // if (this.radius== "ETH") {
+ // this.ethFlag = !flag;
+ // } else {
+ // this.ethFlag = flag;
+ // }
+ this.ethFlag = flag;
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inChart, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.sma = smaDataList
+ this.fetchMaData(this.timeParams.req, this.radius, this.timeParams.start, this.timeParams.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inChart,this.start, this.end,)
+
+ },
+
+
+
+ },
+
+
+ beforeDestroy() {
+ clearInterval(this.timer);
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/yq/src/views/ma730/index.vue b/yq/src/views/ma730/index.vue
new file mode 100644
index 0000000..f991597
--- /dev/null
+++ b/yq/src/views/ma730/index.vue
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+ {{$t(`arh.ma370`)}}
+ {{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+ {{$t(`arh.dayGraph`)}}
+ {{ $t(`home.figure2`) }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/ma730ETH/index.js b/yq/src/views/ma730ETH/index.js
new file mode 100644
index 0000000..de6755a
--- /dev/null
+++ b/yq/src/views/ma730ETH/index.js
@@ -0,0 +1,722 @@
+import * as echarts from "echarts";
+import { handelLineType,dataLength, emptyData,chartsWidth, handelSwitchs, fetchBtcPrice, handelZoom, fetchEthPrice, handelWatermark, handelProfitrate, handelSmaData, getDateArray } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ maLoading: false,
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i <= params.length - 1; i++) {
+ // res += `${params[i].marker} ${params[i].value[1]} ${params[i].seriesName}`;
+ // }
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ },
+ yAxis: [
+ {
+ // name:this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${value / 10000} W`
+ }
+ }
+ },
+ {
+ position: "right",
+ // type: "log",
+ splitNumber: "5",
+ show: false,
+ },
+ {
+ position: "right",
+ // type: "log",
+ splitNumber: "5",
+ show: false,
+ },
+ {
+ position: "right",
+ // type: "log",
+ splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "200-days MA Multiplier",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "1-Year MA Multiplier",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#aa069f",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#aa069f",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "2-Year MA Multiplier",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#ab334f",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#ab334f",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "2-Year MA Multiplier X 5",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#1a7f54",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#1a7f54",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+
+
+ ],
+ },
+ dayoption: {
+ legend: {
+ right: 140,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i <= params.length - 1; i++) {
+ // res += `${params[i].marker} ${params[i].value[1]} ${params[i].seriesName}`;
+ // }
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ axisLabel: {
+ formatter: function (value) {
+ let hours = value.split(" ")[1].split(":")[0];
+ let min = value.split(" ")[1].split(":")[1];
+ return `${hours}:${min}`;
+ },
+ },
+ },
+ yAxis: [
+ {
+ // name:this.$t(`home.figure2`),
+ position: "left",
+ type: "value",
+ min: `dataMin`,
+ max: `dataMax`,
+ axisLabel: {
+ formatter: function (value) {
+
+ let data = (value / 1000).toFixed(4)
+ return `${data} K`
+ }
+ }
+ },
+ {
+ position: "right",
+ type: "value",
+ min: `dataMin`,
+ max: `dataMax`,
+ show: true,
+ },
+ {
+ position: "right",
+ type: "log",
+ min: `dataMin`,
+ max: `dataMax`,
+ // splitNumber: "5",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ min: `dataMin`,
+ max: `dataMax`,
+ // splitNumber: "5",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ min: `dataMin`,
+ max: `dataMax`,
+ // splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "200-days MA Multiplier",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "1-Year MA Multiplier",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#aa069f",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#aa069f",
+ width: "1",
+ },
+ data: [],
+ // yAxisIndex: 2,
+ },
+ {
+ name: "2-Year MA Multiplier",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#ab334f",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#ab334f",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "2-Year MA Multiplier X 5",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#1a7f54",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#1a7f54",
+ width: "1",
+ },
+ data: [],
+ // yAxisIndex: 0,
+ },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ maData: [],
+ maDayData: [],
+ timeParams: {
+ req: "ma730",
+ start: "",
+ end: ""
+ },
+ dayParams: {
+ req: "ma730day",
+ start: "",
+ end: ""
+ },
+ timer: null,
+ radius: "btc",
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ watch: {
+ radius(val) {
+
+ this.fetchMaData(this.timeParams.req, this.radius)
+ this.fetchMaDayData(this.dayParams.req, this.radius)
+
+ }
+
+ },
+ mounted() {
+ if (this.timer) {
+ clearInterval(this.timer)
+ }
+ this.radius = localStorage.getItem("radius");
+ //监听localstorage变化
+ window.addEventListener("setItem", () => {
+ this.radius = localStorage.getItem("radius");
+ });
+ //清除定时器
+ if (this.timer) {
+ clearInterval(this.timer)
+ }
+ //5分钟请求一次
+ this.timer = setInterval(() => {
+ this.fetchMaData(this.timeParams.req, this.radius)
+ this.fetchMaDayData(this.dayParams.req, this.radius)
+ }, 300000)
+
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+
+
+ },
+ methods: {
+ inChart() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("maBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("maBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ dayinChart() {
+ if (this.myChartday == null) {
+ this.myChartday = echarts.init(document.getElementById("maDayBox"));
+ }
+ this.dayoption = handelZoom(this.myChartday, this.dayoption, this, this.zoomStart, this.zoomEnd)
+
+ this.myChartday.setOption(this.dayoption);
+ chartsWidth("maDayBox", this);
+ window.addEventListener("resize", () => {
+ this.myChartday.resize();
+ });
+ },
+ //请求渲染数据
+ async fetchMaData(req, radius, start, end, sma) {
+ this.maLoading = true
+ const { data } = await this.$API.getMa370(req, radius, start, end, sma)
+ this.maData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChart, this)
+ if (noData) {
+ this.maLoading = false
+ return
+ }
+
+
+ this.start = this.maData[0].date.split("T")[0]
+ this.end = this.maData[this.maData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // if (this.fatherSmaData[0] && this.start) {
+ // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ // }
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH",this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+ // })
+
+ //不同币种显示不同价格曲线
+ // if (radius == "BTC") {
+ // this.option.series = this.option.series.filter(item => item.name !== "Price [ETH]")
+ // this.handelSonBtcPrice("BTC", true)
+ // } else if (radius == "ETH") {
+ // this.option.series = this.option.series.filter(item => item.name !== "Price[BTC]")
+ // this.handelSonEthPrice("ETH", true)
+ // }
+
+
+ let ma200ValueList = []
+ let ma365ValueList = []
+ let ma730ValueList = []
+ let ma730x5ValueList = []
+ let priceList = []
+ this.maData.forEach(item => {
+ ma200ValueList.push(Number(item.ma200.toFixed(2)))
+ ma365ValueList.push(Number(item.ma365.toFixed(2)))
+ ma730ValueList.push(Number(item.ma730.toFixed(2)))
+ ma730x5ValueList.push(Number(item.ma730x5.toFixed(2)))
+ priceList.push(Number(item.price.toFixed(2)))
+ })
+
+ this.option.series[0].data = handelProfitrate(this.maData, ma200ValueList)
+ this.option.series[1].data = handelProfitrate(this.maData, ma365ValueList)
+ this.option.series[2].data = handelProfitrate(this.maData, ma730ValueList)
+ this.option.series[3].data = handelProfitrate(this.maData, ma730x5ValueList)
+ this.option.series[4].data = handelProfitrate(this.maData, priceList)
+ this.inChart()
+ this.maLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.dayoption, this.dayoption.series[0].data.length), );
+
+ }, 15000)
+ },
+ //请求渲染day数据
+ async fetchMaDayData(req, radius, start, end) {
+
+ const { data } = await this.$API.getMa370(req, radius, start, end)
+ this.maDayData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.dayoption.series, this.dayinChart, this)
+ if (noData) {
+
+ return
+ }
+ this.dayoption.xAxis.data.length = 0
+ this.dayoption.series[0].data.length = 0
+ this.dayoption.series[1].data.length = 0
+ this.dayoption.series[2].data.length = 0
+ this.dayoption.series[3].data.length = 0
+ this.dayoption.series[4].data.length = 0
+ //添加水印
+ this.dayoption = handelWatermark(this.dayoption)
+ this.maDayData.forEach(item => {
+ let year = item.date.split("T")[0]
+ let hour = item.date.split("T")[1].split(".")[0]
+ let time = `${year} ${hour}`
+ this.dayoption.xAxis.data.push(time)
+ this.dayoption.series[0].data.push([time, Number(item.ma200.toFixed(2))])
+ this.dayoption.series[1].data.push([time, Number(item.ma365.toFixed(2))])
+ this.dayoption.series[2].data.push([time, Number(item.ma730.toFixed(2))])
+ this.dayoption.series[3].data.push([time, Number(item.ma730x5.toFixed(2))])
+ this.dayoption.series[4].data.push([time, Number(item.price.toFixed(2))])
+
+ })
+ this.dayinChart()
+
+
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.timeParams.start = start;
+ this.timeParams.end = end;
+ this.fetchMaData(this.timeParams.req, this.radius, this.timeParams.start, this.timeParams.end, this.sma)
+ // if (this.radius =="BTC") {
+ // // this.handelSonEthPrice()
+ // }else{
+ // this.handelSonBtcPrice("BTC",true)
+ // }
+ },
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.dayoption = handelLineType(this.dayoption)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+ this.myChartday.setOption(this.dayoption);
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ //父级BTC默认是true 在ETH页面btcFlag 取反才能正常点击父级就渲染
+ // if (this.radius == "ETH") {
+ // this.btcFlag = !flag
+ // }else{
+ // this.btcFlag = flag
+ // }
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[2], this.start, this.end, this.inChart, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ //父级BTC默认是true 在ETH页面btcFlag 取反才能正常点击父级就渲染
+ // if (this.radius== "ETH") {
+ // this.ethFlag = !flag;
+ // } else {
+ // this.ethFlag = flag;
+ // }
+ this.ethFlag = flag;
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inChart, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.sma = smaDataList
+ this.fetchMaData(this.timeParams.req, this.radius, this.timeParams.start, this.timeParams.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inChart,this.start, this.end,)
+
+ },
+
+
+
+ },
+ //进入组件激活
+ activated() {
+ console.log("激活");
+ // this.timer = setInterval(() => {
+ // this.fetchMaData(this.timeParams.req)
+ // this.fetchMaDayData(this.dayParams.req)
+ // }, 60000)
+ },
+ //组件退出时触发
+ deactivated() {
+ console.log("离开");
+ //离开页面清除定时器
+ clearInterval(this.timer);
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/yq/src/views/ma730ETH/index.vue b/yq/src/views/ma730ETH/index.vue
new file mode 100644
index 0000000..29399ad
--- /dev/null
+++ b/yq/src/views/ma730ETH/index.vue
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+ {{$t(`arh.ma370`)}}
+ {{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+ {{$t(`arh.dayGraph`)}}
+ {{ $t(`home.figure2`) }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/marketcap/index.js b/yq/src/views/marketcap/index.js
new file mode 100644
index 0000000..a27be4b
--- /dev/null
+++ b/yq/src/views/marketcap/index.js
@@ -0,0 +1,440 @@
+import * as echarts from "echarts";
+import { chartsWidth,emptyData, dataLength, handelProfitrate, handelZoom, handelLineType, handelSwitchs, fetchBtcPrice, handelWatermark, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+export default {
+ data() {
+ return {//流通市值 和已实现流通市值
+ lengthTimer:null,
+ marketcapLoading: false,
+ params: {
+ req: "marketcap",
+ radius: "btc"
+ },
+ //已实现流通市值
+ rcapParams: {
+ req: "rcap",
+ radius: "btc"
+ },
+ minData: 0,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//百万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "log",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ // min: "dataMin",
+ // max: "dataMax",
+ position: "right",
+ // min: extent => extent.min < this.goal ? extent.min : this.goal
+
+ min: extent => {
+
+ const min = extent.min < this.goal ? extent.min : this.goal
+ this.minData = min
+ return min
+ }
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ // min: "dataMin",
+ // max: "dataMax",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//百万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ show: true,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: true,
+ },
+
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "market capitalization",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ // {
+ // name: "Realized capitalization",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // showSymbol: false,
+ // symbolSize: 5,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#a32140",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // yAxisIndex: 1,
+ // lineStyle: {
+ // //线条样式
+ // color: "#a32140",
+ // width: "1",
+ // },
+ // data: [],
+ // },
+ // {
+ // name: "ea Realized Capitalization",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // showSymbol: false,
+ // symbolSize: 5,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#7a5edf",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // yAxisIndex: 2,
+ // lineStyle: {
+ // //线条样式
+ // color: "#7a5edf",
+ // width: "1",
+ // },
+ // data: [],
+ // },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 3,
+ data: [],
+
+
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ marketcapData: [],
+ switch3: "",
+ goal: 0,
+ oldYAxis: null,
+ btcFlag: true,
+ ethFlag: false,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+ this.goal = 1000
+ this.fetchMarketcap(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ this.oldYAxis = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+ },
+
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("marketcapBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("marketcapBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchMarketcap(req, radius, start, end, sma) {
+ this.marketcapLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+ this.marketcapData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.marketcapLoading = false
+ return
+ }
+ this.start = this.marketcapData[0].date.split("T")[0]
+ this.end = this.marketcapData[this.marketcapData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ //渲染ETH
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+ let marketcapValueList = []
+ this.marketcapData.forEach(item => {
+ marketcapValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(this.marketcapData, marketcapValueList)
+
+ //已实现流通市值 rcapParams
+ // const rcap = await this.$API.getCsupply(this.rcapParams.req, this.rcapParams.radius, start, end,sma)
+ // let rcapData= rcap.data.data
+ // let rcapValueList = []
+ // let earcapValueList = []
+ // rcapData.forEach(item => {
+ // rcapValueList.push(Number(item.rcap.toFixed(2)))
+ // earcapValueList.push(Number(item.earcap.toFixed(2)))
+
+ // })
+ // this.option.series[1].data = handelProfitrate(rcapData, rcapValueList)
+ // this.option.series[2].data = handelProfitrate(rcapData, earcapValueList)
+
+
+ this.inCharts()
+ this.marketcapLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+
+ this.fetchMarketcap(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldYAxis)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+
+ this.myChart.setOption(this.option);
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+
+ this.sma = smaDataList
+ this.fetchMarketcap(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[3], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/marketcap/index.vue b/yq/src/views/marketcap/index.vue
new file mode 100644
index 0000000..54f53ae
--- /dev/null
+++ b/yq/src/views/marketcap/index.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+ Market Cap = price [USD] · Total Supply
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/marketcapEth/index.js b/yq/src/views/marketcapEth/index.js
new file mode 100644
index 0000000..e1b09db
--- /dev/null
+++ b/yq/src/views/marketcapEth/index.js
@@ -0,0 +1,349 @@
+import * as echarts from "echarts";
+import { getMarketcapEth, } from "../../api/pages"
+import { chartsWidth, emptyData,handelProfitrate,dataLength, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ marketcapEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}% `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Market Cap",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchmarketcapEth()
+ //禁用时间框
+ // this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("marketcapEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("marketcapEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchmarketcapEth(params) {
+ this.marketcapEthLoading = true
+ const { data } = await getMarketcapEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.marketcapEthLoading = false
+ return
+ }
+ let marketcapEthData = data.data
+ this.start = marketcapEthData[0].date.split("T")[0]
+ this.end = marketcapEthData[marketcapEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ marketcapEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(marketcapEthData, ValueList)
+
+ this.inCharts()
+
+ this.marketcapEthLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchmarketcapEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchmarketcapEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/marketcapEth/index.vue b/yq/src/views/marketcapEth/index.vue
new file mode 100644
index 0000000..71c6642
--- /dev/null
+++ b/yq/src/views/marketcapEth/index.vue
@@ -0,0 +1,38 @@
+
+
+
+
+ Market Cap = price [USD] · Total Supply
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/memoryPoolFees/index.js b/yq/src/views/memoryPoolFees/index.js
new file mode 100644
index 0000000..dbe7748
--- /dev/null
+++ b/yq/src/views/memoryPoolFees/index.js
@@ -0,0 +1,354 @@
+
+import * as echarts from "echarts";
+import { $addStorageEvent } from '../../util/processingData'
+import { getMempool } from "../../api/apiPost"
+import {handelZoom, chartsWidth,emptyData,handelWatermark,handelLineType,handelSwitchs} from "../../util/processingData"
+
+export default {
+ data(){
+ return{
+ myChart:"",
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ },
+ yAxis: [
+ {
+ position: "left",
+ type: "value",
+ axisLabel: {
+ formatter: (value) => {
+ let data
+ if (value >= 1000000000) {
+ data = `${value / 1000000000}B`
+ } else if (value >= 1000000) {
+ data = `${value / 1000000}M`
+ } else {
+ data = `${value / 1000}K`
+ }
+ return data
+ }
+ }
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: true,
+ // min:`dataMin`,
+ // max:`dataMax`,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Mempool Transaction Fees",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series',
+
+
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#000",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#000",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+
+
+
+ ],
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ memoryPoolFeesLoading:false,
+ params: {
+ sma: "",
+ start:"",
+ end:"",
+
+ },
+ dataSelection: [
+ {
+ value: "1d",
+ label: "home.day1",
+ disabled:false,
+ authority:"guest",
+ grade:1,
+ },
+ {
+ value: "realTime",
+ label: "home.realTimeData",
+ disabled:false,
+ authority:"vip",
+ grade:4,
+ },
+ ],
+ realTimeData:"",
+ switch3: "",
+ start:"",
+ end:"",
+
+
+
+ }
+ },
+ mounted(){
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.fetchmemoryPoolFees(this.params)
+ },
+ methods:{
+ // handleSelect(activeValue){
+ // if (activeValue == `1d`) {
+ // this.realTimeData =false
+ // this.fetchmemoryPoolFees(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ // }else{
+ // this.fetchBTCVolume()
+ // this.realTimeData =true
+ // }
+ // },
+ inCharts(){
+ if (!this.myChart) {
+ this.myChart = echarts.init(document.getElementById("memoryPoolFeesBox"));
+
+ }
+
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+ this.myChart.setOption(this.option);
+ chartsWidth("memoryPoolFeesBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+
+ //请求交易量数据渲染
+ async fetchmemoryPoolFees(params) {
+ this.memoryPoolFeesLoading = true
+ const { data } = await getMempool(params)
+ let chartData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.memoryPoolFeesLoading = false
+ return
+ }
+ //添加水印
+ handelWatermark(this.option, 750, 300)
+ this.start =chartData[0].date.split("T")[0]
+ this.end = chartData[chartData.length - 1].date.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ let volumeValueList = []
+ let xAxisData = []
+ chartData.forEach(item => {
+
+ volumeValueList.push(Number(item.mempoolFees.toFixed(2)))
+ xAxisData.push(item.date.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = volumeValueList
+ this.option.series[1].data = priceData
+ if (this.zoomStart) {
+ this.option.dataZoom[0].start = this.zoomStart
+ this.option.dataZoom[0].end = this.zoomEnd
+ } else {
+ this.option.dataZoom[0].start = 10
+ this.option.dataZoom[0].end = 100
+ }
+
+
+
+
+ this.inCharts()
+
+
+
+
+ setTimeout(() => {//监听echarts 图表滚动
+ this.myChart.on("dataZoom", function (e) {
+ this.zoomStart = e.start || e.batch[0].start;
+ this.zoomEnd = e.end|| e.batch[0].end;
+ $addStorageEvent(1, "zoomStart", this.zoomStart);
+ $addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ });
+
+
+ })
+
+ this.memoryPoolFeesLoading = false
+
+
+
+
+
+ },
+ //实时数据
+ async fetchBTCVolume(){
+ this.memoryPoolFeesLoading = true
+ const { data } = await getBTCVolume()
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.memoryPoolFeesLoading = false
+ return
+ }
+ let BTCVolumeData = data.data
+ let Volume=[]
+ let xAxisData = []
+ let priceData =[]
+ BTCVolumeData.forEach(item=>{
+ item.date= `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ xAxisData.push(item.date)
+ Volume.push(item.value.toFixed(2))
+ priceData.push(Number(item.price.toFixed(2)))
+ })
+
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = Volume
+ this.option.series[1].data = priceData
+
+
+ this.inCharts()
+ this.memoryPoolFeesLoading = false
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchmemoryPoolFees(this.params)
+ },
+ //父级选择Sma
+ handelSonSma(smaNUm) {
+ this.params.sma = smaNUm
+ this.fetchmemoryPoolFees(this.params)
+ this.$addStorageEvent(1, "sma",this.params.sma);
+ this.realTimeData =false
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+
+
+ },
+}
\ No newline at end of file
diff --git a/yq/src/views/memoryPoolFees/index.vue b/yq/src/views/memoryPoolFees/index.vue
new file mode 100644
index 0000000..f820c36
--- /dev/null
+++ b/yq/src/views/memoryPoolFees/index.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/mempool/index.js b/yq/src/views/mempool/index.js
new file mode 100644
index 0000000..d9d3ce5
--- /dev/null
+++ b/yq/src/views/mempool/index.js
@@ -0,0 +1,347 @@
+import * as echarts from "echarts";
+import { getMempool } from "../../api/apiPost"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ mempoolLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Mempool Transaction Count",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Mempool Transaction Fees",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#383d71",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#383d71",
+ width: "1",
+ },
+ data: [],
+ yAxisIndex: 2,
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ this.fetchMempool()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("mempoolBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("mempoolBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchMempool(params) {
+ this.mempoolLoading = true
+ const { data } = await getMempool(params)
+
+ let mempoolData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.addressLoading = false
+ return
+ }
+
+ this.start = mempoolData[0].date.split("T")[0]
+ this.end = mempoolData[mempoolData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // //移动平均线没值 才渲染正常价格数据
+ // if (this.start && !this.fatherSmaData[0]) {
+ // this.handelSonBtcPrice("BTC", true)
+ // }
+ // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // if (this.fatherSmaData[0] && this.start) {
+ // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ // }
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH",this.ethFlag)
+ // }
+ // })
+
+
+ this.handelSonBtcPrice("BTC", true)
+ let mempoolFeesValueList = []
+ let mempoolSizeValueList = []
+
+ mempoolData.forEach(item => {
+
+ mempoolFeesValueList.push(Number(item.mempoolFees.toFixed(2)))
+ mempoolSizeValueList.push(Number(item.mempoolSize.toFixed(2)))
+ })
+
+ this.option.series[0].data = handelProfitrate(mempoolData, mempoolFeesValueList)
+ this.option.series[1].data = handelProfitrate(mempoolData, mempoolSizeValueList)
+
+
+
+ this.inCharts()
+ this.mempoolLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[2], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ if (smaDataList > 30) {//SMA不能大于30
+
+ this.$message({
+ message: this.$t(`login.SMAwarning`),
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+ this.params.sma = smaDataList
+ this.fetchMempool(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/mempool/index.vue b/yq/src/views/mempool/index.vue
new file mode 100644
index 0000000..e4321b2
--- /dev/null
+++ b/yq/src/views/mempool/index.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/minerAddress/index.js b/yq/src/views/minerAddress/index.js
new file mode 100644
index 0000000..233714d
--- /dev/null
+++ b/yq/src/views/minerAddress/index.js
@@ -0,0 +1,354 @@
+import * as echarts from "echarts";
+import { handelLineType,emptyData, dataLength,handelZoom, handelSwitchs, handelProfitrate, chartsWidth, handelWatermark, getDateArray, fetchBtcPrice, fetchEthPrice } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ minerAddressLoading: false,
+ params: {
+ req: "minerAddress",
+ radius: "btc"
+ },
+ balanceParams: {
+ req: "minerBalance",
+ radius: "btc"
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 60, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: true,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Balance of Miner Address",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#d90013",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#d90013",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Number of Miner Address",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 1,
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 3,
+ // data: [],
+ // },
+
+
+ ],
+ },
+ switch3: "",
+ btcFlag: true,
+ ethFlag: false,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+
+ this.fetchMinerAddress(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("minerAddressBox"));
+
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("minerAddressBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchMinerAddress(req, radius, start, end, sma) {
+ this.minerAddressLoading = true
+ //矿工地址数
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+ let minerData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.minerAddressLoading = false
+ return
+ }
+
+
+ this.start = minerData[0].date.split("T")[0]
+ this.end = minerData[minerData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //ETH渲染的情况 选择时间照样显示数据
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag);
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ })
+ let minerAddressList = []
+ minerData.forEach(item => {
+ minerAddressList.push(Number(item.value).toFixed(2))
+ })
+
+ //请求矿工地址余额
+ const list = await this.$API.getCsupply(this.balanceParams.req, this.balanceParams.radius, start, end, sma)
+ let minerBalanceData = list.data.data
+
+ let minerBalanceList = []
+ minerBalanceData.forEach(item => {
+ minerBalanceList.push(item.value.toFixed(2))
+ })
+
+ this.option.series[1].data = handelProfitrate(minerData, minerAddressList)
+ this.option.series[0].data = handelProfitrate(minerBalanceData, minerBalanceList)
+
+
+
+ this.inCharts()
+
+
+ this.minerAddressLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchMinerAddress(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[2], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[3], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.sma = smaDataList
+
+ this.fetchMinerAddress(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+ this.$addStorageEvent(1, "sma", this.sma);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts, this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/minerAddress/index.vue b/yq/src/views/minerAddress/index.vue
new file mode 100644
index 0000000..2713fe4
--- /dev/null
+++ b/yq/src/views/minerAddress/index.vue
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/minerAddress2/index.js b/yq/src/views/minerAddress2/index.js
new file mode 100644
index 0000000..8be1fbd
--- /dev/null
+++ b/yq/src/views/minerAddress2/index.js
@@ -0,0 +1,328 @@
+
+import * as echarts from "echarts";
+import { $addStorageEvent } from '../../util/processingData'
+import { getAddress, } from '../../api/realTimeData'
+import {handelZoom, chartsWidth,emptyData,handelWatermark,handelLineType,handelSwitchs} from "../../util/processingData"
+
+export default {
+ data(){
+ return{
+ myChart:"",
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ },
+ yAxis: [
+ {
+ position: "left",
+ type: "value",
+ axisLabel: {
+ formatter: (value) => {
+ let data
+ if (value >= 1000000000) {
+ data = `${value / 1000000000}B`
+ } else if (value >= 1000000) {
+ data = `${value / 1000000}M`
+ } else {
+ data = `${value / 1000}K`
+ }
+ return data
+ }
+ },
+ min:`dataMin`,
+ max:`dataMax`,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: true,
+ // min:`dataMin`,
+ // max:`dataMax`,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Number of Miner Address",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series',
+
+
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#000",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#000",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+
+
+
+ ],
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ minerAddress2Loading:false,
+ params: {
+ req: "minerAddress",
+ radius: "btc",
+ sma: "",
+ start:"",
+ end:"",
+
+ },
+ dataSelection: [
+ {
+ value: "1d",
+ label: "home.day1",
+ disabled:false,
+ authority:"guest",
+ grade:1,
+ },
+ {
+ value: "realTime",
+ label: "home.realTimeData",
+ disabled:false,
+ authority:"vip",
+ grade:4,
+ },
+ ],
+ realTimeData:"",
+ switch3: "",
+ start:"",
+ end:"",
+
+
+
+ }
+ },
+ mounted(){
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.fetchMinerAddress2(this.params.req, this.params.radius)
+ },
+ methods:{
+ handleSelect(activeValue){
+ if (activeValue == `1d`) {
+ this.realTimeData =false
+ this.fetchMinerAddress2(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ }else{
+ this.fetchMinerAddress22()
+ this.realTimeData =true
+ }
+ },
+ inCharts(){
+ if (!this.myChart) {
+ this.myChart = echarts.init(document.getElementById("minerAddress2Box"));
+
+ }
+
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+ this.myChart.setOption(this.option);
+ chartsWidth("minerAddress2Box", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+
+
+ async fetchMinerAddress2(req, radius, start, end, sma) {
+ this.minerAddress2Loading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+ let chartData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.minerAddress2Loading = false
+ return
+ }
+ //添加水印
+ handelWatermark(this.option, 750, 300)
+ this.start =chartData[0].date.split("T")[0]
+ this.end = chartData[chartData.length - 1].date.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ let volumeValueList = []
+ let xAxisData = []
+ chartData.forEach(item => {
+
+ volumeValueList.push(Number(item.value.toFixed(2)))
+ xAxisData.push(item.date.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = volumeValueList
+ this.option.series[1].data = priceData
+ if (this.zoomStart) {
+ this.option.dataZoom[0].start = this.zoomStart
+ this.option.dataZoom[0].end = this.zoomEnd
+ } else {
+ this.option.dataZoom[0].start = 10
+ this.option.dataZoom[0].end = 100
+ }
+
+
+
+
+ this.inCharts()
+
+
+
+
+ setTimeout(() => {//监听echarts 图表滚动
+ this.myChart.on("dataZoom", function (e) {
+ this.zoomStart = e.start || e.batch[0].start;
+ this.zoomEnd = e.end|| e.batch[0].end;
+ $addStorageEvent(1, "zoomStart", this.zoomStart);
+ $addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ });
+
+
+ })
+
+ this.minerAddress2Loading = false
+
+
+
+
+
+ },
+
+ //父级时间
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchMinerAddress2(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ },
+ //父级选择Sma
+ handelSonSma(smaNUm) {
+ this.params.sma = smaNUm
+ this.fetchMinerAddress2(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ this.$addStorageEvent(1, "sma",this.params.sma);
+ this.realTimeData =false
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+
+
+ },
+}
\ No newline at end of file
diff --git a/yq/src/views/minerAddress2/index.vue b/yq/src/views/minerAddress2/index.vue
new file mode 100644
index 0000000..2e0d868
--- /dev/null
+++ b/yq/src/views/minerAddress2/index.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/minerBalance/index.js b/yq/src/views/minerBalance/index.js
new file mode 100644
index 0000000..559d2ad
--- /dev/null
+++ b/yq/src/views/minerBalance/index.js
@@ -0,0 +1,209 @@
+import * as echarts from "echarts";
+import { handelLineType,handelSwitchs,handelWatermark } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ minerBalanceLoading: false,
+ params: {
+ req: "minerBalance",
+ radius: "btc"
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ position: function (point, params, dom, rect, size) {
+ // 鼠标坐标和提示框位置的参考坐标系是:以外层div的左上角那一点为原点,x轴向右,y轴向下
+ // 提示框位置
+ var x = 0; // x坐标位置
+ var y = 0; // y坐标位置
+
+ // 当前鼠标位置
+ var pointX = point[0];
+ var pointY = point[1];
+
+ // 外层div大小
+ // var viewWidth = size.viewSize[0];
+ // var viewHeight = size.viewSize[1];
+
+ // 提示框大小
+ var boxWidth = size.contentSize[0];
+ var boxHeight = size.contentSize[1];
+
+ // boxWidth > pointX 说明鼠标左边放不下提示框
+ if (boxWidth > pointX) {
+ x = 5;
+ } else {
+ // 左边放的下
+ x = pointX - boxWidth;
+ }
+
+ // boxHeight > pointY 说明鼠标上边放不下提示框
+ if (boxHeight > pointY) {
+ y = 5;
+ } else {
+ // 上边放得下
+ y = pointY - boxHeight;
+ }
+
+ return [x, y];
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 60, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "log",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Balance of Miner Address",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+ ],
+ },
+ switch3:""
+ }
+ },
+ mounted() {
+
+ this.fetchMinerBalance(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if ( this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("minerBalanceBox"));
+
+ }
+
+ this.myChart.setOption(this.option);
+
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchMinerBalance(req, radius, start, end) {
+ this.minerBalanceLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end)
+
+ let minerData = data.data
+ this.option.xAxis.data.length = 0
+ this.option.series[0].data.length = 0
+ //添加水印
+ this.option= handelWatermark(this.option)
+ minerData.forEach(item => {
+ this.option.xAxis.data.push(item.date.split("T")[0])
+ this.option.series[0].data.push(item.value.toFixed(2))
+ })
+ this.inCharts()
+ this.minerBalanceLoading = false
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+
+ this.fetchMinerBalance(this.params.req, this.params.radius,start, end)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/minerBalance/index.vue b/yq/src/views/minerBalance/index.vue
new file mode 100644
index 0000000..61f6307
--- /dev/null
+++ b/yq/src/views/minerBalance/index.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/minerBalance2/index.js b/yq/src/views/minerBalance2/index.js
new file mode 100644
index 0000000..2ecb47d
--- /dev/null
+++ b/yq/src/views/minerBalance2/index.js
@@ -0,0 +1,328 @@
+
+import * as echarts from "echarts";
+import { $addStorageEvent } from '../../util/processingData'
+import { getAddress, } from '../../api/realTimeData'
+import {handelZoom, chartsWidth,emptyData,handelWatermark,handelLineType,handelSwitchs} from "../../util/processingData"
+
+export default {
+ data(){
+ return{
+ myChart:"",
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ },
+ yAxis: [
+ {
+ position: "left",
+ type: "value",
+ axisLabel: {
+ formatter: (value) => {
+ let data
+ if (value >= 1000000000) {
+ data = `${value / 1000000000}B`
+ } else if (value >= 1000000) {
+ data = `${value / 1000000}M`
+ } else {
+ data = `${value / 1000}K`
+ }
+ return data
+ }
+ },
+ min:`dataMin`,
+ max:`dataMax`,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: true,
+ // min:`dataMin`,
+ // max:`dataMax`,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Balance of Miner Address",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series',
+
+
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#000",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#000",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+
+
+
+ ],
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ minerBalance2Loading:false,
+ params: {
+ req: "minerBalance",
+ radius: "btc",
+ sma: "",
+ start:"",
+ end:"",
+
+ },
+ dataSelection: [
+ {
+ value: "1d",
+ label: "home.day1",
+ disabled:false,
+ authority:"guest",
+ grade:1,
+ },
+ {
+ value: "realTime",
+ label: "home.realTimeData",
+ disabled:false,
+ authority:"vip",
+ grade:4,
+ },
+ ],
+ realTimeData:"",
+ switch3: "",
+ start:"",
+ end:"",
+
+
+
+ }
+ },
+ mounted(){
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.fetchMinerBalance2(this.params.req, this.params.radius)
+ },
+ methods:{
+ handleSelect(activeValue){
+ if (activeValue == `1d`) {
+ this.realTimeData =false
+ this.fetchMinerBalance2(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ }else{
+ this.fetchMinerBalance22()
+ this.realTimeData =true
+ }
+ },
+ inCharts(){
+ if (!this.myChart) {
+ this.myChart = echarts.init(document.getElementById("minerBalance2Box"));
+
+ }
+
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+ this.myChart.setOption(this.option);
+ chartsWidth("minerBalance2Box", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+
+
+ async fetchMinerBalance2(req, radius, start, end, sma) {
+ this.minerBalance2Loading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+ let chartData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.minerBalance2Loading = false
+ return
+ }
+ //添加水印
+ handelWatermark(this.option, 750, 300)
+ this.start =chartData[0].date.split("T")[0]
+ this.end = chartData[chartData.length - 1].date.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ let volumeValueList = []
+ let xAxisData = []
+ chartData.forEach(item => {
+
+ volumeValueList.push(Number(item.value.toFixed(2)))
+ xAxisData.push(item.date.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = volumeValueList
+ this.option.series[1].data = priceData
+ if (this.zoomStart) {
+ this.option.dataZoom[0].start = this.zoomStart
+ this.option.dataZoom[0].end = this.zoomEnd
+ } else {
+ this.option.dataZoom[0].start = 10
+ this.option.dataZoom[0].end = 100
+ }
+
+
+
+
+ this.inCharts()
+
+
+
+
+ setTimeout(() => {//监听echarts 图表滚动
+ this.myChart.on("dataZoom", function (e) {
+ this.zoomStart = e.start || e.batch[0].start;
+ this.zoomEnd = e.end|| e.batch[0].end;
+ $addStorageEvent(1, "zoomStart", this.zoomStart);
+ $addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ });
+
+
+ })
+
+ this.minerBalance2Loading = false
+
+
+
+
+
+ },
+
+ //父级时间
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchMinerBalance2(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ },
+ //父级选择Sma
+ handelSonSma(smaNUm) {
+ this.params.sma = smaNUm
+ this.fetchMinerBalance2(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ this.$addStorageEvent(1, "sma",this.params.sma);
+ this.realTimeData =false
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+
+
+ },
+}
\ No newline at end of file
diff --git a/yq/src/views/minerBalance2/index.vue b/yq/src/views/minerBalance2/index.vue
new file mode 100644
index 0000000..0631436
--- /dev/null
+++ b/yq/src/views/minerBalance2/index.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/mintedBUSD/index.js b/yq/src/views/mintedBUSD/index.js
new file mode 100644
index 0000000..c76f4aa
--- /dev/null
+++ b/yq/src/views/mintedBUSD/index.js
@@ -0,0 +1,465 @@
+import * as echarts from "echarts";
+import { getMintedBUSD, getMintedBUSDTable } from "../../api/pages"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ mintedBUSDLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "issue",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "redeem",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#2d993b",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#2d993b",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ tableLoading: false,
+ search: {
+ start: "",
+ end: "",
+ page: 1,
+ size: 50,
+ total: "",
+ action: "burn"
+ },
+ totalPage: 0,
+ currentPage4: 1,
+ tableData: [],
+ actionList: [{//铸造
+ value: "mint",
+ label: "home.casting"
+ },
+ {
+ value: "burn",
+ label: "home.Destruction"
+ }],
+ value: ""
+
+
+ }
+ },
+ mounted() {
+ this.fetchMintedBUSD()
+ this.fetchTable(this.search)
+ //禁用时间框
+ // this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("mintedBUSDBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("mintedBUSDBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchMintedBUSD(params) {
+ this.mintedBUSDLoading = true
+ const { data } = await getMintedBUSD(params)
+ let mintedBUSDData = data.data
+
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.mintedBUSDLoading = false
+ return
+ }
+ this.start = mintedBUSDData[0].date.split("T")[0]
+ this.end = mintedBUSDData[mintedBUSDData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // //移动平均线没值 才渲染正常价格数据
+ // if (this.start && !this.fatherSmaData[0]) {
+ // this.handelSonBtcPrice("BTC", true)
+ // }
+ // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // if (this.fatherSmaData[0] && this.start) {
+ // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ // }
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // })
+ this.handelSonBtcPrice("BTC", true)
+ let issueValueList = []
+ let redeemValueList = []
+
+
+ mintedBUSDData.forEach(item => {
+ issueValueList.push(Number(item.issue.toFixed(2)))
+ redeemValueList.push(Number(item.redeem.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(mintedBUSDData, issueValueList)
+ this.option.series[1].data = handelProfitrate(mintedBUSDData, redeemValueList)
+
+
+ this.inCharts()
+ this.mintedBUSDLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+ //请求表格数据
+ async fetchTable(search) {
+ this.tableLoading = true
+ const table = await getMintedBUSDTable(search)
+
+ this.tableData = table.data.data.data
+ console.log(this.tableData[0], 66666);
+ if (!this.tableData[0]) {
+ this.$message({
+ type: 'warning',
+ message: this.$t(`home.NoData`)
+ });
+ this.tableLoading = false
+ return
+ }
+ this.totalPage = table.data.data.totalPage
+ this.currentPage4 = this.search.page
+ this.tableLoading = false
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchMintedBUSD(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[2], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[3], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchMintedBUSD(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ //双击表格单元格复制
+ cellDblclick(row, column, cell, event) {
+ if (event.type === "dblclick") {
+ var save = (e) => {
+ e.clipboardData.setData("text/plain", event.target.innerText);
+ e.preventDefault(); //阻止默认行为
+ };
+ document.addEventListener("copy", save);
+ document.execCommand("copy");
+ document.removeEventListener("copy", save);
+ }
+ this.$message({ message: this.$t(`home.copy`), type: "success" }); //加提示
+ },
+
+ //点击的改变页数
+ handleCurrentChange(value) {
+ this.search.page = value;
+ this.currentPage4 = value
+ this.fetchTable(this.search)
+ },
+ //改变每页条数
+ handleSizeChange(val) {
+ this.search.page = 1;
+ this.search.size = val;
+ this.fetchTable(this.search)
+
+ },
+ //下拉选择框
+ handelChang(val) {
+ this.search.action = val
+
+ },
+ handelSearch(val) {
+
+ this.fetchTable(this.search)
+
+ },
+ //处理表格里的时间
+ formatTime(value) {
+ let newTime = value.split(".")[0].replace("T", " ");
+ return newTime;
+ },
+ handelAction(val) {
+ return this.actionList.find(item => item.value == val).label
+ }
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/mintedBUSD/index.vue b/yq/src/views/mintedBUSD/index.vue
new file mode 100644
index 0000000..d3c4f42
--- /dev/null
+++ b/yq/src/views/mintedBUSD/index.vue
@@ -0,0 +1,217 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`home.table`)}}
+ {{ $t(`home.copyTabel`) }}
+
+
+
+
+
+ {{ formatTime(scope.row.date) }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ handelAction(scope.row.action) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/mintedSupplyEth/index.js b/yq/src/views/mintedSupplyEth/index.js
new file mode 100644
index 0000000..3dc7ee2
--- /dev/null
+++ b/yq/src/views/mintedSupplyEth/index.js
@@ -0,0 +1,350 @@
+import * as echarts from "echarts";
+import { getMintedSupplyEth, } from "../../api/pages"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ mintedSupplyEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}% `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Minted Supply",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchmintedSupplyEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("mintedSupplyEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("mintedSupplyEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchmintedSupplyEth(params) {
+ this.mintedSupplyEthLoading = true
+ const { data } = await getMintedSupplyEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.mintedSupplyEthLoading = false
+ return
+ }
+ let mintedSupplyEthData = data.data
+ this.start = mintedSupplyEthData[0].date.split("T")[0]
+ this.end = mintedSupplyEthData[mintedSupplyEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ mintedSupplyEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(mintedSupplyEthData, ValueList)
+
+ this.inCharts()
+
+ this.mintedSupplyEthLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchmintedSupplyEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchmintedSupplyEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/mintedSupplyEth/index.vue b/yq/src/views/mintedSupplyEth/index.vue
new file mode 100644
index 0000000..4f898dc
--- /dev/null
+++ b/yq/src/views/mintedSupplyEth/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/mintedUSDC/index.js b/yq/src/views/mintedUSDC/index.js
new file mode 100644
index 0000000..8517125
--- /dev/null
+++ b/yq/src/views/mintedUSDC/index.js
@@ -0,0 +1,469 @@
+import * as echarts from "echarts";
+import { getMintedUSDC, getMintedUSDCTable } from "../../api/pages"
+import BigNumber from 'bignumber.js';//科学计数法转换成普通数字
+import { chartsWidth,dataLength, emptyData,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ mintedUSDCLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "issue",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "redeem",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#2d993b",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#2d993b",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ tableLoading: false,
+ search: {
+ start: "",
+ end: "",
+ page: 1,
+ size: 50,
+ total: "",
+ action: "burn"
+ },
+ totalPage: 0,
+ currentPage4: 1,
+ tableData: [],
+ actionList: [{//铸造
+ value: "mint",
+ label: "home.casting"
+ },
+ {
+ value: "burn",
+ label: "home.Destruction"
+ }],
+ value: ""
+
+
+ }
+ },
+ mounted() {
+ this.fetchMintedUSDC()
+ this.fetchTable(this.search)
+ //禁用时间框
+ // this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("mintedUSDCBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("mintedUSDCBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchMintedUSDC(params) {
+ this.mintedUSDCLoading = true
+ const { data } = await getMintedUSDC(params)
+ let mintedUSDCData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.mintedUSDCLoading = false
+ return
+ }
+
+
+ this.start = mintedUSDCData[0].date.split("T")[0]
+ this.end = mintedUSDCData[mintedUSDCData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // //移动平均线没值 才渲染正常价格数据
+ // if (this.start && !this.fatherSmaData[0]) {
+ // this.handelSonBtcPrice("BTC", true)
+ // }
+ // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // if (this.fatherSmaData[0] && this.start) {
+ // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ // }
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // })
+ this.handelSonBtcPrice("BTC", true)
+ let issueValueList = []
+ let redeemValueList = []
+ // let str = `1.158472395435295e+54`
+
+ // let bigNum2 = new BigNumber(str);
+ // console.log(parseFloat(bigNum2.toString()),7777);
+
+ mintedUSDCData.forEach(item => {
+ item.issue= new BigNumber(item.issue)//科学计数法转换成普通数字
+ issueValueList.push(Number(item.issue).toFixed(2))
+ redeemValueList.push(Number(item.redeem.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(mintedUSDCData, issueValueList)
+ this.option.series[1].data = handelProfitrate(mintedUSDCData, redeemValueList)
+
+
+ this.inCharts()
+ // console.log(issueValueList,"几点几i");
+ this.mintedUSDCLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //请求表格数据
+ async fetchTable(search) {
+ this.tableLoading = true
+ const table = await getMintedUSDCTable(search)
+ this.tableData = table.data.data.data
+ if (!this.tableData[0]) {
+ this.$message({
+ type: 'warning',
+ message: this.$t(`home.NoData`)
+ });
+ this.tableLoading = false
+ return
+ }
+ this.totalPage = table.data.data.totalPage
+ this.currentPage4 = this.search.page
+ this.tableLoading = false
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchMintedUSDC(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[2], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[3], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchMintedUSDC(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ //双击表格单元格复制
+ cellDblclick(row, column, cell, event) {
+ if (event.type === "dblclick") {
+ var save = (e) => {
+ e.clipboardData.setData("text/plain", event.target.innerText);
+ e.preventDefault(); //阻止默认行为
+ };
+ document.addEventListener("copy", save);
+ document.execCommand("copy");
+ document.removeEventListener("copy", save);
+ }
+ this.$message({ message: this.$t(`home.copy`), type: "success" }); //加提示
+ },
+
+ //点击的改变页数
+ handleCurrentChange(value) {
+ this.search.page = value;
+ this.currentPage4 = value
+ this.fetchTable(this.search)
+ },
+ //改变每页条数
+ handleSizeChange(val) {
+ this.search.page = 1;
+ this.search.size = val;
+ this.fetchTable(this.search)
+
+ },
+ //下拉选择框
+ handelChang(val) {
+ this.search.action = val
+
+ },
+ handelSearch(val) {
+
+ this.fetchTable(this.search)
+
+ },
+ //处理表格里的时间
+ formatTime(value) {
+ let newTime = value.split(".")[0].replace("T", " ");
+ return newTime;
+ },
+ handelAction(val) {
+ return this.actionList.find(item => item.value == val).label
+ }
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/mintedUSDC/index.vue b/yq/src/views/mintedUSDC/index.vue
new file mode 100644
index 0000000..640e185
--- /dev/null
+++ b/yq/src/views/mintedUSDC/index.vue
@@ -0,0 +1,228 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`home.table`)}}
+ {{ $t(`home.copyTabel`) }}
+
+
+
+
+
+ {{ formatTime(scope.row.date) }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ handelAction(scope.row.action) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/mintedUSDT/index.js b/yq/src/views/mintedUSDT/index.js
new file mode 100644
index 0000000..264613a
--- /dev/null
+++ b/yq/src/views/mintedUSDT/index.js
@@ -0,0 +1,472 @@
+import * as echarts from "echarts";
+import { getMintedUSDT, getMintedUSDTTable } from "../../api/pages"
+import { chartsWidth, dataLength,emptyData,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ mintedUSDTLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "issue",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "redeem",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#2d993b",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#2d993b",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ tableLoading: false,
+ search: {
+ start: "",
+ end: "",
+ page: 1,
+ size: 50,
+ total: "",
+ action: "burn"
+ },
+ totalPage: 0,
+ currentPage4: 1,
+ tableData: [],
+ actionList: [{//铸造
+ value: "mint",
+ label: "home.casting"
+ },
+ {
+ value: "burn",
+ label: "home.Destruction"
+ }],
+ value: ""
+
+
+ }
+ },
+ mounted() {
+ this.fetchMintedUSDT()
+ this.fetchTable(this.search)
+ //禁用时间框
+ // this.$addStorageEvent(1, "timeShow", true);
+ // this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("mintedUSDTBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("mintedUSDTBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchMintedUSDT(params) {
+ this.mintedUSDTLoading = true
+ const { data } = await getMintedUSDT(params)
+ let mintedUSDTData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.mintedUSDTLoading = false
+ return
+ }
+ this.start = mintedUSDTData[0].date.split("T")[0]
+ this.end = mintedUSDTData[mintedUSDTData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // // //移动平均线没值 才渲染正常价格数据
+ // // if (this.start && !this.fatherSmaData[0]) {
+ // // this.handelSonBtcPrice("BTC", true)
+ // // }
+ // // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // // if (this.fatherSmaData[0] && this.start) {
+ // // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ // // }
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+ // })
+
+ this.handelSonBtcPrice("BTC", true)
+ let issueValueList = []
+ let redeemValueList = []
+
+
+ mintedUSDTData.forEach(item => {
+ issueValueList.push(Number(item.issue.toFixed(2)))
+ redeemValueList.push(Number(item.redeem.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(mintedUSDTData, issueValueList)
+ this.option.series[1].data = handelProfitrate(mintedUSDTData, redeemValueList)
+
+
+ this.inCharts()
+ this.mintedUSDTLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+
+ },
+ //请求表格数据
+ async fetchTable(search) {
+ this.tableLoading = true
+ const table = await getMintedUSDTTable(search)
+ this.tableData = table.data.data.data
+ if (!this.tableData[0]) {
+ this.$message({
+ type: 'warning',
+ message: this.$t(`home.NoData`)
+ });
+ this.tableLoading = false
+ return
+ }
+ this.totalPage = table.data.data.totalPage
+ this.currentPage4 = this.search.page
+ this.tableLoading = false
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchMintedUSDT(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[2], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[3], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchMintedUSDT(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ //双击表格单元格复制
+ cellDblclick(row, column, cell, event) {
+ if (event.type === "dblclick") {
+ var save = (e) => {
+ e.clipboardData.setData("text/plain", event.target.innerText);
+ e.preventDefault(); //阻止默认行为
+ };
+ document.addEventListener("copy", save);
+ document.execCommand("copy");
+ document.removeEventListener("copy", save);
+ }
+ this.$message({ message: this.$t(`home.copy`), type: "success" }); //加提示
+ },
+
+ //点击的改变页数
+ handleCurrentChange(value) {
+ this.search.page = value;
+ this.currentPage4 = value
+ this.fetchTable(this.search)
+ },
+ //改变每页条数
+ handleSizeChange(val) {
+ this.search.page = 1;
+ this.search.size = val;
+ this.fetchTable(this.search)
+
+ },
+ //下拉选择框
+ handelChang(val) {
+ this.search.action = val
+
+ },
+ handelSearch(val) {
+
+ this.fetchTable(this.search)
+
+ },
+ //处理表格里的时间
+ formatTime(value) {
+ let newTime = value.split(".")[0].replace("T", " ");
+ return newTime;
+ },
+ handelAction(val) {
+ return this.actionList.find(item => item.value == val).label
+ }
+
+
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/mintedUSDT/index.vue b/yq/src/views/mintedUSDT/index.vue
new file mode 100644
index 0000000..c8f3d50
--- /dev/null
+++ b/yq/src/views/mintedUSDT/index.vue
@@ -0,0 +1,219 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`home.table`)}}
+ {{ $t(`home.copyTabel`) }}
+
+
+
+
+
+ {{ formatTime(scope.row.date) }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ handelAction(scope.row.action) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/mintusd/index.js b/yq/src/views/mintusd/index.js
new file mode 100644
index 0000000..dac0509
--- /dev/null
+++ b/yq/src/views/mintusd/index.js
@@ -0,0 +1,499 @@
+import * as echarts from "echarts";
+import { chartsWidth,emptyData,dataLength,handelProfitrate, handelZoom, handelLineType, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ mintusdLoading: false,
+ params: {
+ req: "mintusd",
+ radius: "btc"
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 60, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+ console.log(e, "记得加防腐剂");
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ // min: "dataMin",
+ // max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ position: "right"
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Puell Multile",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ //绘制图表区间颜色
+ markArea: {
+ silent: true,
+ data: [
+ [
+ {
+ yAxis: "min",
+ itemStyle: {
+ color: "#e5f7f0",
+ },
+ },
+ {
+ yAxis: "0.5",
+ },
+ ],
+ [
+ {
+ yAxis: "5.55",
+ itemStyle: {
+ color: "#fde7e7",
+ },
+ },
+ {
+ yAxis: "3.7",
+ },
+ ],
+
+ // 如果有多种颜色,就继续在这里写区间数组,复制上面的下来改颜色
+ ],
+ }
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ // markLine: {
+ // symbol: ["none", "none"], //去掉箭头
+ // itemStyle: {
+ // normal: {
+ // lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ // },
+ // },
+ // // lineStyle:{
+ // // color:"red"
+ // // },
+
+ // label: {
+ // formatter: "{b}",
+ // fontSize: 10,
+ // color: "rgba(0,0,0,0.8)",
+ // align: "left",
+ // },
+ // data: [
+ // {
+ // name: "$0.02",
+ // yAxis: 0.02,
+ // },
+ // {
+ // name: "$0.06",
+ // yAxis: 0.06,
+ // },
+ // {
+ // name: "$0.1",
+ // yAxis: 0.1,
+ // },
+ // {
+ // name: "$0.4",
+ // yAxis: 0.4,
+ // },
+ // {
+ // name: "$0.8",
+ // yAxis: 0.8,
+ // },
+ // {
+ // name: "$2",
+ // yAxis: 2,
+ // },
+ // {
+ // name: "$6",
+ // yAxis: 6,
+ // },
+ // {
+ // name: "$10",
+ // yAxis: 10,
+ // },
+ // {
+ // name: "$40",
+ // yAxis: 40,
+ // },
+ // {
+ // name: "$80",
+ // yAxis: 80,
+ // },
+ // // {
+ // // name: "$120",
+ // // yAxis: 120,
+ // // },
+ // {
+ // name: "$160",
+ // yAxis: 160,
+ // },
+ // // {
+ // // name: "$200",
+ // // yAxis: 200,
+ // // },
+ // {
+ // name: "$240",
+ // yAxis: 240,
+ // },
+ // {
+ // name: "$300",
+ // yAxis: 300,
+ // },
+ // {
+ // name: "$500",
+ // yAxis: 500,
+ // },
+ // {
+ // name: "$700",
+ // yAxis: 700,
+ // },
+ // {
+ // name: "$900",
+ // yAxis: 900,
+ // },
+ // {
+ // name: "$1100",
+ // yAxis: 1100,
+ // },
+ // // {
+ // // name: "$1200",
+ // // yAxis: 1200,
+ // // },
+ // {
+ // name: "$1800",
+ // yAxis: 1800,
+ // },
+ // {
+ // name: "$3000",
+ // yAxis: 3000,
+ // },
+ // // {
+ // // name: "$40W",
+ // // yAxis: 400000,
+ // // },
+ // {
+ // name: "$70W",
+ // yAxis: 700000,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+
+ // {
+ // name: "$10W",
+ // yAxis: 100000,
+ // },
+ // {
+ // name: "$100W",
+ // yAxis: 1000000,
+ // // position: ['100%', '50'],
+ // },
+ // {
+ // name: "$120W",
+ // yAxis: 1200000,
+ // },
+
+ // {
+ // name: "$140W",
+ // yAxis: 1400000,
+ // },
+ // ],
+ // },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 2,
+ // data: [],
+ // },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+
+ this.fetchMintusd(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("mintusdBox"));
+
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("mintusdBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchMintusd(req, radius, start, end, sma) {
+ this.mintusdLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+ let mintusdData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.mintusdLoading = false
+ return
+ }
+ this.start = mintusdData[0].date.split("T")[0]
+ this.end = mintusdData[mintusdData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ //渲染ETH
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+ let mintusdValueList = []
+ mintusdData.forEach(item => {
+
+ mintusdValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(mintusdData, mintusdValueList)
+
+ this.inCharts()
+ this.mintusdLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchMintusd(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.sma = smaDataList
+ this.fetchMintusd(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts, this.start, this.end)
+
+ },
+
+
+ },
+
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+}
+}
\ No newline at end of file
diff --git a/yq/src/views/mintusd/index.vue b/yq/src/views/mintusd/index.vue
new file mode 100644
index 0000000..346bac2
--- /dev/null
+++ b/yq/src/views/mintusd/index.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/mvrvRatioEth/index.js b/yq/src/views/mvrvRatioEth/index.js
new file mode 100644
index 0000000..2d1a2f2
--- /dev/null
+++ b/yq/src/views/mvrvRatioEth/index.js
@@ -0,0 +1,350 @@
+import * as echarts from "echarts";
+import { getMvrvRatioEth, } from "../../api/pages"
+import { chartsWidth, emptyData,dataLength,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ mvrvRatioEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}% `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Market Value to Realized Value Ratio",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchmvrvRatioEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("mvrvRatioEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("mvrvRatioEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchmvrvRatioEth(params) {
+ this.mvrvRatioEthLoading = true
+ const { data } = await getMvrvRatioEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.mvrvRatioEthLoading = false
+ return
+ }
+ let mvrvRatioEthData = data.data
+ this.start = mvrvRatioEthData[0].date.split("T")[0]
+ this.end = mvrvRatioEthData[mvrvRatioEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ mvrvRatioEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(mvrvRatioEthData, ValueList)
+
+ this.inCharts()
+
+ this.mvrvRatioEthLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchmvrvRatioEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchmvrvRatioEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/mvrvRatioEth/index.vue b/yq/src/views/mvrvRatioEth/index.vue
new file mode 100644
index 0000000..2d02aa1
--- /dev/null
+++ b/yq/src/views/mvrvRatioEth/index.vue
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/newAddress.vue b/yq/src/views/newAddress.vue
new file mode 100644
index 0000000..da549c2
--- /dev/null
+++ b/yq/src/views/newAddress.vue
@@ -0,0 +1,1654 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/newAddress2/index.js b/yq/src/views/newAddress2/index.js
new file mode 100644
index 0000000..2ee725a
--- /dev/null
+++ b/yq/src/views/newAddress2/index.js
@@ -0,0 +1,354 @@
+
+import * as echarts from "echarts";
+import { $addStorageEvent } from '../../util/processingData'
+import { getAddress, } from '../../api/realTimeData'
+import {handelZoom, chartsWidth,emptyData,handelWatermark,handelLineType,handelSwitchs} from "../../util/processingData"
+
+export default {
+ data(){
+ return{
+ myChart:"",
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ },
+ yAxis: [
+ {
+ position: "left",
+ type: "value",
+ axisLabel: {
+ formatter: (value) => {
+ let data
+ if (value >= 1000000000) {
+ data = `${value / 1000000000}B`
+ } else if (value >= 1000000) {
+ data = `${value / 1000000}M`
+ } else {
+ data = `${value / 1000}K`
+ }
+ return data
+ }
+ }
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: true,
+ // min:`dataMin`,
+ // max:`dataMax`,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "New Address",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series',
+
+
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#000",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#000",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+
+
+
+ ],
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ newAddress2Loading:false,
+ params: {
+ req: "address",
+ radius: "btc",
+ sma: "",
+ start:"",
+ end:"",
+
+ },
+ dataSelection: [
+ {
+ value: "1d",
+ label: "home.day1",
+ disabled:false,
+ authority:"guest",
+ grade:1,
+ },
+ {
+ value: "realTime",
+ label: "home.realTimeData",
+ disabled:false,
+ authority:"vip",
+ grade:4,
+ },
+ ],
+ realTimeData:"",
+ switch3: "",
+ start:"",
+ end:"",
+
+
+
+ }
+ },
+ mounted(){
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.fetchBNewAddress2(this.params.req, this.params.radius)
+ },
+ methods:{
+ handleSelect(activeValue){
+ if (activeValue == `1d`) {
+ this.realTimeData =false
+ this.fetchBNewAddress2(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ }else{
+ this.fetchBNewAddress22()
+ this.realTimeData =true
+ }
+ },
+ inCharts(){
+ if (!this.myChart) {
+ this.myChart = echarts.init(document.getElementById("newAddress2Box"));
+
+ }
+
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+ this.myChart.setOption(this.option);
+ chartsWidth("newAddress2Box", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+
+
+ async fetchBNewAddress2(req, radius, start, end, sma) {
+ this.newAddress2Loading = true
+ const { data } = await this.$API.getNewAddress(req, radius, start, end, sma)
+ let volumeData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.newAddress2Loading = false
+ return
+ }
+ //添加水印
+ handelWatermark(this.option, 750, 300)
+ this.start =volumeData[0].date.split("T")[0]
+ this.end = volumeData[volumeData.length - 1].date.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ let volumeValueList = []
+ let xAxisData = []
+ volumeData.forEach(item => {
+
+ volumeValueList.push(Number(item.newAddress.toFixed(2)))
+ xAxisData.push(item.date.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = volumeValueList
+ this.option.series[1].data = priceData
+ if (this.zoomStart) {
+ this.option.dataZoom[0].start = this.zoomStart
+ this.option.dataZoom[0].end = this.zoomEnd
+ } else {
+ this.option.dataZoom[0].start = 10
+ this.option.dataZoom[0].end = 100
+ }
+
+
+
+
+ this.inCharts()
+
+
+
+
+ setTimeout(() => {//监听echarts 图表滚动
+ this.myChart.on("dataZoom", function (e) {
+ this.zoomStart = e.start || e.batch[0].start;
+ this.zoomEnd = e.end|| e.batch[0].end;
+ $addStorageEvent(1, "zoomStart", this.zoomStart);
+ $addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ });
+
+
+ })
+
+ this.newAddress2Loading = false
+
+
+
+
+
+ },
+ //实时数据
+ async fetchBNewAddress22(){
+ this.newAddress2Loading = true
+ const { data } = await getAddress()
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.newAddress2Loading = false
+ return
+ }
+ let chartData = data.data
+ let Volume=[]
+ let xAxisData = []
+ let priceData =[]
+ chartData.forEach(item=>{
+ item.date= `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ xAxisData.push(item.date)
+ Volume.push(item.newAddress.toFixed(2))
+ priceData.push(Number(item.price.toFixed(2)))
+ })
+
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = Volume
+ this.option.series[1].data = priceData
+
+
+ this.inCharts()
+ this.newAddress2Loading = false
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchBNewAddress2(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ },
+ //父级选择Sma
+ handelSonSma(smaNUm) {
+ this.params.sma = smaNUm
+ this.fetchBNewAddress2(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ this.$addStorageEvent(1, "sma",this.params.sma);
+ this.realTimeData =false
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+
+
+ },
+}
\ No newline at end of file
diff --git a/yq/src/views/newAddress2/index.vue b/yq/src/views/newAddress2/index.vue
new file mode 100644
index 0000000..17dec8a
--- /dev/null
+++ b/yq/src/views/newAddress2/index.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/newAddressVolume/index.js b/yq/src/views/newAddressVolume/index.js
new file mode 100644
index 0000000..473d8d5
--- /dev/null
+++ b/yq/src/views/newAddressVolume/index.js
@@ -0,0 +1,354 @@
+
+import * as echarts from "echarts";
+import { $addStorageEvent } from '../../util/processingData'
+import { getAddress, } from '../../api/realTimeData'
+import {handelZoom, chartsWidth,emptyData,handelWatermark,handelLineType,handelSwitchs} from "../../util/processingData"
+
+export default {
+ data(){
+ return{
+ myChart:"",
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ },
+ yAxis: [
+ {
+ position: "left",
+ type: "value",
+ axisLabel: {
+ formatter: (value) => {
+ let data
+ if (value >= 1000000000) {
+ data = `${value / 1000000000}B`
+ } else if (value >= 1000000) {
+ data = `${value / 1000000}M`
+ } else {
+ data = `${value / 1000}K`
+ }
+ return data
+ }
+ }
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: true,
+ // min:`dataMin`,
+ // max:`dataMax`,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Transaction Volume for New Address",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series',
+
+
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#000",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#000",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+
+
+
+ ],
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ newAddressVolumeLoading:false,
+ params: {
+ req: "address",
+ radius: "btc",
+ sma: "",
+ start:"",
+ end:"",
+
+ },
+ dataSelection: [
+ {
+ value: "1d",
+ label: "home.day1",
+ disabled:false,
+ authority:"guest",
+ grade:1,
+ },
+ {
+ value: "realTime",
+ label: "home.realTimeData",
+ disabled:false,
+ authority:"vip",
+ grade:4,
+ },
+ ],
+ realTimeData:"",
+ switch3: "",
+ start:"",
+ end:"",
+
+
+
+ }
+ },
+ mounted(){
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.fetchBNewAddressVolume(this.params.req, this.params.radius)
+ },
+ methods:{
+ handleSelect(activeValue){
+ if (activeValue == `1d`) {
+ this.realTimeData =false
+ this.fetchBNewAddressVolume(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ }else{
+ this.fetchBNewAddressVolume2()
+ this.realTimeData =true
+ }
+ },
+ inCharts(){
+ if (!this.myChart) {
+ this.myChart = echarts.init(document.getElementById("newAddressVolumeBox"));
+
+ }
+
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+ this.myChart.setOption(this.option);
+ chartsWidth("newAddressVolumeBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+
+
+ async fetchBNewAddressVolume(req, radius, start, end, sma) {
+ this.newAddressVolumeLoading = true
+ const { data } = await this.$API.getNewAddress(req, radius, start, end, sma)
+ let chartData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.newAddressVolumeLoading = false
+ return
+ }
+ //添加水印
+ handelWatermark(this.option, 750, 300)
+ this.start =chartData[0].date.split("T")[0]
+ this.end = chartData[chartData.length - 1].date.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ let volumeValueList = []
+ let xAxisData = []
+ chartData.forEach(item => {
+
+ volumeValueList.push(Number(item.newAddressVolume.toFixed(2)))
+ xAxisData.push(item.date.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = volumeValueList
+ this.option.series[1].data = priceData
+ if (this.zoomStart) {
+ this.option.dataZoom[0].start = this.zoomStart
+ this.option.dataZoom[0].end = this.zoomEnd
+ } else {
+ this.option.dataZoom[0].start = 10
+ this.option.dataZoom[0].end = 100
+ }
+
+
+
+
+ this.inCharts()
+
+
+
+
+ setTimeout(() => {//监听echarts 图表滚动
+ this.myChart.on("dataZoom", function (e) {
+ this.zoomStart = e.start || e.batch[0].start;
+ this.zoomEnd = e.end|| e.batch[0].end;
+ $addStorageEvent(1, "zoomStart", this.zoomStart);
+ $addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ });
+
+
+ })
+
+ this.newAddressVolumeLoading = false
+
+
+
+
+
+ },
+ //实时数据
+ async fetchBNewAddressVolume2(){
+ this.newAddressVolumeLoading = true
+ const { data } = await getAddress()
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.newAddressVolumeLoading = false
+ return
+ }
+ let chartData = data.data
+ let Volume=[]
+ let xAxisData = []
+ let priceData =[]
+ chartData.forEach(item=>{
+ item.date= `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ xAxisData.push(item.date)
+ Volume.push(item.newAddressVolume.toFixed(2))
+ priceData.push(Number(item.price.toFixed(2)))
+ })
+
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = Volume
+ this.option.series[1].data = priceData
+
+
+ this.inCharts()
+ this.newAddressVolumeLoading = false
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchBNewAddressVolume(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ },
+ //父级选择Sma
+ handelSonSma(smaNUm) {
+ this.params.sma = smaNUm
+ this.fetchBNewAddressVolume(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ this.$addStorageEvent(1, "sma",this.params.sma);
+ this.realTimeData =false
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+
+
+ },
+}
\ No newline at end of file
diff --git a/yq/src/views/newAddressVolume/index.vue b/yq/src/views/newAddressVolume/index.vue
new file mode 100644
index 0000000..468b932
--- /dev/null
+++ b/yq/src/views/newAddressVolume/index.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/newContract/index.js b/yq/src/views/newContract/index.js
new file mode 100644
index 0000000..0d8b392
--- /dev/null
+++ b/yq/src/views/newContract/index.js
@@ -0,0 +1,78 @@
+
+export default {
+ data() {
+ return {
+ newContractLoading: false,
+ params: {
+ req: "newContract",
+ radius: "ETH",
+ },
+ newContractData: [],
+ page: 1,
+ limit: 50,
+ currentPage4: 1,
+ totalPage: 0,
+ value: "",
+ state:"",
+
+ }
+ },
+ mounted() {
+ //不显示时间框
+ this.$addStorageEvent(1, "timeShow", false);
+ this.fetchCnewContract(this.params.req, this.params.radius, this.page, this.limit)
+ },
+ methods: {
+
+ async fetchCnewContract(req, radius, page, limit,total) {
+ this.newContractLoading = true
+ const { data } = await this.$API.getNewContract(req, radius, page, limit,total)
+ this.newContractData = data.data.data
+
+ this.totalPage = data.data.totalPage
+ this.currentPage4 = page
+
+ this.newContractLoading = false
+ },
+
+ formatTime(time) {
+ let date = time.split("T")[0]
+ let hour = time.split("T")[1].split(".")[0]
+ return `${date} ${hour}`
+ },
+ //点击的改变页数
+ handleCurrentChange(value) {
+ this.page = value;
+ this.fetchCnewContract(this.params.req, this.params.radius, this.page, this.limit)
+ },
+ //改变每页条数
+ handleSizeChange(val) {
+ this.page = 1;
+ this.limit = val;
+ this.fetchCnewContract(this.params.req, this.params.radius, this.page, this.limit)
+
+ },
+ //双击表格单元格复制
+ cellDblclick(row, column, cell, event) {
+ if (event.type === "dblclick") {
+ var save = (e) => {
+ e.clipboardData.setData("text/plain", event.target.innerText);
+ e.preventDefault(); //阻止默认行为
+ };
+ document.addEventListener("copy", save);
+ document.execCommand("copy");
+ document.removeEventListener("copy", save);
+ }
+ this.$message({ message: this.$t(`home.copy`), type: "success" }); //加提示
+ },
+
+ //搜索框输入参数
+ handelSearch() {
+ this.page = 1;
+ this.fetchCnewContract(this.params.req, this.params.radius, this.page, this.limit, this.state)
+ // this.state = ""
+ },
+
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/newContract/index.vue b/yq/src/views/newContract/index.vue
new file mode 100644
index 0000000..068845f
--- /dev/null
+++ b/yq/src/views/newContract/index.vue
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`home.copyTabel`) }}
+
+
+
+
+
+
+ {{ formatTime(scope.row.date) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/noPage.vue b/yq/src/views/noPage.vue
new file mode 100644
index 0000000..6feccfd
--- /dev/null
+++ b/yq/src/views/noPage.vue
@@ -0,0 +1,233 @@
+
+
+
+
+
+
+ 404
+
+
+ {{ $t(message) }}
+
+
+ {{ $t(`home.noPage`) }}
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/nupl/index.js b/yq/src/views/nupl/index.js
new file mode 100644
index 0000000..af23456
--- /dev/null
+++ b/yq/src/views/nupl/index.js
@@ -0,0 +1,509 @@
+import * as echarts from "echarts";
+import { chartsWidth,dataLength, emptyData,handelProfitrate, fetchBtcPrice, handelZoom, handelWatermark, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ nuplLoading: false,
+ params: {
+ req: "nupl",
+ radius: "btc"
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: (value) => {
+ console.log(value, 99999);
+ let data
+ if (value >= 1000000000) {
+ data = `${(value / 1000000000).toFixed(2)}B`
+ } else if (value >= 1000000) {
+ data = `${(value / 1000000).toFixed(2)}M`
+ } else if (value >= 1000) {
+ log10
+ data = `${(value / 1000).toFixed(2)}K`
+ } else {
+ // let oldValue =( value+`` ).split(".")
+ // let num = (oldValue[1]+``).split("").length
+ // if ( value.toFixed(2) == 0||num >=4 ) {
+ // data =value.toFixed(4)
+ // }else{
+ // data = value
+ // }
+ data = value
+
+ }
+ return data
+ }
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ // min: "dataMin",
+ // max: "dataMax",
+ position: "right",
+ // axisLabel: {
+ // formatter: (value) => {
+ // console.log(value, 99999);
+ // let data
+ // if (value >= 1000000000) {
+ // data = `${(value / 1000000000).toFixed(2)}B`
+ // } else if (value >= 1000000) {
+ // data = `${(value / 1000000).toFixed(2)}M`
+ // } else if (value >= 1000) {
+ // log10
+ // data = `${(value / 1000).toFixed(2)}K`
+ // } else {
+ // // let oldValue =( value+`` ).split(".")
+ // // let num = (oldValue[1]+``).split("").length
+ // // if ( value.toFixed(2) == 0||num >=4 ) {
+ // // data =value.toFixed(4)
+ // // }else{
+ // // data = value
+ // // }
+ // data = value
+
+ // }
+ // return data
+ // }
+ // },
+ },
+ {
+ type: "value",
+ position: "right",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ axisLabel: {
+ formatter: (value) => {
+ console.log(value, 99999);
+ let data
+ if (value >= 1000000000) {
+ data = `${(value / 1000000000).toFixed(2)}B`
+ } else if (value >= 1000000) {
+ data = `${(value / 1000000).toFixed(2)}M`
+ } else if (value >= 1000) {
+ log10
+ data = `${(value / 1000).toFixed(2)}K`
+ } else {
+ // let oldValue =( value+`` ).split(".")
+ // let num = (oldValue[1]+``).split("").length
+ // if ( value.toFixed(2) == 0||num >=4 ) {
+ // data =value.toFixed(4)
+ // }else{
+ // data = value
+ // }
+ data = value
+
+ }
+ return data
+ }
+ },
+ },
+ // {
+ // type: "value",
+ // // boundaryGap: [0, "100%"],
+ // min: "dataMin",
+ // max: "dataMax",
+ // show: false,
+ // },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Net Unrealized Profit/Loss",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ markLine: {
+ symbol: ["none", "none"], //去掉箭头
+ itemStyle: {
+ normal: {
+ lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ },
+ },
+ // lineStyle:{
+ // color:"red"
+ // },
+
+ label: {
+ formatter: "{b}",
+ fontSize: 10,
+ color: "rgba(0,0,0,0.8)",
+ align: "left",
+ },
+ data: [
+ {
+ name: "$0.02",
+ yAxis: 0.02,
+ },
+ {
+ name: "$0.06",
+ yAxis: 0.06,
+ },
+ {
+ name: "$0.1",
+ yAxis: 0.1,
+ },
+ {
+ name: "$0.4",
+ yAxis: 0.4,
+ },
+ {
+ name: "$0.8",
+ yAxis: 0.8,
+ },
+ {
+ name: "$2",
+ yAxis: 2,
+ },
+ {
+ name: "$6",
+ yAxis: 6,
+ },
+ {
+ name: "$10",
+ yAxis: 10,
+ },
+ {
+ name: "$40",
+ yAxis: 40,
+ },
+ {
+ name: "$80",
+ yAxis: 80,
+ },
+ // {
+ // name: "$120",
+ // yAxis: 120,
+ // },
+ {
+ name: "$160",
+ yAxis: 160,
+ },
+ // {
+ // name: "$200",
+ // yAxis: 200,
+ // },
+ {
+ name: "$240",
+ yAxis: 240,
+ },
+ {
+ name: "$300",
+ yAxis: 300,
+ },
+ {
+ name: "$500",
+ yAxis: 500,
+ },
+ {
+ name: "$700",
+ yAxis: 700,
+ },
+ {
+ name: "$900",
+ yAxis: 900,
+ },
+ {
+ name: "$1100",
+ yAxis: 1100,
+ },
+ // {
+ // name: "$1200",
+ // yAxis: 1200,
+ // },
+ {
+ name: "$1800",
+ yAxis: 1800,
+ },
+ {
+ name: "$3000",
+ yAxis: 3000,
+ },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+ {
+ name: "$70W",
+ yAxis: 700000,
+ },
+ {
+ name: "$40W",
+ yAxis: 400000,
+ },
+
+ {
+ name: "$10W",
+ yAxis: 100000,
+ },
+ {
+ name: "$100W",
+ yAxis: 1000000,
+ // position: ['100%', '50'],
+ },
+ {
+ name: "$120W",
+ yAxis: 1200000,
+ },
+
+ {
+ name: "$140W",
+ yAxis: 1400000,
+ },
+ ],
+ },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 2,
+ // data: [],
+ // },
+
+ ],
+ },
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+ this.fetchNupl(this.params.req, this.params.radius)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("nuplBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("nuplBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchNupl(req, radius, start, end, sma) {
+ this.nuplLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+ let nuplData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.nuplLoading = false
+ return
+ }
+ this.start = nuplData[0].date.split("T")[0]
+ this.end = nuplData[nuplData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ //渲染ETH
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+ let nuplValueList = []
+
+ nuplData.forEach(item => {
+
+ nuplValueList.push(Number(item.value.toFixed(2)))
+
+
+ })
+ this.option.series[0].data = handelProfitrate(nuplData, nuplValueList)
+
+
+ this.inCharts()
+ console.log(this.option);
+ this.nuplLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchNupl(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.sma = smaDataList
+ this.fetchNupl(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/nupl/index.vue b/yq/src/views/nupl/index.vue
new file mode 100644
index 0000000..edebf6e
--- /dev/null
+++ b/yq/src/views/nupl/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/nuplEth/index.js b/yq/src/views/nuplEth/index.js
new file mode 100644
index 0000000..5769b04
--- /dev/null
+++ b/yq/src/views/nuplEth/index.js
@@ -0,0 +1,352 @@
+import * as echarts from "echarts";
+import { getNuplEth, } from "../../api/pages"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ nuplEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}% `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Net Unrealized Profit/Loss",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchnuplEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("nuplEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("nuplEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchnuplEth(params) {
+ this.nuplEthLoading = true
+ const { data } = await getNuplEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.nuplEthLoading = false
+ return
+ }
+ let nuplEthData = data.data
+ this.start = nuplEthData[0].date.split("T")[0]
+ this.end = nuplEthData[nuplEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ nuplEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(nuplEthData, ValueList)
+
+ this.inCharts()
+
+ this.nuplEthLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchnuplEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchnuplEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/nuplEth/index.vue b/yq/src/views/nuplEth/index.vue
new file mode 100644
index 0000000..a08c223
--- /dev/null
+++ b/yq/src/views/nuplEth/index.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/nvtRatio/index.js b/yq/src/views/nvtRatio/index.js
new file mode 100644
index 0000000..a349c17
--- /dev/null
+++ b/yq/src/views/nvtRatio/index.js
@@ -0,0 +1,327 @@
+import * as echarts from "echarts";
+import { fetchNvtRatio } from "../../api/apiPost"
+import { chartsWidth,emptyData, dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ nvtRatioLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "NVT Ratio",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ this.fetchNvtRatio(this.params.req, this.params.radius)
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("nvtRatioBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("nvtRatioBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchNvtRatio(params) {
+ this.nvtRatioLoading = true
+ const { data } = await fetchNvtRatio(params)
+
+ let nvtRatioData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.nvtRatioLoading = false
+ return
+ }
+ this.start = nvtRatioData[0].date.split("T")[0]
+ this.end = nvtRatioData[nvtRatioData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ let profitValueList = []
+
+
+ nvtRatioData.forEach(item => {
+
+ profitValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(nvtRatioData, profitValueList)
+
+
+
+ this.inCharts()
+ this.nvtRatioLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchNvtRatio(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/nvtRatio/index.vue b/yq/src/views/nvtRatio/index.vue
new file mode 100644
index 0000000..7dd6b7f
--- /dev/null
+++ b/yq/src/views/nvtRatio/index.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/nvtRatioEth/index.js b/yq/src/views/nvtRatioEth/index.js
new file mode 100644
index 0000000..c9d8bb0
--- /dev/null
+++ b/yq/src/views/nvtRatioEth/index.js
@@ -0,0 +1,350 @@
+import * as echarts from "echarts";
+import { getNvtRatioEth, } from "../../api/pages"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ nvtRatioEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}% `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Network Value to Transactions Ratio",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchnvtRatioEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("nvtRatioEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("nvtRatioEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchnvtRatioEth(params) {
+ this.nvtRatioEthLoading = true
+ const { data } = await getNvtRatioEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.nvtRatioEthLoading = false
+ return
+ }
+ let nvtRatioEthData = data.data
+ this.start = nvtRatioEthData[0].date.split("T")[0]
+ this.end = nvtRatioEthData[nvtRatioEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ nvtRatioEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(nvtRatioEthData, ValueList)
+
+ this.inCharts()
+
+ this.nvtRatioEthLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchnvtRatioEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchnvtRatioEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/nvtRatioEth/index.vue b/yq/src/views/nvtRatioEth/index.vue
new file mode 100644
index 0000000..ea1ed5b
--- /dev/null
+++ b/yq/src/views/nvtRatioEth/index.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/nvtSign/index.js b/yq/src/views/nvtSign/index.js
new file mode 100644
index 0000000..f4f28dc
--- /dev/null
+++ b/yq/src/views/nvtSign/index.js
@@ -0,0 +1,329 @@
+import * as echarts from "echarts";
+import { getNvtSign } from "../../api/apiPost"
+import { chartsWidth,dataLength, emptyData,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ nvtSignLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Network Value to Transactions Signal",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ this.fetchNvtSign()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("nvtSignBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+ chartsWidth("nvtSignBox", this);
+ this.myChart.setOption(this.option);
+
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchNvtSign(params) {
+ this.nvtSignLoading = true
+ const { data } = await getNvtSign(params)
+
+ let nvtSignData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.nvtSignLoading = false
+ return
+ }
+ this.start = nvtSignData[0].date.split("T")[0]
+ this.end = nvtSignData[nvtSignData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // //移动平均线没值 才渲染正常价格数据
+ // if (this.start && !this.fatherSmaData[0]) {
+ // this.handelSonBtcPrice("BTC", true)
+ // }
+ // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // if (this.fatherSmaData[0] && this.start) {
+ // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ // }
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH",this.ethFlag)
+ // }
+ // })
+
+
+ this.handelSonBtcPrice("BTC", true)
+ let ValueList = []
+
+
+ nvtSignData.forEach(item => {
+
+ ValueList.push(Number(item.value.toFixed(8)))
+ })
+
+ this.option.series[0].data = handelProfitrate(nvtSignData, ValueList)
+
+
+
+ this.inCharts()
+ this.nvtSignLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchNvtSign(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/nvtSign/index.vue b/yq/src/views/nvtSign/index.vue
new file mode 100644
index 0000000..b3a20e0
--- /dev/null
+++ b/yq/src/views/nvtSign/index.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/openInterest/index.js b/yq/src/views/openInterest/index.js
new file mode 100644
index 0000000..488dccc
--- /dev/null
+++ b/yq/src/views/openInterest/index.js
@@ -0,0 +1,366 @@
+import * as echarts from "echarts";
+import { getOpenInterest } from "../../api/pages"
+import { chartsWidth, emptyData, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ openInterestLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "number of open interest",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 1,
+ // data: [],
+
+
+ // },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: "",
+ symbol: "BTCUSDT"
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ tableLoading: false,
+ totalPage: 0,
+ currentPage4: 1,
+ tableData: [],
+ symbolList: [{
+ value: "BTCUSDT",
+ label: "BTCUSDT"
+ },
+ {
+ value: "ETHUSDT",
+ label: "ETHUSDT"
+ }],
+ value: ""
+
+
+ }
+ },
+ mounted() {
+
+ this.handelTime()
+ this.fetchMpenInterest(this.params)
+
+ //禁用时间框
+ // this.$addStorageEvent(1, "timeShow", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("openInterestBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("openInterestBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchMpenInterest(params) {
+ this.openInterestLoading = true
+ const { data } = await getOpenInterest(params)
+ let openInterestData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.openInterestLoading = false
+ return
+ }
+ this.start = openInterestData[0].date.split("T")[0]
+ this.end = openInterestData[openInterestData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+ // })
+ let ValueList = []
+
+ this.option.xAxis.data = []
+ openInterestData.forEach(item => {
+ this.option.xAxis.data.push(`${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`)
+ ValueList.push(Number(item.value.toFixed(2)))
+
+
+ })
+
+ this.option.series[0].data = ValueList
+
+ console.log(this.option);
+ this.inCharts()
+ this.openInterestLoading = false
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+
+ if (!this.params.start) {
+ this.handelTime()
+ }
+ this.fetchMpenInterest(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchMpenInterest(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+
+
+ },
+
+ //下拉选择框
+ handelChang() {
+
+ this.fetchMpenInterest(this.params)
+ },
+ handelTime() {
+ let start = new Date();
+
+ start.setMonth(start.getMonth() - 1);//当前时间减去一个月
+
+ // 提取年、月和日
+ const year = start.getFullYear();
+ const month = String(start.getMonth() + 1).padStart(2, '0');
+ const day = String(start.getDate()).padStart(2, '0');
+ const formattedDate = `${year}-${month}-${day}`;
+
+ this.params.start = formattedDate
+ }
+
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/openInterest/index.vue b/yq/src/views/openInterest/index.vue
new file mode 100644
index 0000000..ceb0ad5
--- /dev/null
+++ b/yq/src/views/openInterest/index.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/openInterestETH/index.js b/yq/src/views/openInterestETH/index.js
new file mode 100644
index 0000000..1a332e1
--- /dev/null
+++ b/yq/src/views/openInterestETH/index.js
@@ -0,0 +1,348 @@
+import * as echarts from "echarts";
+import { getOpenInterest } from "../../api/pages"
+import { chartsWidth, emptyData,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ openInterestLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "number of open interest",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 1,
+ // data: [],
+
+
+ // },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: "",
+ symbol: "ETHUSDT"
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ tableLoading: false,
+ totalPage: 0,
+ currentPage4: 1,
+ tableData: [],
+ symbolList: [{
+ value: "BTCUSDT",
+ label: "BTCUSDT"
+ },
+ {
+ value: "ETHUSDT",
+ label: "ETHUSDT"
+ }],
+ value: ""
+
+
+ }
+ },
+ mounted() {
+ this.fetchMpenInterest(this.params)
+
+ //禁用时间框
+ // this.$addStorageEvent(1, "timeShow", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("openInterestBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("openInterestBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchMpenInterest(params) {
+ this.openInterestLoading = true
+ const { data } = await getOpenInterest(params)
+ let openInterestData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.openInterestLoading = false
+ return
+ }
+
+ this.start = openInterestData[0].date.split("T")[0]
+ this.end = openInterestData[openInterestData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+ // })
+ let ValueList = []
+
+ this.option.xAxis.data = []
+ openInterestData.forEach(item => {
+ this.option.xAxis.data.push(`${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`)
+ ValueList.push(Number(item.value.toFixed(2)))
+
+
+ })
+
+ this.option.series[0].data = ValueList
+
+ console.log(this.option);
+ this.inCharts()
+ this.openInterestLoading = false
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchMpenInterest(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchMpenInterest(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+
+
+ },
+
+ //下拉选择框
+ handelChang() {
+
+ this.fetchMpenInterest(this.params)
+ },
+
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/openInterestETH/index.vue b/yq/src/views/openInterestETH/index.vue
new file mode 100644
index 0000000..8a57a87
--- /dev/null
+++ b/yq/src/views/openInterestETH/index.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/payHistories/index.js b/yq/src/views/payHistories/index.js
new file mode 100644
index 0000000..5a12216
--- /dev/null
+++ b/yq/src/views/payHistories/index.js
@@ -0,0 +1,99 @@
+import * as echarts from "echarts";
+import { msgBoradTabel, msgBoradNum, responMsg } from "../../api/messageBoard"
+import { privateOrder } from "../../api/pay"
+import { Debounce } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ from: [{
+ id: 0,
+ userDate: "",
+ userName: "",
+ msgPage: "",
+ userMsg: ""
+
+
+ }],
+ successData:[{
+ id: 0,
+ userDate: "",
+ userName: "",
+ msgPage: "",
+ userMsg: ""
+
+
+ }],
+ failData:[{
+ id: 0,
+ userDate: "",
+ userName: "",
+ msgPage: "",
+ userMsg: ""
+
+
+ }],
+ params: {
+ page: 1,
+ limit: "300",
+ status: ""
+ },
+ payHistories: false,
+ activeName:"pending",
+
+
+ }
+ },
+ mounted() {
+ this.params.status=2
+ this.fetchPrivateOrder2(this.params)
+ this.params.status=0
+ this.fetchPrivateOrder0(this.params)
+ this.params.status=1
+ this.fetchPrivateOrder1(this.params)
+ },
+ methods: {
+
+ //请求支付历史 待处理
+ async fetchPrivateOrder2(params) {
+ this.payHistories = true
+ const { data } = await privateOrder(params)
+ this.from = data.rows
+ this.payHistories = false
+
+ },
+ //请求支付历史 成功
+ async fetchPrivateOrder1(params) {
+ this.payHistories = true
+ const { data } = await privateOrder(params)
+ this.successData = data.rows
+ this.payHistories = false
+
+ },
+ //请求支付历史 失败
+ async fetchPrivateOrder0(params) {
+ this.payHistories = true
+ const { data } = await privateOrder(params)
+ this.failData = data.rows
+ this.payHistories = false
+
+ },
+ handelTime(time) {
+ if (time) {
+ return `${time.split("T")[0]} ${time.split("T")[1].split(".")[0]}`
+ }
+ },
+
+
+ //点击刷新
+ handelRefresh: Debounce(function () {
+ this.params.status=2
+ this.fetchPrivateOrder2(this.params)
+ this.params.status=0
+ this.fetchPrivateOrder0(this.params)
+ this.params.status=1
+ this.fetchPrivateOrder1(this.params)
+ }, 1000)
+
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/payHistories/index.vue b/yq/src/views/payHistories/index.vue
new file mode 100644
index 0000000..bc6613a
--- /dev/null
+++ b/yq/src/views/payHistories/index.vue
@@ -0,0 +1,233 @@
+
+
+
+
+
+
+
{{$t(`login.payHistories`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ handelTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ handelTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ handelTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/payManagement/index.js b/yq/src/views/payManagement/index.js
new file mode 100644
index 0000000..65953c2
--- /dev/null
+++ b/yq/src/views/payManagement/index.js
@@ -0,0 +1,145 @@
+import * as echarts from "echarts";
+import { msgBoradTabel, msgBoradNum, responMsg } from "../../api/messageBoard"
+export default {
+ data() {
+ return {
+ from: [{
+ id: 0,
+ userDate: "",
+ userName: "",
+ msgPage: "",
+ userMsg: ""
+ }],
+ time: "",
+ productList: [{
+ num: 46846,
+ label: "今日转账用户数"
+
+ }, {
+ num: 46846,
+ label: "今日转账金额"
+
+ }, {
+ num: 46846,
+ label: "目前总转账次数"
+
+ }, {
+ num: 46846,
+ label: "目前总转账金额"
+
+ }, {
+ num: 46846,
+ label: "今日消费用户数"
+
+ }, {
+ num: 46846,
+ label: "今日消费金额"
+
+ }, {
+ num: 46846,
+ label: "目前总消费次数"
+
+ },
+ {
+ num: 46846,
+ label: "目前总消费金额"
+
+ },
+ {
+ num: 46846,
+ label: "今日提现用户数"
+
+ },
+ {
+ num: 46846,
+ label: "今日提现金额"
+
+ },{
+ num: 46846,
+ label: "目前总提现次数"
+
+ },
+ {
+ num: 46846,
+ label: "目前总提现金额"
+
+ },
+ {
+ num: 46846,
+ label: "L2等级用户总数"
+
+ },
+ {
+ num: 46846,
+ label: "L3等级用户总数"
+
+ },
+ {
+ num: 46846,
+ label: "L4等级用户总数"
+
+ },
+ {
+ num: 46846,
+ label: "VIP用户总数"
+
+ },
+ ]
+
+
+
+ }
+ },
+ mounted() {
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ this.myChart = echarts.init(document.getElementById("MessageBoardBox"));
+
+ this.myChart.setOption(this.option);
+
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ //tabel表格数据请求//未处理
+ async fetchMsgBoradTabe0(data) {
+ const list = await msgBoradTabel(data)
+
+ },
+ //已处理
+ async fetchMsgBoradTabel1(data) {
+ const list = await msgBoradTabel(data)
+ },
+ //所有留言
+ async fetchMsgBoradTabel2(data) {
+ const list = await msgBoradTabel(data)
+ },
+ //回复留言
+ async fetchResponMsg(data) {
+ const list = await responMsg(data);
+ },
+
+ //留言数量请求
+ async fetchMsgBoradNum(data) {
+ const list = await msgBoradNum(data)
+ },
+ //点击未处理留言的回复
+ clickRow(a, b) {
+ //每一行的ID
+ this.submitReply.msg_id = b[a].id
+
+ this.dialogFormVisible = true
+ // console.log(a,b,6666666);
+ },
+ //确定提交回复
+ handelSubmitReply() {
+
+ this.fetchResponMsg(this.submitReply)
+ this.dialogFormVisible = false
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/payManagement/index.vue b/yq/src/views/payManagement/index.vue
new file mode 100644
index 0000000..72e97e3
--- /dev/null
+++ b/yq/src/views/payManagement/index.vue
@@ -0,0 +1,236 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ item.num }}
+
{{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`pay.chart`)}}
+
+
+
+
+
+
+
+
+
+
+ 图表
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/personal/index.js b/yq/src/views/personal/index.js
new file mode 100644
index 0000000..6a70780
--- /dev/null
+++ b/yq/src/views/personal/index.js
@@ -0,0 +1,634 @@
+import { mapState } from "vuex";
+import { POST, Delete } from "../../api/http";
+import { getPrivateMsg } from "../../api/messageBoard"
+import { $addStorageEvent } from '../../util/processingData'
+import { getPrivateTicket, getReadTicket, GetUserAccount } from "../../api/help"
+export default {
+ data() {
+ return {
+ personalLoading: true,
+ personalList: {},
+ tableShow: false,
+ workorderShow: false,
+ title: "login.set",//设置按钮
+ modifyShow: false,
+ ConfirmNewPassword: "",
+ dialogNewPassword: false,
+ passwordForm: {
+ oldPassword: "",
+ email: "",
+ password: "",
+ resetPwdCode: "",
+ },
+ dialogPasswordVisible: false,
+ passwordCode: {
+ email: "",
+ },
+ dialogEmailVisible: false,
+ resetEmail: {
+ oldEmail: "",
+ resetPwdCode: "",
+ password: "",
+ },
+ resetNewEmail: {
+ newEmail: "",
+ code: "",
+ },
+ buttonLoading: false,
+ tableData0: [],
+ emailWarningShow: false,
+ codeWarningShow: false,
+ roleName: "",
+ accountLevelList: [
+ // {
+ // id:"registered",
+ // label:"注册用户",
+ // charges:"$0",
+ // },
+ {//月度付费用户
+ id: "advance",
+ label: "login.monthlyPlay",
+ charges: "10(USDT、USDC、BUSD)",
+ amount: "10",
+ value: 0,
+ level:"L3",
+ disabledValue:1,
+ },
+ {//年度付费用户
+ id: "advance",
+ label: "login.yearsPlay",
+ charges: "100(USDT、USDC、BUSD)",
+ amount: "100",
+ value: 1,
+ level:"L3",
+ disabledValue:1,
+ },
+ {//vip年度付费用户
+ id: "vip",
+ label: "login.vipYearsPlay",
+ charges: "500(USDT、USDC、BUSD)",
+ amount: "500",
+ value: 2,
+ level:"L4",
+ disabledValue:2,
+ },
+
+ ],
+ activeName: "first1",
+ dialogNewEmailVisible: false,
+ tabelMsg: {//未读留言标签的数据
+ status: 0
+ },
+ tableData1: [],
+ tableData: [],
+ tableData2: [],
+ BTCMenu: [],
+ ETHmenu: [],
+ stableMenu: [],
+ unreadNum: "",//未读留言数量
+ //历史工单列表
+ privateTicket: [{
+ id: 1,
+ time: "2022-09-01 16:00",
+ type: "账户问题",
+ title: "账户不能登录",
+ status: "已解决",
+ userName: "",//用户名
+ date: "",//提交时间戳
+ }],
+ //已回复未读
+ privateTicket1: [
+ // {
+ // id: 1,
+ // time: "2022-09-01 16:00",
+ // type: "账户问题",
+ // title: "账户不能登录",
+ // status: "已解决",
+ // userName: "",//用户名
+ // date: "",//提交时间戳
+ // }
+
+
+ ],
+ //已处理
+ privateTicket2: [{
+ id: 1,
+ time: "2022-09-01 16:00",
+ type: "账户问题",
+ title: "账户不能登录",
+ status: "已解决",
+ userName: "",//用户名
+ date: "",//提交时间戳
+ }],
+ //已关闭
+ privateTicket12: [{
+ id: 1,
+ time: "2022-09-01 16:00",
+ type: "账户问题",
+ title: "账户不能登录",
+ status: "已解决",
+ userName: "",//用户名
+ date: "",//提交时间戳
+ }],
+ dialogVisible: false,
+ WithdrawalList: {
+ amount: "",
+ emailCode: "",
+
+ },
+ options: [{
+ value: 'USDT',
+ label: 'USDT'
+ }, {
+ value: 'USDC',
+ label: 'USDC'
+ }, {
+ value: 'BUSD',
+ label: 'BUSD'
+ }],
+ value: "",
+ codeBtn: {
+ btnStatus: false,
+ btnText: "login.getCode",
+ btnType: "primary",
+ },
+ fraction: 3,
+ max: 1,
+ max1: 2,
+ fraction1: 3,
+ max2: 3,
+ fraction2: 3,
+ balances: {
+ total: "",
+ usdc: "",
+ usdt: "",
+ userId: "",
+ userName: ""
+
+ },
+ role: {
+ level: "",
+ levelExpireDate: "",
+ roleId: "",
+ roleKey: "",
+ roleName: "",
+ },
+ bthDisabled:"",
+ level:""
+
+
+ }
+ },
+
+ mounted() {
+
+ console.log("更新检查");
+ this.fetchPersonal()
+ this.fetchPrivateTicket()
+ this.fetchPrivateTicket4({ status: 4 })
+ this.fetchPrivateTicket5({ status: 5 })
+ this.fetchPrivateTicket12({ status: 12 })
+ this.BTCMenu = JSON.parse(localStorage.getItem("BTCMenu"));
+ this.ETHmenu = JSON.parse(localStorage.getItem("ETHmenu"));
+ this.stableMenu = JSON.parse(localStorage.getItem("stableMenu"));
+ //监听localstorage改变赋值
+ window.addEventListener("setItem", () => {
+ this.BTCMenu = JSON.parse(localStorage.getItem("BTCMenu"));
+ this.ETHmenu = JSON.parse(localStorage.getItem("ETHmenu"));
+ this.stableMenu = JSON.parse(localStorage.getItem("stableMenu"));
+ });
+ this.activeName=sessionStorage.getItem("personalActiveName")
+ this.handelMenu(this.BTCMenu)
+ this.fetchPrivateMsg0({ status: 0 }) //拿到未读留言数量
+ this.fetchPrivateTicket5({ status: 5 })//拿到未读工单数量、
+ this.fetchUserAccount() //查询账户余额
+ console.log(this.activeName,"科技破防卡佛");
+ if (!this.activeName) {
+ this.activeName = `first1`
+ }
+
+ },
+ methods: {
+
+ //请求当前余额
+ async fetchUserAccount(params) {
+ const { data } = await GetUserAccount(params)
+ this.balances = data.data
+
+ },
+
+ //请求未读留言标签数据 未处理留言
+ async fetchPrivateMsg0(data) {
+ const list = await getPrivateMsg(data)
+ this.tableData0 = list.data.data.data
+ this.tableData0.forEach(item => {
+ item.userDate = `${item.userDate.split("T")[0]} ${item.userDate.split("T")[1].split(".")[0]}`
+ })
+
+ this.unreadNum = this.tableData0.length
+
+
+ },
+ //已处理留言
+ async fetchPrivateMsg1(data) {
+ const list = await getPrivateMsg(data)
+ this.tableData1 = list.data.data.data
+ this.tableData1.forEach(item => {
+ item.userDate = `${item.userDate.split("T")[0]} ${item.userDate.split("T")[1].split(".")[0]}`
+ })
+ },
+ //所有留言
+ async fetchPrivateMsg2(data) {
+ const list = await getPrivateMsg(data)
+ this.tableData2 = list.data.data.data
+ this.tableData2.forEach(item => {
+ item.userDate = `${item.userDate.split("T")[0]} ${item.userDate.split("T")[1].split(".")[0]}`
+ })
+ },
+ //请求个人资料
+ async fetchPersonal() {
+ this.personalLoading = true
+ const { data } = await this.$API.getpersonal()
+ this.personalList = data.data
+
+ this.roleName = data.data.role.roleName
+ this.level =data.data.role.level
+ //判断等级 禁用相应按钮
+
+ if (data.data.role.roleName == "月度付费用户") {
+ this.bthDisabled = 0
+ }else if(data.data.role.roleName == "年度付费用户"){
+ this.bthDisabled = 1
+ }else if(this.level== "L4"){
+ this.bthDisabled = 2
+ }else if(this.level== "L2" || this.level== "L1"){
+ this.bthDisabled = -1
+ }else{
+ this.bthDisabled = 10
+ }
+
+
+
+
+
+
+
+
+ this.role = data.data.role
+ if (this.role.levelExpireDate) {
+ this.role.levelExpireDate = `${this.role.levelExpireDate.split(`T`)[0]} ${this.role.levelExpireDate.split(`T`)[1].split(`.`)[0]}`
+
+ }
+ this.personalList.loginDate = `${this.personalList.loginDate.split("T")[0]} ${this.personalList.loginDate.split("T")[1].split(".")[0]}`
+ if (this.personalList.sex == "0") {
+ this.personalList.sex = "男"
+ } else if (this.personalList.sex == "1") {
+ this.personalList.sex = "女"
+ }
+
+ this.passwordForm.email = this.personalList.email
+ this.resetEmail.oldEmail = this.personalList.email
+ this.personalLoading = false
+
+
+ },
+ //请求个人已提交工单列表 历史
+ async fetchPrivateTicket(data) {
+ const list = await getPrivateTicket(data)
+ this.privateTicket = list.data.data
+ this.privateTicket.forEach(item => {
+ item.date = `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ })
+ console.log(list, "已提交工单列表");
+ },
+ //请求已回复未读
+ async fetchPrivateTicket5(data) {
+ const list = await getPrivateTicket(data)
+ this.privateTicket1 = list.data.data
+ this.privateTicket1.forEach(item => {
+ item.date = `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ })
+ console.log(list, "已回复未读");
+
+ },
+ //请求已处理工单列表
+ async fetchPrivateTicket4(data) {
+ const list = await getPrivateTicket(data)
+ this.privateTicket2 = list.data.data
+ this.privateTicket2.forEach(item => {
+ item.date = `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ })
+ console.log(list, "已处理工单列表");
+
+ },
+ //请求已关闭工单列表
+ async fetchPrivateTicket12(data) {
+ const list = await getPrivateTicket(data)
+ this.privateTicket12 = list.data.data
+ this.privateTicket12.forEach(item => {
+ item.date = `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ })
+ console.log(list, "请求已关闭工单列表");
+
+ },
+
+
+ //请求已回复未读工单更改状态
+ async fetchReadTicket(data) {
+ const list = await getReadTicket(data)
+
+ },
+ //点击查看工单汇总标签
+ handelSetPersonal() {
+ this.title = "修改资料"
+ this.modifyShow = true
+ },
+ //点击修改密码
+ handelPassword() {
+ this.dialogPasswordVisible = true
+ },
+ //调用登出接口
+ async handelDeleter(address, data) {
+ let list = await Delete(address);
+ this.$addStorageEvent(1, "maskShow", false);
+ },
+ //请求重置密码验证码
+ async fetchPasswordCode(address, email) {
+ this.buttonLoading = true
+ let list = await POST(address, email);
+ // let list = await this.$API.getpasswrodCode()
+ if (list.data.code == 200) {
+ this.$message({
+ message: this.$t(`login.sendEmailCode`),
+ type: "warning",
+ customClass: "messageClass"
+ });
+ this.dialogNewPassword = true;
+ this.dialogPasswordVisible = false;
+ } else {
+ this.$message({
+ message: this.$t(`login.newPasswordCodeFail`),
+ type: "warning",
+ customClass: "messageClass"
+ });
+ this.dialogNewPassword = false;
+ this.dialogPasswordVisible = true;
+ }
+
+ this.buttonLoading = false
+ },
+ //请求重置密码
+ async fetchNewPassword(address, data) {
+ let list = await POST(address, data);
+ // let list = await this.$API.getpasswrodCode()
+ if (list.data.code == 200) {
+ this.$message({
+ message: this.$t(`login.newPasswordSuccess`),
+ type: "warning",
+ customClass: "messageClass"
+
+ });
+ //输入新密码弹窗隐藏 显示登录弹窗
+ this.dialogNewPassword = false;
+ this.dialogLoginVisible = true;
+ this.passwordForm.email = "";
+ this.passwordForm.password = "";
+ this.passwordForm.resetPwdCode = "";
+ this.handelDeleter("/auth/logout"); //重置成功退出账户 重新登陆
+ this.$addStorageEvent(1, "token", "");
+ localStorage.setItem("identity", JSON.stringify({}))
+ this.$addStorageEvent(1, "permissionMask", JSON.stringify(false))
+
+ // this.dialogPasswordVisible = false;
+ } else {
+ // this.$message({
+ // message: this.$t(`login.newPasswordCodeFail`),
+ // type: "warning",
+ // });
+ this.dialogNewPassword = true;
+ }
+ },
+ //点击获取重置密码验证码 旧邮箱
+ handelResetPasswordEmail() {
+ this.buttonLoading = true
+ if (!this.passwordForm.email) return;
+ this.passwordCode.email = this.passwordForm.email;
+ this.fetchPasswordCode(`/auth/resetPwdCode`, this.passwordCode);
+ this.buttonLoading = false
+
+ },
+ //获取邮箱验证码的弹窗关闭的回调
+ handelClose() {
+
+ this.buttonLoading = false
+ },
+ //输入新密码,确认重置密码
+ handelNewPassword() {
+ // 验证两次密码是否一致
+ if (this.passwordForm.password !== this.ConfirmNewPassword) {
+ this.$message({
+ message: this.$t(`login.inconsistency`),
+ type: "warning",
+ customClass: "messageClass"
+ });
+ return;
+ }
+ if (!this.passwordForm.resetPwdCode) {
+ this.$message({
+ message: this.$t(`login.CodeFailNull`),
+ type: "warning",
+ customClass: "messageClass"
+ });
+ return;
+ }
+ this.fetchNewPassword("/auth/resetPwd", this.passwordForm);
+ },
+ //点击修改邮箱
+ handelModifyEmail() {
+ this.dialogEmailVisible = true
+ },
+ //提交验证旧邮箱验证码
+ handelOldEmail() {
+ if (!this.resetEmail.oldEmail) {
+ this.emailWarningShow = true
+ }
+ if (!this.resetEmail.resetPwdCode) {
+ this.codeWarningShow = true
+ }
+ //填写新邮箱框展示
+ this.dialogNewEmailVisible = true
+ this.dialogEmailVisible = false
+
+ },
+ //邮箱地址输入失焦就请求发送邮箱验证码
+ handelFocus() {
+
+ },
+ //重置邮箱弹窗关闭
+ handelResetEmailClose() {
+
+ this.emailWarningShow = false
+ this.codeWarningShow = false
+ },
+ handelNewEmail() {
+
+ },
+
+ //点击标签页
+ handleClick(tab, event) {
+ // console.log(tab);
+ sessionStorage.setItem("personalActiveName", tab.name);
+ switch (tab.name) {
+ case "second"://点击未读留言标签 请求未读留言数据
+ this.fetchPrivateMsg0({ status: 0 })
+ this.fetchPrivateMsg1({ status: 1 })
+ this.fetchPrivateMsg2({ status: 2 })
+ break;
+ case "third"://点击未读工单汇总 请求
+ this.fetchPrivateTicket()
+ this.fetchPrivateTicket4({ status: 4 })
+ this.fetchPrivateTicket5({ status: 5 })
+ this.fetchPrivateTicket12({ status: 12 })
+ break;
+
+ default:
+ break;
+ }
+ },
+
+ //点击未读留言列表的某一行 跳转对应页面
+ handelClickRow(row, column, event) {
+ let obj = row
+ if (this.$route.path !== "/") {
+ this.$router.push({
+ path: "/",
+ // query: { res: params },
+ });
+ }
+
+ let params
+ //根据币种筛选不同导航数据对象
+ switch (obj.coinType) {
+ case "BTC":
+ params = this.handelMenu(this.BTCMenu, obj.msgPage)
+ this.$addStorageEvent(1, "radiusSrc", JSON.stringify(`https://studio.glassnode.com/images/crypto-icons/btc.png`));
+ this.$addStorageEvent(1, "radius", `BTC`);
+ break;
+ case "ETH":
+
+ params = this.handelMenu(this.ETHmenu, obj.msgPage)
+ console.log(params, "跳转ETH");
+ this.$addStorageEvent(1, "radiusSrc", JSON.stringify(`https://studio.glassnode.com/images/crypto-icons/eth.png`));
+ this.$addStorageEvent(1, "radius", `ETH`);
+ this.$addStorageEvent(1, "btcFlag", false);
+
+ break;
+ case "稳定币":
+ params = this.handelMenu(this.stableMenu, obj.msgPage)
+ this.$addStorageEvent(1, "radiusSrc", JSON.stringify(`https://studio.glassnode.com/images/crypto-icons/稳定币.png`));
+ this.$addStorageEvent(1, "radius", `稳定币`);
+ break;
+
+ default:
+ break;
+ }
+
+
+
+ //存数据到VUX
+ this.$store.commit("selectMenu", params);
+ this.$addStorageEvent(1, "show", "component");
+ this.$addStorageEvent(1, "currentTabComponent", params.navigation);//组件名称 、open、币种
+ // this.$addStorageEvent(1, "params", JSON.stringify(params));
+ this.$addStorageEvent(1, "open", params.id);
+ this.$addStorageEvent(1, "introduce", params.introduce);
+ this.$addStorageEvent(1, "interval", params.interval);
+ //存入每个页面在导航显示的名称
+ this.$addStorageEvent(1, "navName", JSON.stringify(params.label));
+
+
+
+
+
+ },
+ //点击已回复未读工单的某一行
+ handelPrivateTicket1Row(row) {
+ this.$addStorageEvent(1, "detailsID", row.id);
+ this.$router.push({
+ path: "/WorkOrderDetails",
+ name: "WorkOrderDetails",
+ params: row
+ })
+ this.fetchReadTicket({ id: row.id })//跳转工单详情页面 改变状态
+ },
+ //点击除了已回复未读工单的某一行
+ handelPrivateTicket1Row2(row) {
+ this.$addStorageEvent(1, "detailsID", row.id);
+ this.$router.push({
+ path: "/WorkOrderDetails",
+ name: "WorkOrderDetails",
+ params: row
+ })
+
+ },
+ //处理页面名称显示
+ formatPage(data) {
+
+ return this.$t(data)
+ },
+ //根据点击的表格找到页面的obj
+ handelMenu(data, label) {
+ let menuObj
+ let page = label
+ let newMenu = []
+ data.forEach(item => {
+ newMenu.push(item.children)
+ })
+ let subMenu = []
+ newMenu.forEach(item => {
+
+ item.forEach(subItem => {
+ if (subItem.children) {
+
+ subItem.children.forEach(subItemCln => {
+ subMenu.push(subItemCln)
+ })
+ } else {
+ subMenu.push(subItem)
+ }
+
+
+ })
+ })
+ menuObj = subMenu.find(item => item.label == page)
+
+
+ return menuObj
+ },
+ //点击账户升级
+ handelUpgrade(data) {
+
+ this.$router.push({
+ path: "/AccountUpgrade",
+ name: "AccountUpgrade",
+ params: {
+ amount: data,
+ }
+ })
+ },
+ //处理时间格式
+ handelTime(time) {
+ return `${time.split("T")[0]} ${time.split("T")[1].split(".")[0]}`
+ },
+ //点击跳转页面
+ jumpRecharge(path) {
+ this.$router.push(path)
+ },
+
+
+
+ }
+}
+
+
+
diff --git a/yq/src/views/personal/index.vue b/yq/src/views/personal/index.vue
new file mode 100644
index 0000000..aeb88ad
--- /dev/null
+++ b/yq/src/views/personal/index.vue
@@ -0,0 +1,1296 @@
+
+
+
+
+
+
+ {{ unreadNum }}
+ {{ privateTicket1.length }}
+
+
+
+
+
+ {{ $t(`home.PersonalInformation`) }}
+
+ {{$t(`login.changePassword`) }}
+
+
+
+
+
+
+
{{ $t(`pay.AccountLevel_1`) }}: {{ `${role.level} ${roleName}`}}
+
+
{{ $t(`pay.expirationTime`) }}: {{ role.levelExpireDate}}
+
+
+
+ {{$t(`login.registeredName`)}} : {{ personalList.userName }}
+ {{$t(`login.email`)}} : {{ personalList.email }}
+
+
+
+
+
+
+ {{$t(`login.AccountLevel`)}}: {{$t(item.label) }}
+ {{$t(`login.expense`)}}: {{ item.charges }}
+ {{item.value==bthDisabled?$t(`pay.renew`):$t(`login.accountUpgrade`)}}
+
+
+
+
+
+
+
+
+
+ {{ $t("home.balance") }} :
+
+
+
USDC {{ balances.usdc || 0}}
+
USDT {{ balances.usdt || 0}}
+
BUSD {{ balances.busd || 0}}
+
{{ $t(`home.totalAmount`) }} {{ balances.total || 0}}
+
+
+
+
+
+ {{ $t(`pay.Withdrawal1`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`pay.Withdrawal`)}} :
+
+
+
+
+ {{$t(`pay.currency`)}} :
+
+
+
+
+
+
+
+ {{ $t("login.email") }}:
+
+
+
+
+ * {{ $t("login.authCode") }}
+
+
+
+
+ {{ $t(codeBtn.btnText) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`help.submittedWork`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`help.ReplyUnread`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`help.processedTable`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`help.closedTable`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`pay.userPlan`)}}
+
+ {{$t(`pay.AccountLevel`)}}
+
+ {{$t(`pay.Refers`)}}
+
+ {{$t(`pay.WhetherPay`)}}
+
+ {{$t(`pay.authority`)}}
+
+ {{$t(`pay.granularity`)}}
+
+ {{$t(`pay.expense`)}}
+
+
+
+ L1
+
+ {{$t(`pay.AnonymousUser`)}}
+
+
+
+
+
+
+ No
+
+ {{$t(`pay.technicalL1`)}}
+ 1 day
+ 0
+
+
+ L2
+
+ {{$t(`pay.RegisteredUser`)}}
+
+
+
+
+ No
+
+
+ {{$t(`pay.technicalL1`)}}
+
+ {{$t(`pay.technicalL2`)}}
+
+ 1 day
+ 0
+
+
+
+
+ L3(monthly user)
+
+
+ {{$t(`pay.monthlyPay`)}}
+
+
+ Yes
+
+ {{$t(`pay.technicalL1`)}}
+ {{$t(`pay.technicalL2`)}}
+ {{$t(`pay.technicalL3`)}}
+
+ {{$t(`pay.greatMessage`)}}
+
+ {{$t(`pay.customizeMessage`)}}
+ Mobile App
+ {{$t(`pay.support`)}}
+
+ 1 day
+ 10 USDT/10 USDC/10 BUSD
+
+
+
+ L3(annual user)
+ {{$t(`pay.annualPay`)}}
+
+
+ Yes
+
+ {{$t(`pay.technicalL1`)}}
+ {{$t(`pay.technicalL2`)}}
+ {{$t(`pay.technicalL3`)}}
+
+ {{$t(`pay.greatMessage`)}}
+
+ {{$t(`pay.customizeMessage`)}}
+ Mobile App
+ {{$t(`pay.support`)}}
+
+ 1 day
+ 100 USDT/100 USDC/100 BUSD
+
+
+
+ L4(VIP annual user)
+ {{$t(`pay.vipAnnualPay`)}}
+
+
+ Yes
+
+ {{$t(`pay.technicalL1`)}}
+ {{$t(`pay.technicalL2`)}}
+ {{$t(`pay.technicalL3`)}}
+ {{$t(`pay.technicalL4`)}}
+
+ {{$t(`pay.NewCurrency`)}}
+
+ {{$t(`pay.greatMessage`)}}
+ {{$t(`pay.customizeMessage`)}}
+ Mobile App
+ {{$t(`pay.support`)}}
+
+ 1 day, real time
+ 500 USDT/500 USDC/500 BUSD
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ * {{ $t(`login.email`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+ * {{ $t(`login.email`) }}
+
+
+
+
+ * {{ $t(`login.oldPassword`) }}
+
+
+
+
+ * {{ $t(`login.newPassword`) }}
+
+
+
+
+ * {{ $t(`login.ConfirmNewPassword`) }}
+
+
+
+ * {{ $t("login.authCode") }}
+
+
+
+ {{ $t(`login.emailCode`) }}
+
+
+
+
+
+
+
+
+
+
+ * {{ $t(`login.password`) }}
+
+ {{ $t(`login.PleasePassword`) }}
+
+
+
+
+ * {{ $t(`login.oldEmail`) }}
+
+
+ {{ $t(`login.inputEmail`) }}
+
+
+
+
+ * {{ $t("login.authCode") }}
+
+
+
+
+ {{ $t(`login.emailCode`) }}
+
+
+ {{ $t(`login.email2`) }}{{ $t(`login.Statement`) }}
+
+
+
+ {{ $t(`login.getCode`) }}
+
+
+
+
+
+
+
+
+
+ * {{ $t(`login.newEmail`) }}
+
+
+ {{ $t(`login.inputEmail`) }}
+
+
+
+
+ * {{ $t("login.authCode") }}
+
+
+
+
+ {{ $t(`login.emailCode`) }}
+
+
+
+ {{ $t("login.getCode") }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/piCycleTop/index.js b/yq/src/views/piCycleTop/index.js
new file mode 100644
index 0000000..9edf1aa
--- /dev/null
+++ b/yq/src/views/piCycleTop/index.js
@@ -0,0 +1,356 @@
+import * as echarts from "echarts";
+import { takePiCycleTopIndicator } from "../../api/pages"
+import { chartsWidth,dataLength, emptyData,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ piCycleTopLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "111DMA",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "350DMAx2",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#e43961",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#e43961",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 2,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchPiCycleTopIndicator({})
+ //禁用时间框
+ // this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("piCycleTopBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("piCycleTopBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchPiCycleTopIndicator(params) {
+ this.piCycleTopLoading = true
+ const { data } = await takePiCycleTopIndicator(params)
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.piCycleTopLoading = false
+ return
+ }
+ let piCycleTopData = data.data
+ this.start = piCycleTopData[0].date.split("T")[0]
+ this.end = piCycleTopData[piCycleTopData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+ let ma111ValueList = []
+ let ma350x2ValueList = []
+ piCycleTopData.forEach(item => {
+ ma111ValueList.push(Number(item.ma111.toFixed(2)))
+ ma350x2ValueList.push(Number(item.ma350x2.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(piCycleTopData, ma111ValueList)
+ this.option.series[1].data = handelProfitrate(piCycleTopData, ma350x2ValueList)
+
+
+ this.inCharts()
+
+ this.piCycleTopLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchPiCycleTopIndicator(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[2], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[3], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchPiCycleTopIndicator(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/piCycleTop/index.vue b/yq/src/views/piCycleTop/index.vue
new file mode 100644
index 0000000..2d0e5fc
--- /dev/null
+++ b/yq/src/views/piCycleTop/index.vue
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/piCycleTopEth/index.js b/yq/src/views/piCycleTopEth/index.js
new file mode 100644
index 0000000..b59e7a5
--- /dev/null
+++ b/yq/src/views/piCycleTopEth/index.js
@@ -0,0 +1,361 @@
+import * as echarts from "echarts";
+import { takepiCycleTopEth } from "../../api/pages"
+import { chartsWidth,dataLength, handelBtcPrice, handelProfitrate,emptyData, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ piCycleTopEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "111DMA",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "350DMAx2",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#e43961",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 2,
+ lineStyle: {
+ //线条样式
+ color: "#e43961",
+ width: "1",
+ },
+ data: [],
+ },
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 1,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 4,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchPiCycleTopEthIndicator({})
+ //禁用时间框
+ // this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("piCycleTopEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("piCycleTopEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchPiCycleTopEthIndicator(params) {
+ this.piCycleTopEthLoading = true
+ const { data } = await takepiCycleTopEth(params)
+ console.log(data.data,666);
+ let piCycleTopEthData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.piCycleTopEthLoading = false
+ return
+ }
+
+
+
+ this.start = piCycleTopEthData[0].date.split("T")[0]
+ this.end = piCycleTopEthData[piCycleTopEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // //移动平均线没值 才渲染正常价格数据
+ // if (this.start && !this.fatherSmaData[0]) {
+ // this.ethFlag = true
+ // this.handelSonEthPrice("ETH", true);
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(true));
+ // }
+ // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // if (this.fatherSmaData[0] && this.start) {
+ // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ // }
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+
+ // this.handelSonEthPrice("ETH", true);
+ let ma111ValueList = []
+ let ma350x2ValueList = []
+ let priceList=[]
+ piCycleTopEthData.forEach(item => {
+ ma111ValueList.push(Number(item.ma111.toFixed(2)))
+ ma350x2ValueList.push(Number(item.ma350x2.toFixed(2)))
+ priceList.push(Number(item.price.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(piCycleTopEthData, ma111ValueList)
+ this.option.series[1].data = handelProfitrate(piCycleTopEthData, ma350x2ValueList)
+ this.option.series[2].data = handelProfitrate(piCycleTopEthData, priceList)
+
+
+ this.inCharts()
+
+ this.piCycleTopEthLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchPiCycleTopEthIndicator(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[2], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchPiCycleTopEthIndicator(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/piCycleTopEth/index.vue b/yq/src/views/piCycleTopEth/index.vue
new file mode 100644
index 0000000..6294cab
--- /dev/null
+++ b/yq/src/views/piCycleTopEth/index.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/priceValue.vue b/yq/src/views/priceValue.vue
new file mode 100644
index 0000000..37ee428
--- /dev/null
+++ b/yq/src/views/priceValue.vue
@@ -0,0 +1,618 @@
+
+
+
+
+ {{$t(`home.ascending`)}}
+
+
+ {{$t(`home.descending`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`arh.search`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/privilegeLevel/index.js b/yq/src/views/privilegeLevel/index.js
new file mode 100644
index 0000000..45fc6bc
--- /dev/null
+++ b/yq/src/views/privilegeLevel/index.js
@@ -0,0 +1,90 @@
+export default {
+ data() {
+ return {
+ max: 1,
+ max1: 2,
+ fraction: 3,
+ fraction1: 3,
+ max2: 3,
+ fraction2: 3,
+ bthDisabled: "",
+ accountLevelList: [
+ // {
+ // id:"registered",
+ // label:"注册用户",
+ // charges:"$0",
+ // },
+ {//月度付费用户
+ id: "advance",
+ label: "login.monthlyPlay",
+ charges: "10(USDT、USDC、BUSD)",
+ amount: "10",
+ value: 0,
+ level: "L3",
+ disabledValue: 1,
+ },
+ {//年度付费用户
+ id: "advance",
+ label: "login.yearsPlay",
+ charges: "100(USDT、USDC、BUSD)",
+ amount: "100",
+ value: 1,
+ level: "L3",
+ disabledValue: 1,
+ },
+ {//vip年度付费用户
+ id: "vip",
+ label: "login.vipYearsPlay",
+ charges: "500(USDT、USDC、BUSD)",
+ amount: "500",
+ value: 2,
+ level: "L4",
+ disabledValue: 2,
+ },
+
+ ],
+ }
+ },
+ mounted() {
+
+ },
+ methods: {
+ //请求个人资料
+ async fetchPersonal() {
+ this.personalLoading = true
+ const { data } = await this.$API.getpersonal()
+ this.personalList = data.data
+
+ this.roleName = data.data.role.roleName
+ this.level = data.data.role.level
+ //判断等级 禁用相应按钮
+
+ if (data.data.role.roleName == "月度付费用户") {
+ this.bthDisabled = 0
+ } else if (data.data.role.roleName == "年度付费用户") {
+ this.bthDisabled = 1
+ } else if (this.level == "L4") {
+ this.bthDisabled = 2
+ } else if (this.level == "L2" || this.level == "L1") {
+ this.bthDisabled = -1
+ } else {
+ this.bthDisabled = 10
+ }
+
+ this.personalLoading = false
+
+
+ },
+ //点击账户升级
+ handelUpgrade(data) {
+ this.$router.push({
+ path: "/AccountUpgrade",
+ name: "AccountUpgrade",
+ params: {
+ amount: data,
+ }
+ })
+ },
+ }
+
+}
\ No newline at end of file
diff --git a/yq/src/views/privilegeLevel/index.vue b/yq/src/views/privilegeLevel/index.vue
new file mode 100644
index 0000000..9806a99
--- /dev/null
+++ b/yq/src/views/privilegeLevel/index.vue
@@ -0,0 +1,250 @@
+
+
+
权限等级详情
+
+
+
+ {{$t(`pay.userPlan`)}}
+
+ {{$t(`pay.AccountLevel`)}}
+
+ {{$t(`pay.Refers`)}}
+
+ {{$t(`pay.WhetherPay`)}}
+
+ {{$t(`pay.authority`)}}
+
+ {{$t(`pay.granularity`)}}
+
+ {{$t(`pay.expense`)}}
+
+
+
+ L1
+
+ {{$t(`pay.AnonymousUser`)}}
+
+
+
+
+
+
+ No
+
+ {{$t(`pay.technicalL1`)}}
+ 1 day
+ 0
+
+
+ L2
+
+ {{$t(`pay.RegisteredUser`)}}
+
+
+
+
+ No
+
+
+ {{$t(`pay.technicalL1`)}}
+
+ {{$t(`pay.technicalL2`)}}
+
+ 1 day
+ 0
+
+
+
+
+ L3(monthly user)
+
+
+ {{$t(`pay.monthlyPay`)}}
+
+
+ Yes
+
+ {{$t(`pay.technicalL1`)}}
+ {{$t(`pay.technicalL2`)}}
+ {{$t(`pay.technicalL3`)}}
+ {{$t(`pay.greatMessage`)}}
+ {{$t(`pay.customizeMessage`)}}
+ Mobile App
+ {{$t(`pay.support`)}}
+
+ 1 day
+ 10 USDT/10 USDC/10 BUSD
+
+
+
+ L3(annual user)
+ {{$t(`pay.annualPay`)}}
+
+
+ Yes
+
+ {{$t(`pay.technicalL1`)}}
+ {{$t(`pay.technicalL2`)}}
+ {{$t(`pay.technicalL3`)}}
+
+ {{$t(`pay.greatMessage`)}}
+
+ {{$t(`pay.customizeMessage`)}}
+ Mobile App
+ {{$t(`pay.support`)}}
+
+ 1 day
+ 100 USDT/100 USDC/100 BUSD
+
+
+
+ L4(VIP annual user)
+ {{$t(`pay.vipAnnualPay`)}}
+
+
+ Yes
+
+ {{$t(`pay.technicalL1`)}}
+ {{$t(`pay.technicalL2`)}}
+ {{$t(`pay.technicalL3`)}}
+ {{$t(`pay.technicalL4`)}}
+
+ {{$t(`pay.NewCurrency`)}}
+
+ {{$t(`pay.greatMessage`)}}
+ {{$t(`pay.customizeMessage`)}}
+ Mobile App
+ {{$t(`pay.support`)}}
+
+ 1 day, real time
+ 500 USDT/500 USDC/500 BUSD
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/profitAddress/index.js b/yq/src/views/profitAddress/index.js
new file mode 100644
index 0000000..1c8558a
--- /dev/null
+++ b/yq/src/views/profitAddress/index.js
@@ -0,0 +1,349 @@
+import * as echarts from "echarts";
+import { fetchProfitAddress } from "../../api/apiPost"
+
+import { chartsWidth, emptyData, dataLength, handelProfitrate, handelZoom, handelLineType, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ profitAddressLoading: false,
+
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ labelFormatter: function (time) {
+ const date = new Date(time);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let newTime = `${year}-${month}-${day}`;
+ return newTime
+ }
+ },
+
+ ],
+ series: [
+ {
+ name: "Address in Profit",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ lengthTimer: null,
+
+ }
+ },
+ mounted() {
+
+ this.fetchProfitAddress(this.params.req, this.params.radius)
+
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+ })
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("profitAddressBox"));
+ }
+ chartsWidth("profitAddressBox", this);
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchProfitAddress(params) {
+ this.profitAddressLoading = true
+
+ const { data } = await fetchProfitAddress(params)
+ // const { data } = await this.$API.getProfitAddress(req, radius)
+
+ let profitAddressData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.profitAddressLoading = false
+ return
+ }
+
+
+ this.start = profitAddressData[0].date.split("T")[0]
+ this.end = profitAddressData[profitAddressData.length - 1].date.split("T")[0]
+
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // //移动平均线没值 才渲染正常价格数据
+ // if (this.start && !this.fatherSmaData[0]) {
+ // this.handelSonBtcPrice("BTC", true)
+ // }
+ // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // if (this.fatherSmaData[0] && this.start) {
+ // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ // }
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH",this.ethFlag)
+ // }
+ // })
+
+ this.handelSonBtcPrice("BTC", true)
+
+ let profitValueList = []
+
+
+ profitAddressData.forEach(item => {
+
+ profitValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(profitAddressData, profitValueList)
+
+ //添加水印
+
+ this.option = handelWatermark(this.option)
+
+ this.inCharts()
+
+
+ this.profitAddressLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchProfitAddress(this.params)
+ this.$addStorageEvent(1, "sma", this.params.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/profitAddress/index.vue b/yq/src/views/profitAddress/index.vue
new file mode 100644
index 0000000..8f563f1
--- /dev/null
+++ b/yq/src/views/profitAddress/index.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+ Address in Profit = total address where Price >= Price_created
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/profitData/index.js b/yq/src/views/profitData/index.js
new file mode 100644
index 0000000..23f5546
--- /dev/null
+++ b/yq/src/views/profitData/index.js
@@ -0,0 +1,347 @@
+import * as echarts from "echarts";
+import { handelWatermark, chartsWidth,emptyData } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ //柱状图配置
+ columnar: {
+
+ },
+ //饼图配置
+ pieChart: {
+ // title: {
+ // text: '同名数量统计',
+ // subtext: '纯属虚构',
+ // left: 'center'
+ // },
+ tooltip: {
+ trigger: 'item',
+ // formatter: '{b}: {c}: {d}'
+ valueFormatter: (value) => {
+ return `${(value / 1000000).toFixed(2)}M`
+ }
+ },
+ legend: {
+ type: 'scroll',
+ orient: 'vertical',
+ right: 150,
+ // top: 20,
+ // bottom: 20,
+ // data: []
+ },
+ graphic: [{
+ type: 'group',
+ // rotation: Math.PI / 2,
+ bounding: 'raw',
+ right: "50%",
+ top: "40%",
+ // z: 10,
+ // rotation: 6,
+ children: [
+ {
+ type: 'text',
+ left: 'center',
+ top: 'center',
+ // z: 100,
+ style: {
+ fill: `rgba(0,0,0,0.1)`,
+ text: `coinbus.cc`,
+ font: 'bold 80px sans-serif',
+
+ }
+ }
+ ]
+ }],
+ series: [
+ {
+ // name: '姓名',
+ type: 'pie',
+ radius: '55%',
+ center: ['40%', '50%'],
+ data: [],
+ emphasis: {
+ itemStyle: {
+ shadowBlur: 10,
+ shadowOffsetX: 0,
+ shadowColor: 'rgba(0, 0, 0, 0.5)'
+ }
+ }
+ }
+ ]
+ },
+ params: {
+ req: "",
+ radius: "btc"
+ },
+ profitData: [],
+ profitLoading: false,
+ introduce: "",//接口介绍
+ value1: "",
+ DateTime: "",
+ pickerOptions: {
+ disabledDate: (time) => {
+ return time.getTime() > new Date(this.columnar.title.text).getTime()
+ },
+ },
+ }
+ },
+ created() {
+ this.onOption();
+ },
+ mounted() {
+ console.log("我of窘境 ");
+ let menuObj = localStorage.getItem("params");
+ this.params.req = JSON.parse(menuObj).componentReq;
+ this.introduce = JSON.parse(menuObj).introduce;
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ //监听localstorage变化
+ window.addEventListener("setItem", () => {
+ let menuObj = localStorage.getItem("params");
+ this.params.req = JSON.parse(menuObj).componentReq;
+ this.introduce = JSON.parse(menuObj).introduce;
+ });
+ },
+ watch: {
+ params: {
+ handler(val) {
+ if (val.req == "getProfitData" || val.req == "getProfitAmountData") {
+ this.fetchProfitData(this.params.req, this.params.radius)
+ this.value1 = ""
+ } else {
+ return
+ }
+
+ },
+ deep: true
+
+ }
+ },
+ methods: {
+ //初始化柱状图图表
+ inCharts() {
+ this.myChart = echarts.init(document.getElementById("profitData"));
+
+ this.myChart.setOption(this.columnar);
+ chartsWidth("profitData", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+
+ },
+ //初始化饼图
+ inChartsPieChart() {
+ this.myChart = echarts.init(document.getElementById("profitPieChart"));
+
+ this.myChart.setOption(this.pieChart);
+ chartsWidth("profitPieChart", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart)this.myChart.resize();;
+ // });
+ },
+ async fetchProfitData(req, radius, start) {
+ this.profitLoading = true
+ const { data } = await this.$API.getHolder(req, radius, start)
+ this.profitData = data.data.list
+ //空数据处理
+ let noData = emptyData( this.profitData, this.columnar.series, this.inCharts, this)
+ if (noData) {
+ this.profitLoading = false
+ emptyData( this.profitData, this.pieChart.series, this.inChartsPieChart, this)
+ return
+ }
+ this.columnar.xAxis.data.length = 0
+ this.columnar.series[0].data.length = 0
+ //添加水印
+ this.columnar = handelWatermark(this.columnar)
+ let newData = []
+ this.profitData.forEach(item => {
+ // console.log( this.profitData,65656);
+ if (item.key.split("t")[1] == "_amoun") {//getProfitAmountData 的数据
+ let key = item.key
+ item.key = Number(key.split("t")[2])
+ let value = Number(item.value)
+ item.value = +value.toFixed(2)
+ } else {//getProfitData 的数据
+
+ let key = item.key
+ item.key = Number(key.split("t")[1])
+ item.value = Number(item.value)
+ }
+
+ newData.push([item.key, item.value])
+ })
+
+ for (let i = 0; i < newData.length - 1; i++) {
+ for (let j = 0; j < newData.length - 1; j++) {
+ if (newData[j][0] > newData[j + 1][0]) {
+ var temp = newData[j + 1];
+ newData[j + 1] = newData[j];
+ newData[j] = temp;
+
+ }
+ }
+
+ }
+ //添加水印
+ // this.pieChart= handelWatermark(this.pieChart)
+ // console.log(this.pieChart,"交电费1111极地反击");
+ let item1Sum = 0
+ this.pieChart.series[0].data.length = 0
+ newData.map(item => {//饼图赋值
+
+ if ((item[0] * 100) <= 100) {
+
+ this.pieChart.series[0].data.push({ value: item[1], name: `${(item[0] * 100).toFixed(0)}%` })
+ } else {
+ item1Sum += item[1]
+ }
+
+
+ })
+ this.pieChart.series[0].data.push({ value: item1Sum, name: `> 100%` })
+
+ this.columnar.title.text = `${data.data.date}`
+ // for (let i = 0; i < newData.length; i++) {
+ // console.log(newData[i][0]);
+ // if (newData[i][0] >= 100) {
+ // newData[i][0]=newData[i][0]/1000
+ // newData[i][2]="k"
+ // }else{
+ // newData[i][0]= newData[i][0]
+ // }
+
+ // }newData
+ this.columnar.xAxis.data.length = 0
+ this.columnar.series[0].data.length = 0
+ newData.forEach(item => {
+
+
+ this.columnar.xAxis.data.push(`${(item[0] * 100).toFixed(0)}%`)
+ this.columnar.series[0].data.push(item[1])
+ })
+ // this.columnar.xAxis[0].data =newData[0]
+ // this.columnar.series[0].data = newData[1]
+
+
+ this.inCharts()
+ this.inChartsPieChart()
+
+ this.profitLoading = false
+ },
+ onOption() {
+ let that = this
+ this.columnar = {
+ animation: false,
+ title: {
+ text: "",
+ left: "center",
+ textStyle: {
+ fontSize: 15,
+ fontWeight: "normal"
+ },
+ },
+ grid: {
+ right: 80,
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ valueFormatter: (value) => {
+ return `${(value / 1000000).toFixed(2)}M`
+ },
+ axisPointer: {
+ type: "cross",
+ crossStyle: {
+ color: "#999",
+ },
+ },
+ },
+ xAxis: {
+ // type:"category",
+ splitLine: {
+ color: "rgba(0,0,0,0.1)"
+ },
+ // axisLabel: {
+ // formatter: function (a) {
+ // // let value
+ // // if (a>=10000) {
+ // // value = `${a / 1000}k`
+ // // }else{
+ // // value =a
+ // // }
+
+ // return `${a}%`
+ // }
+ // },
+ data: [],
+ //最大值和最小值显示
+ showMinLabel: true,
+ showMaxLabel: true
+
+ },
+ yAxis: {
+ // name:this.$t(`home.figure`),
+ type: "log",
+ position: "left",
+ //坐标两边留白
+ // boundaryGap: "5%",
+ //网格线设置
+ // splitLine: {
+ // color: "rgba(0,0,0,0.1)",
+ // },
+
+ axisLabel: {
+ formatter: function (value) {
+ let label
+ label = value / 1000000
+
+ return `${label}M`
+ },
+ },
+ axisLine: {
+ onZero: false
+ }
+ },
+ dataZoom: [
+ {
+ show: true,
+ type: 'inside',
+ // minSpan: 10,
+ start: 0,
+ end: 12
+ },
+ {
+ show: true,
+ type: 'inside',
+ // filterMode: 'none',
+ // minSpan: 0.1,
+ // maxSpan: 99,
+ // yAxisIndex: [0],
+ // startValue: -20,
+ // endValue: 20
+ }
+ ],
+ series: [
+ {
+ type: 'bar',
+ showSymbol: false,
+ // clip: true,
+ data: [],
+ itemStyle: {
+ color: "#fdaa56",
+ },
+ }
+ ]
+ }
+ },
+ //时间选择
+ handeldate() {
+
+ this.fetchProfitData(this.params.req, this.params.radius, this.value1)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/profitData/index.vue b/yq/src/views/profitData/index.vue
new file mode 100644
index 0000000..2eccba0
--- /dev/null
+++ b/yq/src/views/profitData/index.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
{{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+ {{ $t(`home.figure2`) }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/profitEth/index.js b/yq/src/views/profitEth/index.js
new file mode 100644
index 0000000..475c0c6
--- /dev/null
+++ b/yq/src/views/profitEth/index.js
@@ -0,0 +1,356 @@
+import * as echarts from "echarts";
+import { getProfitEth, } from "../../api/pages"
+import { chartsWidth, dataLength, handelProfitrate,emptyData, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ profitEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}M `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Number of Addresses in Profit",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchprofitEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("profitEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("profitEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchprofitEth(params) {
+ this.profitEthLoading = true
+ const { data } = await getProfitEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+
+
+ if (noData) {
+ this.profitEthLoading = false
+ return
+ }
+
+
+ let profitEthData = data.data
+ this.start = profitEthData[0].date.split("T")[0]
+ this.end = profitEthData[profitEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ profitEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(profitEthData, ValueList)
+
+ this.inCharts()
+
+ this.profitEthLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+ console.log("zjijifjfijfifj");
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchprofitEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchprofitEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/profitEth/index.vue b/yq/src/views/profitEth/index.vue
new file mode 100644
index 0000000..538c0f9
--- /dev/null
+++ b/yq/src/views/profitEth/index.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
+ Address in Profit = total address where Price >= Price_ created
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/profitPercentEth/index.js b/yq/src/views/profitPercentEth/index.js
new file mode 100644
index 0000000..29d7097
--- /dev/null
+++ b/yq/src/views/profitPercentEth/index.js
@@ -0,0 +1,351 @@
+import * as echarts from "echarts";
+import { getProfitPercentEth, } from "../../api/pages"
+import { chartsWidth, dataLength,emptyData,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ profitPercentEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ var res = params[0].axisValueLabel;
+
+ for (let i = 0; i < params.length; i++) {
+ if (i == 0) {
+ res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}% `
+ } else {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ }
+
+ }
+
+
+ return res;
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true,
+
+
+
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Percent of Addresses in Profit",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchprofitPercentEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("profitPercentEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("profitPercentEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchprofitPercentEth(params) {
+ this.profitPercentEthLoading = true
+ const { data } = await getProfitPercentEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.profitPercentEthLoading = false
+ return
+ }
+ let profitPercentEthData = data.data
+ this.start = profitPercentEthData[0].date.split("T")[0]
+ this.end = profitPercentEthData[profitPercentEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ profitPercentEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(profitPercentEthData, ValueList)
+
+ this.inCharts()
+
+ this.profitPercentEthLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchprofitPercentEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchprofitPercentEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/profitPercentEth/index.vue b/yq/src/views/profitPercentEth/index.vue
new file mode 100644
index 0000000..32c399c
--- /dev/null
+++ b/yq/src/views/profitPercentEth/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/profitRatio/index.js b/yq/src/views/profitRatio/index.js
new file mode 100644
index 0000000..5fee793
--- /dev/null
+++ b/yq/src/views/profitRatio/index.js
@@ -0,0 +1,332 @@
+import * as echarts from "echarts";
+import { fetchProfitRatio } from "../../api/apiPost"
+import { chartsWidth,emptyData, dataLength,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ profitRatioLoading: false,
+ lengthTimer:null,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Percent Addresses in Profit",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ this.fetchProfitRatio(this.params.req, this.params.radius)
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("profitRatioBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("profitRatioBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchProfitRatio(params) {
+ this.profitRatioLoading = true
+
+ const { data } = await fetchProfitRatio(params)
+
+ let profitRatioData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.profitRatioLoading = false
+ return
+ }
+ this.start = profitRatioData[0].date.split("T")[0]
+ this.end = profitRatioData[profitRatioData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ let profitValueList = []
+
+
+ profitRatioData.forEach(item => {
+
+ profitValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(profitRatioData, profitValueList)
+
+
+
+ this.inCharts()
+ this.profitRatioLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchProfitRatio(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/profitRatio/index.vue b/yq/src/views/profitRatio/index.vue
new file mode 100644
index 0000000..14866c9
--- /dev/null
+++ b/yq/src/views/profitRatio/index.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/profitrate/index.js b/yq/src/views/profitrate/index.js
new file mode 100644
index 0000000..5301238
--- /dev/null
+++ b/yq/src/views/profitrate/index.js
@@ -0,0 +1,510 @@
+import * as echarts from "echarts";
+import { getProfitRate2 } from "../../api/realTimeData"
+import { handelBtcPrice, dataLength, emptyData, chartsWidth, handelProfitrate, handelZoom, handelLineType, handelSwitchs, handelWatermark, handelSmaData, getDateArray, fetchBtcPrice, fetchEthPrice } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer: null,
+
+ params: {
+ req: "profitRate",
+ radius: "btc"
+ },
+ profitRateLoading: false,
+ profitRateData: [],
+ option: {
+ tooltip: {
+ trigger: "axis",
+
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: (params) => {
+
+ if (params[0].axisType == `xAxis.time`) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+ }else{
+ var res = params[0].axisValue
+ }
+ for (let i = 0; i < params.length; i++) {
+ if (Array.isArray(params[i].value)) {
+ if (params[i].seriesName !== `Price[BTC]`) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]}% `
+
+ } else {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+
+ } else {
+
+ if (params[i].seriesName !== `Price[BTC]`) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value}% `
+
+ } else {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value} `
+
+ }
+
+ }
+
+ }
+ // if (params[1] && !params[2]) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}%
+ // ${params[1].marker} ${params[1].seriesName}      ${params[1].value[1]} `;
+
+ // } else if (params[2]) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}%
+ // ${params[1].marker} ${params[1].seriesName}      ${params[1].value[1]}
+ // ${params[2].marker} ${params[2].seriesName}      ${params[2].value[1]} `;
+
+ // } else {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}%
+ // `;
+
+ // }
+
+
+ return res;
+ }
+ },
+ legend: {
+ right: "100"
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // show:"false",
+ // boundaryGap: [0, "100%"],
+ // axisLabel: {
+ // formatter: function (e) {
+
+ // let value;
+ // if (e > 1000000) {
+ // value = e / 100000;
+ // } else if (e > 100000) {
+ // value = e / 1000;
+ // } else {
+ // value = e / 100;
+ // }
+ // return value;
+ // },
+ // },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Daily Percent UTXOs in Profit",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ markLine: {
+ symbol: ["none", "none"], //去掉箭头
+ itemStyle: {
+ normal: {
+ lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ },
+ },
+ // lineStyle:{
+ // color:"red"
+ // },
+
+ label: {
+ formatter: "{b}",
+ fontSize: 10,
+ color: "rgba(0,0,0,0.8)",
+ align: "left",
+ },
+ data: [
+ // {
+ // name: "0",
+ // yAxis: 0,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+ {
+ name: "$70W",
+ yAxis: 700000,
+ },
+ {
+ name: "$40W",
+ yAxis: 400000,
+ },
+
+ {
+ name: "$10W",
+ yAxis: 100000,
+ },
+ {
+ name: "$100W",
+ yAxis: 1000000,
+ // position: ['100%', '50'],
+ },
+ {
+ name: "$120W",
+ yAxis: 1200000,
+ },
+
+ {
+ name: "$140W",
+ yAxis: 1400000,
+ },
+ ],
+ },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 2,
+ // data: [],
+ // },
+
+ ],
+ },
+ priceTime: "",
+ btcPrice: [],
+ parmesTime: {
+ start: "",
+ end: ""
+ },
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ dataSelection: [
+ {
+ value: "1d",
+ label: "home.day1",
+ disabled: false,
+ authority: "guest",
+ grade: 1,
+ },
+ {
+ value: "realTime",
+ label: "home.realTimeData",
+ disabled: false,
+ authority: "vip",
+ grade: 4,
+ },
+ ],
+ realTimeData: "",
+
+ }
+ },
+ mounted() {
+ this.fetchProfitrate(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+
+ },
+ methods: {
+ handleSelect(activeValue) {
+ if (activeValue == "1d") {
+ this.realTimeData = false
+ this.fetchProfitrate(this.params.req, this.params.radius)
+ } else {
+ this.fetchProfitRate2()
+ this.realTimeData = true
+ }
+ },
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("profitRateBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("profitRateBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ //实时数据
+ async fetchProfitRate2() {
+ this.profitRateLoading = true
+ const { data } = await getProfitRate2()
+ let ProfitRate2 = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.profitRateLoading = false
+ return
+ }
+
+ this.option.xAxis.type = "category"
+ this.option = handelWatermark(this.option)
+ let profitRate = []
+ let xAxisData = []
+ let price = []
+ ProfitRate2.forEach(item => {
+ item.date = `${item.date.split("T")[0]} ${item.date.split("T")[1].split(`.`)[0]
+ } `;
+ profitRate.push((item.value * 100).toFixed(2))
+ xAxisData.push(item.date)
+ price.push(item.price.toFixed(2))
+ })
+
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = profitRate
+ this.option.series[1].data = price
+
+
+ this.inCharts()
+ this.profitRateLoading = false
+ },
+ //请求数据并渲染
+ async fetchProfitrate(req, radius, start, end, sma) {
+ this.profitRateLoading = true
+ const { data } = await this.$API.getProfitrate(req, radius, start, end, sma)
+ this.profitRateData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.profitRateLoading = false
+ return
+ }
+ this.start = this.profitRateData[0].date.split("T")[0]
+ this.end = this.profitRateData[this.profitRateData.length - 1].date.split("T")[0]
+ this.option.xAxis.type = "time"
+ //添加水印
+ this.option = handelWatermark(this.option)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ //渲染ETH
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+ let profitRateValueList = []
+ this.profitRateData.forEach(item => {
+
+ this.timer = item.date.split("T")[0]
+ profitRateValueList.push(Number((item.value * 100).toFixed(2)))
+ })
+ this.option.series[0].data = handelProfitrate(this.profitRateData, profitRateValueList)
+
+ this.inCharts()
+ this.profitRateLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length),);
+
+ }, 10000)
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.parmesTime.start = start;
+ this.parmesTime.end = end;
+ this.fetchProfitrate(this.params.req, this.params.radius, this.parmesTime.start, this.parmesTime.end, this.sma)
+ },
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ // 请求BTC价格
+ async fetchBtcPrice(radius, start, end) {
+ //请求BTC价格
+ const price = await this.$API.getBtcPrice2(radius, start, end);
+ this.btcPrice = price.data.data
+ if (!this.btcPrice) {//价格未查询到数据的情况
+ this.option.series[1].data.length = 0
+
+ } else {
+
+ let priceValueList = []
+ let newPriceData = []
+ this.btcPrice.forEach(price => {
+ priceValueList.push(Number(parseInt(price.value * 100) / 100))
+ newPriceData.push(price)
+ })
+ this.option.series[1].data = handelBtcPrice(newPriceData, priceValueList)
+
+ }
+ this.inCharts()
+ },
+ // 请求Eth价格
+ async fetchEthPrice(radius, start, end) {
+ const price = await this.$API.getBtcPrice2(radius, start, end);
+ this.ethPrice = price.data.data
+ if (!this.ethPrice) {
+ this.option.series[2].data.length = 0
+ } else {
+ let priceValueList = []
+ let newPriceData = []
+ this.ethPrice.forEach(price => {
+ priceValueList.push(Number(parseInt(price.value * 100) / 100))
+ newPriceData.push(price)
+ })
+ this.option.series[2].data = handelBtcPrice(newPriceData, priceValueList)
+ }
+
+ this.inCharts()
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+
+
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.sma = smaDataList
+
+ this.fetchProfitrate(this.params.req, this.params.radius, this.parmesTime.start, this.parmesTime.end, this.sma)
+
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ this.realTimeData = false
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList,this.option.series[1],this.inCharts,this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/yq/src/views/profitrate/index.vue b/yq/src/views/profitrate/index.vue
new file mode 100644
index 0000000..40198ff
--- /dev/null
+++ b/yq/src/views/profitrate/index.vue
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/publishObservations/index.js b/yq/src/views/publishObservations/index.js
new file mode 100644
index 0000000..d54f86c
--- /dev/null
+++ b/yq/src/views/publishObservations/index.js
@@ -0,0 +1,227 @@
+import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
+import WangEditor from 'wangeditor';
+import { DomEditor } from '@wangeditor/editor'
+import { toolbarConfig } from '@wangeditor/editor'
+export default {
+ data() {
+ return {
+ activeName: "weekly",
+ editor: null,
+ html: '',
+ toolbarConfig: {},
+ editorConfig: { placeholder: '请输入内容...', fullscreen: false, },
+ mode: 'default', // or 'simple'
+ from: [
+ {
+ title: "测试消息标题1",
+ classification: "测试分类1",
+ date: "2023-12-23",
+ Creator: "admin",
+ releaseTime: "2023-12-29",
+ },
+ {
+ title: "测试消息标题2",
+ classification: "测试分类3",
+ date: "2023-12-26",
+ Creator: "admin",
+ releaseTime: "2023-12-28",
+ },
+
+
+ ],
+ dialogVisible: false,
+ previewHtml: "",
+ currentPage1: 1,
+ pageSizes: [1, 100, 200],
+ totalLimit1: 2,
+ reportList: {
+ type: "",
+ people: "",
+ time: "",
+ title: "",
+ content: "",
+
+ },
+ ruleForm: {
+ //...省略其他
+ articleBody: '',
+ },
+ //上传后的文件列表
+ fileList: [],
+ // 允许的文件类型
+ fileType: ["PDF",],
+ // 运行上传文件大小,单位 M
+ fileSize: 20,
+ // 附件数量限制
+ fileLimit: 3,
+ //请求头
+ headers: { "Content-Type": "multipart/form-data" },
+ FormDatas: null,
+ }
+ },
+ mounted() {
+ // 模拟 ajax 请求,异步渲染编辑器
+ // setTimeout(() => {
+ // this.html = '模拟 Ajax 异步设置内容 HTML
'
+ // }, 1500)
+
+
+ },
+ methods: {
+ onCreated(editor) {
+
+ this.editor = Object.seal(editor) // 一定要用 Object.seal() ,否则会报错
+ this.toolbarConfig.excludeKeys = [
+ 'fullScreen',// 排除菜单组,写菜单组 key 的值即可
+ 'group-video',
+ `insertTable`
+ ]
+ },
+ onChange(editor) {
+ // 点击一下富文本编辑页窗口就会执行
+ const toolbar = DomEditor.getToolbar(editor)
+ console.log("工具栏配置", toolbar.getConfig().toolbarKeys); // 工具栏配置
+
+ },
+ //预览
+ preview() {
+
+ this.previewHtml = this.html
+ this.dialogVisible = true
+
+
+ },
+ handleSizeChange(val) {
+ console.log(`每页 ${val} 条`);
+ this.params.limit = val
+ this.params.page = 1
+
+ this.currentPage1 = 1,
+
+
+
+
+
+ this.currentPage = 1
+ },
+ handleCurrentChange(val) {
+ console.log(`当前页: ${val}`);
+ this.params.page = val
+
+
+
+ },
+ //超出文件个数的回调
+ handleExceed() {
+ this.$message({
+ type: 'warning',
+ message: this.$t(`user.notSupported4`)
+ }); return
+ },
+ //上传文件的事件
+ uploadFile(item) {
+ this.fileItem = item
+
+ this.fileList.push(item.file);
+ this.fileName.push(item.file.name)
+
+ },
+ //上传成功后的回调
+ handleSuccess() {
+
+ },
+ handelChange(file, fileList) { //控制显示上传显示列表
+ // 校验文件类型和大小
+ const fileType = file.name.slice(file.name.lastIndexOf('.') + 1).toLowerCase();
+ const isTypeValid = this.fileType.includes(fileType);
+ const isSizeValid = file.size / 1024 / 1024 <= this.fileSize;
+ if (!isTypeValid) {//不支持的文件类型
+ this.$message.error(`${this.$t(`user.notSupported`)} ${fileType}`);
+ this.fileList = this.fileList.filter(item => item.name != file.name);
+ return false;
+ }
+ if (!isSizeValid) {//文件大小不能超过
+ this.fileList = this.fileList.filter(item => item.name != file.name);
+ this.$message.error(`${this.$t(`user.notSupported2`)} ${this.fileSize} MB.`);
+ return false;
+ }
+ let flag = this.fileList.some(item => item.name == file.name)
+
+ if (flag) {
+ this.$message.warning(this.$t(`user.notSupported3`));
+ this.$refs.upload.handleRemove(file)
+
+ return false
+ }
+ this.fileName.push(file.name)
+ this.fileList.push(file.raw)
+
+ },
+
+ //上传了的文件给移除的事件,
+ handleRemove(file, fileList) {
+
+ let nameIndex = this.fileName.indexOf(file.name); // 获取第一个重复元素的索引
+ if (nameIndex !== -1) {
+ this.fileName.splice(nameIndex, 1); // 删除第一个重复元素
+ }
+
+
+
+
+ let index = this.fileList.indexOf(file); // 获取第一个重复元素的索引
+
+ if (index !== -1) {
+ this.fileList.splice(index, 1); // 删除第一个重复元素
+ }
+
+
+
+ },
+ //上传文件之前
+ beforeUpload(file) {
+ // 校验文件类型和大小
+ const fileType = file.name.slice(file.name.lastIndexOf('.') + 1).toLowerCase();
+ const isTypeValid = this.fileType.includes(fileType);
+ const isSizeValid = file.size / 1024 / 1024 <= this.fileSize;
+ if (!isTypeValid) {//不支持的文件类型
+ this.$message.error(`${this.$t(`user.notSupported`)}:${fileType}`);
+ return false;
+ }
+ if (!isSizeValid) {//文件大小不能超过
+ this.$message.error(`${this.$t(`user.notSupported2`)}${this.fileSize} MB.`);
+ return false;
+ }
+
+ // if (file.type != "" && file.type != null && file.type != undefined) {
+ // //截取文件的后缀,判断文件类型
+ // const FileExt = file.name.replace(/.+\./, "").toLowerCase();
+ // //计算文件的大小
+ // const isLt2M = file.size / 1024 / 1024 < 20; //这里做文件大小限制
+ // //如果大于50M
+ // if (!isLt2M) {
+ // this.$message.error('上传文件大小不能超过 20MB!');
+ // return false;
+ // }
+ // //如果文件类型不在允许上传的范围内
+ // if (this.fileType.includes(FileExt)) {
+ // return true;
+ // }
+ // else {
+ // this.$message.error("上传文件格式不正确!");
+ // return false;
+ // }
+ // }
+
+
+ },
+
+
+
+ },
+ beforeDestroy() {
+ const editor = this.editor
+ if (editor == null) return
+ editor.destroy() // 组件销毁时,及时销毁编辑器
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/publishObservations/index.vue b/yq/src/views/publishObservations/index.vue
new file mode 100644
index 0000000..572629c
--- /dev/null
+++ b/yq/src/views/publishObservations/index.vue
@@ -0,0 +1,184 @@
+
+
+
+
+
+
{{ $t(`login.publishObservations`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 报告类型:
+
+
+
+
+
+ 报告标题:
+
+
+
+
+ 报告内容PDF上传:
+
+
+
+
+ 将文件拖到此处,或 点击上传
+
+
+
+
+
+
+
+ 提交
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 发布
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/quickNews1/index.js b/yq/src/views/quickNews1/index.js
new file mode 100644
index 0000000..e69de29
diff --git a/yq/src/views/quickNews1/index.vue b/yq/src/views/quickNews1/index.vue
new file mode 100644
index 0000000..c78f0db
--- /dev/null
+++ b/yq/src/views/quickNews1/index.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/rcap/index.js b/yq/src/views/rcap/index.js
new file mode 100644
index 0000000..a43aca2
--- /dev/null
+++ b/yq/src/views/rcap/index.js
@@ -0,0 +1,351 @@
+import * as echarts from "echarts";
+import { fetchRcap } from "../../api/apiPost"
+import { chartsWidth,emptyData, dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ rcapLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Realized capitalization",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchRcap({})
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("rcapBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("rcapBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchRcap(params) {
+ this.rcapLoading = true
+ const { data } = await fetchRcap(params)
+ let rcapData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.rcapLoading = false
+ return
+ }
+
+ this.start = rcapData[0].date.split("T")[0]
+ this.end = rcapData[rcapData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+ let ValueList = []
+ rcapData.forEach(item => {
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(rcapData, ValueList)
+
+
+ this.inCharts()
+
+ this.rcapLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchRcap(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchRcap(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/rcap/index.vue b/yq/src/views/rcap/index.vue
new file mode 100644
index 0000000..550e469
--- /dev/null
+++ b/yq/src/views/rcap/index.vue
@@ -0,0 +1,76 @@
+
+
+
+
+
+ Realized Cap = value · price created
+
+ [USD] (of all UTXOs)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/rcapEth/index.js b/yq/src/views/rcapEth/index.js
new file mode 100644
index 0000000..462c555
--- /dev/null
+++ b/yq/src/views/rcapEth/index.js
@@ -0,0 +1,350 @@
+import * as echarts from "echarts";
+import { getRcapEth, } from "../../api/pages"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ rcapEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}% `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Realized Cap",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchrcapEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("rcapEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("rcapEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchrcapEth(params) {
+ this.rcapEthLoading = true
+ const { data } = await getRcapEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.rcapEthLoading = false
+ return
+ }
+ let rcapEthData = data.data
+ this.start = rcapEthData[0].date.split("T")[0]
+ this.end = rcapEthData[rcapEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ rcapEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(rcapEthData, ValueList)
+
+ this.inCharts()
+
+ this.rcapEthLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchrcapEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchrcapEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/rcapEth/index.vue b/yq/src/views/rcapEth/index.vue
new file mode 100644
index 0000000..ac9e2e0
--- /dev/null
+++ b/yq/src/views/rcapEth/index.vue
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+ Realized Cap = value · price created
+
+ [USD] (of all UTXOs)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/realizedPrice/index.js b/yq/src/views/realizedPrice/index.js
new file mode 100644
index 0000000..bf68945
--- /dev/null
+++ b/yq/src/views/realizedPrice/index.js
@@ -0,0 +1,325 @@
+import * as echarts from "echarts";
+import { fetchRealizedPrice } from "../../api/apiPost"
+import { chartsWidth, emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ realizedPriceLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ // min: "dataMin",
+ // max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Realized Price",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 0,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ this.fetchRealizedPrice(this.params.req, this.params.radius)
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("realizedPriceBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("realizedPriceBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchRealizedPrice(params) {
+ this.realizedPriceLoading = true
+ const { data } = await fetchRealizedPrice(params)
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.realizedPriceLoading = false
+ return
+ }
+ let realizedPriceData = data.data
+ this.start = realizedPriceData[0].date.split("T")[0]
+ this.end = realizedPriceData[realizedPriceData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ let profitValueList = []
+
+
+ realizedPriceData.forEach(item => {
+
+ profitValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(realizedPriceData, profitValueList)
+
+
+
+ this.inCharts()
+ this.realizedPriceLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchRealizedPrice(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/realizedPrice/index.vue b/yq/src/views/realizedPrice/index.vue
new file mode 100644
index 0000000..d9df28c
--- /dev/null
+++ b/yq/src/views/realizedPrice/index.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/rechargeRecord/index.js b/yq/src/views/rechargeRecord/index.js
new file mode 100644
index 0000000..ac9e68a
--- /dev/null
+++ b/yq/src/views/rechargeRecord/index.js
@@ -0,0 +1,131 @@
+import * as echarts from "echarts";
+import { msgBoradTabel, msgBoradNum, responMsg } from "../../api/messageBoard"
+import { allAddCreditOrder } from "../../api/pay"
+import { Debounce } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ from0: [{
+ id: 0,
+ userDate: "",
+ userName: "",
+ msgPage: "",
+ userMsg: ""
+
+
+ }],
+ from1: [{
+ id: 0,
+ userDate: "",
+ userName: "",
+ msgPage: "",
+ userMsg: ""
+
+
+ }],
+ from2: [{
+ id: 0,
+ userDate: "",
+ userName: "",
+ msgPage: "",
+ userMsg: ""
+
+
+ }],
+ params: {
+ page: 1,
+ limit: 300,
+ status: 0,
+ address: "",
+ },
+ rechargeRecord: false,
+ activeName:"pending",
+
+
+ }
+ },
+ mounted() {
+ this.params.status = 0
+ this.fetchRechargeRecord0(this.params)
+ this.params.status = 1
+ this.fetchRechargeRecord1(this.params)
+ this.params.status = 2
+ this.fetchRechargeRecord2(this.params)
+ },
+ methods: {
+
+ //请求支付历史 支付成功
+ async fetchRechargeRecord0(params) {
+ this.rechargeRecord = true
+ const { data } = await allAddCreditOrder(params)
+ this.from0 = data.rows
+ this.rechargeRecord = false
+
+ },
+ //请求支付历史 支付失败
+ async fetchRechargeRecord1(params) {
+ const { data } = await allAddCreditOrder(params)
+ this.from1 = data.rows
+
+ },
+ //请求支付历史 待处理
+ async fetchRechargeRecord2(params) {
+ const { data } = await allAddCreditOrder(params)
+ this.from2 = data.rows
+
+ },
+ handelTime(time) {
+ if (time) {
+ return `${time.split("T")[0]} ${time.split("T")[1].split(".")[0]}`
+ }
+ },
+ //点击搜索
+ handelSearch(status) {
+ for (const key in this.params) { //判空
+ if (key !== `status` && this.params[key] == "") {
+ this.$message({
+ message: this.$t(`pay.search`),
+ type: "error",
+ });
+ return
+ }
+ }
+ switch (status) {
+ case 0:
+ this.params.status = 0
+ this.fetchRechargeRecord0(this.params)
+ break;
+ case 1:
+ this.params.status = 1
+ this.fetchRechargeRecord1(this.params)
+
+ break;
+ case 2:
+ this.params.status = 2
+ this.fetchRechargeRecord2(this.params)
+ break;
+
+ default:
+ break;
+ }
+
+
+
+ },
+
+
+ //点击刷新
+ handelRefresh: Debounce(function () {
+ this.params.status = 0
+ this.fetchRechargeRecord0(this.params)
+ this.params.status = 1
+ this.fetchRechargeRecord1(this.params)
+ this.params.status = 2
+ this.fetchRechargeRecord2(this.params)
+ }, 1000),
+ handleClick(){
+ this.params.address = ""
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/rechargeRecord/index.vue b/yq/src/views/rechargeRecord/index.vue
new file mode 100644
index 0000000..c520808
--- /dev/null
+++ b/yq/src/views/rechargeRecord/index.vue
@@ -0,0 +1,302 @@
+
+
+
+
+
+
+
+ {{ $t(`pay.rechargeRecord`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ handelTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ handelTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ handelTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/relativeLthSth/index.js b/yq/src/views/relativeLthSth/index.js
new file mode 100644
index 0000000..ed3b8c4
--- /dev/null
+++ b/yq/src/views/relativeLthSth/index.js
@@ -0,0 +1,475 @@
+import * as echarts from "echarts";
+import { fetchRelativeLthSth } from "../../api/apiPost"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ relativeLthSthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "LTH/STH Supply in Profit/Loss",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ // stack: 'Total',
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ // color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ color: 'rgb(55, 162, 255)',
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ // color: "#f7864c",
+ width: "0",
+ color: 'rgb(55, 162, 255)',
+ },
+ data: [],
+ areaStyle: {
+ opacity: 0.8,
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 0,
+ color: 'rgb(55, 162, 255)'
+ },
+ {
+ offset: 1,
+ color: 'rgb(116, 21, 219)'
+ }
+ ])
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ },
+ // {
+ // name: "lthLossSupply",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // // stack: 'Total',
+ // showSymbol: false,
+ // symbolSize: 5,
+ // // areaStyle: {},
+ // itemStyle: {
+ // // color: "#f7864c",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // color: 'rgb(255, 0, 135)',
+ // },
+ // yAxisIndex: 0,
+ // lineStyle: {
+ // //线条样式
+ // color: "#f7864c",
+ // width: "0",
+ // color: 'rgb(255, 0, 135)',
+ // },
+ // data: [],
+ // areaStyle: {
+ // opacity: 0.8,
+ // color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ // {
+ // offset: 0,
+ // color: 'rgb(255, 0, 135)'
+ // },
+ // {
+ // offset: 1,
+ // color: 'rgb(135, 0, 157)'
+ // }
+ // ])
+ // },
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // },
+ // {
+ // name: "sthProfitSupply",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // showSymbol: false,
+ // // stack: 'Total',
+ // symbolSize: 5,
+ // // areaStyle: {},
+ // itemStyle: {
+ // // color: "#f7864c",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // color: 'rgb(255, 191, 0)'
+ // },
+ // yAxisIndex: 0,
+ // lineStyle: {
+ // //线条样式
+ // // color: "#f7864c",
+ // width: "0",
+ // color: 'rgb(255, 191, 0)'
+ // },
+ // data: [],
+ // areaStyle: {
+ // opacity: 0.8,
+ // color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ // {
+ // offset: 0,
+ // color: 'rgb(255, 191, 0)'
+ // },
+ // {
+ // offset: 1,
+ // color: 'rgb(224, 62, 76)'
+ // }
+ // ])
+ // },
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // },
+ // {
+ // name: "sthLossSupply",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // showSymbol: false,
+ // // stack: 'Total',
+ // symbolSize: 5,
+ // // areaStyle: {},
+ // itemStyle: {
+ // // color: "#f7864c",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // color: '#ecabc1',
+ // },
+ // yAxisIndex: 0,
+ // lineStyle: {
+ // //线条样式
+ // // color: "#f7864c",
+ // width: "0",
+ // color: '#ecabc1',
+ // },
+ // data: [],
+ // areaStyle: {
+ // opacity: 0.8,
+ // color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ // {
+ // offset: 0,
+ // color: '#ecabc1'
+ // },
+ // {
+ // offset: 1,
+ // color: '#ecabc1'
+ // }
+ // ])
+ // },
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ this.fetchRelativeLthSth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("relativeLthSthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("relativeLthSthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchRelativeLthSth(params) {
+ this.relativeLthSthLoading = true
+ const { data } = await fetchRelativeLthSth(params)
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.relativeLthSthLoading = false
+ return
+ }
+ let relativeLthSthData = data.data
+ this.start = relativeLthSthData[0].date.split("T")[0]
+ this.end = relativeLthSthData[relativeLthSthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ // let lthProfitSuppValueList = []
+ // let lthLossSupplyValueList = []
+ // let sthProfitSupplyValueList = []
+ // let sthLossSupplyValueList = []
+ let ValueList = []
+
+ relativeLthSthData.forEach(item => {
+ ValueList.push(Number(item.value.toFixed(2)))
+ // lthProfitSuppValueList.push(Number(item.lthProfitSupply.toFixed(2)))
+ // lthLossSupplyValueList.push(Number(item.lthLossSupply.toFixed(2)))
+ // sthProfitSupplyValueList.push(Number(item.sthProfitSupply.toFixed(2)))
+ // sthLossSupplyValueList.push(Number(item.sthLossSupply.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(relativeLthSthData, ValueList)
+ // this.option.series[1].data = handelProfitrate(relativeLthSthData, lthLossSupplyValueList)
+ // this.option.series[2].data = handelProfitrate(relativeLthSthData, sthProfitSupplyValueList)
+ // this.option.series[3].data = handelProfitrate(relativeLthSthData, sthLossSupplyValueList)
+
+
+
+
+
+ this.inCharts()
+ this.relativeLthSthLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[5], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchRelativeLthSth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/relativeLthSth/index.vue b/yq/src/views/relativeLthSth/index.vue
new file mode 100644
index 0000000..06138b3
--- /dev/null
+++ b/yq/src/views/relativeLthSth/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/relativeULossEth/index.js b/yq/src/views/relativeULossEth/index.js
new file mode 100644
index 0000000..c089fd7
--- /dev/null
+++ b/yq/src/views/relativeULossEth/index.js
@@ -0,0 +1,350 @@
+import * as echarts from "echarts";
+import { getRelativeULossEth, } from "../../api/pages"
+import { chartsWidth, handelProfitrate,dataLength,emptyData, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ relativeULossEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}% `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Relative Unrealized Loss",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchrelativeULossEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("relativeULossEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("relativeULossEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchrelativeULossEth(params) {
+ this.relativeULossEthLoading = true
+ const { data } = await getRelativeULossEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.relativeULossEthLoading = false
+ return
+ }
+ let relativeULossEthData = data.data
+ this.start = relativeULossEthData[0].date.split("T")[0]
+ this.end = relativeULossEthData[relativeULossEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ relativeULossEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(relativeULossEthData, ValueList)
+
+ this.inCharts()
+
+ this.relativeULossEthLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchrelativeULossEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchrelativeULossEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/relativeULossEth/index.vue b/yq/src/views/relativeULossEth/index.vue
new file mode 100644
index 0000000..f2000c4
--- /dev/null
+++ b/yq/src/views/relativeULossEth/index.vue
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+ Unrealized Loss = value · (price
+
+ created [USD] - price
+ [USD] )
+
+
+
+
+ (of all UTXOs where price
+ created
+ > price)
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/relativeUProfitEth/index.js b/yq/src/views/relativeUProfitEth/index.js
new file mode 100644
index 0000000..e4d6597
--- /dev/null
+++ b/yq/src/views/relativeUProfitEth/index.js
@@ -0,0 +1,351 @@
+import * as echarts from "echarts";
+import { getRelativeUProfitEth, } from "../../api/pages"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ relativeUProfitEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}% `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ // min: "dataMin",
+ // max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Relative Unrealized Profit",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchrelativeUProfitEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("relativeUProfitEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("relativeUProfitEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchrelativeUProfitEth(params) {
+ this.relativeUProfitEthLoading = true
+ const { data } = await getRelativeUProfitEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.relativeUProfitEthLoading = false
+ return
+ }
+ let relativeUProfitEthData = data.data
+ this.start = relativeUProfitEthData[0].date.split("T")[0]
+ this.end = relativeUProfitEthData[relativeUProfitEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+
+ //渲染ETH
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ //渲染BTC价格
+ if (this.btcFlag) {
+ this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ this.handelSonBtcPrice("BTC", this.btcFlag)
+ }
+
+
+
+ })
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ relativeUProfitEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(8)))
+
+ })
+ this.option.series[0].data = handelProfitrate(relativeUProfitEthData, ValueList)
+
+ this.inCharts()
+
+ this.relativeUProfitEthLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchrelativeUProfitEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchrelativeUProfitEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/relativeUProfitEth/index.vue b/yq/src/views/relativeUProfitEth/index.vue
new file mode 100644
index 0000000..9704689
--- /dev/null
+++ b/yq/src/views/relativeUProfitEth/index.vue
@@ -0,0 +1,117 @@
+
+
+
+
+ Unrealized Profit = value · (price [USD] - price created [USD] )
+
+
+
+
(of all UTXOs where price > price created )
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/reward/index.js b/yq/src/views/reward/index.js
new file mode 100644
index 0000000..7ea947d
--- /dev/null
+++ b/yq/src/views/reward/index.js
@@ -0,0 +1,392 @@
+import * as echarts from "echarts";
+import { chartsWidth, handelProfitrate,dataLength, emptyData, handelZoom, handelLineType, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ rewardLoading: false,
+ params: {
+ req: "reward",
+ radius: "ETH",
+ start: "",
+ END: ""
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ position: function (pt) {
+ return [pt[0], "10%"];
+ },
+ },
+ legend: {
+ right: "100",
+ // data:[`sopr`,'asopr','easopr','lthsopr','sthsopr',],
+ // selected:{
+ // 'asopr': false,
+ // 'easopr': false,
+ // 'lthsopr': false,
+ // 'sthsopr': false,
+ // }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//万
+ value = `${e / 10000}W`;
+ } else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right",
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right",
+ min: "dataMin",
+ max: "dataMax",
+
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "ETH2 Staking rewards",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 1,
+ // data: [],
+ // //绘制右侧Y轴
+ // markLine: {
+ // symbol: ["none", "none"], //去掉箭头
+ // itemStyle: {
+ // normal: {
+ // lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ // },
+ // },
+ // // lineStyle:{
+ // // color:"red"
+ // // },
+
+ // label: {
+ // formatter: "{b}",
+ // fontSize: 10,
+ // color: "rgba(0,0,0,0.8)",
+ // align: "left",
+ // },
+ // data: [
+ // // {
+ // // name: "0",
+ // // yAxis: 0,
+ // // },
+ // // {
+ // // name: "$40W",
+ // // yAxis: 400000,
+ // // },
+ // {
+ // name: "$70W",
+ // yAxis: 700000,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+
+ // {
+ // name: "$10W",
+ // yAxis: 100000,
+ // },
+ // {
+ // name: "$100W",
+ // yAxis: 1000000,
+ // // position: ['100%', '50'],
+ // },
+ // {
+ // name: "$120W",
+ // yAxis: 1200000,
+ // },
+
+ // {
+ // name: "$140W",
+ // yAxis: 1400000,
+ // },
+ // ],
+ // },
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 2,
+ data: [],
+ },
+
+ ],
+ },
+ rewardData: [],
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+
+ this.fetchReward(this.params.req, this.params.radius)
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("rewardRateBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("rewardRateBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchReward(req, radius, start, end, sma) {
+ this.rewardLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+ this.rewardData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.rewardLoading = false
+ return
+ }
+ this.start = this.rewardData[0].date.split("T")[0]
+ this.end = this.rewardData[this.rewardData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+ // //移动平均线没值 才渲染正常价格数据
+ // if (this.start && !this.fatherSmaData[0]) {
+ // //移动平均线没值 才渲染正常价格数据
+ // if (this.start && !this.fatherSmaData[0] && this.params.radius =="BTC") {
+ // this.btcFlag = true
+ // this.handelSonBtcPrice("BTC", true);
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(true));
+ // }else if (this.start && this.params.radius =="ETH") {
+ // this.ethFlag = true
+ // this.handelSonEthPrice("ETH", true);
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(true));
+ // }
+ // }
+ // //点击时间 移动平均线有值 就渲染查询移动平均线
+ // if (this.fatherSmaData[0] && this.start) {
+ // this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ // }
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+
+ // this.handelSonEthPrice("ETH", true);
+ let rewardValueList = []
+ let priceValueList = []
+ this.rewardData.forEach(item => {
+
+ rewardValueList.push(Number(item.value.toFixed(2)))
+ priceValueList.push(Number(item.price.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(this.rewardData, rewardValueList)
+ this.option.series[1].data = handelProfitrate(this.rewardData, priceValueList)
+ this.inCharts()
+ this.rewardLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchReward(this.params.req, this.params.radius, this.params.start, this.params.end, this.sma)
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ //父级BTC默认是true 在ETH页面btcFlag 取反才能正常点击父级就渲染
+
+ // if (this.params.radius == "ETH") {
+ // this.btcFlag = !flag;
+ // } else {
+ // this.btcFlag = flag;
+ // }
+ this.btcFlag = flag;
+
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+
+ this.ethFlag = flag;
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+
+
+ this.sma = smaDataList
+ this.fetchReward(this.params.req, this.params.radius, this.params.start, this.params.end, this.sma)
+
+
+ this.$addStorageEvent(1, "sma", this.sma);
+
+
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts, this.start, this.end,)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/reward/index.vue b/yq/src/views/reward/index.vue
new file mode 100644
index 0000000..37f8ac0
--- /dev/null
+++ b/yq/src/views/reward/index.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/rloss/index.js b/yq/src/views/rloss/index.js
new file mode 100644
index 0000000..21100e9
--- /dev/null
+++ b/yq/src/views/rloss/index.js
@@ -0,0 +1,453 @@
+import * as echarts from "echarts";
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelZoom, fetchBtcPrice, handelWatermark, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ rlossLoading: false,
+ params: {
+ req: "rloss",
+ radius: "btc"
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ formatter: function (name) {
+
+ return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//百万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "log",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Realized Loss",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ markLine: {
+ symbol: ["none", "none"], //去掉箭头
+ itemStyle: {
+ normal: {
+ lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ },
+ },
+ // lineStyle:{
+ // color:"red"
+ // },
+
+ label: {
+ formatter: "{b}",
+ fontSize: 10,
+ color: "rgba(0,0,0,0.8)",
+ align: "left",
+ },
+ data: [
+ {
+ name: "$0.02",
+ yAxis: 0.02,
+ },
+ {
+ name: "$0.06",
+ yAxis: 0.06,
+ },
+ {
+ name: "$0.1",
+ yAxis: 0.1,
+ },
+ {
+ name: "$0.4",
+ yAxis: 0.4,
+ },
+ {
+ name: "$0.8",
+ yAxis: 0.8,
+ },
+ {
+ name: "$2",
+ yAxis: 2,
+ },
+ {
+ name: "$6",
+ yAxis: 6,
+ },
+ {
+ name: "$10",
+ yAxis: 10,
+ },
+ {
+ name: "$40",
+ yAxis: 40,
+ },
+ {
+ name: "$80",
+ yAxis: 80,
+ },
+ // {
+ // name: "$120",
+ // yAxis: 120,
+ // },
+ {
+ name: "$160",
+ yAxis: 160,
+ },
+ // {
+ // name: "$200",
+ // yAxis: 200,
+ // },
+ {
+ name: "$240",
+ yAxis: 240,
+ },
+ {
+ name: "$300",
+ yAxis: 300,
+ },
+ {
+ name: "$500",
+ yAxis: 500,
+ },
+ {
+ name: "$700",
+ yAxis: 700,
+ },
+ {
+ name: "$900",
+ yAxis: 900,
+ },
+ {
+ name: "$1100",
+ yAxis: 1100,
+ },
+ // {
+ // name: "$1200",
+ // yAxis: 1200,
+ // },
+ {
+ name: "$1800",
+ yAxis: 1800,
+ },
+ {
+ name: "$3000",
+ yAxis: 3000,
+ },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+ {
+ name: "$70W",
+ yAxis: 700000,
+ },
+ {
+ name: "$40W",
+ yAxis: 400000,
+ },
+
+ {
+ name: "$10W",
+ yAxis: 100000,
+ },
+ {
+ name: "$100W",
+ yAxis: 1000000,
+ // position: ['100%', '50'],
+ },
+ {
+ name: "$120W",
+ yAxis: 1200000,
+ },
+
+ {
+ name: "$140W",
+ yAxis: 1400000,
+ },
+ ],
+ },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 3,
+ // data: [],
+ // },
+
+ ],
+ },
+ rlossData: [],
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+ this.fetchRloss(this.params.req, this.params.radius)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("rlossBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("rlossBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchRloss(req, radius, start, end, sma) {
+ this.rlossLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+ this.rlossData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.rlossLoading = false
+ return
+ }
+
+ this.start = this.rlossData[0].date.split("T")[0]
+ this.end = this.rlossData[this.rlossData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ //渲染ETH
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+ let rlossValueList = []
+ this.rlossData.forEach(item => {
+ rlossValueList.push(Number(item.value.toFixed(2)))
+ })
+ this.option.series[0].data = handelProfitrate(this.rlossData, rlossValueList)
+
+
+ this.inCharts()
+ this.rlossLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchRloss(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.sma = smaDataList
+
+ this.fetchRloss(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+ this.$addStorageEvent(1, "sma", this.sma);
+
+
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/yq/src/views/rloss/index.vue b/yq/src/views/rloss/index.vue
new file mode 100644
index 0000000..e1ef721
--- /dev/null
+++ b/yq/src/views/rloss/index.vue
@@ -0,0 +1,110 @@
+
+
+
+
+ Realized Loss = value · (price created [USD] - price spent [USD] )
+
+
+
+
(of all spent outputs where price created > price spent )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/rplRate/index.js b/yq/src/views/rplRate/index.js
new file mode 100644
index 0000000..47beb84
--- /dev/null
+++ b/yq/src/views/rplRate/index.js
@@ -0,0 +1,513 @@
+import * as echarts from "echarts";
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelZoom, handelLineType, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ rplRateLoading: false,
+ params: {
+ req: "rplRate",
+ radius: "btc"
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ // data: ['Realized Profit/Loss', ],
+ itemStyle: {
+ color: 'inherit'
+ },
+
+
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//百万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ // min: "dataMin",
+ // max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Realized Profit/Loss",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ // color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ // color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ markLine: {
+ symbol: ["none", "none"], //去掉箭头
+ silent: true,
+ lineStyle: {
+ normal: {
+ color: '#000', // 这儿设置安全基线颜色
+ width: 1,
+ type: "solid"
+ }
+ },
+ data: [{
+ yAxis: 1
+ }],
+ label: {
+ normal: {
+ formatter: '1',
+ position: `start`,
+ }
+ },
+ },
+
+
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ // markLine: {
+ // symbol: ["none", "none"], //去掉箭头
+ // itemStyle: {
+ // normal: {
+ // lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ // },
+ // },
+ // // lineStyle:{
+ // // color:"red"
+ // // },
+
+ // label: {
+ // formatter: "{b}",
+ // fontSize: 10,
+ // color: "rgba(0,0,0,0.8)",
+ // align: "left",
+ // },
+ // data: [
+ // {
+ // name: "$0.02",
+ // yAxis: 0.02,
+ // },
+ // {
+ // name: "$0.06",
+ // yAxis: 0.06,
+ // },
+ // {
+ // name: "$0.1",
+ // yAxis: 0.1,
+ // },
+ // {
+ // name: "$0.4",
+ // yAxis: 0.4,
+ // },
+ // {
+ // name: "$0.8",
+ // yAxis: 0.8,
+ // },
+ // {
+ // name: "$2",
+ // yAxis: 2,
+ // },
+ // {
+ // name: "$6",
+ // yAxis: 6,
+ // },
+ // {
+ // name: "$10",
+ // yAxis: 10,
+ // },
+ // {
+ // name: "$40",
+ // yAxis: 40,
+ // },
+ // {
+ // name: "$80",
+ // yAxis: 80,
+ // },
+ // // {
+ // // name: "$120",
+ // // yAxis: 120,
+ // // },
+ // {
+ // name: "$160",
+ // yAxis: 160,
+ // },
+ // // {
+ // // name: "$200",
+ // // yAxis: 200,
+ // // },
+ // {
+ // name: "$240",
+ // yAxis: 240,
+ // },
+ // {
+ // name: "$300",
+ // yAxis: 300,
+ // },
+ // {
+ // name: "$500",
+ // yAxis: 500,
+ // },
+ // {
+ // name: "$700",
+ // yAxis: 700,
+ // },
+ // {
+ // name: "$900",
+ // yAxis: 900,
+ // },
+ // {
+ // name: "$1100",
+ // yAxis: 1100,
+ // },
+ // // {
+ // // name: "$1200",
+ // // yAxis: 1200,
+ // // },
+ // {
+ // name: "$1800",
+ // yAxis: 1800,
+ // },
+ // {
+ // name: "$3000",
+ // yAxis: 3000,
+ // },
+ // // {
+ // // name: "$40W",
+ // // yAxis: 400000,
+ // // },
+ // {
+ // name: "$70W",
+ // yAxis: 700000,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+
+ // {
+ // name: "$10W",
+ // yAxis: 100000,
+ // },
+ // {
+ // name: "$100W",
+ // yAxis: 1000000,
+ // // position: ['100%', '50'],
+ // },
+ // {
+ // name: "$120W",
+ // yAxis: 1200000,
+ // },
+
+ // {
+ // name: "$140W",
+ // yAxis: 1400000,
+ // },
+ // ],
+ // },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 3,
+ // data: [],
+ // },
+
+
+ ],
+ visualMap: [
+ {
+ // 以1为基线,大于1为绿色, 小于等于1为红色 lt(小于 gt(大于 lte(小于等于 gte(大于等于
+ show: true,
+ // dimension: 1,
+ itemWidth: 30,
+ text: ['RPL>1', 'RPL<=1'],
+ seriesIndex: 0,
+ right: "2%",
+ top: "2%",
+ inRange: {//取消后灰色底部
+ color: ['#121122', 'rgba(3,4,5,0.4)', 'red'],
+ // symbolSize: [30, 100]
+ },
+ pieces: [{
+ gt: -99999,
+ lte: 1,
+ color: 'red'
+ }, {
+ gt: 1,
+ color: 'green'
+ }],
+ }
+ ],
+
+ },
+ rplRateData: [],
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+ this.fetchRplRate(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("rplRateBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("rplRateBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchRplRate(req, radius, start, end, sma) {
+ this.rplRateLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+ this.rplRateData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.rplRateLoading = false
+ return
+ }
+ this.start = this.rplRateData[0].date.split("T")[0]
+ this.end = this.rplRateData[this.rplRateData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ //渲染ETH
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+ let rplRateValueList = []
+
+ this.rplRateData.forEach(item => {
+
+ rplRateValueList.push(Number(item.value.toFixed(2)))
+ //判断渲染与上面数据时间一致得价格数据
+
+ })
+ this.option.series[0].data = handelProfitrate(this.rplRateData, rplRateValueList)
+
+ this.inCharts()
+ this.rplRateLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchRplRate(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.sma = smaDataList
+
+ this.fetchRplRate(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/yq/src/views/rplRate/index.vue b/yq/src/views/rplRate/index.vue
new file mode 100644
index 0000000..2c04dde
--- /dev/null
+++ b/yq/src/views/rplRate/index.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/rpriceEth/index.js b/yq/src/views/rpriceEth/index.js
new file mode 100644
index 0000000..8dd93ea
--- /dev/null
+++ b/yq/src/views/rpriceEth/index.js
@@ -0,0 +1,349 @@
+import * as echarts from "echarts";
+import { getRpriceEth, } from "../../api/pages"
+import { chartsWidth,emptyData, dataLength,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ rpriceEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}% `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Realized Price",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchrpriceEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("rpriceEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("rpriceEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchrpriceEth(params) {
+ this.rpriceEthLoading = true
+ const { data } = await getRpriceEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.rpriceEthLoading = false
+ return
+ }
+ let rpriceEthData = data.data
+ this.start = rpriceEthData[0].date.split("T")[0]
+ this.end = rpriceEthData[rpriceEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ rpriceEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(rpriceEthData, ValueList)
+
+ this.inCharts()
+
+ this.rpriceEthLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchrpriceEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchrpriceEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+}
+}
\ No newline at end of file
diff --git a/yq/src/views/rpriceEth/index.vue b/yq/src/views/rpriceEth/index.vue
new file mode 100644
index 0000000..a59f68f
--- /dev/null
+++ b/yq/src/views/rpriceEth/index.vue
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/rprofit/index.js b/yq/src/views/rprofit/index.js
new file mode 100644
index 0000000..cdb6c74
--- /dev/null
+++ b/yq/src/views/rprofit/index.js
@@ -0,0 +1,375 @@
+import * as echarts from "echarts";
+import { chartsWidth, handelProfitrate,dataLength,emptyData, handelZoom, handelLineType, handelSwitchs, handelWatermark, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ rprofitLoading: false,
+ params: {
+ req: "rprofit",
+ radius: "btc"
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ formatter: function (name) {
+
+ return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//百万
+ value = `${e / 10000}W`;
+ } else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Realized Profit",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ markLine: {
+ symbol: ["none", "none"], //去掉箭头
+ itemStyle: {
+ normal: {
+ lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ },
+ },
+ // lineStyle:{
+ // color:"red"
+ // },
+
+ label: {
+ formatter: "{b}",
+ fontSize: 10,
+ color: "rgba(0,0,0,0.8)",
+ align: "left",
+ },
+ data: [
+ // {
+ // name: "0",
+ // yAxis: 0,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+ {
+ name: "$70W",
+ yAxis: 700000,
+ },
+ {
+ name: "$40W",
+ yAxis: 400000,
+ },
+
+ {
+ name: "$10W",
+ yAxis: 100000,
+ },
+ {
+ name: "$100W",
+ yAxis: 1000000,
+ // position: ['100%', '50'],
+ },
+ {
+ name: "$120W",
+ yAxis: 1200000,
+ },
+
+ {
+ name: "$140W",
+ yAxis: 1400000,
+ },
+ ],
+ },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 2,
+ // data: [],
+ // },
+
+
+ ],
+ },
+ rprofitData: [],
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+ this.fetchRprofit(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("rprofitBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("rprofitBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchRprofit(req, radius, start, end, sma) {
+ this.rprofitLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+ this.rprofitData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.rprofitLoading = false
+ return
+ }
+ this.start = this.rprofitData[0].date.split("T")[0]
+ this.end = this.rprofitData[this.rprofitData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ //渲染ETH
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ let rprofitValueList = []
+
+ this.rprofitData.forEach(item => {
+
+ rprofitValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(this.rprofitData, rprofitValueList)
+
+
+ this.inCharts()
+ this.rprofitLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchRprofit(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.sma = smaDataList
+
+ this.fetchRprofit(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+ this.$addStorageEvent(1, "sma", this.sma);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/rprofit/index.vue b/yq/src/views/rprofit/index.vue
new file mode 100644
index 0000000..41386e9
--- /dev/null
+++ b/yq/src/views/rprofit/index.vue
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+ Realized Profit = value · (price spent [USD] - price created [USD] )
+
+
+
+
(of all spent outputs where price spent > price created )
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/saCDD/index.js b/yq/src/views/saCDD/index.js
new file mode 100644
index 0000000..e285672
--- /dev/null
+++ b/yq/src/views/saCDD/index.js
@@ -0,0 +1,354 @@
+
+import * as echarts from "echarts";
+import { $addStorageEvent } from '../../util/processingData'
+import { getMempool } from "../../api/apiPost"
+import {handelZoom, chartsWidth,emptyData,handelWatermark,handelLineType,handelSwitchs} from "../../util/processingData"
+
+export default {
+ data(){
+ return{
+ myChart:"",
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ },
+ yAxis: [
+ {
+ position: "left",
+ type: "value",
+ axisLabel: {
+ formatter: (value) => {
+ let data
+ if (value >= 1000000000) {
+ data = `${value / 1000000000}B`
+ } else if (value >= 1000000) {
+ data = `${value / 1000000}M`
+ } else {
+ data = `${value / 1000}K`
+ }
+ return data
+ }
+ }
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: true,
+ // min:`dataMin`,
+ // max:`dataMax`,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Supply-Adjusted CDD",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series',
+
+
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#000",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#000",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+
+
+
+ ],
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ saCDDLoading:false,
+ params: {
+ req: "CDD",
+ radius: "BTC",
+ start: "",
+ end: "",
+ sma:"",
+ },
+ dataSelection: [
+ {
+ value: "1d",
+ label: "home.day1",
+ disabled:false,
+ authority:"guest",
+ grade:1,
+ },
+ {
+ value: "realTime",
+ label: "home.realTimeData",
+ disabled:false,
+ authority:"vip",
+ grade:4,
+ },
+ ],
+ realTimeData:"",
+ switch3: "",
+ start:"",
+ end:"",
+
+
+
+ }
+ },
+ mounted(){
+
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.fetchsaCDD(this.params.req, this.params.radius,this.params.start,this.params.end,this.params.sma)
+ },
+ methods:{
+ // handleSelect(activeValue){
+ // if (activeValue == `1d`) {
+ // this.realTimeData =false
+ // this.fetchsaCDD(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ // }else{
+ // this.fetchBTCVolume()
+ // this.realTimeData =true
+ // }
+ // },
+ inCharts(){
+ if (!this.myChart) {
+ this.myChart = echarts.init(document.getElementById("saCDDBox"));
+
+ }
+
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+ this.myChart.setOption(this.option);
+ chartsWidth("saCDDBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+
+ //请求交易量数据渲染
+ async fetchsaCDD(req, radius, start, end, sma) {
+ this.saCDDLoading = true
+ const { data } = await this.$API.getMa370(req, radius, start, end, sma)
+ let chartData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.saCDDLoading = false
+ return
+ }
+ //添加水印
+ handelWatermark(this.option, 750, 300)
+ this.start =chartData[0].date.split("T")[0]
+ this.end = chartData[chartData.length - 1].date.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ let volumeValueList = []
+ let xAxisData = []
+ chartData.forEach(item => {
+
+ volumeValueList.push(Number(item.sacdd.toFixed(2)))
+ xAxisData.push(item.date.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = volumeValueList
+ this.option.series[1].data = priceData
+ if (this.zoomStart) {
+ this.option.dataZoom[0].start = this.zoomStart
+ this.option.dataZoom[0].end = this.zoomEnd
+ } else {
+ this.option.dataZoom[0].start = 10
+ this.option.dataZoom[0].end = 100
+ }
+
+
+
+
+ this.inCharts()
+
+
+
+
+ setTimeout(() => {//监听echarts 图表滚动
+ this.myChart.on("dataZoom", function (e) {
+ this.zoomStart = e.start || e.batch[0].start;
+ this.zoomEnd = e.end|| e.batch[0].end;
+ $addStorageEvent(1, "zoomStart", this.zoomStart);
+ $addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ });
+
+
+ })
+
+ this.saCDDLoading = false
+
+
+
+
+
+ },
+ //实时数据
+ async fetchBTCVolume(){
+ this.saCDDLoading = true
+ const { data } = await getBTCVolume()
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.saCDDLoading = false
+ return
+ }
+ let BTCVolumeData = data.data
+ let Volume=[]
+ let xAxisData = []
+ let priceData =[]
+ BTCVolumeData.forEach(item=>{
+ item.date= `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ xAxisData.push(item.date)
+ Volume.push(item.value.toFixed(2))
+ priceData.push(Number(item.price.toFixed(2)))
+ })
+
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = Volume
+ this.option.series[1].data = priceData
+
+
+ this.inCharts()
+ this.saCDDLoading = false
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchsaCDD(this.params.req, this.params.radius,this.params.start,this.params.end,this.params.sma)
+ },
+ //父级选择Sma
+ handelSonSma(smaNUm) {
+ this.params.sma = smaNUm
+ this.fetchsaCDD(this.params.req, this.params.radius,this.params.start,this.params.end,this.params.sma)
+ this.$addStorageEvent(1, "sma",this.params.sma);
+ this.realTimeData =false
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+
+
+ },
+}
\ No newline at end of file
diff --git a/yq/src/views/saCDD/index.vue b/yq/src/views/saCDD/index.vue
new file mode 100644
index 0000000..48022c0
--- /dev/null
+++ b/yq/src/views/saCDD/index.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/sadormancy/index.js b/yq/src/views/sadormancy/index.js
new file mode 100644
index 0000000..46f36da
--- /dev/null
+++ b/yq/src/views/sadormancy/index.js
@@ -0,0 +1,377 @@
+
+import * as echarts from "echarts";
+import { $addStorageEvent } from '../../util/processingData'
+import { getMempool } from "../../api/apiPost"
+import { getDormancy2 } from "@/api/realTimeData"
+import { handelZoom, chartsWidth, emptyData, handelWatermark, handelLineType, handelSwitchs } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ myChart: "",
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ formatter: (params)=> {
+
+ var res = params[0].axisValueLabel;
+
+ for (let i = 0; i < params.length; i++) {
+ if (params[i].seriesName !== `Price[BTC]`) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value} `
+
+ } else {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value} `
+
+ }
+
+ }
+
+ return res;
+
+
+ },
+
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data: []
+ },
+ yAxis: [
+ {
+ position: "left",
+ type: "value",
+ axisLabel: {
+
+
+ formatter: (value) => {
+ // let data
+ // if (value >= 1000000000) {
+ // data = `${value / 1000000000}B`
+ // } else if (value >= 1000000) {
+ // data = `${value / 1000000}M`
+ // } else {
+ // data = `${value / 1000}K`
+ // }
+ return (+value).toFixed(8)
+ }
+ }
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: true,
+ // min:`dataMin`,
+ // max:`dataMax`,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Supply-Adjusted Dormancy",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series',
+
+
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#000",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#000",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+
+
+
+ ],
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ sadormancyLoading: false,
+ params: {
+ req: "dormancy",
+ radius: "BTC",
+ start: "",
+ end: "",
+ sma: "",
+ },
+ dataSelection: [
+ {
+ value: "1d",
+ label: "home.day1",
+ disabled: false,
+ authority: "guest",
+ grade: 1,
+ },
+ {
+ value: "realTime",
+ label: "home.realTimeData",
+ disabled: false,
+ authority: "vip",
+ grade: 4,
+ },
+ ],
+ realTimeData: "",
+ switch3: "",
+ start: "",
+ end: "",
+
+
+
+ }
+ },
+ mounted() {
+
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.fetchsadormancy(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ },
+ methods: {
+ handleSelect(activeValue) {
+ if (activeValue == `1d`) {
+ this.realTimeData = false
+ this.fetchsadormancy(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ } else {
+ this.fetchBTCVolume()
+ this.realTimeData = true
+ }
+ },
+ inCharts() {
+ if (!this.myChart) {
+ this.myChart = echarts.init(document.getElementById("sadormancyBox"));
+
+ }
+
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+ this.myChart.setOption(this.option);
+ chartsWidth("sadormancyBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+
+ //请求交易量数据渲染
+ async fetchsadormancy(req, radius, start, end, sma) {
+ this.sadormancyLoading = true
+ const { data } = await this.$API.getDormancy(req, radius, start, end, sma)
+ let chartData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.sadormancyLoading = false
+ return
+ }
+ //添加水印
+ handelWatermark(this.option, 750, 300)
+ this.start = chartData[0].date.split("T")[0]
+ this.end = chartData[chartData.length - 1].date.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData = []
+ price.data.data.forEach(item => {
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ let volumeValueList = []
+ let xAxisData = []
+ chartData.forEach(item => {
+ item.sadormancy = item.sadormancy.toString()
+ volumeValueList.push(Number(item.sadormancy).toFixed(8))
+ xAxisData.push(item.date.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = volumeValueList
+ this.option.series[1].data = priceData
+ if (this.zoomStart) {
+ this.option.dataZoom[0].start = this.zoomStart
+ this.option.dataZoom[0].end = this.zoomEnd
+ } else {
+ this.option.dataZoom[0].start = 10
+ this.option.dataZoom[0].end = 100
+ }
+
+
+
+
+ this.inCharts()
+
+
+
+ setTimeout(() => {//监听echarts 图表滚动
+ this.myChart.on("dataZoom", function (e) {
+ this.zoomStart = e.start || e.batch[0].start;
+ this.zoomEnd = e.end || e.batch[0].end;
+ $addStorageEvent(1, "zoomStart", this.zoomStart);
+ $addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ });
+
+
+ })
+
+ this.sadormancyLoading = false
+
+
+
+
+
+ },
+ //实时数据
+ async fetchBTCVolume() {
+ this.sadormancyLoading = true
+ const { data } = await getDormancy2()
+ let Dormancy2Data = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.dormancyLoading = false
+ return
+ }
+
+ let Volume = []
+ let xAxisData = []
+ let priceData = []
+ Dormancy2Data.forEach(item => {
+ item.date = `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ xAxisData.push(item.date)
+ Volume.push(item.sadormancy.toFixed(2))
+ priceData.push(Number(item.price.toFixed(2)))
+ })
+
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = Volume
+ this.option.series[1].data = priceData
+
+
+ this.inCharts()
+ this.sadormancyLoading = false
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchsadormancy(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ },
+ //父级选择Sma
+ handelSonSma(smaNUm) {
+ this.params.sma = smaNUm
+ this.fetchsadormancy(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ this.$addStorageEvent(1, "sma", this.params.sma);
+ this.realTimeData = false
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+
+
+ },
+}
\ No newline at end of file
diff --git a/yq/src/views/sadormancy/index.vue b/yq/src/views/sadormancy/index.vue
new file mode 100644
index 0000000..5e3ca37
--- /dev/null
+++ b/yq/src/views/sadormancy/index.vue
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/sellRatio/index.js b/yq/src/views/sellRatio/index.js
new file mode 100644
index 0000000..cee5c3f
--- /dev/null
+++ b/yq/src/views/sellRatio/index.js
@@ -0,0 +1,499 @@
+import * as echarts from "echarts";
+// import {
+// getDateTime,handelLineType,handelSwitchs ,handelWatermark
+// } from "../../util/processingData";
+import { chartsWidth, emptyData, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+import { getTakerLongShortRatio } from "../../api/pages"
+
+export default {
+ data() {
+ return {
+ takerlongshortRatioLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "buy & sell ratio",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 1,
+ // data: [],
+
+
+ // },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ symbol: "BTCUSDT",
+ interval: "5m",
+ start: "",
+ end: "",
+ sma: "",
+ },
+ value: "5m",
+ timeIntervalList: [
+ {
+ value: "5m",
+ label: "home.minutes5",
+ },
+ {
+ value: "15m",
+ label: "home.minutes15",
+ },
+ {
+ value: "30m",
+ label: "home.minutes30",
+ },
+ {
+ value: "1h",
+ label: "home.hour1",
+ },
+ {
+ value: "2h",
+ label: "home.hour2",
+ },
+ {
+ value: "4h",
+ label: "home.hour4",
+ },
+ {
+ value: "6h",
+ label: "home.hour6",
+ },
+ {
+ value: "12h",
+ label: "home.hour12",
+ },
+ {
+ value: "1d",
+ label: "home.day1",
+ },
+ ],
+ chooseTime: "",
+ pickerMinDate: '', // 第一次选中的时间
+ pickerOptions0: {
+ onPick: obj => {
+ // console.log('obj', obj,656415645945641) // {maxDate: xxx, minDate: xxx(中国标准时间)}
+ this.pickerMinDate = new Date(obj.minDate).getTime() //开始时间
+ //判断时间间隔 计算结束时间
+ switch (this.value) {
+ case "5m":
+ //天数
+ this.endTime = Math.round((5 * 500 / 60) / 24)
+
+ break;
+ case "15m":
+ this.endTime = Math.round((15 * 500 / 60) / 24)
+ break;
+ case "30m":
+ this.endTime = Math.round((30 * 500 / 60) / 24)
+ break;
+ case "1h":
+ this.endTime = Math.round((60 * 500 / 60) / 24)
+ break;
+ case "2h":
+ this.endTime = Math.round((120 * 500 / 60) / 24)
+ break;
+ case "4h":
+ this.endTime = Math.round((240 * 500 / 60) / 24)
+ break;
+ case "6h":
+ this.endTime = Math.round((360 * 500 / 60) / 24)
+ break;
+ case "12h":
+ this.endTime = Math.round((720 * 500 / 60) / 24)
+ break;
+ case "1d":
+ this.endTime = Math.round((1440 * 500 / 60) / 24)
+ break;
+
+ default:
+ break;
+ }
+ },
+ disabledDate: time => {
+ if (this.pickerMinDate) {
+ const day1 = this.endTime * 24 * 3600 * 1000 // 可选的时间范围不超过天数
+ let maxTime = this.pickerMinDate + day1
+ let minTime = this.pickerMinDate
+ //console.log('return', time.getTime() > maxTime || time.getTime() < minTime) // 输出查看布尔值
+ // || time.getTime() < minTime
+ return time.getTime() > maxTime || time.getTime() < minTime
+ }
+
+ // return time.getTime() > Date.now();
+ },
+
+
+ //限制只能选当前日期之前的日期
+ // disabledDate(time) {
+
+ // return time.getTime() > Date.now();
+ // },
+ // onPick(a,b){
+ // console.log(a,56231);
+ // }
+ },
+ endTime: "",
+ timeDefaultShow: "",//时间框显示范围
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+ symbolList: [{
+ value: "BTCUSDT",
+ label: "BTCUSDT"
+ },
+ {
+ value: "ETHUSDT",
+ label: "ETHUSDT"
+ }],
+ }
+ },
+ mounted() {
+ this.handelStart()
+ //控制时间选择器 显示本月和上月
+ this.timeDefaultShow = new Date();
+ this.timeDefaultShow.setMonth(new Date().getMonth() - 1);
+ this.fetchTakerlongshortRatio(this.params)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+ },
+ methods: {
+ inChart() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("takerlongshortRatioBox"));
+
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+ this.myChart.setOption(this.option);
+ chartsWidth("takerlongshortRatioBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchTakerlongshortRatio(params) {
+
+ this.takerlongshortRatioLoading = true
+ const { data } = await getTakerLongShortRatio(params)
+ let TakerData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChart, this)
+ if (noData) {
+ this.takerlongshortRatioLoading = false
+ return
+ }
+ // this.start = TakerData[0].date.split("T")[0]
+ // this.end = TakerData[TakerData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ let buySellRatioValueList = []
+ let buyVolValueList = []
+ let sellVolValueList = []
+ this.option.xAxis.data = []
+ TakerData.forEach(item => {
+ this.option.xAxis.data.push(`${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`)
+ buySellRatioValueList.push(Number(item.buySellRatio.toFixed(2)))
+ // buyVolValueList.push(Number(item.buyVol.toFixed(2)))
+ // sellVolValueList.push(Number(item.sellVol.toFixed(2)))
+
+ })
+ this.option.series[0].data = buySellRatioValueList
+ // this.option.series[1].data = buyVolValueList
+ // this.option.series[2].data = sellVolValueList
+
+
+
+
+ this.inChart()
+ this.takerlongshortRatioLoading = false
+ },
+ //时间接收
+ handelSonTime(start, end) {
+
+
+ this.params.start = start
+ this.params.end = end
+ if (!this.params.start) {
+ this.handelStart()
+ }
+ this.fetchTakerlongshortRatio(this.params)
+ },
+ //选择时间间隔
+ handelTimeInterval(interval) {
+ // this.fetchTakerlongshortRatio(this.params)
+ this.params.interval = interval
+ this.fetchTakerlongshortRatio(this.params)
+
+ },
+ //时间选择
+ handelTime() {
+
+ let dateStart
+ let dateEnd
+ if (this.chooseTime) {
+ dateStart = new Date(this.chooseTime[0]);
+ dateEnd = new Date(this.chooseTime[1]);
+ this.params.start = dateStart.getTime()
+ this.params.end = dateEnd.getTime()
+ } else {
+ this.params.start = ""
+ this.params.end = ""
+ }
+
+
+ this.fetchTakerlongshortRatio(this.params)
+ // this.chooseTime = ""
+ this.pickerMinDate = ""
+ },
+ //点击确定按钮
+ handelTakerBtn() {
+ this.fetchTakerlongshortRatio(this.params)
+ },
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[3], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[4], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchTakerlongshortRatio(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+
+
+ },
+ //选择Symbol
+ handelSymbol() {
+ // this.fetchTakerlongshortRatio(this.params)
+ },
+ activeInterval(interval) {
+ if (interval) {
+ return this.timeIntervalList.find(item => item.value == interval).label
+ }
+ },
+ handelStart() {
+ let start = new Date();
+
+ start.setMonth(start.getMonth() - 1);//当前时间减去一个月
+
+ // 提取年、月和日
+ const year = start.getFullYear();
+ const month = String(start.getMonth() + 1).padStart(2, '0');
+ const day = String(start.getDate()).padStart(2, '0');
+ const formattedDate = `${year}-${month}-${day}`;
+
+ this.params.start = formattedDate
+ }
+
+ }
+}
+
+
+
diff --git a/yq/src/views/sellRatio/index.vue b/yq/src/views/sellRatio/index.vue
new file mode 100644
index 0000000..f0574d5
--- /dev/null
+++ b/yq/src/views/sellRatio/index.vue
@@ -0,0 +1,291 @@
+
+
+
+
+
+
+
+
+ {{ $t(item.label) }}
+
+
+
+ {{ $t(activeInterval(params.interval)) }}
+
+
+
{{$t(`bian.selectCycle`)}}
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/soag/index.js b/yq/src/views/soag/index.js
new file mode 100644
index 0000000..2b233d3
--- /dev/null
+++ b/yq/src/views/soag/index.js
@@ -0,0 +1,886 @@
+import * as echarts from "echarts";
+import { getSoag2 } from "../../api/realTimeData";
+import { chartsWidth, dataLength, emptyData, handelLineType, handelSwitchs, handelZoom, handelWatermark, fetchBtcPrice, handelProfitrate } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer: null,
+ soagLoading: false,
+ params: {
+ req: "soag",
+ radius: "btc"
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ axisPointer: {
+ type: "cross",
+ label: {
+ show: false,
+ // precision: 0, //坐标轴保留的位数
+ },
+ },
+
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: (params) => {
+ if (params[0].axisType == `xAxis.time`) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+ }else{
+ var res = params[0].axisValue
+ }
+
+
+
+ for (let i = 0; i < params.length; i++) {
+ if (Array.isArray(params[i].value)) {
+ if (params[i].seriesName !== `Price[BTC]`) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]}% `
+
+ } else {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+
+ } else {
+
+ if (params[i].seriesName !== `Price[BTC]`) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value}% `
+
+ } else {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value} `
+
+ }
+
+ }
+
+ }
+
+ return res
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function(name){
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true,
+
+ },
+ //默认不显示线条
+ selected: {
+ 'cdd > 1 week and cdd <= 1 month': false,
+ 'cdd > 1 month and cdd <= 2 months': false,
+ 'cdd > 2 months and cdd <=3 months': false,
+ 'cdd > 3 months and cdd <=6 months': false,
+ 'cdd > 6 months and cdd <= 1 year': false,
+ 'cdd > 1 year': false,
+
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ // data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: (value) => {
+ let data
+ if (value >= 1000000000) {
+ data = `${(value / 1000000000).toFixed(2)}B`
+ } else if (value >= 1000000) {
+ data = `${(value / 1000000).toFixed(2)}M`
+ } else if (value >= 1000) {
+ data = `${(value / 1000).toFixed(2)}K`
+ } else if (value <= -1000000000) {
+ data = `${(value / 1000000000).toFixed(2)}B`
+ } else if (value <= -1000000) {
+ data = `${(value / 1000000).toFixed(2)}M`
+ } else if (value <= -1000) {
+ data = `${(value / 1000).toFixed(2)}K`
+ } else {
+ data = value
+
+ }
+
+ return data
+ }
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right",
+ axisLabel: {
+ formatter: (value) => {
+ let data
+ if (value >= 1000000000) {
+ data = `${(value / 1000000000).toFixed(2)}B`
+ } else if (value >= 1000000) {
+ data = `${(value / 1000000).toFixed(2)}M`
+ } else if (value >= 1000) {
+ data = `${(value / 1000).toFixed(2)}K`
+ } else if (value <= -1000000000) {
+ data = `${(value / 1000000000).toFixed(2)}B`
+ } else if (value <= -1000000) {
+ data = `${(value / 1000000).toFixed(2)}M`
+ } else if (value <= -1000) {
+ data = `${(value / 1000).toFixed(2)}K`
+ } else {
+ data = value
+
+ }
+
+ return data
+ }
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ // min:"dataMin",
+ // max:"dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ // min:"dataMin",
+ // max:"dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 95,
+ end: 100,
+ minSpan: 1.5
+ },
+ {
+ start: 0,
+ end: 100,
+
+
+ },
+ ],
+ series: [
+ {
+ name: "cdd <=1 day",
+ type: "line",
+ smooth: true,
+ symbol: "circle",
+ showSymbol: false,
+ stack: 'Total',
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ // color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ color: 'rgb(55, 162, 255)',
+ },
+ lineStyle: {
+ //线条样式
+ // color: "#f7931a",
+ color: 'rgb(55, 162, 255)',
+ width: "0",
+ },
+ data: [],
+ areaStyle: {
+ opacity: 0.8,
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 0,
+ color: 'rgb(55, 162, 255)'
+ },
+ {
+ offset: 1,
+ color: 'rgb(116, 21, 219)'
+ }
+ ])
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ },
+ {
+ name: "cdd > 1 day and cdd <= 1 week",
+ type: "line",
+ stack: 'Total',
+ smooth: true,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ // color: "#9ed4e8",
+ color: 'rgb(255, 0, 135)',
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ // //线条样式
+ // color: "#9ed4e8",
+ width: "0",
+ color: 'rgb(255, 0, 135)'
+ },
+ yAxisIndex: 0,
+ data: [],
+ areaStyle: {
+ opacity: 0.8,
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 0,
+ color: 'rgb(255, 0, 135)'
+ },
+ {
+ offset: 1,
+ color: 'rgb(135, 0, 157)'
+ }
+ ])
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ },
+ {
+ name: "cdd > 1 week and cdd <= 1 month",
+ type: "line",
+ stack: 'Total',
+ smooth: true,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ // color: "#fbd88b",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ color: 'rgb(255, 191, 0)'
+ },
+ lineStyle: {
+ //线条样式
+ // color: "#fbd88b",
+ width: "0",
+ color: 'rgb(255, 191, 0)'
+ },
+ yAxisIndex: 0,
+ data: [],
+ areaStyle: {
+ opacity: 0.8,
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 0,
+ color: 'rgb(255, 191, 0)'
+ },
+ {
+ offset: 1,
+ color: 'rgb(224, 62, 76)'
+ }
+ ])
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ },
+ {
+ name: "cdd > 1 month and cdd <= 2 months",
+ type: "line",
+ smooth: true,
+ symbol: "circle",
+ showSymbol: false,
+ stack: 'Total',
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ // color: "#b2dd9a",
+ borderColor: "rgba(221,220,107,0.1)",
+ color: 'rgb(0, 221, 255)',
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ // color: "#b2dd9a",
+ color: 'rgb(0, 221, 255)',
+ width: "0",
+ },
+ yAxisIndex: 0,
+ data: [],
+ areaStyle: {
+ opacity: 0.8,
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 0,
+ color: 'rgb(0, 221, 255)'
+ },
+ {
+ offset: 1,
+ color: 'rgb(77, 119, 255)'
+ }
+ ])
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ },
+ {
+ name: "cdd > 2 months and cdd <=3 months",
+ type: "line",
+ stack: 'Total',
+ symbol: "circle",
+ showSymbol: false,
+ smooth: true,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ // color: "#879bd7",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ color: 'rgb(128, 255, 165)'
+ },
+ lineStyle: {
+ //线条样式
+ // color: "#879bd7",
+ width: "0",
+ color: 'rgb(128, 255, 165)'
+ },
+ yAxisIndex: 0,
+ data: [],
+ areaStyle: {
+ opacity: 0.8,
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 0,
+ color: 'rgb(128, 255, 165)'
+ },
+ {
+ offset: 1,
+ color: 'rgb(1, 191, 236)'
+ }
+ ])
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ },
+ {
+ name: "cdd > 3 months and cdd <=6 months",
+ type: "line",
+ smooth: true,
+ symbol: "circle",
+ showSymbol: false,
+ stack: 'Total',
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ // color: "#b6b7e9",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ color: '#d9315f'
+ },
+ lineStyle: {
+ //线条样式
+ // color: "#b6b7e9",
+ width: "0",
+ color: '#d9315f'
+ },
+ yAxisIndex: 0,
+ data: [],
+ areaStyle: {
+ opacity: 0.8,
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 0,
+ color: '#fa1e04'
+ },
+ {
+ offset: 1,
+ color: '#d9315f'
+ }
+ ])
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ },
+ {
+ name: "cdd > 6 months and cdd <= 1 year",
+ type: "line",
+ smooth: true,
+ stack: 'Total',
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ // color: "#d732a7",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ color: '#331970'
+ },
+ lineStyle: {
+ //线条样式
+ // color: "#d732a7",
+ width: "0",
+ color: '#331970'
+ },
+ yAxisIndex: 0,
+ data: [],
+ areaStyle: {
+ opacity: 0.8,
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 0,
+ color: '#331970'
+ },
+ {
+ offset: 1,
+ color: '#3273a0'
+ }
+ ])
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ },
+ {
+ name: "cdd > 1 year",
+ type: "line",
+ smooth: true,
+ stack: 'Total',
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ // color: "#fc8452",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ color: '#f3c8d7'
+ },
+ lineStyle: {
+ //线条样式
+ // color: "#fc8452",
+ width: "0",
+ color: '#f3c8d7'
+ },
+ yAxisIndex: 0,
+ data: [],
+ areaStyle: {
+ opacity: 0.8,
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 0,
+ color: '#f3c8d7'
+ },
+ {
+ offset: 1,
+ color: '#f2597f'
+ }
+ ])
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // stack: 'Total',
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ // markLine: {
+ // symbol: ["none", "none"], //去掉箭头
+ // itemStyle: {
+ // normal: {
+ // lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ // },
+ // },
+ // // lineStyle:{
+ // // color:"red"
+ // // },
+
+ // label: {
+ // formatter: "{b}",
+ // fontSize: 10,
+ // color: "rgba(0,0,0,0.8)",
+ // align: "left",
+ // },
+ // data: [
+ // // {
+ // // name: "0",
+ // // yAxis: 0,
+ // // },
+ // // {
+ // // name: "$40W",
+ // // yAxis: 400000,
+ // // },
+ // {
+ // name: "$70W",
+ // yAxis: 700000,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+
+ // {
+ // name: "$10W",
+ // yAxis: 100000,
+ // },
+ // {
+ // name: "$100W",
+ // yAxis: 1000000,
+ // // position: ['100%', '50'],
+ // },
+ // {
+ // name: "$120W",
+ // yAxis: 1200000,
+ // },
+
+ // {
+ // name: "$140W",
+ // yAxis: 1400000,
+ // },
+ // ],
+ // },
+ },
+
+ ],
+ graphic: [
+ {
+ type: 'group',
+ // rotation: Math.PI / 2,
+ bounding: 'raw',
+ right: "50%",
+ top: "40%",
+ // z: 10,
+ // rotation: 6,
+ children: [
+ {
+ type: 'text',
+ left: 'center',
+ top: 'center',
+
+ silent: true,//不影响鼠标事件
+
+ style: {
+ fill: `rgba(0,0,0,0.1)`,
+ text: `coinbus.cc`,
+ font: 'bold 80px sans-serif',
+
+ }
+ }
+ ]
+ }
+
+ ],//添加水印
+ },
+ parmesTime: {
+ start: "",
+ end: ""
+ },
+ switch3: "",
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+ start: "",
+ end: "",
+ btcFlag: true,
+ ethFlag: null,
+ dataSelection: [
+ {
+ value: "1d",
+ label: "home.day1",
+ disabled: false,
+ authority: "guest",
+ grade: 1,
+ },
+ {
+ value: "realTime",
+ label: "home.realTimeData",
+ disabled: false,
+ authority: "vip",
+ grade: 4,
+ },
+ ],
+ realTimeData: "",
+
+ }
+ },
+ mounted() {
+ this.fetchSoag(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+ })
+
+ },
+ methods: {
+ handleSelect(activeValue) {
+ if (activeValue == "1d") {
+ this.realTimeData = false
+ this.fetchSoag(this.params.req, this.params.radius)
+ } else {
+ this.fetchSoag2()
+ this.realTimeData = true
+ }
+ },
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("soagBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("soagBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchSoag2() {
+ this.soagLoading = true
+ const { data } = await getSoag2()
+ let Soag2Data = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.soagLoading = false
+ return
+ }
+
+ this.option.xAxis.type = "category"
+ this.option = handelWatermark(this.option)
+ let valueList0 = []
+ let valueList1 = []
+ let valueList2 = []
+ let valueList3 = []
+ let valueList4 = []
+ let valueList5 = []
+ let valueList6 = []
+ let valueList7 = []
+ let xAxisData = []
+ let price = []
+ Soag2Data.forEach(item => {
+ item.date = `${item.date.split("T")[0]} ${item.date.split("T")[1].split(`.`)[0]
+ } `;
+ valueList0.push(Number(item.day1.toFixed(2)))
+ valueList1.push(Number(item.day7.toFixed(2)))
+ valueList2.push(Number(item.day30.toFixed(2)))
+ valueList3.push(Number(item.day60.toFixed(2)))
+ valueList4.push(Number(item.day90.toFixed(2)))
+ valueList5.push(Number(item.day180.toFixed(2)))
+ valueList6.push(Number(item.day365.toFixed(2)))
+ valueList7.push(Number(item.day730.toFixed(2)))
+ xAxisData.push(item.date)
+ price.push(item.price.toFixed(2))
+ })
+
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = valueList0
+ this.option.series[1].data = valueList1
+ this.option.series[2].data = valueList2
+ this.option.series[3].data = valueList3
+ this.option.series[4].data = valueList4
+ this.option.series[5].data = valueList5
+ this.option.series[6].data = valueList6
+ this.option.series[7].data = valueList7
+ this.option.series[8].data = price
+
+ this.inCharts()
+ this.soagLoading = false
+
+ },
+ async fetchSoag(req, radius, start, end, sma) {
+ this.soagLoading = true
+ const { data } = await this.$API.getSoag(req, radius, start, end, sma)
+ this.soagData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.soagLoading = false
+ return
+ }
+ this.start = this.soagData[0].date.split("T")[0]
+ this.end = this.soagData[this.soagData.length - 1].date.split("T")[0]
+
+ this.handelSonBtcPrice("BTC", true)
+ this.option.xAxis.type = "time"
+ //添加水印
+ this.option = handelWatermark(this.option)
+
+ // this.option.xAxis.data.length = 0
+ this.option.series.forEach(series => series.data.length = 0)
+ let valueList0 = []
+ let valueList1 = []
+ let valueList2 = []
+ let valueList3 = []
+ let valueList4 = []
+ let valueList5 = []
+ let valueList6 = []
+ let valueList7 = []
+
+ this.soagData.forEach(item => {
+ // this.option.xAxis.data.push(item.date.split("T")[0])
+ valueList0.push(Number(item.day1.toFixed(2)))
+ valueList1.push(Number(item.day7.toFixed(2)))
+ valueList2.push(Number(item.day30.toFixed(2)))
+ valueList3.push(Number(item.day60.toFixed(2)))
+ valueList4.push(Number(item.day90.toFixed(2)))
+ valueList5.push(Number(item.day180.toFixed(2)))
+ valueList6.push(Number(item.day365.toFixed(2)))
+ valueList7.push(Number(item.day730.toFixed(2)))
+
+
+
+ // this.option.series[0].data.push(Number(item.day1.toFixed(2)))
+ // this.option.series[1].data.push( Number(item.day7.toFixed(2)))
+ // this.option.series[2].data.push(Number(item.day30.toFixed(2)))
+ // this.option.series[3].data.push(Number(item.day60.toFixed(2)))
+ // this.option.series[4].data.push(Number(item.day90.toFixed(2)))
+ // this.option.series[5].data.push(Number(item.day180.toFixed(2)))
+ // this.option.series[6].data.push(Number(item.day365.toFixed(2)))
+ // this.option.series[7].data.push(Number(item.day730.toFixed(2)))
+
+
+ })
+ // this.option.xAxis.data=[]
+ this.option.series[0].data = handelProfitrate(this.soagData, valueList0)
+ this.option.series[1].data = handelProfitrate(this.soagData, valueList1)
+ this.option.series[2].data = handelProfitrate(this.soagData, valueList2)
+ this.option.series[3].data = handelProfitrate(this.soagData, valueList3)
+ this.option.series[4].data = handelProfitrate(this.soagData, valueList4)
+ this.option.series[5].data = handelProfitrate(this.soagData, valueList5)
+ this.option.series[6].data = handelProfitrate(this.soagData, valueList6)
+ this.option.series[7].data = handelProfitrate(this.soagData, valueList7)
+ this.inCharts()
+ console.log(this.option, "没开门方法");
+ this.soagLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length),);
+
+ }, 10000)
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.parmesTime.start = start;
+ this.parmesTime.end = end;
+ this.fetchSoag(this.params.req, this.params.radius, this.parmesTime.start, this.parmesTime.end, this.sma)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.sma = smaDataList
+ this.fetchSoag(this.params.req, this.params.radius, this.parmesTime.start, this.parmesTime.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+ this.realTimeData = false
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[4], this.inChartsLine, this.start, this.end)
+ // handelSmaData(smaDataList, this.option2.series[4], this.inChartsLine2, this.start, this.end)
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+
+ fetchBtcPrice("BTC", this.option.series[8], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/soag/index.vue b/yq/src/views/soag/index.vue
new file mode 100644
index 0000000..efcb7b7
--- /dev/null
+++ b/yq/src/views/soag/index.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/sopr/index.js b/yq/src/views/sopr/index.js
new file mode 100644
index 0000000..f7ccf47
--- /dev/null
+++ b/yq/src/views/sopr/index.js
@@ -0,0 +1,625 @@
+import * as echarts from "echarts";
+import {getSopr2} from '@/api/realTimeData'
+import { handelBtcPrice, dataLength,emptyData,chartsWidth, handelProfitrate, handelZoom, handelLineType, handelSwitchs, handelWatermark, handelSmaData, getDateArray, fetchBtcPrice, fetchEthPrice } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ soprLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ if (params[0].axisType == "xAxis.time") {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+ }else{
+ var res =params[0].axisValue
+ }
+
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ formatter: function (name) {
+
+ return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ },
+ // data: [`sopr`, 'asopr', 'easopr', 'lthsopr', 'sthsopr',],
+ // selected: {
+ // 'asopr': false,
+ // 'easopr': false,
+ // 'lthsopr': false,
+ // 'sthsopr': false,
+ // }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ // axisLabel: {
+ // formatter: function (e) {
+
+ // let value;
+ // if (e > 1000000) {
+ // value = e / 100000;
+ // } else if (e > 100000) {
+ // value = e / 1000;
+ // } else {
+ // value = e / 100;
+ // }
+ // return value;
+ // },
+ // },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ // min:"dataMin",
+ // max:"dataMax"
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "SOPR",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ yAxisIndex: 0,
+ },
+ {
+ name: "SOPR(Avg)",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#ea7ac8",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#ea7ac8",
+ width: "1",
+ },
+ data: [],
+ yAxisIndex: 0,
+ },
+ {
+ name: "SOPR(Avg,<1hour)",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f49495",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f49495",
+ width: "1",
+ },
+ data: [],
+ yAxisIndex: 0,
+ },
+ {
+ name: "LTH-SOPR",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#3ba677",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#3ba677",
+ width: "1",
+ },
+ data: [],
+ yAxisIndex: 0,
+ },
+ {
+ name: "STH-SOPR",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#9262b4",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#9262b4",
+ width: "1",
+ },
+ data: [],
+ yAxisIndex: 0,
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ markLine: {
+ symbol: ["none", "none"], //去掉箭头
+ itemStyle: {
+ normal: {
+ lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ },
+ },
+ // lineStyle:{
+ // color:"red"
+ // },
+
+ label: {
+ formatter: "{b}",
+ fontSize: 10,
+ color: "rgba(0,0,0,0.8)",
+ align: "left",
+ },
+ data: [
+ // {
+ // name: "0",
+ // yAxis: 0,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+ {
+ name: "$70W",
+ yAxis: 700000,
+ },
+ {
+ name: "$40W",
+ yAxis: 400000,
+ },
+
+ {
+ name: "$10W",
+ yAxis: 100000,
+ },
+ {
+ name: "$100W",
+ yAxis: 1000000,
+ // position: ['100%', '50'],
+ },
+ {
+ name: "$120W",
+ yAxis: 1200000,
+ },
+
+ {
+ name: "$140W",
+ yAxis: 1400000,
+ },
+ ],
+ },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 6,
+ // data: [],
+ // },
+
+
+ ],
+ },
+ params: {
+ req: "sopr",
+ radius: "btc"
+ },
+ btcPrice: [],
+ priceTime: "",
+ parmesTime: {
+ start: "",
+ end: ""
+ },
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+ dataSelection: [
+ {
+ value: "1d",
+ label: "home.day1",
+ disabled:false,
+ authority:"guest",
+ grade:1,
+ },
+ {
+ value: "realTime",
+ label: "home.realTimeData",
+ disabled:false,
+ authority:"vip",
+ grade:4,
+ },
+ ],
+ realTimeData:"",
+ }
+ },
+ mounted() {
+
+ this.fetchSopr(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+ })
+
+
+ },
+ methods: {
+ handleSelect(activeValue){
+ if (activeValue=="1d") {
+ this.realTimeData = false
+ this.fetchSopr(this.params.req, this.params.radius)
+ }else{
+ this.realTimeData = true
+ this.fetchSopr2()
+ }
+ },
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("soprBox"));
+
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("soprBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchSopr2(){
+ this.soprLoading = true
+ const { data } = await getSopr2()
+ let Sopr2Data = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.soprLoading = false
+ return
+ }
+ this.option.xAxis.type = 'category'
+ this.option = handelWatermark(this.option)
+ let Sopr2 =[]
+ let asopr2 =[]
+ let easopr2 =[]
+ let lthsopr2 =[]
+ let sthsopr2 =[]
+ let xAxisData=[]
+ let price=[]
+ Sopr2Data.forEach(item=>{
+ item.date=`${item.date.split("T")[0]} ${
+ item.date.split("T")[1].split(`.`)[0]
+ } `;
+ Sopr2.push(item.sopr.toFixed(2))
+ asopr2.push(item.asopr.toFixed(2))
+ easopr2.push(item.easopr.toFixed(2))
+ lthsopr2.push(item.lthsopr.toFixed(2))
+ sthsopr2.push(item.sthsopr.toFixed(2))
+
+ xAxisData.push(item.date)
+ price.push(item.price.toFixed(2))
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = Sopr2
+ this.option.series[1].data = asopr2
+ this.option.series[2].data = easopr2
+ this.option.series[3].data = lthsopr2
+ this.option.series[4].data = sthsopr2
+ this.option.series[5].data = price
+ this.inCharts()
+ this.soprLoading = false
+ },
+
+ async fetchSopr(req, radius, start, end, sma) {
+ this.soprLoading = true
+ const { data } = await this.$API.getSopr(req, radius, start, end, sma)
+ this.soprData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.soprLoading = false
+ return
+ }
+ this.start = this.soprData[0].date.split("T")[0]
+ this.end = this.soprData[this.soprData.length - 1].date.split("T")[0]
+ this.option.xAxis.type="time"//x轴类型为时间轴
+ //添加水印
+ this.option = handelWatermark(this.option)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ //渲染ETH
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+ // //请求BTC价格
+ // const price = await this.$API.getBtcPrice(start, end);
+ // this.btcPrice = price.data.data
+
+
+ let soprValueList = []
+ let asoprValueList = []
+ let easoprValueList = []
+ let lthsoprValueList = []
+ let sthsoprValueList = []
+ // let priceValueList = []
+ // let newPriceData = []
+ this.soprData.forEach(item => {
+ soprValueList.push(Number(item.sopr.toFixed(2)))
+ asoprValueList.push(Number(item.asopr.toFixed(2)))
+ easoprValueList.push(Number(item.easopr.toFixed(2)))
+ lthsoprValueList.push(Number(item.lthsopr.toFixed(2)))
+ sthsoprValueList.push(Number(item.sthsopr.toFixed(2)))
+
+ //判断渲染与上面数据时间一致得价格数据
+ // this.btcPrice.forEach(price => {
+
+ // this.priceTime = price.time.split("T")[0]
+ // // console.log(this.timer === this.priceTime);
+ // if (time === this.priceTime) {
+
+ // priceValueList.push(Number(parseInt(price.value*100)/100))
+ // newPriceData.push(price)
+ // }
+ // })
+ })
+
+ this.option.series[0].data = handelProfitrate(this.soprData, soprValueList)
+ this.option.series[1].data = handelProfitrate(this.soprData, asoprValueList)
+ this.option.series[2].data = handelProfitrate(this.soprData, easoprValueList)
+ this.option.series[3].data = handelProfitrate(this.soprData, lthsoprValueList)
+ this.option.series[4].data = handelProfitrate(this.soprData, sthsoprValueList)
+ // this.option.series[5].data = handelBtcPrice(newPriceData, priceValueList)
+
+ this.inCharts()
+ this.soprLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.parmesTime.start = start;
+ this.parmesTime.end = end;
+ this.fetchSopr(this.params.req, this.params.radius, this.parmesTime.start, this.parmesTime.end, this.sma)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ // 请求BTC价格
+ async fetchBtcPrice(radius, start, end) {
+ //请求BTC价格
+ const price = await this.$API.getBtcPrice2(radius, start, end);
+ this.btcPrice = price.data.data
+ if (!this.btcPrice) {//价格未查询到数据的情况
+ this.option.series[5].data.length = 0
+
+ } else {
+
+ let priceValueList = []
+ let newPriceData = []
+ this.btcPrice.forEach(price => {
+ priceValueList.push(Number(parseInt(price.value * 100) / 100))
+ newPriceData.push(price)
+ })
+ this.option.series[5].data = handelBtcPrice(newPriceData, priceValueList)
+
+ }
+ this.inCharts()
+ },
+ // 请求Eth价格
+ async fetchEthPrice(radius, start, end) {
+ const price = await this.$API.getBtcPrice2(radius, start, end);
+ this.ethPrice = price.data.data
+ if (!this.ethPrice) {
+ this.option.series[6].data.length = 0
+ } else {
+ let priceValueList = []
+ let newPriceData = []
+ this.ethPrice.forEach(price => {
+ priceValueList.push(Number(parseInt(price.value * 100) / 100))
+ newPriceData.push(price)
+ })
+ this.option.series[6].data = handelBtcPrice(newPriceData, priceValueList)
+ }
+
+ this.inCharts()
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+
+ fetchBtcPrice("BTC", this.option.series[5], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[6], this.start, this.end, this.inCharts, this, this.ethFlag)
+
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.sma = smaDataList
+
+ this.fetchSopr(this.params.req, this.params.radius, this.parmesTime.start, this.parmesTime.end, this.sma)
+
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ this.realTimeData = false
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[5], this.inCharts, this.start, this.end)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/sopr/index.vue b/yq/src/views/sopr/index.vue
new file mode 100644
index 0000000..ea1fb27
--- /dev/null
+++ b/yq/src/views/sopr/index.vue
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/soprEth/index.js b/yq/src/views/soprEth/index.js
new file mode 100644
index 0000000..94e413d
--- /dev/null
+++ b/yq/src/views/soprEth/index.js
@@ -0,0 +1,352 @@
+import * as echarts from "echarts";
+import { getSoprEth, } from "../../api/pages"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ soprEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}% `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Spent Output Profit Ratio",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchsoprEth()
+ //禁用时间框
+ // this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("soprEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("soprEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchsoprEth(params) {
+ this.soprEthLoading = true
+ const { data } = await getSoprEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.soprEthLoading = false
+ return
+ }
+ let soprEthData = data.data
+ this.start = soprEthData[0].date.split("T")[0]
+ this.end = soprEthData[soprEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ soprEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(soprEthData, ValueList)
+
+ this.inCharts()
+
+ this.soprEthLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchsoprEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchsoprEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/soprEth/index.vue b/yq/src/views/soprEth/index.vue
new file mode 100644
index 0000000..041b05f
--- /dev/null
+++ b/yq/src/views/soprEth/index.vue
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/ssr/index.js b/yq/src/views/ssr/index.js
new file mode 100644
index 0000000..3c2ad7d
--- /dev/null
+++ b/yq/src/views/ssr/index.js
@@ -0,0 +1,354 @@
+import * as echarts from "echarts";
+import { takeSsr } from "../../api/pages"
+import { chartsWidth, emptyData,dataLength,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ ssrLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Stablecoin Supply Ratio (SSR)",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchSsr({})
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("ssrBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("ssrBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchSsr(params) {
+ this.ssrLoading = true
+ const { data } = await takeSsr(params)
+ let ssrData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.ssrLoading = false
+ return
+ }
+ this.start = ssrData[0].date.split("T")[0]
+ this.end = ssrData[ssrData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+ let ValueList = []
+ ssrData.forEach(item => {
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(ssrData, ValueList)
+
+
+ this.inCharts()
+
+ this.ssrLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchSsr(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchSsr(this.params)
+
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/ssr/index.vue b/yq/src/views/ssr/index.vue
new file mode 100644
index 0000000..a9c7659
--- /dev/null
+++ b/yq/src/views/ssr/index.vue
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/ssro/index.js b/yq/src/views/ssro/index.js
new file mode 100644
index 0000000..278c947
--- /dev/null
+++ b/yq/src/views/ssro/index.js
@@ -0,0 +1,350 @@
+import * as echarts from "echarts";
+import { takeSsro } from "../../api/pages"
+import { chartsWidth,emptyData, dataLength,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ ssroLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Stablecoin Supply Ratio (SSR) Oscillator",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchSsro({})
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("ssroBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("ssroBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchSsro(params) {
+ this.ssroLoading = true
+ const { data } = await takeSsro(params)
+ let ssroData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.ssroLoading = false
+ return
+ }
+ this.start = ssroData[0].date.split("T")[0]
+ this.end = ssroData[ssroData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+ let ValueList = []
+ ssroData.forEach(item => {
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(ssroData, ValueList)
+
+
+ this.inCharts()
+
+ this.ssroLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchSsro(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchSsro(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/ssro/index.vue b/yq/src/views/ssro/index.vue
new file mode 100644
index 0000000..fb7e690
--- /dev/null
+++ b/yq/src/views/ssro/index.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+ SSR Oscillator = Bollinger_Bands(200,2)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/stfDeflection copy/index.js b/yq/src/views/stfDeflection copy/index.js
new file mode 100644
index 0000000..ef1ecf1
--- /dev/null
+++ b/yq/src/views/stfDeflection copy/index.js
@@ -0,0 +1,289 @@
+import * as echarts from "echarts";
+import { takeStfDeflection } from "../../api/pages"
+import { handelBtcPrice, handelProfitrate, handelLineType, handelWatermark,handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data(){
+ return {
+ stfDeflectionLoading:false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Stock-to-Flow Deflection",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 4,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params:{
+ start:"",
+ end:"",
+ }
+
+
+ }
+ },
+ mounted(){
+ this.fetchStfDeflection()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ },
+ methods:{
+ //初始化图表
+ inCharts() {
+ this.myChart = echarts.init(document.getElementById("stfDeflectionBox"));
+
+ this.myChart.setOption(this.option);
+
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchStfDeflection(params) {
+ this.stfDeflectionLoading = true
+ const { data } = await takeStfDeflection(params)
+ let stfDeflectionData = data.data
+ this.start = stfDeflectionData[0].date.split("T")[0]
+ this.end = stfDeflectionData[stfDeflectionData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option= handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ })
+ let ValueList = []
+ stfDeflectionData.forEach(item => {
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(stfDeflectionData, ValueList)
+
+
+ this.inCharts()
+
+ this.stfDeflectionLoading = false
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchStfDeflection(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.fatherSmaData = smaDataList
+ handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/stfDeflection copy/index.vue b/yq/src/views/stfDeflection copy/index.vue
new file mode 100644
index 0000000..336c85b
--- /dev/null
+++ b/yq/src/views/stfDeflection copy/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/stfDeflection/index.js b/yq/src/views/stfDeflection/index.js
new file mode 100644
index 0000000..baa729f
--- /dev/null
+++ b/yq/src/views/stfDeflection/index.js
@@ -0,0 +1,403 @@
+import * as echarts from "echarts";
+import { takeStfDeflection } from "../../api/pages"
+import { chartsWidth, emptyData,dataLength,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ stfDeflectionLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Stock-to-Flow Deflection",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ // color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ markLine: { //添加一条横线
+ symbol: ["none", "none"], //去掉箭头
+ silent: true,
+ lineStyle: {
+ normal: {
+ color: '#000', // 这儿设置安全基线颜色
+ width: 1,
+ type: "solid"
+ }
+ },
+ data: [{
+ yAxis: 1
+ }],
+ label: {
+ normal: {
+ formatter: '',
+ position: `start`,
+ }
+ },
+ },
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+
+ ],
+ visualMap: [ // 以1为基线,大于1为绿色, 小于等于1为红色 lt(小于 gt(大于 lte(小于等于 gte(大于等于
+ {
+
+ show: true,
+ // dimension: 1,
+ itemWidth: 30,
+ text: ['SFD>1', 'SFD<1'],
+ seriesIndex: 0,
+ right: "2%",
+ top: "2%",
+ inRange: {
+ color: ['#121122', 'rgba(3,4,5,0.4)', 'red'],
+ // symbolSize: [30, 100]
+ },
+ pieces: [{
+ gt: -99999,
+ lt: 1,
+ color: 'green'
+ }, {
+ gte: 1,
+ color: 'red'
+ // green
+ }],
+ }
+ ],
+
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchStfDeflection({})
+
+
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("stfDeflectionBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("stfDeflectionBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchStfDeflection(params) {
+ this.stfDeflectionLoading = true
+ const { data } = await takeStfDeflection(params)
+ let stfDeflectionData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.stfDeflectionLoading = false
+ return
+ }
+ this.start = stfDeflectionData[0].date.split("T")[0]
+ this.end = stfDeflectionData[stfDeflectionData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+ let ValueList = []
+ stfDeflectionData.forEach(item => {
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(stfDeflectionData, ValueList)
+
+
+ this.inCharts()
+
+ this.stfDeflectionLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchStfDeflection(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchStfDeflection(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/stfDeflection/index.vue b/yq/src/views/stfDeflection/index.vue
new file mode 100644
index 0000000..3c4b4a9
--- /dev/null
+++ b/yq/src/views/stfDeflection/index.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+ S/F Deflection = Price/( circulating supply/newly mined bitcoins)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/stfRatio/index.js b/yq/src/views/stfRatio/index.js
new file mode 100644
index 0000000..b171685
--- /dev/null
+++ b/yq/src/views/stfRatio/index.js
@@ -0,0 +1,446 @@
+import * as echarts from "echarts";
+import { takeStfRatio } from "../../api/pages"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ stfRatioLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Stock-to-Flow Ratio",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ // color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 0,
+ data: [
+
+ ],
+ markLine: {
+ silent: true,
+ symbol: ["none", "none"],
+ lineStyle: {
+ color: "#ccc",
+ },
+ animation: false, //关闭动画
+ label: {
+ show: false,
+ },
+ data: [
+ {
+ xAxis: 1,//在x轴12格处设置一条参考线
+ },
+ ],
+ },
+
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ // visualMap: {
+ // type: "piecewise",
+ // show: false,
+ // dimension: 1,
+ // seriesIndex: 1,
+ // pieces: [
+ // {
+ // gte: 0,
+ // lte: 3000,
+ // color: "rgba(41,11,236,0.68)",//大于0小于12为蓝色
+ // },
+ // {
+ // gte: 4000,
+ // lte: 10000,
+ // color: "rgba(229,27,88,0.68)",//大于12区间为红色
+ // },
+ // ],
+ // outOfRange: {
+ // color: `#ff4d4d`
+ // }
+ // },
+
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchStfRatio({})
+ //禁用时间框
+ // this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("stfRatioBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+ // this.option = this.calculateColor(this.option)
+ this.myChart.setOption(this.option);
+ chartsWidth("stfRatioBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchStfRatio(params) {
+ this.stfRatioLoading = true
+ const { data } = await takeStfRatio(params)
+ let stfRatioData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.stfRatioLoading = false
+ return
+ }
+ this.start = stfRatioData[0].date.split("T")[0]
+ this.end = stfRatioData[stfRatioData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true, stfRatioData)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+ let ValueList = []
+ stfRatioData.forEach(item => {
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(stfRatioData, ValueList)
+
+
+
+ this.inCharts()
+
+
+
+ this.stfRatioLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchStfRatio(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag, data) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag, data, this.option.visualMap)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchStfRatio(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ //计算颜色
+ calculateColor(data) {//lt(小于 gt(大于 lte(小于等于 gte(大于等于
+ let key = void 0
+ let nvlArr = [
+ { gte: 2000, lte: 3000, color: 'yellow' },
+ { gte: 5000, lte: 20000, color: 'green' },
+ { gte: 2500, lte: 3000, color: '#000' }
+ ]
+ //计算数据
+ // let oneData = { ...data.series[0] }.data
+ // let twoData = { ...data.series[1] }.data
+ // for (let index = 0; index < twoData.length; index++) {
+ // //当前数据
+ // let one = +oneData[index][1] //对比线
+ // let two = +twoData[index][1]//操作线
+ // if (twoData[index + 1]) {
+ // if (index === 0) {
+ // //初始化添加一条
+ // nvlArr.push({ gte: two, lte: two, color: two > one ? 'red' : 'yellow' })
+ // key = two > one ? 1 : 0
+ // } else {
+ // if (key === 1) {
+ // if (two > one) {
+ // nvlArr[nvlArr.length - 1].lte = two
+ // } else {
+ // nvlArr.push({ gte: one, lte: two, color:'yellow' })
+ // key = two > one ? 1 : 0
+ // }
+ // } else {
+ // if (two > one) {
+ // nvlArr.push({ gte: one, lte: two, color:'red' })
+ // key = two > one ? 1 : 0
+
+ // } else {
+ // nvlArr[nvlArr.length - 1].lte = two
+ // }
+ // }
+ // }
+
+ // }
+
+ // }
+ //设置每个点颜色
+ console.log(nvlArr)
+ data.visualMap.pieces = nvlArr
+ return data
+ }
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/stfRatio/index.vue b/yq/src/views/stfRatio/index.vue
new file mode 100644
index 0000000..b7724cf
--- /dev/null
+++ b/yq/src/views/stfRatio/index.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
+ S/F = circulating supply/newly mined bitcoins
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/sthLossSupply/index.js b/yq/src/views/sthLossSupply/index.js
new file mode 100644
index 0000000..96cb814
--- /dev/null
+++ b/yq/src/views/sthLossSupply/index.js
@@ -0,0 +1,332 @@
+import * as echarts from "echarts";
+import { fetchSthLossSupply } from "../../api/apiPost"
+import { chartsWidth, emptyData,logyAxis, dataLength, handelProfitrate, handelZoom, handelLineType, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ sthLossSupplyLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ // min: "dataMin",
+ // max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ // min: "dataMin",
+ // max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Short-Term Holder Supply in Loss",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ this.fetchSthLossSupply(this.params.req, this.params.radius)
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("sthLossSupplyBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("sthLossSupplyBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchSthLossSupply(params) {
+ this.sthLossSupplyLoading = true
+ const { data } = await fetchSthLossSupply(params)
+
+ let sthLossSupplyData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.sthLossSupplyLoading = false
+ return
+ }
+
+ this.start = sthLossSupplyData[0].date.split("T")[0]
+ this.end = sthLossSupplyData[sthLossSupplyData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ let profitValueList = []
+
+
+ sthLossSupplyData.forEach(item => {
+
+ profitValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ // profitValueList = logyAxis(profitValueList)
+
+ console.log(profitValueList.includes(0), profitValueList);
+
+ this.option.series[0].data = handelProfitrate(sthLossSupplyData, profitValueList)
+
+
+
+ this.inCharts()
+ this.sthLossSupplyLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchSthLossSupply(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/sthLossSupply/index.vue b/yq/src/views/sthLossSupply/index.vue
new file mode 100644
index 0000000..918f1b8
--- /dev/null
+++ b/yq/src/views/sthLossSupply/index.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+ Loss for STH = number of balance where Price <= Price_created and Holder Time < 155days
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/sthNUPLEth/index.js b/yq/src/views/sthNUPLEth/index.js
new file mode 100644
index 0000000..8f3cda5
--- /dev/null
+++ b/yq/src/views/sthNUPLEth/index.js
@@ -0,0 +1,348 @@
+import * as echarts from "echarts";
+import { getSthNUPLEth, } from "../../api/pages"
+import { chartsWidth,emptyData, handelProfitrate,dataLength, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ sthNUPLEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}% `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Short Term Holder NUPL",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchsthNUPLEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("sthNUPLEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("sthNUPLEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchsthNUPLEth(params) {
+ this.sthNUPLEthLoading = true
+ const { data } = await getSthNUPLEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+ // /空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.sthNUPLEthLoading = false
+ return
+ }
+ let sthNUPLEthData = data.data
+ this.start = sthNUPLEthData[0].date.split("T")[0]
+ this.end = sthNUPLEthData[sthNUPLEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ sthNUPLEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(sthNUPLEthData, ValueList)
+
+ this.inCharts()
+
+ this.sthNUPLEthLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchsthNUPLEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchsthNUPLEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/sthNUPLEth/index.vue b/yq/src/views/sthNUPLEth/index.vue
new file mode 100644
index 0000000..5ceb7fc
--- /dev/null
+++ b/yq/src/views/sthNUPLEth/index.vue
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/sthProfitRatio/index.js b/yq/src/views/sthProfitRatio/index.js
new file mode 100644
index 0000000..5954baf
--- /dev/null
+++ b/yq/src/views/sthProfitRatio/index.js
@@ -0,0 +1,329 @@
+import * as echarts from "echarts";
+import { fetchSthProfitRatio } from "../../api/apiPost"
+import { chartsWidth, dataLength, emptyData,handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ sthProfitRatioLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Short-Term Holder (STH) Profit/Loss Ratio",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ this.fetchSthProfitRatio(this.params.req, this.params.radius)
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("sthProfitRatioBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("sthProfitRatioBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchSthProfitRatio(params) {
+ this.sthProfitRatioLoading = true
+ const { data } = await fetchSthProfitRatio(params)
+
+ let sthProfitRatioData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.sthProfitRatioLoading = false
+ return
+ }
+
+ this.start = sthProfitRatioData[0].date.split("T")[0]
+ this.end = sthProfitRatioData[sthProfitRatioData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ let profitValueList = []
+
+
+ sthProfitRatioData.forEach(item => {
+
+ profitValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(sthProfitRatioData, profitValueList)
+
+
+
+ this.inCharts()
+ this.sthProfitRatioLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+
+ this.fetchSthProfitRatio(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/sthProfitRatio/index.vue b/yq/src/views/sthProfitRatio/index.vue
new file mode 100644
index 0000000..94fcfa3
--- /dev/null
+++ b/yq/src/views/sthProfitRatio/index.vue
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/sthProfitSupply/index.js b/yq/src/views/sthProfitSupply/index.js
new file mode 100644
index 0000000..ea89134
--- /dev/null
+++ b/yq/src/views/sthProfitSupply/index.js
@@ -0,0 +1,329 @@
+import * as echarts from "echarts";
+import { fetchSthProfitSupply } from "../../api/apiPost"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ sthProfitSupplyLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ // min: "dataMin",
+ max: "dataMax",
+ min:"dataMin", // 对数刻度的最小值
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Short-Term Holder Supply in Profit",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ this.fetchSthProfitSupply(this.params.req, this.params.radius)
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("sthProfitSupplyBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("sthProfitSupplyBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchSthProfitSupply(params) {
+ this.sthProfitSupplyLoading = true
+ const { data } = await fetchSthProfitSupply(params)
+
+ let sthProfitSupplyData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.sthProfitSupplyLoading = false
+ return
+ }
+
+ this.start = sthProfitSupplyData[0].date.split("T")[0]
+ this.end = sthProfitSupplyData[sthProfitSupplyData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ let profitValueList = []
+
+
+ sthProfitSupplyData.forEach(item => {
+
+ profitValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(sthProfitSupplyData, profitValueList)
+
+
+
+ this.inCharts()
+ this.sthProfitSupplyLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchSthProfitSupply(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/sthProfitSupply/index.vue b/yq/src/views/sthProfitSupply/index.vue
new file mode 100644
index 0000000..6277b85
--- /dev/null
+++ b/yq/src/views/sthProfitSupply/index.vue
@@ -0,0 +1,37 @@
+
+
+
+
+ Profit for STH = number of balance where Price > Price_created and Holder Time < 155days
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/sthSupply/index.js b/yq/src/views/sthSupply/index.js
new file mode 100644
index 0000000..f64bfa1
--- /dev/null
+++ b/yq/src/views/sthSupply/index.js
@@ -0,0 +1,332 @@
+import * as echarts from "echarts";
+import { fetchSthSupply } from "../../api/apiPost"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ sthSupplyLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Short-Term Holder Supply",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ this.fetchSthSupply()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("sthSupplyBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("sthSupplyBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchSthSupply(params) {
+ this.sthSupplyLoading = true
+ const { data } = await fetchSthSupply(params)
+
+ let sthSupplyData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.sthSupplyLoading = false
+ return
+ }
+
+ this.start = sthSupplyData[0].date.split("T")[0]
+ this.end = sthSupplyData[sthSupplyData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ let profitValueList = []
+
+
+ sthSupplyData.forEach(item => {
+
+ profitValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(sthSupplyData, profitValueList)
+
+
+
+ this.inCharts()
+ this.sthSupplyLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+
+ this.fetchSthSupply(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/sthSupply/index.vue b/yq/src/views/sthSupply/index.vue
new file mode 100644
index 0000000..c3909f2
--- /dev/null
+++ b/yq/src/views/sthSupply/index.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/sthmvrv/index.js b/yq/src/views/sthmvrv/index.js
new file mode 100644
index 0000000..dcc7b49
--- /dev/null
+++ b/yq/src/views/sthmvrv/index.js
@@ -0,0 +1,518 @@
+import * as echarts from "echarts";
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ sthmvrvLoading: false,
+ params: {
+ req: "sthmvrv",
+ radius: "btc"
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ formatter: function (name) {
+
+ return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "log",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "STH-MVRV",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ // {
+ // name: "STH-MV",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // showSymbol: false,
+ // symbolSize: 5,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#8e62b2",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // yAxisIndex: 3,
+ // lineStyle: {
+ // //线条样式
+ // color: "#8e62b2",
+ // width: "1",
+ // },
+ // data: [],
+ // },
+ // {
+ // name: "STH-RV",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // showSymbol: false,
+ // symbolSize: 5,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#b73127",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // yAxisIndex: 2,
+ // lineStyle: {
+ // //线条样式
+ // color: "#b73127",
+ // width: "1",
+ // },
+ // data: [],
+ // },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ markLine: {
+ symbol: ["none", "none"], //去掉箭头
+ itemStyle: {
+ normal: {
+ lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ },
+ },
+ // lineStyle:{
+ // color:"red"
+ // },
+
+ label: {
+ formatter: "{b}",
+ fontSize: 10,
+ color: "rgba(0,0,0,0.8)",
+ align: "left",
+ },
+ data: [
+ {
+ name: "$0.02",
+ yAxis: 0.02,
+ },
+ {
+ name: "$0.06",
+ yAxis: 0.06,
+ },
+ {
+ name: "$0.1",
+ yAxis: 0.1,
+ },
+ {
+ name: "$0.4",
+ yAxis: 0.4,
+ },
+ {
+ name: "$0.8",
+ yAxis: 0.8,
+ },
+ {
+ name: "$2",
+ yAxis: 2,
+ },
+ {
+ name: "$6",
+ yAxis: 6,
+ },
+ {
+ name: "$10",
+ yAxis: 10,
+ },
+ {
+ name: "$40",
+ yAxis: 40,
+ },
+ {
+ name: "$80",
+ yAxis: 80,
+ },
+ // {
+ // name: "$120",
+ // yAxis: 120,
+ // },
+ {
+ name: "$160",
+ yAxis: 160,
+ },
+ // {
+ // name: "$200",
+ // yAxis: 200,
+ // },
+ {
+ name: "$240",
+ yAxis: 240,
+ },
+ {
+ name: "$300",
+ yAxis: 300,
+ },
+ {
+ name: "$500",
+ yAxis: 500,
+ },
+ {
+ name: "$700",
+ yAxis: 700,
+ },
+ {
+ name: "$900",
+ yAxis: 900,
+ },
+ {
+ name: "$1100",
+ yAxis: 1100,
+ },
+ // {
+ // name: "$1200",
+ // yAxis: 1200,
+ // },
+ {
+ name: "$1800",
+ yAxis: 1800,
+ },
+ {
+ name: "$3000",
+ yAxis: 3000,
+ },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+ {
+ name: "$70W",
+ yAxis: 700000,
+ },
+ {
+ name: "$40W",
+ yAxis: 400000,
+ },
+
+ {
+ name: "$10W",
+ yAxis: 100000,
+ },
+ {
+ name: "$100W",
+ yAxis: 1000000,
+ // position: ['100%', '50'],
+ },
+ {
+ name: "$120W",
+ yAxis: 1200000,
+ },
+
+ {
+ name: "$140W",
+ yAxis: 1400000,
+ },
+ ],
+ },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+ this.fetchSthmvrv(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("sthmvrvBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("sthmvrvBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchSthmvrv(req, radius, start, end, sma) {
+ this.sthmvrvLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+ let sthmvrvData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.sthmvrvLoading = false
+ return
+ }
+ this.start = sthmvrvData[0].date.split("T")[0]
+ this.end = sthmvrvData[sthmvrvData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ //渲染ETH
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ let sthmvrvValueList = []
+ let marketcapValueList = []
+ let rcapValueList = []
+
+ sthmvrvData.forEach(item => {
+
+ sthmvrvValueList.push(Number(item.mvrv.toFixed(2)))
+ marketcapValueList.push(Number(item.marketcap.toFixed(2)))
+ rcapValueList.push(Number(item.rcap.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(sthmvrvData, sthmvrvValueList)
+ // this.option.series[1].data = handelProfitrate(sthmvrvData, marketcapValueList)
+ // this.option.series[2].data = handelProfitrate(sthmvrvData, rcapValueList)
+
+
+ this.inCharts()
+ this.sthmvrvLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchSthmvrv(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.sma = smaDataList
+ this.fetchSthmvrv(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[3], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/sthmvrv/index.vue b/yq/src/views/sthmvrv/index.vue
new file mode 100644
index 0000000..97e9da8
--- /dev/null
+++ b/yq/src/views/sthmvrv/index.vue
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/sthnupl/index.js b/yq/src/views/sthnupl/index.js
new file mode 100644
index 0000000..ac3cc84
--- /dev/null
+++ b/yq/src/views/sthnupl/index.js
@@ -0,0 +1,469 @@
+import * as echarts from "echarts";
+import { chartsWidth,emptyData, dataLength,handelProfitrate, handelLineType, handelZoom, handelSwitchs, handelWatermark, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ sthnuplLoading: false,
+ params: {
+ req: "sthnupl",
+ radius: "btc"
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // min: "dataMin",
+ // max: "dataMax",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ // min: "dataMin",
+ // max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "STH-NUPL",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ // markLine: {
+ // symbol: ["none", "none"], //去掉箭头
+ // itemStyle: {
+ // normal: {
+ // lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ // },
+ // },
+ // // lineStyle:{
+ // // color:"red"
+ // // },
+
+ // label: {
+ // formatter: "{b}",
+ // fontSize: 10,
+ // color: "rgba(0,0,0,0.8)",
+ // align: "left",
+ // },
+ // data: [
+ // {
+ // name: "$0.02",
+ // yAxis: 0.02,
+ // },
+ // {
+ // name: "$0.06",
+ // yAxis: 0.06,
+ // },
+ // {
+ // name: "$0.1",
+ // yAxis: 0.1,
+ // },
+ // {
+ // name: "$0.4",
+ // yAxis: 0.4,
+ // },
+ // {
+ // name: "$0.8",
+ // yAxis: 0.8,
+ // },
+ // {
+ // name: "$2",
+ // yAxis: 2,
+ // },
+ // {
+ // name: "$6",
+ // yAxis: 6,
+ // },
+ // {
+ // name: "$10",
+ // yAxis: 10,
+ // },
+ // {
+ // name: "$40",
+ // yAxis: 40,
+ // },
+ // {
+ // name: "$80",
+ // yAxis: 80,
+ // },
+ // // {
+ // // name: "$120",
+ // // yAxis: 120,
+ // // },
+ // {
+ // name: "$160",
+ // yAxis: 160,
+ // },
+ // // {
+ // // name: "$200",
+ // // yAxis: 200,
+ // // },
+ // {
+ // name: "$240",
+ // yAxis: 240,
+ // },
+ // {
+ // name: "$300",
+ // yAxis: 300,
+ // },
+ // {
+ // name: "$500",
+ // yAxis: 500,
+ // },
+ // {
+ // name: "$700",
+ // yAxis: 700,
+ // },
+ // {
+ // name: "$900",
+ // yAxis: 900,
+ // },
+ // {
+ // name: "$1100",
+ // yAxis: 1100,
+ // },
+ // // {
+ // // name: "$1200",
+ // // yAxis: 1200,
+ // // },
+ // {
+ // name: "$1800",
+ // yAxis: 1800,
+ // },
+ // {
+ // name: "$3000",
+ // yAxis: 3000,
+ // },
+ // // {
+ // // name: "$40W",
+ // // yAxis: 400000,
+ // // },
+ // {
+ // name: "$70W",
+ // yAxis: 700000,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+
+ // {
+ // name: "$10W",
+ // yAxis: 100000,
+ // },
+ // {
+ // name: "$100W",
+ // yAxis: 1000000,
+ // // position: ['100%', '50'],
+ // },
+ // {
+ // name: "$120W",
+ // yAxis: 1200000,
+ // },
+
+ // {
+ // name: "$140W",
+ // yAxis: 1400000,
+ // },
+ // ],
+ // },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 2,
+ // data: [],
+ // },
+
+
+ ],
+ },
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+
+ this.fetchSthnupl(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("sthnuplBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("sthnuplBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchSthnupl(req, radius, start, end, sma) {
+ this.sthnuplLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+ let sthnuplData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.sthnuplLoading = false
+ return
+ }
+ this.start = sthnuplData[0].date.split("T")[0]
+ this.end = sthnuplData[sthnuplData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ //渲染ETH
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+
+ let sthnuplValueList = []
+
+ sthnuplData.forEach(item => {
+
+ sthnuplValueList.push(Number(item.value.toFixed(4)))
+
+
+ })
+ this.option.series[0].data = handelProfitrate(sthnuplData, sthnuplValueList)
+ this.inCharts()
+ this.sthnuplLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchSthnupl(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.sma = smaDataList
+ this.fetchSthnupl(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/yq/src/views/sthnupl/index.vue b/yq/src/views/sthnupl/index.vue
new file mode 100644
index 0000000..0f1e0b7
--- /dev/null
+++ b/yq/src/views/sthnupl/index.vue
@@ -0,0 +1,162 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/subscribAaudit/index.js b/yq/src/views/subscribAaudit/index.js
new file mode 100644
index 0000000..1ae20f0
--- /dev/null
+++ b/yq/src/views/subscribAaudit/index.js
@@ -0,0 +1,79 @@
+export default {
+ data() {
+ return {
+ tableData: [{
+ date: '2016-05-03',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-02',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-04',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-01',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-08',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-06',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-07',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }],
+ reportList: {
+ type: "",
+ people: "",
+ time: "",
+ title: "",
+ content: "",
+
+ },
+ value3: "",
+ ruleForm: {
+ //...省略其他
+ articleBody: '',
+ },
+ rules: {
+ //..省略其他
+ articleBody: [
+ { required: true, message: '请输入文本', trigger: 'change' }
+ ],
+ },
+ editorOption:{//富文本配置
+ placeholder: '请输入内容',
+ }
+
+
+
+ }
+ },
+ mounted() {
+
+ },
+ methods: {
+ //点击消息详情
+ handelDetails() {
+ this.activeName = "message"
+ },
+ //点击标签页
+ handleClick() {
+
+ },
+ //点击消息历史的详情
+ handelCustomizeDetails() {
+ // this.$router.push(`/subscribeDetails`)
+ this.activeName = "message"
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/subscribAaudit/index.vue b/yq/src/views/subscribAaudit/index.vue
new file mode 100644
index 0000000..7239172
--- /dev/null
+++ b/yq/src/views/subscribAaudit/index.vue
@@ -0,0 +1,248 @@
+
+
+
+
审核详情
+
+
+
+
+ 提交时间:
+
+
+
+
+ 报告类型:
+
+
+
+
+ 报告者:
+
+
+
+
+ 报告计划发出日期和时间:
+
+
+
+
+
+ 报告标题:
+
+
+
+
+ 报告内容:
+
+
+
+
+
+
+
+ 审核意见:
+
+
+
+ 接受
+ 拒绝
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/subscribe/index.js b/yq/src/views/subscribe/index.js
new file mode 100644
index 0000000..4e06666
--- /dev/null
+++ b/yq/src/views/subscribe/index.js
@@ -0,0 +1,77 @@
+export default{
+ data(){
+ return {
+ tableData: [{
+ date: '2016-05-03',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-02',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-04',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-01',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-08',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-06',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-07',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }],
+ activeName:"first",
+ email:"",
+ options: [{
+ value: '选项1',
+ label: '黄金糕'
+ }, {
+ value: '选项2',
+ label: '双皮奶'
+ }, {
+ value: '选项3',
+ label: '蚵仔煎'
+ }, {
+ value: '选项4',
+ label: '龙须面'
+ }, {
+ value: '选项5',
+ label: '北京烤鸭'
+ }],
+ period:"",
+ inputPeriod:"",
+ content:"这是一段内容"
+
+
+ }
+ },
+ mounted(){
+
+ },
+ methods:{
+ //点击消息详情
+ handelDetails(){
+ this.activeName="message"
+ },
+ //点击标签页
+ handleClick(){
+
+ },
+ //点击消息历史的详情
+ handelCustomizeDetails(){
+ // this.$router.push(`/subscribeDetails`)
+ this.activeName="message"
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/subscribe/index.vue b/yq/src/views/subscribe/index.vue
new file mode 100644
index 0000000..cdd8038
--- /dev/null
+++ b/yq/src/views/subscribe/index.vue
@@ -0,0 +1,481 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/subscribeBoard/index.js b/yq/src/views/subscribeBoard/index.js
new file mode 100644
index 0000000..29576eb
--- /dev/null
+++ b/yq/src/views/subscribeBoard/index.js
@@ -0,0 +1,54 @@
+import * as echarts from "echarts";
+import { msgBoradTabel, msgBoradNum, responMsg } from "../../api/messageBoard"
+export default {
+ data() {
+ return {
+ from: [{
+ id: 0,
+ userDate:"",
+ userName:"",
+ msgPage:"",
+ userMsg:""
+
+
+ }]
+
+
+ }
+ },
+ mounted() {
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ this.myChart = echarts.init(document.getElementById("MessageBoardBox"));
+
+ this.myChart.setOption(this.option);
+
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+
+ //点击待审核列表的审核
+ clickRowAaudit(a, b) {
+ //每一行的ID
+ // this.submitReply.msg_id = b[a].id
+ // this.dialogFormVisible = true
+ // console.log(a,b,6666666);
+ this.$router.push(`/subscribAaudit`)
+ },
+ //确定提交回复
+ handelSubmitReply() {
+
+ this.fetchResponMsg(this.submitReply)
+ this.dialogFormVisible = false
+ },
+ //报告发布
+ handelReportRelease(){
+ this.$router.push(`/subscribeRelease`)
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/subscribeBoard/index.vue b/yq/src/views/subscribeBoard/index.vue
new file mode 100644
index 0000000..39f0e6f
--- /dev/null
+++ b/yq/src/views/subscribeBoard/index.vue
@@ -0,0 +1,309 @@
+
+
+
+
+
+
+
+ {{$t(`subscribe.dayReport`)}}:
+ 200
+
+
+
+
+ {{$t(`subscribe.greatReport`)}}:
+ 100
+
+
+
+
+ {{$t(`subscribe.customizeMessage`)}}: 500
+
+
+
+
+ {{$t(`subscribe.unauditedReport`)}}: 10000
+
+
+
+
+
+
+ {{$t(`subscribe.reviewedReport`)}}:
+ 200
+
+
+
+
+
+
+
+ {{$t(`subscribe.chart`)}}
+
+
+
+ 图表
+
+
+
+
+
+
+ {{$t(`subscribe.ReportRelease`)}}
+
+
+
+
+
+ {{$t(`subscribe.beReviewedRelease`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`subscribe.audit`)}}
+
+
+
+
+
+
+
+
+
+
+ {{$t(`subscribe.rejectedRelease`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`subscribe.correction`)}}
+
+
+
+
+
+
+
+
+
+
+ {{$t(`subscribe.publishedRelease`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`subscribe.details`)}}
+
+
+
+
+
+
+
+
+
+
+ {{$t(`subscribe.customizeHistory`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`subscribe.details`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/subscribeDetails/index.js b/yq/src/views/subscribeDetails/index.js
new file mode 100644
index 0000000..1a3a7fd
--- /dev/null
+++ b/yq/src/views/subscribeDetails/index.js
@@ -0,0 +1,44 @@
+export default{
+ data(){
+ return {
+ tableData: [{
+ date: '2016-05-03',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-02',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-04',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-01',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-08',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-06',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-07',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }],
+ content:"这是一段内容"
+
+ }
+ },
+ mounted(){
+
+ },
+ methods:{
+
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/subscribeDetails/index.vue b/yq/src/views/subscribeDetails/index.vue
new file mode 100644
index 0000000..0dbfac4
--- /dev/null
+++ b/yq/src/views/subscribeDetails/index.vue
@@ -0,0 +1,45 @@
+
+
+
+
+ 时间:
+
+
+ 2023/02/14
+
+
+
+
+ 消息标题:
+
+ 这是一个标题
+
+
+
+
+ 消息内容:
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/subscribeRelease/index.js b/yq/src/views/subscribeRelease/index.js
new file mode 100644
index 0000000..1ae20f0
--- /dev/null
+++ b/yq/src/views/subscribeRelease/index.js
@@ -0,0 +1,79 @@
+export default {
+ data() {
+ return {
+ tableData: [{
+ date: '2016-05-03',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-02',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-04',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-01',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-08',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-06',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }, {
+ date: '2016-05-07',
+ name: '王小虎',
+ address: '上海市普陀区金沙江路 1518 弄'
+ }],
+ reportList: {
+ type: "",
+ people: "",
+ time: "",
+ title: "",
+ content: "",
+
+ },
+ value3: "",
+ ruleForm: {
+ //...省略其他
+ articleBody: '',
+ },
+ rules: {
+ //..省略其他
+ articleBody: [
+ { required: true, message: '请输入文本', trigger: 'change' }
+ ],
+ },
+ editorOption:{//富文本配置
+ placeholder: '请输入内容',
+ }
+
+
+
+ }
+ },
+ mounted() {
+
+ },
+ methods: {
+ //点击消息详情
+ handelDetails() {
+ this.activeName = "message"
+ },
+ //点击标签页
+ handleClick() {
+
+ },
+ //点击消息历史的详情
+ handelCustomizeDetails() {
+ // this.$router.push(`/subscribeDetails`)
+ this.activeName = "message"
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/subscribeRelease/index.vue b/yq/src/views/subscribeRelease/index.vue
new file mode 100644
index 0000000..f3d3eb4
--- /dev/null
+++ b/yq/src/views/subscribeRelease/index.vue
@@ -0,0 +1,235 @@
+
+
+
+
报告发布
+
+
+
+
+
+ 报告类型:
+
+
+
+
+ 报告者:
+
+
+
+
+ 报告计划发出日期和时间:
+
+
+
+
+
+
+ 报告标题:
+
+
+
+
+ 报告内容:
+
+
+
+
+
+
+
+
+
+
+
+
+ 提交
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/subscriptionLetter/index.js b/yq/src/views/subscriptionLetter/index.js
new file mode 100644
index 0000000..6d4d5c9
--- /dev/null
+++ b/yq/src/views/subscriptionLetter/index.js
@@ -0,0 +1,267 @@
+import * as echarts from "echarts";
+import { msgBoradTabel, msgBoradNum, responMsg } from "../../api/messageBoard"
+import { privateOrder } from "../../api/pay"
+import { Debounce } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ from: [{
+ id: 0,
+ title: "标题1",
+ source: "来源1",
+ date: "2023-12-8",
+ },
+ {
+ id: 0,
+ title: "标题22",
+ source: "来源222",
+ date: "2023-12-7",
+ },
+ {
+ id: 0,
+ title: "标题22",
+ source: "来源222",
+ date: "2023-12-7",
+ },
+ {
+ id: 0,
+ title: "标题22",
+ source: "来源222",
+ date: "2023-12-7",
+ },
+ {
+ id: 0,
+ title: "标题22",
+ source: "来源222",
+ date: "2023-12-7",
+ },
+ {
+ id: 0,
+ title: "标题22",
+ source: "来源222",
+ date: "2023-12-7",
+ },
+ {
+ id: 0,
+ title: "标题22",
+ source: "来源222",
+ date: "2023-12-7",
+ },
+ {
+ id: 0,
+ title: "标题22",
+ source: "来源222",
+ date: "2023-12-7",
+ },
+ ],
+ successData: [{
+ id: 0,
+ userDate: "",
+ userName: "",
+ msgPage: "",
+ userMsg: ""
+
+
+ }],
+ failData: [{
+ id: 0,
+ userDate: "",
+ userName: "",
+ msgPage: "",
+ userMsg: ""
+
+
+ }],
+ params: {
+ page: 1,
+ limit: "300",
+ status: ""
+ },
+ payHistories: false,
+ activeName: "Unread",
+ currentPage1: 1,
+ pageSizes: [1, 50, 100,],
+ totalLimit1: 3,
+ }
+ },
+ mounted() {
+ // this.params.status=2
+ // this.fetchPrivateOrder2(this.params)
+ // this.params.status=0
+ // this.fetchPrivateOrder0(this.params)
+ // this.params.status=1
+ // this.fetchPrivateOrder1(this.params)
+ },
+ methods: {
+
+ //请求支付历史 待处理
+ async fetchPrivateOrder2(params) {
+ this.payHistories = true
+ const { data } = await privateOrder(params)
+ this.from = data.rows
+ this.payHistories = false
+
+ },
+ //请求支付历史 成功
+ async fetchPrivateOrder1(params) {
+ this.payHistories = true
+ const { data } = await privateOrder(params)
+ this.successData = data.rows
+ this.payHistories = false
+
+ },
+ //请求支付历史 失败
+ async fetchPrivateOrder0(params) {
+ this.payHistories = true
+ const { data } = await privateOrder(params)
+ this.failData = data.rows
+ this.payHistories = false
+
+ },
+ handelTime(time) {
+ if (time) {
+ return `${time.split("T")[0]} ${time.split("T")[1].split(".")[0]}`
+ }
+ },
+
+
+ //点击刷新
+ handelRefresh: Debounce(function () {
+ this.params.status = 2
+ this.fetchPrivateOrder2(this.params)
+ this.params.status = 0
+ this.fetchPrivateOrder0(this.params)
+ this.params.status = 1
+ this.fetchPrivateOrder1(this.params)
+ }, 1000),
+
+ handleSizeChange(val) {
+ console.log(`每页 ${val} 条`);
+ this.params.limit = val
+ this.params.page = 1
+ switch (this.activeName) {
+ case `pending`:
+ this.params.status = 1
+ this.fetchRepairList1(this.params)
+ break;
+ case `toBeSent`:
+ this.params.status = 21
+ this.fetchRepairList21(this.params)
+ break;
+ case `goodsToBeReceived`:
+ this.params.status = 3
+ this.fetchRepairList3(this.params)
+ break;
+ case `receivedGoods`:
+ this.params.status = 4
+ this.fetchRepairList4(this.params)
+ break;
+ case `Quoted`:
+ this.params.status = 5
+ this.fetchRepairList5(this.params)
+ break;
+ case `ConfirmPaid`:
+ this.params.status = 20
+ this.fetchRepairList20(this.params)
+ break;
+ case `Paid`:
+ this.params.status = 6
+ this.fetchRepairList6(this.params)
+ break;
+ case `service`:
+ this.params.status = 7
+ this.fetchRepairList7(this.params)
+ break;
+ case `toBeSentBack`:
+ this.params.status = 8
+ this.fetchRepairList8(this.params)
+ break;
+ case `remand`:
+ this.params.status = 9
+ this.fetchRepairList9(this.params)
+ break;
+ case `Completed`:
+ this.params.status = 10
+ this.fetchRepairList10(this.params)
+ break;
+
+ default:
+ break;
+ }
+ this.currentPage1 = 1,
+ this.currentPage3 = 1,
+ this.currentPage4 = 1,
+ this.currentPage5 = 1,
+ this.currentPage6 = 1,
+ this.currentPage7 = 1,
+ this.currentPage8 = 1,
+ this.currentPage9 = 1,
+ this.currentPage10 = 1,
+ this.currentPage20 = 1,
+ this.currentPage21 = 1,
+
+
+
+
+ this.currentPage = 1
+ },
+ handleCurrentChange(val) {
+ console.log(`当前页: ${val}`);
+ this.params.page = val
+
+ switch (this.activeName) {
+ case `pending`:
+ this.params.status = 1
+ this.fetchRepairList1(this.params)
+ break;
+ case `toBeSent`:
+ this.params.status = 21
+ this.fetchRepairList21(this.params)
+ break;
+ case `goodsToBeReceived`:
+ this.params.status = 3
+ this.fetchRepairList3(this.params)
+ break;
+ case `receivedGoods`:
+ this.params.status = 4
+ this.fetchRepairList4(this.params)
+ break;
+ case `Quoted`:
+ this.params.status = 5
+ this.fetchRepairList5(this.params)
+ break;
+ case `ConfirmPaid`:
+ this.params.status = 20
+ this.fetchRepairList20(this.params)
+ break;
+ case `Paid`:
+ this.params.status = 6
+ this.fetchRepairList6(this.params)
+ break;
+ case `service`:
+ this.params.status = 7
+ this.fetchRepairList7(this.params)
+ break;
+ case `toBeSentBack`:
+ this.params.status = 8
+ this.fetchRepairList8(this.params)
+ break;
+ case `remand`:
+ this.params.status = 9
+ this.fetchRepairList9(this.params)
+ break;
+ case `Completed`:
+ this.params.status = 10
+ this.fetchRepairList10(this.params)
+ break;
+
+ default:
+ break;
+ }
+
+ },
+
+
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/subscriptionLetter/index.vue b/yq/src/views/subscriptionLetter/index.vue
new file mode 100644
index 0000000..776b75e
--- /dev/null
+++ b/yq/src/views/subscriptionLetter/index.vue
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
{{ $t(`login.subscriptionLetter`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/sumcdd/index.js b/yq/src/views/sumcdd/index.js
new file mode 100644
index 0000000..669742e
--- /dev/null
+++ b/yq/src/views/sumcdd/index.js
@@ -0,0 +1,271 @@
+import * as echarts from "echarts";
+import { handelBtcPrice, handelProfitrate } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ sumcddLoading: false,
+ params: {
+ req: "sumcdd",
+ radius: "btc"
+ },
+ btcPrice: [],
+ priceTime: "",
+ option: {
+ tooltip: {
+ trigger: "axis",
+ position: function (pt) {
+ return [pt[0], "10%"];
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ formatter: function (name) {
+
+ return echarts.format.truncateText(name, 60, '14px Microsoft Yahei', '…');
+ },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//百万
+ value = `${e / 10000}W`;
+ } else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Cumulative Coin Days Destroyed",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Entity-adjusted Cumulative Coin Days Destroyed",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#9ed4e8",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#9ed4e8",
+ width: "1",
+ },
+ yAxisIndex: 2,
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ markLine: {
+ symbol: ["none", "none"], //去掉箭头
+ itemStyle: {
+ normal: {
+ lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ },
+ },
+ // lineStyle:{
+ // color:"red"
+ // },
+
+ label: {
+ formatter: "{b}",
+ fontSize: 10,
+ color: "rgba(0,0,0,0.8)",
+ align: "left",
+ },
+ data: [
+ // {
+ // name: "0",
+ // yAxis: 0,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+ {
+ name: "$70W",
+ yAxis: 700000,
+ },
+ {
+ name: "$40W",
+ yAxis: 400000,
+ },
+
+ {
+ name: "$10W",
+ yAxis: 100000,
+ },
+ {
+ name: "$100W",
+ yAxis: 1000000,
+ // position: ['100%', '50'],
+ },
+ {
+ name: "$120W",
+ yAxis: 1200000,
+ },
+
+ {
+ name: "$140W",
+ yAxis: 1400000,
+ },
+ ],
+ },
+ },
+
+ ],
+ },
+ parmesTime:{
+ start:"",
+ end:""
+ }
+
+ }
+ },
+ mounted() {
+ this.fetchSumcdd(this.params.req, this.params.radius)
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ this.myChart = echarts.init(document.getElementById("sumcddBox"));
+
+ this.myChart.setOption(this.option);
+
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchSumcdd(req, radius, start, end) {
+ this.sumcddLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end)
+ this.sumcddData = data.data
+
+ //请求BTC价格
+ const price = await this.$API.getBtcPrice(start, end);
+ this.btcPrice = price.data.data
+
+ let time = ""
+ let sumcddValueList = []
+ let sumeacddValueList = []
+ let priceValueList = []
+ let newPriceData = []
+ this.sumcddData.forEach(item => {
+ time = item.date.split("T")[0]
+ sumcddValueList.push(Number(item.sumcdd.toFixed(2)))
+ sumeacddValueList.push(Number(item.sumeacdd.toFixed(2)))
+ //判断渲染与上面数据时间一致得价格数据
+ this.btcPrice.forEach(price => {
+ this.priceTime = price.time.split("T")[0]
+ // console.log(this.timer === this.priceTime);
+ if (time === this.priceTime) {
+
+ priceValueList.push(Number(parseInt(price.value*100)/100))
+ newPriceData.push(price)
+ }
+ })
+ })
+ this.option.series[0].data = handelProfitrate(this.sumcddData, sumcddValueList)
+ this.option.series[1].data = handelProfitrate(this.sumcddData, sumeacddValueList)
+ this.option.series[2].data = handelBtcPrice(newPriceData, priceValueList)
+
+ this.inCharts()
+ this.sumcddLoading = false
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.parmesTime.start = start;
+ this.parmesTime.end = end;
+ this.fetchSumcdd(this.params.req, this.params.radius,this.parmesTime.start, this.parmesTime.end)
+ },
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/sumcdd/index.vue b/yq/src/views/sumcdd/index.vue
new file mode 100644
index 0000000..4f8961f
--- /dev/null
+++ b/yq/src/views/sumcdd/index.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/sumcsupply/index.js b/yq/src/views/sumcsupply/index.js
new file mode 100644
index 0000000..d29fc89
--- /dev/null
+++ b/yq/src/views/sumcsupply/index.js
@@ -0,0 +1,248 @@
+import * as echarts from "echarts";
+import { handelBtcPrice, handelProfitrate } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ sumcsupplyLoading: false,
+ params: {
+ req: "sumcsupply",
+ radius: "btc"
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ position: function (pt) {
+ return [pt[0], "10%"];
+ },
+ },
+ legend: {
+ right: "100",
+ // data:[`sopr`,'asopr','easopr','lthsopr','sthsopr',],
+ // selected:{
+ // 'asopr': false,
+ // 'easopr': false,
+ // 'lthsopr': false,
+ // 'sthsopr': false,
+ // }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//百万
+ value = `${e / 10000}W`;
+ } else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Cumulative Circulating Supply",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ markLine: {
+ symbol: ["none", "none"], //去掉箭头
+ itemStyle: {
+ normal: {
+ lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ },
+ },
+ // lineStyle:{
+ // color:"red"
+ // },
+
+ label: {
+ formatter: "{b}",
+ fontSize: 10,
+ color: "rgba(0,0,0,0.8)",
+ align: "left",
+ },
+ data: [
+ // {
+ // name: "0",
+ // yAxis: 0,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+ {
+ name: "$70W",
+ yAxis: 700000,
+ },
+ {
+ name: "$40W",
+ yAxis: 400000,
+ },
+
+ {
+ name: "$10W",
+ yAxis: 100000,
+ },
+ {
+ name: "$100W",
+ yAxis: 1000000,
+ // position: ['100%', '50'],
+ },
+ {
+ name: "$120W",
+ yAxis: 1200000,
+ },
+
+ {
+ name: "$140W",
+ yAxis: 1400000,
+ },
+ ],
+ },
+ },
+
+ ],
+ },
+ sumcsupplyData: [],
+ btcPrice: [],
+ priceTime: "",
+ parmesTime:{
+ start:"",
+ end:""
+ }
+ }
+ },
+ mounted() {
+ this.fetchSumcsupply(this.params.req, this.params.radius)
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ this.myChart = echarts.init(document.getElementById("sumcsupplyBox"));
+
+ this.myChart.setOption(this.option);
+
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchSumcsupply(req, radius, start, end) {
+ this.sumcsupplyLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end)
+ this.sumcsupplyData = data.data
+
+ //请求BTC价格
+ const price = await this.$API.getBtcPrice(start, end);
+ this.btcPrice = price.data.data
+
+ let time = ""
+ let sumcsupplyValueList = []
+ let priceValueList = []
+ let newPriceData = []
+ this.sumcsupplyData.forEach(item => {
+ time = item.date.split("T")[0]
+ sumcsupplyValueList.push(Number(item.value.toFixed(2)))
+
+ //判断渲染与上面数据时间一致得价格数据
+ this.btcPrice.forEach(price => {
+
+ this.priceTime = price.time.split("T")[0]
+ // console.log(this.timer === this.priceTime);
+ if (time === this.priceTime) {
+
+ priceValueList.push(Number(parseInt(price.value*100)/100))
+ newPriceData.push(price)
+ }
+ })
+ })
+ this.option.series[0].data = handelProfitrate(this.sumcsupplyData, sumcsupplyValueList)
+ this.option.series[1].data = handelBtcPrice(newPriceData, priceValueList)
+
+ this.inCharts()
+ this.sumcsupplyLoading = false
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.parmesTime.start = start;
+ this.parmesTime.end = end;
+ this.fetchSumcsupply(this.params.req, this.params.radius,this.parmesTime.start, this.parmesTime.end)
+ },
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/sumcsupply/index.vue b/yq/src/views/sumcsupply/index.vue
new file mode 100644
index 0000000..8eb5b00
--- /dev/null
+++ b/yq/src/views/sumcsupply/index.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/supplyDistributionEth/index.js b/yq/src/views/supplyDistributionEth/index.js
new file mode 100644
index 0000000..775e22d
--- /dev/null
+++ b/yq/src/views/supplyDistributionEth/index.js
@@ -0,0 +1,513 @@
+import * as echarts from "echarts";
+import { getSupplyDistributionEth, } from "../../api/pages"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ supplyDistributionEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}M `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: false,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: true,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: true,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "balance >= 0 and balance < 1",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#aa3550",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 5,
+ lineStyle: {
+ //线条样式
+ color: "#aa3550",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "balance >= 1 and balance < 10 ",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "balance >= 10 and balance < 100",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#40200d",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 1,
+ lineStyle: {
+ //线条样式
+ color: "#40200d",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "balance >= 100 and balance < 1000",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#13a72c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 2,
+ lineStyle: {
+ //线条样式
+ color: "#13a72c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "balance >= 1000 and balance < 10000",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#595856",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 3,
+ lineStyle: {
+ //线条样式
+ color: "#595856",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "balance >= 10000",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#1d2088",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 4,
+ lineStyle: {
+ //线条样式
+ color: "#1d2088",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 8,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 9,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ console.log("及佛教覅附件");
+ this.fetchSupplyDistributionEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("supplyDistributionEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("supplyDistributionEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchSupplyDistributionEth(params) {
+ this.supplyDistributionEthLoading = true
+ const { data } = await getSupplyDistributionEth(params)
+ console.log(data, "积分积分覅");
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.supplyDistributionEthLoading = false
+ return
+ }
+ let supplyDistributionEthData = data.data
+ this.start = supplyDistributionEthData[0].date.split("T")[0]
+ this.end = supplyDistributionEthData[supplyDistributionEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+
+ this.handelSonEthPrice("ETH", true)
+ let balance1ValueList = []
+ let balance1kValueList = []
+ let balance10ValueList = []
+ let balance10kValueList = []
+ let balance100ValueList = []
+ let nozeroValueList = []
+
+
+ supplyDistributionEthData.forEach(item => {
+
+ balance1ValueList.push(Number(item.balance1.toFixed(2)))
+ balance1kValueList.push(Number(item.balance1k.toFixed(2)))
+ balance10ValueList.push(Number(item.balance10.toFixed(2)))
+ balance10kValueList.push(Number(item.balance10k.toFixed(2)))
+ balance100ValueList.push(Number(item.balance100.toFixed(2)))
+ nozeroValueList.push(Number(item.nozero.toFixed(2)))
+
+
+ })
+ this.option.series[1].data = handelProfitrate(supplyDistributionEthData, balance1ValueList)
+ this.option.series[2].data = handelProfitrate(supplyDistributionEthData, balance10ValueList)
+ this.option.series[3].data = handelProfitrate(supplyDistributionEthData, balance100ValueList)
+ this.option.series[4].data = handelProfitrate(supplyDistributionEthData, balance1kValueList)
+ this.option.series[5].data = handelProfitrate(supplyDistributionEthData, balance10kValueList)
+ this.option.series[0].data = handelProfitrate(supplyDistributionEthData, nozeroValueList)
+
+
+ this.inCharts()
+
+ this.supplyDistributionEthLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchSupplyDistributionEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[6], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[6], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchSupplyDistributionEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/supplyDistributionEth/index.vue b/yq/src/views/supplyDistributionEth/index.vue
new file mode 100644
index 0000000..22c49cc
--- /dev/null
+++ b/yq/src/views/supplyDistributionEth/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/supplyLossEth/index.js b/yq/src/views/supplyLossEth/index.js
new file mode 100644
index 0000000..69d0d39
--- /dev/null
+++ b/yq/src/views/supplyLossEth/index.js
@@ -0,0 +1,350 @@
+import * as echarts from "echarts";
+import { getSupplyLossEth } from "../../api/pages"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ supplyLossEthEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}% `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Total Supply in Loss",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchSupplyLossEthEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("supplyLossEthEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("supplyLossEthEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchSupplyLossEthEth(params) {
+ this.supplyLossEthEthLoading = true
+ const { data } = await getSupplyLossEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.supplyLossEthEthLoading = false
+ return
+ }
+ let supplyLossEthEthData = data.data
+ this.start = supplyLossEthEthData[0].date.split("T")[0]
+ this.end = supplyLossEthEthData[supplyLossEthEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ supplyLossEthEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(supplyLossEthEthData, ValueList)
+
+ this.inCharts()
+
+ this.supplyLossEthEthLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchSupplyLossEthEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchSupplyLossEthEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/supplyLossEth/index.vue b/yq/src/views/supplyLossEth/index.vue
new file mode 100644
index 0000000..404dcd1
--- /dev/null
+++ b/yq/src/views/supplyLossEth/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/supplyProfitEth/index.js b/yq/src/views/supplyProfitEth/index.js
new file mode 100644
index 0000000..dc3bf73
--- /dev/null
+++ b/yq/src/views/supplyProfitEth/index.js
@@ -0,0 +1,350 @@
+import * as echarts from "echarts";
+import { getSupplyProfitEth, } from "../../api/pages"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ supplyProfitEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}% `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${(e / 100000000).toFixed(2)}E`;
+ } else if (e > 1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e >= 10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ } else if (e < -1000000) {//百万
+ value = `${(e / 1000000).toFixed(2)}M`;
+ } else if (e < -10000) {//万
+ value = `${(e / 10000).toFixed(2)}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Total Supply in Profit ",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchSupplyProfitEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("supplyProfitEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("supplyProfitEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchSupplyProfitEth(params) {
+ this.supplyProfitEthLoading = true
+ const { data } = await getSupplyProfitEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.supplyProfitEthLoading = false
+ return
+ }
+ let supplyProfitEthData = data.data
+ this.start = supplyProfitEthData[0].date.split("T")[0]
+ this.end = supplyProfitEthData[supplyProfitEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ supplyProfitEthData.forEach(item => {
+
+
+ // item.value= item.value/1000000
+
+
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(supplyProfitEthData, ValueList)
+
+ this.inCharts()
+
+ this.supplyProfitEthLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchSupplyProfitEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchSupplyProfitEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/supplyProfitEth/index.vue b/yq/src/views/supplyProfitEth/index.vue
new file mode 100644
index 0000000..74f2fa7
--- /dev/null
+++ b/yq/src/views/supplyProfitEth/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/takerlongshortRatio/index.js b/yq/src/views/takerlongshortRatio/index.js
new file mode 100644
index 0000000..e48d9b2
--- /dev/null
+++ b/yq/src/views/takerlongshortRatio/index.js
@@ -0,0 +1,540 @@
+import * as echarts from "echarts";
+// import {
+// getDateTime,handelLineType,handelSwitchs ,handelWatermark
+// } from "../../util/processingData";
+import { chartsWidth, emptyData, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+import { getTakerLongShortRatio } from "../../api/pages"
+
+export default {
+ data() {
+ return {
+ takerlongshortRatioLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ // {
+ // name: "buy & sell ratio",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // showSymbol: false,
+ // symbolSize: 5,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#f7931a",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // yAxisIndex: 0,
+ // lineStyle: {
+ // //线条样式
+ // color: "#f7931a",
+ // width: "1",
+ // },
+ // data: [],
+ // },
+ {
+ name: "buy volume",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#ab334f",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#ab334f",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "sell volume",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#2d993b",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#2d993b",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 1,
+ // data: [],
+
+
+ // },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ symbol: "BTCUSDT",
+ interval: "5m",
+ start: "",
+ end: "",
+ sma: "",
+ },
+ value: "5m",
+ timeIntervalList: [
+ {
+ value: "5m",
+ label: "home.minutes5",
+ },
+ {
+ value: "15m",
+ label: "home.minutes15",
+ },
+ {
+ value: "30m",
+ label: "home.minutes30",
+ },
+ {
+ value: "1h",
+ label: "home.hour1",
+ },
+ {
+ value: "2h",
+ label: "home.hour2",
+ },
+ {
+ value: "4h",
+ label: "home.hour4",
+ },
+ {
+ value: "6h",
+ label: "home.hour6",
+ },
+ {
+ value: "12h",
+ label: "home.hour12",
+ },
+ {
+ value: "1d",
+ label: "home.day1",
+ },
+ ],
+ chooseTime: "",
+ pickerMinDate: '', // 第一次选中的时间
+ pickerOptions0: {
+ onPick: obj => {
+ // console.log('obj', obj,656415645945641) // {maxDate: xxx, minDate: xxx(中国标准时间)}
+ this.pickerMinDate = new Date(obj.minDate).getTime() //开始时间
+ //判断时间间隔 计算结束时间
+ switch (this.value) {
+ case "5m":
+ //天数
+ this.endTime = Math.round((5 * 500 / 60) / 24)
+
+ break;
+ case "15m":
+ this.endTime = Math.round((15 * 500 / 60) / 24)
+ break;
+ case "30m":
+ this.endTime = Math.round((30 * 500 / 60) / 24)
+ break;
+ case "1h":
+ this.endTime = Math.round((60 * 500 / 60) / 24)
+ break;
+ case "2h":
+ this.endTime = Math.round((120 * 500 / 60) / 24)
+ break;
+ case "4h":
+ this.endTime = Math.round((240 * 500 / 60) / 24)
+ break;
+ case "6h":
+ this.endTime = Math.round((360 * 500 / 60) / 24)
+ break;
+ case "12h":
+ this.endTime = Math.round((720 * 500 / 60) / 24)
+ break;
+ case "1d":
+ this.endTime = Math.round((1440 * 500 / 60) / 24)
+ break;
+
+ default:
+ break;
+ }
+ },
+ disabledDate: time => {
+ if (this.pickerMinDate) {
+ const day1 = this.endTime * 24 * 3600 * 1000 // 可选的时间范围不超过天数
+ let maxTime = this.pickerMinDate + day1
+ let minTime = this.pickerMinDate
+ //console.log('return', time.getTime() > maxTime || time.getTime() < minTime) // 输出查看布尔值
+ // || time.getTime() < minTime
+ return time.getTime() > maxTime || time.getTime() < minTime
+ }
+
+ // return time.getTime() > Date.now();
+ },
+
+
+ //限制只能选当前日期之前的日期
+ // disabledDate(time) {
+
+ // return time.getTime() > Date.now();
+ // },
+ // onPick(a,b){
+ // console.log(a,56231);
+ // }
+ },
+ endTime: "",
+ timeDefaultShow: "",//时间框显示范围
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+ symbolList: [{
+ value: "BTCUSDT",
+ label: "BTCUSDT"
+ },
+ {
+ value: "ETHUSDT",
+ label: "ETHUSDT"
+ }],
+ }
+ },
+ mounted() {
+ this.handelStart()
+ //控制时间选择器 显示本月和上月
+ this.timeDefaultShow = new Date();
+ this.timeDefaultShow.setMonth(new Date().getMonth() - 1);
+ this.fetchTakerlongshortRatio(this.params)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+ },
+ methods: {
+ inChart() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("takerlongshortRatioBox"));
+
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+ this.myChart.setOption(this.option);
+ chartsWidth("takerlongshortRatioBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchTakerlongshortRatio(params) {
+
+ this.takerlongshortRatioLoading = true
+ const { data } = await getTakerLongShortRatio(params)
+ let TakerData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChart, this)
+ if (noData) {
+ this.takerlongshortRatioLoading = false
+ return
+ }
+ // this.start = TakerData[0].date.split("T")[0]
+ // this.end = TakerData[TakerData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ let buySellRatioValueList = []
+ let buyVolValueList = []
+ let sellVolValueList = []
+ this.option.xAxis.data = []
+ TakerData.forEach(item => {
+ this.option.xAxis.data.push(`${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`)
+ // buySellRatioValueList.push(Number(item.buySellRatio.toFixed(2)))
+ buyVolValueList.push(Number(item.buyVol.toFixed(2)))
+ sellVolValueList.push(Number(item.sellVol.toFixed(2)))
+
+ })
+ // this.option.series[0].data = buySellRatioValueList
+ this.option.series[0].data = buyVolValueList
+ this.option.series[1].data = sellVolValueList
+
+
+
+
+ this.inChart()
+ this.takerlongshortRatioLoading = false
+ },
+ //时间接收
+ handelSonTime(start, end) {
+
+
+ this.params.start = start
+ this.params.end = end
+ if (!this.params.start) {
+ this.handelStart()
+ }
+ this.fetchTakerlongshortRatio(this.params)
+ },
+ //选择时间间隔
+ handelTimeInterval(interval) {
+ // this.fetchTakerlongshortRatio(this.params)
+ this.params.interval = interval
+ this.fetchTakerlongshortRatio(this.params)
+
+ },
+ //时间选择
+ handelTime() {
+
+ let dateStart
+ let dateEnd
+ if (this.chooseTime) {
+ dateStart = new Date(this.chooseTime[0]);
+ dateEnd = new Date(this.chooseTime[1]);
+ this.params.start = dateStart.getTime()
+ this.params.end = dateEnd.getTime()
+ } else {
+ this.params.start = ""
+ this.params.end = ""
+ }
+
+
+ this.fetchTakerlongshortRatio(this.params)
+ // this.chooseTime = ""
+ this.pickerMinDate = ""
+ },
+ //点击确定按钮
+ handelTakerBtn() {
+ this.fetchTakerlongshortRatio(this.params)
+ },
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[3], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[4], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchTakerlongshortRatio(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+
+
+ },
+ //选择Symbol
+ handelSymbol() {
+ // this.fetchTakerlongshortRatio(this.params)
+ },
+ activeInterval(interval) {
+ if (interval) {
+ return this.timeIntervalList.find(item => item.value == interval).label
+ }
+ },
+ handelStart() {
+ let start = new Date();
+
+ start.setMonth(start.getMonth() - 1);//当前时间减去一个月
+
+ // 提取年、月和日
+ const year = start.getFullYear();
+ const month = String(start.getMonth() + 1).padStart(2, '0');
+ const day = String(start.getDate()).padStart(2, '0');
+ const formattedDate = `${year}-${month}-${day}`;
+
+ this.params.start = formattedDate
+ }
+
+ }
+}
+
+
+
diff --git a/yq/src/views/takerlongshortRatio/index.vue b/yq/src/views/takerlongshortRatio/index.vue
new file mode 100644
index 0000000..608734d
--- /dev/null
+++ b/yq/src/views/takerlongshortRatio/index.vue
@@ -0,0 +1,291 @@
+
+
+
+
+
+
+
+
+ {{ $t(item.label) }}
+
+
+
+ {{ $t(activeInterval(params.interval)) }}
+
+
+
{{$t(`bian.selectCycle`)}}
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/takerlongshortRatioETH/index.js b/yq/src/views/takerlongshortRatioETH/index.js
new file mode 100644
index 0000000..c5eb45b
--- /dev/null
+++ b/yq/src/views/takerlongshortRatioETH/index.js
@@ -0,0 +1,524 @@
+import * as echarts from "echarts";
+// import {
+// getDateTime,handelLineType,handelSwitchs ,handelWatermark
+// } from "../../util/processingData";
+import { chartsWidth, emptyData, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+import { getTakerLongShortRatio } from "../../api/pages"
+
+export default {
+ data() {
+ return {
+ takerlongshortRatioLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "buy & sell ratio",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "buy volume",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#ab334f",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 2,
+ lineStyle: {
+ //线条样式
+ color: "#ab334f",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "sell volume",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#2d993b",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 2,
+ lineStyle: {
+ //线条样式
+ color: "#2d993b",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 1,
+ // data: [],
+
+
+ // },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ symbol: "ETHUSDT",
+ interval: "5m",
+ start: "",
+ end: "",
+ sma: "",
+ },
+ value: "5m",
+ timeIntervalList: [
+ {
+ value: "5m",
+ label: "home.minutes5",
+ },
+ {
+ value: "15m",
+ label: "home.minutes15",
+ },
+ {
+ value: "30m",
+ label: "home.minutes30",
+ },
+ {
+ value: "1h",
+ label: "home.hour1",
+ },
+ {
+ value: "2h",
+ label: "home.hour2",
+ },
+ {
+ value: "4h",
+ label: "home.hour4",
+ },
+ {
+ value: "6h",
+ label: "home.hour6",
+ },
+ {
+ value: "12h",
+ label: "home.hour12",
+ },
+ {
+ value: "1d",
+ label: "home.day1",
+ },
+ ],
+ chooseTime: "",
+ pickerMinDate: '', // 第一次选中的时间
+ pickerOptions0: {
+ onPick: obj => {
+ // console.log('obj', obj,656415645945641) // {maxDate: xxx, minDate: xxx(中国标准时间)}
+ this.pickerMinDate = new Date(obj.minDate).getTime() //开始时间
+ //判断时间间隔 计算结束时间
+ switch (this.value) {
+ case "5m":
+ //天数
+ this.endTime = Math.round((5 * 500 / 60) / 24)
+
+ break;
+ case "15m":
+ this.endTime = Math.round((15 * 500 / 60) / 24)
+ break;
+ case "30m":
+ this.endTime = Math.round((30 * 500 / 60) / 24)
+ break;
+ case "1h":
+ this.endTime = Math.round((60 * 500 / 60) / 24)
+ break;
+ case "2h":
+ this.endTime = Math.round((120 * 500 / 60) / 24)
+ break;
+ case "4h":
+ this.endTime = Math.round((240 * 500 / 60) / 24)
+ break;
+ case "6h":
+ this.endTime = Math.round((360 * 500 / 60) / 24)
+ break;
+ case "12h":
+ this.endTime = Math.round((720 * 500 / 60) / 24)
+ break;
+ case "1d":
+ this.endTime = Math.round((1440 * 500 / 60) / 24)
+ break;
+
+ default:
+ break;
+ }
+ },
+ disabledDate: time => {
+ if (this.pickerMinDate) {
+ const day1 = this.endTime * 24 * 3600 * 1000 // 可选的时间范围不超过天数
+ let maxTime = this.pickerMinDate + day1
+ let minTime = this.pickerMinDate
+ //console.log('return', time.getTime() > maxTime || time.getTime() < minTime) // 输出查看布尔值
+ // || time.getTime() < minTime
+ return time.getTime() > maxTime || time.getTime() < minTime
+ }
+
+ // return time.getTime() > Date.now();
+ },
+
+
+ //限制只能选当前日期之前的日期
+ // disabledDate(time) {
+
+ // return time.getTime() > Date.now();
+ // },
+ // onPick(a,b){
+ // console.log(a,56231);
+ // }
+ },
+ endTime: "",
+ timeDefaultShow: "",//时间框显示范围
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+ symbolList: [{
+ value: "BTCUSDT",
+ label: "BTCUSDT"
+ },
+ {
+ value: "ETHUSDT",
+ label: "ETHUSDT"
+ }],
+ }
+ },
+ mounted() {
+ //控制时间选择器 显示本月和上月
+ this.timeDefaultShow = new Date();
+ this.timeDefaultShow.setMonth(new Date().getMonth() - 1);
+ this.fetchTakerlongshortRatio(this.params)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+ },
+ methods: {
+ inChart() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("takerlongshortRatioBox"));
+
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+ this.myChart.setOption(this.option);
+ chartsWidth("takerlongshortRatioBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchTakerlongshortRatio(params) {
+
+ this.takerlongshortRatioLoading = true
+ const { data } = await getTakerLongShortRatio(params)
+ let TakerData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChart, this)
+ if (noData) {
+ this.takerlongshortRatioLoading = false
+ return
+ }
+ // this.start = TakerData[0].date.split("T")[0]
+ // this.end = TakerData[TakerData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ let buySellRatioValueList = []
+ let buyVolValueList = []
+ let sellVolValueList = []
+ this.option.xAxis.data = []
+ TakerData.forEach(item => {
+ this.option.xAxis.data.push(`${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`)
+ buySellRatioValueList.push(Number(item.buySellRatio.toFixed(2)))
+ buyVolValueList.push(Number(item.buyVol.toFixed(2)))
+ sellVolValueList.push(Number(item.sellVol.toFixed(2)))
+
+ })
+ this.option.series[0].data = buySellRatioValueList
+ this.option.series[1].data = buyVolValueList
+ this.option.series[2].data = sellVolValueList
+
+
+
+
+ this.inChart()
+ this.takerlongshortRatioLoading = false
+ },
+ //时间接收
+ handelSonTime(start, end) {
+
+
+ this.params.start = start
+ this.params.end = end
+ this.fetchTakerlongshortRatio(this.params)
+ },
+ //选择时间间隔
+ handelTimeInterval(interval) {
+ // this.fetchTakerlongshortRatio(this.params)
+ this.params.interval = interval
+ this.fetchTakerlongshortRatio(this.params)
+
+ },
+ //时间选择
+ handelTime() {
+
+ let dateStart
+ let dateEnd
+ if (this.chooseTime) {
+ dateStart = new Date(this.chooseTime[0]);
+ dateEnd = new Date(this.chooseTime[1]);
+ this.params.start = dateStart.getTime()
+ this.params.end = dateEnd.getTime()
+ } else {
+ this.params.start = ""
+ this.params.end = ""
+ }
+
+
+ this.fetchTakerlongshortRatio(this.params)
+ // this.chooseTime = ""
+ this.pickerMinDate = ""
+ },
+ //点击确定按钮
+ handelTakerBtn() {
+ this.fetchTakerlongshortRatio(this.params)
+ },
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[3], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[4], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchTakerlongshortRatio(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+
+
+ },
+ //选择Symbol
+ handelSymbol() {
+ // this.fetchTakerlongshortRatio(this.params)
+ },
+ activeInterval(interval) {
+ if (interval) {
+ return this.timeIntervalList.find(item => item.value == interval).label
+ }
+ }
+
+
+ }
+}
+
+
+
diff --git a/yq/src/views/takerlongshortRatioETH/index.vue b/yq/src/views/takerlongshortRatioETH/index.vue
new file mode 100644
index 0000000..98ea367
--- /dev/null
+++ b/yq/src/views/takerlongshortRatioETH/index.vue
@@ -0,0 +1,291 @@
+
+
+
+
+
+
+
+
+ {{ $t(item.label) }}
+
+
+
+ {{ $t(activeInterval(params.interval)) }}
+
+
+
{{$t(`bian.selectCycle`)}}
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/topList/index.js b/yq/src/views/topList/index.js
new file mode 100644
index 0000000..f8bc988
--- /dev/null
+++ b/yq/src/views/topList/index.js
@@ -0,0 +1,192 @@
+export default {
+ data() {
+ return {
+ params: {
+ req: "",
+ radius: "btc",
+ address: "",
+ value: "",
+ type: ""
+ },
+ page: 1,
+ tableData: [],
+ totalPage: 0,
+ currentPage4: 1,//当前页数
+ value: "",
+ valueList: [
+ {
+ value: 500,
+ label: "value > 500",
+ },
+ {
+ value: 1500,
+ label: "value > 1500",
+ },
+ {
+ value: 5000,
+ label: "value > 5000",
+ },
+ {
+ value: 10000,
+ label: "value > 10000",
+ },
+ {
+ value: 15000,
+ label: "value > 15000",
+ },
+ ],
+ state: "",
+ type: "",
+ topListLoading: false,
+ date: "",
+ tabelShow: "true",
+ introduce: "",
+ start: "",
+ end: "",
+ limit: 50,
+ search: "",
+
+ }
+ },
+
+ mounted() {
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+
+ let menuObj = localStorage.getItem("params");
+ this.params.req = JSON.parse(menuObj).componentReq;
+ this.introduce = JSON.parse(menuObj).introduce;
+ //监听localstorage变化
+ window.addEventListener("setItem", () => {
+ let menuObj = localStorage.getItem("params");
+ this.params.req = JSON.parse(menuObj).componentReq;
+ this.introduce = JSON.parse(menuObj).introduce;
+
+ });
+
+
+ },
+ watch: {
+ params: {
+ handler(val) {
+ if (val.req == "getTopList" || val.req == "getTopListWatch") {
+ // console.log(val,333333);
+ this.value = ""
+ this.state = ""
+
+ this.fetchTopList(this.params.req, this.params.radius, this.search, this.start, this.end, this.page, this.limit)
+
+ }
+
+ if (val.req == "getTopList") {
+ this.tabelShow = "true"
+ } else if (val.req == "getTopListWatch") {
+ this.tabelShow = "false"
+ }
+ },
+ deep: true,
+ Immutable: true
+
+ }
+ },
+ methods: {
+ async fetchTopList(req, radius, search, start, end, page, limit) {
+ this.topListLoading = true
+
+ // const { data } = await this.$API.getTopList(req, radius, type)
+ const { data } = await this.$API.getBigDeals(req, radius, search, start, end, page, limit)
+ this.tableData = data.data.list
+ if (!this.tableData[0]) {
+ this.$message({
+ message: this.$t(`home.NoData`),
+ type: 'warning'
+ });
+ this.topListLoading = false
+ return
+ }
+ this.totalPage = data.data.totalPage
+ this.tableData.forEach(item => {
+ item.value = Number(item.value).toFixed(2)
+ item.outValue = Number(item.outValue).toFixed(2)
+ })
+ if (this.params.req == "getTopList") {
+
+ this.date =data.data.date
+ }
+ this.$nextTick(() => {
+ if (page) {
+ this.currentPage4 = page
+ } else {
+ this.currentPage4 = 1
+ }
+ })
+
+
+ this.topListLoading = false
+ },
+ //点击的改变页数
+ handleCurrentChange(a) {
+ this.page = a
+ let search
+ if (this.value) {
+ search = this.value
+ } else if (this.state) {
+ search = this.state
+ }
+ this.fetchTopList(this.params.req, this.params.radius, search, this.start, this.end, this.page, this.limit)
+ this.currentPage4 = this.page
+
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.start = start;
+ this.end = end;
+ // this.fetchTopList(this.params.req, this.params.radius, this.search, this.start, this.end, this.page, this.limit)
+
+ },
+ //下拉框选择
+ handelChang(e) {
+ this.page = 1;
+ this.search = e
+ this.fetchTopList(this.params.req, this.params.radius, this.value, this.start, this.end, this.page, this.limit)
+
+
+ this.state = "";
+
+
+ },
+ //点击搜索处理搜索内容
+ handelSearch(e) {
+ this.page = 1;
+ this.search = e
+ this.fetchTopList(this.params.req, this.params.radius, this.state, this.start, this.end, this.page, this.limit)
+ this.value = ""
+ // this.state=""
+
+
+ },
+ //改变每页条数
+ handleSizeChange(val) {
+
+ this.page = 1;
+ this.limit = val;
+ this.fetchTopList(this.params.req, this.params.radius, this.search, this.start, this.end, this.page, this.limit)
+
+
+ },
+ //双击表格单元格复制
+ cellDblclick(row, column, cell, event) {
+ if (event.type === "dblclick") {
+ var save = (e) => {
+ e.clipboardData.setData("text/plain", event.target.innerText);
+ e.preventDefault(); //阻止默认行为
+ };
+ document.addEventListener("copy", save);
+ document.execCommand("copy");
+ document.removeEventListener("copy", save);
+ }
+ this.$message({ message: this.$t(`home.copy`), type: "success" }); //加提示
+ },
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/topList/index.vue b/yq/src/views/topList/index.vue
new file mode 100644
index 0000000..81c27d7
--- /dev/null
+++ b/yq/src/views/topList/index.vue
@@ -0,0 +1,185 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{date}} {{$t(`home.topList`) }}
+ {{$t(`home.copyTabel`)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/totalAddress/index.js b/yq/src/views/totalAddress/index.js
new file mode 100644
index 0000000..e55f8f6
--- /dev/null
+++ b/yq/src/views/totalAddress/index.js
@@ -0,0 +1,355 @@
+
+import * as echarts from "echarts";
+import { $addStorageEvent } from '../../util/processingData'
+import { getAddress, } from '../../api/realTimeData'
+import {handelZoom, chartsWidth,emptyData,handelWatermark,handelLineType,handelSwitchs} from "../../util/processingData"
+
+export default {
+ data(){
+ return{
+ myChart:"",
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ // type: "time",
+ boundaryGap: [0.1, 0.1],
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ },
+ yAxis: [
+ {
+ position: "left",
+ type: "value",
+ axisLabel: {
+ formatter: (value) => {
+ let data
+ if (value >= 1000000000) {
+ data = `${value / 1000000000}B`
+ } else if (value >= 1000000) {
+ data = `${value / 1000000}M`
+ } else {
+ data = `${value / 1000}K`
+ }
+ return data
+ }
+ }
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: true,
+ // min:`dataMin`,
+ // max:`dataMax`,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ // showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Total Address",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series',
+
+
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#000",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#000",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ yAxisIndex: 1,
+ data: [],
+
+ },
+
+
+
+ ],
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ totalAddressLoading:false,
+ params: {
+ req: "address",
+ radius: "btc",
+ sma: "",
+ start:"",
+ end:"",
+
+ },
+ dataSelection: [
+ {
+ value: "1d",
+ label: "home.day1",
+ disabled:false,
+ authority:"guest",
+ grade:1,
+ },
+ {
+ value: "realTime",
+ label: "home.realTimeData",
+ disabled:false,
+ authority:"vip",
+ grade:4,
+ },
+ ],
+ realTimeData:"",
+ switch3: "",
+ start:"",
+ end:"",
+
+
+
+ }
+ },
+ mounted(){
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.fetchTotalAddress(this.params.req, this.params.radius)
+ },
+ methods:{
+ handleSelect(activeValue){
+ if (activeValue == `1d`) {
+ this.realTimeData =false
+ this.fetchTotalAddress(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ }else{
+ this.fetchTotalAddress2()
+ this.realTimeData =true
+ }
+ },
+ inCharts(){
+ if (!this.myChart) {
+ this.myChart = echarts.init(document.getElementById("totalAddressBox"));
+
+ }
+
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+ this.myChart.setOption(this.option);
+
+ chartsWidth("totalAddressBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+
+
+ async fetchTotalAddress(req, radius, start, end, sma) {
+ this.totalAddressLoading = true
+ const { data } = await this.$API.getNewAddress(req, radius, start, end, sma)
+ let chartData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.totalAddressLoading = false
+ return
+ }
+ //添加水印
+ handelWatermark(this.option, 750, 300)
+ this.start =chartData[0].date.split("T")[0]
+ this.end = chartData[chartData.length - 1].date.split("T")[0]
+ const price = await this.$API.getBtcPrice2("BTC", this.start, this.end);
+
+ let priceData =[]
+ price.data.data.forEach(item=>{
+ priceData.push(Number(item.value.toFixed(2)))
+ })
+ let volumeValueList = []
+ let xAxisData = []
+ chartData.forEach(item => {
+
+ volumeValueList.push(Number(item.totalAddress.toFixed(2)))
+ xAxisData.push(item.date.split("T")[0])
+ })
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = volumeValueList
+ this.option.series[1].data = priceData
+ if (this.zoomStart) {
+ this.option.dataZoom[0].start = this.zoomStart
+ this.option.dataZoom[0].end = this.zoomEnd
+ } else {
+ this.option.dataZoom[0].start = 10
+ this.option.dataZoom[0].end = 100
+ }
+
+
+
+
+ this.inCharts()
+
+
+
+
+ setTimeout(() => {//监听echarts 图表滚动
+ this.myChart.on("dataZoom", function (e) {
+ this.zoomStart = e.start || e.batch[0].start;
+ this.zoomEnd = e.end|| e.batch[0].end;
+ $addStorageEvent(1, "zoomStart", this.zoomStart);
+ $addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ });
+
+
+ })
+
+ this.totalAddressLoading = false
+
+
+
+
+
+ },
+ //实时数据
+ async fetchTotalAddress2(){
+ this.totalAddressLoading = true
+ const { data } = await getAddress()
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.totalAddressLoading = false
+ return
+ }
+ let chartData = data.data
+ let Volume=[]
+ let xAxisData = []
+ let priceData =[]
+ chartData.forEach(item=>{
+ item.date= `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ xAxisData.push(item.date)
+ Volume.push(item.totalAddress.toFixed(2))
+ priceData.push(Number(item.price.toFixed(2)))
+ })
+
+ this.option.xAxis.data = xAxisData
+ this.option.series[0].data = Volume
+ this.option.series[1].data = priceData
+
+
+ this.inCharts()
+ this.totalAddressLoading = false
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchTotalAddress(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ },
+ //父级选择Sma
+ handelSonSma(smaNUm) {
+ this.params.sma = smaNUm
+ this.fetchTotalAddress(this.params.req, this.params.radius, this.params.start, this.params.end, this.params.sma)
+ this.$addStorageEvent(1, "sma",this.params.sma);
+ this.realTimeData =false
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+
+
+ },
+}
\ No newline at end of file
diff --git a/yq/src/views/totalAddress/index.vue b/yq/src/views/totalAddress/index.vue
new file mode 100644
index 0000000..5b199b8
--- /dev/null
+++ b/yq/src/views/totalAddress/index.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/tronUSDCBigTx/index.js b/yq/src/views/tronUSDCBigTx/index.js
new file mode 100644
index 0000000..4fe596a
--- /dev/null
+++ b/yq/src/views/tronUSDCBigTx/index.js
@@ -0,0 +1,372 @@
+import * as echarts from "echarts";
+export default {
+ data() {
+ return {
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i <= params.length - 1; i++) {
+ // res += `${params[i].marker} ${params[i].value[1]} ${params[i].seriesName}`;
+ // }
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ type: "category",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ },
+ yAxis: [
+ {
+ name: this.$t(`home.figure`),
+ // name: "MVRV",
+ position: "left",
+ type: "value",
+ },
+ ],
+ dataZoom: [
+ {
+ type: "slider",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ series: [
+ {
+ type: "line",
+ name: "",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+
+ data: [],
+ },
+ ],
+ },
+ params: {
+ req: "tronUSDCBigTx",
+ radius: "eth",
+ page: 1,
+ limit:50,
+ },
+ paramsCount: {
+ req: "tronUSDCBigTxCount",
+ radius: "eth",
+ },
+ times: {
+ start: "",
+ end: ""
+ },
+ tabelloading: false,
+ tableData: [],
+ tronUSDCBigTxLoading: false,
+ dialog: false,
+ tabelUrl: "",
+ color: "",
+ introduce: "",
+ valueList: [
+ {
+ value: 50000,
+ label: "余额 > 5W",
+ },
+ {
+ value: 100000,
+ label: "余额 > 10W",
+ },
+ {
+ value: 150000,
+ label: "余额 > 15W",
+ },
+ {
+ value: 250000,
+ label: "余额 > 25W",
+ },
+ {
+ value: 500000,
+ label: "余额 > 50W",
+ },
+ {
+ value: 1000000,
+ label: "余额 > 100W",
+ },
+ ],
+ state: "",
+ value: "",
+ tabelParams: {
+ req: "",
+ address: "",
+ txId: "",
+ type: "",
+ },
+ animate: false,
+ notice: "",
+ amountTxid: "",
+ amountTime: "",
+ dialogVisible: false,
+ dialogData: [],
+ dialogDate: "",
+ rollingData: [],
+ setInTime: null,
+ currencyName: "",
+ currentPage4: 1,//当前页数
+ totalPage: 0,
+ list:[],
+ setInTimeout:null,
+ search:""
+
+ }
+ },
+ mounted() {
+
+ //请求数据
+ this.fetchTronUSDCBigTx(this.params.req, this.params.radius, this.search, this.times.start, this.times.end, this.params.page,this.params.limit)
+ this.fetchTronUSDCBigTxxcount(this.paramsCount.req, this.paramsCount.radius)
+
+ // let menuObj = localStorage.getItem("params");
+ // this.introduce = JSON.parse(menuObj).introduce;
+ // this.show = localStorage.getItem("currentTabComponent");
+ let obj = localStorage.getItem("src");
+ // this.color = JSON.parse(obj).color;
+ window.addEventListener("setItem", () => {
+ // let menuObj = localStorage.getItem("params");
+ // // this.params.req = JSON.parse(menuObj).componentReq;
+ // this.introduce = JSON.parse(menuObj).introduce;
+ let obj = localStorage.getItem("src");
+ // this.color = JSON.parse(obj).color;
+ });
+ this.$addStorageEvent(1, "buttonShow", false)
+ // this.$addStorageEvent(1, "introduce", this.introduce);
+ if (this.setInTimeout || this.setInTime) {
+ clearInterval(this.setInTime)
+ clearTimeout(this.setInTimeout)
+ }
+
+ },
+
+ methods: {
+ initCharts() {
+ this.myChart = echarts.init(document.getElementById("tronUSDCBigTx"));
+ // this.myChart.clear();
+ this.myChart.setOption(this.option);
+ // 当窗口或者大小发生改变时执行resize,重新绘制图表
+ window.addEventListener("resize", () => {
+ if (this.myChart)this.myChart.resize();
+ });
+ },
+ //请求页面tabel数据
+ async fetchTronUSDCBigTx(req, radius, search, start, end, page,limit) {
+ this.tronUSDCBigTxLoading = true
+ const { data } = await this.$API.getETHTokenBigtx(req, radius, search, start, end, page,limit);
+ this.tableData = data.data.data
+ this.list = [...data.data.data]
+ this.totalPage = data.data.totalPage
+
+
+ // this.rollingData = data.data
+ //通知栏滚动
+ if (this.setInTimeout || this.setInTime) {
+ clearInterval(this.setInTime)
+ clearTimeout(this.setInTimeout)
+ }
+
+ setInterval(() => {
+ this.showMarquee(JSON.parse(JSON.stringify(this.tableData)))
+ }, 3000);
+
+ if (page) {
+ this.currentPage4 = page
+ } else {
+ this.currentPage4 = 1
+ }
+
+ this.tronUSDCBigTxLoading = false
+ },
+ //请求折线图数据
+ async fetchTronUSDCBigTxxcount(req, radius, start, end, type) {
+ // this.usdtbigtxLoading = true
+ const { data } = await this.$API.getBigDealsCount(
+ req,
+ radius,
+ start,
+ end,
+ type
+ );
+ // console.log(data, 98);
+ this.dataCount = data.data
+ this.option.series[0].data.length = 0;
+ this.option.xAxis.data.length = 0;
+ this.dataCount.forEach(item => {
+ let time = item.dataTime.split("T")[0];
+ this.option.xAxis.data.push(time);
+ this.option.series[0].data.push(item.num);
+ })
+ this.option.series[0].name = req
+ // this.option.series[0].itemStyle.color = this.color;
+ // this.option.series[0].lineStyle.color = this.color;
+ this.currentPage4 = 1
+ this.initCharts();
+
+ // this.usdtbigtxLoading = false
+ },
+ //处理表格里的时间
+ formatTime(value) {
+ let newTime = value.split(".")[0].replace("T", " ");
+ return newTime;
+ },
+
+ //关闭弹窗
+ handelClose() {
+ this.dialog = false;
+ },
+ //下拉框选择
+ handelChang(e) {
+ this.state = ""
+ this.params.page=1
+ this.search = this.value
+ this.fetchTronUSDCBigTx(this.params.req, this.params.radius, this.value,this.times.start,this.times.end, this.params.page,this.params.limit)
+ // this.value = ""
+ },
+ handelSearch(b) {
+ //搜索框输入参数
+ this.value = ""
+ this.params.page=1
+ this.search = this.state
+ this.fetchTronUSDCBigTx(this.params.req, this.params.radius, this.state,this.times.start,this.times.end, this.params.page,this.params.limit)
+ // this.state = ""
+ },
+ //获取父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ let search
+ if (this.state) {
+ search = this.state
+ } else if (this.value) {
+ search = this.value
+ }
+
+ this.fetchTronUSDCBigTx(this.params.req, this.params.radius,search,this.times.start,this.times.end, this.params.page,this.params.limit)
+ this.fetchTronUSDCBigTxxcount(this.paramsCount.req, this.paramsCount.radius,this.times.start,this.times.end)
+ //this.times.start = "";
+ //this.times.end = "";
+ },
+ //点击滚动通知栏的查看详情
+ handelDetails() {
+ this.dialogVisible = true;
+ this.dialogData = this.list.find((item) => {
+ return item.txId == this.amountTxid;
+ });
+ this.dialogDate = this.dialogData.dateTime.split(".")[0].replace("T", " ");
+ },
+ // 通知栏滚动
+ showMarquee(data) {
+ this.animate = true;
+
+ this.setInTimeout = setTimeout(() => {
+ // this.notice.push(rollingData[0].label);
+
+ this.amountTxid = this.list[0].txId;
+ this.amountTime = this.list[0].date
+ .split(".")[0]
+ .replace("T", " ");
+ this.notice = this.list[0].amount.toFixed(3);
+ // this.currencyName = this.list[0].abbr;
+ this.list.push(this.list[0]);
+ this.list.shift();
+ this.animate = false;
+
+ }, 500);
+
+ },
+ //点击的改变页数
+ handleCurrentChange(value) {
+ this.params.page = value
+ this.fetchTronUSDCBigTx(this.params.req, this.params.radius, this.search,this.times.start,this.times.end, this.params.page,this.params.limit)
+
+ // this.currentPage4 = this.params.page
+ },
+ //改变每页条数
+ handleSizeChange(val) {
+ this.params.page = 1;
+ this.params.limit = val;
+ this.fetchTronUSDCBigTx(this.params.req, this.params.radius, this.search,this.times.start,this.times.end, this.params.page,this.params.limit)
+
+ },
+ },
+
+ beforeDestroy(){
+ clearInterval(this.setInTime)
+ clearTimeout(this.setInTimeout)
+ console.log("组件离开");
+ },
+ //组件激活唤醒函数
+ activated() {
+ console.log("组件激活");
+ },
+ //组件销毁唤醒函数
+ deactivated() {
+ clearInterval(this.setInTime)
+ clearTimeout(this.setInTimeout)
+ console.log("组件离开");
+
+ },
+
+
+}
\ No newline at end of file
diff --git a/yq/src/views/tronUSDCBigTx/index.vue b/yq/src/views/tronUSDCBigTx/index.vue
new file mode 100644
index 0000000..75f884a
--- /dev/null
+++ b/yq/src/views/tronUSDCBigTx/index.vue
@@ -0,0 +1,425 @@
+
+
+
+
+
+
+
+
+
+ {{$t(`home.tradingVolume`)}}:{{ notice || 0 }}
+ {{$t(`home.tradingHours`)}}:{{amountTime || 0 }}
+ {{$t(`home.currencyName`)}}:{{currencyName || 0}}
+ {{$t(`home.checkDetails`)}}
+
+
+
+
+
+
+
+
+ {{$t(`home.date`)}}: {{ dialogDate }}
+
+
+ {{$t(`home.number`)}}: {{ dialogData.amount }}
+
+
+ {{$t(`home.currencyName`)}}: {{ dialogData.abbr }}
+
+
+ {{$t(`home.contractAddress`)}}: {{ dialogData.caddress }}
+
+
+ {{$t(`home.address`)}}:
+ {{
+ (dialogData.vout = dialogData.vout ? dialogData.vout : $t(`home.no`))
+ }}
+
+
+ {{$t(`home.aAddress`)}}:
+ {{
+ (dialogData.fromAddress = dialogData.fromAddress
+ ? dialogData.fromAddress
+ : $t(`home.no`))
+ }}
+
+
+ {{$t(`home.height`)}}: {{ dialogData.height }}
+
+
+ {{$t(`home.targetAddress`)}}:
+ {{
+ (dialogData.toAddress = dialogData.toAddress
+ ? dialogData.toAddress
+ : $t(`home.no`))
+ }}
+
+
+ {{$t(`home.transaction`)}}: {{ dialogData.txId }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{$t(`home.bigTable`)}}
+
+
+
+ {{$t(`home.table`)}}
+
+
+
+
+
+
+ {{ formatTime(scope.row.date) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{$t(`home.down`)}} X
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/tronUSDTBigTx/index.js b/yq/src/views/tronUSDTBigTx/index.js
new file mode 100644
index 0000000..0d7c187
--- /dev/null
+++ b/yq/src/views/tronUSDTBigTx/index.js
@@ -0,0 +1,373 @@
+import * as echarts from "echarts";
+export default {
+ data() {
+ return {
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i <= params.length - 1; i++) {
+ // res += `${params[i].marker} ${params[i].value[1]} ${params[i].seriesName}`;
+ // }
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ type: "category",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ },
+ yAxis: [
+ {
+ name: this.$t(`home.figure`),
+ // name: "MVRV",
+ position: "left",
+ type: "value",
+ },
+ ],
+ dataZoom: [
+ {
+ type: "slider",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ series: [
+ {
+ type: "line",
+ name: "",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+
+ data: [],
+ },
+ ],
+ },
+ params: {
+ req: "tronUSDTBigTx",
+ radius: "eth",
+ page: 1,
+ limit:50,
+ },
+ paramsCount: {
+ req: "tronUSDTBigTxCount",
+ radius: "eth",
+ },
+ times: {
+ start: "",
+ end: ""
+ },
+ tabelloading: false,
+ tableData: [],
+ tronUSDTBigTxLoading: false,
+ dialog: false,
+ tabelUrl: "",
+ color: "",
+ introduce: "",
+ valueList: [
+ {
+ value: 50000,
+ label: "余额 > 5W",
+ },
+ {
+ value: 100000,
+ label: "余额 > 10W",
+ },
+ {
+ value: 150000,
+ label: "余额 > 15W",
+ },
+ {
+ value: 250000,
+ label: "余额 > 25W",
+ },
+ {
+ value: 500000,
+ label: "余额 > 50W",
+ },
+ {
+ value: 1000000,
+ label: "余额 > 100W",
+ },
+ ],
+ state: "",
+ value: "",
+ tabelParams: {
+ req: "",
+ address: "",
+ txId: "",
+ type: "",
+ },
+ animate: false,
+ notice: "",
+ amountTxid: "",
+ amountTime: "",
+ dialogVisible: false,
+ dialogData: [],
+ dialogDate: "",
+ rollingData: [],
+ setInTime: null,
+ currencyName: "",
+ currentPage4: 1,//当前页数
+ totalPage: 0,
+ list:[],
+ setInTimeout:null,
+ search:""
+
+ }
+ },
+ mounted() {
+
+ //请求数据
+ this.fetchTronUSDTBigTx(this.params.req, this.params.radius, this.search, this.times.start, this.times.end, this.params.page,this.params.limit)
+ this.fetchTronUSDTBigTxxcount(this.paramsCount.req, this.paramsCount.radius)
+
+ // let menuObj = localStorage.getItem("params");
+ // this.introduce = JSON.parse(menuObj).introduce;
+ // this.show = localStorage.getItem("currentTabComponent");
+ let obj = localStorage.getItem("src");
+ // this.color = JSON.parse(obj).color;
+ window.addEventListener("setItem", () => {
+ // let menuObj = localStorage.getItem("params");
+ // // this.params.req = JSON.parse(menuObj).componentReq;
+ // this.introduce = JSON.parse(menuObj).introduce;
+ let obj = localStorage.getItem("src");
+ // this.color = JSON.parse(obj).color;
+ });
+ this.$addStorageEvent(1, "buttonShow", false)
+ // this.$addStorageEvent(1, "introduce", this.introduce);
+ if (this.setInTimeout || this.setInTime) {
+ clearInterval(this.setInTime)
+ clearTimeout(this.setInTimeout)
+ }
+
+ },
+
+ methods: {
+ initCharts() {
+ this.myChart = echarts.init(document.getElementById("tronUSDTBigTx"));
+ // this.myChart.clear();
+ this.myChart.setOption(this.option);
+ // 当窗口或者大小发生改变时执行resize,重新绘制图表
+ window.addEventListener("resize", () => {
+ if (this.myChart)this.myChart.resize();
+ });
+ },
+ //请求页面tabel数据
+ async fetchTronUSDTBigTx(req, radius, search, start, end, page,limit) {
+ this.tronUSDTBigTxLoading = true
+ const { data } = await this.$API.getETHTokenBigtx(req, radius, search, start, end, page,limit);
+ this.tableData = data.data.data
+ this.list = [...data.data.data]
+ this.totalPage = data.data.totalPage
+ console.log(data, 5556);
+
+
+ //通知栏滚动
+ if (this.setInTimeout || this.setInTime) {
+ clearInterval(this.setInTime)
+ clearTimeout(this.setInTimeout)
+ }
+
+ setInterval(() => {
+ this.showMarquee(JSON.parse(JSON.stringify(this.tableData)))
+ }, 3000);
+
+ if (page) {
+ this.currentPage4 = page
+ } else {
+ this.currentPage4 = 1
+ }
+
+ this.tronUSDTBigTxLoading = false
+ },
+ //请求折线图数据
+ async fetchTronUSDTBigTxxcount(req, radius, start, end, type) {
+ // this.usdtbigtxLoading = true
+ const { data } = await this.$API.getBigDealsCount(
+ req,
+ radius,
+ start,
+ end,
+ type
+ );
+ // console.log(data, 98);
+ this.dataCount = data.data
+ this.option.series[0].data.length = 0;
+ this.option.xAxis.data.length = 0;
+ this.dataCount.forEach(item => {
+ let time = item.dataTime.split("T")[0];
+ this.option.xAxis.data.push(time);
+ this.option.series[0].data.push(item.num);
+ })
+ this.option.series[0].name = req
+ // this.option.series[0].itemStyle.color = this.color;
+ // this.option.series[0].lineStyle.color = this.color;
+ this.currentPage4 = 1
+ this.initCharts();
+
+ // this.usdtbigtxLoading = false
+ },
+ //处理表格里的时间
+ formatTime(value) {
+ let newTime = value.split(".")[0].replace("T", " ");
+ return newTime;
+ },
+
+ //关闭弹窗
+ handelClose() {
+ this.dialog = false;
+ },
+ //下拉框选择
+ handelChang(e) {
+ this.state = ""
+ this.params.page=1
+ // console.log(this.value,56565);
+ // this.search = this.value
+ this.fetchTronUSDTBigTx(this.params.req, this.params.radius, this.value,this.times.start,this.times.end, this.params.page,this.params.limit)
+ // this.value = ""
+ },
+ handelSearch(b) {
+ //搜索框输入参数
+ this.value = ""
+ this.params.page=1
+ // this.search = this.state
+ this.fetchTronUSDTBigTx(this.params.req, this.params.radius, this.state,this.times.start,this.times.end, this.params.page,this.params.limit)
+ // this.state = ""
+ },
+ //获取父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ let search
+ if (this.state) {
+ search = this.state
+ } else if (this.value) {
+ search = this.value
+ }
+
+ this.fetchTronUSDTBigTx(this.params.req, this.params.radius,search,this.times.start,this.times.end, this.params.page,this.params.limit)
+ this.fetchTronUSDTBigTxxcount(this.paramsCount.req, this.paramsCount.radius,this.times.start,this.times.end)
+ //this.times.start = "";
+ //this.times.end = "";
+ },
+ //点击滚动通知栏的查看详情
+ handelDetails() {
+ this.dialogVisible = true;
+ this.dialogData = this.list.find((item) => {
+ return item.txId == this.amountTxid;
+ });
+ this.dialogDate = this.dialogData.dateTime.split(".")[0].replace("T", " ");
+ },
+ // 通知栏滚动
+ showMarquee(data) {
+ this.animate = true;
+
+ this.setInTimeout = setTimeout(() => {
+ // this.notice.push(rollingData[0].label);
+
+ this.amountTxid = this.list[0].txId;
+ this.amountTime = this.list[0].date
+ .split(".")[0]
+ .replace("T", " ");
+ this.notice = this.list[0].amount.toFixed(3);
+ // this.currencyName = this.list[0].abbr;
+ this.list.push(this.list[0]);
+ this.list.shift();
+ this.animate = false;
+
+ }, 500);
+
+ },
+ //点击的改变页数
+ handleCurrentChange(value) {
+ this.params.page = value
+ this.fetchTronUSDTBigTx(this.params.req, this.params.radius, this.search,this.times.start,this.times.end, this.params.page,this.params.limit)
+
+ // this.currentPage4 = this.params.page
+ },
+ //改变每页条数
+ handleSizeChange(val) {
+ this.params.page = 1;
+ this.params.limit = val;
+ this.fetchTronUSDTBigTx(this.params.req, this.params.radius, this.search,this.times.start,this.times.end, this.params.page,this.params.limit)
+
+ },
+ },
+
+ beforeDestroy(){
+ clearInterval(this.setInTime)
+ clearTimeout(this.setInTimeout)
+ console.log("组件离开");
+ },
+ //组件激活唤醒函数
+ activated() {
+ console.log("组件激活");
+ },
+ //组件销毁唤醒函数
+ deactivated() {
+ clearInterval(this.setInTime)
+ clearTimeout(this.setInTimeout)
+ console.log("组件离开");
+
+ },
+
+
+}
\ No newline at end of file
diff --git a/yq/src/views/tronUSDTBigTx/index.vue b/yq/src/views/tronUSDTBigTx/index.vue
new file mode 100644
index 0000000..d54ceda
--- /dev/null
+++ b/yq/src/views/tronUSDTBigTx/index.vue
@@ -0,0 +1,425 @@
+
+
+
+
+
+
+
+
+
+ {{$t(`home.tradingVolume`)}}:{{ notice || 0 }}
+ {{$t(`home.tradingHours`)}}:{{amountTime || 0 }}
+ {{$t(`home.currencyName`)}}:{{currencyName || 0}}
+ {{$t(`home.checkDetails`)}}
+
+
+
+
+
+
+
+
+ {{$t(`home.date`)}}: {{ dialogDate }}
+
+
+ {{$t(`home.number`)}}: {{ dialogData.amount }}
+
+
+ {{$t(`home.currencyName`)}}: {{ dialogData.abbr }}
+
+
+ {{$t(`home.contractAddress`)}}: {{ dialogData.caddress }}
+
+
+ {{$t(`home.address`)}}:
+ {{
+ (dialogData.vout = dialogData.vout ? dialogData.vout : $t(`home.no`))
+ }}
+
+
+ {{$t(`home.aAddress`)}}:
+ {{
+ (dialogData.fromAddress = dialogData.fromAddress
+ ? dialogData.fromAddress
+ : $t(`home.no`))
+ }}
+
+
+ {{$t(`home.height`)}}: {{ dialogData.height }}
+
+
+ {{$t(`home.targetAddress`)}}:
+ {{
+ (dialogData.toAddress = dialogData.toAddress
+ ? dialogData.toAddress
+ : $t(`home.no`))
+ }}
+
+
+ {{$t(`home.transaction`)}}: {{ dialogData.txId }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{$t(`home.bigTable`)}}
+
+
+
+ {{$t(`home.table`)}}
+
+
+
+
+
+
+ {{ formatTime(scope.row.date) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{$t(`home.down`)}} X
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/tronUsdcVolume/index.js b/yq/src/views/tronUsdcVolume/index.js
new file mode 100644
index 0000000..a37a609
--- /dev/null
+++ b/yq/src/views/tronUsdcVolume/index.js
@@ -0,0 +1,240 @@
+import * as echarts from "echarts";
+import { handelProfitrate,handelLineType,handelSwitchs } from "../../util/processingData"
+
+export default {
+ data(){
+ return {
+ tronUsdcVolumeLoading:false,
+ params:{
+ req:"tronUsdcVolume",
+ radius:"ETH",
+ start:"",
+ end:""
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ position: function (pt) {
+ return [pt[0], "10%"];
+ },
+ },
+ legend: {
+ right:"100",
+ // data:[`sopr`,'asopr','easopr','lthsopr','sthsopr',],
+ // selected:{
+ // 'asopr': false,
+ // 'easopr': false,
+ // 'lthsopr': false,
+ // 'sthsopr': false,
+ // }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//万
+ value = `${e / 10000}W`;
+ } else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min:"dataMin",
+ max:"dataMax",
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right",
+ min:"dataMin",
+ max:"dataMax",
+
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "number of token transferred",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 1,
+ // data: [],
+ // //绘制右侧Y轴
+ // markLine: {
+ // symbol: ["none", "none"], //去掉箭头
+ // itemStyle: {
+ // normal: {
+ // lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ // },
+ // },
+ // // lineStyle:{
+ // // color:"red"
+ // // },
+
+ // label: {
+ // formatter: "{b}",
+ // fontSize: 10,
+ // color: "rgba(0,0,0,0.8)",
+ // align: "left",
+ // },
+ // data: [
+ // // {
+ // // name: "0",
+ // // yAxis: 0,
+ // // },
+ // // {
+ // // name: "$40W",
+ // // yAxis: 400000,
+ // // },
+ // {
+ // name: "$70W",
+ // yAxis: 700000,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+
+ // {
+ // name: "$10W",
+ // yAxis: 100000,
+ // },
+ // {
+ // name: "$100W",
+ // yAxis: 1000000,
+ // // position: ['100%', '50'],
+ // },
+ // {
+ // name: "$120W",
+ // yAxis: 1200000,
+ // },
+
+ // {
+ // name: "$140W",
+ // yAxis: 1400000,
+ // },
+ // ],
+ // },
+ // },
+
+ ],
+ },
+ switch3:""
+ }
+ },
+ mounted(){
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+
+ this.fetchTronUsdcVolume(this.params.req,this.params.radius)
+ },
+ methods:{
+ //初始化图表
+ inCharts() {
+ this.myChart = echarts.init(document.getElementById("tronUsdcVolumeBox"));
+
+ this.myChart.setOption(this.option);
+
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ //返回了三个字段 目前只做volumeSelf
+ async fetchTronUsdcVolume(req, radius, start, end){
+ this.tronUsdcVolumeLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end)
+ let tronUsdcVolumeData = data.data
+
+
+ let time =""
+ let volumeSelfList = []
+ tronUsdcVolumeData.forEach(item=>{
+ time = item.date.split("T")[0]
+ volumeSelfList.push(Number( parseInt(item.volumeSelf*100)/100))
+
+ })
+ this.option.series[0].data = handelProfitrate(tronUsdcVolumeData, volumeSelfList)
+
+ this.inCharts()
+
+ this.tronUsdcVolumeLoading = false
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchTronUsdcVolume(this.params.req,this.params.radius,this.params.start, this.params.end)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/tronUsdcVolume/index.vue b/yq/src/views/tronUsdcVolume/index.vue
new file mode 100644
index 0000000..2eab033
--- /dev/null
+++ b/yq/src/views/tronUsdcVolume/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/tronUsdtVolume/index.js b/yq/src/views/tronUsdtVolume/index.js
new file mode 100644
index 0000000..45edc08
--- /dev/null
+++ b/yq/src/views/tronUsdtVolume/index.js
@@ -0,0 +1,239 @@
+import * as echarts from "echarts";
+import { handelBtcPrice, handelProfitrate,handelLineType,handelSwitchs } from "../../util/processingData"
+
+export default {
+ data(){
+ return {
+ tronUsdtVolumeLoading:false,
+ params:{
+ req:"tronUsdtVolume",
+ radius:"ETH",
+ start:"",
+ end:""
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ position: function (pt) {
+ return [pt[0], "10%"];
+ },
+ },
+ legend: {
+ right:"100",
+ // data:[`sopr`,'asopr','easopr','lthsopr','sthsopr',],
+ // selected:{
+ // 'asopr': false,
+ // 'easopr': false,
+ // 'lthsopr': false,
+ // 'sthsopr': false,
+ // }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e > 10000) {//万
+ value = `${e / 10000}W`;
+ } else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min:"dataMin",
+ max:"dataMax",
+
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ position: "right",
+ min:"dataMin",
+ max:"dataMax",
+
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "number of token transferred",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 1,
+ // data: [],
+ // //绘制右侧Y轴
+ // markLine: {
+ // symbol: ["none", "none"], //去掉箭头
+ // itemStyle: {
+ // normal: {
+ // lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ // },
+ // },
+ // // lineStyle:{
+ // // color:"red"
+ // // },
+
+ // label: {
+ // formatter: "{b}",
+ // fontSize: 10,
+ // color: "rgba(0,0,0,0.8)",
+ // align: "left",
+ // },
+ // data: [
+ // // {
+ // // name: "0",
+ // // yAxis: 0,
+ // // },
+ // // {
+ // // name: "$40W",
+ // // yAxis: 400000,
+ // // },
+ // {
+ // name: "$70W",
+ // yAxis: 700000,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+
+ // {
+ // name: "$10W",
+ // yAxis: 100000,
+ // },
+ // {
+ // name: "$100W",
+ // yAxis: 1000000,
+ // // position: ['100%', '50'],
+ // },
+ // {
+ // name: "$120W",
+ // yAxis: 1200000,
+ // },
+
+ // {
+ // name: "$140W",
+ // yAxis: 1400000,
+ // },
+ // ],
+ // },
+ // },
+
+ ],
+ },
+ switch3:""
+ }
+ },
+ mounted(){
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+
+ this.fetchTronUsdtVolume(this.params.req,this.params.radius)
+ },
+ methods:{
+ //初始化图表
+ inCharts() {
+ this.myChart = echarts.init(document.getElementById("tronUsdtVolumeBox"));
+
+ this.myChart.setOption(this.option);
+
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ //返回了三个字段 目前只做volumeSelf
+ async fetchTronUsdtVolume(req, radius, start, end){
+ this.tronUsdtVolumeLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end)
+ let tronUsdtVolumeData = data.data
+
+
+ let time =""
+ let volumeSelfList = []
+ tronUsdtVolumeData.forEach(item=>{
+ time = item.date.split("T")[0]
+ volumeSelfList.push(parseInt(item.volumeSelf*100)/100)
+
+ })
+ this.option.series[0].data = handelProfitrate(tronUsdtVolumeData, volumeSelfList)
+
+ this.inCharts()
+ this.tronUsdtVolumeLoading = false
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchTronUsdtVolume(this.params.req,this.params.radius,this.params.start, this.params.end)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/tronUsdtVolume/index.vue b/yq/src/views/tronUsdtVolume/index.vue
new file mode 100644
index 0000000..1b25ba3
--- /dev/null
+++ b/yq/src/views/tronUsdtVolume/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/tzbp/index.js b/yq/src/views/tzbp/index.js
new file mode 100644
index 0000000..02de6c6
--- /dev/null
+++ b/yq/src/views/tzbp/index.js
@@ -0,0 +1,396 @@
+import * as echarts from "echarts";
+import { getTzbp } from "../../api/apiPost"
+import { chartsWidth,emptyData, handelProfitrate, dataLength,handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ tzbpLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: 'Buy power for Time Zone',
+ type: 'bar',
+ data: [],
+ itemStyle: {
+ normal: {
+ // 使用函数返回颜色值
+ color: function (params) {
+
+ var val = params.value[1];
+ if (val > 0) {
+ // 正数柱状图染成红色
+ return 'green';
+ } else if (val < 0) {
+ // 负数柱状图染成绿色
+ return 'red';
+ }
+ // 0 值不染色
+ return '';
+ }
+ }
+ },
+ z: 1
+ },
+ // {
+ // name: "Buy power for Time Zone",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // showSymbol: false,
+ // symbolSize: 5,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#f7864c",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // yAxisIndex: 0,
+ // lineStyle: {
+ // //线条样式
+ // color: "#f7864c",
+ // width: "1",
+ // },
+ // data: [],
+ // },
+
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ zone: "eu",
+ sma: "",
+ coin: "BTC"
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ zoneList: [{//美洲
+ value: "us",
+ label: "America",
+ }, {//亚洲
+ value: "asia",
+ label: "Asia",
+ }, {//欧洲
+ value: "eu",
+ label: "Europe",
+ },],
+ isactive: 2,
+
+ }
+ },
+ mounted() {
+ this.fetchTzbp(this.params)
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("tzbpBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("tzbpBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchTzbp(params) {
+ this.tzbpLoading = true
+ const { data } = await getTzbp(params)
+ let tzbpData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.tzbpLoading = false
+ return
+ }
+
+
+ this.start = tzbpData[0].date.split("T")[0]
+ this.end = tzbpData[tzbpData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ this.$nextTick(() => {
+ //渲染ETH
+ if (this.ethFlag) {
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+
+ }
+ //渲染BTC价格
+ if (this.btcFlag) {
+ this.handelSonBtcPrice("BTC", this.btcFlag)
+ this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+
+ }
+ })
+ let ValueList = []
+ tzbpData.forEach(item => {
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(tzbpData, ValueList)
+
+ let label = this.zoneList.find(item => item.value == this.params.zone).label
+ this.option.series[0].name = `Buy power for ${label} Zone`
+
+
+ this.inCharts()
+
+ this.tzbpLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchTzbp(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchTzbp(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ handelZone(value, index) {
+ this.params.zone = value
+ this.isactive = index
+ this.fetchTzbp(this.params)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/tzbp/index.vue b/yq/src/views/tzbp/index.vue
new file mode 100644
index 0000000..9b591e9
--- /dev/null
+++ b/yq/src/views/tzbp/index.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/tzbpEth/index.js b/yq/src/views/tzbpEth/index.js
new file mode 100644
index 0000000..389d19b
--- /dev/null
+++ b/yq/src/views/tzbpEth/index.js
@@ -0,0 +1,375 @@
+import * as echarts from "echarts";
+import { getTzbp } from "../../api/apiPost"
+import { chartsWidth,emptyData, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ tzbpEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right",
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: 'Buy power for Time Zone',
+ type: 'bar',
+ data: [],
+ itemStyle: {
+ normal: {
+ // 使用函数返回颜色值
+ color: function (params) {
+
+ var val = params.value[1];
+ if (val > 0) {
+ // 正数柱状图染成红色
+ return 'green';
+ } else if (val < 0) {
+ // 负数柱状图染成绿色
+ return 'red';
+ }
+ // 0 值不染色
+ return '';
+ }
+ }
+ },
+ z: 1
+ },
+ // {
+ // name: "Buy power for Time Zone",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // showSymbol: false,
+ // symbolSize: 5,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#f7864c",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // yAxisIndex: 0,
+ // lineStyle: {
+ // //线条样式
+ // color: "#f7864c",
+ // width: "1",
+ // },
+ // data: [],
+ // },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 1,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 4,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ zone: "eu",
+ sma: "",
+ coin: "ETH"
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ zoneList: [{//美洲
+ value: "us",
+ label: "America",
+ }, {//亚洲
+ value: "asia",
+ label: "Asia",
+ }, {//欧洲
+ value: "eu",
+ label: "Europe",
+ },],
+ isactive: 2,
+
+ }
+ },
+ mounted() {
+ this.fetchTzbpEth(this.params)
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("tzbpEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("tzbpEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchTzbpEth(params) {
+ this.tzbpEthLoading = true
+ const { data } = await getTzbp(params)
+ let tzbpEthData = data.data
+ // if (!tzbpEthData[0]) {
+ // this.$message({
+ // type: 'warning',
+ // message: this.$t(`home.NoData`)
+ // });
+ // this.inCharts()
+ // this.tzbpEthLoading = false
+ // return
+ // }
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.tzbpEthLoading = false
+ return
+ }
+
+ this.start = tzbpEthData[0].date.split("T")[0]
+ this.end = tzbpEthData[tzbpEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // this.$nextTick(() => {
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.handelSonEthPrice("ETH",this.ethFlag)
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+
+ // }
+ // })
+
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ tzbpEthData.forEach(item => {
+ ValueList.push(Number(item.value.toFixed(2)))
+
+ })
+ this.option.series[0].data = handelProfitrate(tzbpEthData, ValueList)
+
+ let label = this.zoneList.find(item => item.value == this.params.zone).label
+ this.option.series[0].name = `Buy power for ${label} Zone`
+ this.inCharts()
+
+ this.tzbpEthLoading = false
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchTzbpEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchTzbpEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+
+ handelZone(value, index) {
+ this.params.zone = value
+ this.isactive = index
+ this.fetchTzbpEth(this.params)
+
+ },
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/tzbpEth/index.vue b/yq/src/views/tzbpEth/index.vue
new file mode 100644
index 0000000..cd9729f
--- /dev/null
+++ b/yq/src/views/tzbpEth/index.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/uloss/index.js b/yq/src/views/uloss/index.js
new file mode 100644
index 0000000..92eecdd
--- /dev/null
+++ b/yq/src/views/uloss/index.js
@@ -0,0 +1,464 @@
+import * as echarts from "echarts";
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelSwitchs, fetchBtcPrice, handelWatermark, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ ulossLoading: false,
+ params: {
+ req: "uloss",
+ radius: "btc"
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // min: "dataMin",
+ // max: "dataMax",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ // min: "dataMin",
+ // max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Unrealized Loss",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ // markLine: {
+ // symbol: ["none", "none"], //去掉箭头
+ // itemStyle: {
+ // normal: {
+ // lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ // },
+ // },
+ // // lineStyle:{
+ // // color:"red"
+ // // },
+
+ // label: {
+ // formatter: "{b}",
+ // fontSize: 10,
+ // color: "rgba(0,0,0,0.8)",
+ // align: "left",
+ // },
+ // data: [
+ // {
+ // name: "$0.02",
+ // yAxis: 0.02,
+ // },
+ // {
+ // name: "$0.06",
+ // yAxis: 0.06,
+ // },
+ // {
+ // name: "$0.1",
+ // yAxis: 0.1,
+ // },
+ // {
+ // name: "$0.4",
+ // yAxis: 0.4,
+ // },
+ // {
+ // name: "$0.8",
+ // yAxis: 0.8,
+ // },
+ // {
+ // name: "$2",
+ // yAxis: 2,
+ // },
+ // {
+ // name: "$6",
+ // yAxis: 6,
+ // },
+ // {
+ // name: "$10",
+ // yAxis: 10,
+ // },
+ // {
+ // name: "$40",
+ // yAxis: 40,
+ // },
+ // {
+ // name: "$80",
+ // yAxis: 80,
+ // },
+ // // {
+ // // name: "$120",
+ // // yAxis: 120,
+ // // },
+ // {
+ // name: "$160",
+ // yAxis: 160,
+ // },
+ // // {
+ // // name: "$200",
+ // // yAxis: 200,
+ // // },
+ // {
+ // name: "$240",
+ // yAxis: 240,
+ // },
+ // {
+ // name: "$300",
+ // yAxis: 300,
+ // },
+ // {
+ // name: "$500",
+ // yAxis: 500,
+ // },
+ // {
+ // name: "$700",
+ // yAxis: 700,
+ // },
+ // {
+ // name: "$900",
+ // yAxis: 900,
+ // },
+ // {
+ // name: "$1100",
+ // yAxis: 1100,
+ // },
+ // // {
+ // // name: "$1200",
+ // // yAxis: 1200,
+ // // },
+ // {
+ // name: "$1800",
+ // yAxis: 1800,
+ // },
+ // {
+ // name: "$3000",
+ // yAxis: 3000,
+ // },
+ // // {
+ // // name: "$40W",
+ // // yAxis: 400000,
+ // // },
+ // {
+ // name: "$70W",
+ // yAxis: 700000,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+
+ // {
+ // name: "$10W",
+ // yAxis: 100000,
+ // },
+ // {
+ // name: "$100W",
+ // yAxis: 1000000,
+ // // position: ['100%', '50'],
+ // },
+ // {
+ // name: "$120W",
+ // yAxis: 1200000,
+ // },
+
+ // {
+ // name: "$140W",
+ // yAxis: 1400000,
+ // },
+ // ],
+ // },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 2,
+ // data: [],
+ // },
+
+ ],
+ },
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+
+ this.fetchUloss(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("ulossBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("ulossBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchUloss(req, radius, start, end, sma) {
+ this.ulossLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+ let ulossData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.ulossLoading = false
+ return
+ }
+ this.start = ulossData[0].date.split("T")[0]
+ this.end = ulossData[ulossData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ //渲染ETH
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+ let ulossValueList = []
+
+ ulossData.forEach(item => {
+
+ ulossValueList.push(Number(item.value.toFixed(2)))
+
+
+ })
+ this.option.series[0].data = handelProfitrate(ulossData, ulossValueList)
+
+ this.inCharts()
+ this.ulossLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchUloss(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.sma = smaDataList
+ this.fetchUloss(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+
+
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/uloss/index.vue b/yq/src/views/uloss/index.vue
new file mode 100644
index 0000000..fac8d03
--- /dev/null
+++ b/yq/src/views/uloss/index.vue
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+ Unrealized Loss = value · (price created [USD] - price [USD] )
+
+
+
+
(of all UTXOs where price created > price)
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/uprofit/index.js b/yq/src/views/uprofit/index.js
new file mode 100644
index 0000000..f363092
--- /dev/null
+++ b/yq/src/views/uprofit/index.js
@@ -0,0 +1,460 @@
+import * as echarts from "echarts";
+import { chartsWidth,emptyData, dataLength,handelProfitrate, handelLineType, handelSwitchs, handelZoom, handelWatermark, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ uprofitLoading: false,
+ params: {
+ req: "uprofit",
+ radius: "btc"
+ },
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ // min: "dataMin",
+ // max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 20,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Unrealized Profit",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ // markLine: {
+ // symbol: ["none", "none"], //去掉箭头
+ // itemStyle: {
+ // normal: {
+ // lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ // },
+ // },
+ // // lineStyle:{
+ // // color:"red"
+ // // },
+
+ // label: {
+ // formatter: "{b}",
+ // fontSize: 10,
+ // color: "rgba(0,0,0,0.8)",
+ // align: "left",
+ // },
+ // data: [
+ // {
+ // name: "$0.02",
+ // yAxis: 0.02,
+ // },
+ // {
+ // name: "$0.06",
+ // yAxis: 0.06,
+ // },
+ // {
+ // name: "$0.1",
+ // yAxis: 0.1,
+ // },
+ // {
+ // name: "$0.4",
+ // yAxis: 0.4,
+ // },
+ // {
+ // name: "$0.8",
+ // yAxis: 0.8,
+ // },
+ // {
+ // name: "$2",
+ // yAxis: 2,
+ // },
+ // {
+ // name: "$6",
+ // yAxis: 6,
+ // },
+ // {
+ // name: "$10",
+ // yAxis: 10,
+ // },
+ // {
+ // name: "$40",
+ // yAxis: 40,
+ // },
+ // {
+ // name: "$80",
+ // yAxis: 80,
+ // },
+ // // {
+ // // name: "$120",
+ // // yAxis: 120,
+ // // },
+ // {
+ // name: "$160",
+ // yAxis: 160,
+ // },
+ // // {
+ // // name: "$200",
+ // // yAxis: 200,
+ // // },
+ // {
+ // name: "$240",
+ // yAxis: 240,
+ // },
+ // {
+ // name: "$300",
+ // yAxis: 300,
+ // },
+ // {
+ // name: "$500",
+ // yAxis: 500,
+ // },
+ // {
+ // name: "$700",
+ // yAxis: 700,
+ // },
+ // {
+ // name: "$900",
+ // yAxis: 900,
+ // },
+ // {
+ // name: "$1100",
+ // yAxis: 1100,
+ // },
+ // // {
+ // // name: "$1200",
+ // // yAxis: 1200,
+ // // },
+ // {
+ // name: "$1800",
+ // yAxis: 1800,
+ // },
+ // {
+ // name: "$3000",
+ // yAxis: 3000,
+ // },
+ // // {
+ // // name: "$40W",
+ // // yAxis: 400000,
+ // // },
+ // {
+ // name: "$70W",
+ // yAxis: 700000,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+
+ // {
+ // name: "$10W",
+ // yAxis: 100000,
+ // },
+ // {
+ // name: "$100W",
+ // yAxis: 1000000,
+ // // position: ['100%', '50'],
+ // },
+ // {
+ // name: "$120W",
+ // yAxis: 1200000,
+ // },
+
+ // {
+ // name: "$140W",
+ // yAxis: 1400000,
+ // },
+ // ],
+ // },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 2,
+ // data: [],
+ // },
+
+ ],
+ },
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+ this.fetchUprofit(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("uprofitBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("uprofitBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchUprofit(req, radius, start, end, sma) {
+ this.uprofitLoading = true
+ const { data } = await this.$API.getCsupply(req, radius, start, end, sma)
+ let uprofitData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.uprofitLoading = false
+ return
+ }
+ this.start = uprofitData[0].date.split("T")[0]
+ this.end = uprofitData[uprofitData.length - 1].date.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ //渲染ETH
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+ let uprofitValueList = []
+
+ uprofitData.forEach(item => {
+
+ uprofitValueList.push(Number(item.value.toFixed(2)))
+
+
+ })
+ this.option.series[0].data = handelProfitrate(uprofitData, uprofitValueList)
+
+ this.inCharts()
+ this.uprofitLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchUprofit(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.sma = smaDataList
+ this.fetchUprofit(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/yq/src/views/uprofit/index.vue b/yq/src/views/uprofit/index.vue
new file mode 100644
index 0000000..79c7907
--- /dev/null
+++ b/yq/src/views/uprofit/index.vue
@@ -0,0 +1,117 @@
+
+
+
+
+
+ Unrealized Profit = value · (price [USD] - price created [USD] )
+
+
+
+
(of all UTXOs where price > price created )
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/usdtVolume/index.js b/yq/src/views/usdtVolume/index.js
new file mode 100644
index 0000000..8f5aa23
--- /dev/null
+++ b/yq/src/views/usdtVolume/index.js
@@ -0,0 +1,276 @@
+import * as echarts from "echarts";
+export default {
+ data() {
+ return {
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ type: "category",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ },
+ yAxis: [
+ {
+ // name: "MVRV",
+ position: "left",
+ type: "value",
+ },
+ {
+ // name: "MVRV",
+ position: "right",
+ type: "log",
+ show: false
+ },
+ {
+ // name: "MVRV",
+ position: "right",
+ type: "log",
+ show: false
+ },
+ {
+ // name: "MVRV",
+ position: "right",
+ type: "value",
+ show: true,
+ axisLabel:{
+ formatter(value){
+ let data
+ if (value > 100000000) {
+ data = `${value/100000000} E`
+ }else if (value > 10000) {
+ data = `${value/10000} W`
+ }else{
+ data = value
+ }
+ return data
+ }
+ }
+ },
+ ],
+ dataZoom: [
+ {
+ type: "slider",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ type: "inside",
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ series: [
+ {
+ type: "line",
+ name: "volume",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+ // {
+ // type: "line",
+ // name: "fromVolume",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#f7931a",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#f7931a",
+ // width: "1",
+ // },
+ // yAxisIndex: 1,
+ // data: [],
+ // },
+ // {
+ // type: "line",
+ // name: "spenderVolume",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#e74135",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#e74135",
+ // width: "1",
+ // },
+ // yAxisIndex: 2,
+ // data: [],
+ // },
+ // {
+ // type: "line",
+ // name: "toVolume",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#2ac2d1",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#2ac2d1",
+ // width: "1",
+ // },
+ // yAxisIndex: 3,
+ // data: [],
+ // },
+ ],
+ },
+ dailyTradingLoading: false,
+ params: {
+ req: "",
+ radius: "eth",
+ },
+ times: {
+ start: "",
+ end: ""
+ },
+ dataCount: [],
+ introduce: "",
+ req:""
+ }
+ },
+ mounted() {
+
+ //按钮禁用
+ this.$addStorageEvent(1, "buttonShow", false);
+ let menuObj = localStorage.getItem("params");
+ this.req = JSON.parse(menuObj).componentReq;
+ this.introduce = JSON.parse(menuObj).introduce;
+ //监听localstorage变化
+ window.addEventListener("setItem", () => {
+ let menuObj = localStorage.getItem("params");
+ this.req = JSON.parse(menuObj).componentReq;
+ this.introduce = JSON.parse(menuObj).introduce;
+ });
+
+ this.fetchDailyTrading(this.req, this.params.radius)
+
+
+ },
+
+ methods: {
+ initCharts() {
+ this.myChart = echarts.init(document.getElementById("usdtVolume"));
+ // this.myChart.clear();
+ this.myChart.setOption(this.option);
+ // 当窗口或者大小发生改变时执行resize,重新绘制图表
+ window.addEventListener("resize", () => {
+ if (this.myChart)this.myChart.resize();
+ });
+ },
+ //请求折线图数据
+ async fetchDailyTrading(req, radius, start, end, type) {
+ this.dailyTradingLoading = true
+ const { data } = await this.$API.getBigDealsCount(
+ req,
+ radius,
+ start,
+ end,
+ type
+ );
+ this.dataCount = data.data
+ this.option.series[0].data.length = 0;
+ // this.option.series[1].data.length = 0;
+ // this.option.series[2].data.length = 0;
+ // this.option.series[3].data.length = 0;
+ this.option.xAxis.data.length = 0;
+
+ this.dataCount.forEach(item => {
+ let time = item.dateTime.split("T")[0];
+ // let spenderVolume = item.spenderVolume.toFixed(3)
+ // let toVolume = Number(item.toVolume.toFixed(3))
+ // let fromVolume = item.fromVolume.toFixed(3)
+ this.option.xAxis.data.push(time);
+ this.option.series[0].data.push(parseInt(item.volume*100)/100 );
+ // this.option.series[1].data.push(fromVolume);
+ // this.option.series[2].data.push(spenderVolume);
+ // this.option.series[3].data.push(toVolume);
+ })
+
+ if (req=="usdtVolume") {
+ this.option.series[0].name = `usdt(eth) volume`
+ }else if(req=="usdcVolume"){
+ this.option.series[0].name = `usdc(eth) volume`
+ }
+
+ this.initCharts();
+
+ this.dailyTradingLoading = false
+ },
+ //获取父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchDailyTrading(this.req, this.params.radius, this.times.start, this.times.end)
+ },
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/usdtVolume/index.vue b/yq/src/views/usdtVolume/index.vue
new file mode 100644
index 0000000..5761039
--- /dev/null
+++ b/yq/src/views/usdtVolume/index.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/usdtbigtx/index.js b/yq/src/views/usdtbigtx/index.js
new file mode 100644
index 0000000..0deb448
--- /dev/null
+++ b/yq/src/views/usdtbigtx/index.js
@@ -0,0 +1,395 @@
+import * as echarts from "echarts";
+export default {
+ data() {
+ return {
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i <= params.length - 1; i++) {
+ // res += `${params[i].marker} ${params[i].value[1]} ${params[i].seriesName}`;
+ // }
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ type: "category",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ },
+ yAxis: [
+ {
+ name: this.$t(`home.figure`),
+ // name: "MVRV",
+ position: "left",
+ type: "value",
+ },
+ ],
+ dataZoom: [
+ {
+ type: "slider",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ series: [
+ {
+ type: "line",
+ name: "",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+
+ data: [],
+ },
+ ],
+ },
+ params: {
+ req: "",
+ radius: "eth",
+ },
+ paramsCount: {
+ req: "usdtbigtxcount",
+ radius: "eth",
+ },
+ searchParams: {
+ search: "",
+ start: "",
+ end: ""
+ },
+ times: {
+ start: "",
+ end: ""
+ },
+ tabelloading: false,
+ tableData: [],
+ usdtbigtxLoading: false,
+ dialog: false,
+ tabelUrl: "",
+ color: "",
+ introduce: "",
+ valueList: [
+ {
+ value: 500,
+ label: "amount > 500",
+ },
+ {
+ value: 1500,
+ label: "amount > 1500",
+ },
+ {
+ value: 5000,
+ label: "amount > 5000",
+ },
+ {
+ value: 10000,
+ label: "amount > 10000",
+ },
+ {
+ value: 15000,
+ label: "amount > 15000",
+ },
+ ],
+ state: "",
+ value: "",
+ tabelParams: {
+ req: "",
+ address: "",
+ txId: "",
+ type: "",
+ },
+ animate: false,
+ notice: "",
+ amountTxid: "",
+ amountTime: "",
+ dialogVisible: false,
+ dialogData: [],
+ dialogDate: "",
+ noticeList: [],
+ setInTimeout: null,
+ setInTime: null,
+ page:1,
+ limit:50,
+ currentPage4:1,
+ totalPage:0,
+ search:""
+
+ }
+ },
+ mounted() {
+ this.$addStorageEvent(1, "buttonShow", false)
+ let menuObj = localStorage.getItem("params");
+ this.params.req = JSON.parse(menuObj).componentReq;
+ this.introduce = JSON.parse(menuObj).introduce;
+ this.show = localStorage.getItem("currentTabComponent");
+ let obj = localStorage.getItem("src");
+ // this.color = JSON.parse(obj).color;
+ window.addEventListener("setItem", () => {
+ let menuObj = localStorage.getItem("params");
+ this.params.req = JSON.parse(menuObj).componentReq;
+ this.introduce = JSON.parse(menuObj).introduce;
+ let obj = localStorage.getItem("src");
+ // this.color = JSON.parse(obj).color;
+ });
+
+
+ this.fetchUsdtbigtxcount(this.paramsCount.req, this.paramsCount.radius)
+ this.fetchUsdtbigtx(this.params.req, this.params.radius,this.search,this.searchParams.start,this.searchParams.end,this.page,this.limit)
+ //通知栏滚动
+ if (this.setInTime || this.setInTimeout) {
+ clearInterval(this.setInTime);
+ clearTimeout(this.setInTimeout)
+ }
+ // this.setInTime = setInterval(this.showMarquee, 3000);
+ },
+
+ methods: {
+ initCharts() {
+ this.myChart = echarts.init(document.getElementById("usdtbigtx"));
+ // this.myChart.clear();
+ this.myChart.setOption(this.option);
+ // 当窗口或者大小发生改变时执行resize,重新绘制图表
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ //请求页面tabel数据
+ async fetchUsdtbigtx(req, radius, search, start, end,page,limit) {
+ this.usdtbigtxLoading = true
+ const { data } = await this.$API.getBigDeals2(req, radius, search,start, end,page,limit);
+ this.tableData = data.data.data
+ this.totalPage=data.data.totalPage
+ this.noticeList = [...data.data.data]
+ //通知栏滚动
+ if (this.setInTime || this.setInTimeout) {
+ clearInterval(this.setInTime);
+ clearTimeout(this.setInTimeout)
+ }
+
+ this.setInTime= setInterval(() => {
+ this.showMarquee(JSON.parse(JSON.stringify(this.tableData)))
+ }, 3000);
+ this.currentPage4 = page
+ this.usdtbigtxLoading = false
+ },
+ //请求折线图数据
+ async fetchUsdtbigtxcount(req, radius, start, end, type) {
+ // this.usdtbigtxLoading = true
+ const { data } = await this.$API.getBigDealsCount(
+ req,
+ radius,
+ start,
+ end,
+ type
+ );
+ this.dataCount = data.data
+ this.option.series[0].data.length = 0;
+ this.option.xAxis.data.length = 0;
+ this.dataCount.forEach(item => {
+ let time = item.dataTime.split("T")[0];
+ this.option.xAxis.data.push(time);
+ this.option.series[0].data.push(item.num);
+ })
+ this.option.series[0].name = req
+ // this.option.series[0].itemStyle.color = this.color;
+ // this.option.series[0].lineStyle.color = this.color;
+ this.initCharts();
+ // this.usdtbigtxLoading = false
+ },
+ //处理表格里的时间
+ formatTime(value) {
+ let newTime = value.split(".")[0].replace("T", " ");
+ return newTime;
+ },
+ //单独给点击单元格加class名字
+ cellClass({ row, column, rowIndex, columnIndex }) {
+ if (
+ column.label == "vout" ||
+ column.label == "txId" ||
+ column.label == "fromAddress" ||
+ column.label == "toAddress"
+ ) {
+ return "test";
+ }
+ },
+ //点击表格tabel 弹窗详情页
+ handleClick(row, column) {
+ this.tabelUrl = "";
+
+ this.dialogLoading = true;
+
+ if (column.label == "fromAddress") {
+ this.tabelParams.address = row.fromAddress;
+ this.tabelParams.type = "address";
+ } else if (column.label == "toAddress") {
+ this.tabelParams.address = row.toAddress;
+ this.tabelParams.type = "address";
+ } else if (column.label == "txId") {
+ this.tabelParams.txId = row.txId;
+ this.tabelParams.address = row.txId;
+ this.tabelParams.type = "tx";
+ } else if (column.label == "vout") {
+ this.tabelParams.address = row.vout;
+ this.tabelParams.type = "address";
+ }
+
+ this.tabelUrl = ` https://bitcoinexplorer.org/${this.tabelParams.type}/${this.tabelParams.address}`;
+ // this.dialogTableVisible=true
+ this.dialog = true;
+ this.dialogLoading = false;
+
+ // window.open(
+ // ` https://bitcoinexplorer.org/${this.tabelParams.type}/${this.tabelParams.address}`,
+ // "_top"
+ // );
+ // this.fetchTabel(this.tabelParams.req,this.params.radius,this.tabelParams.address,this.tabelParams.txId)
+ },
+ //关闭弹窗
+ handelClose() {
+ this.dialog = false;
+ },
+ //下拉框选择
+ handelChang(e) {
+ this.page = 1
+ // this.searchParams.search = e
+ this.search = e
+ this.fetchUsdtbigtx(this.params.req, this.params.radius,this.value,this.searchParams.start,this.searchParams.end,this.page,this.limit)
+
+ this.state = ""
+ },
+ handelSearch() {
+ //搜索框输入参数
+ this.page = 1
+ this.search = this.state
+ this.fetchUsdtbigtx(this.params.req, this.params.radius,this.state,this.searchParams.start,this.searchParams.end,this.page,this.limit)
+ // this.searchParams.search = this.state
+ // this.state = ""
+ this.value = ""
+ },
+ //获取父级时间
+ handelSonTime(start, end) {
+ this.page =1
+ this.searchParams.start = start;
+ this.searchParams.end = end;
+ this.fetchUsdtbigtx(this.params.req, this.params.radius,this.search,this.searchParams.start,this.searchParams.end,this.page,this.limit)
+ this.fetchUsdtbigtxcount(this.paramsCount.req, this.paramsCount.radius, this.searchParams.start, this.searchParams.end)
+
+ },
+ //点击滚动通知栏的查看详情
+ handelDetails() {
+ this.dialogVisible = true;
+
+ this.dialogData = this.noticeList.find((item) => {
+ return item.txId == this.amountTxid;
+ });
+ this.dialogDate = this.dialogData.date.split(".")[0].replace("T", " ");
+ },
+ // 通知栏滚动
+ showMarquee(data) {
+ this.animate = true;
+
+ // let rollingData = data
+ // setTimeout
+ // console.log(rollingData,633);
+ if (this.setInTimeout) {
+ clearTimeout(this.setInTimeout)
+ }
+ this.setInTimeout = setTimeout(() => {
+ this.amountTxid = this.noticeList[0].txId;
+ this.amountTime = this.noticeList[0].date
+ .split(".")[0]
+ .replace("T", " ");
+ this.notice = this.noticeList[0].amount.toFixed(3);
+ // this.currencyName = rollingData[0].abbr;
+ this.noticeList.push(this.noticeList[0]);
+ this.noticeList.shift();
+ this.animate = false;
+ // console.log(rollingData,56565);
+ }, 500);
+
+
+ },
+
+ //点击的改变页数
+ handleCurrentChange(value) {
+ this.page = value;
+ this.fetchUsdtbigtx(this.params.req, this.params.radius, this.search, this.searchParams.start, this.searchParams.end, this.page, this.limit)
+
+
+ },
+ //改变每页条数
+ handleSizeChange(val) {
+ this.page = 1;
+ this.limit = val;
+ this.fetchUsdtbigtx(this.params.req, this.params.radius, this.search, this.searchParams.start, this.searchParams.end, this.page, this.limit)
+
+
+ },
+
+ },
+
+ beforeDestroy() {
+ clearInterval(this.setInTime);
+ clearTimeout(this.setInTimeout)
+ console.log("组件离开");
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/yq/src/views/usdtbigtx/index.vue b/yq/src/views/usdtbigtx/index.vue
new file mode 100644
index 0000000..5d26812
--- /dev/null
+++ b/yq/src/views/usdtbigtx/index.vue
@@ -0,0 +1,392 @@
+
+
+
+
+
+
+
+
+
+ {{$t(`home.tradingVolume`)}}:{{ notice || 0 }}
+ {{$t(`home.tradingHours`)}}:{{amountTime || 0 }}
+ {{$t(`home.checkDetails`)}}
+
+
+
+
+
+
+
+
+ {{$t(`home.date`)}}: {{ dialogDate }}
+
+
+ {{$t(`home.number`)}}: {{ dialogData.amount }}
+
+
+ {{$t(`home.address`)}}:
+ {{
+ (dialogData.vout = dialogData.vout ? dialogData.vout : $t(`home.no`))
+ }}
+
+
+ {{$t(`home.toAddress`)}}:
+ {{
+ (dialogData.fromAddress = dialogData.fromAddress
+ ? dialogData.fromAddress
+ : $t(`home.no`))
+ }}
+
+
+ {{$t(`home.height`)}}: {{ dialogData.height }}
+
+
+ {{$t(`home.outAddress`)}}:
+ {{
+ (dialogData.toAddress = dialogData.toAddress
+ ? dialogData.toAddress
+ : $t(`home.no`))
+ }}
+
+
+ {{$t(`home.transaction`)}}: {{ dialogData.txId }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
search results
+
+
+
+ {{$t(`home.table`)}}
+
+
+
+
+
+ {{ formatTime(scope.row.date) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{$t(`home.shutDown`)}} X
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/utxos/index.js b/yq/src/views/utxos/index.js
new file mode 100644
index 0000000..b706a14
--- /dev/null
+++ b/yq/src/views/utxos/index.js
@@ -0,0 +1,1709 @@
+import * as echarts from "echarts";
+import { handelLineType,dataLength, chartsWidth,emptyData, handelSwitchs, handelZoom, fetchBtcPrice, fetchEthPrice, handelWatermark, handelSmaData, getDateArray, handelUsdt } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ //柱状图配置
+ columnar: {
+ title: {
+ text: "",
+ left: "center",
+ textStyle: {
+ fontSize: 15,
+ fontWeight: "normal"
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ axisPointer: {
+ type: "cross",
+ crossStyle: {
+ color: "#999",
+ },
+ },
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i <= params.length - 1; i++) {
+ // res += `${params[i].marker} ${params[i].value[1]} ${params[i].seriesName}`;
+ // }
+ // return "111";
+ // },
+ },
+ toolbox: {
+ // feature: {
+ // dataView: { show: true, readOnly: false },
+ // magicType: { show: true, type: ["line", "bar"] },
+ // restore: { show: true },
+ // saveAsImage: { show: true },
+ // },
+ },
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ xAxis: [
+ {
+ type: "category",
+ data: [
+ "balance0",
+ "balance001",
+ "balance01",
+ "balance1",
+ "balance10",
+ "balance100",
+ "balance1000",
+ "balance10000",
+ ],
+ // axisPointer: {
+ // type: "shadow",
+ // },
+ },
+ ],
+ yAxis: [
+ {
+ type: "value",
+ // name: "Precipitation",
+ // min: 0,
+ // max: 250,
+ // interval: 50,
+ axisLabel: {
+ formatter: function (value) {
+
+ let label = value / 1000000
+ return `${label}M`
+ },
+ },
+ },
+ // {
+ // type: "value",
+ // // name: "Temperature",
+ // // min: 0,
+ // // max: 25,
+ // // interval: 5,
+ // // axisLabel: {
+ // // formatter: "{value} °C",
+ // // },
+ // },
+ ],
+ series: [
+ {
+ // name: "Futures Volume (Latest 24h) [USD]",
+ type: "bar",
+ colorBy: "data",
+ // tooltip: {
+ // valueFormatter: function (value) {
+ // return value + " ml";
+ // },
+ // },
+ data: [],
+ itemStyle: {
+ color: "#fdaa56",
+ },
+ },
+ {
+ name: "Change 24h",
+ type: "bar",
+ itemStyle: {
+ color: "#607d8b",
+ },
+ // tooltip: {
+ // valueFormatter: function (value) {
+ // return value + " ml";
+ // },
+ // },
+ data: [],
+ },
+ ],
+ },
+ params: {
+ req: "utxos",
+ radius: "btc"
+ },
+ utxosLoading: false,
+ //饼图配置
+ pieChart: {
+ legend: {
+ top: 'top'
+ },
+ toolbox: {
+ show: true,
+ feature: {
+ mark: { show: true },
+ dataView: { show: true, readOnly: false },
+ restore: { show: true },
+ saveAsImage: { show: true }
+ }
+ },
+ tooltip: {
+ trigger: 'item'
+ },
+ series: [
+ {
+ name: 'utxos',
+ type: 'pie',
+ radius: [50, 250],
+ center: ['50%', '50%'],
+ roseType: 'area',
+ itemStyle: {
+ borderRadius: 8
+ },
+ data: [
+ // { value: 40, name: 'rose 1' },
+ // { value: 38, name: 'rose 2' },
+ // { value: 32, name: 'rose 3' },
+ // { value: 30, name: 'rose 4' },
+ // { value: 28, name: 'rose 5' },
+ // { value: 26, name: 'rose 6' },
+ // { value: 22, name: 'rose 7' },
+ // { value: 18, name: 'rose 8' }
+ ]
+ }
+ ]
+ },
+ //折线图配置
+ option: {
+
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+
+ animation: false,
+ // formatter: function (params) {
+ // var res
+ // res = params[0].axisValueLabel;
+ // res += `${params[0].marker} ${params[0].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[0].value}%
+ // ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ // ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}`;
+
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value / 10000).toFixed(2)} W`
+ }
+ }
+ },
+ {
+
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "balance <= 0.01",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "balance >=0.01 and Balance <0.1",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#6580a9",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#6580a9",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+ {
+ name: "balance >=0.1 and Balance <1",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#b6b7e9",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#b6b7e9",
+ width: "1",
+ },
+ yAxisIndex: 2,
+ data: [],
+ },
+ {
+ name: "balance >=1 and Balance <10",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#ff8e9c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#ff8e9c",
+ width: "1",
+ },
+ yAxisIndex: 3,
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 4,
+ data: [],
+ //绘制右侧Y轴
+ // markLine: {
+ // symbol: ["none", "none"], //去掉箭头
+ // itemStyle: {
+ // normal: {
+ // lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ // },
+ // },
+ // // lineStyle:{
+ // // color:"red"
+ // // },
+
+ // label: {
+ // formatter: "{b}",
+ // fontSize: 10,
+ // color: "rgba(0,0,0,0.8)",
+ // align: "left",
+ // },
+ // data: [
+ // {
+ // name: "$0.02",
+ // yAxis: 0.02,
+ // },
+ // {
+ // name: "$0.06",
+ // yAxis: 0.06,
+ // },
+ // {
+ // name: "$0.1",
+ // yAxis: 0.1,
+ // },
+ // {
+ // name: "$0.4",
+ // yAxis: 0.4,
+ // },
+ // {
+ // name: "$0.8",
+ // yAxis: 0.8,
+ // },
+ // {
+ // name: "$2",
+ // yAxis: 2,
+ // },
+ // {
+ // name: "$6",
+ // yAxis: 6,
+ // },
+ // {
+ // name: "$10",
+ // yAxis: 10,
+ // },
+ // {
+ // name: "$40",
+ // yAxis: 40,
+ // },
+ // {
+ // name: "$80",
+ // yAxis: 80,
+ // },
+ // // {
+ // // name: "$120",
+ // // yAxis: 120,
+ // // },
+ // {
+ // name: "$160",
+ // yAxis: 160,
+ // },
+ // // {
+ // // name: "$200",
+ // // yAxis: 200,
+ // // },
+ // {
+ // name: "$240",
+ // yAxis: 240,
+ // },
+ // {
+ // name: "$300",
+ // yAxis: 300,
+ // },
+ // {
+ // name: "$500",
+ // yAxis: 500,
+ // },
+ // {
+ // name: "$700",
+ // yAxis: 700,
+ // },
+ // {
+ // name: "$900",
+ // yAxis: 900,
+ // },
+ // {
+ // name: "$1100",
+ // yAxis: 1100,
+ // },
+ // // {
+ // // name: "$1200",
+ // // yAxis: 1200,
+ // // },
+ // {
+ // name: "$1800",
+ // yAxis: 1800,
+ // },
+ // {
+ // name: "$3000",
+ // yAxis: 3000,
+ // },
+ // // {
+ // // name: "$40W",
+ // // yAxis: 400000,
+ // // },
+ // {
+ // name: "$70W",
+ // yAxis: 700000,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+
+ // {
+ // name: "$10W",
+ // yAxis: 100000,
+ // },
+ // {
+ // name: "$100W",
+ // yAxis: 1000000,
+ // // position: ['100%', '50'],
+ // },
+ // {
+ // name: "$120W",
+ // yAxis: 1200000,
+ // },
+
+ // {
+ // name: "$140W",
+ // yAxis: 1400000,
+ // },
+ // ],
+ // },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 5,
+ // data: [],
+ // },
+
+
+
+ ],
+ },
+ option2: {
+
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ // formatter: function (params) {
+ // var res
+ // res = params[0].axisValueLabel;
+ // res += `${params[0].marker} ${params[0].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[0].value}%
+ // ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ // ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}`;
+
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure2`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value / 10000).toFixed(2)} W`
+ }
+ }
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "balance >=10 and Balance <100",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#9a60b4",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#9a60b4",
+ width: "1",
+ },
+
+ data: [],
+ },
+ {
+ name: "balance >=100 and Balance <1000",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#3ba272",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#3ba272",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+ {
+ name: "balance >=1000 and Balance <10000",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#ea7ccc",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#ea7ccc",
+ width: "1",
+ },
+ yAxisIndex: 2,
+ data: [],
+ },
+ {
+ name: "balance >=10000",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#73c0de",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#73c0de",
+ width: "1",
+ },
+ yAxisIndex: 3,
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 4,
+ data: [],
+ //绘制右侧Y轴
+ markLine: {
+ symbol: ["none", "none"], //去掉箭头
+ itemStyle: {
+ normal: {
+ lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ },
+ },
+ // lineStyle:{
+ // color:"red"
+ // },
+
+ label: {
+ formatter: "{b}",
+ fontSize: 10,
+ color: "rgba(0,0,0,0.8)",
+ align: "left",
+ },
+ data: [
+ {
+ name: "$0.02",
+ yAxis: 0.02,
+ },
+ {
+ name: "$0.06",
+ yAxis: 0.06,
+ },
+ {
+ name: "$0.1",
+ yAxis: 0.1,
+ },
+ {
+ name: "$0.4",
+ yAxis: 0.4,
+ },
+ {
+ name: "$0.8",
+ yAxis: 0.8,
+ },
+ {
+ name: "$2",
+ yAxis: 2,
+ },
+ {
+ name: "$6",
+ yAxis: 6,
+ },
+ {
+ name: "$10",
+ yAxis: 10,
+ },
+ {
+ name: "$40",
+ yAxis: 40,
+ },
+ {
+ name: "$80",
+ yAxis: 80,
+ },
+ // {
+ // name: "$120",
+ // yAxis: 120,
+ // },
+ {
+ name: "$160",
+ yAxis: 160,
+ },
+ // {
+ // name: "$200",
+ // yAxis: 200,
+ // },
+ {
+ name: "$240",
+ yAxis: 240,
+ },
+ {
+ name: "$300",
+ yAxis: 300,
+ },
+ {
+ name: "$500",
+ yAxis: 500,
+ },
+ {
+ name: "$700",
+ yAxis: 700,
+ },
+ {
+ name: "$900",
+ yAxis: 900,
+ },
+ {
+ name: "$1100",
+ yAxis: 1100,
+ },
+ // {
+ // name: "$1200",
+ // yAxis: 1200,
+ // },
+ {
+ name: "$1800",
+ yAxis: 1800,
+ },
+ {
+ name: "$3000",
+ yAxis: 3000,
+ },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+ {
+ name: "$70W",
+ yAxis: 700000,
+ },
+ {
+ name: "$40W",
+ yAxis: 400000,
+ },
+
+ {
+ name: "$10W",
+ yAxis: 100000,
+ },
+ {
+ name: "$100W",
+ yAxis: 1000000,
+ // position: ['100%', '50'],
+ },
+ {
+ name: "$120W",
+ yAxis: 1200000,
+ },
+
+ {
+ name: "$140W",
+ yAxis: 1400000,
+ },
+ ],
+ },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 5,
+ // data: [],
+ // },
+
+
+
+
+ ],
+ },
+ //折线图配置比率图
+ ratio: {
+
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ var res
+
+ res = params[0].axisValueLabel;
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName} \u00A0\u00A0\u00A0\u00A0 ${Number(parseInt(params[i].value[1] * 1000000) / 1000000)}% `;
+
+ }
+
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 180, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure3`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value).toFixed(3)} %`
+ }
+ }
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "balance <= 0.01",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "balance >=0.01 and Balance <0.1",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+ {
+ name: "balance >=0.1 and Balance <1",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#4fd77f",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#4fd77f",
+ width: "1",
+ },
+ yAxisIndex: 2,
+ data: [],
+ },
+ {
+ name: "balance >=1 and Balance <10",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#ff8e9c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#ff8e9c",
+ width: "1",
+ },
+ yAxisIndex: 3,
+ data: [],
+ },
+
+
+
+
+ ],
+ },
+ ratio2: {
+
+ tooltip: {
+ //解决tooltip显示不全问题1
+ confine: true,
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ var res
+
+ res = params[0].axisValueLabel;
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName} \u00A0\u00A0\u00A0\u00A0 ${Number(params[i].value[1])}% `;
+
+ }
+
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 180, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name: this.$t(`home.figure4`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value).toFixed(2)} %`
+ }
+ }
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "balance >=10 and Balance <100",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#9a60b4",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#9a60b4",
+ width: "1",
+ },
+
+ data: [],
+ },
+ {
+ name: "balance >=100 and Balance <1000",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#3ba272",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#3ba272",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+ {
+ name: "balance >=1000 and Balance <10000",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#ea7ccc",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#ea7ccc",
+ width: "1",
+ },
+ yAxisIndex: 2,
+ data: [],
+ },
+ {
+ name: "balance >=10000",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#73c0de",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#73c0de",
+ width: "1",
+ },
+ yAxisIndex: 3,
+ data: [],
+ },
+
+
+
+ ],
+ },
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ sma: "",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+ }
+ },
+ mounted() {
+
+ this.fetchUtxos(this.params.req, this.params.radius)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+
+ })
+
+
+
+ },
+ methods: {
+ //初始化折线图图表
+ inChartsLine() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("utxosLine"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("utxosLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart) this.myChart.resize();
+ // });
+ },
+ inChartsLine2() {
+ if (this.myChart2 == null) {
+ this.myChart2 = echarts.init(document.getElementById("utxosLine2"));
+ }
+ this.option2 = handelZoom(this.myChart2, this.option2, this, this.zoomStart, this.zoomEnd)
+ chartsWidth("utxosLine2", this);
+ this.myChart2.setOption(this.option2);
+
+ // window.addEventListener("resize", () => {
+ // if (this.myChart2) this.myChart2.resize();
+ // });
+ },
+ //初始化比率折线图图表
+ inChartSratioLine() {
+ if (this.myChart3 == null) {
+ this.myChart3 = echarts.init(document.getElementById("ratioLine"));
+ }
+ this.ratio = handelZoom(this.myChart3, this.ratio, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart3.setOption(this.ratio);
+ chartsWidth("ratioLine", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart3) this.myChart3.resize();;
+ // });
+ },
+ inChartSratioLine2() {
+ if (this.myChart4 == null) {
+ this.myChart4 = echarts.init(document.getElementById("ratioLine2"));
+ }
+ this.ratio2 = handelZoom(this.myChart4, this.ratio2, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart4.setOption(this.ratio2);
+ chartsWidth("ratioLine2", this);
+ // window.addEventListener("resize", () => {
+ // if (this.myChart4) this.myChart4.resize();;
+ // });
+ },
+
+ //请求数据
+ async fetchUtxos(req, radius, start, end, sma) {
+ this.utxosLoading = true
+ let { data } = await this.$API.getNewAddress(req, radius, start, end, sma)
+
+ this.UtxosData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChartsLine, this)
+ if (noData) {
+ emptyData(data.data, this.option2.series, this.inChartsLine2, this)
+ emptyData(data.data, this.ratio.series, this.inChartSratioLine, this)
+ emptyData(data.data, this.ratio2.series, this.inChartSratioLine2, this)
+ this.utxosLoading = false
+ return
+ }
+
+ this.start = this.UtxosData[0].dateTime.split("T")[0]
+ this.end = this.UtxosData[this.UtxosData.length - 1].dateTime.split("T")[0]
+ //添加水印
+ this.option = handelWatermark(this.option)
+ this.option2 = handelWatermark(this.option2)
+ this.ratio = handelWatermark(this.ratio)
+ this.ratio2 = handelWatermark(this.ratio2)
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ //渲染ETH
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+ let balance0List = []
+ let balance001List = []
+ let balance01List = []
+ let balance1List = []
+ let balance10List = []
+ let balance100List = []
+ let balance1000List = []
+ let balance10000List = []
+ let rate0List = []
+ let rate001List = []
+ let rate01List = []
+ let rate1List = []
+ let rate10List = []
+ let rate1001List = []
+ let rate1000List = []
+ let rate10000List = []
+
+ this.UtxosData.forEach(item => {
+ balance0List.push(item.balance0)
+ balance001List.push(item.balance001)
+ balance01List.push(item.balance01)
+ balance1List.push(item.balance1)
+ balance10List.push(item.balance10)
+ balance100List.push(item.balance100)
+ balance1000List.push(item.balance1000)
+ balance10000List.push(item.balance10000)
+ rate0List.push((item.rate0 * 100).toFixed(2))
+ rate001List.push((item.rate001 * 100).toFixed(2))
+ rate01List.push((item.rate01 * 100).toFixed(2))
+ rate1List.push((item.rate1 * 100).toFixed(2))
+ rate10List.push((item.rate10 * 100).toFixed(4))
+ rate1001List.push((item.rate100 * 100).toFixed(4))
+ rate1000List.push((item.rate1000 * 100).toFixed(4))
+ rate10000List.push((item.rate10000 * 100).toFixed(4))
+ })
+ this.option.series[0].data = handelUsdt(this.UtxosData, balance0List)
+ this.option.series[1].data = handelUsdt(this.UtxosData, balance001List)
+ this.option.series[2].data = handelUsdt(this.UtxosData, balance01List)
+ this.option.series[3].data = handelUsdt(this.UtxosData, balance1List)
+ this.option2.series[0].data = handelUsdt(this.UtxosData, balance10List)
+ this.option2.series[1].data = handelUsdt(this.UtxosData, balance100List)
+ this.option2.series[2].data = handelUsdt(this.UtxosData, balance1000List)
+ this.option2.series[3].data = handelUsdt(this.UtxosData, balance10000List)
+ this.ratio.series[0].data = handelUsdt(this.UtxosData, rate0List)
+ this.ratio.series[1].data = handelUsdt(this.UtxosData, rate001List)
+ this.ratio.series[2].data = handelUsdt(this.UtxosData, rate01List)
+ this.ratio.series[3].data = handelUsdt(this.UtxosData, rate1List)
+ this.ratio2.series[0].data = handelUsdt(this.UtxosData, rate10List)
+ this.ratio2.series[1].data = handelUsdt(this.UtxosData, rate1001List)
+ this.ratio2.series[2].data = handelUsdt(this.UtxosData, rate1000List)
+ this.ratio2.series[3].data = handelUsdt(this.UtxosData, rate10000List)
+
+ this.inChartsLine()
+ this.inChartsLine2()
+ this.inChartSratioLine()
+ this.inChartSratioLine2()
+
+ // this.inChartsPieChart()
+ console.log(this.option,5656,this.option.series[0].data.length);
+
+ this.utxosLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option2, this.option2.series[0].data.length), );
+
+
+ }, 10000)
+
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ // if (this.btcFlag && !this.fatherSmaData[0]) {
+ // fetchBtcPrice("BTC", this.option.series[1], start, end, this.inCharts, this, this.btcFlag)
+ // }
+ // if (this.ethFlag) {
+ // fetchEthPrice("ETH", this.option.series[2], start, end, this.inCharts, this, this.ethFlag)
+ // }
+
+
+ },
+
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.option2 = handelLineType(this.option2)
+ this.ratio = handelLineType(this.ratio)
+ this.ratio2 = handelLineType(this.ratio2)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+ this.myChart2.setOption(this.option2);
+ this.myChart3.setOption(this.ratio);
+ this.myChart4.setOption(this.ratio2);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[4], this.start, this.end, this.inChartsLine, this, this.btcFlag)
+ fetchBtcPrice("BTC", this.option2.series[4], this.start, this.end, this.inChartsLine2, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[5], this.start, this.end, this.inChartsLine, this, this.ethFlag)
+ fetchEthPrice("ETH", this.option2.series[5], this.start, this.end, this.inChartsLine2, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList, start, end) {
+
+ this.sma = smaDataList
+ this.fetchUtxos(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[4], this.inChartsLine, this.start, this.end)
+ // handelSmaData(smaDataList, this.option2.series[4], this.inChartsLine2, this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/utxos/index.vue b/yq/src/views/utxos/index.vue
new file mode 100644
index 0000000..ffd2782
--- /dev/null
+++ b/yq/src/views/utxos/index.vue
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
{{$t(`menu.onchain5`)}}
+
{{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
+
{{ $t(`home.figure2`) }}
+
+
+
+
+
+
{{ $t(`home.figure3`) }}
+
+
{{$t(`arh.ratio`)}}
+
+
+
+
+
+
+
+
{{ $t(`home.figure4`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/utxos2nd/index.js b/yq/src/views/utxos2nd/index.js
new file mode 100644
index 0000000..bada72c
--- /dev/null
+++ b/yq/src/views/utxos2nd/index.js
@@ -0,0 +1,1567 @@
+import * as echarts from "echarts";
+import { handelLineType,chartsWidth,dataLength,emptyData, handelSwitchs,fetchBtcPrice,handelZoom, handelWatermark,fetchEthPrice, handelSmaData, getDateArray, handelUsdt } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ params: {
+ req: "utxos2nd",
+ radius: "btc"
+ },
+ ut2dLoading: false,
+
+ Utxos2ndData: [],
+ //折线图配置
+ option: {
+
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ // formatter: function (params) {
+ // var res
+ // res = params[0].axisValueLabel;
+ // res += `${params[0].marker} ${params[0].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[0].value}%
+ // ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ // ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}`;
+
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name:this.$t(`home.figure`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value / 10000).toFixed(2)} W`
+ }
+ }
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "balance <= 0.01",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "balance >=0.01 and Balance <0.1",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#b6b7e9",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#b6b7e9",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+ {
+ name: "balance >=0.1 and Balance <1",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#4fd77f",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#4fd77f",
+ width: "1",
+ },
+ yAxisIndex: 2,
+ data: [],
+ },
+ {
+ name: "balance >=1 and Balance <10",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#ff8e9c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#ff8e9c",
+ width: "1",
+ },
+ yAxisIndex: 3,
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 4,
+ data: [],
+ //绘制右侧Y轴
+ markLine: {
+ symbol: ["none", "none"], //去掉箭头
+ itemStyle: {
+ normal: {
+ lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ },
+ },
+ // lineStyle:{
+ // color:"red"
+ // },
+
+ label: {
+ formatter: "{b}",
+ fontSize: 10,
+ color: "rgba(0,0,0,0.8)",
+ align: "left",
+ },
+ data: [
+ {
+ name: "$0.02",
+ yAxis: 0.02,
+ },
+ {
+ name: "$0.06",
+ yAxis: 0.06,
+ },
+ {
+ name: "$0.1",
+ yAxis: 0.1,
+ },
+ {
+ name: "$0.4",
+ yAxis: 0.4,
+ },
+ {
+ name: "$0.8",
+ yAxis: 0.8,
+ },
+ {
+ name: "$2",
+ yAxis: 2,
+ },
+ {
+ name: "$6",
+ yAxis: 6,
+ },
+ {
+ name: "$10",
+ yAxis: 10,
+ },
+ {
+ name: "$40",
+ yAxis: 40,
+ },
+ {
+ name: "$80",
+ yAxis: 80,
+ },
+ // {
+ // name: "$120",
+ // yAxis: 120,
+ // },
+ {
+ name: "$160",
+ yAxis: 160,
+ },
+ // {
+ // name: "$200",
+ // yAxis: 200,
+ // },
+ {
+ name: "$240",
+ yAxis: 240,
+ },
+ {
+ name: "$300",
+ yAxis: 300,
+ },
+ {
+ name: "$500",
+ yAxis: 500,
+ },
+ {
+ name: "$700",
+ yAxis: 700,
+ },
+ {
+ name: "$900",
+ yAxis: 900,
+ },
+ {
+ name: "$1100",
+ yAxis: 1100,
+ },
+ // {
+ // name: "$1200",
+ // yAxis: 1200,
+ // },
+ {
+ name: "$1800",
+ yAxis: 1800,
+ },
+ {
+ name: "$3000",
+ yAxis: 3000,
+ },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+ {
+ name: "$70W",
+ yAxis: 700000,
+ },
+ {
+ name: "$40W",
+ yAxis: 400000,
+ },
+
+ {
+ name: "$10W",
+ yAxis: 100000,
+ },
+ {
+ name: "$100W",
+ yAxis: 1000000,
+ // position: ['100%', '50'],
+ },
+ {
+ name: "$120W",
+ yAxis: 1200000,
+ },
+
+ {
+ name: "$140W",
+ yAxis: 1400000,
+ },
+ ],
+ },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 5,
+ // data: [],
+ // },
+
+
+
+ ],
+ },
+ option2: {
+
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ // formatter: function (params) {
+ // var res
+ // res = params[0].axisValueLabel;
+ // res += `${params[0].marker} ${params[0].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[0].value}%
+ // ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ // ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}`;
+
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name:this.$t(`home.figure2`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value / 10000).toFixed(2)} W`
+ }
+ }
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "balance >=10 and Balance <100",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#9a60b4",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#9a60b4",
+ width: "1",
+ },
+
+ data: [],
+ },
+ {
+ name: "balance >=100 and Balance <1000",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#3ba272",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#3ba272",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+ {
+ name: "balance >=1000 and Balance <10000",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#ea7ccc",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#ea7ccc",
+ width: "1",
+ },
+ yAxisIndex: 2,
+ data: [],
+ },
+ {
+ name: "balance >=10000",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#73c0de",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#73c0de",
+ width: "1",
+ },
+ yAxisIndex: 3,
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 4,
+ data: [],
+ //绘制右侧Y轴
+ markLine: {
+ symbol: ["none", "none"], //去掉箭头
+ itemStyle: {
+ normal: {
+ lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ },
+ },
+ // lineStyle:{
+ // color:"red"
+ // },
+
+ label: {
+ formatter: "{b}",
+ fontSize: 10,
+ color: "rgba(0,0,0,0.8)",
+ align: "left",
+ },
+ data: [
+ {
+ name: "$0.02",
+ yAxis: 0.02,
+ },
+ {
+ name: "$0.06",
+ yAxis: 0.06,
+ },
+ {
+ name: "$0.1",
+ yAxis: 0.1,
+ },
+ {
+ name: "$0.4",
+ yAxis: 0.4,
+ },
+ {
+ name: "$0.8",
+ yAxis: 0.8,
+ },
+ {
+ name: "$2",
+ yAxis: 2,
+ },
+ {
+ name: "$6",
+ yAxis: 6,
+ },
+ {
+ name: "$10",
+ yAxis: 10,
+ },
+ {
+ name: "$40",
+ yAxis: 40,
+ },
+ {
+ name: "$80",
+ yAxis: 80,
+ },
+ // {
+ // name: "$120",
+ // yAxis: 120,
+ // },
+ {
+ name: "$160",
+ yAxis: 160,
+ },
+ // {
+ // name: "$200",
+ // yAxis: 200,
+ // },
+ {
+ name: "$240",
+ yAxis: 240,
+ },
+ {
+ name: "$300",
+ yAxis: 300,
+ },
+ {
+ name: "$500",
+ yAxis: 500,
+ },
+ {
+ name: "$700",
+ yAxis: 700,
+ },
+ {
+ name: "$900",
+ yAxis: 900,
+ },
+ {
+ name: "$1100",
+ yAxis: 1100,
+ },
+ // {
+ // name: "$1200",
+ // yAxis: 1200,
+ // },
+ {
+ name: "$1800",
+ yAxis: 1800,
+ },
+ {
+ name: "$3000",
+ yAxis: 3000,
+ },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+ {
+ name: "$70W",
+ yAxis: 700000,
+ },
+ {
+ name: "$40W",
+ yAxis: 400000,
+ },
+
+ {
+ name: "$10W",
+ yAxis: 100000,
+ },
+ {
+ name: "$100W",
+ yAxis: 1000000,
+ // position: ['100%', '50'],
+ },
+ {
+ name: "$120W",
+ yAxis: 1200000,
+ },
+
+ {
+ name: "$140W",
+ yAxis: 1400000,
+ },
+ ],
+ },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 5,
+ // data: [],
+ // },
+
+
+
+ ],
+ },
+ //折线图配置比率图
+ ratio: {
+
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ var res
+
+ res = params[0].axisValueLabel;
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName} \u00A0\u00A0\u00A0\u00A0 ${Number(params[i].value[1].toFixed(2))}% `;
+
+ }
+
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name:this.$t(`home.figure3`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value).toFixed(3)} %`
+ }
+ }
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "balance <= 0.01",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "balance >=0.01 and Balance <0.1",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+ {
+ name: "balance >=0.1 and Balance <1",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#4fd77f",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#4fd77f",
+ width: "1",
+ },
+ yAxisIndex: 2,
+ data: [],
+ },
+ {
+ name: "balance >=1 and Balance <10",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#ff8e9c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#ff8e9c",
+ width: "1",
+ },
+ yAxisIndex: 3,
+ data: [],
+ },
+
+
+
+
+ ],
+ },
+ ratio2: {
+
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ formatter: function (params) {
+ var res
+
+ res = params[0].axisValueLabel;
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName} \u00A0\u00A0\u00A0\u00A0 ${Number(params[i].value[1].toFixed(2))}% `;
+
+ }
+
+
+ return res;
+ },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ // axisLabel: {
+ // formatter: (params) => {
+ // let time = params.split(" ")[1]
+ // return time
+ // }
+ // }
+ },
+ yAxis: [
+ {
+ // name:this.$t(`home.figure4`),
+ position: "left",
+ type: "value",
+ min: "dataMin",
+ max: "dataMax",
+ axisLabel: {
+ formatter: function (value) {
+
+ return `${(value).toFixed(3)} %`
+ }
+ }
+ },
+ {
+ position: "right",
+ type: "log",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ position: "right",
+ type: "value",
+ // splitNumber: "5",
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+
+
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ // type: "inside",
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "balance >=10 and Balance <100",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#9a60b4",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#9a60b4",
+ width: "1",
+ },
+
+ data: [],
+ },
+ {
+ name: "balance >=100 and Balance <1000",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#3ba272",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#3ba272",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+ {
+ name: "balance >=1000 and Balance <10000",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#ea7ccc",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#ea7ccc",
+ width: "1",
+ },
+ yAxisIndex: 2,
+ data: [],
+ },
+ {
+ name: "balance >=10000",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#73c0de",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#73c0de",
+ width: "1",
+ },
+ yAxisIndex: 3,
+ data: [],
+ },
+
+
+
+ ],
+ },
+ switch3: "",
+ btcFlag: null,
+ ethFlag: null,
+ start:"",
+ end:"",
+ fatherSmaData: [],
+ sma:"",
+ times: {
+ start: "",
+ end: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+
+ this.fetchData(this.params.req, this.params.radius)
+
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart= localStorage.getItem("zoomStart")
+ this.zoomEnd= localStorage.getItem("zoomEnd")
+
+
+ })
+ },
+ methods: {
+ //初始化折线图图表
+ inChartsLine() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("ut2dLine"));
+ }
+ this.option= handelZoom(this.myChart,this.option,this,this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("ut2dLine", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();;
+ });
+
+ },
+ inChartsLine2() {
+ if (this.myChart2 == null) {
+ this.myChart2 = echarts.init(document.getElementById("ut2dLine2"));
+ }
+ this.option2= handelZoom(this.myChart2,this.option2,this,this.zoomStart, this.zoomEnd)
+
+ this.myChart2.setOption(this.option2);
+ chartsWidth("ut2dLine2", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart2) this.myChart2.resize();;
+ });
+ },
+ //初始化比率折线图图表
+ inChartSratioLine() {
+ if (this.myChart3 == null) {
+ this.myChart3 = echarts.init(document.getElementById("ratioLine"));
+ }
+ this.ratio= handelZoom(this.myChart3,this.ratio,this,this.zoomStart, this.zoomEnd)
+
+ this.myChart3.setOption(this.ratio);
+ chartsWidth("ratioLine", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart3) this.myChart3.resize();;
+ });
+ },
+ inChartSratioLine2() {
+ if (this.myChart4 == null) {
+ this.myChart4 = echarts.init(document.getElementById("ratioLine2"));
+ }
+ this.ratio2= handelZoom(this.myChart4,this.ratio2,this,this.zoomStart, this.zoomEnd)
+
+ this.myChart4.setOption(this.ratio2);
+ chartsWidth("ratioLine2", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart4) this.myChart4.resize();;
+ });
+ },
+ //初始化饼图
+ inChartsPieChart() {
+ this.myChart = echarts.init(document.getElementById("ut2dPieChart"));
+ chartsWidth("ut2dPieChart", this);
+ this.myChart.setOption(this.pieChart);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();;
+ });
+ },
+ //请求数据
+ async fetchData(req, radius, start, end,sma) {
+ this.ut2dLoading = true
+ const { data } = await this.$API.getNewAddress(req, radius, start, end,sma)
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChartsLine, this)
+ if (noData) {
+ emptyData(data.data, this.option2.series, this.inChartsLine2, this)
+ emptyData(data.data, this.ratio.series, this.inChartSratioLine, this)
+ emptyData(data.data, this.ratio2.series, this.inChartSratioLine2, this)
+ this.ut2dLoading = false
+ return
+ }
+ this.Utxos2ndData = data.data
+ this.start = this.Utxos2ndData[0].dateTime.split("T")[0]
+ this.end = this.Utxos2ndData[this.Utxos2ndData.length-1].dateTime.split("T")[0]
+ //添加水印
+ this.option= handelWatermark(this.option)
+ this.option2= handelWatermark(this.option2)
+ this.ratio= handelWatermark(this.ratio)
+ this.ratio2= handelWatermark(this.ratio2)
+
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ //渲染ETH
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH",this.ethFlag)
+ }
+ })
+
+
+
+
+ let balanceAmount0List = []
+ let balanceAmount001List = []
+ let balanceAmount01List = []
+ let balanceAmount1List = []
+ let balanceAmount10List = []
+ let balanceAmount100List = []
+ let balanceAmount1000List = []
+ let balanceAmount10000List = []
+ let rateAmount0List = []
+ let rateAmount001List = []
+ let rateAmount01List = []
+ let rateAmount1List = []
+ let rateAmount10List = []
+ let rateAmount1001List = []
+ let rateAmount1000List = []
+ let rateAmount10000List = []
+
+
+ this.Utxos2ndData.forEach(item => {
+ balanceAmount0List.push(item.balanceAmount0)
+ balanceAmount001List.push(item.balanceAmount001)
+ balanceAmount01List.push(item.balanceAmount01)
+ balanceAmount1List.push(item.balanceAmount1)
+ balanceAmount10List.push(item.balanceAmount10)
+ balanceAmount100List.push(item.balanceAmount100)
+ balanceAmount1000List.push(item.balanceAmount1000)
+ balanceAmount10000List.push(item.balanceAmount10000)
+ rateAmount0List.push(Number((item.rateAmount0 * 100).toFixed(2)))
+ rateAmount001List.push(Number((item.rateAmount001 * 100).toFixed(2)))
+ rateAmount01List.push(Number((item.rateAmount01 * 100).toFixed(2)))
+ rateAmount1List.push(Number((item.rateAmount1 * 100).toFixed(2)))
+ rateAmount10List.push(Number((item.rateAmount10 * 100).toFixed(2)))
+ rateAmount1001List.push(Number((item.rateAmount100 * 100).toFixed(2)))
+ rateAmount1000List.push(Number((item.rateAmount1000 * 100).toFixed(2)))
+ rateAmount10000List.push(Number((item.rateAmount10000 * 100).toFixed(2)))
+ })
+ this.option.series[0].data = handelUsdt(this.Utxos2ndData, balanceAmount0List)
+ this.option.series[1].data = handelUsdt(this.Utxos2ndData, balanceAmount001List)
+ this.option.series[2].data = handelUsdt(this.Utxos2ndData, balanceAmount01List)
+ this.option.series[3].data = handelUsdt(this.Utxos2ndData, balanceAmount1List)
+ this.option2.series[0].data = handelUsdt(this.Utxos2ndData, balanceAmount10List)
+ this.option2.series[1].data = handelUsdt(this.Utxos2ndData, balanceAmount100List)
+ this.option2.series[2].data = handelUsdt(this.Utxos2ndData, balanceAmount1000List)
+ this.option2.series[3].data = handelUsdt(this.Utxos2ndData, balanceAmount10000List)
+ this.ratio.series[0].data = handelUsdt(this.Utxos2ndData, rateAmount0List)
+ this.ratio.series[1].data = handelUsdt(this.Utxos2ndData, rateAmount001List)
+ this.ratio.series[2].data = handelUsdt(this.Utxos2ndData, rateAmount01List)
+ this.ratio.series[3].data = handelUsdt(this.Utxos2ndData, rateAmount1List)
+ this.ratio2.series[0].data = handelUsdt(this.Utxos2ndData, rateAmount10List)
+ this.ratio2.series[1].data = handelUsdt(this.Utxos2ndData, rateAmount1001List)
+ this.ratio2.series[2].data = handelUsdt(this.Utxos2ndData, rateAmount1000List)
+ this.ratio2.series[3].data = handelUsdt(this.Utxos2ndData, rateAmount10000List)
+
+
+
+ this.inChartsLine()
+ this.inChartsLine2()
+ this.inChartSratioLine()
+ this.inChartSratioLine2()
+ this.ut2dLoading = false
+
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option2, this.option2.series[0].data.length), );
+
+
+
+ }, 10000)
+
+ },
+ //父级时间
+ handelSonTime(start, end) {
+
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchData(this.params.req, this.params.radius, this.times.start , this.times.end,this.sma)
+ },
+
+
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.option2 = handelLineType(this.option2)
+ this.ratio = handelLineType(this.ratio)
+ this.ratio2 = handelLineType(this.ratio2)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+
+ this.myChart.setOption(this.option);
+ this.myChart2.setOption(this.option2);
+ this.myChart3.setOption(this.ratio);
+ this.myChart4.setOption(this.ratio2);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[4], this.start, this.end, this.inChartsLine, this, this.btcFlag)
+ fetchBtcPrice("BTC", this.option2.series[4], this.start, this.end, this.inChartsLine2, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[5], this.start, this.end, this.inChartsLine, this, this.ethFlag)
+ fetchEthPrice("ETH", this.option2.series[5], this.start, this.end, this.inChartsLine2, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+
+ this.sma = smaDataList
+ this.fetchData(this.params.req, this.params.radius, this.times.start , this.times.end,this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+
+
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[4], this.inChartsLine,this.start, this.end)
+ // handelSmaData(smaDataList, this.option2.series[4], this.inChartsLine2,this.start, this.end)
+
+ },
+
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/utxos2nd/index.vue b/yq/src/views/utxos2nd/index.vue
new file mode 100644
index 0000000..f050f57
--- /dev/null
+++ b/yq/src/views/utxos2nd/index.vue
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
{{ $t(`arh.ratio1`) }}
+
{{ $t(`home.figure`) }}
+
+
+
+
+
+
+
+
{{ $t(`home.figure2`) }}
+
+
+
+
+
+
+
{{ $t(`arh.ratio2`) }}
+
{{ $t(`home.figure3`) }}
+
+
+
+
+
+
+
+
{{ $t(`home.figure4`) }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/velocity/index.js b/yq/src/views/velocity/index.js
new file mode 100644
index 0000000..a4bac97
--- /dev/null
+++ b/yq/src/views/velocity/index.js
@@ -0,0 +1,329 @@
+import * as echarts from "echarts";
+import { fetchVelocity } from "../../api/apiPost"
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+
+ velocityLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ formatter: function (params) {
+ const date = new Date(params[0].value[0]);
+ const year = date.getFullYear();
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ let time = `${year}-${month}-${day}`;
+ var res =time
+
+ for (let i = 0; i < params.length; i++) {
+ res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+
+ }
+ return res;
+ }
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ // axisLabel: {
+ // formatter: function (e) {
+
+ // let value;
+ // if (e > 100000000) {
+ // value = `${e / 100000000}E`;
+ // } else if (e > 1000000) {//百万
+ // value = `${e / 1000000}M`;
+ // } else if (e >= 10000) {//万
+ // value = `${e / 10000}W`;
+ // } else if (e < -1000000) {//百万
+ // value = `${e / 1000000}M`;
+ // } else if (e < -10000) {//万
+ // value = `${e / 10000}W`;
+ // }
+ // else {
+ // value = e;
+ // }
+ // return value;
+ // },
+ // },
+ // min: "dataMin",
+ // max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Velocity",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#888888",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#888888",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+
+
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ params: {
+ sma: ""
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+
+ }
+ },
+ mounted() {
+ this.fetchVelocity(this.params.req, this.params.radius)
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("velocityBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("velocityBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchVelocity(params) {
+ this.velocityLoading = true
+ const { data } = await fetchVelocity(params)
+
+ let velocityData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.velocityLoading = false
+ return
+ }
+ this.start = velocityData[0].date.split("T")[0]
+ this.end = velocityData[velocityData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+ // //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+ })
+
+
+
+ let profitValueList = []
+
+
+ velocityData.forEach(item => {
+
+ profitValueList.push(Number(item.value.toFixed(8)))
+
+ })
+ this.option.series[0].data = handelProfitrate(velocityData, profitValueList)
+
+
+
+ this.inCharts()
+ this.velocityLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchVelocity(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[1], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/velocity/index.vue b/yq/src/views/velocity/index.vue
new file mode 100644
index 0000000..0f0933d
--- /dev/null
+++ b/yq/src/views/velocity/index.vue
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/velocityEth/index.js b/yq/src/views/velocityEth/index.js
new file mode 100644
index 0000000..1688dad
--- /dev/null
+++ b/yq/src/views/velocityEth/index.js
@@ -0,0 +1,359 @@
+import * as echarts from "echarts";
+import { getVelocityEth, } from "../../api/pages"
+import { chartsWidth, emptyData,dataLength, handelProfitrate, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ velocityEthLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i < params.length; i++) {
+ // if (i==0) {
+ // res += `${params[0].marker} ${params[0].seriesName}      ${params[0].value[1]}% `
+ // }else{
+ // res += `${params[i].marker} ${params[i].seriesName}      ${params[i].value[1]} `
+ // }
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ // axisLabel: {
+ // formatter: function (e) {
+
+ // let value;
+ // if (e > 100000000) {
+ // value = `${ (e / 100000000).toFixed(2)}E`;
+ // } else if (e > 1000000) {//百万
+ // value = `${(e / 1000000).toFixed(2)}M`;
+ // } else if (e >= 10000) {//万
+ // value = `${ (e / 10000).toFixed(2)}W`;
+ // } else if (e < -1000000) {//百万
+ // value = `${ (e / 1000000).toFixed(2)}M`;
+ // } else if (e < -10000) {//万
+ // value = `${ (e / 10000).toFixed(2)}W`;
+ // }
+ // else {
+ // value = e;
+ // }
+ // return value;
+ // },
+ // },
+ // min: "dataMin",
+ // max: "dataMax",
+ // max: function (value) {
+ // console.log(value,566);
+ // return value.max - 20;
+ // }
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ // min: "dataMin",
+ // max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ // min: "dataMin",
+ // max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ // min: "dataMin",
+ // max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ // min: "dataMin",
+ // max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Velocity",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+
+
+ // },
+ {
+ name: "Price [ETH]",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#627eea",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#627eea",
+ width: "1",
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: ""
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+
+ this.fetchvelocityEth()
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("velocityEthBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("velocityEthBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchvelocityEth(params) {
+ this.velocityEthLoading = true
+ const { data } = await getVelocityEth(params)
+
+ if (data.code !== 200) {
+ this.$message({
+ message: data.msg,
+ type: "error",
+ customClass: "messageClass",
+ });
+ return
+ }
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.velocityEthLoading = false
+ return
+ }
+
+ let velocityEthData = data.data
+ this.start = velocityEthData[0].date.split("T")[0]
+ this.end = velocityEthData[velocityEthData.length - 1].date.split("T")[0]
+ // //添加水印
+ this.option = handelWatermark(this.option)
+
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ // this.$nextTick(() => {
+
+ // //渲染ETH
+ // if (this.ethFlag) {
+ // this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ // this.handelSonEthPrice("ETH", this.ethFlag)
+ // }
+ // //渲染BTC价格
+ // if (this.btcFlag) {
+ // this.$addStorageEvent(1, "btcFlag", JSON.stringify(this.btcFlag));
+ // this.handelSonBtcPrice("BTC", this.btcFlag)
+ // }
+
+
+
+ // })
+
+ // let a= 1.1740038979721799e-7
+ // console.log(a.toFixed(4),56645111111116454);
+
+ this.handelSonEthPrice("ETH", true)
+ let ValueList = []
+ velocityEthData.forEach(item => {
+
+
+ // item.value= Math.floor(item.value*10000)/10000 //保留4位数
+
+
+ ValueList.push(Number(item.value.toFixed(8)))
+
+ })
+ this.option.series[0].data = handelProfitrate(velocityEthData, ValueList)
+
+ this.inCharts()
+
+ this.velocityEthLoading = false
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchvelocityEth(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[1], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[1], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchvelocityEth(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/velocityEth/index.vue b/yq/src/views/velocityEth/index.vue
new file mode 100644
index 0000000..19025a0
--- /dev/null
+++ b/yq/src/views/velocityEth/index.vue
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/volume/index.js b/yq/src/views/volume/index.js
new file mode 100644
index 0000000..3be7984
--- /dev/null
+++ b/yq/src/views/volume/index.js
@@ -0,0 +1,628 @@
+
+import * as echarts from "echarts";
+import { $addStorageEvent } from '../../util/processingData'
+import {ethPrice2}from '../../api/apiPost'
+import { getBTCFees, getBTCVolume, getEaVolume2, } from '../../api/realTimeData'
+import { chartsWidth,emptyData,dataLength, handelProfitrate, handelLineType, handelSwitchs, handelSmaData, getDateArray, handelWatermark, fetchBtcPrice, fetchEthPrice } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ lengthTimer:null,
+ volumeLoading: false,
+ option: {
+ legend: {
+ right: 100,
+ formatter: function (name) {
+ return name;
+ },
+ },
+ tooltip: {
+ trigger: "axis",
+ textStyle: {
+ align: "left",
+ },
+ animation: false,
+ // formatter: function (params) {
+ // var res = params[0].axisValueLabel;
+
+ // for (let i = 0; i <= params.length - 1; i++) {
+ // res += `${params[i].marker} ${params[i].value[1]} ${params[i].seriesName}`;
+ // }
+ // return res;
+ // },
+ axisPointer: {
+ animation: false,
+ snap: true,
+ label: {
+ precision: 2, //坐标轴保留的位数
+ },
+ type: "cross", //cross shadow
+ crossStyle: {
+ //十字轴横线
+ // opacity: "0",
+ width: 0.5,
+ },
+ lineStyle: {
+ // opacity: 0,
+ },
+ },
+ },
+
+ xAxis: {
+ type: "time",
+ boundaryGap: false,
+ data: [],
+ axisTick: {
+ //去除刻度
+ show: false,
+ },
+ axisLine: {
+ //去除轴线
+ show: false,
+ },
+ data:[]
+ },
+ yAxis: [
+ {
+ position: "left",
+ type: "value",
+ axisLabel: {
+ formatter: (value) => {
+ let data
+ if (value >= 1000000000) {
+ data = `${value / 1000000000}B`
+ } else if (value >= 1000000) {
+ data = `${value / 1000000}M`
+ } else {
+ data = `${value / 1000}K`
+ }
+ return data
+ }
+ }
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: true,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ {
+ type: "value",
+ position: "right",
+ // type: "log",
+ // splitNumber: "5",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 10,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 2,
+ animation: false,
+ },
+ {
+ start: 0,
+ end: 20,
+ showDetail: false,
+ },
+ ],
+ series: [
+ {
+ name: "Transaction Volume",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#f7931a",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#f7931a",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series',
+
+
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+ {
+ name: "Transaction Fee",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#8b3349",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#8b3349",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ yAxisIndex: 1,
+ data: [],
+ },
+ {
+ name: "Transaction Volume (Entity-adjusted)",
+ type: "line",
+ smooth: false, //线条是否圆滑
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ itemStyle: {
+ color: "#39a271",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#39a271",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series',
+ },
+ yAxisIndex: 0,
+ data: [],
+ },
+ {
+ name: "Price[BTC]",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 5,
+ showSymbol: false,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#000",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ lineStyle: {
+ //线条样式
+ color: "#000",
+ width: "1",
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ yAxisIndex: 1,
+ data: [],
+ //绘制右侧Y轴
+ // markLine: {
+ // symbol: ["none", "none"], //去掉箭头
+ // itemStyle: {
+ // normal: {
+ // lineStyle: { type: "solid", color: "rgba(0,0,0,0.01)" },
+ // },
+ // },
+ // // lineStyle:{
+ // // color:"red"
+ // // },
+
+ // label: {
+ // formatter: "{b}",
+ // fontSize: 10,
+ // color: "rgba(0,0,0,0.8)",
+ // align: "left",
+ // },
+ // data: [
+ // // {
+ // // name: "0",
+ // // yAxis: 0,
+ // // },
+ // // {
+ // // name: "$40W",
+ // // yAxis: 400000,
+ // // },
+ // {
+ // name: "$70W",
+ // yAxis: 700000,
+ // },
+ // {
+ // name: "$40W",
+ // yAxis: 400000,
+ // },
+
+ // {
+ // name: "$10W",
+ // yAxis: 100000,
+ // },
+ // {
+ // name: "$100W",
+ // yAxis: 1000000,
+ // // position: ['100%', '50'],
+ // },
+ // {
+ // name: "$120W",
+ // yAxis: 1200000,
+ // },
+
+ // {
+ // name: "$140W",
+ // yAxis: 1400000,
+ // },
+ // ],
+ // },
+ },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // emphasis: {
+ // focus: 'series'
+ // },
+ // yAxisIndex: 3,
+ // data: [],
+ // },
+
+
+ ],
+ },
+ params: {
+ req: "BTCVolume",
+ radius: "btc",
+ sma: "",
+
+ },
+ feesParams: {
+ req: "BTCFees",
+ radius: "btc"
+ },
+ eaVolume: {
+ req: "eaVolume",
+ radius: "btc"
+ },
+ volumeData: [],
+ feesData: [],
+ times: {
+ start: "",
+ end: ""
+
+ },
+ eaVolumeData: [],
+ switch3: "",
+ btcFlag: true,
+ ethFlag: false,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ zoomStart: 0,
+ zoomEnd: 0,
+ sma: "",
+ dataSelection: [
+ {
+ value: "1d",
+ label: "home.day1",
+ disabled:false,
+ authority:"guest",
+ grade:1,
+ },
+ {
+ value: "realTime",
+ label: "home.realTimeData",
+ disabled:false,
+ authority:"vip",
+ grade:4,
+ },
+ ],
+ realTimeData:"",
+
+ }
+ },
+ mounted() {
+
+ this.fetchVolume(this.params.req, this.params.radius)
+ this.fetchFees(this.feesParams.req, this.feesParams.radius)
+ this.fetchEaVolume(this.eaVolume.req, this.eaVolume.radius)
+ $addStorageEvent(1, "zoomStart", this.zoomStart);
+ $addStorageEvent(1, "zoomEnd", this.zoomEnd);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+
+
+
+
+
+ },
+ methods: {
+ handleSelect(activeValue){
+ if (activeValue == `1d`) {
+ this.realTimeData =false
+ this.fetchVolume(this.params.req, this.params.radius)
+ this.fetchFees(this.feesParams.req, this.feesParams.radius)
+ this.fetchEaVolume(this.eaVolume.req, this.eaVolume.radius)
+ }else{
+ this.fetchBTCFees()
+ this.fetchBTCVolume()
+ this.fetchEaVolume2()
+ this.realTimeData =true
+ }
+ },
+ inChart() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("volumeBox"));
+ }
+
+ this.myChart.setOption(this.option);
+ chartsWidth("volumeBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();;
+ });
+ },
+ //请求交易费实时数据
+ async fetchBTCFees(){
+ this.volumeLoading = true
+ const { data } = await getBTCFees()
+ let BTCFeesData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChart, this)
+ if (noData) {
+ this.volumeLoading = false
+ return
+ }
+ let Fees=[]
+ let price=[]
+ let xAxisData=[]
+ BTCFeesData.forEach(item=>{
+ item.date= `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ Fees.push(item.value.toFixed(2))
+ price.push(item.price.toFixed(2))
+ xAxisData.push(item.date)
+ })
+
+ this.option.xAxis.type = 'category'
+ //添加水印
+ this.option=handelWatermark(this.option)
+ this.option.xAxis.data = xAxisData
+ this.option.series[1].data = Fees
+ this.option.series[3].data = price
+
+ this.myChart.clear();
+ this.inChart()
+ this.volumeLoading = false
+
+
+ },
+ async fetchBTCVolume(){
+
+ const { data } = await getBTCVolume()
+ let BTCVolumeData = data.data
+ let Volume=[]
+ BTCVolumeData.forEach(item=>{
+ item.date= `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ Volume.push(item.value.toFixed(2))
+ })
+
+ this.option.series[0].data = Volume
+ this.inChart()
+ },
+ async fetchEaVolume2(){
+ let { data } = await getEaVolume2()
+ let EaVolumeData = data.data
+ let EaVolume=[]
+ EaVolumeData.forEach(item=>{
+ item.date= `${item.date.split(`T`)[0]} ${item.date.split(`T`)[1].split(`.`)[0]}`
+ EaVolume.push(item.value.toFixed(2))
+ })
+
+ this.option.series[2].data = EaVolume
+ this.inChart()
+ },
+
+
+ //请求交易量数据渲染
+ async fetchVolume(req, radius, start, end, sma) {
+ this.volumeLoading = true
+ const { data } = await this.$API.getVolume(req, radius, start, end, sma)
+ this.volumeData = data.data
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inChart, this)
+ if (noData) {
+ this.volumeLoading = false
+ return
+ }
+ this.option.xAxis.type="time"
+ //添加水印
+ handelWatermark(this.option, 750, 300)
+ this.start = this.volumeData[0].date.split("T")[0]
+ this.end = this.volumeData[this.volumeData.length - 1].date.split("T")[0]
+ //根据渲染的数据时间渲染对应的价格线和移动平均线
+ this.$nextTick(() => {
+ //移动平均线没值 才渲染正常价格数据
+ if (this.start && !this.fatherSmaData[0]) {
+ this.handelSonBtcPrice("BTC", true)
+ }
+ if (this.ethFlag) {
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ this.handelSonEthPrice("ETH", this.ethFlag)
+ }
+
+
+
+ //点击时间 移动平均线有值 就渲染查询移动平均线
+ if (this.fatherSmaData[0] && this.start) {
+ this.handelSonSma(this.fatherSmaData, this.start, this.end)
+
+ }
+ })
+ let volumeValueList = []
+ this.volumeData.forEach(item => {
+
+ // this.option.xAxis.data.push(time)
+ volumeValueList.push(Number(item.value.toFixed(2)))
+ // this.option.series[0].data.push([time, Number(item.value.toFixed(2))])
+ })
+ this.option.series[0].data = handelProfitrate(this.volumeData, volumeValueList)
+
+ if (this.zoomStart) {
+ this.option.dataZoom[0].start = this.zoomStart
+ this.option.dataZoom[0].end = this.zoomEnd
+ } else {
+ this.option.dataZoom[0].start = 10
+ this.option.dataZoom[0].end = 100
+ }
+
+
+
+
+ this.inChart()
+
+
+
+
+ setTimeout(() => {//监听echarts 图表滚动
+ this.myChart.on("dataZoom", function (e) {
+ this.zoomStart = e.start || e.batch[0].start;
+ this.zoomEnd = e.end|| e.batch[0].end;
+ $addStorageEvent(1, "zoomStart", this.zoomStart);
+ $addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ });
+
+
+ })
+
+ this.volumeLoading = false
+
+ //判定页面条数是否一致
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ this.lengthTimer = setTimeout(() => {
+
+ this.$addStorageEvent(1, "lengthFlag", dataLength(this.option, this.option.series[0].data.length), );
+
+ }, 10000)
+
+
+
+ },
+ //请求交易费数据渲染
+ async fetchFees(req, radius, start, end, sma) {
+ const { data } = await this.$API.getVolume(req, radius, start, end, sma)
+ this.feesData = data.data
+ this.option = handelWatermark(this.option, 650, 300)
+
+
+ let feesValueList = []
+ this.feesData.forEach(item => {
+
+ feesValueList.push(Number(item.value.toFixed(2)))
+ })
+ this.option.series[1].data = handelProfitrate(this.feesData, feesValueList)
+
+ this.inChart()
+
+
+ },
+ //请求交易量(找零消除)数据渲染
+ async fetchEaVolume(req, radius, start, end, sma) {
+ const { data } = await this.$API.getVolume(req, radius, start, end, sma)
+
+ this.eaVolumeData = data.data
+
+ let eaValueList = []
+ this.eaVolumeData.forEach(item => {
+
+ eaValueList.push(Number(item.value.toFixed(2)))
+ })
+ this.option.series[2].data = handelProfitrate(this.eaVolumeData, eaValueList)
+ this.inChart()
+
+ },
+ //父级时间
+ handelSonTime(start, end) {
+ this.times.start = start;
+ this.times.end = end;
+ this.fetchVolume(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.fetchFees(this.feesParams.req, this.feesParams.radius, this.times.start, this.times.end, this.sma)
+ this.fetchEaVolume(this.eaVolume.req, this.eaVolume.radius, this.times.start, this.times.end, this.sma)
+ // this.handelSonEthPrice("ETH",false)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[3], this.start, this.end, this.inChart, this, this.btcFlag)
+
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ this.$addStorageEvent(1, "ethFlag", JSON.stringify(this.ethFlag));
+ fetchEthPrice("ETH", this.option.series[4], this.start, this.end, this.inChart, this, this.ethFlag, true)
+
+
+ },
+ //父级选择Sma
+ handelSonSma(smaNUm) {
+ this.sma = smaNUm
+ this.fetchVolume(this.params.req, this.params.radius, this.times.start, this.times.end, this.sma)
+ this.fetchFees(this.feesParams.req, this.feesParams.radius, this.times.start, this.times.end, this.sma)
+ this.fetchEaVolume(this.eaVolume.req, this.eaVolume.radius, this.times.start, this.times.end, this.sma)
+ this.$addStorageEvent(1, "sma", this.sma);
+ this.realTimeData =false
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[3], this.inChart, this.start, this.end)
+
+ },
+ },
+ beforeDestroy() {
+ if (this.lengthTimer) {
+ clearTimeout(this.lengthTimer)
+ }
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/volume/index.vue b/yq/src/views/volume/index.vue
new file mode 100644
index 0000000..638608e
--- /dev/null
+++ b/yq/src/views/volume/index.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+ {{ $t(`home.switch`)
+ }} {{ $t(switch3) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/volumeProfile/index.js b/yq/src/views/volumeProfile/index.js
new file mode 100644
index 0000000..e75b30f
--- /dev/null
+++ b/yq/src/views/volumeProfile/index.js
@@ -0,0 +1,616 @@
+import * as echarts from "echarts";
+import { getVolumeProfile, getKLine } from "../../api/pages"
+import { chartsWidth, Debounce, emptyData, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ volumeProfileLoading: false,
+ dataZoomStart: 25,
+ dataZoomEnd: 75,
+ option: {
+
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'none',
+ // link: [{ xAxisIndex: 0},{ xAxisIndex: 1},{ xAxisIndex: 2}]
+ },
+
+ },
+ //水印
+ graphic: [
+ {
+ type: 'group',
+ // rotation: Math.PI / 2,
+ bounding: 'raw',
+ right: "50%",
+ top: "40%",
+ // z: 10,
+ // rotation: 6,
+ children: [
+ {
+ type: 'text',
+ left: 'center',
+ top: 'center',
+
+ silent: true,//不影响鼠标事件
+
+ style: {
+ fill: `rgba(0,0,0,0.1)`,
+ text: `coinbus.cc`,
+ font: 'bold 80px sans-serif',
+
+ }
+ }
+ ]
+ }
+
+ ],
+ grid: [
+ {
+ // left: 0,
+ top: "5%",
+ right: "10%",
+ height: "70%",
+ // borderWidth: 10,
+ // containLabel: true,
+ },
+ {
+ // left: 0,
+ top: "80%",
+ right: "10%",
+ height: "20%",
+ // containLabel:true
+ },
+ ],
+ xAxis: [{
+ // type: "time",
+ data: [],
+ axisLine: { lineStyle: { color: "#8392A5" } },
+ // 显示在第一个grid坐标上
+ gridIndex: 0,
+ position: "bottom",
+ boundaryGap: false // 坐标轴不留空白
+
+ },
+ {
+
+ //是否显示X轴
+ show: false,
+ //显示在第一个grid坐标上
+ gridIndex: 1,
+ // 网格线
+ splitLine: {
+ show: false,
+ lineStyle: {
+ color: "rgba(225,225,225)",
+ width: 1,
+ type: "solid",
+ },
+ },
+ // 数据
+ data: [],
+ boundaryGap: false // 横轴两端的空白区域也可以被拖动
+ },
+ {
+ // type: "time",
+ position: "top",
+ type: 'value',
+ inverse: true,//反向坐标轴 让数据显示在右边
+ axisLine: { lineStyle: { color: "#8392A5" } },
+ // 显示在第一个grid坐标上
+ // gridIndex: 0,
+ },
+ ],
+ yAxis: [
+ {
+ //显示在第一个grid坐标上
+
+ gridIndex: 0,
+ scale: true,
+ axisLine: { lineStyle: { color: "#8392A5" } },
+ splitLine: { show: false },
+ },
+ {
+
+ //显示在第二个grid坐标上
+ gridIndex: 1,
+ position: "right",
+ type: "value",
+ show: true,
+ },
+ {
+ //显示在第一个grid坐标上 横柱状图的X坐标
+ // gridIndex: 0,
+
+ position: "right",
+ // type: "value",
+ show: true,
+ data: []
+ },
+
+
+ ],
+ dataZoom: [
+ {
+
+ type: "inside",
+ xAxisIndex: [0, 1],
+ start: 25,
+ end: 75,
+ maxSpan: 100,
+ minSpan: 20,
+
+ },
+ {
+ type: "inside",
+ xAxisIndex: [0, 1],
+ maxSpan: 100,
+ minSpan: 20,
+ start: 0,
+ end: 100,
+
+
+
+ },
+ {
+ type: "inside",//slider inside
+ yAxisIndex: [2],
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 50,
+
+ // showDetail: false,
+ },
+
+
+ ],
+
+
+ series: [
+ {
+ type: "candlestick",
+ name: "Day",
+ symbol: "none",
+ data: [],
+ itemStyle: {
+ color: "#FD1050",
+ color0: "#0CF49B",
+ borderColor: "#FD1050",
+ borderColor0: "#0CF49B",
+ },
+ },
+
+ {
+ type: "bar",
+ name: "成交量",
+ xAxisIndex: 1,
+ yAxisIndex: 1,
+ data: [],
+ barCategoryGap: "30%",
+ itemStyle: {
+ symbol: "none",
+ color: "",
+ },
+ },
+ {
+ name: "交易量",
+ type: "bar",
+ stack: "total",
+ // stack: "1",
+ label: {
+ show: true,
+ fontSize: 10,
+ color: "#000",
+ },
+ emphasis: {
+ focus: "series",
+ },
+ //
+ itemStyle: {
+ color: "#fac958",
+ },
+ data: [],
+ xAxisIndex: 2,
+ yAxisIndex: 2,
+ },
+
+ ],
+
+ },
+
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: " ",
+ count: 50,
+
+ },
+ dataS: [{
+
+ }],
+ zoomStart: 0,
+ zoomEnd: 0,
+ KlineParams: {
+ start: "",
+ end: "",
+ symbol: "BTCUSDT",
+ interval: "1h"
+ },
+ symbolValueList: [
+ {
+ value: "BTCUSDT",
+ label: "BTCUSDT",
+ },
+ {
+ value: "ETHUSDT",
+ label: "ETHUSDT",
+ },
+
+ ],
+ //K线总的数据
+ totalData: [],
+ intervalList: [{
+ value: "1m",//1分钟
+ label: "bian.oneMinutes",
+ },
+ {
+ value: "3m",//3分钟
+ label: "bian.minutes3",
+ }, {
+ value: "5m",
+ label: "bian.minutes5",
+ }, {
+ value: "15m",
+ label: "bian.minutes15",
+ }, {
+ value: "30m",
+ label: "bian.minutes30",
+ }, {
+ value: "1h",
+ label: "bian.hours1",
+ }, {
+ value: "2h",
+ label: "bian.hours2",
+ }, {
+ value: "4h",
+ label: "bian.hours4",
+ }, {
+ value: "6h",
+ label: "bian.hours6",
+ }, {
+ value: "8h",
+ label: "bian.hours8",
+ }, {
+ value: "12h",
+ label: "bian.hours12",
+ },
+ {
+ value: "1d",
+ label: "bian.day",
+ },
+ {
+ value: "3d",
+ label: "bian.day3",
+ },
+ {
+ value: "1w",
+ label: "bian.weekly",
+ },
+ {
+ value: "1M",
+ label: "bian.month",
+ },
+ ],
+ dragAndDrop: false,
+ KData: [],
+ flagInterval: false,//判断是否点击改变了时间间隔 改变间隔option数据清空不拼接
+
+
+
+ }
+ },
+ mounted() {
+
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ //获取当前时间请求K线图
+ let nowTime = new Date()
+
+ // end 拿时间之前的1000条数据 start 拿时间之后的1000条数据
+ this.KlineParams.end = nowTime.toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai', hour12: false }).replace(/[/|年|月]/g, '-').replace(/[日|时]/g, '').replace(/分/g, ':')
+ // console.log(this.KlineParams,"结果集覅");
+ this.fetchKline(this.KlineParams)
+
+ },
+ methods: {
+ // echarts鼠标事件
+ handelMouse(flag) {
+ // console.log("看if打开覅",flag);
+ let mousePress
+ mousePress = flag
+
+ if (mousePress) {
+ if ((this.dataZoomStart === 0 || this.dataZoomEnd === 100) && this.option.series[0].data[0][0]) {
+ Array(500).fill(1).forEach(item => {
+ this.option.series[0].data.unshift([null, null, null, null])
+ this.option.series[1].data.unshift(null)
+ this.option.xAxis[0].data.unshift('')
+ this.option.xAxis[1].data.unshift('')
+ this.option.series[0].data.push([null, null, null, null])
+ this.option.series[1].data.push(null)
+ this.option.xAxis[0].data.push('')
+ this.option.xAxis[1].data.push('')
+ })
+
+ }
+
+ this.dataZoomStart = this.dataZoomStart === 0 ? 25 : this.dataZoomStart
+ this.dataZoomEnd = this.dataZoomEnd = 100 ? 75 : this.dataZoomEnd
+ }
+
+
+
+ this.dragAndDrop = flag
+
+ this.inCharts()
+ },
+
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("volumeProfileBox"));
+ }
+ this.option.dataZoom[0].start = this.dataZoomStart
+ this.option.dataZoom[0].end = this.dataZoomEnd
+
+ // 处理柱状图颜色
+ let barColor
+ if (this.option.series[0].data[0]) {
+ let arr = this.option.series[0].data.map((item) => {
+ return [item[0], item[1]];
+ });
+ this.option.series[1].itemStyle.color = function (params) {
+
+ if (
+ arr[params.dataIndex] &&
+ Number(arr[params.dataIndex][1] || 0) >=
+ Number(arr[params.dataIndex][0])
+ ) {
+ // console.log( Number(arr[params.dataIndex][1] || 0) >=
+ // Number(arr[params.dataIndex][0]),Number(arr[params.dataIndex][1]),"哈哈哈哈哈哈");
+ barColor = "#f64e56";
+ } else {
+ barColor = "#54ea92";
+ }
+
+ return barColor;
+
+ };
+ }
+
+
+
+
+ this.myChart.setOption(this.option);
+
+ chartsWidth("volumeProfileBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+
+
+ },
+ //请求柱状图
+ async fetchVolumeProfile(params) {
+ this.volumeProfileLoading = true
+ const list = await getVolumeProfile(params)
+ let barData = list.data.data
+ //空数据处理
+ let noData = emptyData(barData, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.volumeProfileLoading = false
+ return
+ }
+
+ this.option.yAxis[2].data = []
+ this.option.series[2].data = []
+ barData.forEach(item => {
+ this.option.yAxis[2].data.push(item.price)
+ this.option.series[2].data.push(item.volume)
+ })
+
+
+ this.inCharts()
+ this.volumeProfileLoading = false
+ },
+ //请求K线图 防抖Debounce函数
+ fetchKline: Debounce(async function (kParams) {
+ let { data } = await getKLine(kParams)
+
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.volumeProfileLoading = false
+ return
+ }
+
+
+
+ //减掉开头空白数据
+ if (this.KData[0] && this.KData[0][0]) {
+ this.KData = this.KData.splice(0, 499)
+
+ }
+ //减掉结尾空白数据
+ if (this.KData[this.length - 1] && !this.KData[this.length - 1][0]) {
+ this.KData = this.KData.splice(this.length - 500, 500)
+ }
+ if (this.flagInterval) {
+ this.KData = data.data
+ } else {
+ this.KData = [...data.data, ...this.KData]
+ }
+
+
+ this.flagInterval = false//确定是否拼接数据
+
+
+ //判断是否是初始数据 ,是 则不处理,不是 则判断是否有空数据未处理,有则 处理空数据
+ if (this.option.series[0].data[0] && !this.option.series[0].data[0][0]) {
+ this.option.series[0].data = this.option.series[0].data.slice(500, this.option.series[0].data.length - 500)
+ this.option.series[1].data = this.option.series[1].data.slice(500, this.option.series[1].data.length - 500)
+
+ this.option.xAxis[0].data = this.option.xAxis[0].data.slice(500, this.option.xAxis[0].data.length - 500)
+ this.option.xAxis[1].data = this.option.xAxis[1].data.slice(500, this.option.xAxis[1].data.length - 500)
+
+ }
+
+
+ this.KData.forEach(item => {
+ if (item.openTime.includes("T")) {
+ item.openTime = `${item.openTime.split(`T`)[0]} ${item.openTime.split(`T`)[1].split(`.`)[0]}`
+ }
+
+ })
+ this.params.start = await this.KData[0].openTime
+ this.params.end = await this.KData[this.KData.length - 1].openTime
+ this.fetchVolumeProfile(this.params)//柱状图 根军K线图的开始结束时间进行渲染
+ // this.option = handelWatermark(this.option)
+ this.option.xAxis[0].data = []
+ this.option.xAxis[1].data = []
+ this.option.series[0].data = []
+ this.option.series[1].data = []
+ this.KData.forEach(item => {
+ this.option.xAxis[0].data.push(item.openTime)
+ this.option.xAxis[1].data.push(item.openTime)
+ this.option.series[0].data.push([
+ item.openPrice,
+ item.closePrice,
+ item.lowPrice,
+ item.highPrice]
+
+ )
+ this.option.series[1].data.push(item.volume)
+ });
+
+
+
+
+ console.log(this.option.series,"米哦飞机覅附件i");
+ this.inCharts()
+
+
+
+
+ // 监听滚动到数据完结在发起请求
+ this.myChart.on("dataZoom", (e) => {
+ let { start, end } = e.batch[0]
+ this.dataZoomStart = start
+ this.dataZoomEnd = end
+ if (this.dragAndDrop) {//鼠标按下判断当前图表滚动范围是否拖拽 拖拽便重新发起请求
+ if (start <= 26) {
+ this.KlineParams.start = ""
+ this.KlineParams.end = this.KData[0].openTime
+
+ } else if (end >= 74) {
+ this.KlineParams.end = ""
+ this.KlineParams.start = this.KData[this.KData.length - 1].openTime
+ }
+
+ this.fetchKline(this.KlineParams)
+
+ } else {
+
+ if (!this.option.series[0].data[0][0]) {
+ this.option.series[0].data = this.option.series[0].data.slice(500, this.option.series[0].data.length - 500)
+ this.option.series[1].data = this.option.series[1].data.slice(500, this.option.series[1].data.length - 500)
+ this.option.xAxis[0].data = this.option.xAxis[0].data.slice(500, this.option.xAxis[0].data.length - 500)
+ this.option.xAxis[1].data = this.option.xAxis[1].data.slice(500, this.option.xAxis[1].data.length - 500)
+ }
+ }
+ this.inCharts()
+ });
+
+
+
+
+
+ }, 1000),
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchVolumeProfile(this.params)
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[5], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[6], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchVolumeProfile(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[5], this.inCharts,this.start, this.end,)
+
+ },
+ //下拉选择
+ handelChang() {
+ this.flagInterval = true
+ this.fetchKline(this.KlineParams)
+
+ },
+
+ //处理时间栏导航
+ handelTimeList(event) {
+ if (!event.target.title) return;
+ this.KlineParams.interval = event.target.title;
+ this.flagInterval = true
+ this.fetchKline(this.KlineParams)
+
+ },
+ //处理弹窗的导航点击
+ handelPopupList(event) {
+ if (!event.target.title) return;
+ this.KlineParams.interval = event.target.title;
+ this.flagInterval = true
+ this.fetchKline(this.KlineParams)
+ },
+ //处理高亮时间显示
+ handelHighlight(data) {
+ if (data) {
+ return this.intervalList.find(item => item.value == data).label
+ }
+ }
+
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/volumeProfile/index.vue b/yq/src/views/volumeProfile/index.vue
new file mode 100644
index 0000000..df4def1
--- /dev/null
+++ b/yq/src/views/volumeProfile/index.vue
@@ -0,0 +1,282 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`bian.oneMinutes`)}}
+ {{$t(`bian.minutes15`)}}
+ {{$t(`bian.hours4`)}}
+ {{$t(`bian.day`)}}
+ {{$t(`bian.weekly`)}}
+ {{ $t(handelHighlight(KlineParams.interval) ) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/volumeProfileETH/index.js b/yq/src/views/volumeProfileETH/index.js
new file mode 100644
index 0000000..0467eaf
--- /dev/null
+++ b/yq/src/views/volumeProfileETH/index.js
@@ -0,0 +1,650 @@
+import * as echarts from "echarts";
+import { getVolumeProfile, getKLine } from "../../api/pages"
+import { chartsWidth, Debounce, emptyData, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ volumeProfileLoading: false,
+ dataZoomStart: 25,
+ dataZoomEnd: 75,
+ option: {
+
+ tooltip: {
+ trigger: "axis",
+ axisPointer: {
+ animation: false,
+ type: "cross",
+ lineStyle: {
+ color: "#376df4",
+ width: 2,
+ opacity: 0,
+ },
+
+ crossStyle: {
+ //十字轴横线
+ opacity: "0",
+ },
+ },
+
+ // formatter: (params) => {
+ // var res
+ // // console.log(params,);
+ // if (params[0].axisIndex !== 1) {
+ // res = params[0].axisValueLabel;
+ // // this.indicators05 = params[4].data
+ // // this.indicators10 = params[5].data
+ // // this.indicators20 = params[6].data
+ // res += `${params[0].marker} open \u00A0\u00A0\u00A0\u00A0 ${params[0].data[1]}
+ // ${params[0].marker} close \u00A0\u00A0\u00A0\u00A0 ${params[0].data[2]}
+ // ${params[0].marker} lowest \u00A0\u00A0\u00A0\u00A0 ${params[0].data[3]}
+ // ${params[0].marker} highest \u00A0\u00A0\u00A0\u00A0 ${params[0].data[4]}
+ // ${params[1].marker} ${params[1].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[1].value}
+ // ${params[2].marker} ${params[2].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[2].value}%
+ // ${params[3].marker} ${params[3].seriesName} \u00A0\u00A0\u00A0\u00A0 ${params[3].value}亿股`;
+
+ // }
+
+
+ // return res;
+ // },
+ },
+ grid: [
+ {
+ // left: 0,
+ top: "5%",
+ right: "10%",
+ height: "70%",
+ // borderWidth: 10,
+ // containLabel: true,
+ },
+ {
+ // left: 0,
+ top: "80%",
+ right: "10%",
+ height: "20%",
+ // containLabel:true
+ },
+ ],
+ xAxis: [{
+ // type: "time",
+ data: [],
+ axisLine: { lineStyle: { color: "#8392A5" } },
+ // 显示在第一个grid坐标上
+ gridIndex: 0,
+ position: "bottom",
+ boundaryGap: false // 坐标轴不留空白
+
+ },
+ {
+ //是否显示X轴
+ show: false,
+ //显示在第一个grid坐标上
+ gridIndex: 1,
+ // 网格线
+ splitLine: {
+ show: false,
+ lineStyle: {
+ color: "rgba(225,225,225)",
+ width: 1,
+ type: "solid",
+ },
+ },
+ // 数据
+ data: [],
+ boundaryGap: false // 横轴两端的空白区域也可以被拖动
+ },
+ {
+ // type: "time",
+ position: "top",
+ type: 'value',
+ inverse: true,//反向坐标轴 让数据显示在右边
+ axisLine: { lineStyle: { color: "#8392A5" } },
+ // 显示在第一个grid坐标上
+ // gridIndex: 0,
+ },
+ ],
+ yAxis: [
+ {
+ //显示在第一个grid坐标上
+ gridIndex: 0,
+ scale: true,
+ axisLine: { lineStyle: { color: "#8392A5" } },
+ splitLine: { show: false },
+ },
+ {
+ //显示在第二个grid坐标上
+ gridIndex: 1,
+ position: "right",
+ type: "value",
+ show: true,
+ },
+ {
+ //显示在第一个grid坐标上 横柱状图的X坐标
+ // gridIndex: 0,
+ position: "right",
+ // type: "value",
+ show: true,
+ data: []
+ },
+
+
+ ],
+ dataZoom: [
+ {
+
+ type: "inside",
+ xAxisIndex: [0, 1],
+ start: 25,
+ end: 75,
+ maxSpan: 100,
+ minSpan: 20,
+
+ },
+ {
+ type: "inside",
+ xAxisIndex: [0, 1],
+ maxSpan: 100,
+ minSpan: 20,
+ start: 0,
+ end: 100,
+
+
+
+ },
+ {
+ type: "inside",//slider
+ yAxisIndex: [2],
+ start: 0,
+ end: 100,
+ maxSpan: 100,
+ minSpan: 50,
+
+ // showDetail: false,
+ },
+
+
+ ],
+
+
+ series: [
+ {
+ type: "candlestick",
+ name: "Day",
+ symbol: "none",
+ data: [],
+ itemStyle: {
+ color: "#FD1050",
+ color0: "#0CF49B",
+ borderColor: "#FD1050",
+ borderColor0: "#0CF49B",
+ },
+ },
+
+ {
+ type: "bar",
+ name: "成交量",
+ xAxisIndex: 1,
+ yAxisIndex: 1,
+ data: [],
+ barCategoryGap: "30%",
+ itemStyle: {
+ symbol: "none",
+ color: "",
+ },
+ },
+ {
+ name: "交易量",
+ type: "bar",
+ stack: "total",
+ // stack: "1",
+ label: {
+ show: true,
+ fontSize: 10,
+ color: "#000",
+ },
+ emphasis: {
+ focus: "series",
+ },
+ //
+ itemStyle: {
+ color: "#fac958",
+ },
+ data: [],
+ xAxisIndex: 2,
+ yAxisIndex: 2,
+ },
+
+ ],
+
+ },
+
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ sma: " ",
+ count: 50,
+
+ },
+ dataS: [{
+
+ }],
+ zoomStart: 0,
+ zoomEnd: 0,
+ KlineParams: {
+ start: "",
+ end: "",
+ symbol: "ETHUSDT",
+ interval: "1h"
+ },
+ symbolValueList: [
+ {
+ value: "BTCUSDT",
+ label: "BTCUSDT",
+ },
+ {
+ value: "ETHUSDT",
+ label: "ETHUSDT",
+ },
+
+ ],
+ //K线总的数据
+ totalData: [],
+ intervalList: [{
+ value: "1m",//1分钟
+ label: "bian.oneMinutes",
+ },
+ {
+ value: "3m",//3分钟
+ label: "bian.minutes3",
+ }, {
+ value: "5m",
+ label: "bian.minutes5",
+ }, {
+ value: "15m",
+ label: "bian.minutes15",
+ }, {
+ value: "30m",
+ label: "bian.minutes30",
+ }, {
+ value: "1h",
+ label: "bian.hours1",
+ }, {
+ value: "2h",
+ label: "bian.hours2",
+ }, {
+ value: "4h",
+ label: "bian.hours4",
+ }, {
+ value: "6h",
+ label: "bian.hours6",
+ }, {
+ value: "8h",
+ label: "bian.hours8",
+ }, {
+ value: "12h",
+ label: "bian.hours12",
+ },
+ {
+ value: "1d",
+ label: "bian.day",
+ },
+ {
+ value: "3d",
+ label: "bian.day3",
+ },
+ {
+ value: "1w",
+ label: "bian.weekly",
+ },
+ {
+ value: "1M",
+ label: "bian.month",
+ },
+ ],
+ dragAndDrop: false,
+ KData: [],
+ flagInterval: false,//判断是否点击改变了时间间隔 改变间隔option数据清空不拼接
+
+
+
+ }
+ },
+ mounted() {
+
+ //禁用时间框
+ this.$addStorageEvent(1, "timeDisable", true);
+ //获取当前时间请求K线图
+ let nowTime = new Date()
+
+ // end 拿时间之前的1000条数据 start 拿时间之后的1000条数据
+ this.KlineParams.end = nowTime.toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai', hour12: false }).replace(/[/|年|月]/g, '-').replace(/[日|时]/g, '').replace(/分/g, ':')
+ // console.log(this.KlineParams,"结果集覅");
+ this.fetchKline(this.KlineParams)
+
+ },
+ methods: {
+ // echarts鼠标事件
+ handelMouse(flag) {
+ // console.log("看if打开覅",flag);
+ let mousePress
+ mousePress = flag
+ // setTimeout(() => {
+ // mousePress = flag
+ // console.log(mousePress,"2miao");
+ // }, 2000);
+ if (mousePress) {
+ if ((this.dataZoomStart === 0 || this.dataZoomEnd === 100) && this.option.series[0].data[0][0]) {
+ Array(500).fill(1).forEach(item => {
+ this.option.series[0].data.unshift([null, null, null, null])
+ this.option.series[1].data.unshift(null)
+ this.option.xAxis[0].data.unshift('')
+ this.option.xAxis[1].data.unshift('')
+ this.option.series[0].data.push([null, null, null, null])
+ this.option.series[1].data.push(null)
+ this.option.xAxis[0].data.push('')
+ this.option.xAxis[1].data.push('')
+ })
+
+ }
+
+ this.dataZoomStart = this.dataZoomStart === 0 ? 25 : this.dataZoomStart
+ this.dataZoomEnd = this.dataZoomEnd = 100 ? 75 : this.dataZoomEnd
+ }
+
+
+
+ this.dragAndDrop = flag
+
+ this.inCharts()
+ },
+
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("volumeProfileBox"));
+ }
+ this.option.dataZoom[0].start = this.dataZoomStart
+ this.option.dataZoom[0].end = this.dataZoomEnd
+
+ // 处理柱状图颜色
+ let barColor
+ if (this.option.series[0].data[0]) {
+ let arr = this.option.series[0].data.map((item) => {
+ return [item[0], item[1]];
+ });
+ this.option.series[1].itemStyle.color = function (params) {
+
+ if (
+ arr[params.dataIndex] &&
+ Number(arr[params.dataIndex][1] || 0) >=
+ Number(arr[params.dataIndex][0])
+ ) {
+ // console.log( Number(arr[params.dataIndex][1] || 0) >=
+ // Number(arr[params.dataIndex][0]),Number(arr[params.dataIndex][1]),"哈哈哈哈哈哈");
+ barColor = "#f64e56";
+ } else {
+ barColor = "#54ea92";
+ }
+
+ return barColor;
+
+ };
+ }
+
+
+
+
+ this.myChart.setOption(this.option);
+ chartsWidth("volumeProfileBox", this);
+
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+
+
+ },
+ //请求柱状图
+ async fetchVolumeProfile(params) {
+ this.volumeProfileLoading = true
+ const list = await getVolumeProfile(params)
+ let barData = list.data.data
+
+ //空数据处理
+ let noData = emptyData(barData, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.volumeProfileLoading = false
+ return
+ }
+
+ this.option.yAxis[2].data = []
+ this.option.series[2].data = []
+ barData.forEach(item => {
+ this.option.yAxis[2].data.push(item.price)
+ this.option.series[2].data.push(item.volume)
+ })
+
+
+ this.inCharts()
+ this.volumeProfileLoading = false
+ },
+ //请求K线图 防抖Debounce函数
+ fetchKline: Debounce(async function (kParams) {
+ let { data } = await getKLine(kParams)
+ // if (!data.data[0]) {//无数据
+ // this.$message({
+ // type: 'warning',
+ // message: this.$t(`home.NoData`)
+ // });
+ // this.option.series.forEach(item => {//清空数据重新渲染
+ // item.data.length = 0
+ // })
+ // this.inCharts()
+
+ // }
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.volumeProfileLoading = false
+ return
+ }
+
+ //减掉开头空白数据
+ if (this.KData[0] && this.KData[0][0]) {
+ this.KData = this.KData.splice(0, 499)
+
+ }
+ //减掉结尾空白数据
+ if (this.KData[this.length - 1] && !this.KData[this.length - 1][0]) {
+ this.KData = this.KData.splice(this.length - 500, 500)
+ }
+ if (this.flagInterval) {
+ this.KData = data.data
+ } else {
+ this.KData = [...data.data, ...this.KData]
+ }
+
+ this.flagInterval = false//确定是否拼接数据
+
+
+ //判断是否是初始数据 ,是 则不处理,不是 则判断是否有空数据未处理,有则 处理空数据
+ if (this.option.series[0].data[0] && !this.option.series[0].data[0][0]) {
+ this.option.series[0].data = this.option.series[0].data.slice(500, this.option.series[0].data.length - 500)
+ this.option.series[1].data = this.option.series[1].data.slice(500, this.option.series[1].data.length - 500)
+
+ this.option.xAxis[0].data = this.option.xAxis[0].data.slice(500, this.option.xAxis[0].data.length - 500)
+ this.option.xAxis[1].data = this.option.xAxis[1].data.slice(500, this.option.xAxis[1].data.length - 500)
+
+ }
+
+
+ this.KData.forEach(item => {
+ if (item.openTime.includes("T")) {
+ item.openTime = `${item.openTime.split(`T`)[0]} ${item.openTime.split(`T`)[1].split(`.`)[0]}`
+ }
+
+ })
+ this.params.start = await this.KData[0].openTime
+ this.params.end = await this.KData[this.KData.length - 1].openTime
+ this.fetchVolumeProfile(this.params)//柱状图 根军K线图的开始结束时间进行渲染
+ this.option = handelWatermark(this.option)
+ this.option.xAxis[0].data = []
+ this.option.xAxis[1].data = []
+ this.option.series[0].data = []
+ this.option.series[1].data = []
+ this.KData.forEach(item => {
+ this.option.xAxis[0].data.push(item.openTime)
+ this.option.xAxis[1].data.push(item.openTime)
+ this.option.series[0].data.push([
+ item.openPrice,
+ item.closePrice,
+ item.lowPrice,
+ item.highPrice]
+
+ )
+ this.option.series[1].data.push(item.volume)
+ });
+
+
+ // console.log("执行了嘛");
+ // 处理柱状图颜色
+ // let barColor
+ // if (this.option.series[0].data[0]) {
+ // let arr = this.option.series[0].data.map((item) => {
+ // return [item[0], item[1]];
+ // });
+ // console.log(arr,"哦福利费");
+ // this.option.series[1].itemStyle.color = function (params) {
+
+ // if (
+ // arr[params.dataIndex]&&
+ // Number(arr[params.dataIndex][1] || 0) >=
+ // Number(arr[params.dataIndex][0])
+ // ) {
+ // // console.log( Number(arr[params.dataIndex][1] || 0) >=
+ // // Number(arr[params.dataIndex][0]),Number(arr[params.dataIndex][1]),"哈哈哈哈哈哈");
+ // barColor = "#f64e56";
+ // } else {
+ // barColor = "#54ea92";
+ // }
+
+ // return barColor;
+
+ // };
+ // }
+
+
+ this.inCharts()
+
+
+
+
+ // 监听滚动到数据完结在发起请求
+ this.myChart.on("dataZoom", (e) => {
+ let { start, end } = e.batch[0]
+ this.dataZoomStart = start
+ this.dataZoomEnd = end
+ if (this.dragAndDrop) {//鼠标按下判断当前图表滚动范围是否拖拽 拖拽便重新发起请求
+ if (start <= 26) {
+ this.KlineParams.start = ""
+ this.KlineParams.end = this.KData[0].openTime
+
+ } else if (end >= 74) {
+ this.KlineParams.end = ""
+ this.KlineParams.start = this.KData[this.KData.length - 1].openTime
+ }
+
+ this.fetchKline(this.KlineParams)
+
+ } else {
+
+ if (!this.option.series[0].data[0][0]) {
+ this.option.series[0].data = this.option.series[0].data.slice(500, this.option.series[0].data.length - 500)
+ this.option.series[1].data = this.option.series[1].data.slice(500, this.option.series[1].data.length - 500)
+ this.option.xAxis[0].data = this.option.xAxis[0].data.slice(500, this.option.xAxis[0].data.length - 500)
+ this.option.xAxis[1].data = this.option.xAxis[1].data.slice(500, this.option.xAxis[1].data.length - 500)
+ }
+ }
+ this.inCharts()
+ });
+
+
+
+
+
+ }, 1000),
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchVolumeProfile(this.params)
+
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[5], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[6], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+ this.params.sma = smaDataList
+ this.fetchVolumeProfile(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[5], this.inCharts,this.start, this.end,)
+
+ },
+ //下拉选择
+ handelChang() {
+ this.flagInterval = true
+ this.fetchKline(this.KlineParams)
+
+ },
+
+ //处理时间栏导航
+ handelTimeList(event) {
+ if (!event.target.title) return;
+ this.KlineParams.interval = event.target.title;
+ this.flagInterval = true
+ this.fetchKline(this.KlineParams)
+
+ },
+ //处理弹窗的导航点击
+ handelPopupList(event) {
+ if (!event.target.title) return;
+ this.KlineParams.interval = event.target.title;
+ this.flagInterval = true
+ this.fetchKline(this.KlineParams)
+ },
+ //处理高亮时间显示
+ handelHighlight(data) {
+ if (data) {
+ return this.intervalList.find(item => item.value == data).label
+ }
+ }
+
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/volumeProfileETH/index.vue b/yq/src/views/volumeProfileETH/index.vue
new file mode 100644
index 0000000..0f27074
--- /dev/null
+++ b/yq/src/views/volumeProfileETH/index.vue
@@ -0,0 +1,281 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{$t(`bian.oneMinutes`)}}
+ {{$t(`bian.minutes15`)}}
+ {{$t(`bian.hours4`)}}
+ {{$t(`bian.day`)}}
+ {{$t(`bian.weekly`)}}
+ {{ $t(handelHighlight(KlineParams.interval) ) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/web.vue b/yq/src/views/web.vue
new file mode 100644
index 0000000..d827294
--- /dev/null
+++ b/yq/src/views/web.vue
@@ -0,0 +1,1731 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/wei/index.js b/yq/src/views/wei/index.js
new file mode 100644
index 0000000..0e39e6d
--- /dev/null
+++ b/yq/src/views/wei/index.js
@@ -0,0 +1,292 @@
+import * as echarts from "echarts";
+import { wei } from "../../api/pages"
+import { chartsWidth, emptyData, handelLineType, handelZoom, handelWatermark, handelSwitchs, fetchBtcPrice, fetchEthPrice, handelSmaData, getDateArray } from "../../util/processingData"
+
+export default {
+ data() {
+ return {
+ weiLoading: false,
+ option: {
+ tooltip: {
+ trigger: "axis",
+ //解决tooltip显示不全问题1
+ confine: true,
+ },
+ legend: {
+ right: "100",
+ //处理legengd过长
+ // formatter: function (name) {
+
+ // return echarts.format.truncateText(name, 100, '14px Microsoft Yahei', '…');
+ // },
+ tooltip: {
+ show: true
+ }
+ },
+ xAxis: {
+ // type: "time",
+ boundaryGap: false,
+ // axisLabel: {
+ // formatter: `{yyyy}-{MM}-{dd}`,
+ // },
+ data: []
+ },
+ yAxis: [
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ axisLabel: {
+ formatter: function (e) {
+
+ let value;
+ if (e > 100000000) {
+ value = `${e / 100000000}E`;
+ } else if (e > 1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e >= 10000) {//万
+ value = `${e / 10000}W`;
+ } else if (e < -1000000) {//百万
+ value = `${e / 1000000}M`;
+ } else if (e < -10000) {//万
+ value = `${e / 10000}W`;
+ }
+ else {
+ value = e;
+ }
+ return value;
+ },
+ },
+ min: "dataMin",
+ max: "dataMax",
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ show: true,
+ min: "dataMin",
+ max: "dataMax",
+ position: "right"
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ {
+ type: "value",
+ // boundaryGap: [0, "100%"],
+ min: "dataMin",
+ max: "dataMax",
+ show: false,
+ },
+ ],
+ dataZoom: [
+ {
+ type: "inside",
+ start: 0,
+ end: 100,
+ },
+ {
+ start: 0,
+ end: 100,
+ },
+ ],
+ series: [
+ {
+ name: "Weekly Economic Index",
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ showSymbol: false,
+ symbolSize: 5,
+ // areaStyle: {},
+ itemStyle: {
+ color: "#f7864c",
+ borderColor: "rgba(221,220,107,0.1)",
+ borderWidth: 12,
+ },
+ yAxisIndex: 0,
+ lineStyle: {
+ //线条样式
+ color: "#f7864c",
+ width: "1",
+ },
+ data: [],
+ },
+
+ // {
+ // name: "Price[BTC]",
+ // type: "line",
+ // smooth: false,
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // // areaStyle: {},
+ // itemStyle: {
+ // color: "#888888",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#888888",
+ // width: "1",
+ // },
+ // yAxisIndex: 1,
+ // data: [],
+
+
+ // },
+ // {
+ // name: "Price [ETH]",
+ // type: "line",
+ // smooth: false, //线条是否圆滑
+ // symbol: "circle",
+ // symbolSize: 5,
+ // showSymbol: false,
+ // itemStyle: {
+ // color: "#627eea",
+ // borderColor: "rgba(221,220,107,0.1)",
+ // borderWidth: 12,
+ // },
+ // lineStyle: {
+ // //线条样式
+ // color: "#627eea",
+ // width: "1",
+ // },
+ // yAxisIndex: 4,
+ // data: [],
+ // },
+
+ ],
+ },
+ switch3: "",
+ oldY: null,
+ btcFlag: null,
+ ethFlag: null,
+ fatherSmaData: [],
+ start: "",
+ end: "",
+ params: {
+ start: "",
+ end: "",
+ },
+ zoomStart: 0,
+ zoomEnd: 0,
+
+
+ }
+ },
+ mounted() {
+ this.fetchweiIndicator(this.params)
+ //禁用时间框
+ // this.$addStorageEvent(1, "timeDisable", true);
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.oldY = this.option.yAxis
+
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.$addStorageEvent(1, "zoomStart", this.zoomStart);
+ this.$addStorageEvent(1, "zoomEnd", this.zoomEnd);
+
+ window.addEventListener("setItem", () => {
+ this.ethFlag = JSON.parse(localStorage.getItem("ethFlag"));
+ this.btcFlag = JSON.parse(localStorage.getItem("btcFlag"));
+ this.zoomStart = localStorage.getItem("zoomStart")
+ this.zoomEnd = localStorage.getItem("zoomEnd")
+
+ })
+ },
+ methods: {
+ //初始化图表
+ inCharts() {
+ if (this.myChart == null) {
+ this.myChart = echarts.init(document.getElementById("weiBox"));
+ }
+ this.option = handelZoom(this.myChart, this.option, this, this.zoomStart, this.zoomEnd)
+
+ this.myChart.setOption(this.option);
+ chartsWidth("weiBox", this);
+ window.addEventListener("resize", () => {
+ if (this.myChart) this.myChart.resize();
+ });
+ },
+ async fetchweiIndicator(params) {
+ this.weiLoading = true
+ const { data } = await wei(params)
+
+ let weiEthData = data.data
+
+ //空数据处理
+ let noData = emptyData(data.data, this.option.series, this.inCharts, this)
+ if (noData) {
+ this.weiLoading = false
+ return
+ }
+
+ //添加水印
+ this.option = handelWatermark(this.option)
+
+
+
+ let ValueList = []
+ let timeList = []
+ weiEthData.forEach(item => {
+ ValueList.push(Number(item.value.toFixed(2)))
+ timeList.push(item.date.split("T")[0])
+
+ })
+ this.option.series[0].data = ValueList
+ this.option.xAxis.data = timeList
+
+
+ this.inCharts()
+
+ this.weiLoading = false
+ },
+
+ //接收Home传的时间handelParmesTime
+ handelSonTime(start, end) {
+ this.params.start = start;
+ this.params.end = end;
+ this.fetchweiIndicator(this.params)
+ },
+ //点击对数/线性按钮切换
+ handelLineSwitch() {
+ this.option = handelLineType(this.option, this.oldY)
+ this.switch3 = handelSwitchs(this.option, this.switch3)
+ this.myChart.setOption(this.option);
+
+ },
+ //父级点击BTC价格按钮
+ handelSonBtcPrice(radius, flag) {
+ this.btcFlag = flag
+ fetchBtcPrice("BTC", this.option.series[2], this.start, this.end, this.inCharts, this, this.btcFlag)
+
+ },
+ //父级点击ETH价格按钮
+ handelSonEthPrice(radius, flag) {
+ this.ethFlag = flag
+ fetchEthPrice("ETH", this.option.series[2], this.start, this.end, this.inCharts, this, this.ethFlag)
+ },
+ //父级选择Sma
+ handelSonSma(smaDataList) {
+
+ this.params.sma = smaDataList
+ this.fetchweiIndicator(this.params)
+ this.$addStorageEvent(1, "sma", smaDataList);
+ // this.fatherSmaData = smaDataList
+ // handelSmaData(smaDataList, this.option.series[2], this.inCharts,this.start, this.end,)
+
+ },
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/wei/index.vue b/yq/src/views/wei/index.vue
new file mode 100644
index 0000000..9813e1f
--- /dev/null
+++ b/yq/src/views/wei/index.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yq/src/views/withdrawalDetails/index.js b/yq/src/views/withdrawalDetails/index.js
new file mode 100644
index 0000000..7128694
--- /dev/null
+++ b/yq/src/views/withdrawalDetails/index.js
@@ -0,0 +1,51 @@
+import {getDetail} from "../../api/pay"
+export default {
+ data() {
+ return {
+ formInline: {
+ coin: '',
+ chain: '',
+ amount: '',
+ id:"",
+ userAddress:"",
+ fromAddres:"",
+ balance:"",
+ appliedTime:"",
+ refund:"",
+ refundTime:"",
+ refundTxid:"",
+ message:"",
+ email:"",
+ appliedAddress:"",
+
+
+ },
+ params:{
+ id:""
+ }
+
+
+ }
+ },
+ mounted() {
+
+ this.params.id = this.$route.query.id
+ this.fetchWithdrawalDetails(this.params)
+
+ },
+ methods: {
+ //请求提交充值
+ async fetchWithdrawalDetails(params){
+ // this.RechargeLoading=true
+ const {data} = await getDetail(params)
+ console.log(data,"及哦飞机佛");
+ this.formInline =data.data
+ this.formInline.appliedTime = `${this.formInline.appliedTime.split(`T`)[0]} ${this.formInline.appliedTime.split(`T`)[1].split(`.`)[0]}`
+ this.formInline.refundTime = `${this.formInline.refundTime.split(`T`)[0]} ${this.formInline.refundTime.split(`T`)[1].split(`.`)[0]}`
+
+ // this.RechargeLoading=false
+ },
+
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/withdrawalDetails/index.vue b/yq/src/views/withdrawalDetails/index.vue
new file mode 100644
index 0000000..5f99219
--- /dev/null
+++ b/yq/src/views/withdrawalDetails/index.vue
@@ -0,0 +1,170 @@
+
+
+
+
{{ $t(`pay.withdrawalDetails`) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/views/withdrawalRecords/index.js b/yq/src/views/withdrawalRecords/index.js
new file mode 100644
index 0000000..7434273
--- /dev/null
+++ b/yq/src/views/withdrawalRecords/index.js
@@ -0,0 +1,65 @@
+import { Pravite } from "../../api/pay"
+import { GetUserAccount } from "../../api/help"
+import { Debounce } from "../../util/processingData"
+export default {
+ data() {
+ return {
+ params: {
+ page: "1",
+ limit: "300",
+ status: "",
+ },
+ PendingData: [],
+ successData: [],
+ failData: [],
+ withdrawalRecords: false,
+ activeName:"pending"
+
+ }
+ },
+ mounted() {
+ this.fetchWithdrawal0({ page: 1, limit: 300, status: 0 })
+ this.fetchWithdrawal1({ page: 1, limit: 300, status: 1 })
+ this.fetchWithdrawal2({ page: 1, limit: 300, status: 2 })
+ },
+ methods: {
+ //请求失败订单
+ async fetchWithdrawal0(params) {
+ this.withdrawalRecords = true
+ const { data } = await Pravite(params)
+
+ this.failData = data.rows
+ this.withdrawalRecords = false
+
+ },
+ //请求成功订单
+ async fetchWithdrawal1(params) {
+
+ const { data } = await Pravite(params)
+ this.successData = data.rows
+
+
+
+ },
+ //请求待处理订单
+ async fetchWithdrawal2(params) {
+ const { data } = await Pravite(params)
+ this.PendingData = data.rows
+
+ },
+ handelTime(date) {
+ if (date) {
+ return `${date.split("T")[0]} ${date.split("T")[1].split(".")[0]}`
+ }
+ },
+
+ //点击刷新
+ handelRefresh: Debounce(function(){
+ this.fetchWithdrawal0({ page: 1, limit: 300, status: 0 })
+ this.fetchWithdrawal1({ page: 1, limit: 300, status: 1 })
+ this.fetchWithdrawal2({ page: 1, limit: 300, status: 2 })
+ }, 1000)
+
+
+ }
+}
\ No newline at end of file
diff --git a/yq/src/views/withdrawalRecords/index.vue b/yq/src/views/withdrawalRecords/index.vue
new file mode 100644
index 0000000..45fb4e2
--- /dev/null
+++ b/yq/src/views/withdrawalRecords/index.vue
@@ -0,0 +1,282 @@
+
+
+
+
+
+ {{ $t(`pay.withdrawalRecords`) }}
+
+
+
+
+
+
+
+
+
+ {{ $t(`pay.pendingProcessing`) }}
+
+
+
+
+
+ {{ handelTime(scope.row.appliedTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`pay.refundTime`) }}
+
+
+
+ {{ handelTime(scope.row.refundTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`pay.successfulOrder`) }}
+
+
+
+
+
+ {{ handelTime(scope.row.appliedTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`pay.refundTime`) }}
+
+
+
+ {{ handelTime(scope.row.refundTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`pay.withdrawalFailed`) }}
+
+
+
+
+
+ {{ handelTime(scope.row.appliedTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(`pay.refundTime`) }}
+
+
+
+ {{ handelTime(scope.row.refundTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yq/src/webscoket/index.js b/yq/src/webscoket/index.js
new file mode 100644
index 0000000..0659456
--- /dev/null
+++ b/yq/src/webscoket/index.js
@@ -0,0 +1,179 @@
+// import store from '@/store/index'
+// import {NotificationBackend} from '@/api/index'
+
+class webscoketUtill {
+ constructor(url = '') {
+ //连接地址
+ this.url = url
+ //连接器
+ this.ws = null
+ //避免重复连接
+ this.is_open_scoket = false
+ //心跳
+ this.heartbeatMessage = 0
+ //心跳时间
+ this.timeout = 150*1000
+ //心跳定时器
+ this.heartbeatInterval = null
+ //重连次数
+ this.reconnectionTimes = 9
+ //多久重连一次
+ this.reconnectionTimeout = null
+ //连接次数
+ this.numberConnections = 0
+
+ try {
+ this.init()
+ } catch (e) {
+ throw new Error(e)
+ }
+
+ }
+
+ init() {
+
+ //判断是否有连接
+ if (this.ws) {
+ this.ws.close()
+ }
+ //创建webscoket
+ this.ws = new WebSocket(this.url)
+ //监听链接是否成功
+ this.ws.onopen = (e) => {
+ this.is_open_scoket = true
+ this.numberConnections = 0
+ clearInterval(this.heartbeatInterval)
+ clearTimeout(this.reconnectionTimeout)
+ this.heartbeat()
+ this.onmessage()
+ this.onclose()
+ let obj = {
+ id: 1,
+ channel: "check"
+ }
+ this.ws.send(JSON.stringify(obj))
+
+
+ }
+ this.onerror()
+ }
+
+ //接收后端信息
+ onmessage(handelData) {
+
+ this.ws.onmessage = (res) => {
+ // if (this.isJSON(res.data)) {
+ // return e
+ // // let data = JSON.parse(e.data)
+ // // if (data.code === 201) {
+ // // NotificationBackend({
+ // // symbol: store.state.currency,
+ // // time: '30s',
+ // // client_id: data.data.client_id
+ // // })
+ // // }
+ // // if (data.code === 202) {
+ // // let arr = []
+ // // data.data.history.forEach(item => {
+ // // arr.push(JSON.parse(item))
+ // // })
+ // // store.commit({
+ // // type: 'on_K_line_array',
+ // // data: arr
+ // // })
+ // // }
+ // // if (data.code === 203) {
+ // // store.commit({
+ // // type: 'onSecondData',
+ // // data: JSON.parse(data.data)
+ // // })
+ // // }
+ // // if (data.code === 204) {
+ // // store.commit({
+ // // type: 'onBranchData',
+ // // data: data.data || false
+ // // })
+ // // }
+ // }
+ }
+
+ }
+
+ //发送消息
+ send(val) {
+ let str = ''
+ if (typeof val === 'string') {
+ str = val
+ } else {
+ str = JSON.stringify(val)
+ }
+ this.ws.send(str)
+ }
+
+ //检测心跳
+ heartbeat() {
+ this.heartbeatInterval = setInterval(() => {
+ this.send(JSON.stringify("ping"))
+ }, this.timeout)
+ }
+
+ //重连
+ reconnection() {
+ clearInterval(this.heartbeatInterval)
+ clearTimeout(this.reconnectionTimeout)
+ if (!this.is_open_scoket) {
+ if (this.numberConnections < this.reconnectionTimes) {
+ this.close()
+ this.init()
+ this.numberConnections++
+ this.reconnectionTimeout = setTimeout(() => {
+ this.reconnection()
+ }, 3000)
+ }
+ }
+ }
+
+ //后端连接断开
+ onclose() {
+ this.ws.onclose = (e) => {
+ this.is_open_scoket = false
+ this.reconnection()
+ }
+ }
+
+ close() {
+ this.send({
+ code: 2,
+ data: '我已关闭!'
+ })
+ this.ws.close()
+
+ }
+
+ //连接失败
+ onerror() {
+ console.log(123)
+ this.ws.onerror = (e) => {
+ this.is_open_scoket = false
+ this.reconnection()
+ }
+ }
+
+ //判断是否是json
+ isJSON(str) {
+ if (typeof str === 'string') {
+ try {
+ let obj = JSON.parse(str)
+ if (typeof obj === 'object' && obj) {
+ return true
+ } else {
+ return false
+ }
+ } catch (e) {
+ return false
+ }
+ }
+ }
+}
+
+export default webscoketUtill
\ No newline at end of file
diff --git a/yq/src/webscoket/index1.js b/yq/src/webscoket/index1.js
new file mode 100644
index 0000000..9b13b02
--- /dev/null
+++ b/yq/src/webscoket/index1.js
@@ -0,0 +1,130 @@
+//webscoket
+class newWebScoket {
+ //初始化时自调用 构造函数
+ constructor(url = "", time = 3000) {
+ //连接地址
+ this.url = url
+ //连接器
+ this.ws = null
+ //避免重复连接
+ this.is_open_scoket = false
+ //心跳定时器
+ this.heartbeatTimer = null
+ //心跳时间
+ this.heartbeatTime = time > 2000 ? time : 3000
+ //检测心跳定时器
+ this.heartbeatDetectionTimer = null
+ //心跳回复
+ this.heartbeatRecovery = 0
+ //重连定时器
+ this.reconnectionTimer = null
+ //重连次数
+ this.timesReconnection = 9
+ //已连接次数
+ this.connectedTimes = 0
+ try {
+ this.init()
+ } catch (error) {
+
+ }
+ }
+ //初始化创建连接器函数,(函数名自定义)
+ init() {
+ //创建连接器
+ this.ws = new WebSocket(this.url)
+ //连接成功时触发
+ this.ws.onopen = (e) => {
+ clearInterval(this.heartbeatTimer)
+ clearTimeout(this.heartbeatDetectionTimer)
+ clearInterval(this.reconnectionTimer)
+ this.is_open_scoket = true
+ this.onMessage()//连接成功确认心跳回复并赋值
+ this.heartbeat()//开启心跳
+ }
+ }
+ onMessage() {
+ this.ws.onmessage = (e) => {
+ if (this.isJSON(e.data)) {
+ let { code, data } = JSON.parse(e.data)
+ if (code === 1) {
+ this.heartbeatRecovery = 1
+ }
+ }
+ }
+ }
+ //发送消息
+ onSend(obj) {
+ if (Object.prototype.toString.call(obj) !== '[object String]') {
+ obj = JSON.stringify(obj)
+ }
+ this.ws.send(obj)
+ }
+ //心跳
+ heartbeat() {
+ this.heartbeatTimer = setInterval(() => {
+ let data = {
+ code: 1,
+ msg: '心跳信息'
+ }
+ this.onSend(data)//发送心跳内容
+ this.heartbeatDetection()//检测心跳
+ }, this.heartbeatTime)
+ }
+ //检测心跳
+ heartbeatDetection() {
+ this.heartbeatDetectionTimer = setTimeout(() => {
+ if (this.heartbeatRecovery === 0) {
+ //开启重连机制
+ this.is_open_scoket = false
+ this.reconnection()//心跳信息等于0 就重连
+ }
+ }, 1000)
+ }
+ //重连
+ reconnection() {
+ if (!this.is_open_scoket) {
+ //连接了9次以后就直接关闭
+ if(this.connectedTimes === this.timesReconnection){
+ this.onClose()
+ return
+ }
+ this.connectedTimes++
+ this.onClose()
+ this.init()
+ this.reconnectionTimer = setInterval(() => {
+ if (this.connectedTimes < this.timesReconnection) {
+ this.reconnection()
+ }else{
+ this.onClose()
+ }
+ }, 3000)
+
+ }
+ }
+ //关闭
+ onClose() {
+ clearInterval(this.heartbeatTimer)
+ clearTimeout(this.heartbeatDetectionTimer)
+ clearInterval(this.reconnectionTimer)
+ this.is_open_scoket = false
+ this.ws.close()
+ }
+ //判断是否是json
+ isJSON(str) {
+ if (typeof str === 'string') {
+ try {
+ let obj = JSON.parse(str)
+ if (typeof obj === 'object' && obj) {
+ return true
+ } else {
+ return false
+ }
+ } catch (e) {
+ return false
+ }
+ } else {
+ return false
+ }
+ }
+}
+export default newWebScoket
\ No newline at end of file
diff --git a/yq/vue.config.js b/yq/vue.config.js
new file mode 100644
index 0000000..f5dee02
--- /dev/null
+++ b/yq/vue.config.js
@@ -0,0 +1,134 @@
+
+
+
+
+
+const path = require('path');
+const PrerenderSPAPlugin = require('@dreysolano/prerender-spa-plugin');
+const Renderer = PrerenderSPAPlugin.PuppeteerRenderer;
+const SitemapWebpackPlugin = require('sitemap-webpack-plugin').default;
+
+const getProxyConfig = () => {
+ return {
+ "/api": {
+ target: "https://fapi.binance.com",
+ onProxyRes(proxyRes, req, res) {
+ const realUrl = new URL(req.url || '', "https://fapi.binance.com")?.href || '';
+ proxyRes.headers['x-real-url'] = realUrl;
+ },
+ pathRewrite: { "^/api": "" },
+ changeOrigin: true,
+ },
+ };
+};
+
+const createPrerenderPlugin = () => {
+ return new PrerenderSPAPlugin({
+ staticDir: path.join(__dirname, 'dist'),
+ routes: ['/', '/IndexIntroduce', '/dataDisplay', '/personal', '/Alarm', '/help'],
+ timeout: 10000,
+ renderer: new Renderer({
+ headless: true,
+ inject: {
+ foo: 'bar',
+ },
+ }),
+ postProcess(context) {
+ console.log(`Rendering route: ${context.route}`);
+ return context;
+ },
+ });
+};
+
+module.exports = (config) => {
+ const devServerProxy = getProxyConfig();
+
+ if (process.env.NODE_ENV === 'production') {
+ const prerenderPlugin = createPrerenderPlugin();
+
+ const paths = [
+ {
+ path: '/',
+ lastmod: new Date().toISOString(),
+ priority: 1.0,
+ changefreq: 'daily'
+ },
+ {
+ path: '/IndexIntroduce',
+ lastmod: new Date().toISOString(),
+ priority: 0.8,
+ changefreq: 'weekly'
+ },
+ {
+ path: '/dataDisplay',
+ lastmod: new Date().toISOString(),
+ priority: 0.8,
+ changefreq: 'weekly'
+ },
+ {
+ path: '/personal',
+ lastmod: new Date().toISOString(),
+ priority: 0.6,
+ changefreq: 'weekly'
+ },
+ {
+ path: '/Alarm',
+ lastmod: new Date().toISOString(),
+ priority: 0.7,
+ changefreq: 'weekly'
+ },
+ {
+ path: '/help',
+ lastmod: new Date().toISOString(),
+ priority: 0.6,
+ changefreq: 'weekly'
+ }
+ ];
+
+ const sitemapPlugin = new SitemapWebpackPlugin({
+ base: 'https://coinbus.cc',
+ paths,
+ options: {
+ filename: 'sitemap.xml',
+ lastmod: true,
+ skipgzip: true, // 不生成 .gz 文件
+ formatter: null, // 使用默认 formatter
+ xmlNs: 'http://www.sitemaps.org/schemas/sitemap/0.9', // 添加正确的 XML 命名空间
+ headers: {
+ 'Content-Type': 'application/xml; charset=utf-8'
+ }
+ }
+ });
+
+
+
+ return {
+ publicPath: '/',
+ devServer: {
+ proxy: devServerProxy
+ },
+ chainWebpack: (config) => {
+ if (prerenderPlugin) {
+ config.plugin('prerender').use(prerenderPlugin);
+ }
+ if (sitemapPlugin) {
+ config.plugin('sitemap').use(sitemapPlugin);
+ }
+ },
+ configureWebpack: {
+ plugins: [
+ sitemapPlugin
+ ]
+ },
+ lintOnSave: false
+ };
+ } else {
+ return {
+ publicPath: '/',
+ devServer: {
+ proxy: devServerProxy
+ },
+ lintOnSave: false
+ };
+ }
+};
\ No newline at end of file