Compare commits
346 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3ac9ffc73c | |||
| 5ea963fb93 | |||
| c420ae467f | |||
| be014225c1 | |||
| 8334fe5bcc | |||
| f99edce6f4 | |||
| 936d78975e | |||
| a25f9bc5a1 | |||
| 5454f19f3d | |||
| b95cf946a8 | |||
| 1b9a3f6f5b | |||
| d91cd00310 | |||
| e4f821f46d | |||
| ed5a452e2f | |||
| 907a0afb77 | |||
| b32c718780 | |||
| adbdad1e88 | |||
| f8229a0518 | |||
| 48f00e44f6 | |||
| 8c089b800a | |||
| 44199fa4c4 | |||
| 5e20689356 | |||
| 9a9b752a96 | |||
| 1ddf056ca6 | |||
| 572ab73c92 | |||
| afc8f907ce | |||
| f6bad1513b | |||
| fce514c490 | |||
| 30a9deaee7 | |||
| f47acca703 | |||
| 73a6c6b920 | |||
| 672f7a0a7c | |||
| 32762aa8a7 | |||
| c35dd6fad9 | |||
| de78fb2149 | |||
| 8d05953b8b | |||
| afed1cb6b3 | |||
| f6a4e87e05 | |||
| e36265a2f4 | |||
| 4a59e69bbe | |||
| a442e13a7b | |||
| 4d093a4a80 | |||
| 3dd94fb408 | |||
| 7e59d8d36c | |||
| bb46050bb3 | |||
| b50620ec2c | |||
| 7bef69af92 | |||
| 8241077495 | |||
| 82b29a2f8b | |||
| b789d80f98 | |||
| a8c80e2366 | |||
| ae8fcd640b | |||
| 455f3ff09a | |||
| e4afaded36 | |||
| a10409f829 | |||
| 112138fdc5 | |||
| 73e5ca59df | |||
| 38f92febb7 | |||
| cd6f1e0438 | |||
| 1d73f71aaf | |||
| e4e77cd141 | |||
| e0e7270623 | |||
| 885c376e2a | |||
| 2845e9829d | |||
| 36b82de301 | |||
| a2ac99e7cb | |||
| d037e1ff36 | |||
| 9d4424356d | |||
| f087a0766b | |||
| 0bb7400755 | |||
| 6460c475b6 | |||
| f8b645f867 | |||
| 834b330bc8 | |||
| a4b4ce57bd | |||
| ff7a0830d0 | |||
| ff43d0c2d8 | |||
| bad4b5d7b3 | |||
| adaf30dd3b | |||
| c0fc84061e | |||
| b84ad0f598 | |||
| aa0569ef4b | |||
| b88d90cb80 | |||
| c055129309 | |||
| 30351cecb5 | |||
| 4f6757fff2 | |||
| 284fdb8e05 | |||
| 738bcae563 | |||
| 987a68a6d1 | |||
| bdbdd37789 | |||
| c8fb5b9152 | |||
| 59cb5d609d | |||
| 4add9ce4c6 | |||
| c75d9f7a59 | |||
| 2d94085c54 | |||
| 2a6e5915f5 | |||
| 656532e43d | |||
| d835a904c9 | |||
| a5bf0e9f6a | |||
| 7e3efa46ee | |||
| ce68910e48 | |||
| 6dce639a0e | |||
| c738103fec | |||
| 801f298448 | |||
| e08a7723b6 | |||
| 166b5b98e8 | |||
| 07e56631da | |||
| 1435789a6c | |||
| 7c5fa7610d | |||
| 084e680e12 | |||
| 380a6b95b7 | |||
| 9467feff23 | |||
| a6f4267915 | |||
| cfe9efd4dd | |||
| 971b03620a | |||
| 92339dae28 | |||
| c84f6d9c33 | |||
| e187c012cc | |||
| af1c280f28 | |||
| aef155e039 | |||
| 016e48cc69 | |||
| 6dcd39983f | |||
| b055b6c511 | |||
| 293259a97d | |||
| 7584c79519 | |||
| d9bb0bf61d | |||
| cbb401840c | |||
| 1d18c86dc7 | |||
| f8b8624244 | |||
| 443573455b | |||
| 785a4d97f7 | |||
| d811ab7dfa | |||
| 5f79ab6e6d | |||
| 502edbca5d | |||
| 9da073e838 | |||
| 1a04267cb7 | |||
| 9c2c1bdfa1 | |||
| 1764c0de08 | |||
| 79fd809993 | |||
| d3a0d36c92 | |||
| 0841e632c2 | |||
| d8f8ef032d | |||
| b7f84dbb0d | |||
| 17f1a7ce9d | |||
| ca69331286 | |||
| 8258ad21d7 | |||
| 2a129d0ee3 | |||
| e391520ce3 | |||
| 3e8329c31f | |||
| 19d7b1be77 | |||
| ee8a05b6e6 | |||
| 111f5bdcfb | |||
| 4c1b955bd5 | |||
| ad6614e338 | |||
| 57c730a7eb | |||
| e1ec5d15ee | |||
| 4496e17d45 | |||
| 28668f2acb | |||
| 87440362ac | |||
| f470817c01 | |||
| 4d9330983a | |||
| edecfc7116 | |||
| d4f3b97b3d | |||
| 48d17f9244 | |||
| a96fa8f4b7 | |||
| a81c6e1756 | |||
| b3255ab28b | |||
| 75b5103637 | |||
| ddee71fc0d | |||
| 18ea1a575c | |||
| 3e4cc376f9 | |||
| f17c22793b | |||
| 965f734618 | |||
| fc1258319e | |||
| 7d17e2b332 | |||
| 5a79fc4f2d | |||
| db8fd7582b | |||
| daa6458a26 | |||
| b6ac93ae63 | |||
| 87e7c4bee2 | |||
| 4adc46dd79 | |||
| 73f6d6a622 | |||
| b98c3166f2 | |||
| b7503a841a | |||
| 0eb3123848 | |||
| a637cd783c | |||
| 8530e9bc5e | |||
| f18c05519d | |||
| cbeddb2460 | |||
| be84e64f00 | |||
| 34210104d4 | |||
| 035586c9ef | |||
| 7f52ef9843 | |||
| ca9b33da88 | |||
| c7f64ceb00 | |||
| 11d4f86551 | |||
| 00aaf3427a | |||
| 3e72a0e440 | |||
| 72e93f3768 | |||
| 0a1023f795 | |||
| 71471bac27 | |||
| 972c92519c | |||
| 617b940d64 | |||
| 8d36a857eb | |||
| 59ff14aec4 | |||
| 3c39d5db9d | |||
| 3980cc584f | |||
| 2167525312 | |||
| e724822198 | |||
| 0d1abd00a1 | |||
| 62aec195ea | |||
| 9692945716 | |||
| b8dab8c87d | |||
| a6646be66b | |||
| 8cfb54aab1 | |||
| 960f3aa3cf | |||
| 43f35de27a | |||
| d39ce294b8 | |||
| e7349bfae9 | |||
| ad1ff249aa | |||
| 3fed2bb5e0 | |||
| 67995ac461 | |||
| 39d9aa1896 | |||
| 895fd25627 | |||
| 7582cac69a | |||
| 790917eaf2 | |||
| 18d83f161e | |||
| 42e9e5edce | |||
| 31450e0eac | |||
| 34d799049d | |||
| 92bf26ced5 | |||
| 6214c17903 | |||
| f1e801340f | |||
| 4105883ab6 | |||
| feb39bde44 | |||
| ae4ae074d8 | |||
| 2ed1b4bf23 | |||
| e6f2066d42 | |||
| e4ed2392bb | |||
| ae32b9838b | |||
| f126fc3d04 | |||
| 3ac03973fb | |||
| 96384d7b39 | |||
| 20f720bf27 | |||
| 2812c39524 | |||
| 642de9a78c | |||
| b8a1fd904b | |||
| 31c63130d6 | |||
| 6a7c2bca9a | |||
| 491485856e | |||
| 369a8ade42 | |||
| 6e19ed2dce | |||
| abde7e176d | |||
| bab8faadee | |||
| ed5dd5e122 | |||
| 854ff4b888 | |||
| 9bdf42a057 | |||
| ad60b7b44c | |||
| 58033530c1 | |||
| fa0c570f90 | |||
| 73bb93f166 | |||
| 427d72fb8b | |||
| 696a363591 | |||
| dc5b20a329 | |||
| 4cb934eef3 | |||
| 45737c8f7a | |||
| 25077b91ca | |||
| 35e8cea0b5 | |||
| 8487a1b159 | |||
| 4141d00409 | |||
| 924a173d6b | |||
| 368ae13db6 | |||
| 5c5c0b02df | |||
| 888ad61cf2 | |||
| cfa7f59b0b | |||
| 3fc6012145 | |||
| 463b14736f | |||
| d37034cb52 | |||
| c9d61128bf | |||
| 810f4d8e6d | |||
| 1bd0f516e2 | |||
| 336ef369cc | |||
| efcb25153e | |||
| f8aafd0e0b | |||
| fdb19fb310 | |||
| d497e17a7d | |||
| 287097ceed | |||
| 789f24d89d | |||
| 8c370c550e | |||
| d8fa5784bf | |||
| 1baa18888f | |||
| 9644b22896 | |||
| 5312ba5a45 | |||
| 545e9f6571 | |||
| 42093e2a32 | |||
| f7d23ff830 | |||
| 049d3fb911 | |||
| 18947db22b | |||
| dbd49a05bd | |||
| df07169005 | |||
| 21fe89adf6 | |||
| 49956d32cc | |||
| b75667d92c | |||
| c9848e7b01 | |||
| e2cda9140b | |||
| e091eb7b64 | |||
| aa3a5fbf84 | |||
| f1ed9c848a | |||
| c2bcc51797 | |||
| 2c7192b40c | |||
| 6b81559d4c | |||
| 15e9a0c0f5 | |||
| 8085640ea6 | |||
| 5eb851fc82 | |||
| 24ede6ac4f | |||
| d39a8c293f | |||
| c44dd111db | |||
| 5763ff0d57 | |||
| 76f4a73525 | |||
| bf45cd607d | |||
| 9c0f1f793f | |||
| 674131a0ae | |||
| 43438594d2 | |||
| 5af0b60644 | |||
| 35313f2ce8 | |||
| d01b8b2b15 | |||
| 8f061e5c3b | |||
| 0c596c69cf | |||
| 390eec99a2 | |||
| fe77d88936 | |||
| e4bc388faa | |||
| 255c47a8e1 | |||
| 03f8dee9d4 | |||
| 2b34a01845 | |||
| 4e435d4f29 | |||
| 89a6e5db20 | |||
| f43f744c3e | |||
| 7b9ca460a6 | |||
| 1c0a923771 | |||
| 76112345f2 | |||
| 7985db16f1 | |||
| bec5868068 | |||
| ac8d77a53f | |||
| 826d294690 | |||
| 23075b7bdd | |||
| 096d63cbac | |||
| acc9dc7751 |
@@ -9,16 +9,22 @@ module.exports = {
|
|||||||
sourceType: 'module',
|
sourceType: 'module',
|
||||||
ecmaFeatures: {
|
ecmaFeatures: {
|
||||||
jsx: true,
|
jsx: true,
|
||||||
tsx: true,
|
tsx: true
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
env: {
|
env: {
|
||||||
node: true,
|
node: true,
|
||||||
|
// The Follow config only works with eslint-plugin-vue v8.0.0+
|
||||||
|
'vue/setup-compiler-macros': true
|
||||||
},
|
},
|
||||||
extends: ["plugin:vue/vue3-essential", "eslint:recommended"],
|
extends: ['plugin:vue/vue3-essential', 'eslint:recommended'],
|
||||||
rules: {
|
rules: {
|
||||||
"no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
|
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
||||||
"no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
|
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
||||||
},
|
'no-unused-vars': 'off',
|
||||||
};
|
'vue/no-unused-vars': 'off',
|
||||||
|
'vue/multi-word-component-names': 'off',
|
||||||
|
'vue/valid-template-root': 'off',
|
||||||
|
'vue/no-mutating-props': 'off'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,51 @@
|
|||||||
|
version: '1.0'
|
||||||
|
name: branch-pipeline
|
||||||
|
displayName: BranchPipeline
|
||||||
|
stages:
|
||||||
|
- stage:
|
||||||
|
name: compile
|
||||||
|
displayName: 编译
|
||||||
|
steps:
|
||||||
|
- step: build@nodejs
|
||||||
|
name: build_nodejs
|
||||||
|
displayName: Nodejs 构建
|
||||||
|
# 支持8.16.2、10.17.0、12.16.1、14.16.0、15.12.0五个版本
|
||||||
|
nodeVersion: 14.16.0
|
||||||
|
# 构建命令:安装依赖 -> 清除上次打包产物残留 -> 执行构建 【请根据项目实际产出进行填写】
|
||||||
|
commands:
|
||||||
|
- npm install && rm -rf ./dist && npm run build
|
||||||
|
# 非必填字段,开启后表示将构建产物暂存,但不会上传到制品库中,7天后自动清除
|
||||||
|
artifacts:
|
||||||
|
# 构建产物名字,作为产物的唯一标识可向下传递,支持自定义,默认为BUILD_ARTIFACT。在下游可以通过${BUILD_ARTIFACT}方式引用来获取构建物地址
|
||||||
|
- name: BUILD_ARTIFACT
|
||||||
|
# 构建产物获取路径,是指代码编译完毕之后构建物的所在路径
|
||||||
|
path:
|
||||||
|
- ./dist
|
||||||
|
- step: publish@general_artifacts
|
||||||
|
name: publish_general_artifacts
|
||||||
|
displayName: 上传制品
|
||||||
|
# 上游构建任务定义的产物名,默认BUILD_ARTIFACT
|
||||||
|
dependArtifact: BUILD_ARTIFACT
|
||||||
|
# 上传到制品库时的制品命名,默认output
|
||||||
|
artifactName: output
|
||||||
|
dependsOn: build_nodejs
|
||||||
|
- stage:
|
||||||
|
name: release
|
||||||
|
displayName: 发布
|
||||||
|
steps:
|
||||||
|
- step: publish@release_artifacts
|
||||||
|
name: publish_release_artifacts
|
||||||
|
displayName: '发布'
|
||||||
|
# 上游上传制品任务的产出
|
||||||
|
dependArtifact: output
|
||||||
|
# 发布制品版本号
|
||||||
|
version: '1.0.0.0'
|
||||||
|
# 是否开启版本号自增,默认开启
|
||||||
|
autoIncrement: true
|
||||||
|
triggers:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
exclude:
|
||||||
|
- master
|
||||||
|
include:
|
||||||
|
- .*
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
version: '1.0'
|
||||||
|
name: master-pipeline
|
||||||
|
displayName: MasterPipeline
|
||||||
|
stages:
|
||||||
|
- stage:
|
||||||
|
name: compile
|
||||||
|
displayName: 编译
|
||||||
|
steps:
|
||||||
|
- step: build@nodejs
|
||||||
|
name: build_nodejs
|
||||||
|
displayName: Nodejs 构建
|
||||||
|
# 支持8.16.2、10.17.0、12.16.1、14.16.0、15.12.0五个版本
|
||||||
|
nodeVersion: 14.16.0
|
||||||
|
# 构建命令:安装依赖 -> 清除上次打包产物残留 -> 执行构建 【请根据项目实际产出进行填写】
|
||||||
|
commands:
|
||||||
|
- npm install && rm -rf ./dist && npm run build
|
||||||
|
# 非必填字段,开启后表示将构建产物暂存,但不会上传到制品库中,7天后自动清除
|
||||||
|
artifacts:
|
||||||
|
# 构建产物名字,作为产物的唯一标识可向下传递,支持自定义,默认为BUILD_ARTIFACT。在下游可以通过${BUILD_ARTIFACT}方式引用来获取构建物地址
|
||||||
|
- name: BUILD_ARTIFACT
|
||||||
|
# 构建产物获取路径,是指代码编译完毕之后构建物的所在路径
|
||||||
|
path:
|
||||||
|
- ./dist
|
||||||
|
- step: publish@general_artifacts
|
||||||
|
name: publish_general_artifacts
|
||||||
|
displayName: 上传制品
|
||||||
|
# 上游构建任务定义的产物名,默认BUILD_ARTIFACT
|
||||||
|
dependArtifact: BUILD_ARTIFACT
|
||||||
|
# 上传到制品库时的制品命名,默认output
|
||||||
|
artifactName: output
|
||||||
|
dependsOn: build_nodejs
|
||||||
|
- stage:
|
||||||
|
name: release
|
||||||
|
displayName: 发布
|
||||||
|
steps:
|
||||||
|
- step: publish@release_artifacts
|
||||||
|
name: publish_release_artifacts
|
||||||
|
displayName: '发布'
|
||||||
|
# 上游上传制品任务的产出
|
||||||
|
dependArtifact: output
|
||||||
|
# 发布制品版本号
|
||||||
|
version: '1.0.0.0'
|
||||||
|
# 是否开启版本号自增,默认开启
|
||||||
|
autoIncrement: true
|
||||||
|
triggers:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
include:
|
||||||
|
- master
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
version: '1.0'
|
||||||
|
name: pr-pipeline
|
||||||
|
displayName: PRPipeline
|
||||||
|
stages:
|
||||||
|
- stage:
|
||||||
|
name: compile
|
||||||
|
displayName: 编译
|
||||||
|
steps:
|
||||||
|
- step: build@nodejs
|
||||||
|
name: build_nodejs
|
||||||
|
displayName: Nodejs 构建
|
||||||
|
# 支持8.16.2、10.17.0、12.16.1、14.16.0、15.12.0五个版本
|
||||||
|
nodeVersion: 14.16.0
|
||||||
|
# 构建命令:安装依赖 -> 清除上次打包产物残留 -> 执行构建 【请根据项目实际产出进行填写】
|
||||||
|
commands:
|
||||||
|
- npm install && rm -rf ./dist && npm run build
|
||||||
|
# 非必填字段,开启后表示将构建产物暂存,但不会上传到制品库中,7天后自动清除
|
||||||
|
artifacts:
|
||||||
|
# 构建产物名字,作为产物的唯一标识可向下传递,支持自定义,默认为BUILD_ARTIFACT。在下游可以通过${BUILD_ARTIFACT}方式引用来获取构建物地址
|
||||||
|
- name: BUILD_ARTIFACT
|
||||||
|
# 构建产物获取路径,是指代码编译完毕之后构建物的所在路径
|
||||||
|
path:
|
||||||
|
- ./dist
|
||||||
|
- step: publish@general_artifacts
|
||||||
|
name: publish_general_artifacts
|
||||||
|
displayName: 上传制品
|
||||||
|
# 上游构建任务定义的产物名,默认BUILD_ARTIFACT
|
||||||
|
dependArtifact: BUILD_ARTIFACT
|
||||||
|
# 上传到制品库时的制品命名,默认output
|
||||||
|
artifactName: output
|
||||||
|
dependsOn: build_nodejs
|
||||||
|
triggers:
|
||||||
|
pr:
|
||||||
|
branches:
|
||||||
|
include:
|
||||||
|
- master
|
||||||
@@ -1,30 +1,34 @@
|
|||||||
## 总览
|
## 总览
|
||||||
|
|
||||||

|
<p align="center">
|
||||||
|
<img src="readme/logo-t-y.png" alt="go-view" />
|
||||||
|
</p>
|
||||||
|
|
||||||
GoView 是一个高效的拖拽式低代码数据可视化开发平台,将图表或页面元素封装为基础组件,无需编写代码即可制作数据大屏,减少心智负担。若您需商用请添加底部的 QQ 交流群,并联系群主(即作者本人)
|
<h4 align="center">开源、精美、便捷的「数据可视化」低代码开发平台</h4>
|
||||||
|
|
||||||
### 😶 纯 **前端** 分支: **`master`**
|
#### 😶 **纯前端** 分支: **`master`**
|
||||||
|
|
||||||
### 👻 携带 **后端** 请求分支: **`master-fetch`**
|
#### 👻 携带 **后端** 请求分支: **`master-fetch`**
|
||||||
|
|
||||||
### 📚 GoView **文档** 地址:[http://www.mtruning.club:81/](http://www.mtruning.club:81/)
|
#### 📚 GoView **文档** 地址:[https://www.mtruning.club/](https://www.mtruning.club/)
|
||||||
|
|
||||||
项目纯前端-Demo 地址:[https://www.mtruning.club](https://www.mtruning.club)
|
项目纯前端-Demo 地址:[https://vue.mtruning.club/](https://vue.mtruning.club/)
|
||||||
|
|
||||||
项目带后端-Demo 地址:[后端 Demo 地址](http://1.117.240.165:8080/goview/#/login)
|
项目带后端-Demo 地址:[https://demo.mtruning.club/](https://demo.mtruning.club/)
|
||||||
|
|
||||||
文档-在线地址:[http://www.mtruning.club:81/](http://www.mtruning.club:81/)
|
|
||||||
|
|
||||||
文档-源码地址:[https://gitee.com/MTrun/go-view-doc](https://gitee.com/MTrun/go-view-doc)
|
文档-源码地址:[https://gitee.com/MTrun/go-view-doc](https://gitee.com/MTrun/go-view-doc)
|
||||||
|
|
||||||
### 🤯 后端项目
|
#### 🤯 后端项目看这里!
|
||||||
|
|
||||||
后端项目gitee地址:[https://gitee.com/MTrun/go-view-serve](https://gitee.com/MTrun/go-view-serve)
|
后端项目 gitee 地址:[https://gitee.com/MTrun/go-view-serve](https://gitee.com/MTrun/go-view-serve)
|
||||||
|
|
||||||
接口说明地址:[https://docs.apipost.cn/preview/5aa85d10a59d66ce/ddb813732007ad2b?target_id=84dbc5b0-158f-4bcb-8f74-793ac604ada3#3e053622-1e76-43f9-a039-756aee822dbb](https://docs.apipost.cn/preview/5aa85d10a59d66ce/ddb813732007ad2b?target_id=84dbc5b0-158f-4bcb-8f74-793ac604ada3#3e053622-1e76-43f9-a039-756aee822dbb)
|
接口说明地址:[https://docs.apipost.cn/preview/5aa85d10a59d66ce/ddb813732007ad2b?target_id=84dbc5b0-158f-4bcb-8f74-793ac604ada3#3e053622-1e76-43f9-a039-756aee822dbb](https://docs.apipost.cn/preview/5aa85d10a59d66ce/ddb813732007ad2b?target_id=84dbc5b0-158f-4bcb-8f74-793ac604ada3#3e053622-1e76-43f9-a039-756aee822dbb)
|
||||||
|
|
||||||
技术点:
|
其它后端方案地址:
|
||||||
|
|
||||||
|
- 【.NET】[https://gitee.com/sun_xiang_yu/go-view-dotnet](https://gitee.com/sun_xiang_yu/go-view-dotnet)
|
||||||
|
|
||||||
|
#### 整体介绍
|
||||||
|
|
||||||
- 框架:基于 `Vue3` 框架编写,使用 `hooks` 写法抽离部分逻辑,使代码结构更加清晰;
|
- 框架:基于 `Vue3` 框架编写,使用 `hooks` 写法抽离部分逻辑,使代码结构更加清晰;
|
||||||
|
|
||||||
@@ -36,17 +40,29 @@ GoView 是一个高效的拖拽式低代码数据可视化开发平台,将图
|
|||||||
|
|
||||||
- 封装:项目进行了详细的工具类封装如:路由、存储、加/解密、文件处理、主题、NaiveUI 全局方法、组件等
|
- 封装:项目进行了详细的工具类封装如:路由、存储、加/解密、文件处理、主题、NaiveUI 全局方法、组件等
|
||||||
|
|
||||||
|
说明文档:
|
||||||
|

|
||||||
|
|
||||||
工作台:
|
工作台:
|
||||||

|

|
||||||
|
|
||||||
请求配置:
|
请求配置:
|
||||||

|

|
||||||
|
|
||||||
数据过滤:
|
数据过滤:
|
||||||

|

|
||||||
|
|
||||||
|
高级事件编辑:
|
||||||
|

|
||||||
|
|
||||||
|
快捷主页:
|
||||||
|

|
||||||
|
|
||||||
主题色:
|
主题色:
|
||||||

|

|
||||||
|
|
||||||
|
亮白主题:
|
||||||
|

|
||||||
|
|
||||||
主要技术栈为:
|
主要技术栈为:
|
||||||
|
|
||||||
@@ -66,14 +82,17 @@ GoView 是一个高效的拖拽式低代码数据可视化开发平台,将图
|
|||||||
|
|
||||||
已完成图表:
|
已完成图表:
|
||||||
|
|
||||||
| 分类 | 名称 | 名称 | 名称 |
|
| 分类 | 名称 | 名称 | 名称 | 名称 |
|
||||||
| ------ | ---------------- | ---------------- | -------- |
|
| ------ | ---------------- | ---------- | -------------- | ------------------------ |
|
||||||
| 图表 | 柱状图 | 横向柱状图 | 折线图 |
|
| 图表 | 柱状图 | 横向柱状图 | 折线图 | 单/多 折线面积图(渐变色) |
|
||||||
| \* | 单/多 折线面积图 | 饼图 | 水球图 |
|
| \* | 饼图 | 环形图 | 水球图 | 雷达图 |
|
||||||
| \* | 环形图 | NaiveUI 多种进度 | 🤠 |
|
| \* | NaiveUI 多种进度 | 散点图 | 对数回归散点图 | 热力图 |
|
||||||
| 信息 | 文字 | 图片 | 😶 |
|
| \* | 漏斗图 | 中国地图 | 高德地图 | 🦊 |
|
||||||
| 列表 | 滚动排名列表 | 滚动表格 | 🤓 |
|
| 信息 | 文字 | 渐变文字 | 词云 | 嵌套网页 |
|
||||||
| 小组件 | 边框-01~13 | 装饰-01~05 | 数字翻牌 |
|
| \* | 图片 | 视频 | 😺 | 🐯 |
|
||||||
|
| 列表 | 滚动排名列表 | 滚动表格 | 🐮 | 🐐 |
|
||||||
|
| 小组件 | 边框-01~13 | 装饰-01~05 | 数字翻牌 | 通用时间 |
|
||||||
|
| \* | 数字计数 | 倒计时 | 时钟 | 🦁 |
|
||||||
|
|
||||||
## 浏览器支持
|
## 浏览器支持
|
||||||
|
|
||||||
|
|||||||
@@ -82,25 +82,4 @@
|
|||||||
to {
|
to {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* 小屏处理 0~1000*/
|
|
||||||
.mobile-terminal {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
@media (max-width: 1000px) {
|
|
||||||
#app {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.mobile-terminal {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
width: 100vw;
|
|
||||||
height: 100vh;
|
|
||||||
text-align: center;
|
|
||||||
font-size: 24px;
|
|
||||||
font-weight: 200;
|
|
||||||
background-image: linear-gradient(to top, #fff1eb 0%, #ace0f9 100%);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -24,9 +24,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="mobile-terminal">
|
|
||||||
<p>请使用 Web 端进行查看</p>
|
|
||||||
</div>
|
|
||||||
<script type="module" src="/src/main.ts"></script>
|
<script type="module" src="/src/main.ts"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -1,14 +1,18 @@
|
|||||||
{
|
{
|
||||||
"name": "go-view",
|
"name": "go-view",
|
||||||
"version": "1.0.8",
|
"version": "1.1.5",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite --host",
|
"dev": "vite --host",
|
||||||
"build": "vue-tsc --noEmit && vite build",
|
"build": "vue-tsc --noEmit && vite build",
|
||||||
"preview": "vite preview",
|
"preview": "vite preview",
|
||||||
"new": "plop --plopfile ./plop/plopfile.js",
|
"new": "plop --plopfile ./plop/plopfile.js",
|
||||||
"postinstall": "husky install"
|
"postinstall": "husky install",
|
||||||
|
"lint": "eslint --ext .js,.jsx,.ts,.tsx,.vue src",
|
||||||
|
"lint:fix": "eslint --ext .js,.jsx,.ts,.tsx,.vue src --fix"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@amap/amap-jsapi-loader": "^1.0.1",
|
||||||
|
"@amap/amap-jsapi-types": "^0.0.8",
|
||||||
"@types/color": "^3.0.3",
|
"@types/color": "^3.0.3",
|
||||||
"@types/crypto-js": "^4.1.1",
|
"@types/crypto-js": "^4.1.1",
|
||||||
"@types/keymaster": "^1.6.30",
|
"@types/keymaster": "^1.6.30",
|
||||||
@@ -18,13 +22,17 @@
|
|||||||
"color": "^4.2.3",
|
"color": "^4.2.3",
|
||||||
"crypto-js": "^4.1.1",
|
"crypto-js": "^4.1.1",
|
||||||
"echarts-liquidfill": "^3.1.0",
|
"echarts-liquidfill": "^3.1.0",
|
||||||
|
"echarts-stat": "^1.2.0",
|
||||||
|
"echarts-wordcloud": "^2.0.0",
|
||||||
|
"gsap": "^3.11.3",
|
||||||
"highlight.js": "^11.5.0",
|
"highlight.js": "^11.5.0",
|
||||||
"html2canvas": "^1.4.1",
|
"html2canvas": "^1.4.1",
|
||||||
"keymaster": "^1.6.2",
|
"keymaster": "^1.6.2",
|
||||||
"monaco-editor": "^0.33.0",
|
"monaco-editor": "^0.33.0",
|
||||||
"naive-ui": "2.30.3",
|
"naive-ui": "2.33.4",
|
||||||
"pinia": "^2.0.13",
|
"pinia": "^2.0.13",
|
||||||
"screenfull": "^6.0.1",
|
"screenfull": "^6.0.1",
|
||||||
|
"three": "^0.145.0",
|
||||||
"vue": "^3.2.31",
|
"vue": "^3.2.31",
|
||||||
"vue-demi": "^0.13.1",
|
"vue-demi": "^0.13.1",
|
||||||
"vue-i18n": "9.1.9",
|
"vue-i18n": "9.1.9",
|
||||||
@@ -37,6 +45,7 @@
|
|||||||
"@commitlint/cli": "^17.0.2",
|
"@commitlint/cli": "^17.0.2",
|
||||||
"@commitlint/config-conventional": "^17.0.2",
|
"@commitlint/config-conventional": "^17.0.2",
|
||||||
"@types/node": "^16.11.26",
|
"@types/node": "^16.11.26",
|
||||||
|
"@types/three": "^0.144.0",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.18.0",
|
"@typescript-eslint/eslint-plugin": "^5.18.0",
|
||||||
"@typescript-eslint/parser": "^5.18.0",
|
"@typescript-eslint/parser": "^5.18.0",
|
||||||
"@vicons/carbon": "^0.12.0",
|
"@vicons/carbon": "^0.12.0",
|
||||||
@@ -60,7 +69,7 @@
|
|||||||
"prettier": "^2.6.2",
|
"prettier": "^2.6.2",
|
||||||
"sass": "^1.49.11",
|
"sass": "^1.49.11",
|
||||||
"sass-loader": "^12.6.0",
|
"sass-loader": "^12.6.0",
|
||||||
"typescript": "^4.6.3",
|
"typescript": "4.6.3",
|
||||||
"vite": "2.9.9",
|
"vite": "2.9.9",
|
||||||
"vite-plugin-compression": "^0.5.1",
|
"vite-plugin-compression": "^0.5.1",
|
||||||
"vite-plugin-importer": "^0.2.5",
|
"vite-plugin-importer": "^0.2.5",
|
||||||
|
|||||||
|
After Width: | Height: | Size: 159 KiB |
|
After Width: | Height: | Size: 167 KiB |
|
After Width: | Height: | Size: 404 KiB |
@@ -1,9 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<n-config-provider
|
<n-config-provider
|
||||||
:locale="zhCN"
|
|
||||||
:theme="darkTheme"
|
:theme="darkTheme"
|
||||||
:hljs="hljsTheme"
|
:hljs="hljsTheme"
|
||||||
:date-locale="dateZhCN"
|
:locale="locale"
|
||||||
|
:date-locale="dateLocale"
|
||||||
:theme-overrides="overridesTheme"
|
:theme-overrides="overridesTheme"
|
||||||
>
|
>
|
||||||
<go-app-provider>
|
<go-app-provider>
|
||||||
@@ -14,11 +14,10 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { zhCN, dateZhCN, NConfigProvider } from 'naive-ui'
|
import { NConfigProvider } from 'naive-ui'
|
||||||
import { GoAppProvider } from '@/components/GoAppProvider'
|
import { GoAppProvider } from '@/components/GoAppProvider'
|
||||||
import { I18n } from '@/components/I18n'
|
import { I18n } from '@/components/I18n'
|
||||||
|
import { useDarkThemeHook, useThemeOverridesHook, useCode, useLang } from '@/hooks'
|
||||||
import { useDarkThemeHook, useThemeOverridesHook, useCode } from '@/hooks'
|
|
||||||
|
|
||||||
// 暗黑主题
|
// 暗黑主题
|
||||||
const darkTheme = useDarkThemeHook()
|
const darkTheme = useDarkThemeHook()
|
||||||
@@ -28,4 +27,8 @@ const overridesTheme = useThemeOverridesHook()
|
|||||||
|
|
||||||
// 代码主题
|
// 代码主题
|
||||||
const hljsTheme = useCode()
|
const hljsTheme = useCode()
|
||||||
|
|
||||||
|
// 全局语言
|
||||||
|
const { locale, dateLocale } = useLang()
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ axiosInstance.interceptors.response.use(
|
|||||||
return Promise.resolve(res.data)
|
return Promise.resolve(res.data)
|
||||||
},
|
},
|
||||||
(err: AxiosResponse) => {
|
(err: AxiosResponse) => {
|
||||||
window['$message'].error('接口异常,请检查!')
|
|
||||||
Promise.reject(err)
|
Promise.reject(err)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -80,6 +80,32 @@ export const http = (type?: RequestHttpEnum) => {
|
|||||||
return get
|
return get
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
const prefix = 'javascript:'
|
||||||
|
// 对输入字符进行转义处理
|
||||||
|
export const translateStr = (target: string | object) => {
|
||||||
|
if (typeof target === 'string') {
|
||||||
|
if (target.startsWith(prefix)) {
|
||||||
|
const funcStr = target.split(prefix)[1]
|
||||||
|
let result;
|
||||||
|
try {
|
||||||
|
result = new Function(`${funcStr}`)()
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error)
|
||||||
|
window['$message'].error('js内容解析有误!')
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
} else {
|
||||||
|
return target
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (const key in target) {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(target, key)) {
|
||||||
|
const subTarget = (target as any)[key];
|
||||||
|
(target as any)[key] = translateStr(subTarget)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return target
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* * 自定义请求
|
* * 自定义请求
|
||||||
@@ -87,7 +113,7 @@ export const http = (type?: RequestHttpEnum) => {
|
|||||||
* @param globalParams 全局参数
|
* @param globalParams 全局参数
|
||||||
*/
|
*/
|
||||||
export const customizeHttp = (targetParams: RequestConfigType, globalParams: RequestGlobalConfigType) => {
|
export const customizeHttp = (targetParams: RequestConfigType, globalParams: RequestGlobalConfigType) => {
|
||||||
if(!targetParams || !globalParams) {
|
if (!targetParams || !globalParams) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,15 +151,17 @@ export const customizeHttp = (targetParams: RequestConfigType, globalParams: Req
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 处理头部
|
// 处理头部
|
||||||
const headers: RequestParamsObjType = {
|
let headers: RequestParamsObjType = {
|
||||||
...globalRequestParams.Header,
|
...globalRequestParams.Header,
|
||||||
...targetRequestParams.Header,
|
...targetRequestParams.Header
|
||||||
}
|
}
|
||||||
|
headers = translateStr(headers)
|
||||||
|
|
||||||
// data 参数
|
// data 参数
|
||||||
let data: RequestParamsObjType | FormData | string = {}
|
let data: RequestParamsObjType | FormData | string = {}
|
||||||
// params 参数
|
// params 参数
|
||||||
let params: RequestParamsObjType = targetRequestParams.Params
|
let params: RequestParamsObjType = { ...targetRequestParams.Params }
|
||||||
|
params = translateStr(params)
|
||||||
// form 类型处理
|
// form 类型处理
|
||||||
let formData: FormData = new FormData()
|
let formData: FormData = new FormData()
|
||||||
formData.set('default', 'defaultData')
|
formData.set('default', 'defaultData')
|
||||||
@@ -145,33 +173,35 @@ export const customizeHttp = (targetParams: RequestConfigType, globalParams: Req
|
|||||||
|
|
||||||
case RequestBodyEnum.JSON:
|
case RequestBodyEnum.JSON:
|
||||||
headers['Content-Type'] = ContentTypeEnum.JSON
|
headers['Content-Type'] = ContentTypeEnum.JSON
|
||||||
data = JSON.parse(targetRequestParams.Body['json'])
|
data = translateStr(JSON.parse(targetRequestParams.Body['json']))
|
||||||
// json 赋值给 data
|
// json 赋值给 data
|
||||||
break
|
break
|
||||||
|
|
||||||
case RequestBodyEnum.XML:
|
case RequestBodyEnum.XML:
|
||||||
headers['Content-Type'] = ContentTypeEnum.XML
|
headers['Content-Type'] = ContentTypeEnum.XML
|
||||||
// xml 字符串赋值给 data
|
// xml 字符串赋值给 data
|
||||||
data = targetRequestParams.Body['xml']
|
data = translateStr(targetRequestParams.Body['xml'])
|
||||||
break
|
break
|
||||||
|
|
||||||
case RequestBodyEnum.X_WWW_FORM_URLENCODED:
|
case RequestBodyEnum.X_WWW_FORM_URLENCODED: {
|
||||||
headers['Content-Type'] = ContentTypeEnum.FORM_URLENCODED
|
headers['Content-Type'] = ContentTypeEnum.FORM_URLENCODED
|
||||||
const bodyFormData = targetRequestParams.Body['x-www-form-urlencoded']
|
const bodyFormData = targetRequestParams.Body['x-www-form-urlencoded']
|
||||||
for (const i in bodyFormData) formData.set(i, bodyFormData[i])
|
for (const i in bodyFormData) formData.set(i, translateStr(bodyFormData[i]))
|
||||||
// FormData 赋值给 data
|
// FormData 赋值给 data
|
||||||
data = formData
|
data = formData
|
||||||
break
|
break
|
||||||
|
}
|
||||||
|
|
||||||
case RequestBodyEnum.FORM_DATA:
|
case RequestBodyEnum.FORM_DATA: {
|
||||||
headers['Content-Type'] = ContentTypeEnum.FORM_DATA
|
headers['Content-Type'] = ContentTypeEnum.FORM_DATA
|
||||||
const bodyFormUrlencoded = targetRequestParams.Body['form-data']
|
const bodyFormUrlencoded = targetRequestParams.Body['form-data']
|
||||||
for (const i in bodyFormUrlencoded) {
|
for (const i in bodyFormUrlencoded) {
|
||||||
formData.set(i, bodyFormUrlencoded[i])
|
formData.set(i, translateStr(bodyFormUrlencoded[i]))
|
||||||
}
|
}
|
||||||
// FormData 赋值给 data
|
// FormData 赋值给 data
|
||||||
data = formData
|
data = formData
|
||||||
break
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// sql 处理
|
// sql 处理
|
||||||
@@ -180,11 +210,17 @@ export const customizeHttp = (targetParams: RequestConfigType, globalParams: Req
|
|||||||
data = requestSQLContent
|
data = requestSQLContent
|
||||||
}
|
}
|
||||||
|
|
||||||
return axiosInstance({
|
try {
|
||||||
url: `${requestOriginUrl}${requestUrl}`,
|
const url = (new Function("return `" + `${requestOriginUrl}${requestUrl}`.trim() + "`"))();
|
||||||
method: requestHttpType,
|
return axiosInstance({
|
||||||
data,
|
url,
|
||||||
params,
|
method: requestHttpType,
|
||||||
headers
|
data,
|
||||||
})
|
params,
|
||||||
|
headers
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error)
|
||||||
|
window['$message'].error('URL地址格式有误!')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,199 @@
|
|||||||
|
{
|
||||||
|
"xAxis": [
|
||||||
|
"12a",
|
||||||
|
"1a",
|
||||||
|
"2a",
|
||||||
|
"3a",
|
||||||
|
"4a",
|
||||||
|
"5a",
|
||||||
|
"6a",
|
||||||
|
"7a",
|
||||||
|
"8a",
|
||||||
|
"9a",
|
||||||
|
"10a",
|
||||||
|
"11a",
|
||||||
|
"12p",
|
||||||
|
"1p",
|
||||||
|
"2p",
|
||||||
|
"3p",
|
||||||
|
"4p",
|
||||||
|
"5p",
|
||||||
|
"6p",
|
||||||
|
"7p",
|
||||||
|
"8p",
|
||||||
|
"9p",
|
||||||
|
"10p",
|
||||||
|
"11p"
|
||||||
|
],
|
||||||
|
"yAxis": ["Saturday", "Friday", "Thursday", "Wednesday", "Tuesday", "Monday", "Sunday"],
|
||||||
|
"seriesData": [
|
||||||
|
[0, 0, "@integer(0, 10)"],
|
||||||
|
[1, 0, "@integer(0, 10)"],
|
||||||
|
[2, 0, "-"],
|
||||||
|
[3, 0, "-"],
|
||||||
|
[4, 0, "-"],
|
||||||
|
[5, 0, "-"],
|
||||||
|
[6, 0, "-"],
|
||||||
|
[7, 0, "-"],
|
||||||
|
[8, 0, "-"],
|
||||||
|
[9, 0, "-"],
|
||||||
|
[10, 0, "-"],
|
||||||
|
[11, 0, "@integer(0, 10)"],
|
||||||
|
[12, 0, "@integer(0, 10)"],
|
||||||
|
[13, 0, "@integer(0, 10)"],
|
||||||
|
[14, 0, "@integer(0, 10)"],
|
||||||
|
[15, 0, "@integer(0, 10)"],
|
||||||
|
[16, 0, "@integer(0, 10)"],
|
||||||
|
[17, 0, "@integer(0, 10)"],
|
||||||
|
[18, 0, "@integer(0, 10)"],
|
||||||
|
[19, 0, "@integer(0, 10)"],
|
||||||
|
[20, 0, "@integer(0, 10)"],
|
||||||
|
[21, 0, "@integer(0, 10)"],
|
||||||
|
[22, 0, "@integer(0, 10)"],
|
||||||
|
[23, 0, "@integer(0, 10)"],
|
||||||
|
[0, 1, 7],
|
||||||
|
[1, 1, "-"],
|
||||||
|
[2, 1, "-"],
|
||||||
|
[3, 1, "-"],
|
||||||
|
[4, 1, "-"],
|
||||||
|
[5, 1, "-"],
|
||||||
|
[6, 1, "-"],
|
||||||
|
[7, 1, "-"],
|
||||||
|
[8, 1, "-"],
|
||||||
|
[9, 1, "-"],
|
||||||
|
[10, 1, "@integer(0, 10)"],
|
||||||
|
[11, 1, "@integer(0, 10)"],
|
||||||
|
[12, 1, "@integer(0, 10)"],
|
||||||
|
[13, 1, "@integer(0, 10)"],
|
||||||
|
[14, 1, "@integer(0, 10)"],
|
||||||
|
[15, 1, "@integer(0, 10)"],
|
||||||
|
[16, 1, "@integer(0, 10)"],
|
||||||
|
[17, 1, "@integer(0, 10)"],
|
||||||
|
[18, 1, "@integer(0, 10)"],
|
||||||
|
[19, 1, "@integer(0, 10)"],
|
||||||
|
[20, 1, "@integer(0, 10)"],
|
||||||
|
[21, 1, "@integer(0, 10)"],
|
||||||
|
[22, 1, "@integer(0, 10)"],
|
||||||
|
[23, 1, "@integer(0, 10)"],
|
||||||
|
[0, 2, 1],
|
||||||
|
[1, 2, 1],
|
||||||
|
[2, 2, "-"],
|
||||||
|
[3, 2, "-"],
|
||||||
|
[4, 2, "-"],
|
||||||
|
[5, 2, "-"],
|
||||||
|
[6, 2, "-"],
|
||||||
|
[7, 2, "-"],
|
||||||
|
[8, 2, "-"],
|
||||||
|
[9, 2, "-"],
|
||||||
|
[10, 2, "@integer(0, 10)"],
|
||||||
|
[11, 2, "@integer(0, 10)"],
|
||||||
|
[12, 2, "@integer(0, 10)"],
|
||||||
|
[13, 2, "@integer(0, 10)"],
|
||||||
|
[14, 2, "@integer(0, 10)"],
|
||||||
|
[15, 2, "@integer(0, 10)"],
|
||||||
|
[16, 2, "@integer(0, 10)"],
|
||||||
|
[17, 2, "@integer(0, 10)"],
|
||||||
|
[18, 2, "@integer(0, 10)"],
|
||||||
|
[19, 2, "@integer(0, 10)"],
|
||||||
|
[20, 2, "@integer(0, 10)"],
|
||||||
|
[21, 2, "@integer(0, 10)"],
|
||||||
|
[22, 2, "@integer(0, 10)"],
|
||||||
|
[23, 2, "@integer(0, 10)"],
|
||||||
|
[0, 3, 7],
|
||||||
|
[1, 3, 3],
|
||||||
|
[2, 3, "-"],
|
||||||
|
[3, 3, "-"],
|
||||||
|
[4, 3, "-"],
|
||||||
|
[5, 3, "-"],
|
||||||
|
[6, 3, "-"],
|
||||||
|
[7, 3, "-"],
|
||||||
|
[8, 3, 1],
|
||||||
|
[9, 3, "-"],
|
||||||
|
[10, 3, "@integer(0, 10)"],
|
||||||
|
[11, 3, "@integer(0, 10)"],
|
||||||
|
[12, 3, "@integer(0, 10)"],
|
||||||
|
[13, 3, "@integer(0, 10)"],
|
||||||
|
[14, 3, "@integer(0, 10)"],
|
||||||
|
[15, 3, "@integer(0, 10)"],
|
||||||
|
[16, 3, "@integer(0, 10)"],
|
||||||
|
[17, 3, "@integer(0, 10)"],
|
||||||
|
[18, 3, "@integer(0, 10)"],
|
||||||
|
[19, 3, "@integer(0, 10)"],
|
||||||
|
[20, 3, "@integer(0, 10)"],
|
||||||
|
[21, 3, "@integer(0, 10)"],
|
||||||
|
[22, 3, "@integer(0, 10)"],
|
||||||
|
[23, 3, "@integer(0, 10)"],
|
||||||
|
[0, 4, "@integer(0, 10)"],
|
||||||
|
[1, 4, "@integer(0, 10)"],
|
||||||
|
[2, 4, "-"],
|
||||||
|
[3, 4, "-"],
|
||||||
|
[4, 4, "-"],
|
||||||
|
[5, 4, "@integer(0, 10)"],
|
||||||
|
[6, 4, "-"],
|
||||||
|
[7, 4, "-"],
|
||||||
|
[8, 4, "-"],
|
||||||
|
[9, 4, "@integer(0, 10)"],
|
||||||
|
[10, 4, "@integer(0, 10)"],
|
||||||
|
[11, 4, "@integer(0, 10)"],
|
||||||
|
[12, 4, "@integer(0, 10)"],
|
||||||
|
[13, 4, "@integer(0, 10)"],
|
||||||
|
[14, 4, "@integer(0, 10)"],
|
||||||
|
[15, 4, "@integer(0, 10)"],
|
||||||
|
[16, 4, "@integer(0, 10)"],
|
||||||
|
[17, 4, "@integer(0, 10)"],
|
||||||
|
[18, 4, "@integer(0, 10)"],
|
||||||
|
[19, 4, "@integer(0, 10)"],
|
||||||
|
[20, 4, "@integer(0, 10)"],
|
||||||
|
[21, 4, "@integer(0, 10)"],
|
||||||
|
[22, 4, "@integer(0, 10)"],
|
||||||
|
[23, 4, "-"],
|
||||||
|
[0, 5, "@integer(0, 10)"],
|
||||||
|
[1, 5, "@integer(0, 10)"],
|
||||||
|
[2, 5, "-"],
|
||||||
|
[3, 5, "@integer(0, 10)"],
|
||||||
|
[4, 5, "-"],
|
||||||
|
[5, 5, "-"],
|
||||||
|
[6, 5, "-"],
|
||||||
|
[7, 5, "-"],
|
||||||
|
[8, 5, "@integer(0, 10)"],
|
||||||
|
[9, 5, "-"],
|
||||||
|
[10, 5, "@integer(0, 10)"],
|
||||||
|
[11, 5, "@integer(0, 10)"],
|
||||||
|
[12, 5, "@integer(0, 10)"],
|
||||||
|
[13, 5, "@integer(0, 10)"],
|
||||||
|
[14, 5, "@integer(0, 10)"],
|
||||||
|
[15, 5, "@integer(0, 10)"],
|
||||||
|
[16, 5, "@integer(0, 10)"],
|
||||||
|
[17, 5, "@integer(0, 10)"],
|
||||||
|
[18, 5, "-"],
|
||||||
|
[19, 5, "@integer(0, 10)"],
|
||||||
|
[20, 5, "@integer(0, 10)"],
|
||||||
|
[21, 5, "@integer(0, 10)"],
|
||||||
|
[22, 5, "@integer(0, 10)"],
|
||||||
|
[23, 5, "-"],
|
||||||
|
[0, 6, "@integer(0, 10)"],
|
||||||
|
[1, 6, "-"],
|
||||||
|
[2, 6, "-"],
|
||||||
|
[3, 6, "-"],
|
||||||
|
[4, 6, "-"],
|
||||||
|
[5, 6, "-"],
|
||||||
|
[6, 6, "-"],
|
||||||
|
[7, 6, "-"],
|
||||||
|
[8, 6, "-"],
|
||||||
|
[9, 6, "-"],
|
||||||
|
[10, 6, "@integer(0, 10)"],
|
||||||
|
[11, 6, "-"],
|
||||||
|
[12, 6, "@integer(0, 10)"],
|
||||||
|
[13, 6, "@integer(0, 10)"],
|
||||||
|
[14, 6, "@integer(0, 10)"],
|
||||||
|
[15, 6, "@integer(0, 10)"],
|
||||||
|
[16, 6, "-"],
|
||||||
|
[17, 6, "-"],
|
||||||
|
[18, 6, "-"],
|
||||||
|
[19, 6, "-"],
|
||||||
|
[20, 6, "@integer(0, 10)"],
|
||||||
|
[21, 6, "@integer(0, 10)"],
|
||||||
|
[22, 6, "@integer(0, 10)"],
|
||||||
|
[23, 6, "@integer(0, 10)"]
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -4,12 +4,21 @@ import { RequestHttpEnum } from '@/enums/httpEnum'
|
|||||||
|
|
||||||
// 单个X数据
|
// 单个X数据
|
||||||
export const chartDataUrl = '/mock/chartData'
|
export const chartDataUrl = '/mock/chartData'
|
||||||
|
export const chartSingleDataUrl = '/mock/chartSingleData'
|
||||||
export const numberFloatUrl = '/mock/number/float'
|
export const numberFloatUrl = '/mock/number/float'
|
||||||
export const numberIntUrl = '/mock/number/int'
|
export const numberIntUrl = '/mock/number/int'
|
||||||
export const textUrl = '/mock/text'
|
export const textUrl = '/mock/text'
|
||||||
export const imageUrl = '/mock/image'
|
export const imageUrl = '/mock/image'
|
||||||
export const rankListUrl = '/mock/rankList'
|
export const rankListUrl = '/mock/rankList'
|
||||||
export const scrollBoardUrl = '/mock/scrollBoard'
|
export const scrollBoardUrl = '/mock/scrollBoard'
|
||||||
|
export const radarUrl = '/mock/radarData'
|
||||||
|
export const heatMapUrl = '/mock/heatMapData'
|
||||||
|
export const scatterBasicUrl = '/mock/scatterBasic'
|
||||||
|
export const mapUrl = '/mock/map'
|
||||||
|
export const capsuleUrl = '/mock/capsule'
|
||||||
|
export const wordCloudUrl = '/mock/wordCloud'
|
||||||
|
export const treemapUrl = '/mock/treemap'
|
||||||
|
export const threeEarth01Url = '/mock/threeEarth01Data'
|
||||||
|
|
||||||
const mockObject: MockMethod[] = [
|
const mockObject: MockMethod[] = [
|
||||||
{
|
{
|
||||||
@@ -19,6 +28,11 @@ const mockObject: MockMethod[] = [
|
|||||||
method: RequestHttpEnum.GET,
|
method: RequestHttpEnum.GET,
|
||||||
response: () => test.fetchMockData
|
response: () => test.fetchMockData
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
url: chartSingleDataUrl,
|
||||||
|
method: RequestHttpEnum.GET,
|
||||||
|
response: () => test.fetchMockSingleData
|
||||||
|
},
|
||||||
{
|
{
|
||||||
url: numberFloatUrl,
|
url: numberFloatUrl,
|
||||||
method: RequestHttpEnum.GET,
|
method: RequestHttpEnum.GET,
|
||||||
@@ -48,7 +62,47 @@ const mockObject: MockMethod[] = [
|
|||||||
url: scrollBoardUrl,
|
url: scrollBoardUrl,
|
||||||
method: RequestHttpEnum.GET,
|
method: RequestHttpEnum.GET,
|
||||||
response: () => test.fetchScrollBoard
|
response: () => test.fetchScrollBoard
|
||||||
}
|
},
|
||||||
|
{
|
||||||
|
url: radarUrl,
|
||||||
|
method: RequestHttpEnum.GET,
|
||||||
|
response: () => test.fetchRadar
|
||||||
|
},
|
||||||
|
{
|
||||||
|
url: heatMapUrl,
|
||||||
|
method: RequestHttpEnum.GET,
|
||||||
|
response: () => test.fetchHeatmap
|
||||||
|
},
|
||||||
|
{
|
||||||
|
url: scatterBasicUrl,
|
||||||
|
method: RequestHttpEnum.GET,
|
||||||
|
response: () => test.fetchScatterBasic
|
||||||
|
},
|
||||||
|
{
|
||||||
|
url: mapUrl,
|
||||||
|
method: RequestHttpEnum.GET,
|
||||||
|
response: () => test.fetchMap
|
||||||
|
},
|
||||||
|
{
|
||||||
|
url: capsuleUrl,
|
||||||
|
method: RequestHttpEnum.GET,
|
||||||
|
response: () => test.fetchCapsule
|
||||||
|
},
|
||||||
|
{
|
||||||
|
url: wordCloudUrl,
|
||||||
|
method: RequestHttpEnum.GET,
|
||||||
|
response: () => test.fetchWordCloud
|
||||||
|
},
|
||||||
|
{
|
||||||
|
url: treemapUrl,
|
||||||
|
method: RequestHttpEnum.GET,
|
||||||
|
response: () => test.fetchTreemap
|
||||||
|
},
|
||||||
|
{
|
||||||
|
url: threeEarth01Url,
|
||||||
|
method: RequestHttpEnum.GET,
|
||||||
|
response: () => test.threeEarth01Data
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
export default mockObject
|
export default mockObject
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"markers|50": [
|
||||||
|
{
|
||||||
|
"name": "某某地市",
|
||||||
|
"value": "@integer(2, 20)",
|
||||||
|
"position": ["@float(115, 117, 1, 6)", "@float(38, 40, 1, 6)"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"dimensions": ["data1"],
|
||||||
|
"source": [
|
||||||
|
[10.0, "@integer(0, 100)"],
|
||||||
|
[8.07, "@integer(0, 100)"],
|
||||||
|
[13.0, "@integer(0, 100)"],
|
||||||
|
[9.05, "@integer(0, 100)"],
|
||||||
|
[11.0, "@integer(0, 100)"],
|
||||||
|
[14.0, "@integer(0, 100)"],
|
||||||
|
[13.4, "@integer(0, 100)"],
|
||||||
|
[10.0, "@integer(0, 100)"],
|
||||||
|
[14.0, "@integer(0, 100)"],
|
||||||
|
[12.5, "@integer(0, 100)"],
|
||||||
|
[9.15, "@integer(0, 100)"],
|
||||||
|
[11.5, "@integer(0, 100)"],
|
||||||
|
[3.03, "@integer(0, 100)"],
|
||||||
|
[12.2, "@integer(0, 100)"],
|
||||||
|
[2.02, "@integer(0, 100)"],
|
||||||
|
[1.05, "@integer(0, 100)"],
|
||||||
|
[4.05, "@integer(0, 100)"],
|
||||||
|
[6.03, "@integer(0, 100)"],
|
||||||
|
[12.0, "@integer(0, 100)"],
|
||||||
|
[12.0, "@integer(0, 100)"],
|
||||||
|
[7.08, "@integer(0, 100)"],
|
||||||
|
[5.02, "@integer(0, 100)"]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dimensions": ["data2"],
|
||||||
|
"source": [
|
||||||
|
[10.0, "@integer(0, 70)"],
|
||||||
|
[8.07, "@integer(0, 70)"],
|
||||||
|
[13.0, "@integer(0, 70)"],
|
||||||
|
[9.05, "@integer(0, 70)"],
|
||||||
|
[11.0, "@integer(0, 70)"],
|
||||||
|
[14.0, "@integer(0, 70)"],
|
||||||
|
[13.4, "@integer(0, 70)"],
|
||||||
|
[10.0, "@integer(0, 70)"],
|
||||||
|
[14.0, "@integer(0, 70)"],
|
||||||
|
[12.5, "@integer(0, 70)"],
|
||||||
|
[9.15, "@integer(0, 70)"],
|
||||||
|
[11.5, "@integer(0, 70)"],
|
||||||
|
[3.03, "@integer(0, 70)"],
|
||||||
|
[12.2, "@integer(0, 70)"],
|
||||||
|
[2.02, "@integer(0, 70)"],
|
||||||
|
[1.05, "@integer(0, 70)"],
|
||||||
|
[4.05, "@integer(0, 70)"],
|
||||||
|
[6.03, "@integer(0, 70)"],
|
||||||
|
[12.0, "@integer(0, 70)"],
|
||||||
|
[12.0, "@integer(0, 70)"],
|
||||||
|
[7.08, "@integer(0, 70)"],
|
||||||
|
[5.02, "@integer(0, 70)"]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -1,4 +1,40 @@
|
|||||||
|
import heatmapJson from './heatMapData.json'
|
||||||
|
import scatterJson from './scatter.json'
|
||||||
|
import mapJson from './map.json'
|
||||||
|
import tTreemapJson from './treemap.json'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
// 单图表
|
||||||
|
fetchMockSingleData: {
|
||||||
|
code: 0,
|
||||||
|
status: 200,
|
||||||
|
msg: '请求成功',
|
||||||
|
data: {
|
||||||
|
dimensions: ['product', 'dataOne'],
|
||||||
|
'source|50': [
|
||||||
|
{
|
||||||
|
product: '@name',
|
||||||
|
'dataOne|0-900': 3
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 胶囊图
|
||||||
|
fetchCapsule: {
|
||||||
|
code: 0,
|
||||||
|
status: 200,
|
||||||
|
msg: '请求成功',
|
||||||
|
data: {
|
||||||
|
dimensions: ['name', 'value'],
|
||||||
|
source: [
|
||||||
|
{ name: '厦门', 'value|0-40': 20 },
|
||||||
|
{ name: '南阳', 'value|20-60': 40 },
|
||||||
|
{ name: '北京', 'value|40-80': 60 },
|
||||||
|
{ name: '上海', 'value|60-100': 80 },
|
||||||
|
{ name: '新疆', value: 100 }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
// 图表
|
// 图表
|
||||||
fetchMockData: {
|
fetchMockData: {
|
||||||
code: 0,
|
code: 0,
|
||||||
@@ -6,32 +42,7 @@ export default {
|
|||||||
msg: '请求成功',
|
msg: '请求成功',
|
||||||
data: {
|
data: {
|
||||||
dimensions: ['product', 'dataOne', 'dataTwo'],
|
dimensions: ['product', 'dataOne', 'dataTwo'],
|
||||||
source: [
|
'source|50': [
|
||||||
{
|
|
||||||
product: '@name',
|
|
||||||
'dataOne|100-900': 3,
|
|
||||||
'dataTwo|100-900': 3
|
|
||||||
},
|
|
||||||
{
|
|
||||||
product: '@name',
|
|
||||||
'dataOne|100-900': 3,
|
|
||||||
'dataTwo|100-900': 3
|
|
||||||
},
|
|
||||||
{
|
|
||||||
product: '@name',
|
|
||||||
'dataOne|100-900': 3,
|
|
||||||
'dataTwo|100-900': 3
|
|
||||||
},
|
|
||||||
{
|
|
||||||
product: '@name',
|
|
||||||
'dataOne|100-900': 3,
|
|
||||||
'dataTwo|100-900': 3
|
|
||||||
},
|
|
||||||
{
|
|
||||||
product: '@name',
|
|
||||||
'dataOne|100-900': 3,
|
|
||||||
'dataTwo|100-900': 3
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
product: '@name',
|
product: '@name',
|
||||||
'dataOne|100-900': 3,
|
'dataOne|100-900': 3,
|
||||||
@@ -45,21 +56,7 @@ export default {
|
|||||||
code: 0,
|
code: 0,
|
||||||
status: 200,
|
status: 200,
|
||||||
msg: '请求成功',
|
msg: '请求成功',
|
||||||
data: [
|
'data|50': [{ name: '@name', 'value|100-900': 5 }]
|
||||||
{ name: '@name', 'value|100-900': 5 },
|
|
||||||
{ name: '@name', 'value|100-900': 5 },
|
|
||||||
{ name: '@name', 'value|100-900': 5 },
|
|
||||||
{ name: '@name', 'value|100-900': 5 },
|
|
||||||
{ name: '@name', 'value|100-900': 5 },
|
|
||||||
{ name: '@name', 'value|100-900': 5 },
|
|
||||||
{ name: '@name', 'value|100-900': 5 },
|
|
||||||
{ name: '@name', 'value|100-900': 5 },
|
|
||||||
{ name: '@name', 'value|100-900': 5 },
|
|
||||||
{ name: '@name', 'value|100-900': 5 },
|
|
||||||
{ name: '@name', 'value|100-900': 5 },
|
|
||||||
{ name: '@name', 'value|100-900': 5 },
|
|
||||||
{ name: '@name', 'value|100-900': 5 }
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
// 轮播表格
|
// 轮播表格
|
||||||
fetchScrollBoard: {
|
fetchScrollBoard: {
|
||||||
@@ -79,29 +76,151 @@ export default {
|
|||||||
['行10列1', '行10列2', '行10列3']
|
['行10列1', '行10列2', '行10列3']
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
// 获取数字
|
// 获取数字-浮点型
|
||||||
fetchNumberFloat: {
|
fetchNumberFloat: {
|
||||||
code: 0,
|
code: 0,
|
||||||
status: 200,
|
status: 200,
|
||||||
msg: '请求成功',
|
msg: '请求成功',
|
||||||
data: '@float(0, 0.99, 1, 4)'
|
data: '@float(0, 0.99, 1, 4)'
|
||||||
},
|
},
|
||||||
|
// 获取数字-整型
|
||||||
fetchNumberInt: {
|
fetchNumberInt: {
|
||||||
code: 0,
|
code: 0,
|
||||||
status: 200,
|
status: 200,
|
||||||
msg: '请求成功',
|
msg: '请求成功',
|
||||||
data: '@integer(0, 100)'
|
data: '@integer(0, 100)'
|
||||||
},
|
},
|
||||||
|
// 文字
|
||||||
fetchText: {
|
fetchText: {
|
||||||
code: 0,
|
code: 0,
|
||||||
status: 200,
|
status: 200,
|
||||||
msg: '请求成功',
|
msg: '请求成功',
|
||||||
data: '@paragraph(1, 10)'
|
data: '@paragraph(1, 10)'
|
||||||
},
|
},
|
||||||
|
// 图片
|
||||||
fetchImage: (num: number) => ({
|
fetchImage: (num: number) => ({
|
||||||
code: 0,
|
code: 0,
|
||||||
status: 200,
|
status: 200,
|
||||||
msg: '请求成功',
|
msg: '请求成功',
|
||||||
data: `https://robohash.org/${num}`
|
data: `https://robohash.org/${num}`
|
||||||
})
|
}),
|
||||||
|
// 雷达
|
||||||
|
fetchRadar: {
|
||||||
|
code: 0,
|
||||||
|
status: 200,
|
||||||
|
msg: '请求成功',
|
||||||
|
data: {
|
||||||
|
radarIndicator: [
|
||||||
|
{ name: '@name', max: 10000 },
|
||||||
|
{ name: '@name', max: 10000 },
|
||||||
|
{ name: '@name', max: 10000 },
|
||||||
|
{ name: '@name', max: 10000 },
|
||||||
|
{ name: '@name', max: 10000 },
|
||||||
|
{ name: '@name', max: 10000 }
|
||||||
|
],
|
||||||
|
seriesData: [
|
||||||
|
{
|
||||||
|
value: [
|
||||||
|
'@integer(0, 10000)',
|
||||||
|
'@integer(0, 10000)',
|
||||||
|
'@integer(0, 10000)',
|
||||||
|
'@integer(0, 10000)',
|
||||||
|
'@integer(0, 10000)',
|
||||||
|
'@integer(0, 10000)'
|
||||||
|
],
|
||||||
|
name: 'data1'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [
|
||||||
|
'@integer(0, 10000)',
|
||||||
|
'@integer(0, 10000)',
|
||||||
|
'@integer(0, 10000)',
|
||||||
|
'@integer(0, 10000)',
|
||||||
|
'@integer(0, 10000)',
|
||||||
|
'@integer(0, 10000)'
|
||||||
|
],
|
||||||
|
name: 'data2'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 热力图
|
||||||
|
fetchHeatmap: {
|
||||||
|
code: 0,
|
||||||
|
status: 200,
|
||||||
|
msg: '请求成功',
|
||||||
|
data: heatmapJson
|
||||||
|
},
|
||||||
|
// 散点图
|
||||||
|
fetchScatterBasic: {
|
||||||
|
code: 0,
|
||||||
|
status: 200,
|
||||||
|
msg: '请求成功',
|
||||||
|
data: scatterJson
|
||||||
|
},
|
||||||
|
// 中国地图
|
||||||
|
fetchMap: {
|
||||||
|
code: 0,
|
||||||
|
status: 200,
|
||||||
|
msg: '请求成功',
|
||||||
|
data: mapJson
|
||||||
|
},
|
||||||
|
// 词云
|
||||||
|
fetchWordCloud: {
|
||||||
|
code: 0,
|
||||||
|
status: 200,
|
||||||
|
msg: '请求成功',
|
||||||
|
data: [
|
||||||
|
{
|
||||||
|
name: '@name',
|
||||||
|
value: 8000,
|
||||||
|
textStyle: {
|
||||||
|
color: '#78fbb2'
|
||||||
|
},
|
||||||
|
emphasis: {
|
||||||
|
textStyle: {
|
||||||
|
color: 'red'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ name: '@name', value: '@integer(10, 8000)' },
|
||||||
|
{ name: '@name', value: '@integer(10, 8000)' },
|
||||||
|
{ name: '@name', value: '@integer(10, 8000)' },
|
||||||
|
{ name: '@name', value: '@integer(10, 8000)' },
|
||||||
|
{ name: '@name', value: '@integer(10, 8000)' },
|
||||||
|
{ name: '@name', value: '@integer(10, 8000)' },
|
||||||
|
{ name: '@name', value: '@integer(10, 8000)' },
|
||||||
|
{ name: '@name', value: '@integer(10, 8000)' },
|
||||||
|
{ name: '@name', value: '@integer(10, 8000)' },
|
||||||
|
{ name: '@name', value: '@integer(10, 8000)' },
|
||||||
|
{ name: '@name', value: '@integer(10, 8000)' },
|
||||||
|
{ name: '@name', value: '@integer(10, 8000)' },
|
||||||
|
{ name: '@name', value: '@integer(10, 8000)' },
|
||||||
|
{ name: '@name', value: '@integer(10, 8000)' },
|
||||||
|
{ name: '@name', value: '@integer(10, 8000)' },
|
||||||
|
{ name: '@name', value: '@integer(10, 8000)' },
|
||||||
|
{ name: '@name', value: '@integer(10, 8000)' },
|
||||||
|
{ name: '@name', value: '@integer(10, 8000)' },
|
||||||
|
{ name: '@name', value: '@integer(10, 8000)' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
// 树图
|
||||||
|
fetchTreemap: {
|
||||||
|
code: 0,
|
||||||
|
status: 200,
|
||||||
|
msg: '请求成功',
|
||||||
|
data: tTreemapJson
|
||||||
|
},
|
||||||
|
// 三维地球
|
||||||
|
threeEarth01Data: {
|
||||||
|
code: 0,
|
||||||
|
status: 200,
|
||||||
|
msg: '请求成功',
|
||||||
|
data: [
|
||||||
|
{
|
||||||
|
startArray: { name: '@name', N: '@integer(10, 100)', E: '@integer(10, 100)' },
|
||||||
|
'endArray|10': [{ name: '@name', N: '@integer(10, 100)', E: '@integer(10, 100)' }]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,50 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "@name",
|
||||||
|
"value": "@integer(0, 1000)",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"name": "@name",
|
||||||
|
"value": "@integer(0, 500)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@name",
|
||||||
|
"value": "@integer(0, 500)"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@name",
|
||||||
|
"value": "@integer(0, 1000)",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"name": "@name",
|
||||||
|
"value": "@integer(0, 00)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@name",
|
||||||
|
"value": "@integer(0, 500)"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@name",
|
||||||
|
"value": "@integer(0, 1000)",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"name": "@name",
|
||||||
|
"value": "@integer(0, 1000)"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "@name",
|
||||||
|
"value": "@integer(0, 1000)",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"name": "@name",
|
||||||
|
"value": "@integer(0, 1000)"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 103 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 9.1 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 176 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 9.3 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 8.7 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 8.2 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 5.4 KiB |
@@ -11,7 +11,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<n-list-item>
|
<n-list-item>
|
||||||
<n-space :size="20">
|
<n-space class="go-my-2" :size="20">
|
||||||
<n-text class="item-left">版权声明:</n-text>
|
<n-text class="item-left">版权声明:</n-text>
|
||||||
<n-text>
|
<n-text>
|
||||||
GoView 版权属于
|
GoView 版权属于
|
||||||
@@ -21,8 +21,7 @@
|
|||||||
</n-list-item>
|
</n-list-item>
|
||||||
|
|
||||||
<n-list-item>
|
<n-list-item>
|
||||||
<n-divider style="margin-top: 0" />
|
<n-space class="go-my-2" :size="20">
|
||||||
<n-space :size="20">
|
|
||||||
<n-text class="item-left">协议备注:</n-text>
|
<n-text class="item-left">协议备注:</n-text>
|
||||||
<n-text>
|
<n-text>
|
||||||
请遵守开源 MIT 协议,以上声明 <n-text type="error">不可删除</n-text>,否则视作侵权行为,后果自负!
|
请遵守开源 MIT 协议,以上声明 <n-text type="error">不可删除</n-text>,否则视作侵权行为,后果自负!
|
||||||
@@ -31,8 +30,7 @@
|
|||||||
</n-list-item>
|
</n-list-item>
|
||||||
|
|
||||||
<n-list-item>
|
<n-list-item>
|
||||||
<n-divider style="margin-top: 0" />
|
<n-space class="go-mt-2" :size="20">
|
||||||
<n-space :size="20">
|
|
||||||
<n-text class="item-left">商业授权:</n-text>
|
<n-text class="item-left">商业授权:</n-text>
|
||||||
<n-text>
|
<n-text>
|
||||||
若不想保留版权声明,请通过仓库/交流群 联系项目作者,进行授权
|
若不想保留版权声明,请通过仓库/交流群 联系项目作者,进行授权
|
||||||
|
|||||||
@@ -115,6 +115,13 @@ const list = reactive<ListType[]>([
|
|||||||
desc: '',
|
desc: '',
|
||||||
value: ''
|
value: ''
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
key: SettingStoreEnums.CHART_TOOLS_STATUS_HIDE,
|
||||||
|
value: settingStore.getChartToolsStatusHide,
|
||||||
|
type: 'switch',
|
||||||
|
name: '隐藏工具栏',
|
||||||
|
desc: '鼠标移入时,会展示切换到展开模式',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
key: SettingStoreEnums.CHART_TOOLS_STATUS,
|
key: SettingStoreEnums.CHART_TOOLS_STATUS,
|
||||||
value: settingStore.getChartToolsStatus,
|
value: settingStore.getChartToolsStatus,
|
||||||
@@ -183,11 +190,14 @@ const handleChange = (e: MouseEvent, item: ListType) => {
|
|||||||
width: 100px;
|
width: 100px;
|
||||||
}
|
}
|
||||||
.select-min-width {
|
.select-min-width {
|
||||||
width: 110px;
|
width: 115px;
|
||||||
}
|
}
|
||||||
@include deep() {
|
@include deep() {
|
||||||
.n-list-item:not(:last-child) {
|
.n-list-item {
|
||||||
border-bottom: 0;
|
border-bottom: 0!important;
|
||||||
|
}
|
||||||
|
.n-list-item__divider {
|
||||||
|
display: none!important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
<!-- eslint-disable vue/valid-template-root -->
|
||||||
<template></template>
|
<template></template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
|
|||||||
@@ -1,163 +1,124 @@
|
|||||||
<template>
|
<template>
|
||||||
<collapse-item v-if="title" name="标题">
|
<collapse-item v-if="title" name="标题">
|
||||||
<template #header>
|
<template #header>
|
||||||
<n-switch
|
<n-switch v-model:value="title.show" size="small"></n-switch>
|
||||||
v-show="inChart"
|
|
||||||
v-model:value="title.show"
|
|
||||||
size="small"
|
|
||||||
></n-switch>
|
|
||||||
</template>
|
</template>
|
||||||
<setting-item-box name="标题">
|
<setting-item-box name="标题">
|
||||||
<setting-item name="颜色">
|
<setting-item name="颜色">
|
||||||
<n-color-picker
|
<n-color-picker v-model:value="title.textStyle.color" size="small"></n-color-picker>
|
||||||
v-model:value="title.textStyle.color"
|
|
||||||
size="small"
|
|
||||||
></n-color-picker>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="大小">
|
<setting-item name="大小">
|
||||||
<n-input-number
|
<n-input-number v-model:value="title.textStyle.fontSize" :min="1" size="small"></n-input-number>
|
||||||
v-model:value="title.textStyle.fontSize"
|
|
||||||
:min="1"
|
|
||||||
size="small"
|
|
||||||
></n-input-number>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
<setting-item-box name="副标题">
|
<setting-item-box name="副标题">
|
||||||
<setting-item name="颜色">
|
<setting-item name="颜色">
|
||||||
<n-color-picker
|
<n-color-picker size="small" v-model:value="title.subtextStyle.color"></n-color-picker>
|
||||||
size="small"
|
|
||||||
v-model:value="title.subtextStyle.color"
|
|
||||||
></n-color-picker>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="大小">
|
<setting-item name="大小">
|
||||||
<n-input-number
|
<n-input-number v-model:value="title.subtextStyle.fontSize" :min="1" size="small"></n-input-number>
|
||||||
v-model:value="title.subtextStyle.fontSize"
|
</setting-item>
|
||||||
:min="1"
|
</setting-item-box>
|
||||||
size="small"
|
</collapse-item>
|
||||||
></n-input-number>
|
|
||||||
|
<collapse-item v-if="grid" name="容器">
|
||||||
|
<setting-item-box name="距离">
|
||||||
|
<setting-item name="左侧距离">
|
||||||
|
<n-input v-model:value="grid.left" size="small"></n-input>
|
||||||
|
</setting-item>
|
||||||
|
<setting-item name="右侧距离">
|
||||||
|
<n-input v-model:value="grid.right" size="small"></n-input>
|
||||||
|
</setting-item>
|
||||||
|
<setting-item name="上侧距离">
|
||||||
|
<n-input v-model:value="grid.top" size="small"></n-input>
|
||||||
|
</setting-item>
|
||||||
|
<setting-item name="下侧距离">
|
||||||
|
<n-input v-model:value="grid.bottom" size="small"></n-input>
|
||||||
</setting-item>
|
</setting-item>
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
</collapse-item>
|
</collapse-item>
|
||||||
|
|
||||||
<collapse-item v-if="xAxis" name="X轴">
|
<collapse-item v-if="xAxis" name="X轴">
|
||||||
<template #header>
|
<template #header>
|
||||||
<n-switch
|
<n-switch v-model:value="xAxis.show" size="small"></n-switch>
|
||||||
v-show="inChart"
|
|
||||||
v-model:value="xAxis.show"
|
|
||||||
size="small"
|
|
||||||
></n-switch>
|
|
||||||
</template>
|
</template>
|
||||||
<setting-item-box name="单位">
|
<setting-item-box name="单位">
|
||||||
<setting-item name="名称">
|
<setting-item name="名称">
|
||||||
<n-input v-model:value="xAxis.name" size="small"></n-input>
|
<n-input v-model:value="xAxis.name" size="small"></n-input>
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="颜色">
|
<setting-item name="颜色">
|
||||||
<n-color-picker
|
<n-color-picker size="small" v-model:value="xAxis.nameTextStyle.color"></n-color-picker>
|
||||||
size="small"
|
|
||||||
v-model:value="xAxis.nameTextStyle.color"
|
|
||||||
></n-color-picker>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="大小">
|
<setting-item name="大小">
|
||||||
<n-input-number
|
<n-input-number v-model:value="xAxis.nameTextStyle.fontSize" :min="12" size="small"></n-input-number>
|
||||||
v-model:value="xAxis.nameTextStyle.fontSize"
|
|
||||||
:min="12"
|
|
||||||
size="small"
|
|
||||||
></n-input-number>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="偏移量">
|
<setting-item name="偏移量">
|
||||||
<n-input-number
|
<n-input-number v-model:value="xAxis.nameGap" :min="5" size="small"></n-input-number>
|
||||||
v-model:value="xAxis.nameGap"
|
|
||||||
:min="5"
|
|
||||||
size="small"
|
|
||||||
></n-input-number>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
<setting-item-box name="标签">
|
<setting-item-box name="标签">
|
||||||
<setting-item v-show="inChart" name="展示">
|
<setting-item name="展示">
|
||||||
<n-space>
|
<n-space>
|
||||||
<n-switch
|
<n-switch v-model:value="xAxis.axisLabel.show" size="small"></n-switch>
|
||||||
v-model:value="xAxis.axisLabel.show"
|
|
||||||
size="small"
|
|
||||||
></n-switch>
|
|
||||||
</n-space>
|
</n-space>
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="颜色">
|
<setting-item name="颜色">
|
||||||
<n-color-picker
|
<n-color-picker size="small" v-model:value="xAxis.axisLabel.color"></n-color-picker>
|
||||||
size="small"
|
|
||||||
v-model:value="xAxis.axisLabel.color"
|
|
||||||
></n-color-picker>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="大小">
|
<setting-item name="大小">
|
||||||
<n-input-number
|
<n-input-number v-model:value="xAxis.axisLabel.fontSize" :min="8" size="small"></n-input-number>
|
||||||
v-model:value="xAxis.axisLabel.fontSize"
|
</setting-item>
|
||||||
:min="8"
|
<setting-item name="偏移量">
|
||||||
size="small"
|
<n-input-number v-model:value="xAxis.axisLabel.rotate" :min="-90" :max="90" size="small"></n-input-number>
|
||||||
></n-input-number>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
<setting-item-box name="轴线">
|
<setting-item-box name="轴线">
|
||||||
|
<setting-item name="展示">
|
||||||
|
<n-space>
|
||||||
|
<n-switch v-model:value="xAxis.axisLine.show" size="small"></n-switch>
|
||||||
|
</n-space>
|
||||||
|
</setting-item>
|
||||||
<setting-item name="颜色">
|
<setting-item name="颜色">
|
||||||
<n-color-picker
|
<n-color-picker v-model:value="xAxis.axisLine.lineStyle.color" size="small"></n-color-picker>
|
||||||
v-model:value="xAxis.axisLine.lineStyle.color"
|
|
||||||
size="small"
|
|
||||||
></n-color-picker>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="粗细">
|
<setting-item name="粗细">
|
||||||
<n-input-number
|
<n-input-number v-model:value="xAxis.axisLine.lineStyle.width" :min="1" size="small"></n-input-number>
|
||||||
v-model:value="xAxis.axisLine.lineStyle.width"
|
</setting-item>
|
||||||
:min="1"
|
<setting-item name="位置">
|
||||||
size="small"
|
<n-select v-model:value="xAxis.position" size="small" :options="axisConfig.xposition"></n-select>
|
||||||
></n-input-number>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="对齐零">
|
<setting-item name="对齐零">
|
||||||
<n-space>
|
<n-space>
|
||||||
<n-switch
|
<n-switch v-model:value="xAxis.axisLine.onZero" size="small"></n-switch>
|
||||||
v-model:value="xAxis.axisLine.onZero"
|
|
||||||
size="small"
|
|
||||||
></n-switch>
|
|
||||||
</n-space>
|
</n-space>
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item v-show="inChart" name="反向">
|
<setting-item name="反向">
|
||||||
<n-space>
|
<n-space>
|
||||||
<n-switch v-model:value="xAxis.inverse" size="small"></n-switch>
|
<n-switch v-model:value="xAxis.inverse" size="small"></n-switch>
|
||||||
</n-space>
|
</n-space>
|
||||||
</setting-item>
|
</setting-item>
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
<setting-item-box name="刻度">
|
<setting-item-box name="刻度">
|
||||||
<setting-item v-show="inChart" name="展示">
|
<setting-item name="展示">
|
||||||
<n-space>
|
<n-space>
|
||||||
<n-switch v-model:value="xAxis.axisTick.show" size="small"></n-switch>
|
<n-switch v-model:value="xAxis.axisTick.show" size="small"></n-switch>
|
||||||
</n-space>
|
</n-space>
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="长度">
|
<setting-item name="长度">
|
||||||
<n-input-number
|
<n-input-number v-model:value="xAxis.axisTick.length" :min="1" size="small"></n-input-number>
|
||||||
v-model:value="xAxis.axisTick.length"
|
|
||||||
:min="1"
|
|
||||||
size="small"
|
|
||||||
></n-input-number>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
<setting-item-box name="分割线">
|
<setting-item-box name="分割线">
|
||||||
<setting-item v-show="inChart" name="展示">
|
<setting-item name="展示">
|
||||||
<n-space>
|
<n-space>
|
||||||
<n-switch
|
<n-switch v-model:value="xAxis.splitLine.show" size="small"></n-switch>
|
||||||
v-model:value="xAxis.splitLine.show"
|
|
||||||
size="small"
|
|
||||||
></n-switch>
|
|
||||||
</n-space>
|
</n-space>
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="颜色">
|
<setting-item name="颜色">
|
||||||
<n-color-picker
|
<n-color-picker v-model:value="xAxis.splitLine.lineStyle.color" size="small"></n-color-picker>
|
||||||
v-model:value="xAxis.splitLine.lineStyle.color"
|
|
||||||
size="small"
|
|
||||||
></n-color-picker>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="粗细">
|
<setting-item name="粗细">
|
||||||
<n-input-number
|
<n-input-number v-model:value="xAxis.splitLine.lineStyle.width" :min="1" size="small"></n-input-number>
|
||||||
v-model:value="xAxis.splitLine.lineStyle.width"
|
|
||||||
:min="1"
|
|
||||||
size="small"
|
|
||||||
></n-input-number>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="类型">
|
<setting-item name="类型">
|
||||||
<n-select
|
<n-select
|
||||||
@@ -166,140 +127,90 @@
|
|||||||
:options="axisConfig.splitLint.lineStyle.type"
|
:options="axisConfig.splitLint.lineStyle.type"
|
||||||
></n-select>
|
></n-select>
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="位置">
|
|
||||||
<n-select
|
|
||||||
v-model:value="xAxis.position"
|
|
||||||
size="small"
|
|
||||||
:options="axisConfig.xposition"
|
|
||||||
></n-select>
|
|
||||||
</setting-item>
|
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
</collapse-item>
|
</collapse-item>
|
||||||
|
|
||||||
<collapse-item v-if="yAxis" name="Y轴">
|
<collapse-item v-if="yAxis" name="Y轴">
|
||||||
<template #header>
|
<template #header>
|
||||||
<n-switch
|
<n-switch v-model:value="yAxis.show" size="small"></n-switch>
|
||||||
v-show="inChart"
|
|
||||||
v-model:value="yAxis.show"
|
|
||||||
size="small"
|
|
||||||
></n-switch>
|
|
||||||
</template>
|
</template>
|
||||||
<setting-item-box name="单位">
|
<setting-item-box name="单位">
|
||||||
<setting-item name="名称">
|
<setting-item name="名称">
|
||||||
<n-input v-model:value="yAxis.name" size="small"></n-input>
|
<n-input v-model:value="yAxis.name" size="small"></n-input>
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="颜色">
|
<setting-item name="颜色">
|
||||||
<n-color-picker
|
<n-color-picker size="small" v-model:value="yAxis.nameTextStyle.color"></n-color-picker>
|
||||||
size="small"
|
|
||||||
v-model:value="yAxis.nameTextStyle.color"
|
|
||||||
></n-color-picker>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="大小">
|
<setting-item name="大小">
|
||||||
<n-input-number
|
<n-input-number v-model:value="yAxis.nameTextStyle.fontSize" :min="8" size="small"></n-input-number>
|
||||||
v-model:value="yAxis.nameTextStyle.fontSize"
|
|
||||||
:min="8"
|
|
||||||
size="small"
|
|
||||||
></n-input-number>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="偏移量">
|
<setting-item name="偏移量">
|
||||||
<n-input-number
|
<n-input-number v-model:value="yAxis.nameGap" :min="5" size="small"></n-input-number>
|
||||||
v-model:value="yAxis.nameGap"
|
|
||||||
:min="5"
|
|
||||||
size="small"
|
|
||||||
></n-input-number>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
<setting-item-box name="标签">
|
<setting-item-box name="标签">
|
||||||
<setting-item v-show="inChart" name="展示">
|
<setting-item name="展示">
|
||||||
<n-space>
|
<n-space>
|
||||||
<n-switch
|
<n-switch v-model:value="yAxis.axisLabel.show" size="small"></n-switch>
|
||||||
v-model:value="yAxis.axisLabel.show"
|
|
||||||
size="small"
|
|
||||||
></n-switch>
|
|
||||||
</n-space>
|
</n-space>
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="颜色">
|
<setting-item name="颜色">
|
||||||
<n-color-picker
|
<n-color-picker size="small" v-model:value="yAxis.axisLabel.color"></n-color-picker>
|
||||||
size="small"
|
|
||||||
v-model:value="yAxis.axisLabel.color"
|
|
||||||
></n-color-picker>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="大小">
|
<setting-item name="大小">
|
||||||
<n-input-number
|
<n-input-number v-model:value="yAxis.axisLabel.fontSize" :min="8" size="small"></n-input-number>
|
||||||
v-model:value="yAxis.axisLabel.fontSize"
|
</setting-item>
|
||||||
:min="8"
|
<setting-item name="偏移量">
|
||||||
size="small"
|
<n-input-number v-model:value="yAxis.axisLabel.rotate" :min="-90" :max="90" size="small"></n-input-number>
|
||||||
></n-input-number>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
<setting-item-box name="轴线">
|
<setting-item-box name="轴线">
|
||||||
<setting-item v-show="inChart" name="展示">
|
<setting-item name="展示">
|
||||||
<n-space>
|
<n-space>
|
||||||
<n-switch v-model:value="yAxis.axisLine.show" size="small"></n-switch>
|
<n-switch v-model:value="yAxis.axisLine.show" size="small"></n-switch>
|
||||||
</n-space>
|
</n-space>
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="颜色">
|
<setting-item name="颜色">
|
||||||
<n-color-picker
|
<n-color-picker v-model:value="yAxis.axisLine.lineStyle.color" size="small"></n-color-picker>
|
||||||
v-model:value="yAxis.axisLine.lineStyle.color"
|
|
||||||
size="small"
|
|
||||||
></n-color-picker>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="粗细">
|
<setting-item name="粗细">
|
||||||
<n-input-number
|
<n-input-number v-model:value="yAxis.axisLine.lineStyle.width" :min="1" size="small"></n-input-number>
|
||||||
v-model:value="yAxis.axisLine.lineStyle.width"
|
</setting-item>
|
||||||
:min="1"
|
<setting-item name="位置">
|
||||||
size="small"
|
<n-select v-model:value="yAxis.position" size="small" :options="axisConfig.yposition"></n-select>
|
||||||
></n-input-number>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="对齐零">
|
<setting-item name="对齐零">
|
||||||
<n-space>
|
<n-space>
|
||||||
<n-switch
|
<n-switch v-model:value="yAxis.axisLine.onZero" size="small"></n-switch>
|
||||||
v-model:value="yAxis.axisLine.onZero"
|
|
||||||
size="small"
|
|
||||||
></n-switch>
|
|
||||||
</n-space>
|
</n-space>
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item v-show="inChart" name="反向">
|
<setting-item name="反向">
|
||||||
<n-space>
|
<n-space>
|
||||||
<n-switch v-model:value="yAxis.inverse" size="small"></n-switch>
|
<n-switch v-model:value="yAxis.inverse" size="small"></n-switch>
|
||||||
</n-space>
|
</n-space>
|
||||||
</setting-item>
|
</setting-item>
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
<setting-item-box name="刻度">
|
<setting-item-box name="刻度">
|
||||||
<setting-item v-show="inChart" name="展示">
|
<setting-item name="展示">
|
||||||
<n-space>
|
<n-space>
|
||||||
<n-switch v-model:value="yAxis.axisTick.show" size="small"></n-switch>
|
<n-switch v-model:value="yAxis.axisTick.show" size="small"></n-switch>
|
||||||
</n-space>
|
</n-space>
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="长度">
|
<setting-item name="长度">
|
||||||
<n-input-number
|
<n-input-number v-model:value="yAxis.axisTick.length" :min="1" size="small"></n-input-number>
|
||||||
v-model:value="yAxis.axisTick.length"
|
|
||||||
:min="1"
|
|
||||||
size="small"
|
|
||||||
></n-input-number>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
<setting-item-box name="分割线">
|
<setting-item-box name="分割线">
|
||||||
<setting-item v-show="inChart" name="展示">
|
<setting-item name="展示">
|
||||||
<n-space>
|
<n-space>
|
||||||
<n-switch
|
<n-switch v-model:value="yAxis.splitLine.show" size="small"></n-switch>
|
||||||
v-model:value="yAxis.splitLine.show"
|
|
||||||
size="small"
|
|
||||||
></n-switch>
|
|
||||||
</n-space>
|
</n-space>
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="颜色">
|
<setting-item name="颜色">
|
||||||
<n-color-picker
|
<n-color-picker v-model:value="yAxis.splitLine.lineStyle.color" size="small"></n-color-picker>
|
||||||
v-model:value="yAxis.splitLine.lineStyle.color"
|
|
||||||
size="small"
|
|
||||||
></n-color-picker>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="粗细">
|
<setting-item name="粗细">
|
||||||
<n-input-number
|
<n-input-number v-model:value="yAxis.splitLine.lineStyle.width" :min="1" size="small"></n-input-number>
|
||||||
v-model:value="yAxis.splitLine.lineStyle.width"
|
|
||||||
:min="1"
|
|
||||||
size="small"
|
|
||||||
></n-input-number>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="类型">
|
<setting-item name="类型">
|
||||||
<n-select
|
<n-select
|
||||||
@@ -308,44 +219,70 @@
|
|||||||
:options="axisConfig.splitLint.lineStyle.type"
|
:options="axisConfig.splitLint.lineStyle.type"
|
||||||
></n-select>
|
></n-select>
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="位置">
|
|
||||||
<n-select
|
|
||||||
v-model:value="yAxis.position"
|
|
||||||
size="small"
|
|
||||||
:options="axisConfig.yposition"
|
|
||||||
></n-select>
|
|
||||||
</setting-item>
|
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
</collapse-item>
|
</collapse-item>
|
||||||
|
|
||||||
<collapse-item v-if="legend" name="图例">
|
<collapse-item v-if="legend" name="图例">
|
||||||
<template #header>
|
<template #header>
|
||||||
<n-switch
|
<n-switch v-model:value="legend.show" size="small"></n-switch>
|
||||||
v-show="inChart"
|
|
||||||
v-model:value="legend.show"
|
|
||||||
size="small"
|
|
||||||
></n-switch>
|
|
||||||
</template>
|
</template>
|
||||||
<setting-item-box name="图例文字">
|
<setting-item-box name="图例文字">
|
||||||
<setting-item>
|
<setting-item>
|
||||||
<n-color-picker
|
<n-color-picker size="small" v-model:value="legend.textStyle.color"></n-color-picker>
|
||||||
size="small"
|
|
||||||
v-model:value="legend.textStyle.color"
|
|
||||||
></n-color-picker>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
</collapse-item>
|
</collapse-item>
|
||||||
|
|
||||||
|
<collapse-item v-if="visualMap" name="视觉映射">
|
||||||
|
<template #header>
|
||||||
|
<n-switch v-model:value="visualMap.show" size="small"></n-switch>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<setting-item-box name="范围">
|
||||||
|
<setting-item name="最小值">
|
||||||
|
<n-input-number v-model:value="visualMap.min" size="small"></n-input-number>
|
||||||
|
</setting-item>
|
||||||
|
<setting-item name="最大值">
|
||||||
|
<n-input-number v-model:value="visualMap.max" size="small"></n-input-number>
|
||||||
|
</setting-item>
|
||||||
|
</setting-item-box>
|
||||||
|
|
||||||
|
<setting-item-box name="颜色">
|
||||||
|
<setting-item :name="`层级-${index + 1}`" v-for="(item, index) in visualMap.inRange.color" :key="index">
|
||||||
|
<n-color-picker v-model:value="visualMap.inRange.color[index]" size="small"></n-color-picker>
|
||||||
|
</setting-item>
|
||||||
|
</setting-item-box>
|
||||||
|
|
||||||
|
<setting-item-box name="控制块">
|
||||||
|
<setting-item name="放置方向">
|
||||||
|
<n-select v-model:value="visualMap.orient" size="small" :options="axisConfig.visualMap.orient"></n-select>
|
||||||
|
</setting-item>
|
||||||
|
<setting-item name="宽度">
|
||||||
|
<n-input-number v-model:value="visualMap.itemWidth" :min="5" size="small"></n-input-number>
|
||||||
|
</setting-item>
|
||||||
|
<setting-item name="高度">
|
||||||
|
<n-input-number v-model:value="visualMap.itemHeight" :min="5" size="small"></n-input-number>
|
||||||
|
</setting-item>
|
||||||
|
<setting-item name="反转">
|
||||||
|
<n-space>
|
||||||
|
<n-switch v-model:value="visualMap.inverse" size="small"></n-switch>
|
||||||
|
</n-space>
|
||||||
|
</setting-item>
|
||||||
|
<setting-item name="拖拽组件实时更新">
|
||||||
|
<n-space>
|
||||||
|
<n-switch v-model:value="visualMap.realtime" size="small"></n-switch>
|
||||||
|
</n-space>
|
||||||
|
</setting-item>
|
||||||
|
</setting-item-box>
|
||||||
|
<global-setting-position :targetData="visualMap"></global-setting-position>
|
||||||
|
</collapse-item>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { PropType, computed } from 'vue'
|
import { PropType, computed } from 'vue'
|
||||||
import { GlobalThemeJsonType } from '@/settings/chartThemes/index'
|
import { GlobalThemeJsonType } from '@/settings/chartThemes/index'
|
||||||
import { axisConfig } from '@/packages/chartConfiguration/echarts/index'
|
import { axisConfig } from '@/packages/chartConfiguration/echarts/index'
|
||||||
import {
|
import { CollapseItem, SettingItemBox, SettingItem, GlobalSettingPosition } from '@/components/Pages/ChartItemSetting'
|
||||||
CollapseItem,
|
|
||||||
SettingItemBox,
|
|
||||||
SettingItem
|
|
||||||
} from '@/components/Pages/ChartItemSetting'
|
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
optionData: {
|
optionData: {
|
||||||
@@ -374,4 +311,12 @@ const yAxis = computed(() => {
|
|||||||
const legend = computed(() => {
|
const legend = computed(() => {
|
||||||
return props.optionData.legend
|
return props.optionData.legend
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const grid = computed(() => {
|
||||||
|
return props.optionData.grid
|
||||||
|
})
|
||||||
|
|
||||||
|
const visualMap = computed(() => {
|
||||||
|
return props.optionData.visualMap
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
<template>
|
||||||
|
<setting-item-box v-if="targetData" name="位置">
|
||||||
|
<setting-item :name="`偏移 X:${targetData.left || 0}px`">
|
||||||
|
<n-input-number v-model:value="targetData.left" size="small" step="10"></n-input-number>
|
||||||
|
</setting-item>
|
||||||
|
<setting-item :name="`偏移 Y:${targetData.top || 0}px`">
|
||||||
|
<n-input-number v-model:value="targetData.top" size="small" step="10"></n-input-number>
|
||||||
|
</setting-item>
|
||||||
|
</setting-item-box>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { PropType, reactive } from 'vue'
|
||||||
|
import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
|
||||||
|
|
||||||
|
type positionType = {
|
||||||
|
top?: number | string | null
|
||||||
|
left?: number | string | null
|
||||||
|
right?: number | string | null
|
||||||
|
bottom?: number | string | null
|
||||||
|
}
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
targetData: {
|
||||||
|
type: Object as PropType<positionType>,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
@@ -1,10 +1,13 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-show="isGroup">
|
<div v-show="isGroup">
|
||||||
<n-divider n-divider style="margin: 10px 0"></n-divider>
|
<n-divider n-divider style="margin: 10px 0"></n-divider>
|
||||||
<n-tag type="warning"> 解散分组「 {{ isCanvas ? '滤镜' : '滤镜 / 变换' }} 」也将消失!</n-tag>
|
<n-tag type="warning"> 解散分组「 {{ isCanvas ? '滤镜' : '滤镜 / 变换' }} 」也将消失!</n-tag>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<collapse-item :name="isCanvas ? '滤镜' : '滤镜 / 变换'">
|
<collapse-item :name="isCanvas ? '滤镜' : '滤镜 / 变换'">
|
||||||
|
<template #header>
|
||||||
|
<n-switch v-model:value="chartStyles.filterShow" size="small"></n-switch>
|
||||||
|
</template>
|
||||||
<setting-item-box name="色相" :alone="true">
|
<setting-item-box name="色相" :alone="true">
|
||||||
<setting-item :name="`值:${chartStyles.hueRotate}deg`">
|
<setting-item :name="`值:${chartStyles.hueRotate}deg`">
|
||||||
<!-- 透明度 -->
|
<!-- 透明度 -->
|
||||||
@@ -66,6 +69,24 @@
|
|||||||
</setting-item>
|
</setting-item>
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
|
|
||||||
|
<!-- 混合模式 -->
|
||||||
|
<setting-item-box v-if="!isCanvas" :alone="true">
|
||||||
|
<template #name>
|
||||||
|
<n-text>混合</n-text>
|
||||||
|
<n-tooltip trigger="hover">
|
||||||
|
<template #trigger>
|
||||||
|
<n-icon size="21" :depth="3">
|
||||||
|
<help-outline-icon></help-outline-icon>
|
||||||
|
</n-icon>
|
||||||
|
</template>
|
||||||
|
<n-text>视频组件需要底色透明一般选中滤色</n-text>
|
||||||
|
</n-tooltip>
|
||||||
|
</template>
|
||||||
|
<setting-item>
|
||||||
|
<n-select v-model:value="chartStyles.blendMode" size="small" filterable :options="BlendModeEnumList"></n-select>
|
||||||
|
</setting-item>
|
||||||
|
</setting-item-box>
|
||||||
|
|
||||||
<!-- 变换 -->
|
<!-- 变换 -->
|
||||||
<setting-item-box v-if="!isCanvas" name="旋转°">
|
<setting-item-box v-if="!isCanvas" name="旋转°">
|
||||||
<setting-item name="Z轴(平面) - 旋转">
|
<setting-item name="Z轴(平面) - 旋转">
|
||||||
@@ -121,13 +142,17 @@
|
|||||||
></n-input-number>
|
></n-input-number>
|
||||||
</setting-item>
|
</setting-item>
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
|
|
||||||
|
<!-- 提示 -->
|
||||||
|
<n-tag type="warning"> 若预览时大屏模糊,可以尝试关闭滤镜进行修复 </n-tag>
|
||||||
</collapse-item>
|
</collapse-item>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { PropType } from 'vue'
|
import { PropType } from 'vue'
|
||||||
import { PickCreateComponentType } from '@/packages/index.d'
|
import { PickCreateComponentType, BlendModeEnumList } from '@/packages/index.d'
|
||||||
import { SettingItemBox, SettingItem, CollapseItem } from '@/components/Pages/ChartItemSetting'
|
import { SettingItemBox, SettingItem, CollapseItem } from '@/components/Pages/ChartItemSetting'
|
||||||
|
import { icon } from '@/plugins'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
isGroup: {
|
isGroup: {
|
||||||
@@ -144,14 +169,14 @@ const props = defineProps({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// 百分比格式化persen
|
const { HelpOutlineIcon } = icon.ionicons5
|
||||||
|
|
||||||
|
// 百分比格式化 person
|
||||||
const sliderFormatTooltip = (v: string) => {
|
const sliderFormatTooltip = (v: string) => {
|
||||||
// @ts-ignore
|
|
||||||
return `${(parseFloat(v) * 100).toFixed(0)}%`
|
return `${(parseFloat(v) * 100).toFixed(0)}%`
|
||||||
}
|
}
|
||||||
// 角度格式化
|
// 角度格式化
|
||||||
const degFormatTooltip = (v: string) => {
|
const degFormatTooltip = (v: string) => {
|
||||||
// @ts-ignore
|
|
||||||
return `${v}deg`
|
return `${v}deg`
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -5,6 +5,9 @@ import CollapseItem from './CollapseItem.vue'
|
|||||||
|
|
||||||
// 全局配置属性
|
// 全局配置属性
|
||||||
import GlobalSetting from './GlobalSetting.vue'
|
import GlobalSetting from './GlobalSetting.vue'
|
||||||
|
// 全局配置属性-位置
|
||||||
|
import GlobalSettingPosition from './GlobalSettingPosition.vue'
|
||||||
|
|
||||||
// 名称
|
// 名称
|
||||||
import NameSetting from './NameSetting.vue'
|
import NameSetting from './NameSetting.vue'
|
||||||
// 方向
|
// 方向
|
||||||
@@ -14,4 +17,4 @@ import SizeSetting from './SizeSetting.vue'
|
|||||||
// 样式
|
// 样式
|
||||||
import StylesSetting from './StylesSetting.vue'
|
import StylesSetting from './StylesSetting.vue'
|
||||||
|
|
||||||
export { CollapseItem, SettingItemBox, SettingItem, GlobalSetting, NameSetting, PositionSetting, SizeSetting, StylesSetting }
|
export { CollapseItem, SettingItemBox, SettingItem, GlobalSetting, GlobalSettingPosition, NameSetting, PositionSetting, SizeSetting, StylesSetting }
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
import Flipper from './index.vue'
|
||||||
|
|
||||||
|
type FlipType = 'up' | 'down'
|
||||||
|
|
||||||
|
export { Flipper, FlipType }
|
||||||
@@ -0,0 +1,218 @@
|
|||||||
|
<template>
|
||||||
|
<div class="go-Flipper" :class="[flipType, { go: isFlipping }]">
|
||||||
|
<div class="digital front" :data-front="frontTextFromData"></div>
|
||||||
|
<div class="digital back" :data-back="backTextFromData"></div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { ref, PropType, watch } from 'vue'
|
||||||
|
import { FlipType } from './index'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
flipType: {
|
||||||
|
type: String as PropType<FlipType>,
|
||||||
|
default: () => {
|
||||||
|
return 'down'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
count: {
|
||||||
|
type: [Number, String],
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
|
duration: {
|
||||||
|
type: Number,
|
||||||
|
default: 600
|
||||||
|
},
|
||||||
|
width: {
|
||||||
|
type: Number,
|
||||||
|
default: 60
|
||||||
|
},
|
||||||
|
height: {
|
||||||
|
type: Number,
|
||||||
|
default: 100
|
||||||
|
},
|
||||||
|
radius: {
|
||||||
|
type: Number,
|
||||||
|
default: 10
|
||||||
|
},
|
||||||
|
frontColor: {
|
||||||
|
type: String,
|
||||||
|
default: '#ffffff'
|
||||||
|
},
|
||||||
|
backColor: {
|
||||||
|
type: String,
|
||||||
|
default: '#000000'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const isFlipping = ref(false)
|
||||||
|
const frontTextFromData = ref(props.count || 0)
|
||||||
|
const backTextFromData = ref(props.count || 0)
|
||||||
|
|
||||||
|
// 翻牌
|
||||||
|
const flip = (front: string | number, back: string | number) => {
|
||||||
|
// 如果处于翻转中,则不执行
|
||||||
|
if (isFlipping.value) return
|
||||||
|
// 设置翻盘前后数据
|
||||||
|
backTextFromData.value = back
|
||||||
|
frontTextFromData.value = front
|
||||||
|
|
||||||
|
// 设置翻转状态为true
|
||||||
|
isFlipping.value = true
|
||||||
|
|
||||||
|
// 翻牌结束的行为
|
||||||
|
setTimeout(() => {
|
||||||
|
isFlipping.value = false // 设置翻转状态为false
|
||||||
|
frontTextFromData.value = back
|
||||||
|
}, props.duration)
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => props.count,
|
||||||
|
(newVal, oldVal) => {
|
||||||
|
flip(oldVal as string | number, newVal as string | number)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
immediate: true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
$frontColor: v-bind('props.frontColor');
|
||||||
|
$backColor: v-bind('props.backColor');
|
||||||
|
$radius: v-bind('`${props.radius}px`');
|
||||||
|
$width: v-bind('`${props.width}px`');
|
||||||
|
$height: v-bind('`${props.height}px`');
|
||||||
|
$perspective: v-bind('`${props.height * 2}px`');
|
||||||
|
$speed: v-bind('`${props.duration / 1000}s`');
|
||||||
|
$shadowColor: #000000;
|
||||||
|
$lineColor: #4a9ef8;
|
||||||
|
|
||||||
|
// #region 动画效果
|
||||||
|
@keyframes frontFlipDown {
|
||||||
|
0% {
|
||||||
|
transform: perspective($perspective) rotateX(0deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: perspective($perspective) rotateX(-180deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@keyframes backFlipDown {
|
||||||
|
0% {
|
||||||
|
transform: perspective($perspective) rotateX(180deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: perspective($perspective) rotateX(0deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@keyframes frontFlipUp {
|
||||||
|
0% {
|
||||||
|
transform: perspective($perspective) rotateX(0deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: perspective($perspective) rotateX(180deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@keyframes backFlipUp {
|
||||||
|
0% {
|
||||||
|
transform: perspective($perspective) rotateX(-180deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: perspective($perspective) rotateX(0deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
.go-Flipper {
|
||||||
|
display: inline-block;
|
||||||
|
position: relative;
|
||||||
|
width: $width;
|
||||||
|
height: $height;
|
||||||
|
line-height: $height;
|
||||||
|
border: solid 1px $backColor;
|
||||||
|
border-radius: $radius;
|
||||||
|
background: $frontColor;
|
||||||
|
font-size: $width;
|
||||||
|
color: $frontColor;
|
||||||
|
box-shadow: 0 0 6px rgba($color: $shadowColor, $alpha: 0.5); // 阴影部分
|
||||||
|
text-align: center;
|
||||||
|
// font-family: 'Helvetica Neue';
|
||||||
|
|
||||||
|
.digital:before,
|
||||||
|
.digital:after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
background: $backColor;
|
||||||
|
overflow: hidden;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.digital.front:before,
|
||||||
|
.digital.front:after {
|
||||||
|
content: attr(data-front) !important;
|
||||||
|
}
|
||||||
|
.digital.back:before,
|
||||||
|
.digital.back:after {
|
||||||
|
content: attr(data-back) !important;
|
||||||
|
}
|
||||||
|
.digital:before {
|
||||||
|
top: 0;
|
||||||
|
bottom: 50%;
|
||||||
|
border-radius: $radius $radius 0 0;
|
||||||
|
border-bottom: solid 1px rgba($color: $lineColor, $alpha: 0.3); // 中间线颜色
|
||||||
|
}
|
||||||
|
.digital:after {
|
||||||
|
top: 50%;
|
||||||
|
bottom: 0;
|
||||||
|
border-radius: 0 0 $radius $radius;
|
||||||
|
line-height: 0;
|
||||||
|
}
|
||||||
|
/*向下翻*/
|
||||||
|
&.down .front:before {
|
||||||
|
z-index: 3;
|
||||||
|
}
|
||||||
|
&.down .back:after {
|
||||||
|
z-index: 2;
|
||||||
|
transform-origin: 50% 0%;
|
||||||
|
transform: perspective($perspective) rotateX(180deg);
|
||||||
|
}
|
||||||
|
&.down .front:after,
|
||||||
|
&.down .back:before {
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
&.down.go .front:before {
|
||||||
|
transform-origin: 50% 100%;
|
||||||
|
animation: frontFlipDown $speed ease-in-out both;
|
||||||
|
box-shadow: 0 -2px 6px rgba($color: $lineColor, $alpha: 0.3);
|
||||||
|
backface-visibility: hidden;
|
||||||
|
}
|
||||||
|
&.down.go .back:after {
|
||||||
|
animation: backFlipDown $speed ease-in-out both;
|
||||||
|
}
|
||||||
|
/*向上翻*/
|
||||||
|
&.up .front:after {
|
||||||
|
z-index: 3;
|
||||||
|
}
|
||||||
|
&.up .back:before {
|
||||||
|
z-index: 2;
|
||||||
|
transform-origin: 50% 100%;
|
||||||
|
transform: perspective($perspective) rotateX(-180deg);
|
||||||
|
}
|
||||||
|
&.up .front:before,
|
||||||
|
&.up .back:after {
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
&.up.go .front:after {
|
||||||
|
transform-origin: 50% 0;
|
||||||
|
animation: frontFlipUp $speed ease-in-out both;
|
||||||
|
box-shadow: 0 2px 6px rgba($color: $lineColor, $alpha: 0.3);
|
||||||
|
backface-visibility: hidden;
|
||||||
|
}
|
||||||
|
&.up.go .back:before {
|
||||||
|
animation: backFlipUp $speed ease-in-out both;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
|
<!-- eslint-disable vue/valid-template-root -->
|
||||||
<template></template>
|
<template></template>
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { useDialog } from 'naive-ui';
|
import { useDialog } from 'naive-ui'
|
||||||
//挂载在 window 方便与在js中使用
|
//挂载在 window 方便与在js中使用
|
||||||
window['$dialog'] = useDialog();
|
window['$dialog'] = useDialog()
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
<!-- eslint-disable vue/valid-template-root -->
|
||||||
<template></template>
|
<template></template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
|
<!-- eslint-disable vue/valid-template-root -->
|
||||||
<template></template>
|
<template></template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { useMessage } from 'naive-ui';
|
import { useMessage } from 'naive-ui'
|
||||||
//挂载在 window 方便与在js中使用
|
//挂载在 window 方便与在js中使用
|
||||||
window['$message'] = useMessage();
|
window['$message'] = useMessage()
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -37,7 +37,9 @@ const props = defineProps({
|
|||||||
hidden: {
|
hidden: {
|
||||||
request: false,
|
request: false,
|
||||||
type: Array,
|
type: Array,
|
||||||
default: []
|
default() {
|
||||||
|
return []
|
||||||
|
}
|
||||||
},
|
},
|
||||||
// 使用全屏功能
|
// 使用全屏功能
|
||||||
narrow: {
|
narrow: {
|
||||||
@@ -76,7 +78,7 @@ const btnList: {
|
|||||||
icon: RemoveIcon
|
icon: RemoveIcon
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: isFull ? '缩小' : '放大',
|
title: isFull.value ? '缩小' : '放大',
|
||||||
key: props.narrow ? 'fullResize' : 'resize',
|
key: props.narrow ? 'fullResize' : 'resize',
|
||||||
icon: ResizeIcon
|
icon: ResizeIcon
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// 鼠标点击左右键
|
// 鼠标点击左右键
|
||||||
export enum MouseEventButton {
|
export enum MouseEventButton {
|
||||||
LEFT = 1,
|
LEFT = 1,
|
||||||
RIGHT = 2,
|
RIGHT = 2
|
||||||
}
|
}
|
||||||
|
|
||||||
// 页面拖拽键名
|
// 页面拖拽键名
|
||||||
@@ -9,6 +9,12 @@ export enum DragKeyEnum {
|
|||||||
DRAG_KEY = 'ChartData'
|
DRAG_KEY = 'ChartData'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 不同页面保存操作
|
||||||
|
export enum SavePageEnum {
|
||||||
|
CHART = 'SaveChart',
|
||||||
|
JSON = 'SaveJSON'
|
||||||
|
}
|
||||||
|
|
||||||
// 操作枚举
|
// 操作枚举
|
||||||
export enum MenuEnum {
|
export enum MenuEnum {
|
||||||
// 移动
|
// 移动
|
||||||
@@ -41,7 +47,17 @@ export enum MenuEnum {
|
|||||||
// 后退
|
// 后退
|
||||||
BACK = 'back',
|
BACK = 'back',
|
||||||
// 前进
|
// 前进
|
||||||
FORWORD = 'forward'
|
FORWORD = 'forward',
|
||||||
|
// 保存
|
||||||
|
SAVE = 'save',
|
||||||
|
// 锁定
|
||||||
|
LOCK = 'lock',
|
||||||
|
// 解除锁定
|
||||||
|
UNLOCK = 'unLock',
|
||||||
|
// 隐藏
|
||||||
|
HIDE = 'hide',
|
||||||
|
// 显示
|
||||||
|
SHOW = 'show'
|
||||||
}
|
}
|
||||||
|
|
||||||
// Win 键盘枚举
|
// Win 键盘枚举
|
||||||
@@ -49,9 +65,9 @@ export enum WinKeyboard {
|
|||||||
CTRL = 'ctrl',
|
CTRL = 'ctrl',
|
||||||
SHIFT = 'shift',
|
SHIFT = 'shift',
|
||||||
ALT = ' alt',
|
ALT = ' alt',
|
||||||
CTRL_SOURCE_KEY = "control",
|
CTRL_SOURCE_KEY = 'control',
|
||||||
SHIFT_SOURCE_KEY = "shift",
|
SHIFT_SOURCE_KEY = 'shift',
|
||||||
ALT_SOURCE_KEY = "alt"
|
ALT_SOURCE_KEY = 'alt'
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mac 键盘枚举
|
// Mac 键盘枚举
|
||||||
@@ -60,7 +76,7 @@ export enum MacKeyboard {
|
|||||||
CTRL = '⌘',
|
CTRL = '⌘',
|
||||||
SHIFT = '⇧',
|
SHIFT = '⇧',
|
||||||
ALT = '⌥',
|
ALT = '⌥',
|
||||||
CTRL_SOURCE_KEY = "⌘",
|
CTRL_SOURCE_KEY = '⌘',
|
||||||
SHIFT_SOURCE_KEY = "⇧",
|
SHIFT_SOURCE_KEY = '⇧',
|
||||||
ALT_SOURCE_KEY = "⌥"
|
ALT_SOURCE_KEY = '⌥'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ export enum ResultEnum {
|
|||||||
SERVER_ERROR = 500,
|
SERVER_ERROR = 500,
|
||||||
SERVER_FORBIDDEN = 403,
|
SERVER_FORBIDDEN = 403,
|
||||||
NOT_FOUND = 404,
|
NOT_FOUND = 404,
|
||||||
TIMEOUT = 10042
|
TIMEOUT = 60000
|
||||||
}
|
}
|
||||||
|
|
||||||
// 数据相关
|
// 数据相关
|
||||||
|
|||||||
@@ -12,6 +12,12 @@ export enum PreviewEnum {
|
|||||||
CHART_PREVIEW_NAME = 'ChartPreview',
|
CHART_PREVIEW_NAME = 'ChartPreview',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export enum EditEnum {
|
||||||
|
// 图表JSON编辑
|
||||||
|
CHART_EDIT = '/chart/edit/:id(.*)*',
|
||||||
|
CHART_EDIT_NAME = 'ChartEdit',
|
||||||
|
}
|
||||||
|
|
||||||
export enum PageEnum {
|
export enum PageEnum {
|
||||||
// 登录
|
// 登录
|
||||||
BASE_LOGIN = '/login',
|
BASE_LOGIN = '/login',
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
export * from '@/hooks/useTheme.hook'
|
export * from '@/hooks/useTheme.hook'
|
||||||
export * from '@/hooks/usePreviewScale.hook'
|
export * from '@/hooks/usePreviewScale.hook'
|
||||||
export * from '@/hooks/useCode.hook'
|
export * from '@/hooks/useCode.hook'
|
||||||
export * from '@/hooks/useChartDataFetch.hook'
|
export * from '@/hooks/useChartDataFetch.hook'
|
||||||
|
export * from '@/hooks/useChartDataPondFetch.hook'
|
||||||
|
export * from '@/hooks/useLifeHandler.hook'
|
||||||
|
export * from '@/hooks/useLang.hook'
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
import { ref, toRefs, toRaw } from 'vue'
|
import { ref, toRefs, toRaw } from 'vue'
|
||||||
import type VChart from 'vue-echarts'
|
import type VChart from 'vue-echarts'
|
||||||
import { customizeHttp } from '@/api/http'
|
import { customizeHttp } from '@/api/http'
|
||||||
|
import { useChartDataPondFetch } from '@/hooks/'
|
||||||
import { CreateComponentType, ChartFrameEnum } from '@/packages/index.d'
|
import { CreateComponentType, ChartFrameEnum } from '@/packages/index.d'
|
||||||
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
import { RequestDataTypeEnum } from '@/enums/httpEnum'
|
import { RequestDataTypeEnum } from '@/enums/httpEnum'
|
||||||
@@ -23,9 +24,25 @@ export const useChartDataFetch = (
|
|||||||
const vChartRef = ref<typeof VChart | null>(null)
|
const vChartRef = ref<typeof VChart | null>(null)
|
||||||
let fetchInterval: any = 0
|
let fetchInterval: any = 0
|
||||||
|
|
||||||
|
// 数据池
|
||||||
|
const { addGlobalDataInterface } = useChartDataPondFetch()
|
||||||
|
const { requestDataPondId } = toRefs(targetComponent.request)
|
||||||
|
|
||||||
|
// 组件类型
|
||||||
|
const { chartFrame } = targetComponent.chartConfig
|
||||||
|
|
||||||
|
// eCharts 组件配合 vChart 库更新方式
|
||||||
|
const echartsUpdateHandle = (dataset: any) => {
|
||||||
|
if (chartFrame === ChartFrameEnum.ECHARTS) {
|
||||||
|
if (vChartRef.value) {
|
||||||
|
vChartRef.value.setOption({ dataset: dataset })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const requestIntervalFn = () => {
|
const requestIntervalFn = () => {
|
||||||
const chartEditStore = useChartEditStore()
|
const chartEditStore = useChartEditStore()
|
||||||
|
|
||||||
// 全局数据
|
// 全局数据
|
||||||
const {
|
const {
|
||||||
requestOriginUrl,
|
requestOriginUrl,
|
||||||
@@ -41,9 +58,6 @@ export const useChartDataFetch = (
|
|||||||
requestInterval: targetInterval
|
requestInterval: targetInterval
|
||||||
} = toRefs(targetComponent.request)
|
} = toRefs(targetComponent.request)
|
||||||
|
|
||||||
// 组件类型
|
|
||||||
const { chartFrame } = targetComponent.chartConfig
|
|
||||||
|
|
||||||
// 非请求类型
|
// 非请求类型
|
||||||
if (requestDataType.value !== RequestDataTypeEnum.AJAX) return
|
if (requestDataType.value !== RequestDataTypeEnum.AJAX) return
|
||||||
|
|
||||||
@@ -58,20 +72,14 @@ export const useChartDataFetch = (
|
|||||||
clearInterval(fetchInterval)
|
clearInterval(fetchInterval)
|
||||||
|
|
||||||
const fetchFn = async () => {
|
const fetchFn = async () => {
|
||||||
const res = await customizeHttp(toRaw(targetComponent.request), toRaw(chartEditStore.requestGlobalConfig))
|
const res = await customizeHttp(toRaw(targetComponent.request), toRaw(chartEditStore.getRequestGlobalConfig))
|
||||||
if (res && res.data) {
|
if (res) {
|
||||||
try {
|
try {
|
||||||
const filter = targetComponent.filter
|
const filter = targetComponent.filter
|
||||||
|
echartsUpdateHandle(newFunctionHandle(res?.data, res, filter))
|
||||||
// 更新回调函数
|
// 更新回调函数
|
||||||
if (updateCallback) {
|
if (updateCallback) {
|
||||||
updateCallback(newFunctionHandle(res.data, filter))
|
updateCallback(newFunctionHandle(res?.data, res, filter))
|
||||||
} else {
|
|
||||||
// eCharts 组件配合 vChart 库更新方式
|
|
||||||
if (chartFrame === ChartFrameEnum.ECHARTS) {
|
|
||||||
if (vChartRef.value) {
|
|
||||||
vChartRef.value.setOption({ dataset: newFunctionHandle(res.data, filter) })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error)
|
console.error(error)
|
||||||
@@ -89,9 +97,17 @@ export const useChartDataFetch = (
|
|||||||
// 开启轮询
|
// 开启轮询
|
||||||
if (time) fetchInterval = setInterval(fetchFn, intervalUnitHandle(time, unit))
|
if (time) fetchInterval = setInterval(fetchFn, intervalUnitHandle(time, unit))
|
||||||
}
|
}
|
||||||
} catch (error) {}
|
// eslint-disable-next-line no-empty
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
isPreview() && requestIntervalFn()
|
if (isPreview()) {
|
||||||
|
// 判断是否有数据池对应 id
|
||||||
|
requestDataPondId
|
||||||
|
? addGlobalDataInterface(targetComponent, useChartEditStore, updateCallback || echartsUpdateHandle)
|
||||||
|
: requestIntervalFn()
|
||||||
|
}
|
||||||
return { vChartRef }
|
return { vChartRef }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,93 @@
|
|||||||
|
import { toRaw } from 'vue'
|
||||||
|
import { customizeHttp } from '@/api/http'
|
||||||
|
import { CreateComponentType } from '@/packages/index.d'
|
||||||
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
|
import { RequestGlobalConfigType, RequestDataPondItemType } from '@/store/modules/chartEditStore/chartEditStore.d'
|
||||||
|
import { newFunctionHandle } from '@/utils'
|
||||||
|
|
||||||
|
// 获取类型
|
||||||
|
type ChartEditStoreType = typeof useChartEditStore
|
||||||
|
|
||||||
|
// 数据池存储的数据类型
|
||||||
|
type DataPondMapType = {
|
||||||
|
updateCallback: (...args: any) => any
|
||||||
|
filter?: string | undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
// 数据池 Map 中请求对应 callback
|
||||||
|
const mittDataPondMap = new Map<string, DataPondMapType[]>()
|
||||||
|
|
||||||
|
// 创建单个数据项轮询接口
|
||||||
|
const newPondItemInterval = (
|
||||||
|
requestGlobalConfig: RequestGlobalConfigType,
|
||||||
|
requestDataPondItem: RequestDataPondItemType,
|
||||||
|
dataPondMapItem?: DataPondMapType[]
|
||||||
|
) => {
|
||||||
|
if (!dataPondMapItem) return
|
||||||
|
|
||||||
|
// 请求
|
||||||
|
const fetchFn = async () => {
|
||||||
|
try {
|
||||||
|
const res = await customizeHttp(toRaw(requestDataPondItem.dataPondRequestConfig), toRaw(requestGlobalConfig))
|
||||||
|
|
||||||
|
if (res) {
|
||||||
|
try {
|
||||||
|
// 遍历更新回调函数
|
||||||
|
dataPondMapItem.forEach(item => {
|
||||||
|
item.updateCallback(newFunctionHandle(res?.data, res, item.filter))
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error)
|
||||||
|
return error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
return error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 立即调用
|
||||||
|
fetchFn()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数据池接口处理
|
||||||
|
*/
|
||||||
|
export const useChartDataPondFetch = () => {
|
||||||
|
// 新增全局接口
|
||||||
|
const addGlobalDataInterface = (
|
||||||
|
targetComponent: CreateComponentType,
|
||||||
|
useChartEditStore: ChartEditStoreType,
|
||||||
|
updateCallback: (...args: any) => any
|
||||||
|
) => {
|
||||||
|
const chartEditStore = useChartEditStore()
|
||||||
|
const { requestDataPond } = chartEditStore.getRequestGlobalConfig
|
||||||
|
|
||||||
|
// 组件对应的数据池 Id
|
||||||
|
const requestDataPondId = '111' || (targetComponent.request.requestDataPondId as string)
|
||||||
|
// 新增数据项
|
||||||
|
const mittPondIdArr = mittDataPondMap.get(requestDataPondId) || []
|
||||||
|
mittPondIdArr.push({
|
||||||
|
updateCallback: updateCallback,
|
||||||
|
filter: targetComponent.filter
|
||||||
|
})
|
||||||
|
mittDataPondMap.set(requestDataPondId, mittPondIdArr)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化数据池
|
||||||
|
const initDataPond = (requestGlobalConfig: RequestGlobalConfigType) => {
|
||||||
|
const { requestDataPond } = requestGlobalConfig
|
||||||
|
// 根据 mapId 查找对应的数据池配置
|
||||||
|
for (let pondKey of mittDataPondMap.keys()) {
|
||||||
|
const requestDataPondItem = requestDataPond.find(item => item.dataPondId === pondKey)
|
||||||
|
if (requestDataPondItem) {
|
||||||
|
newPondItemInterval(requestGlobalConfig, requestDataPondItem, mittDataPondMap.get(pondKey))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
addGlobalDataInterface,
|
||||||
|
initDataPond
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
import { computed } from 'vue'
|
||||||
|
import { LangEnum } from '@/enums/styleEnum'
|
||||||
|
import { useLangStore } from '@/store/modules/langStore/langStore'
|
||||||
|
import { zhCN, enUS, dateEnUS, dateZhCN } from 'naive-ui'
|
||||||
|
|
||||||
|
type LangStoreType = typeof useLangStore
|
||||||
|
|
||||||
|
// 语言切换
|
||||||
|
export const useLang = () => {
|
||||||
|
const lang = useLangStore()
|
||||||
|
|
||||||
|
const locale = computed(() => {
|
||||||
|
return lang.getLang === LangEnum.ZH ? zhCN : enUS
|
||||||
|
})
|
||||||
|
|
||||||
|
const dateLocale = computed(() => {
|
||||||
|
return lang.getLang === LangEnum.ZH ? dateZhCN : dateEnUS
|
||||||
|
})
|
||||||
|
|
||||||
|
return {
|
||||||
|
locale,
|
||||||
|
dateLocale
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
import { CreateComponentType, CreateComponentGroupType, EventLife, BaseEvent } from '@/packages/index.d'
|
||||||
|
import * as echarts from 'echarts'
|
||||||
|
|
||||||
|
// 所有图表组件集合对象
|
||||||
|
const components: { [K in string]?: any } = {}
|
||||||
|
|
||||||
|
// 项目提供的npm 包变量
|
||||||
|
export const npmPkgs = { echarts }
|
||||||
|
|
||||||
|
// 组件事件处理 hook
|
||||||
|
export const useLifeHandler = (chartConfig: CreateComponentType | CreateComponentGroupType) => {
|
||||||
|
if (!chartConfig.events) return {}
|
||||||
|
|
||||||
|
// 处理基础事件
|
||||||
|
const baseEvent: { [key: string]: any } = {}
|
||||||
|
for (const key in chartConfig.events.baseEvent) {
|
||||||
|
const fnStr: string | undefined = (chartConfig.events.baseEvent as any)[key]
|
||||||
|
// 动态绑定基础事件
|
||||||
|
if (fnStr) {
|
||||||
|
baseEvent[key] = generateBaseFunc(fnStr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成生命周期事件
|
||||||
|
const events = chartConfig.events.advancedEvents || {}
|
||||||
|
const lifeEvents = {
|
||||||
|
[EventLife.VNODE_BEFORE_MOUNT](e: any) {
|
||||||
|
// 存储组件
|
||||||
|
components[chartConfig.id] = e.component
|
||||||
|
const fnStr = (events[EventLife.VNODE_BEFORE_MOUNT] || '').trim()
|
||||||
|
generateFunc(fnStr, e)
|
||||||
|
},
|
||||||
|
[EventLife.VNODE_MOUNTED](e: any) {
|
||||||
|
const fnStr = (events[EventLife.VNODE_MOUNTED] || '').trim()
|
||||||
|
generateFunc(fnStr, e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return { ...baseEvent, ...lifeEvents }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成基础函数
|
||||||
|
* @param fnStr 用户方法体代码
|
||||||
|
* @param event 鼠标事件
|
||||||
|
*/
|
||||||
|
export function generateBaseFunc(fnStr: string) {
|
||||||
|
try {
|
||||||
|
return new Function(`
|
||||||
|
return (
|
||||||
|
async function(mouseEvent){
|
||||||
|
${fnStr}
|
||||||
|
}
|
||||||
|
)`)()
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成高级函数
|
||||||
|
* @param fnStr 用户方法体代码
|
||||||
|
* @param e 执行生命周期的动态组件实例
|
||||||
|
*/
|
||||||
|
function generateFunc(fnStr: string, e: any) {
|
||||||
|
try {
|
||||||
|
// npmPkgs 便于拷贝 echarts 示例时设置option 的formatter等相关内容
|
||||||
|
Function(`
|
||||||
|
"use strict";
|
||||||
|
return (
|
||||||
|
async function(e, components, node_modules){
|
||||||
|
const {${Object.keys(npmPkgs).join()}} = node_modules;
|
||||||
|
${fnStr}
|
||||||
|
}
|
||||||
|
)`)().bind(e?.component)(e, components, npmPkgs)
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,40 +1,56 @@
|
|||||||
export const axisConfig = {
|
export const axisConfig = {
|
||||||
|
// X轴位置
|
||||||
xposition: [
|
xposition: [
|
||||||
{
|
{
|
||||||
label: 'top',
|
label: '顶部',
|
||||||
value: 'top'
|
value: 'top'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'bottom',
|
label: '底部',
|
||||||
value: 'bottom'
|
value: 'bottom'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
// Y轴位置
|
||||||
yposition: [
|
yposition: [
|
||||||
{
|
{
|
||||||
label: 'left',
|
label: '左侧',
|
||||||
value: 'left'
|
value: 'left'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'right',
|
label: '右侧',
|
||||||
value: 'right'
|
value: 'right'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
// 线条
|
||||||
splitLint: {
|
splitLint: {
|
||||||
lineStyle: {
|
lineStyle: {
|
||||||
type: [
|
type: [
|
||||||
{
|
{
|
||||||
label: 'solid',
|
label: '实线',
|
||||||
value: 'solid'
|
value: 'solid'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'dashed',
|
label: '虚线',
|
||||||
value: 'dashed'
|
value: 'dashed'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'dotted',
|
label: '点线',
|
||||||
value: 'dotted'
|
value: 'dotted'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
// 视觉映射
|
||||||
|
visualMap: {
|
||||||
|
orient: [
|
||||||
|
{
|
||||||
|
label: '竖直',
|
||||||
|
value: 'vertical'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '水平',
|
||||||
|
value: 'horizontal'
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,24 @@
|
|||||||
import { echartOptionProfixHandle, publicConfig } from '@/packages/public'
|
import { echartOptionProfixHandle, PublicConfigClass } from '@/packages/public'
|
||||||
import { BarCommonConfig } from './index'
|
import { BarCommonConfig } from './index'
|
||||||
import { CreateComponentType } from '@/packages/index.d'
|
import { CreateComponentType } from '@/packages/index.d'
|
||||||
import cloneDeep from 'lodash/cloneDeep'
|
import cloneDeep from 'lodash/cloneDeep'
|
||||||
import dataJson from './data.json'
|
import dataJson from './data.json'
|
||||||
|
|
||||||
export const includes = ['legend', 'xAxis', 'yAxis']
|
export const includes = ['legend', 'xAxis', 'yAxis', 'grid']
|
||||||
|
export const seriesItem = {
|
||||||
|
type: 'bar',
|
||||||
|
barWidth: 15,
|
||||||
|
label: {
|
||||||
|
show: true,
|
||||||
|
position: 'top',
|
||||||
|
color: '#fff',
|
||||||
|
fontSize: 12
|
||||||
|
},
|
||||||
|
itemStyle: {
|
||||||
|
color: null,
|
||||||
|
borderRadius: 2
|
||||||
|
}
|
||||||
|
}
|
||||||
export const option = {
|
export const option = {
|
||||||
tooltip: {
|
tooltip: {
|
||||||
show: true,
|
show: true,
|
||||||
@@ -15,10 +28,7 @@ export const option = {
|
|||||||
type: 'shadow'
|
type: 'shadow'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
legend: {
|
xAxis: {
|
||||||
show: true
|
|
||||||
},
|
|
||||||
xAxis: {
|
|
||||||
show: true,
|
show: true,
|
||||||
type: 'category'
|
type: 'category'
|
||||||
},
|
},
|
||||||
@@ -27,27 +37,10 @@ export const option = {
|
|||||||
type: 'value'
|
type: 'value'
|
||||||
},
|
},
|
||||||
dataset: { ...dataJson },
|
dataset: { ...dataJson },
|
||||||
series: [
|
series: [seriesItem, seriesItem]
|
||||||
{
|
|
||||||
type: 'bar',
|
|
||||||
barWidth: null,
|
|
||||||
itemStyle: {
|
|
||||||
color: null,
|
|
||||||
borderRadius: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'bar',
|
|
||||||
barWidth: null,
|
|
||||||
itemStyle: {
|
|
||||||
color: null,
|
|
||||||
borderRadius: 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class Config extends publicConfig implements CreateComponentType {
|
export default class Config extends PublicConfigClass implements CreateComponentType {
|
||||||
public key = BarCommonConfig.key
|
public key = BarCommonConfig.key
|
||||||
public chartConfig = cloneDeep(BarCommonConfig)
|
public chartConfig = cloneDeep(BarCommonConfig)
|
||||||
// 图表配置项
|
// 图表配置项
|
||||||
|
|||||||
@@ -1,23 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<CollapseItem
|
<!-- Echarts 全局设置 -->
|
||||||
v-for="(item, index) in seriesList"
|
<global-setting :optionData="optionData"></global-setting>
|
||||||
:key="index"
|
<CollapseItem v-for="(item, index) in seriesList" :key="index" :name="`柱状图-${index + 1}`" :expanded="true">
|
||||||
:name="`柱状图-${index + 1}`"
|
|
||||||
:expanded="true"
|
|
||||||
>
|
|
||||||
<SettingItemBox name="图形">
|
<SettingItemBox name="图形">
|
||||||
<SettingItem name="颜色">
|
|
||||||
<n-color-picker
|
|
||||||
size="small"
|
|
||||||
:modes="['hex']"
|
|
||||||
v-model:value="item.itemStyle.color"
|
|
||||||
></n-color-picker>
|
|
||||||
</SettingItem>
|
|
||||||
<SettingItem>
|
|
||||||
<n-button size="small" @click="item.itemStyle.color = null">
|
|
||||||
恢复默认
|
|
||||||
</n-button>
|
|
||||||
</SettingItem>
|
|
||||||
<SettingItem name="宽度">
|
<SettingItem name="宽度">
|
||||||
<n-input-number
|
<n-input-number
|
||||||
v-model:value="item.barWidth"
|
v-model:value="item.barWidth"
|
||||||
@@ -28,26 +13,40 @@
|
|||||||
></n-input-number>
|
></n-input-number>
|
||||||
</SettingItem>
|
</SettingItem>
|
||||||
<SettingItem name="圆角">
|
<SettingItem name="圆角">
|
||||||
<n-input-number
|
<n-input-number v-model:value="item.itemStyle.borderRadius" :min="0" size="small"></n-input-number>
|
||||||
v-model:value="item.itemStyle.borderRadius"
|
|
||||||
:min="0"
|
|
||||||
size="small"
|
|
||||||
></n-input-number>
|
|
||||||
</SettingItem>
|
</SettingItem>
|
||||||
</SettingItemBox>
|
</SettingItemBox>
|
||||||
|
<setting-item-box name="标签">
|
||||||
|
<setting-item>
|
||||||
|
<n-space>
|
||||||
|
<n-switch v-model:value="item.label.show" size="small" />
|
||||||
|
<n-text>展示标签</n-text>
|
||||||
|
</n-space>
|
||||||
|
</setting-item>
|
||||||
|
<setting-item name="大小">
|
||||||
|
<n-input-number v-model:value="item.label.fontSize" size="small" :min="1"></n-input-number>
|
||||||
|
</setting-item>
|
||||||
|
<setting-item name="颜色">
|
||||||
|
<n-color-picker size="small" :modes="['hex']" v-model:value="item.label.color"></n-color-picker>
|
||||||
|
</setting-item>
|
||||||
|
<setting-item name="位置">
|
||||||
|
<n-select
|
||||||
|
v-model:value="item.label.position"
|
||||||
|
:options="[
|
||||||
|
{ label: 'top', value: 'top' },
|
||||||
|
{ label: 'left', value: 'left' },
|
||||||
|
{ label: 'right', value: 'right' },
|
||||||
|
{ label: 'bottom', value: 'bottom' }
|
||||||
|
]"
|
||||||
|
/>
|
||||||
|
</setting-item>
|
||||||
|
</setting-item-box>
|
||||||
</CollapseItem>
|
</CollapseItem>
|
||||||
<!-- Echarts 全局设置 -->
|
|
||||||
<global-setting :optionData="optionData" :in-chart="true"></global-setting>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { PropType, computed } from 'vue'
|
import { PropType, computed } from 'vue'
|
||||||
import {
|
import { GlobalSetting, CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
|
||||||
GlobalSetting,
|
|
||||||
CollapseItem,
|
|
||||||
SettingItemBox,
|
|
||||||
SettingItem
|
|
||||||
} from '@/components/Pages/ChartItemSetting'
|
|
||||||
import { GlobalThemeJsonType } from '@/settings/chartThemes/index'
|
import { GlobalThemeJsonType } from '@/settings/chartThemes/index'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
|
|||||||
@@ -1,25 +1,30 @@
|
|||||||
<template>
|
<template>
|
||||||
<v-chart ref="vChartRef" :theme="themeColor" :option="option" :manual-update="isPreview()" autoresize></v-chart>
|
<v-chart
|
||||||
|
ref="vChartRef"
|
||||||
|
:theme="themeColor"
|
||||||
|
:option="option"
|
||||||
|
:manual-update="isPreview()"
|
||||||
|
:update-options="{
|
||||||
|
replaceMerge: replaceMergeArr
|
||||||
|
}"
|
||||||
|
autoresize
|
||||||
|
></v-chart>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, PropType } from 'vue'
|
import { ref, nextTick, computed, watch, PropType } from 'vue'
|
||||||
import VChart from 'vue-echarts'
|
import VChart from 'vue-echarts'
|
||||||
import { use } from 'echarts/core'
|
import { use } from 'echarts/core'
|
||||||
import { CanvasRenderer } from 'echarts/renderers'
|
import { CanvasRenderer } from 'echarts/renderers'
|
||||||
import { BarChart } from 'echarts/charts'
|
import { BarChart } from 'echarts/charts'
|
||||||
import { includes } from './config'
|
import config, { includes, seriesItem } from './config'
|
||||||
import { mergeTheme } from '@/packages/public/chart'
|
import { mergeTheme } from '@/packages/public/chart'
|
||||||
import { useChartDataFetch } from '@/hooks'
|
import { useChartDataFetch } from '@/hooks'
|
||||||
import { CreateComponentType } from '@/packages/index.d'
|
import { CreateComponentType } from '@/packages/index.d'
|
||||||
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
import { isPreview } from '@/utils'
|
import { isPreview } from '@/utils'
|
||||||
import {
|
import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components'
|
||||||
DatasetComponent,
|
import isObject from 'lodash/isObject'
|
||||||
GridComponent,
|
|
||||||
TooltipComponent,
|
|
||||||
LegendComponent
|
|
||||||
} from 'echarts/components'
|
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
themeSetting: {
|
themeSetting: {
|
||||||
@@ -31,23 +36,44 @@ const props = defineProps({
|
|||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
chartConfig: {
|
chartConfig: {
|
||||||
type: Object as PropType<CreateComponentType>,
|
type: Object as PropType<config>,
|
||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
use([
|
use([DatasetComponent, CanvasRenderer, BarChart, GridComponent, TooltipComponent, LegendComponent])
|
||||||
DatasetComponent,
|
|
||||||
CanvasRenderer,
|
const replaceMergeArr = ref<string[]>()
|
||||||
BarChart,
|
|
||||||
GridComponent,
|
|
||||||
TooltipComponent,
|
|
||||||
LegendComponent
|
|
||||||
])
|
|
||||||
|
|
||||||
const option = computed(() => {
|
const option = computed(() => {
|
||||||
return mergeTheme(props.chartConfig.option, props.themeSetting, includes)
|
return mergeTheme(props.chartConfig.option, props.themeSetting, includes)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// dataset 无法变更条数的补丁
|
||||||
|
watch(
|
||||||
|
() => props.chartConfig.option.dataset,
|
||||||
|
(newData: { dimensions: any }, oldData) => {
|
||||||
|
try {
|
||||||
|
if (!isObject(newData) || !('dimensions' in newData)) return
|
||||||
|
if (Array.isArray(newData?.dimensions)) {
|
||||||
|
const seriesArr = []
|
||||||
|
for (let i = 0; i < newData.dimensions.length - 1; i++) {
|
||||||
|
seriesArr.push(seriesItem)
|
||||||
|
}
|
||||||
|
replaceMergeArr.value = ['series']
|
||||||
|
props.chartConfig.option.series = seriesArr
|
||||||
|
nextTick(() => {
|
||||||
|
replaceMergeArr.value = []
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
deep: false
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore)
|
const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore)
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -1,55 +1,46 @@
|
|||||||
import { echartOptionProfixHandle, publicConfig } from '@/packages/public'
|
import { echartOptionProfixHandle, PublicConfigClass } from '@/packages/public'
|
||||||
import { BarCrossrangeConfig } from './index'
|
import { BarCrossrangeConfig } from './index'
|
||||||
import { CreateComponentType } from '@/packages/index.d'
|
import { CreateComponentType } from '@/packages/index.d'
|
||||||
import cloneDeep from 'lodash/cloneDeep'
|
import cloneDeep from 'lodash/cloneDeep'
|
||||||
import dataJson from './data.json'
|
import dataJson from './data.json'
|
||||||
|
|
||||||
export const includes = ['legend', 'xAxis', 'yAxis']
|
export const includes = ['legend', 'xAxis', 'yAxis', 'grid']
|
||||||
|
export const seriesItem = {
|
||||||
|
type: 'bar',
|
||||||
|
barWidth: null,
|
||||||
|
label: {
|
||||||
|
show: true,
|
||||||
|
position: 'right',
|
||||||
|
color: '#fff',
|
||||||
|
fontSize: 12
|
||||||
|
},
|
||||||
|
itemStyle: {
|
||||||
|
color: null,
|
||||||
|
borderRadius: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
export const option = {
|
export const option = {
|
||||||
tooltip: {
|
tooltip: {
|
||||||
show: true,
|
show: true,
|
||||||
trigger: 'axis',
|
trigger: 'axis',
|
||||||
axisPointer: {
|
axisPointer: {
|
||||||
show: true,
|
show: true,
|
||||||
type: 'shadow',
|
type: 'shadow'
|
||||||
},
|
}
|
||||||
},
|
|
||||||
legend: {
|
|
||||||
show: true,
|
|
||||||
},
|
},
|
||||||
xAxis: {
|
xAxis: {
|
||||||
show: true,
|
show: true,
|
||||||
type: 'value',
|
type: 'value'
|
||||||
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
|
|
||||||
},
|
},
|
||||||
yAxis: {
|
yAxis: {
|
||||||
show: true,
|
show: true,
|
||||||
type: 'category',
|
type: 'category'
|
||||||
},
|
},
|
||||||
dataset: { ...dataJson },
|
dataset: { ...dataJson },
|
||||||
series: [
|
series: [seriesItem, seriesItem]
|
||||||
{
|
|
||||||
type: 'bar',
|
|
||||||
barWidth: null,
|
|
||||||
itemStyle: {
|
|
||||||
color: null,
|
|
||||||
borderRadius: 0,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'bar',
|
|
||||||
barWidth: null,
|
|
||||||
itemStyle: {
|
|
||||||
color: null,
|
|
||||||
borderRadius: 0,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class Config extends publicConfig
|
export default class Config extends PublicConfigClass implements CreateComponentType {
|
||||||
implements CreateComponentType {
|
|
||||||
public key = BarCrossrangeConfig.key
|
public key = BarCrossrangeConfig.key
|
||||||
public chartConfig = cloneDeep(BarCrossrangeConfig)
|
public chartConfig = cloneDeep(BarCrossrangeConfig)
|
||||||
// 图表配置项
|
// 图表配置项
|
||||||
|
|||||||
@@ -1,12 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<!-- Echarts 全局设置 -->
|
||||||
|
<global-setting :optionData="optionData"></global-setting>
|
||||||
<CollapseItem v-for="(item, index) in seriesList" :key="index" :name="`柱状图-${index+1}`" :expanded="true">
|
<CollapseItem v-for="(item, index) in seriesList" :key="index" :name="`柱状图-${index+1}`" :expanded="true">
|
||||||
<SettingItemBox name="图形">
|
<SettingItemBox name="图形">
|
||||||
<SettingItem name="颜色">
|
|
||||||
<n-color-picker size="small" :modes="['hex']" v-model:value="item.itemStyle.color"></n-color-picker>
|
|
||||||
</SettingItem>
|
|
||||||
<SettingItem>
|
|
||||||
<n-button size="small" @click="item.itemStyle.color = null">恢复默认</n-button>
|
|
||||||
</SettingItem>
|
|
||||||
<SettingItem name="宽度">
|
<SettingItem name="宽度">
|
||||||
<n-input-number
|
<n-input-number
|
||||||
v-model:value="item.barWidth"
|
v-model:value="item.barWidth"
|
||||||
@@ -24,9 +20,40 @@
|
|||||||
></n-input-number>
|
></n-input-number>
|
||||||
</SettingItem>
|
</SettingItem>
|
||||||
</SettingItemBox>
|
</SettingItemBox>
|
||||||
|
<setting-item-box name="标签">
|
||||||
|
<setting-item>
|
||||||
|
<n-space>
|
||||||
|
<n-switch v-model:value="item.label.show" size="small" />
|
||||||
|
<n-text>展示标签</n-text>
|
||||||
|
</n-space>
|
||||||
|
</setting-item>
|
||||||
|
<setting-item name="大小">
|
||||||
|
<n-input-number
|
||||||
|
v-model:value="item.label.fontSize"
|
||||||
|
size="small"
|
||||||
|
:min="1"
|
||||||
|
></n-input-number>
|
||||||
|
</setting-item>
|
||||||
|
<setting-item name="颜色">
|
||||||
|
<n-color-picker
|
||||||
|
size="small"
|
||||||
|
:modes="['hex']"
|
||||||
|
v-model:value="item.label.color"
|
||||||
|
></n-color-picker>
|
||||||
|
</setting-item>
|
||||||
|
<setting-item name="位置">
|
||||||
|
<n-select
|
||||||
|
v-model:value="item.label.position"
|
||||||
|
:options="[
|
||||||
|
{ label: 'top', value: 'top' },
|
||||||
|
{ label: 'left', value: 'left' },
|
||||||
|
{ label: 'right', value: 'right' },
|
||||||
|
{ label: 'bottom', value: 'bottom' },
|
||||||
|
]"
|
||||||
|
/>
|
||||||
|
</setting-item>
|
||||||
|
</setting-item-box>
|
||||||
</CollapseItem>
|
</CollapseItem>
|
||||||
<!-- Echarts 全局设置 -->
|
|
||||||
<global-setting :optionData="optionData" :in-chart="true"></global-setting>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
|||||||
@@ -1,24 +1,29 @@
|
|||||||
<template>
|
<template>
|
||||||
<v-chart ref="vChartRef" :theme="themeColor" :option="option" :manual-update="isPreview()" autoresize></v-chart>
|
<v-chart
|
||||||
|
ref="vChartRef"
|
||||||
|
:theme="themeColor"
|
||||||
|
:option="option"
|
||||||
|
:manual-update="isPreview()"
|
||||||
|
:update-options="{
|
||||||
|
replaceMerge: replaceMergeArr
|
||||||
|
}"
|
||||||
|
autoresize
|
||||||
|
></v-chart>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, PropType } from 'vue'
|
import { ref, nextTick, computed, watch, PropType } from 'vue'
|
||||||
import VChart from 'vue-echarts'
|
import VChart from 'vue-echarts'
|
||||||
import { use } from 'echarts/core'
|
import { use } from 'echarts/core'
|
||||||
import { CanvasRenderer } from 'echarts/renderers'
|
import { CanvasRenderer } from 'echarts/renderers'
|
||||||
import { BarChart } from 'echarts/charts'
|
import { BarChart } from 'echarts/charts'
|
||||||
import { mergeTheme } from '@/packages/public/chart'
|
import { mergeTheme } from '@/packages/public/chart'
|
||||||
import config, { includes } from './config'
|
import config, { includes, seriesItem } from './config'
|
||||||
import { useChartDataFetch } from '@/hooks'
|
import { useChartDataFetch } from '@/hooks'
|
||||||
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
import { isPreview } from '@/utils'
|
import { isPreview } from '@/utils'
|
||||||
import {
|
import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components'
|
||||||
DatasetComponent,
|
import isObject from 'lodash/isObject'
|
||||||
GridComponent,
|
|
||||||
TooltipComponent,
|
|
||||||
LegendComponent,
|
|
||||||
} from 'echarts/components'
|
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
themeSetting: {
|
themeSetting: {
|
||||||
@@ -35,18 +40,39 @@ const props = defineProps({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
use([
|
use([DatasetComponent, CanvasRenderer, BarChart, GridComponent, TooltipComponent, LegendComponent])
|
||||||
DatasetComponent,
|
|
||||||
CanvasRenderer,
|
const replaceMergeArr = ref<string[]>()
|
||||||
BarChart,
|
|
||||||
GridComponent,
|
|
||||||
TooltipComponent,
|
|
||||||
LegendComponent,
|
|
||||||
])
|
|
||||||
|
|
||||||
const option = computed(() => {
|
const option = computed(() => {
|
||||||
return mergeTheme(props.chartConfig.option, props.themeSetting, includes)
|
return mergeTheme(props.chartConfig.option, props.themeSetting, includes)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// dataset 无法变更条数的补丁
|
||||||
|
watch(
|
||||||
|
() => props.chartConfig.option.dataset,
|
||||||
|
(newData: { dimensions: any }, oldData) => {
|
||||||
|
try {
|
||||||
|
if (!isObject(newData) || !('dimensions' in newData)) return
|
||||||
|
if (Array.isArray(newData?.dimensions)) {
|
||||||
|
const seriesArr = []
|
||||||
|
for (let i = 0; i < newData.dimensions.length - 1; i++) {
|
||||||
|
seriesArr.push(seriesItem)
|
||||||
|
}
|
||||||
|
replaceMergeArr.value = ['series']
|
||||||
|
props.chartConfig.option.series = seriesArr
|
||||||
|
nextTick(() => {
|
||||||
|
replaceMergeArr.value = []
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
deep: false
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore)
|
const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore)
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
import { PublicConfigClass } from '@/packages/public'
|
||||||
|
import { CapsuleChartConfig } from './index'
|
||||||
|
import { CreateComponentType } from '@/packages/index.d'
|
||||||
|
import { chartInitConfig } from '@/settings/designSetting'
|
||||||
|
|
||||||
|
import cloneDeep from 'lodash/cloneDeep'
|
||||||
|
import dataJson from './data.json'
|
||||||
|
|
||||||
|
export const option = {
|
||||||
|
dataset: dataJson,
|
||||||
|
colors: ['#c4ebad', '#6be6c1', '#a0a7e6', '#96dee8', '#3fb1e3' ],
|
||||||
|
unit: '',
|
||||||
|
itemHeight: 10,
|
||||||
|
valueFontSize: 16,
|
||||||
|
paddingRight: 50,
|
||||||
|
paddingLeft: 50,
|
||||||
|
showValue: true
|
||||||
|
}
|
||||||
|
|
||||||
|
export default class Config extends PublicConfigClass implements CreateComponentType {
|
||||||
|
public key: string = CapsuleChartConfig.key
|
||||||
|
public attr = { ...chartInitConfig, zIndex: -1 }
|
||||||
|
public chartConfig = cloneDeep(CapsuleChartConfig)
|
||||||
|
public option = cloneDeep(option)
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
<template>
|
||||||
|
<!-- Echarts 全局设置 -->
|
||||||
|
<global-setting :optionData="optionData"> </global-setting>
|
||||||
|
<!-- 胶囊柱图 -->
|
||||||
|
<collapse-item name="胶囊柱图" expanded>
|
||||||
|
<SettingItemBox name="布局">
|
||||||
|
<setting-item name="左侧边距">
|
||||||
|
<n-input-number v-model:value="optionData.paddingLeft" :min="10" :step="1" size="small"></n-input-number>
|
||||||
|
</setting-item>
|
||||||
|
<setting-item name="右侧边距">
|
||||||
|
<n-input-number v-model:value="optionData.paddingRight" :min="10" :step="1" size="small"></n-input-number>
|
||||||
|
</setting-item>
|
||||||
|
<setting-item name="每块高度(px)">
|
||||||
|
<n-input-number v-model:value="optionData.itemHeight" :min="0" :step="1" size="small"></n-input-number>
|
||||||
|
</setting-item>
|
||||||
|
</SettingItemBox>
|
||||||
|
<SettingItemBox name="文本">
|
||||||
|
<setting-item name="所有文字大小">
|
||||||
|
<n-input-number v-model:value="optionData.valueFontSize" :min="0" :step="1" size="small"></n-input-number>
|
||||||
|
</setting-item>
|
||||||
|
<setting-item name="单位">
|
||||||
|
<n-input v-model:value="optionData.unit" size="small"></n-input>
|
||||||
|
</setting-item>
|
||||||
|
|
||||||
|
<SettingItem>
|
||||||
|
<n-space>
|
||||||
|
<n-switch v-model:value="optionData.showValue" size="small"></n-switch>
|
||||||
|
<n-text>显示数值</n-text>
|
||||||
|
</n-space>
|
||||||
|
</SettingItem>
|
||||||
|
</SettingItemBox>
|
||||||
|
<SettingItemBox name="颜色">
|
||||||
|
<setting-item v-for="(item, index) in optionData.colors" :key="index" :name="`颜色${index}`">
|
||||||
|
<n-color-picker v-model:value="optionData.colors[index]" size="small" :modes="['hex']"></n-color-picker>
|
||||||
|
</setting-item>
|
||||||
|
</SettingItemBox>
|
||||||
|
</collapse-item>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { PropType, computed } from 'vue'
|
||||||
|
import { GlobalSetting, CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
|
||||||
|
import { GlobalThemeJsonType } from '@/settings/chartThemes/index'
|
||||||
|
|
||||||
|
import { option } from './config'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
optionData: {
|
||||||
|
type: Object as PropType<typeof option & GlobalThemeJsonType>,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"dimensions": ["name", "value"],
|
||||||
|
"source": [
|
||||||
|
{ "name": "厦门", "value": 20 },
|
||||||
|
{ "name": "南阳", "value": 40 },
|
||||||
|
{ "name": "北京", "value": 60 },
|
||||||
|
{ "name": "上海", "value": 80 },
|
||||||
|
{ "name": "新疆", "value": 100 }
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
import image from '@/assets/images/chart/charts/capsule.png'
|
||||||
|
import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d'
|
||||||
|
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
|
||||||
|
|
||||||
|
export const CapsuleChartConfig: ConfigType = {
|
||||||
|
key: 'CapsuleChart',
|
||||||
|
chartKey: 'VCapsuleChart',
|
||||||
|
conKey: 'VCCapsuleChart',
|
||||||
|
title: '胶囊柱图',
|
||||||
|
category: ChatCategoryEnum.BAR,
|
||||||
|
categoryName: ChatCategoryEnumName.BAR,
|
||||||
|
package: PackagesCategoryEnum.CHARTS,
|
||||||
|
chartFrame: ChartFrameEnum.COMMON,
|
||||||
|
image
|
||||||
|
}
|
||||||
@@ -0,0 +1,226 @@
|
|||||||
|
<template>
|
||||||
|
<div
|
||||||
|
v-if="state.mergedConfig"
|
||||||
|
class="go-dv-capsule-chart"
|
||||||
|
:style="{
|
||||||
|
fontSize: numberSizeHandle(state.mergedConfig.valueFontSize),
|
||||||
|
paddingLeft: numberSizeHandle(state.mergedConfig.paddingLeft),
|
||||||
|
paddingRight: numberSizeHandle(state.mergedConfig.paddingRight)
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
<div class="label-column">
|
||||||
|
<div
|
||||||
|
v-for="item in state.mergedConfig.dataset.source"
|
||||||
|
:key="item[state.mergedConfig.dataset.dimensions[0]]"
|
||||||
|
:style="{ height: state.capsuleItemHeight, lineHeight: state.capsuleItemHeight }"
|
||||||
|
>
|
||||||
|
{{ item[state.mergedConfig.dataset.dimensions[0]] }}
|
||||||
|
</div>
|
||||||
|
<div class="laset"> </div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="capsule-container">
|
||||||
|
<div
|
||||||
|
v-for="(capsule, index) in state.capsuleLength"
|
||||||
|
:key="index"
|
||||||
|
class="capsule-item"
|
||||||
|
:style="{ height: state.capsuleItemHeight }"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="capsule-item-column"
|
||||||
|
:style="`width: ${capsule * 100}%; background-color: ${
|
||||||
|
state.mergedConfig.colors[index % state.mergedConfig.colors.length]
|
||||||
|
};height:calc(100% - ${2}px);`"
|
||||||
|
>
|
||||||
|
<div v-if="state.mergedConfig.showValue" class="capsule-item-value">
|
||||||
|
{{ state.capsuleValue[index] }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="unit-label">
|
||||||
|
<div v-for="(label, index) in state.labelData" :key="label + index">
|
||||||
|
{{ label }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-if="state.mergedConfig.unit" class="unit-text">
|
||||||
|
{{ state.mergedConfig.unit }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { onMounted, watch, reactive, PropType } from 'vue'
|
||||||
|
import { useChartDataFetch } from '@/hooks'
|
||||||
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
|
import config, { option } from './config'
|
||||||
|
import cloneDeep from 'lodash/cloneDeep'
|
||||||
|
|
||||||
|
type DataProps = {
|
||||||
|
name: string | number
|
||||||
|
value: string | number
|
||||||
|
[key: string]: string | number
|
||||||
|
}
|
||||||
|
|
||||||
|
interface StateProps {
|
||||||
|
defaultConfig: {
|
||||||
|
dataset: {
|
||||||
|
dimensions: Array<string>
|
||||||
|
source: Array<DataProps>
|
||||||
|
}
|
||||||
|
colors: Array<string>
|
||||||
|
unit: string
|
||||||
|
showValue: boolean
|
||||||
|
itemHeight: number
|
||||||
|
valueFontSize: number
|
||||||
|
paddingLeft: number
|
||||||
|
paddingRight: number
|
||||||
|
}
|
||||||
|
mergedConfig: any
|
||||||
|
capsuleLength: Array<number>
|
||||||
|
capsuleValue: Array<string | Object>
|
||||||
|
labelData: Array<number>
|
||||||
|
capsuleItemHeight: string
|
||||||
|
}
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
chartConfig: {
|
||||||
|
type: Object as PropType<config>,
|
||||||
|
default: () => ({})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const state = reactive<StateProps>({
|
||||||
|
defaultConfig: option,
|
||||||
|
mergedConfig: null,
|
||||||
|
capsuleLength: [],
|
||||||
|
capsuleValue: [],
|
||||||
|
labelData: [],
|
||||||
|
capsuleItemHeight: ''
|
||||||
|
})
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => props.chartConfig.option,
|
||||||
|
newVal => {
|
||||||
|
calcData(newVal)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
deep: true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
const calcData = (data: any) => {
|
||||||
|
mergeConfig(props.chartConfig.option)
|
||||||
|
calcCapsuleLengthAndLabelData()
|
||||||
|
}
|
||||||
|
|
||||||
|
const mergeConfig = (data: any) => {
|
||||||
|
state.mergedConfig = cloneDeep(data || {})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 数据解析
|
||||||
|
const calcCapsuleLengthAndLabelData = () => {
|
||||||
|
const { source } = state.mergedConfig.dataset
|
||||||
|
if (!source.length) return
|
||||||
|
|
||||||
|
state.capsuleItemHeight = numberSizeHandle(state.mergedConfig.itemHeight)
|
||||||
|
const capsuleValue = source.map((item: DataProps) => item[state.mergedConfig.dataset.dimensions[1]])
|
||||||
|
|
||||||
|
const maxValue = Math.max(...capsuleValue)
|
||||||
|
|
||||||
|
state.capsuleValue = capsuleValue
|
||||||
|
|
||||||
|
state.capsuleLength = capsuleValue.map((v: any) => (maxValue ? v / maxValue : 0))
|
||||||
|
|
||||||
|
const oneFifth = maxValue / 5
|
||||||
|
|
||||||
|
const labelData = Array.from(new Set(new Array(6).fill(0).map((v, i) => Math.ceil(i * oneFifth))))
|
||||||
|
|
||||||
|
state.labelData = labelData
|
||||||
|
}
|
||||||
|
|
||||||
|
const numberSizeHandle = (val: string | number) => {
|
||||||
|
return val + 'px'
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
calcData(props.chartConfig.option)
|
||||||
|
})
|
||||||
|
|
||||||
|
// 预览
|
||||||
|
useChartDataFetch(props.chartConfig, useChartEditStore, (newData: any) => {
|
||||||
|
calcData(newData)
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
@include go('dv-capsule-chart') {
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 20px;
|
||||||
|
padding-right: 50px;
|
||||||
|
color: #b9b8cc;
|
||||||
|
|
||||||
|
.label-column {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-between;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding-right: 10px;
|
||||||
|
text-align: right;
|
||||||
|
> div:not(:last-child) {
|
||||||
|
margin: 5px 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.capsule-container {
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
.capsule-item {
|
||||||
|
box-shadow: 0 0 3px #999;
|
||||||
|
height: 10px;
|
||||||
|
margin: 5px 0px;
|
||||||
|
border-radius: 5px;
|
||||||
|
|
||||||
|
.capsule-item-column {
|
||||||
|
position: relative;
|
||||||
|
height: 8px;
|
||||||
|
margin-top: 1px;
|
||||||
|
border-radius: 5px;
|
||||||
|
transition: all 0.3s;
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
.capsule-item-value {
|
||||||
|
padding-left: 10px;
|
||||||
|
transform: translateX(100%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.unit-label {
|
||||||
|
height: 20px;
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.unit-text {
|
||||||
|
text-align: right;
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-end;
|
||||||
|
line-height: 20px;
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||