Compare commits

..

46 Commits

Author SHA1 Message Date
奔跑的面条
ec97340c25 build: 升级版本 2.1.5 2023-01-08 20:08:37 +08:00
奔跑的面条
7bbf285e8e build: 升级版本到 2.1.5 2023-01-08 20:06:11 +08:00
奔跑的面条
d652b06137 feat: 合并 dev 分支功能 2023-01-08 20:01:49 +08:00
奔跑的面条
d46a0b5134 build: 升级 pnpm 依赖说明文件 2023-01-08 19:23:02 +08:00
奔跑的面条
45cadcecc3 fix: 处理 model 报错 2023-01-08 19:20:44 +08:00
奔跑的面条
7b262c9db2 fix: 处理 i18n 报错和 props 报错 2023-01-08 19:10:41 +08:00
奔跑的面条
4e091c7f49 !121 修改胶囊柱图mock数据,解决胶囊主图labe不变化bug
Merge pull request !121 from daidai/dev
2023-01-08 09:13:15 +00:00
刘嘉威
1310234803 fix: 修改胶囊柱图mock数据,解决胶囊主图labe不变化bug 2023-01-03 16:59:04 +08:00
奔跑的面条
e55e63bca1 Merge remote-tracking branch 'origin/master-fetch-dev' into master-fetch 2022-12-31 21:26:42 +08:00
奔跑的面条
9b47d353c0 build: 新增提醒 2022-12-31 21:26:18 +08:00
奔跑的面条
c3f9a470fc feat: 合并 2.1.4 2022-12-31 21:07:51 +08:00
奔跑的面条
bd2557f3e4 build: 修改版本号到2.1.3 2022-12-31 20:56:55 +08:00
奔跑的面条
730099efb9 build: 升级2.1.2 2022-12-31 20:55:12 +08:00
奔跑的面条
3c1b741c37 fix: 处理创建分组后,预览不显示的bug 2022-12-31 20:50:08 +08:00
奔跑的面条
36fdc22634 style: 格式化文件 2022-12-31 20:33:21 +08:00
奔跑的面条
5261a09381 !120 胶囊柱图展示数据不刷新
Merge pull request !120 from daidai/dev
2022-12-31 12:18:50 +00:00
刘嘉威
25864dc3b6 fix: 胶囊柱图预览时数据更新页面不更新bug 2022-12-26 17:37:29 +08:00
奔跑的面条
09c2ec06d4 fix: 补充丢失的flow文件 2022-12-22 19:43:24 +08:00
奔跑的面条
2378be571d build: 限制node版本 2022-12-22 14:51:51 +08:00
奔跑的面条
59fd7ebceb perf: 优化框选功能 2022-12-22 01:31:42 +08:00
奔跑的面条
e0d99a6b28 perf: 优化缩放时辅助线的渲染 2022-12-22 01:13:40 +08:00
奔跑的面条
e4514505c3 perf: 优化画布放大缩小的体验 2022-12-22 00:51:25 +08:00
奔跑的面条
f2c49b171e perf: 优化画布缩放体验 2022-12-20 20:00:21 +08:00
奔跑的面条
c5706f839e Merge branch 'dev' into master-fetch-dev 2022-12-20 17:05:32 +08:00
奔跑的面条
de9e304dd4 perf: 优化加载进度条体验 2022-12-20 17:05:13 +08:00
奔跑的面条
faa0d6538f Merge branch 'dev' into master-fetch-dev 2022-12-20 16:59:55 +08:00
奔跑的面条
1fb57ad1ff feat: 新增加载提示 2022-12-20 16:54:04 +08:00
奔跑的面条
65127ced7f perf: 新增快捷键说明 2022-12-20 15:16:25 +08:00
奔跑的面条
5b1458b22f fix: 解决 deep 报错 2022-12-20 15:09:12 +08:00
奔跑的面条
6f74be7092 !116 fix: 修复画布无法滚动
Merge pull request !116 from jeo_young/dev
2022-12-18 08:36:36 +00:00
jeo young
1f9790e5f5 fix: 画布不能滚动 2022-12-18 10:24:49 +08:00
奔跑的面条
0b8ab9adfa style: 修改错误单词 2022-12-18 00:00:41 +08:00
奔跑的面条
a17d7a4182 style: 优化代码格式 2022-12-17 22:25:19 +08:00
奔跑的面条
4ef77fcf25 !115 画布优化
Merge pull request !115 from MajorMayer/dev
2022-12-17 13:57:38 +00:00
jeo young
d204b459d9 fix: 去掉多余代码 2022-12-17 17:56:36 +08:00
jeo young
6ae6645d3c fix: 画布scale始终保持居中
feat: 鼠标中键按住可拖拽画布
2022-12-17 17:53:53 +08:00
奔跑的面条
a925ced533 perf: 修改进度条的长度 2022-12-17 15:35:50 +08:00
jeo young
8dcccef54d fix: 修复按住空格键时 不允许框选 2022-12-17 01:33:27 +08:00
jeo young
dff639e901 feat: 按住鼠标中键 可以拖拽画布 2022-12-17 01:32:03 +08:00
jeo young
0376703fd2 fix: 画布变化后始终居中 2022-12-17 00:56:42 +08:00
jeo young
7341ff11f3 fix: 空格热键导致ctrl 无法多选组件 2022-12-16 23:27:02 +08:00
奔跑的面条
57193beeab fix: 处理标尺展示不全的问题 2022-12-16 22:47:55 +08:00
奔跑的面条
405e884e70 perf: 优化画布拖拽逻辑 2022-12-16 22:18:24 +08:00
奔跑的面条
0d4e83c940 build: 新增dom-helpers依赖 2022-12-16 19:36:14 +08:00
奔跑的面条
b8ed389f60 !110 画布优化
Merge pull request !110 from MajorMayer/dev
2022-12-16 11:34:53 +00:00
jeo young
b308275d99 fix: 画布优化 2022-12-16 19:08:34 +08:00
41 changed files with 816 additions and 271 deletions

View File

@@ -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:
- .*

View File

@@ -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

36
.workflow/pr-pipeline.yml Normal file
View File

@@ -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

View File

@@ -1,6 +1,9 @@
{
"name": "go-view",
"version": "2.1.3",
"version": "2.1.5",
"engines": {
"node": ">=16.14 <18.0.0"
},
"scripts": {
"dev": "vite --host",
"build": "vue-tsc --noEmit && vite build",
@@ -21,6 +24,7 @@
"axios": "^0.27.2",
"color": "^4.2.3",
"crypto-js": "^4.1.1",
"dom-helpers": "^5.2.1",
"echarts-liquidfill": "^3.1.0",
"echarts-stat": "^1.2.0",
"echarts-wordcloud": "^2.0.0",
@@ -29,13 +33,13 @@
"html2canvas": "^1.4.1",
"keymaster": "^1.6.2",
"monaco-editor": "^0.33.0",
"naive-ui": "2.33.4",
"naive-ui": "2.34.3",
"pinia": "^2.0.13",
"screenfull": "^6.0.1",
"three": "^0.145.0",
"vue": "^3.2.31",
"vue-demi": "^0.13.1",
"vue-i18n": "9.1.10",
"vue-i18n": "^9.2.2",
"vue-router": "4.0.12",
"vue3-lazyload": "^0.2.5-beta",
"vue3-sketch-ruler": "^1.3.3",
@@ -78,4 +82,4 @@
"vue-echarts": "^6.0.2",
"vue-tsc": "^0.28.10"
}
}
}

121
pnpm-lock.yaml generated
View File

@@ -25,6 +25,7 @@ specifiers:
commitlint: ^17.0.2
crypto-js: ^4.1.1
default-passive-events: ^2.0.0
dom-helpers: ^5.2.1
echarts: ^5.3.2
echarts-liquidfill: ^3.1.0
echarts-stat: ^1.2.0
@@ -42,7 +43,7 @@ specifiers:
lodash: ~4.17.21
mockjs: ^1.1.0
monaco-editor: ^0.33.0
naive-ui: 2.33.4
naive-ui: 2.34.3
pinia: ^2.0.13
plop: ^3.0.5
prettier: ^2.6.2
@@ -59,7 +60,7 @@ specifiers:
vue: ^3.2.31
vue-demi: ^0.13.1
vue-echarts: ^6.0.2
vue-i18n: 9.1.10
vue-i18n: ^9.2.2
vue-router: 4.0.12
vue-tsc: ^0.28.10
vue3-lazyload: ^0.2.5-beta
@@ -77,6 +78,7 @@ dependencies:
axios: 0.27.2
color: 4.2.3
crypto-js: 4.1.1
dom-helpers: 5.2.1
echarts-liquidfill: 3.1.0_echarts@5.3.3
echarts-stat: 1.2.0
echarts-wordcloud: 2.0.0_echarts@5.3.3
@@ -85,13 +87,13 @@ dependencies:
html2canvas: 1.4.1
keymaster: 1.6.2
monaco-editor: 0.33.0
naive-ui: 2.33.4_vue@3.2.37
naive-ui: 2.34.3_vue@3.2.37
pinia: 2.0.14_ub5l46u3nefphax5x2tezui4oq
screenfull: 6.0.1
three: 0.145.0
vue: 3.2.37
vue-demi: 0.13.1_vue@3.2.37
vue-i18n: 9.1.10_vue@3.2.37
vue-i18n: 9.2.2_vue@3.2.37
vue-router: 4.0.12_vue@3.2.37
vue3-lazyload: 0.2.5-beta_2yymnzrok6eda47acnj2yjm3ae
vue3-sketch-ruler: 1.3.4_vue@3.2.37
@@ -402,6 +404,13 @@ packages:
- supports-color
dev: true
/@babel/runtime/7.20.6:
resolution: {integrity: sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==}
engines: {node: '>=6.9.0'}
dependencies:
regenerator-runtime: 0.13.11
dev: false
/@babel/template/7.16.7:
resolution: {integrity: sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==}
engines: {node: '>=6.9.0'}
@@ -671,60 +680,42 @@ packages:
resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
dev: true
/@intlify/core-base/9.1.10:
resolution: {integrity: sha512-So9CNUavB/IsZ+zBmk2Cv6McQp6vc2wbGi1S0XQmJ8Vz+UFcNn9MFXAe9gY67PreIHrbLsLxDD0cwo1qsxM1Nw==}
engines: {node: '>= 10'}
/@intlify/core-base/9.2.2:
resolution: {integrity: sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==}
engines: {node: '>= 14'}
dependencies:
'@intlify/devtools-if': 9.1.10
'@intlify/message-compiler': 9.1.10
'@intlify/message-resolver': 9.1.10
'@intlify/runtime': 9.1.10
'@intlify/shared': 9.1.10
'@intlify/vue-devtools': 9.1.10
'@intlify/devtools-if': 9.2.2
'@intlify/message-compiler': 9.2.2
'@intlify/shared': 9.2.2
'@intlify/vue-devtools': 9.2.2
dev: false
/@intlify/devtools-if/9.1.10:
resolution: {integrity: sha512-SHaKoYu6sog3+Q8js1y3oXLywuogbH1sKuc7NSYkN3GElvXSBaMoCzW+we0ZSFqj/6c7vTNLg9nQ6rxhKqYwnQ==}
engines: {node: '>= 10'}
/@intlify/devtools-if/9.2.2:
resolution: {integrity: sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==}
engines: {node: '>= 14'}
dependencies:
'@intlify/shared': 9.1.10
'@intlify/shared': 9.2.2
dev: false
/@intlify/message-compiler/9.1.10:
resolution: {integrity: sha512-+JiJpXff/XTb0EadYwdxOyRTB0hXNd4n1HaJ/a4yuV960uRmPXaklJsedW0LNdcptd/hYUZtCkI7Lc9J5C1gxg==}
engines: {node: '>= 10'}
/@intlify/message-compiler/9.2.2:
resolution: {integrity: sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==}
engines: {node: '>= 14'}
dependencies:
'@intlify/message-resolver': 9.1.10
'@intlify/shared': 9.1.10
'@intlify/shared': 9.2.2
source-map: 0.6.1
dev: false
/@intlify/message-resolver/9.1.10:
resolution: {integrity: sha512-5YixMG/M05m0cn9+gOzd4EZQTFRUu8RGhzxJbR1DWN21x/Z3bJ8QpDYj6hC4FwBj5uKsRfKpJQ3Xqg98KWoA+w==}
engines: {node: '>= 10'}
/@intlify/shared/9.2.2:
resolution: {integrity: sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==}
engines: {node: '>= 14'}
dev: false
/@intlify/runtime/9.1.10:
resolution: {integrity: sha512-7QsuByNzpe3Gfmhwq6hzgXcMPpxz8Zxb/XFI6s9lQdPLPe5Lgw4U1ovRPZTOs6Y2hwitR3j/HD8BJNGWpJnOFA==}
engines: {node: '>= 10'}
/@intlify/vue-devtools/9.2.2:
resolution: {integrity: sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==}
engines: {node: '>= 14'}
dependencies:
'@intlify/message-compiler': 9.1.10
'@intlify/message-resolver': 9.1.10
'@intlify/shared': 9.1.10
dev: false
/@intlify/shared/9.1.10:
resolution: {integrity: sha512-Om54xJeo1Vw+K1+wHYyXngE8cAbrxZHpWjYzMR9wCkqbhGtRV5VLhVc214Ze2YatPrWlS2WSMOWXR8JktX/IgA==}
engines: {node: '>= 10'}
dev: false
/@intlify/vue-devtools/9.1.10:
resolution: {integrity: sha512-5l3qYARVbkWAkagLu1XbDUWRJSL8br1Dj60wgMaKB0+HswVsrR6LloYZTg7ozyvM621V6+zsmwzbQxbVQyrytQ==}
engines: {node: '>= 10'}
dependencies:
'@intlify/message-resolver': 9.1.10
'@intlify/runtime': 9.1.10
'@intlify/shared': 9.1.10
'@intlify/core-base': 9.2.2
'@intlify/shared': 9.2.2
dev: false
/@jridgewell/gen-mapping/0.1.1:
@@ -889,6 +880,10 @@ packages:
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
dev: true
/@types/katex/0.14.0:
resolution: {integrity: sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA==}
dev: false
/@types/keymaster/1.6.30:
resolution: {integrity: sha512-mtL/NuDBX72zmyIa3cYHA1bQj1WAYlSC4eZcIQj+DHJkcRyTRF2XJXo7DBmkkY8TEq7XaAf7B8TGxs5PHhjRtw==}
dev: false
@@ -1219,6 +1214,10 @@ packages:
resolution: {integrity: sha512-IiA0SvDrJEgXvVxjNkHPFfDx6SXw0b/TUkqMcDZWNg9fnCAHbTpoo59YfJ9QLFkwa3raau5vSlRVzMSLDnfdtQ==}
dev: false
/@vue/devtools-api/6.4.5:
resolution: {integrity: sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==}
dev: false
/@vue/reactivity-transform/3.2.37:
resolution: {integrity: sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==}
dependencies:
@@ -1912,7 +1911,7 @@ packages:
dev: true
/csstype/2.6.20:
resolution: {integrity: sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/csstype/-/csstype-2.6.20.tgz}
resolution: {integrity: sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==}
dev: false
/csstype/3.0.11:
@@ -2065,6 +2064,13 @@ packages:
resolution: {integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==}
dev: true
/dom-helpers/5.2.1:
resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==}
dependencies:
'@babel/runtime': 7.20.6
csstype: 3.0.11
dev: false
/dom-serializer/1.4.1:
resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
dependencies:
@@ -3830,13 +3836,14 @@ packages:
resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
dev: true
/naive-ui/2.33.4_vue@3.2.37:
resolution: {integrity: sha512-4tK2lWx3v8sbEeTLG/tL5Ur9VvZyUxSnC0VcTO6NO1rM/D15JXg8jVwQCRFYnEp7mp3gfD5B3i8kN4JisTeiFA==}
/naive-ui/2.34.3_vue@3.2.37:
resolution: {integrity: sha512-fUMr0dzb/iGsOTWgoblPVobY5X5dihQ1eam5dA+H74oyLYAvgX4pL96xQFPBLIYqvyRFBAsN85kHN5pLqdtpxA==}
peerDependencies:
vue: ^3.0.0
dependencies:
'@css-render/plugin-bem': 0.15.10_css-render@0.15.10
'@css-render/vue3-ssr': 0.15.10_vue@3.2.37
'@types/katex': 0.14.0
'@types/lodash': 4.14.185
'@types/lodash-es': 4.17.6
async-validator: 4.1.1
@@ -4462,6 +4469,10 @@ packages:
strip-indent: 3.0.0
dev: true
/regenerator-runtime/0.13.11:
resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
dev: false
/regexp.prototype.flags/1.4.3:
resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==}
engines: {node: '>= 0.4'}
@@ -5385,16 +5396,16 @@ packages:
- supports-color
dev: true
/vue-i18n/9.1.10_vue@3.2.37:
resolution: {integrity: sha512-jpr7gV5KPk4n+sSPdpZT8Qx3XzTcNDWffRlHV/cT2NUyEf+sEgTTmLvnBAibjOFJ0zsUyZlVTAWH5DDnYep+1g==}
engines: {node: '>= 10'}
/vue-i18n/9.2.2_vue@3.2.37:
resolution: {integrity: sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==}
engines: {node: '>= 14'}
peerDependencies:
vue: ^3.0.0
dependencies:
'@intlify/core-base': 9.1.10
'@intlify/shared': 9.1.10
'@intlify/vue-devtools': 9.1.10
'@vue/devtools-api': 6.1.4
'@intlify/core-base': 9.2.2
'@intlify/shared': 9.2.2
'@intlify/vue-devtools': 9.2.2
'@vue/devtools-api': 6.4.5
vue: 3.2.37
dev: false

View File

@@ -26,12 +26,8 @@ export default {
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 }
"source|2-5": [
{ 'name|+1': ["厦门","福州","北京","上海","新疆","郑州","湖南","内蒙古"], 'value|0-40': 20 },
]
}
},

View File

@@ -14,16 +14,19 @@
</template>
<script lang="ts" setup>
import { useI18n } from "vue-i18n";
import { useLangStore } from '@/store/modules/langStore/langStore'
import { langList } from '@/i18n/index'
import { LangEnum } from '@/enums/styleEnum'
import { icon } from '@/plugins'
const { LanguageIcon } = icon.ionicons5
const { locale } = useI18n();
const langStore = useLangStore()
const options = langList
const handleSelect = (key: LangEnum) => {
locale.value = key;
langStore.changeLang(key)
}
</script>

View File

@@ -1,5 +1,5 @@
<template>
<n-modal v-model:show="modelShow" @afterLeave="closeHandle">
<n-modal v-model:show="modelShowRef" @afterLeave="closeHandle">
<n-list bordered class="go-system-info">
<template #header>
<n-space justify="space-between">
@@ -51,10 +51,10 @@ const props = defineProps({
const emit = defineEmits(['update:modelShow'])
const { HelpOutlineIcon, CloseIcon } = icon.ionicons5
const modelShow = ref(false)
const modelShowRef = ref(false)
watch(() => props.modelShow, (newValue) => {
modelShow.value = newValue
modelShowRef.value = newValue
})
const closeHandle = () => {

View File

@@ -1,5 +1,5 @@
<template>
<n-modal v-model:show="modelShow" @afterLeave="closeHandle">
<n-modal v-model:show="modelShowRef" @afterLeave="closeHandle">
<n-list bordered class="go-system-setting">
<template #header>
<n-space justify="space-between">
@@ -82,7 +82,7 @@ const props = defineProps({
const emit = defineEmits(['update:modelShow'])
const { HelpOutlineIcon, CloseIcon } = icon.ionicons5
const settingStore = useSettingStore()
const modelShow = ref(false)
const modelShowRef = ref(false)
const list = reactive<ListType[]>([
{
@@ -168,7 +168,7 @@ const list = reactive<ListType[]>([
])
watch(() => props.modelShow, (newValue) => {
modelShow.value = newValue
modelShowRef.value = newValue
})
const closeHandle = () => {

View File

@@ -66,7 +66,8 @@ export enum WinKeyboard {
ALT = ' alt',
CTRL_SOURCE_KEY = 'control',
SHIFT_SOURCE_KEY = 'shift',
ALT_SOURCE_KEY = 'alt'
ALT_SOURCE_KEY = 'alt',
SPACE = 'Space'
}
// Mac 键盘枚举
@@ -77,7 +78,8 @@ export enum MacKeyboard {
ALT = '⌥',
CTRL_SOURCE_KEY = '⌘',
SHIFT_SOURCE_KEY = '⇧',
ALT_SOURCE_KEY = '⌥'
ALT_SOURCE_KEY = '⌥',
SPACE = 'Space'
}
// 同步状态枚举

View File

@@ -23,6 +23,8 @@ export const langList = [
]
const i18n = createI18n({
legacy: false,
globalInjection:true,
locale: langStorage?.lang || lang,
fallbackLocale: langStorage?.lang || lang,
messages: {

View File

@@ -111,18 +111,18 @@ watch(
}
)
const calcData = (data: any) => {
mergeConfig(props.chartConfig.option)
calcCapsuleLengthAndLabelData()
}
const mergeConfig = (data: any) => {
state.mergedConfig = cloneDeep(data || {})
const calcData = (data: any, type?: string) => {
let cloneConfig = cloneDeep(props.chartConfig.option || {})
state.mergedConfig = cloneConfig
if (type == 'preview') {
cloneConfig.dataset = data
}
calcCapsuleLengthAndLabelData(state.mergedConfig.dataset)
}
// 数据解析
const calcCapsuleLengthAndLabelData = () => {
const { source } = state.mergedConfig.dataset
const calcCapsuleLengthAndLabelData = (dataset: any) => {
const { source } = dataset
if (!source.length) return
state.capsuleItemHeight = numberSizeHandle(state.mergedConfig.itemHeight)
@@ -151,7 +151,7 @@ onMounted(() => {
// 预览
useChartDataFetch(props.chartConfig, useChartEditStore, (newData: any) => {
calcData(newData)
calcData(newData, 'preview')
})
</script>

View File

@@ -1,5 +1,5 @@
export enum ChartModeEnum {
SINGLE= 'single',
SINGLE = 'single',
DOUBLE = 'double'
}
@@ -13,7 +13,9 @@ export enum ChartLayoutStoreEnum {
CHARTS = 'charts',
DETAILS = 'details',
Chart_TYPE = 'chartType',
LAYER_TYPE = 'layerType'
LAYER_TYPE = 'layerType',
PERCENTAGE = 'percentage',
RE_POSITION_CANVAS = 'rePositionCanvas'
}
export interface ChartLayoutType {
@@ -27,4 +29,8 @@ export interface ChartLayoutType {
[ChartLayoutStoreEnum.Chart_TYPE]: ChartModeEnum
// 层级展示方式
[ChartLayoutStoreEnum.LAYER_TYPE]: LayerModeEnum
// 当前正在加载的数量
[ChartLayoutStoreEnum.PERCENTAGE]: number
// 是否重置当前画布位置
[ChartLayoutStoreEnum.RE_POSITION_CANVAS]: boolean
}

View File

@@ -24,6 +24,10 @@ export const useChartLayoutStore = defineStore({
chartType: ChartModeEnum.SINGLE,
// 图层类型(默认图片)
layerType: LayerModeEnum.THUMBNAIL,
// 当前加载数量
percentage: 0,
// 是否重置当前画布位置
rePositionCanvas: false,
// 防止值不存在
...storageChartLayout
}),
@@ -42,6 +46,12 @@ export const useChartLayoutStore = defineStore({
},
getLayerType(): LayerModeEnum {
return this.layerType
},
getPercentage(): number {
return this.percentage
},
getRePositionCanvas(): boolean {
return this.rePositionCanvas
}
},
actions: {
@@ -49,11 +59,19 @@ export const useChartLayoutStore = defineStore({
this.$patch(state => {
state[key] = value
})
// 存储本地
setLocalStorage(GO_CHART_LAYOUT_STORE, this.$state)
// 这里需要标记重置画布位置
this.rePositionCanvas = true;
// 重新计算拖拽区域缩放比例
setTimeout(() => {
chartEditStore.computedScale()
}, 500)
},
setItemUnHandle<T extends keyof ChartLayoutType, K extends ChartLayoutType[T]>(key: T, value: K): void {
this.$patch(state => {
state[key] = value
})
}
}
})

View File

@@ -2,7 +2,6 @@ import { defineStore } from 'pinia'
import { lang } from '@/settings/designSetting'
import { LangStateType } from './langStore.d'
import { LangEnum } from '@/enums/styleEnum'
import i18n from '@/i18n/index'
import { setLocalStorage, getLocalStorage, reloadRoutePage } from '@/utils'
import { StorageEnum } from '@/enums/storageEnum'
import { useSettingStore } from '@/store/modules/settingStore/settingStore'
@@ -25,10 +24,8 @@ export const useLangStore = defineStore({
actions: {
changeLang(lang: LangEnum): void {
const settingStore = useSettingStore()
if (this.lang === lang) return
this.lang = lang
i18n.global.locale = lang
setLocalStorage(GO_LANG_STORE, this.$state)
if (settingStore.getChangeLangReload) {

View File

@@ -17,7 +17,7 @@
}
@mixin deep() {
:deep {
:deep() {
@content;
}
}

View File

@@ -250,15 +250,21 @@ export const objToCookie = (obj: RequestParamsObjType) => {
* @returns
*/
export const setKeyboardDressShow = (keyCode?: number) => {
const code = new Map([[17, WinKeyboard.CTRL]])
const code = new Map([
[17, WinKeyboard.CTRL],
[32, WinKeyboard.SPACE]
])
const dom = document.getElementById('keyboard-dress-show')
if (!dom) return
if (!keyCode) {
window.onKeySpacePressHold?.(false)
dom.innerText = ''
return
}
if (keyCode && code.has(keyCode)) {
if (keyCode == 32) window.onKeySpacePressHold?.(true)
dom.innerText = `按下了「${code.get(keyCode)}」键`
}
}

View File

@@ -18,14 +18,14 @@
</n-space>
</div>
<div
class="content"
:class="{
'content-height-show-top-bottom': showBottom || showTop,
'content-height-show-both': showBottom && showTop
}"
>
<template v-if="xScroll">
<div class="content" :class="{
'content-height-show-top-bottom': showBottom || showTop,
'content-height-show-both': showBottom && showTop
}">
<template v-if="disabledScroll">
<slot></slot>
</template>
<template v-else-if="xScroll">
<n-scrollbar x-scrollable>
<n-scrollbar>
<slot></slot>
@@ -83,7 +83,11 @@ defineProps({
xScroll: {
type: Boolean,
default: false
}
},
disabledScroll: {
type: Boolean,
default: false
},
})
const backHandle = () => {
@@ -93,41 +97,52 @@ const backHandle = () => {
<style lang="scss" scoped>
$topOrBottomHeight: 40px;
@include go(content-box) {
height: calc(100vh - #{$--header-height});
margin: 1px;
margin-bottom: 0;
&.bg-depth0 {
@include fetch-bg-color('background-color1');
.bottom,
.top {
@include fetch-bg-color('background-color1');
}
}
&.bg-depth1 {
@include fetch-bg-color('background-color1');
.bottom,
.top {
@include fetch-bg-color('background-color2');
}
}
&.bg-depth2 {
@include fetch-bg-color('background-color2');
.bottom,
.top {
@include fetch-bg-color('background-color3');
}
}
&.bg-depth3 {
@include fetch-bg-color('background-color3');
.bottom,
.top {
@include fetch-bg-color('background-color4');
}
}
&.flex {
flex: 1;
}
.top,
.bottom {
display: flex;
@@ -138,10 +153,12 @@ $topOrBottomHeight: 40px;
padding: 0 10px;
border-top: 1px solid;
@include fetch-border-color('hover-border-color');
.mt-1 {
margin-top: 2px;
}
}
.top {
border-bottom: 1px solid;
@include fetch-border-color('background-color1');
@@ -159,6 +176,7 @@ $topOrBottomHeight: 40px;
.content-height-show-top-bottom {
height: calc(100vh - #{$--header-height} - #{$topOrBottomHeight});
}
.content-height-show-both {
height: calc(100vh - #{$--header-height} - #{$topOrBottomHeight} - #{$topOrBottomHeight});
}

View File

@@ -1,5 +1,5 @@
<template>
<n-modal class="go-chart-data-pond-control" v-model:show="modelShow" :mask-closable="false">
<n-modal class="go-chart-data-pond-control" v-model:show="modelShowRef" :mask-closable="false">
<n-card :bordered="false" role="dialog" size="small" aria-modal="true" style="width: 900px; height: 650px">
<template #header></template>
<template #header-extra> </template>
@@ -37,7 +37,6 @@
<!-- 请求配置model -->
<pond-data-request
v-if="requestShow"
v-model:modelShow="requestShow"
:targetDataRequest="editData"
:isEdit="isEdit"
@@ -59,7 +58,7 @@ import { icon } from '@/plugins'
import { getUUID, goDialog } from '@/utils'
import { cloneDeep } from 'lodash'
defineProps({
const props = defineProps({
modelShow: Boolean
})
@@ -68,6 +67,7 @@ const { PencilIcon } = icon.ionicons5
const { chartEditStore, targetData } = useTargetData()
const { requestDataPond } = toRefs(chartEditStore.getRequestGlobalConfig)
const requestShow = ref(false)
const modelShowRef = ref(false)
const loading = ref(false)
const isEdit = ref(false)
const editData = ref<RequestDataPondItemType>()
@@ -82,6 +82,10 @@ const pondData = computed(() => {
return data[0]
})
watch(() => props.modelShow, (newValue) => {
modelShowRef.value = newValue
})
watch(
() => pondData.value,
newValue => {

View File

@@ -1,5 +1,5 @@
<template>
<n-modal class="go-chart-data-request" v-model:show="modelShow" :mask-closable="false" :closeOnEsc="false">
<n-modal class="go-chart-data-request" v-model:show="modelShowRef" :mask-closable="false" :closeOnEsc="false">
<n-card :bordered="false" role="dialog" size="small" aria-modal="true" style="width: 1000px; height: 800px">
<template #header></template>
<template #header-extra> </template>
@@ -29,7 +29,7 @@
</template>
<script script lang="ts" setup>
import { toRefs, PropType } from 'vue'
import { ref, toRefs, PropType, watch } from 'vue'
import { RequestContentTypeEnum } from '@/enums/httpEnum'
import { useTargetData } from '../../../hooks/useTargetData.hook'
import { RequestGlobalConfig } from './components/RequestGlobalConfig'
@@ -50,11 +50,22 @@ const { dataSyncUpdate } = useSync()
// 解构基础配置
const { chartConfig } = toRefs(props.targetData as CreateComponentType)
const { requestContentType } = toRefs((props.targetData as CreateComponentType).request)
const modelShowRef = ref(false)
const requestContentTypeObj = {
[RequestContentTypeEnum.DEFAULT]: '普通请求',
[RequestContentTypeEnum.SQL]: 'SQL 请求'
}
watch(
() => props.modelShow,
newValue => {
modelShowRef.value = newValue
},
{
immediate: true
}
)
const closeHandle = () => {
emit('update:modelShow', false)
}

View File

@@ -1,5 +1,5 @@
<template>
<n-modal class="go-chart-data-request" v-model:show="modelShow" :mask-closable="false" :closeOnEsc="false">
<n-modal class="go-chart-data-request" v-model:show="modelShowRef" :mask-closable="false" :closeOnEsc="false">
<n-card :bordered="false" role="dialog" size="small" aria-modal="true" style="width: 1000px; height: 800px">
<template #header></template>
<template #header-extra> </template>
@@ -42,7 +42,7 @@
</template>
<script script lang="ts" setup>
import { PropType, ref, watchEffect } from 'vue'
import { PropType, ref, watch } from 'vue'
import { RequestContentTypeEnum } from '@/enums/httpEnum'
import { useTargetData } from '../../../hooks/useTargetData.hook'
import { RequestGlobalConfig } from './components/RequestGlobalConfig'
@@ -60,6 +60,12 @@ const emit = defineEmits(['update:modelShow', 'editSaveHandle'])
const { dataSyncUpdate } = useSync()
const pondName = ref()
const inputInstRef = ref()
const modelShowRef = ref(false)
watch(() => props.modelShow, (newValue) => {
modelShowRef.value = newValue
})
const closeHandle = () => {
emit('update:modelShow', false)

View File

@@ -172,7 +172,7 @@ $max-width: 670px;
.scale-slider {
position: relative;
top: -4px;
width: 200px;
width: 100px;
}
}
}

View File

@@ -55,6 +55,8 @@ const rangeModelStyle = computed(() => {
position: relative;
transform-origin: left top;
background-size: cover;
border-radius: 20px;
overflow: hidden;
@include fetch-border-color('hover-border-color');
@include fetch-bg-color('background-color2');
@include go(edit-range-model) {

View File

@@ -1,49 +1,166 @@
<template>
<sketch-rule
v-if="configShow"
:thick="thick"
:scale="scale"
:width="canvasBox().width"
:height="canvasBox().height"
:startX="startX"
:startY="startY"
:lines="lines"
></sketch-rule>
<div class="go-sketch-rule">
<sketch-rule
v-if="sketchRuleReDraw"
:thick="thick"
:scale="scale"
:width="canvasBox().width"
:height="canvasBox().height"
:startX="startX"
:startY="startY"
:lines="lines"
:palette="paletteStyle"
>
</sketch-rule>
<div ref="$app" class="edit-screens" @scroll="handleScroll">
<div ref="$container" class="edit-screen-container" :style="{ width: width * 2 + 'px' }">
<div
ref="refSketchRuleBox"
class="canvas"
@mousedown="dragCanvas"
:style="{ marginLeft: '-' + (canvasBox().width / 2 - 25) + 'px' }"
>
<div :style="{ pointerEvents: isPressSpace ? 'none' : 'auto' }">
<slot></slot>
</div>
</div>
</div>
</div>
<!-- 修复右下角白点用的 -->
<div v-if="designStore.getDarkTheme" class="fix-edit-screens-block"></div>
</div>
</template>
<script setup lang="ts">
import { ref, toRefs, computed, watch, nextTick, onBeforeUnmount } from 'vue'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { ref, reactive, onMounted, toRefs, watch, onUnmounted, computed } from 'vue'
import { listen } from 'dom-helpers'
import { useDesignStore } from '@/store/modules/designStore/designStore'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore'
import { ChartLayoutStoreEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d'
import throttle from 'lodash/throttle'
const chartEditStore = useChartEditStore()
const chartLayoutStore = useChartLayoutStore()
const designStore = useDesignStore()
const { width, height } = toRefs(chartEditStore.getEditCanvasConfig)
const { scale, lockScale } = toRefs(chartEditStore.getEditCanvas)
const { getLayers, getCharts, getDetails } = toRefs(chartLayoutStore)
const configShow = ref(true)
// x轴标尺开始的坐标数值
const startX = -10
// y轴标尺开始的坐标数值
const startY = -10
// 标尺的厚度
const thick = 20
// 初始化水平标尺上的参考线
const lines = {
h: [],
v: []
let prevMoveXValue = [0, 0]
let prevMoveYValue = [0, 0]
const $app = ref()
const sketchRuleReDraw = ref(true)
const refSketchRuleBox = ref()
const $container = ref()
const isPressSpace = ref(false)
const cursorStyle = ref('auto')
const { width, height } = toRefs(chartEditStore.getEditCanvasConfig)
const startX = ref(0)
const startY = ref(0)
const lines = reactive({ h: [], v: [] })
const scale = computed(() => {
return chartEditStore.getEditCanvas.scale
})
// 滚动条拖动的高度
const containerWidth = computed(() => {
return `${height.value * 2}px`
})
// 主题
const paletteStyle = computed(() => {
const isDarkTheme = designStore.getDarkTheme
return isDarkTheme
? {
bgColor: '#18181c',
longfgColor: '#4d4d4d',
shortfgColor: '#4d4d4d',
fontColor: '#4d4d4d',
shadowColor: '#18181c',
borderColor: '#18181c',
cornerActiveColor: '#18181c'
}
: {}
})
// 颜色
const themeColor = computed(() => {
return designStore.getAppTheme
})
// 处理鼠标拖动
const handleWheel = (e: any) => {
if (e.ctrlKey || e.metaKey) {
e.preventDefault()
let resScale = scale.value
// 放大(200%)
if (e.wheelDelta >= 0 && scale.value < 2) {
resScale = scale.value + 0.05
chartEditStore.setScale(resScale)
return
}
// 缩小(10%)
if (e.wheelDelta < 0 && scale.value > 0.1) {
resScale = scale.value - 0.05
chartEditStore.setScale(resScale)
}
}
}
// 滚动条处理
const handleScroll = () => {
if (!$app.value) return
const screensRect = $app.value.getBoundingClientRect()
const canvasRect = refSketchRuleBox.value.getBoundingClientRect()
// 标尺开始的刻度
startX.value = (screensRect.left + thick - canvasRect.left) / scale.value
startY.value = (screensRect.top + thick - canvasRect.top) / scale.value
}
// 拖拽处理
const dragCanvas = (e: any) => {
e.preventDefault()
e.stopPropagation()
if (e.which == 2) isPressSpace.value = true
else if (!window.$KeyboardActive?.space) return
// @ts-ignore
document.activeElement?.blur()
const startX = e.pageX
const startY = e.pageY
const listenMousemove = listen(window, 'mousemove', (e: any) => {
const nx = e.pageX - startX
const ny = e.pageY - startY
const [prevMoveX1, prevMoveX2] = prevMoveXValue
const [prevMoveY1, prevMoveY2] = prevMoveYValue
prevMoveXValue = [prevMoveX2, nx]
prevMoveYValue = [prevMoveY2, ny]
$app.value.scrollLeft -=
prevMoveX2 > prevMoveX1 ? Math.abs(prevMoveX2 - prevMoveX1) : -Math.abs(prevMoveX2 - prevMoveX1)
$app.value.scrollTop -=
prevMoveY2 > prevMoveY1 ? Math.abs(prevMoveY2 - prevMoveY1) : -Math.abs(prevMoveY2 - prevMoveY1)
})
const listenMouseup = listen(window, 'mouseup', () => {
listenMousemove()
listenMouseup()
prevMoveXValue = [0, 0]
prevMoveYValue = [0, 0]
isPressSpace.value = false
})
}
// 计算画布大小
const canvasBox = () => {
const layoutDom = document.getElementById('go-chart-edit-layout')
if (layoutDom) {
return {
height: layoutDom.clientHeight - 40,
height: layoutDom.clientHeight - 25,
width: layoutDom.clientWidth
}
}
@@ -53,83 +170,109 @@ const canvasBox = () => {
}
}
// 颜色
const themeColor = computed(() => {
return designStore.getAppTheme
})
// 处理标尺重制大小
const ruleChangeHandle = () => {
configShow.value = false
// 重绘标尺
const reDraw = () => {
sketchRuleReDraw.value = false
setTimeout(() => {
configShow.value = true
})
sketchRuleReDraw.value = true
}, 10)
}
const ruleChangeHandleTimeOut = () => {
if (lockScale.value) {
setTimeout(() => {
ruleChangeHandle()
}, 500)
// 滚动居中
const canvasPosCenter = () => {
const { width: containerWidth, height: containerHeight } = $container.value.getBoundingClientRect()
const { width, height } = canvasBox()
$app.value.scrollLeft = containerWidth / 2 - width / 2
$app.value.scrollTop = containerHeight / 2 - height / 2
}
// 处理主题变化
watch(
() => designStore.getDarkTheme,
() => {
reDraw()
}
}
)
// // 处理标尺重制大小
watch(
() => scale.value,
() => ruleChangeHandle()
(newValue, oldValue) => {
if (oldValue !== newValue && chartLayoutStore.getRePositionCanvas) {
chartLayoutStore.setItemUnHandle(ChartLayoutStoreEnum.RE_POSITION_CANVAS, false)
handleScroll()
setTimeout(() => {
canvasPosCenter()
reDraw()
}, 400)
} else {
throttle(reDraw, 20)
}
}
)
// 处理鼠标样式
watch(
() => getLayers.value,
() => ruleChangeHandleTimeOut()
() => isPressSpace.value,
newValue => {
cursorStyle.value = newValue ? 'grab' : 'auto'
}
)
watch(
() => getCharts.value,
() => ruleChangeHandleTimeOut()
)
onMounted(() => {
if ($app.value) {
$app.value.addEventListener('wheel', handleWheel, { passive: false })
canvasPosCenter()
}
})
watch(
() => getDetails.value,
() => ruleChangeHandleTimeOut()
)
onUnmounted(() => {
if ($app.value) {
$app.value.removeEventListener('wheel', handleWheel)
}
})
window.onKeySpacePressHold = (isHold: boolean) => {
isPressSpace.value = isHold
}
</script>
<style>
/* 使用 SCSS 会报错,直接使用最基础的 CSS 进行修改,
此库有计划 Vue3 版本,但是开发的时候还没发布 */
#mb-ruler {
top: 0;
left: 0;
}
/* 适配底部的工具栏不遮盖 */
#mb-ruler .v-container {
height: calc(100% - 65px) !important;
}
/* 横线 */
#mb-ruler .v-container .lines .line {
/* 最大缩放 200% */
width: 200vw !important;
border-top: 1px dashed v-bind('themeColor') !important;
}
#mb-ruler .v-container .indicator {
border-bottom: 1px dashed v-bind('themeColor') !important;
}
/* 竖线 */
#mb-ruler .h-container .lines .line {
/* 最大缩放 200% */
height: 200vh !important;
border-left: 1px dashed v-bind('themeColor') !important;
}
#mb-ruler .h-container .indicator {
border-left: 1px dashed v-bind('themeColor') !important;
}
/* 坐标数值背景颜色 */
#mb-ruler .indicator .value {
background-color: rgba(0, 0, 0, 0);
}
/* 删除按钮 */
#mb-ruler .line .del {
padding: 0;
@@ -142,3 +285,72 @@ watch(
border-width: 0 !important;
}
</style>
<style lang="scss" scoped>
@include go('sketch-rule') {
position: relative;
overflow: hidden;
width: 100%;
height: 100%;
.edit-screens {
position: absolute;
width: 100%;
height: 100%;
overflow: auto;
user-select: none;
padding-bottom: 0px;
/* firefox */
scrollbar-color: rgba(144, 146, 152, 0.3) transparent;
scrollbar-width: thin;
/* chrome */
&::-webkit-scrollbar,
&::-webkit-scrollbar-track-piece {
background-color: transparent;
}
&::-webkit-scrollbar {
width: 7px;
}
&::-webkit-scrollbar-thumb {
border-radius: 5px;
background-color: rgba(144, 146, 152, 0.3);
}
}
.fix-edit-screens-block {
position: absolute;
bottom: 0;
right: 0;
width: 10px;
height: 10px;
background-color: $--color-dark-bg-1;
}
.edit-screen-container {
position: absolute;
height: v-bind('containerWidth');
top: 0;
left: 0;
}
.canvas {
position: absolute;
top: 50%;
left: 50%;
transform-origin: 50% 0;
transform: translateY(-50%);
&:hover {
cursor: v-bind('cursorStyle');
}
&:active {
cursor: crosshair;
}
}
}
</style>

View File

@@ -93,7 +93,7 @@ watch(
position: absolute;
width: 100%;
height: 100%;
border-radius: 10px;
border-radius: 5px;
overflow: hidden;
}
.select-border {
@@ -107,7 +107,7 @@ watch(
.select-background {
top: 2px;
left: 2px;
opacity: 0.03;
opacity: 0.2;
background-color: v-bind('themeColor');
}
}

View File

@@ -1,5 +1,5 @@
<template>
<n-modal v-model:show="modelShow" :mask-closable="true" @afterLeave="closeHandle">
<n-modal v-model:show="modelShowRef" :mask-closable="true" @afterLeave="closeHandle">
<n-table class="model-content" :bordered="false" :single-line="false">
<thead>
<tr>
@@ -19,7 +19,8 @@
<tr v-for="(item, index) in shortcutKeyOptions" :key="index">
<td>{{ item.label }}</td>
<td>{{ item.win }}</td>
<td>
<td v-if="item.macSource">{{ item.mac }}</td>
<td v-else>
<n-gradient-text :size="22">{{ item.mac.substr(0, 1) }}</n-gradient-text>
+ {{ item.mac.substr(3) }}
</td>
@@ -30,39 +31,37 @@
</template>
<script setup lang="ts">
import { watch, ref } from 'vue'
import { icon } from '@/plugins'
import { WinKeyboard, MacKeyboard } from '@/enums/editPageEnum'
const { CloseIcon } = icon.ionicons5
const modelShowRef = ref(false)
const emit = defineEmits(['update:modelShow'])
defineProps({
const props = defineProps({
modelShow: Boolean
})
watch(() => props.modelShow, (newValue) => {
modelShowRef.value = newValue
})
// 快捷键
const shortcutKeyOptions = [
{
label: '向上移动',
win: `${WinKeyboard.CTRL.toUpperCase()} + `,
label: '拖拽画布',
win: `${WinKeyboard.SPACE.toUpperCase()} + 🖱️ `,
mac: `${MacKeyboard.SPACE.toUpperCase()} + 🖱️ `,
macSource: true
},
{
label: '向 上/右/下/左 移动',
win: `${WinKeyboard.CTRL.toUpperCase()} + ↑ 或 → 或 ↓ 或 ←`,
mac: `${MacKeyboard.CTRL.toUpperCase()} + ↑ `
},
{
label: '向右移动',
win: `${WinKeyboard.CTRL.toUpperCase()} + → `,
mac: `${MacKeyboard.CTRL.toUpperCase()} + → `
},
{
label: '向下移动',
win: `${WinKeyboard.CTRL.toUpperCase()} + ↓ `,
mac: `${MacKeyboard.CTRL.toUpperCase()} + ↓ `
},
{
label: '向左移动',
win: `${WinKeyboard.CTRL.toUpperCase()} + ← `,
mac: `${MacKeyboard.CTRL.toUpperCase()} + ← `
},
{
label: '锁定',
win: `${WinKeyboard.CTRL.toUpperCase()} + L `,
@@ -134,6 +133,7 @@ const shortcutKeyOptions = [
mac: `${MacKeyboard.CTRL.toUpperCase()} + ${WinKeyboard.SHIFT.toUpperCase()} + G `
}
]
const closeHandle = () => {
emit('update:modelShow', false)
}

View File

@@ -62,6 +62,9 @@ export const mousedownHandleUnStop = (e: MouseEvent, item?: CreateComponentType
// * 框选
export const mousedownBoxSelect = (e: MouseEvent, item?: CreateComponentType | CreateComponentGroupType) => {
if (e.which == 2) return
if (window.$KeyboardActive?.space) return
mousedownHandleUnStop(e)
// 记录点击初始位置
@@ -149,7 +152,7 @@ export const mousedownBoxSelect = (e: MouseEvent, item?: CreateComponentType | C
}
}
})
}, 20)
}, 30)
// 鼠标抬起
const mouseup = () => {

View File

@@ -1,5 +1,5 @@
<template>
<edit-rule></edit-rule>
<!-- <edit-rule></edit-rule> -->
<content-box
id="go-chart-edit-layout"
:flex="true"
@@ -7,65 +7,68 @@
:showBottom="true"
:depth="1"
:xScroll="true"
:disabledScroll="true"
@mousedown="mousedownHandleUnStop"
@drop="dragHandle"
@dragover="dragoverHandle"
@dragenter="dragoverHandle"
>
<!-- 画布主体 -->
<div id="go-chart-edit-content" @contextmenu="handleContextMenu">
<!-- 展示 -->
<edit-range>
<!-- 滤镜预览 -->
<div
:style="{
...getFilterStyle(chartEditStore.getEditCanvasConfig),
...rangeStyle
}"
>
<!-- 图表 -->
<div v-for="(item, index) in chartEditStore.getComponentList" :key="item.id">
<!-- 分组 -->
<edit-group
v-if="item.isGroup"
:groupData="(item as CreateComponentGroupType)"
:groupIndex="index"
></edit-group>
<edit-rule>
<!-- 画布主体 -->
<div id="go-chart-edit-content" @contextmenu="handleContextMenu">
<!-- 展示 -->
<edit-range>
<!-- 滤镜预览 -->
<div
:style="{
...getFilterStyle(chartEditStore.getEditCanvasConfig),
...rangeStyle
}"
>
<!-- 图表 -->
<div v-for="(item, index) in chartEditStore.getComponentList" :key="item.id">
<!-- 分组 -->
<edit-group
v-if="item.isGroup"
:groupData="(item as CreateComponentGroupType)"
:groupIndex="index"
></edit-group>
<!-- 单组件 -->
<edit-shape-box
v-else
:data-id="item.id"
:index="index"
:style="{
<!-- 单组件 -->
<edit-shape-box
v-else
:data-id="item.id"
:index="index"
:style="{
...useComponentStyle(item.attr, index),
...getBlendModeStyle(item.styles) as any
}"
:item="item"
@click="mouseClickHandle($event, item)"
@mousedown="mousedownHandle($event, item)"
@mouseenter="mouseenterHandle($event, item)"
@mouseleave="mouseleaveHandle($event, item)"
@contextmenu="handleContextMenu($event, item, optionsHandle)"
>
<component
class="edit-content-chart"
:class="animationsClass(item.styles.animations)"
:is="item.chartConfig.chartKey"
:chartConfig="item"
:themeSetting="themeSetting"
:themeColor="themeColor"
:style="{
...useSizeStyle(item.attr),
...getFilterStyle(item.styles),
...getTransformStyle(item.styles)
}"
></component>
</edit-shape-box>
:item="item"
@click="mouseClickHandle($event, item)"
@mousedown="mousedownHandle($event, item)"
@mouseenter="mouseenterHandle($event, item)"
@mouseleave="mouseleaveHandle($event, item)"
@contextmenu="handleContextMenu($event, item, optionsHandle)"
>
<component
class="edit-content-chart"
:class="animationsClass(item.styles.animations)"
:is="item.chartConfig.chartKey"
:chartConfig="item"
:themeSetting="themeSetting"
:themeColor="themeColor"
:style="{
...useSizeStyle(item.attr),
...getFilterStyle(item.styles),
...getTransformStyle(item.styles)
}"
></component>
</edit-shape-box>
</div>
</div>
</div>
</edit-range>
</div>
</edit-range>
</div>
</edit-rule>
<!-- 工具栏 -->
<template #aside>
@@ -191,12 +194,13 @@ onMounted(() => {
overflow: hidden;
@extend .go-point-bg;
@include background-image('background-point');
@include goId('chart-edit-content') {
border-radius: 10px;
margin: 25px;
overflow: hidden;
@extend .go-transition;
@include fetch-theme('box-shadow');
.edit-content-chart {
position: absolute;
overflow: hidden;

View File

@@ -0,0 +1,3 @@
import ContentLoad from './index.vue'
export { ContentLoad }

View File

@@ -0,0 +1,40 @@
<template>
<n-modal :show="showModal" :close-on-esc="false" transform-origin="center">
<div>
<span> 拼命加载中... </span>
<n-progress type="line" :color="themeColor" :percentage="percentage" style="width: 300px" />
</div>
</n-modal>
</template>
<script setup lang="ts">
import { ref, watch, computed } from 'vue'
import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore'
import { useDesignStore } from '@/store/modules/designStore/designStore'
const chartLayoutStore = useChartLayoutStore()
const designStore = useDesignStore()
const showModal = ref(false)
const percentage = ref(0)
// 颜色
const themeColor = computed(() => {
return designStore.getAppTheme
})
// 监听百分比
watch(
() => chartLayoutStore.getPercentage,
newValue => {
if (newValue === 0) {
setTimeout(() => {
percentage.value = newValue
showModal.value = false
}, 500);
return
}
percentage.value = newValue
showModal.value = newValue > 0
}
)
</script>

View File

@@ -115,21 +115,33 @@ const macKeyList: Array<string> = [
const keyRecordHandle = () => {
// 默认赋值
window.$KeyboardActive = {
ctrl: false
ctrl: false,
space: false
}
document.onkeydown = (e: KeyboardEvent) => {
if(e.keyCode === 17 && window.$KeyboardActive) {
const { keyCode } = e
if (keyCode == 32 && e.target == document.body) e.preventDefault()
if ([17, 32].includes(keyCode) && window.$KeyboardActive) {
setKeyboardDressShow(e.keyCode)
window.$KeyboardActive.ctrl = true
switch (keyCode) {
case 17: window.$KeyboardActive.ctrl = true; break
case 32: window.$KeyboardActive.space = true; break
}
}
}
document.onkeyup = (e: KeyboardEvent) => {
if(e.keyCode === 17 && window.$KeyboardActive)
{
window.$KeyboardActive.ctrl = false
const { keyCode } = e
if (keyCode == 32 && e.target == document.body) e.preventDefault()
if ([17, 32].includes(keyCode) && window.$KeyboardActive) {
setKeyboardDressShow()
switch (keyCode) {
case 17: window.$KeyboardActive.ctrl = false; break
case 32: window.$KeyboardActive.space = false; break
}
}
}
}

View File

@@ -6,6 +6,8 @@ import { EditCanvasTypeEnum, ChartEditStoreEnum, ProjectInfoEnum, ChartEditStora
import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore'
import { StylesSetting } from '@/components/Pages/ChartItemSetting'
import { useSystemStore } from '@/store/modules/systemStore/systemStore'
import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore'
import { ChartLayoutStoreEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d'
import { fetchChartComponent, fetchConfigComponent, createComponent } from '@/packages/index'
import { saveInterval } from '@/settings/designSetting'
import throttle from 'lodash/throttle'
@@ -98,7 +100,7 @@ export const useSync = () => {
const chartEditStore = useChartEditStore()
const chartHistoryStore = useChartHistoryStore()
const systemStore = useSystemStore()
const chartLayoutStore = useChartLayoutStore()
/**
* * 组件动态注册
* @param projectData 项目数据
@@ -164,7 +166,13 @@ export const useSync = () => {
for (const key in projectData) {
// 组件
if (key === ChartEditStoreEnum.COMPONENT_LIST) {
let loadIndex = 0
const listLength = projectData[key].length;
for (const comItem of projectData[key]) {
// 设置加载数量
let percentage = parseInt((parseFloat(`${++loadIndex / listLength}`) * 100).toString())
chartLayoutStore.setItemUnHandle(ChartLayoutStoreEnum.PERCENTAGE, percentage)
// 判断类型
if (comItem.isGroup) {
// 创建分组
let groupClass = new PublicGroupConfigClass()
@@ -195,6 +203,9 @@ export const useSync = () => {
componentMerge(chartEditStore[key], projectData[key], true)
}
}
// 清除数量
chartLayoutStore.setItemUnHandle(ChartLayoutStoreEnum.PERCENTAGE, 0)
}
/**

View File

@@ -32,6 +32,8 @@
:on-clickoutside="onClickOutSide"
@select="handleMenuSelect"
></n-dropdown>
<!-- 加载蒙层 -->
<content-load></content-load>
</template>
<script setup lang="ts">
@@ -53,6 +55,7 @@ const HeaderTitle = loadAsyncComponent(() => import('./ContentHeader/headerTitle
const ContentLayers = loadAsyncComponent(() => import('./ContentLayers/index.vue'))
const ContentCharts = loadAsyncComponent(() => import('./ContentCharts/index.vue'))
const ContentConfigurations = loadAsyncComponent(() => import('./ContentConfigurations/index.vue'))
const ContentLoad = loadAsyncComponent(() => import('./ContentLoad/index.vue'))
// 右键
const {

View File

@@ -2,7 +2,7 @@
<div
class="chart-item"
v-for="(item, index) in localStorageInfo.componentList"
:class="animationsClass(item.styles.animations)"
:class="[animationsClass(item.styles.animations), !item.isGroup && 'hidden']"
:key="item.id"
:style="{
...getComponentAttrStyle(item.attr, index),
@@ -78,6 +78,8 @@ onMounted(() => {
<style lang="scss" scoped>
.chart-item {
position: absolute;
overflow: hidden;
&.hidden {
overflow: hidden;
}
}
</style>

View File

@@ -27,6 +27,16 @@
import { ProjectLayoutSider } from './layout/components/ProjectLayoutSider'
import { LayoutHeaderPro } from '@/layout/components/LayoutHeaderPro'
import { LayoutTransitionMain } from '@/layout/components/LayoutTransitionMain/index'
import { goDialog } from '@/utils'
// 提示
goDialog({
message: '不要在官方后端上发布任何私密数据,任何人都看得到并进行删除!!!!',
isMaskClosable: true,
closeNegativeText: true,
transformOrigin: 'center',
onPositiveCallback: () => {}
})
</script>
<style lang="scss" scoped>

View File

@@ -87,6 +87,7 @@ import { renderIcon, renderLang, requireErrorImg } from '@/utils'
import { icon } from '@/plugins'
import { MacOsControlBtn } from '@/components/Tips/MacOsControlBtn'
import { Chartype } from '../../index.d'
import { log } from 'console'
const {
EllipsisHorizontalCircleSharpIcon,
CopyIcon,

View File

@@ -37,7 +37,7 @@
<!-- model -->
<project-items-modal-card
v-if="modalData"
v-model:modalShow="modalShow"
:modalShow="modalShow"
:cardData="modalData"
@close="closeModal"
@edit="editHandle"

View File

@@ -2,7 +2,7 @@
<!-- mask-closable 暂时是失效的不知道为啥 -->
<n-modal
class="go-modal-box"
v-model:show="modalShow"
v-model:show="showRef"
@afterLeave="closeHandle"
>
<n-card hoverable size="small">
@@ -73,21 +73,42 @@
</template>
<script setup lang="ts">
import { reactive, PropType } from 'vue'
import { ref, reactive, PropType, watch } from 'vue'
import { renderIcon, renderLang } from '@/utils'
import { icon } from '@/plugins'
import { MacOsControlBtn } from '@/components/Tips/MacOsControlBtn'
import { Chartype } from '../../index.d'
const { HammerIcon } = icon.ionicons5
const showRef = ref(false)
const emit = defineEmits(['close', 'edit'])
const props = defineProps({
modalShow: Boolean,
cardData: Object as PropType<Chartype>
modalShow: {
required: true,
type: Boolean
},
cardData: {
required: true,
type: Object
}
})
watch(
() => props.modalShow,
newValue => {
showRef.value = newValue
},
{
immediate: true
}
)
// 处理url获取
const requireUrl = (name: string) => {
return new URL(`../../../../../assets/images/${name}`, import.meta.url).href
}
const fnBtnList = reactive([
{
label: renderLang('global.r_edit'),

View File

@@ -1,5 +1,5 @@
<template>
<n-modal v-model:show="show" class="go-create-modal">
<n-modal v-model:show="showRef" class="go-create-modal" @afterLeave="closeHandle">
<n-space size="large">
<n-card class="card-box" hoverable>
<template #header>
@@ -35,7 +35,7 @@
</template>
<script lang="ts" setup>
import { watch } from 'vue'
import { ref, watch, shallowRef } from 'vue'
import { icon } from '@/plugins'
import { PageEnum, ChartEnum } from '@/enums/pageEnum'
import { ResultEnum } from '@/enums/httpEnum'
@@ -44,13 +44,14 @@ import { createProjectApi } from '@/api/path'
const { FishIcon, CloseIcon } = icon.ionicons5
const { StoreIcon, ObjectStorageIcon } = icon.carbon
const $t = window['$t']
const showRef = ref(false)
const emit = defineEmits(['close'])
const props = defineProps({
show: Boolean
})
const typeList = [
const typeList = shallowRef([
{
title: renderLang('project.new_project'),
key: ChartEnum.CHART_HOME_NAME,
@@ -69,13 +70,10 @@ const typeList = [
icon: StoreIcon,
disabled: true
}
]
])
// 解决点击模态层不会触发 @on-after-leave 的问题
watch(props, newValue => {
if (!newValue.show) {
closeHandle()
}
watch(() => props.show, newValue => {
showRef.value = newValue
})
// 关闭对话框
@@ -115,7 +113,7 @@ const btnHandle = async (key: string) => {
<style lang="scss" scoped>
$cardWidth: 570px;
@include go("create-modal") {
@include go('create-modal') {
position: fixed;
top: 200px;
left: 50%;
@@ -126,7 +124,7 @@ $cardWidth: 570px;
border: 1px solid rgba(0, 0, 0, 0);
@extend .go-transition;
&:hover {
@include hover-border-color("hover-border-color");
@include hover-border-color('hover-border-color');
}
&-tite {
font-size: 14px;

2
types/global.d.ts vendored
View File

@@ -7,6 +7,8 @@ interface Window {
$vue: any
// 键盘按键记录
$KeyboardActive?: { [T: string]: boolean }
onKeySpacePressHold?: Function
// 编辑 JSON 的存储对象
opener: any
}

View File

@@ -4,4 +4,5 @@ declare module '*.vue' {
export default component
}
declare module 'lodash/*'
declare module 'lodash/*'
declare module 'dom-helpers'