This commit is contained in:
奔跑的面条 2022-10-08 20:59:25 +08:00
commit 524cd162b3
73 changed files with 3154 additions and 6437 deletions

View File

@ -22,6 +22,7 @@ module.exports = {
'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', 'no-unused-vars': 'off',
'vue/no-unused-vars': 'off',
'vue/multi-word-component-names': 'off', 'vue/multi-word-component-names': 'off',
'vue/valid-template-root': 'off', 'vue/valid-template-root': 'off',
'vue/no-mutating-props': 'off' 'vue/no-mutating-props': 'off'

View File

@ -83,24 +83,3 @@
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%);
}
}

View File

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

View File

@ -26,7 +26,7 @@
"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.3",
"pinia": "^2.0.13", "pinia": "^2.0.13",
"screenfull": "^6.0.1", "screenfull": "^6.0.1",
"vue": "^3.2.31", "vue": "^3.2.31",

440
pnpm-lock.yaml generated
View File

@ -38,7 +38,7 @@ specifiers:
lodash: ~4.17.21 lodash: ~4.17.21
mockjs: ^1.1.0 mockjs: ^1.1.0
monaco-editor: ^0.33.0 monaco-editor: ^0.33.0
naive-ui: 2.30.3 naive-ui: 2.33.3
pinia: ^2.0.13 pinia: ^2.0.13
plop: ^3.0.5 plop: ^3.0.5
prettier: ^2.6.2 prettier: ^2.6.2
@ -77,7 +77,7 @@ dependencies:
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_vue@3.2.37 naive-ui: registry.npmmirror.com/naive-ui/2.33.3_vue@3.2.37
pinia: 2.0.14_ub5l46u3nefphax5x2tezui4oq pinia: 2.0.14_ub5l46u3nefphax5x2tezui4oq
screenfull: 6.0.1 screenfull: 6.0.1
vue: 3.2.37 vue: 3.2.37
@ -458,7 +458,7 @@ packages:
engines: {node: '>=v14'} engines: {node: '>=v14'}
dependencies: dependencies:
'@commitlint/types': 17.0.0 '@commitlint/types': 17.0.0
lodash: 4.17.21 lodash: registry.npmmirror.com/lodash/4.17.21
dev: true dev: true
/@commitlint/execute-rule/17.0.0: /@commitlint/execute-rule/17.0.0:
@ -500,11 +500,11 @@ packages:
'@commitlint/execute-rule': 17.0.0 '@commitlint/execute-rule': 17.0.0
'@commitlint/resolve-extends': 17.0.0 '@commitlint/resolve-extends': 17.0.0
'@commitlint/types': 17.0.0 '@commitlint/types': 17.0.0
'@types/node': 17.0.43 '@types/node': registry.npmmirror.com/@types/node/17.0.43
chalk: 4.1.2 chalk: 4.1.2
cosmiconfig: 7.0.1 cosmiconfig: 7.0.1
cosmiconfig-typescript-loader: 2.0.1_sg2ukyc6p547g74ru6fclbyzsu cosmiconfig-typescript-loader: 2.0.1_sg2ukyc6p547g74ru6fclbyzsu
lodash: 4.17.21 lodash: registry.npmmirror.com/lodash/4.17.21
resolve-from: 5.0.0 resolve-from: 5.0.0
typescript: 4.7.3 typescript: 4.7.3
transitivePeerDependencies: transitivePeerDependencies:
@ -543,7 +543,7 @@ packages:
'@commitlint/config-validator': 17.0.0 '@commitlint/config-validator': 17.0.0
'@commitlint/types': 17.0.0 '@commitlint/types': 17.0.0
import-fresh: 3.3.0 import-fresh: 3.3.0
lodash: 4.17.21 lodash: registry.npmmirror.com/lodash/4.17.21
resolve-from: 5.0.0 resolve-from: 5.0.0
resolve-global: 1.0.0 resolve-global: 1.0.0
dev: true dev: true
@ -585,22 +585,6 @@ packages:
'@jridgewell/trace-mapping': 0.3.9 '@jridgewell/trace-mapping': 0.3.9
dev: true dev: true
/@css-render/plugin-bem/0.15.10_css-render@0.15.10:
resolution: {integrity: sha512-V7b08sM2PWJlXI7BJiVIa0Sg30H3u/jHay4AclNXfF2yRFwwb4ZJjggsMfzwj3WSihAdNf2WTqvOU5qsOD80Dg==}
peerDependencies:
css-render: ~0.15.10
dependencies:
css-render: 0.15.10
dev: false
/@css-render/vue3-ssr/0.15.10_vue@3.2.37:
resolution: {integrity: sha512-keGKnkB2nyVGoA8GezMKNsmvTGXEzgLOGGlgshwOTSEzd1dsROyZ2m/khJ9jV5zbzDM4rWeAWbWF0zwHemsJcw==}
peerDependencies:
vue: ^3.0.11
dependencies:
vue: 3.2.37
dev: false
/@emmetio/abbreviation/2.2.3: /@emmetio/abbreviation/2.2.3:
resolution: {integrity: sha512-87pltuCPt99aL+y9xS6GPZ+Wmmyhll2WXH73gG/xpGcQ84DRnptBsI2r0BeIQ0EB/SQTOe2ANPqFqj3Rj5FOGA==} resolution: {integrity: sha512-87pltuCPt99aL+y9xS6GPZ+Wmmyhll2WXH73gG/xpGcQ84DRnptBsI2r0BeIQ0EB/SQTOe2ANPqFqj3Rj5FOGA==}
dependencies: dependencies:
@ -617,10 +601,6 @@ packages:
resolution: {integrity: sha512-8HqW8EVqjnCmWXVpqAOZf+EGESdkR27odcMMMGefgKXtar00SoYNSryGv//TELI4T3QFsECo78p+0lmalk/CFA==} resolution: {integrity: sha512-8HqW8EVqjnCmWXVpqAOZf+EGESdkR27odcMMMGefgKXtar00SoYNSryGv//TELI4T3QFsECo78p+0lmalk/CFA==}
dev: true dev: true
/@emotion/hash/0.8.0:
resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==}
dev: false
/@eslint/eslintrc/1.3.0: /@eslint/eslintrc/1.3.0:
resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==} resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@ -754,10 +734,6 @@ packages:
'@jridgewell/sourcemap-codec': 1.4.13 '@jridgewell/sourcemap-codec': 1.4.13
dev: true dev: true
/@juggle/resize-observer/3.3.1:
resolution: {integrity: sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw==}
dev: false
/@nodelib/fs.scandir/2.1.5: /@nodelib/fs.scandir/2.1.5:
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
@ -863,13 +839,6 @@ packages:
rxjs: 7.5.5 rxjs: 7.5.5
dev: true dev: true
/@types/jest/27.5.2:
resolution: {integrity: sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==}
dependencies:
jest-matcher-utils: 27.5.1
pretty-format: 27.5.1
dev: false
/@types/json-schema/7.0.11: /@types/json-schema/7.0.11:
resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==}
dev: true dev: true
@ -886,15 +855,9 @@ packages:
resolution: {integrity: sha512-Ny/PJkO6nxWAQnaet8q/oWz15lrfwvdvBpuY4treB0CSsBO1CG0fVuNLngR3m3bepQLd+E4c3Y3DlC2okpUvPw==} resolution: {integrity: sha512-Ny/PJkO6nxWAQnaet8q/oWz15lrfwvdvBpuY4treB0CSsBO1CG0fVuNLngR3m3bepQLd+E4c3Y3DlC2okpUvPw==}
dependencies: dependencies:
'@types/fined': 1.1.3 '@types/fined': 1.1.3
'@types/node': 16.11.40 '@types/node': registry.npmmirror.com/@types/node/17.0.43
dev: true dev: true
/@types/lodash-es/4.17.6:
resolution: {integrity: sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==}
dependencies:
'@types/lodash': 4.14.185
dev: false
/@types/lodash/4.14.185: /@types/lodash/4.14.185:
resolution: {integrity: sha512-evMDG1bC4rgQg4ku9tKpuMh5iBNEwNa3tf9zRHdP1qlv+1WUg44xat4IxCE14gIpZRGUUWAx2VhItCZc25NfMA==} resolution: {integrity: sha512-evMDG1bC4rgQg4ku9tKpuMh5iBNEwNa3tf9zRHdP1qlv+1WUg44xat4IxCE14gIpZRGUUWAx2VhItCZc25NfMA==}
dev: false dev: false
@ -911,9 +874,6 @@ packages:
resolution: {integrity: sha512-7bOWglXUO6f21NG3YDI7hIpeMX3M59GG+DzZuzX2EkFKYUnRoxq3EOg4R0KNv2hxryY9M3UUqG5akwwsifrukw==} resolution: {integrity: sha512-7bOWglXUO6f21NG3YDI7hIpeMX3M59GG+DzZuzX2EkFKYUnRoxq3EOg4R0KNv2hxryY9M3UUqG5akwwsifrukw==}
dev: true dev: true
/@types/node/17.0.43:
resolution: {integrity: sha512-jnUpgw8fL9kP2iszfIDyBQtw5Mf4/XSqy0Loc1J9pI14ejL83XcCEvSf50Gs/4ET0I9VCCDoOfufQysj0S66xA==}
/@types/normalize-package-data/2.4.1: /@types/normalize-package-data/2.4.1:
resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
dev: true dev: true
@ -925,13 +885,13 @@ packages:
/@types/resolve/1.17.1: /@types/resolve/1.17.1:
resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==}
dependencies: dependencies:
'@types/node': 17.0.43 '@types/node': registry.npmmirror.com/@types/node/17.0.43
dev: true dev: true
/@types/through/0.0.30: /@types/through/0.0.30:
resolution: {integrity: sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==} resolution: {integrity: sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==}
dependencies: dependencies:
'@types/node': 17.0.43 '@types/node': registry.npmmirror.com/@types/node/17.0.43
dev: true dev: true
/@typescript-eslint/eslint-plugin/5.28.0_evi7yu7wunhzwb24olrfvzynny: /@typescript-eslint/eslint-plugin/5.28.0_evi7yu7wunhzwb24olrfvzynny:
@ -1223,7 +1183,7 @@ packages:
dependencies: dependencies:
'@vue/runtime-core': 3.2.37 '@vue/runtime-core': 3.2.37
'@vue/shared': 3.2.37 '@vue/shared': 3.2.37
csstype: 2.6.20 csstype: registry.npmmirror.com/csstype/2.6.20
/@vue/server-renderer/3.2.37_vue@3.2.37: /@vue/server-renderer/3.2.37_vue@3.2.37:
resolution: {integrity: sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==} resolution: {integrity: sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==}
@ -1332,6 +1292,7 @@ packages:
/ansi-regex/5.0.1: /ansi-regex/5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'} engines: {node: '>=8'}
dev: true
/ansi-regex/6.0.1: /ansi-regex/6.0.1:
resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
@ -1350,11 +1311,7 @@ packages:
engines: {node: '>=8'} engines: {node: '>=8'}
dependencies: dependencies:
color-convert: 2.0.1 color-convert: 2.0.1
dev: true
/ansi-styles/5.2.0:
resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
engines: {node: '>=10'}
dev: false
/anymatch/3.1.2: /anymatch/3.1.2:
resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==}
@ -1425,10 +1382,6 @@ packages:
resolution: {integrity: sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==} resolution: {integrity: sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==}
dev: true dev: true
/async-validator/4.1.1:
resolution: {integrity: sha512-p4DO/JXwjs8klJyJL8Q2oM4ks5fUTze/h5k10oPPKMiLe1fj3G1QMzPHNmN1Py4ycOk7WlO2DcGXv1qiESJCZA==}
dev: false
/asynckit/0.4.0: /asynckit/0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
dev: false dev: false
@ -1603,6 +1556,7 @@ packages:
dependencies: dependencies:
ansi-styles: 4.3.0 ansi-styles: 4.3.0
supports-color: 7.2.0 supports-color: 7.2.0
dev: true
/chalk/5.0.1: /chalk/5.0.1:
resolution: {integrity: sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==} resolution: {integrity: sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==}
@ -1802,7 +1756,7 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
dependencies: dependencies:
compare-func: 2.0.0 compare-func: 2.0.0
lodash: 4.17.21 lodash: registry.npmmirror.com/lodash/4.17.21
q: 1.5.1 q: 1.5.1
dev: true dev: true
@ -1813,7 +1767,7 @@ packages:
dependencies: dependencies:
JSONStream: 1.3.5 JSONStream: 1.3.5
is-text-path: 1.0.1 is-text-path: 1.0.1
lodash: 4.17.21 lodash: registry.npmmirror.com/lodash/4.17.21
meow: 8.1.2 meow: 8.1.2
split2: 3.2.2 split2: 3.2.2
through2: 4.0.2 through2: 4.0.2
@ -1832,7 +1786,7 @@ packages:
'@types/node': '*' '@types/node': '*'
typescript: '>=3' typescript: '>=3'
dependencies: dependencies:
'@types/node': 17.0.43 '@types/node': registry.npmmirror.com/@types/node/17.0.43
cosmiconfig: 7.0.1 cosmiconfig: 7.0.1
ts-node: 10.8.1_sg2ukyc6p547g74ru6fclbyzsu ts-node: 10.8.1_sg2ukyc6p547g74ru6fclbyzsu
typescript: 4.7.3 typescript: 4.7.3
@ -1875,45 +1829,17 @@ packages:
utrie: 1.0.2 utrie: 1.0.2
dev: false dev: false
/css-render/0.15.10:
resolution: {integrity: sha512-6j5acvm81sXTHJiF47FNNICtDpF74YoWk1xEK3qQvdqgW6vc+OXrPqflL6m8f5GE6XuFYrbACNEd17kraCSBAQ==}
dependencies:
'@emotion/hash': 0.8.0
'@types/node': 17.0.43
csstype: 3.0.11
dev: false
/cssesc/3.0.0: /cssesc/3.0.0:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
engines: {node: '>=4'} engines: {node: '>=4'}
hasBin: true hasBin: true
dev: true dev: true
/csstype/2.6.20:
resolution: {integrity: sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==}
/csstype/3.0.11:
resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==}
dev: false
/dargs/7.0.0: /dargs/7.0.0:
resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==}
engines: {node: '>=8'} engines: {node: '>=8'}
dev: true dev: true
/date-fns-tz/1.3.4_date-fns@2.28.0:
resolution: {integrity: sha512-O47vEyz85F2ax/ZdhMBJo187RivZGjH6V0cPjPzpm/yi6YffJg4upD/8ibezO11ezZwP3QYlBHh/t4JhRNx0Ow==}
peerDependencies:
date-fns: '>=2.0.0'
dependencies:
date-fns: 2.28.0
dev: false
/date-fns/2.28.0:
resolution: {integrity: sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==}
engines: {node: '>=0.11'}
dev: false
/debug/2.6.9: /debug/2.6.9:
resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
peerDependencies: peerDependencies:
@ -2012,11 +1938,6 @@ packages:
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true dev: true
/diff-sequences/27.5.1:
resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==}
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
dev: false
/diff/4.0.2: /diff/4.0.2:
resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
engines: {node: '>=0.3.1'} engines: {node: '>=0.3.1'}
@ -2476,10 +2397,6 @@ packages:
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true dev: true
/evtd/0.2.3:
resolution: {integrity: sha512-tmiT1YUVqFjTY+BSBOAskL83xNx41iUfpvKP6Gcd/xMHjg3mnER98jXGXJyKnxCG19uPc6EhZiUC+MUyvoqCtw==}
dev: false
/execa/5.1.1: /execa/5.1.1:
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
engines: {node: '>=10'} engines: {node: '>=10'}
@ -2748,7 +2665,7 @@ packages:
hasBin: true hasBin: true
dependencies: dependencies:
dargs: 7.0.0 dargs: 7.0.0
lodash: 4.17.21 lodash: registry.npmmirror.com/lodash/4.17.21
meow: 8.1.2 meow: 8.1.2
split2: 3.2.2 split2: 3.2.2
through2: 4.0.2 through2: 4.0.2
@ -2875,6 +2792,7 @@ packages:
/has-flag/4.0.0: /has-flag/4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'} engines: {node: '>=8'}
dev: true
/has-property-descriptors/1.0.0: /has-property-descriptors/1.0.0:
resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
@ -3031,7 +2949,7 @@ packages:
cli-width: 3.0.0 cli-width: 3.0.0
external-editor: 3.1.0 external-editor: 3.1.0
figures: 3.2.0 figures: 3.2.0
lodash: 4.17.21 lodash: registry.npmmirror.com/lodash/4.17.21
mute-stream: 0.0.8 mute-stream: 0.0.8
ora: 5.4.1 ora: 5.4.1
run-async: 2.4.1 run-async: 2.4.1
@ -3291,31 +3209,6 @@ packages:
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true dev: true
/jest-diff/27.5.1:
resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==}
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
dependencies:
chalk: 4.1.2
diff-sequences: 27.5.1
jest-get-type: 27.5.1
pretty-format: 27.5.1
dev: false
/jest-get-type/27.5.1:
resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==}
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
dev: false
/jest-matcher-utils/27.5.1:
resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==}
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
dependencies:
chalk: 4.1.2
jest-diff: 27.5.1
jest-get-type: 27.5.1
pretty-format: 27.5.1
dev: false
/js-stringify/1.0.2: /js-stringify/1.0.2:
resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==} resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==}
dev: true dev: true
@ -3452,10 +3345,6 @@ packages:
p-locate: 5.0.0 p-locate: 5.0.0
dev: true dev: true
/lodash-es/4.17.21:
resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
dev: false
/lodash.get/4.4.2: /lodash.get/4.4.2:
resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==}
dev: true dev: true
@ -3466,6 +3355,7 @@ packages:
/lodash/4.17.21: /lodash/4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
dev: true
/log-symbols/4.1.0: /log-symbols/4.1.0:
resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
@ -3634,31 +3524,6 @@ packages:
resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
dev: true dev: true
/naive-ui/2.30.3_vue@3.2.37:
resolution: {integrity: sha512-s6iphodOfLklhgAGtzhzoE0oPi6eY72UufUDRySBbfV+r+64vw9omYUOqk3Z1M/t/Mh8KwqW6z+ex8bYftFKPA==}
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/lodash': 4.14.185
'@types/lodash-es': 4.17.6
async-validator: 4.1.1
css-render: 0.15.10
date-fns: 2.28.0
date-fns-tz: 1.3.4_date-fns@2.28.0
evtd: 0.2.3
highlight.js: 11.5.1
lodash: 4.17.21
lodash-es: 4.17.21
seemly: 0.3.4
treemate: 0.3.11
vdirs: 0.1.8_vue@3.2.37
vooks: 0.2.12_vue@3.2.37
vue: 3.2.37
vueuc: 0.4.44_vue@3.2.37
dev: false
/nanoid/3.3.4: /nanoid/3.3.4:
resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@ -4100,15 +3965,6 @@ packages:
hasBin: true hasBin: true
dev: true dev: true
/pretty-format/27.5.1:
resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
dependencies:
ansi-regex: 5.0.1
ansi-styles: 5.2.0
react-is: 17.0.2
dev: false
/promise/7.3.1: /promise/7.3.1:
resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==}
dependencies: dependencies:
@ -4225,10 +4081,6 @@ packages:
engines: {node: '>=8'} engines: {node: '>=8'}
dev: true dev: true
/react-is/17.0.2:
resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
dev: false
/read-pkg-up/7.0.1: /read-pkg-up/7.0.1:
resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -4444,12 +4296,6 @@ packages:
engines: {node: ^14.13.1 || >=16.0.0} engines: {node: ^14.13.1 || >=16.0.0}
dev: false dev: false
/seemly/0.3.4:
resolution: {integrity: sha512-/crL+UfbtYd6NdLdnf58xaABfeSRt5uKE4N1SFQAW7nIznOrJQchAaslJHxV8/iAfV0LWInrmxJBFdDb0c2/sw==}
dependencies:
'@types/jest': 27.5.2
dev: false
/semver/5.7.1: /semver/5.7.1:
resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
hasBin: true hasBin: true
@ -4650,6 +4496,7 @@ packages:
engines: {node: '>=8'} engines: {node: '>=8'}
dependencies: dependencies:
has-flag: 4.0.0 has-flag: 4.0.0
dev: true
/supports-preserve-symlinks-flag/1.0.0: /supports-preserve-symlinks-flag/1.0.0:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
@ -4713,10 +4560,6 @@ packages:
resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==}
dev: true dev: true
/treemate/0.3.11:
resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==}
dev: false
/trim-newlines/3.0.1: /trim-newlines/3.0.1:
resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -4741,7 +4584,7 @@ packages:
'@tsconfig/node12': 1.0.10 '@tsconfig/node12': 1.0.10
'@tsconfig/node14': 1.0.2 '@tsconfig/node14': 1.0.2
'@tsconfig/node16': 1.0.3 '@tsconfig/node16': 1.0.3
'@types/node': 17.0.43 '@types/node': registry.npmmirror.com/@types/node/17.0.43
acorn: 8.7.1 acorn: 8.7.1
acorn-walk: 8.2.0 acorn-walk: 8.2.0
arg: 4.1.3 arg: 4.1.3
@ -4908,15 +4751,6 @@ packages:
spdx-expression-parse: 3.0.1 spdx-expression-parse: 3.0.1
dev: true dev: true
/vdirs/0.1.8_vue@3.2.37:
resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==}
peerDependencies:
vue: ^3.0.11
dependencies:
evtd: 0.2.3
vue: 3.2.37
dev: false
/vite-plugin-compression/0.5.1_vite@2.9.9: /vite-plugin-compression/0.5.1_vite@2.9.9:
resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==} resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==}
peerDependencies: peerDependencies:
@ -5001,15 +4835,6 @@ packages:
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true dev: true
/vooks/0.2.12_vue@3.2.37:
resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==}
peerDependencies:
vue: ^3.0.0
dependencies:
evtd: 0.2.3
vue: 3.2.37
dev: false
/vscode-css-languageservice/5.4.2: /vscode-css-languageservice/5.4.2:
resolution: {integrity: sha512-DT7+7vfdT2HDNjDoXWtYJ0lVDdeDEdbMNdK4PKqUl2MS8g7PWt7J5G9B6k9lYox8nOfhCEjLnoNC3UKHHCR1lg==} resolution: {integrity: sha512-DT7+7vfdT2HDNjDoXWtYJ0lVDdeDEdbMNdK4PKqUl2MS8g7PWt7J5G9B6k9lYox8nOfhCEjLnoNC3UKHHCR1lg==}
dependencies: dependencies:
@ -5183,7 +5008,7 @@ packages:
eslint-visitor-keys: 3.3.0 eslint-visitor-keys: 3.3.0
espree: 9.3.2 espree: 9.3.2
esquery: 1.4.0 esquery: 1.4.0
lodash: 4.17.21 lodash: registry.npmmirror.com/lodash/4.17.21
semver: 7.3.7 semver: 7.3.7
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -5266,21 +5091,6 @@ packages:
vue: 3.2.37 vue: 3.2.37
dev: false dev: false
/vueuc/0.4.44_vue@3.2.37:
resolution: {integrity: sha512-2sLWo1Ow3DRKTDvGVlaWlf0KL+LOqeO6zlvb6nUxWxqj4VjUpg7sMtH+xtvBK+oOXH4goGt1RyLMaBVgPFpqHw==}
peerDependencies:
vue: ^3.0.11
dependencies:
'@css-render/vue3-ssr': 0.15.10_vue@3.2.37
'@juggle/resize-observer': 3.3.1
css-render: 0.15.10
evtd: 0.2.3
seemly: 0.3.4
vdirs: 0.1.8_vue@3.2.37
vooks: 0.2.12_vue@3.2.37
vue: 3.2.37
dev: false
/wcwidth/1.0.1: /wcwidth/1.0.1:
resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
dependencies: dependencies:
@ -5396,6 +5206,104 @@ packages:
dependencies: dependencies:
tslib: 2.3.0 tslib: 2.3.0
registry.npmmirror.com/@css-render/plugin-bem/0.15.10_css-render@0.15.10:
resolution: {integrity: sha512-V7b08sM2PWJlXI7BJiVIa0Sg30H3u/jHay4AclNXfF2yRFwwb4ZJjggsMfzwj3WSihAdNf2WTqvOU5qsOD80Dg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@css-render/plugin-bem/-/plugin-bem-0.15.10.tgz}
id: registry.npmmirror.com/@css-render/plugin-bem/0.15.10
name: '@css-render/plugin-bem'
version: 0.15.10
peerDependencies:
css-render: ~0.15.10
dependencies:
css-render: registry.npmmirror.com/css-render/0.15.10
dev: false
registry.npmmirror.com/@css-render/vue3-ssr/0.15.10_vue@3.2.37:
resolution: {integrity: sha512-keGKnkB2nyVGoA8GezMKNsmvTGXEzgLOGGlgshwOTSEzd1dsROyZ2m/khJ9jV5zbzDM4rWeAWbWF0zwHemsJcw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@css-render/vue3-ssr/-/vue3-ssr-0.15.10.tgz}
id: registry.npmmirror.com/@css-render/vue3-ssr/0.15.10
name: '@css-render/vue3-ssr'
version: 0.15.10
peerDependencies:
vue: ^3.0.11
dependencies:
vue: 3.2.37
dev: false
registry.npmmirror.com/@emotion/hash/0.8.0:
resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@emotion/hash/-/hash-0.8.0.tgz}
name: '@emotion/hash'
version: 0.8.0
dev: false
registry.npmmirror.com/@juggle/resize-observer/3.3.1:
resolution: {integrity: sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@juggle/resize-observer/-/resize-observer-3.3.1.tgz}
name: '@juggle/resize-observer'
version: 3.3.1
dev: false
registry.npmmirror.com/@types/lodash-es/4.17.6:
resolution: {integrity: sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.6.tgz}
name: '@types/lodash-es'
version: 4.17.6
dependencies:
'@types/lodash': registry.npmmirror.com/@types/lodash/4.14.185
dev: false
registry.npmmirror.com/@types/lodash/4.14.185:
resolution: {integrity: sha512-evMDG1bC4rgQg4ku9tKpuMh5iBNEwNa3tf9zRHdP1qlv+1WUg44xat4IxCE14gIpZRGUUWAx2VhItCZc25NfMA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.185.tgz}
name: '@types/lodash'
version: 4.14.185
dev: false
registry.npmmirror.com/@types/node/17.0.43:
resolution: {integrity: sha512-jnUpgw8fL9kP2iszfIDyBQtw5Mf4/XSqy0Loc1J9pI14ejL83XcCEvSf50Gs/4ET0I9VCCDoOfufQysj0S66xA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/node/-/node-17.0.43.tgz}
name: '@types/node'
version: 17.0.43
registry.npmmirror.com/async-validator/4.1.1:
resolution: {integrity: sha512-p4DO/JXwjs8klJyJL8Q2oM4ks5fUTze/h5k10oPPKMiLe1fj3G1QMzPHNmN1Py4ycOk7WlO2DcGXv1qiESJCZA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/async-validator/-/async-validator-4.1.1.tgz}
name: async-validator
version: 4.1.1
dev: false
registry.npmmirror.com/css-render/0.15.10:
resolution: {integrity: sha512-6j5acvm81sXTHJiF47FNNICtDpF74YoWk1xEK3qQvdqgW6vc+OXrPqflL6m8f5GE6XuFYrbACNEd17kraCSBAQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/css-render/-/css-render-0.15.10.tgz}
name: css-render
version: 0.15.10
dependencies:
'@emotion/hash': registry.npmmirror.com/@emotion/hash/0.8.0
'@types/node': registry.npmmirror.com/@types/node/17.0.43
csstype: registry.npmmirror.com/csstype/3.0.11
dev: false
registry.npmmirror.com/csstype/2.6.20:
resolution: {integrity: sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/csstype/-/csstype-2.6.20.tgz}
name: csstype
version: 2.6.20
registry.npmmirror.com/csstype/3.0.11:
resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/csstype/-/csstype-3.0.11.tgz}
name: csstype
version: 3.0.11
dev: false
registry.npmmirror.com/date-fns-tz/1.3.4_date-fns@2.28.0:
resolution: {integrity: sha512-O47vEyz85F2ax/ZdhMBJo187RivZGjH6V0cPjPzpm/yi6YffJg4upD/8ibezO11ezZwP3QYlBHh/t4JhRNx0Ow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/date-fns-tz/-/date-fns-tz-1.3.4.tgz}
id: registry.npmmirror.com/date-fns-tz/1.3.4
name: date-fns-tz
version: 1.3.4
peerDependencies:
date-fns: '>=2.0.0'
dependencies:
date-fns: registry.npmmirror.com/date-fns/2.28.0
dev: false
registry.npmmirror.com/date-fns/2.28.0:
resolution: {integrity: sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/date-fns/-/date-fns-2.28.0.tgz}
name: date-fns
version: 2.28.0
engines: {node: '>=0.11'}
dev: false
registry.npmmirror.com/echarts-wordcloud/2.0.0_echarts@5.3.3: registry.npmmirror.com/echarts-wordcloud/2.0.0_echarts@5.3.3:
resolution: {integrity: sha512-K7l6pTklqdW7ZWzT/1CS0KhBSINr/cd7c5N1fVMzZMwLQHEwT7x+nivK7g5hkVh7WNcAv4Dn6/ZS5zMKRozC1g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/echarts-wordcloud/-/echarts-wordcloud-2.0.0.tgz} resolution: {integrity: sha512-K7l6pTklqdW7ZWzT/1CS0KhBSINr/cd7c5N1fVMzZMwLQHEwT7x+nivK7g5hkVh7WNcAv4Dn6/ZS5zMKRozC1g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/echarts-wordcloud/-/echarts-wordcloud-2.0.0.tgz}
id: registry.npmmirror.com/echarts-wordcloud/2.0.0 id: registry.npmmirror.com/echarts-wordcloud/2.0.0
@ -5627,6 +5535,12 @@ packages:
dev: true dev: true
optional: true optional: true
registry.npmmirror.com/evtd/0.2.4:
resolution: {integrity: sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/evtd/-/evtd-0.2.4.tgz}
name: evtd
version: 0.2.4
dev: false
registry.npmmirror.com/fsevents/2.3.2: registry.npmmirror.com/fsevents/2.3.2:
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz} resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz}
name: fsevents name: fsevents
@ -5645,6 +5559,64 @@ packages:
dev: true dev: true
optional: true optional: true
registry.npmmirror.com/highlight.js/11.5.1:
resolution: {integrity: sha512-LKzHqnxr4CrD2YsNoIf/o5nJ09j4yi/GcH5BnYz9UnVpZdS4ucMgvP61TDty5xJcFGRjnH4DpujkS9bHT3hq0Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/highlight.js/-/highlight.js-11.5.1.tgz}
name: highlight.js
version: 11.5.1
engines: {node: '>=12.0.0'}
dev: false
registry.npmmirror.com/lodash-es/4.17.21:
resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz}
name: lodash-es
version: 4.17.21
dev: false
registry.npmmirror.com/lodash/4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz}
name: lodash
version: 4.17.21
registry.npmmirror.com/naive-ui/2.33.3_vue@3.2.37:
resolution: {integrity: sha512-yz2aKdghMVadtvCSBXyjU2bAuGmwLEUcbzmXdUhSdtcbI6mT+mT8vRy43FnbJangPQ87v080q453vtnydNcnhA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/naive-ui/-/naive-ui-2.33.3.tgz}
id: registry.npmmirror.com/naive-ui/2.33.3
name: naive-ui
version: 2.33.3
peerDependencies:
vue: ^3.0.0
dependencies:
'@css-render/plugin-bem': registry.npmmirror.com/@css-render/plugin-bem/0.15.10_css-render@0.15.10
'@css-render/vue3-ssr': registry.npmmirror.com/@css-render/vue3-ssr/0.15.10_vue@3.2.37
'@types/lodash': registry.npmmirror.com/@types/lodash/4.14.185
'@types/lodash-es': registry.npmmirror.com/@types/lodash-es/4.17.6
async-validator: registry.npmmirror.com/async-validator/4.1.1
css-render: registry.npmmirror.com/css-render/0.15.10
date-fns: registry.npmmirror.com/date-fns/2.28.0
date-fns-tz: registry.npmmirror.com/date-fns-tz/1.3.4_date-fns@2.28.0
evtd: registry.npmmirror.com/evtd/0.2.4
highlight.js: registry.npmmirror.com/highlight.js/11.5.1
lodash: registry.npmmirror.com/lodash/4.17.21
lodash-es: registry.npmmirror.com/lodash-es/4.17.21
seemly: registry.npmmirror.com/seemly/0.3.6
treemate: registry.npmmirror.com/treemate/0.3.11
vdirs: registry.npmmirror.com/vdirs/0.1.8_vue@3.2.37
vooks: registry.npmmirror.com/vooks/0.2.12_vue@3.2.37
vue: 3.2.37
vueuc: registry.npmmirror.com/vueuc/0.4.49_vue@3.2.37
dev: false
registry.npmmirror.com/seemly/0.3.6:
resolution: {integrity: sha512-lEV5VB8BUKTo/AfktXJcy+JeXns26ylbMkIUco8CYREsQijuz4mrXres2Q+vMLdwkuLxJdIPQ8IlCIxLYm71Yw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/seemly/-/seemly-0.3.6.tgz}
name: seemly
version: 0.3.6
dev: false
registry.npmmirror.com/treemate/0.3.11:
resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/treemate/-/treemate-0.3.11.tgz}
name: treemate
version: 0.3.11
dev: false
registry.npmmirror.com/uglify-js/3.16.0: registry.npmmirror.com/uglify-js/3.16.0:
resolution: {integrity: sha512-FEikl6bR30n0T3amyBh3LoiBdqHRy/f4H80+My34HOesOKyHfOsxAPAxOoqC0JUnC1amnO0IwkYC3sko51caSw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/uglify-js/-/uglify-js-3.16.0.tgz} resolution: {integrity: sha512-FEikl6bR30n0T3amyBh3LoiBdqHRy/f4H80+My34HOesOKyHfOsxAPAxOoqC0JUnC1amnO0IwkYC3sko51caSw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/uglify-js/-/uglify-js-3.16.0.tgz}
name: uglify-js name: uglify-js
@ -5654,3 +5626,45 @@ packages:
requiresBuild: true requiresBuild: true
dev: true dev: true
optional: true optional: true
registry.npmmirror.com/vdirs/0.1.8_vue@3.2.37:
resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vdirs/-/vdirs-0.1.8.tgz}
id: registry.npmmirror.com/vdirs/0.1.8
name: vdirs
version: 0.1.8
peerDependencies:
vue: ^3.0.11
dependencies:
evtd: registry.npmmirror.com/evtd/0.2.4
vue: 3.2.37
dev: false
registry.npmmirror.com/vooks/0.2.12_vue@3.2.37:
resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vooks/-/vooks-0.2.12.tgz}
id: registry.npmmirror.com/vooks/0.2.12
name: vooks
version: 0.2.12
peerDependencies:
vue: ^3.0.0
dependencies:
evtd: registry.npmmirror.com/evtd/0.2.4
vue: 3.2.37
dev: false
registry.npmmirror.com/vueuc/0.4.49_vue@3.2.37:
resolution: {integrity: sha512-WarAC44a/Yx78CxkAgROYLq+LkAeCGA/6wHidVoFmHLbzyF3SiP2nzRNGD/8zJeJInXv18EnWK6A//eGgMMq8w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vueuc/-/vueuc-0.4.49.tgz}
id: registry.npmmirror.com/vueuc/0.4.49
name: vueuc
version: 0.4.49
peerDependencies:
vue: ^3.0.11
dependencies:
'@css-render/vue3-ssr': registry.npmmirror.com/@css-render/vue3-ssr/0.15.10_vue@3.2.37
'@juggle/resize-observer': registry.npmmirror.com/@juggle/resize-observer/3.3.1
css-render: registry.npmmirror.com/css-render/0.15.10
evtd: registry.npmmirror.com/evtd/0.2.4
seemly: registry.npmmirror.com/seemly/0.3.6
vdirs: registry.npmmirror.com/vdirs/0.1.8_vue@3.2.37
vooks: registry.npmmirror.com/vooks/0.2.12_vue@3.2.37
vue: 3.2.37
dev: false

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@ -0,0 +1,4 @@
import Flipper from './index.vue'
type FlipType = 'up' | 'down'
export { Flipper, FlipType }

View File

@ -0,0 +1,224 @@
<template>
<div class="M-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">
export default {
name: 'Flipper'
}
</script>
<script lang="ts" setup>
import { ref, PropType, watch } from 'vue'
import { FlipType } from '.'
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
.M-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>

View File

@ -190,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;
} }
} }
} }

View File

@ -1,7 +1,7 @@
<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 ? '滤镜' : '滤镜 / 变换'">
@ -69,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轴(平面) - 旋转">
@ -132,8 +150,9 @@
<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: {
@ -150,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>

View File

@ -1,7 +1,7 @@
// 鼠标点击左右键 // 鼠标点击左右键
export enum MouseEventButton { export enum MouseEventButton {
LEFT = 1, LEFT = 1,
RIGHT = 2, RIGHT = 2
} }
// 页面拖拽键名 // 页面拖拽键名
@ -41,7 +41,15 @@ export enum MenuEnum {
// 后退 // 后退
BACK = 'back', BACK = 'back',
// 前进 // 前进
FORWORD = 'forward' FORWORD = 'forward',
// 锁定
LOCK = 'lock',
// 解除锁定
UNLOCK = 'unLock',
// 隐藏
HIDE = 'hide',
// 显示
SHOW = 'show'
} }
// Win 键盘枚举 // Win 键盘枚举
@ -49,9 +57,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 +68,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 = '⌥'
} }

View File

@ -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
} }
// 数据相关 // 数据相关

View File

@ -24,6 +24,7 @@ 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 { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components' import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components'
import isObject from 'lodash/isObject'
const props = defineProps({ const props = defineProps({
themeSetting: { themeSetting: {
@ -51,8 +52,9 @@ const option = computed(() => {
// dataset // dataset
watch( watch(
() => props.chartConfig.option.dataset, () => props.chartConfig.option.dataset,
(newData, oldData) => { (newData: { dimensions: any }, oldData) => {
if (newData.dimensions.length !== oldData.dimensions.length) { if (!isObject(newData) || !('dimensions' in newData)) return
if (newData?.dimensions.length !== oldData?.dimensions.length) {
const seriesArr = [] const seriesArr = []
for (let i = 0; i < newData.dimensions.length - 1; i++) { for (let i = 0; i < newData.dimensions.length - 1; i++) {
seriesArr.push(seriesItem) seriesArr.push(seriesItem)

View File

@ -23,6 +23,7 @@ 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 { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components' import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components'
import isObject from 'lodash/isObject'
const props = defineProps({ const props = defineProps({
themeSetting: { themeSetting: {
@ -50,7 +51,8 @@ const option = computed(() => {
// dataset // dataset
watch( watch(
() => props.chartConfig.option.dataset, () => props.chartConfig.option.dataset,
(newData, oldData) => { (newData: { dimensions: any }, oldData) => {
if (!isObject(newData) || !('dimensions' in newData)) return
if (newData?.dimensions.length !== oldData?.dimensions.length) { if (newData?.dimensions.length !== oldData?.dimensions.length) {
const seriesArr = [] const seriesArr = []
for (let i = 0; i < newData.dimensions.length - 1; i++) { for (let i = 0; i < newData.dimensions.length - 1; i++) {

View File

@ -24,6 +24,7 @@ import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore
import { useChartDataFetch } from '@/hooks' import { useChartDataFetch } from '@/hooks'
import { isPreview } from '@/utils' import { isPreview } from '@/utils'
import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components' import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components'
import isObject from 'lodash/isObject'
const props = defineProps({ const props = defineProps({
themeSetting: { themeSetting: {
@ -51,7 +52,8 @@ const option = computed(() => {
// dataset // dataset
watch( watch(
() => props.chartConfig.option.dataset, () => props.chartConfig.option.dataset,
(newData, oldData) => { (newData: { dimensions: any }, oldData) => {
if (!isObject(newData) || !('dimensions' in newData)) return
if (newData?.dimensions.length !== oldData?.dimensions.length) { if (newData?.dimensions.length !== oldData?.dimensions.length) {
const seriesArr = [] const seriesArr = []
for (let i = 0; i < newData.dimensions.length - 1; i++) { for (let i = 0; i < newData.dimensions.length - 1; i++) {

View File

@ -73,7 +73,7 @@ export const option = {
textShadowColor: '#000', textShadowColor: '#000',
textShadowBlur: 10, textShadowBlur: 10,
textBorderWidth: 0, textBorderWidth: 0,
color: '#FFF', color: '#FFFFFF',
show: true show: true
}, },
itemStyle: { itemStyle: {
@ -95,19 +95,23 @@ export const option = {
geoIndex: 1, geoIndex: 1,
tooltip: { tooltip: {
show: true, show: true,
backgroundColor: 'rgba(0,0,0,.6)', backgroundColor: '#00000060',
borderColor: 'rgba(147, 235, 248, .8)', borderColor: 'rgba(147, 235, 248, 0.8)',
textStyle: { textStyle: {
color: '#FFF' color: '#FFFFFF',
fontSize: 12,
} }
}, },
label: { label: {
show: false show: false,
color: '#FFFFFF',
fontSize: 12,
}, },
emphasis: { emphasis: {
disabled: false, disabled: false,
label: { label: {
color: '#fffFFF' color: '#FFFFFF',
fontSize: 12,
}, },
itemStyle: { itemStyle: {
areaColor: '#389BB7', areaColor: '#389BB7',
@ -126,11 +130,11 @@ export const option = {
colorStops: [ colorStops: [
{ {
offset: 0, offset: 0,
color: 'rgba(147, 235, 248, 0)' // 0% 处的颜色 color: '#93ebf800' // 0% 处的颜色
}, },
{ {
offset: 1, offset: 1,
color: 'rgba(147, 235, 248, .2)' // 100% 处的颜色 color: '#93ebf820' // 100% 处的颜色
} }
], ],
globalCoord: false globalCoord: false

View File

@ -14,7 +14,7 @@
</SettingItem> </SettingItem>
</SettingItemBox> </SettingItemBox>
<SettingItemBox name="区域颜色" :alone="true"> <SettingItemBox name="区域颜色">
<SettingItem name="0%处颜色"> <SettingItem name="0%处颜色">
<n-color-picker <n-color-picker
size="small" size="small"
@ -61,12 +61,36 @@
></n-input-number> ></n-input-number>
</SettingItem> </SettingItem>
</SettingItemBox> </SettingItemBox>
<SettingItemBox name="聚焦 (预览可见)">
<setting-item name="禁用"> <SettingItemBox name="地理信息名称">
<SettingItem name="显示">
<n-space>
<n-switch v-model:value="seriesList[1].label.show" size="small"></n-switch>
</n-space>
</SettingItem>
<SettingItem name="字体颜色">
<n-color-picker
size="small"
:modes="['hex']"
v-model:value="seriesList[1].label.color"
></n-color-picker>
</SettingItem>
<SettingItem name="字体大小">
<n-input-number
v-model:value="seriesList[1].label.fontSize"
:min="1"
size="small"
placeholder="请输入字体大小"
></n-input-number>
</SettingItem>
</SettingItemBox>
<SettingItemBox name="悬浮 (预览可见)">
<SettingItem name="禁用">
<n-space> <n-space>
<n-switch v-model:value="seriesList[1].emphasis.disabled" size="small"></n-switch> <n-switch v-model:value="seriesList[1].emphasis.disabled" size="small"></n-switch>
</n-space> </n-space>
</setting-item> </SettingItem>
<SettingItem name="颜色"> <SettingItem name="颜色">
<n-color-picker <n-color-picker
size="small" size="small"
@ -74,6 +98,14 @@
v-model:value="seriesList[1].emphasis.itemStyle.areaColor" v-model:value="seriesList[1].emphasis.itemStyle.areaColor"
></n-color-picker> ></n-color-picker>
</SettingItem> </SettingItem>
<SettingItem name="字体大小">
<n-input-number
v-model:value="seriesList[1].emphasis.label.fontSize"
:min="1"
size="small"
placeholder="请输入字体大小"
></n-input-number>
</SettingItem>
<SettingItem name="阴影"> <SettingItem name="阴影">
<n-color-picker <n-color-picker
size="small" size="small"
@ -97,7 +129,37 @@
></n-color-picker> ></n-color-picker>
</SettingItem> </SettingItem>
</SettingItemBox> </SettingItemBox>
<SettingItemBox name="边框">
<SettingItemBox name="悬浮弹窗">
<SettingItem name="显示">
<n-space>
<n-switch v-model:value="seriesList[1].tooltip.show" size="small"></n-switch>
</n-space>
</SettingItem>
<SettingItem name="字体大小">
<n-input-number
v-model:value="seriesList[1].tooltip.textStyle.fontSize"
:min="1"
size="small"
placeholder="请输入字体大小"
></n-input-number>
</SettingItem>
<SettingItem name="字体颜色">
<n-color-picker
size="small"
:modes="['hex']"
v-model:value="seriesList[1].tooltip.textStyle.color"
></n-color-picker>
</SettingItem>
<SettingItem name="背景颜色">
<n-color-picker
size="small"
:modes="['hex']"
v-model:value="seriesList[1].tooltip.backgroundColor"
></n-color-picker>
</SettingItem>
</SettingItemBox>
<SettingItemBox name="区域边框">
<SettingItem name="颜色"> <SettingItem name="颜色">
<n-color-picker <n-color-picker
size="small" size="small"
@ -105,7 +167,7 @@
v-model:value="seriesList[1].itemStyle.borderColor" v-model:value="seriesList[1].itemStyle.borderColor"
></n-color-picker> ></n-color-picker>
</SettingItem> </SettingItem>
<SettingItem name="大小"> <SettingItem name="宽度大小">
<n-input-number <n-input-number
v-model:value="seriesList[1].itemStyle.borderWidth" v-model:value="seriesList[1].itemStyle.borderWidth"
:min="1" :min="1"
@ -130,6 +192,20 @@
</SettingItem> </SettingItem>
</SettingItemBox> </SettingItemBox>
<SettingItemBox name="文本">
<SettingItem name="显示">
<n-space>
<n-switch v-model:value="seriesList[0].label.show" size="small"></n-switch>
</n-space>
</SettingItem>
<SettingItem name="字体大小">
<n-input-number v-model:value="seriesList[0].label.fontSize" size="small" :min="0"></n-input-number>
</SettingItem>
<SettingItem name="字体颜色">
<n-color-picker size="small" :modes="['hex']" v-model:value="seriesList[0].label.color"></n-color-picker>
</SettingItem>
</SettingItemBox>
<SettingItemBox name="涟漪"> <SettingItemBox name="涟漪">
<SettingItem name="涟漪大小"> <SettingItem name="涟漪大小">
<n-input-number <n-input-number

View File

@ -61,10 +61,14 @@ const getGeojson = (regionId: string) => {
// //
registerMap(props.chartConfig.option.mapRegion.adcode, { geoJSON: {} as any, specialAreas: {} }) registerMap(props.chartConfig.option.mapRegion.adcode, { geoJSON: {} as any, specialAreas: {} })
// // china
const registerMapInitAsync = async () => { const registerMapInitAsync = async () => {
await nextTick() await nextTick()
await getGeojson(props.chartConfig.option.mapRegion.adcode) if (props.chartConfig.option.mapRegion.adcode!="china") {
await getGeojson(props.chartConfig.option.mapRegion.adcode)
}else{
await hainanLandsHandle(props.chartConfig.option.mapRegion.showHainanIsLands)
}
vEchartsSetOption() vEchartsSetOption()
} }
registerMapInitAsync() registerMapInitAsync()
@ -85,7 +89,14 @@ const dataSetHandle = async (dataset: any) => {
isPreview() && vEchartsSetOption() isPreview() && vEchartsSetOption()
} }
//
const hainanLandsHandle=async(newData:boolean)=>{
if (newData) {
await getGeojson('china')
} else {
registerMap('china', { geoJSON: mapJsonWithoutHainanIsLands as any, specialAreas: {} })
}
}
// dataset // dataset
watch( watch(
() => props.chartConfig.option.dataset, () => props.chartConfig.option.dataset,
@ -102,11 +113,7 @@ watch(
watch( watch(
() => props.chartConfig.option.mapRegion.showHainanIsLands, () => props.chartConfig.option.mapRegion.showHainanIsLands,
async newData => { async newData => {
if (newData) { await hainanLandsHandle(newData)
await getGeojson('china')
} else {
registerMap('china', { geoJSON: mapJsonWithoutHainanIsLands as any, specialAreas: {} })
}
vEchartsSetOption() vEchartsSetOption()
}, },
{ {

View File

@ -14,7 +14,7 @@ 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, isArray } from '@/utils'
const props = defineProps({ const props = defineProps({
themeSetting: { themeSetting: {
@ -49,6 +49,7 @@ const dataSetHandle = (dataset: typeof dataJson) => {
watch( watch(
() => props.chartConfig.option.dataset, () => props.chartConfig.option.dataset,
newData => { newData => {
if(!isArray(newData)) return
dataSetHandle(newData) dataSetHandle(newData)
}, },
{ {

View File

@ -10,7 +10,7 @@ import 'echarts-liquidfill/src/liquidFill.js'
import { CanvasRenderer } from 'echarts/renderers' import { CanvasRenderer } from 'echarts/renderers'
import { GridComponent } from 'echarts/components' import { GridComponent } from 'echarts/components'
import config from './config' import config from './config'
import { isPreview, isString } from '@/utils' import { isPreview, isString, isNumber } from '@/utils'
import { chartColorsSearch, defaultTheme } from '@/settings/chartThemes/index' import { chartColorsSearch, defaultTheme } from '@/settings/chartThemes/index'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { useChartDataFetch } from '@/hooks' import { useChartDataFetch } from '@/hooks'
@ -75,6 +75,7 @@ const dataHandle = (newData: number | string) => {
watch( watch(
() => props.chartConfig.option.dataset, () => props.chartConfig.option.dataset,
newData => { newData => {
if(!isString(newData) && !isNumber(newData)) return
props.chartConfig.option.series[0].data = [dataHandle(newData)] props.chartConfig.option.series[0].data = [dataHandle(newData)]
option.value = props.chartConfig.option option.value = props.chartConfig.option
}, },

View File

@ -12,7 +12,7 @@ import { mergeTheme } from '@/packages/public/chart'
import config, { includes } from './config' import config, { includes } 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 { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components' import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent, TitleComponent } from 'echarts/components'
const props = defineProps({ const props = defineProps({
themeSetting: { themeSetting: {
@ -29,7 +29,7 @@ const props = defineProps({
} }
}) })
use([DatasetComponent, CanvasRenderer, PieChart, GridComponent, TooltipComponent, LegendComponent]) use([DatasetComponent, CanvasRenderer, PieChart, GridComponent, TooltipComponent, LegendComponent, TitleComponent])
const option = reactive({ const option = reactive({
value: {} value: {}

View File

@ -50,7 +50,7 @@ watch(
props.chartConfig.option.series[0].roseType = true props.chartConfig.option.series[0].roseType = true
} }
}, },
{ deep: true, immediate: true } { deep: false, immediate: true }
) )
const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore) const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore)

View File

@ -20,7 +20,7 @@ import config, { includes, seriesItem } from './config'
import { mergeTheme } from '@/packages/public/chart' import { mergeTheme } from '@/packages/public/chart'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { useChartDataFetch } from '@/hooks' import { useChartDataFetch } from '@/hooks'
import { isPreview } from '@/utils' import { isPreview, isArray } from '@/utils'
import { import {
DatasetComponent, DatasetComponent,
GridComponent, GridComponent,
@ -69,6 +69,7 @@ const option = computed(() => {
watch( watch(
() => props.chartConfig.option.dataset, () => props.chartConfig.option.dataset,
(newData, oldData) => { (newData, oldData) => {
if (!isArray(newData)) return
if (newData?.length !== oldData?.length) { if (newData?.length !== oldData?.length) {
replaceMergeArr.value = ['series'] replaceMergeArr.value = ['series']
// eslint-disable-next-line vue/no-mutating-props // eslint-disable-next-line vue/no-mutating-props

View File

@ -0,0 +1,47 @@
import { PublicConfigClass } from '@/packages/public'
import { CreateComponentType } from '@/packages/index.d'
import { CountDownConfig } from './index'
import cloneDeep from 'lodash/cloneDeep'
import { chartInitConfig } from '@/settings/designSetting'
import { FlipType } from '@/components/Flipper'
type STYLE = '时分秒' | '冒号'
export interface OptionType {
dataset: number
useEndDate: boolean
endDate: number
style: STYLE
showDay: boolean
flipperBgColor: string
flipperTextColor: string
flipperWidth: number
flipperHeight: number
flipperRadius: number
flipperGap: number
flipperType: FlipType
flipperSpeed: number
}
export const option: OptionType = {
dataset: 10 * 60, // 10分钟
useEndDate: false,
endDate: new Date().getTime(), // 当前时间
style: '时分秒',
showDay: false,
flipperBgColor: '#16293E',
flipperTextColor: '#4A9EF8FF',
flipperWidth: 30,
flipperHeight: 50,
flipperRadius: 5,
flipperGap: 10,
flipperType: 'down',
flipperSpeed: 450
}
export default class Config extends PublicConfigClass implements CreateComponentType {
public key = CountDownConfig.key
public attr = { ...chartInitConfig, w: 500, h: 100, zIndex: -1 }
public chartConfig = cloneDeep(CountDownConfig)
public option = cloneDeep(option)
}

View File

@ -0,0 +1,98 @@
<template>
<collapse-item name="倒计时" expanded>
<setting-item-box name="内容" alone>
<setting-item name="计时(秒)">
<n-input-number
v-model:value="optionData.dataset"
size="small"
:min="0"
:disabled="optionData.useEndDate"
></n-input-number>
</setting-item>
<setting-item name="结束日期">
<n-date-picker v-model:value="optionData.endDate" type="datetime" :disabled="!optionData.useEndDate" />
</setting-item>
<setting-item>
<n-checkbox v-model:checked="optionData.useEndDate" size="small">使用固定结束日期</n-checkbox>
</setting-item>
</setting-item-box>
<setting-item-box name="样式">
<setting-item name="风格">
<n-select
v-model:value="optionData.style"
size="small"
:options="[
{ label: '时分秒', value: '时分秒' },
{ label: '冒号', value: '冒号' }
]"
></n-select>
</setting-item>
<setting-item>
<n-checkbox v-model:checked="optionData.showDay" size="small">显示天</n-checkbox>
</setting-item>
</setting-item-box>
</collapse-item>
<collapse-item name="翻牌" expanded>
<setting-item-box name="样式">
<setting-item name="宽度">
<n-input-number v-model:value="optionData.flipperWidth" size="small" :min="1"></n-input-number>
</setting-item>
<setting-item name="高度">
<n-input-number v-model:value="optionData.flipperHeight" size="small" :min="1"></n-input-number>
</setting-item>
<setting-item name="间隔">
<n-input-number v-model:value="optionData.flipperGap" size="small" :min="0"></n-input-number>
</setting-item>
<setting-item name="圆角">
<n-input-number v-model:value="optionData.flipperRadius" size="small" :min="0"></n-input-number>
</setting-item>
<setting-item name="背景色">
<n-color-picker
size="small"
:show-alpha="false"
:modes="['hex']"
v-model:value="optionData.flipperBgColor"
></n-color-picker>
</setting-item>
<setting-item name="字体色">
<n-color-picker size="small" :modes="['hex']" v-model:value="optionData.flipperTextColor"></n-color-picker>
</setting-item>
</setting-item-box>
<setting-item-box name="行为">
<setting-item name="动画">
<n-select
v-model:value="optionData.flipperType"
size="small"
:options="[
{ label: '下翻', value: 'down' },
{ label: '上翻', value: 'up' }
]"
></n-select>
</setting-item>
<setting-item name="翻牌速度(毫秒)">
<n-input-number
v-model:value="optionData.flipperSpeed"
size="small"
:min="100"
:max="900"
:step="100"
></n-input-number>
</setting-item>
</setting-item-box>
</collapse-item>
</template>
<script setup lang="ts">
import { PropType } from 'vue'
import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
import { OptionType } from './config'
defineProps({
optionData: {
type: Object as PropType<OptionType>,
required: true
}
})
</script>

View File

@ -0,0 +1,14 @@
import image from '@/assets/images/chart/decorates/countdown.png'
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
export const CountDownConfig: ConfigType = {
key: 'CountDown',
chartKey: 'VCountDown',
conKey: 'VCCountDown',
title: '倒计时',
category: ChatCategoryEnum.MORE,
categoryName: ChatCategoryEnumName.MORE,
package: PackagesCategoryEnum.DECORATES,
image
}

View File

@ -0,0 +1,184 @@
<template>
<div>
<n-countdown
ref="countdownRef"
:duration="totalDuration"
:render="renderCountdown"
:active="countdownActive"
v-show="false"
/>
<n-space class="go-decorates-more-countdown" :size="flipperGap" align="center" justify="center">
<template v-if="showDay">
<flipper
:count="item"
:width="flipperWidth"
:height="flipperHeight"
:front-color="flipperTextColor"
:back-color="flipperBgColor"
:radius="flipperRadius"
:flip-type="flipperType"
:duration="flipperSpeed"
v-for="(item, index) in daysFlipperData"
:key="index"
class="go-d-block"
/>
<div v-if="style === '时分秒'"></div>
<div v-else>:</div>
</template>
<flipper
:count="item"
:width="flipperWidth"
:height="flipperHeight"
:front-color="flipperTextColor"
:back-color="flipperBgColor"
:radius="flipperRadius"
:flip-type="flipperType"
:duration="flipperSpeed"
v-for="(item, index) in hoursFlipperData"
:key="index"
class="go-d-block"
/>
<div v-if="style === '时分秒'"></div>
<div v-else>:</div>
<flipper
:count="item"
:width="flipperWidth"
:height="flipperHeight"
:front-color="flipperTextColor"
:back-color="flipperBgColor"
:radius="flipperRadius"
:flip-type="flipperType"
:duration="flipperSpeed"
v-for="(item, index) in minutesFlipperData"
:key="index"
class="go-d-block"
/>
<div v-if="style === '时分秒'"></div>
<div v-else>:</div>
<flipper
:count="item"
:width="flipperWidth"
:height="flipperHeight"
:front-color="flipperTextColor"
:back-color="flipperBgColor"
:radius="flipperRadius"
:flip-type="flipperType"
:duration="flipperSpeed"
v-for="(item, index) in secondsFlipperData"
:key="index"
class="go-d-block"
/>
<div v-if="style === '时分秒'"></div>
</n-space>
</div>
</template>
<script setup lang="ts">
import { PropType, toRefs, watch, ref, onMounted } from 'vue'
import { CreateComponentType } from '@/packages/index.d'
import { Flipper } from '@/components/Flipper'
import { OptionType } from './config'
import { CountdownInst, CountdownProps } from 'naive-ui/es/countdown/src/Countdown'
const props = defineProps({
chartConfig: {
type: Object as PropType<CreateComponentType>,
required: true
}
})
const { w, h } = toRefs(props.chartConfig.attr)
const {
dataset,
useEndDate,
endDate,
style,
showDay,
flipperBgColor,
flipperTextColor,
flipperWidth,
flipperHeight,
flipperRadius,
flipperGap,
flipperType,
flipperSpeed
} = toRefs(props.chartConfig.option as OptionType)
const countdownRef = ref<CountdownInst | null>()
const countdownActive = ref(false)
const totalDuration = ref(dataset.value * 1000)
const daysFlipperData = ref<string[] | number[]>([])
const hoursFlipperData = ref<string[] | number[]>([])
const minutesFlipperData = ref<string[] | number[]>([])
const secondsFlipperData = ref<string[] | number[]>([])
const getFlipperData = (val: string | number) => {
const len = Math.max(val.toString().length, 2)
return val
.toString()
.padStart(len, '0') // |
.split('') //
}
const updateDatasetHandler = (hours: number, minutes: number, seconds: number) => {
const days = Math.floor(hours / 24)
daysFlipperData.value = getFlipperData(days)
hoursFlipperData.value = getFlipperData(showDay.value ? hours % 24 : hours)
minutesFlipperData.value = getFlipperData(minutes)
secondsFlipperData.value = getFlipperData(seconds)
}
const renderCountdown: CountdownProps['render'] = ({ hours, minutes, seconds }) => {
updateDatasetHandler(hours, minutes, seconds)
}
const updateTotalDuration = () => {
countdownActive.value = false
totalDuration.value = useEndDate.value ? endDate.value - new Date().getTime() : dataset.value * 1000
countdownRef.value?.reset && countdownRef.value?.reset()
countdownActive.value = true
}
watch(
() => props.chartConfig.option.dataset,
() => {
updateTotalDuration()
},
{
immediate: true
}
)
watch(
() => props.chartConfig.option.endDate,
() => {
updateTotalDuration()
},
{
immediate: true
}
)
watch(
() => props.chartConfig.option.useEndDate,
() => {
updateTotalDuration()
},
{
immediate: true
}
)
onMounted(() => {
updateTotalDuration()
})
</script>
<style lang="scss" scoped>
@include go('decorates-more-countdown') {
width: v-bind('`${w}px`');
height: v-bind('`${h}px`');
font-size: v-bind('`${flipperWidth}px`');
line-height: v-bind('`${flipperHeight}px`');
color: v-bind('flipperTextColor');
user-select: none;
}
</style>

View File

@ -0,0 +1,39 @@
import { PublicConfigClass } from '@/packages/public'
import { CreateComponentType } from '@/packages/index.d'
import { FlipperNumberConfig } from './index'
import cloneDeep from 'lodash/cloneDeep'
import { chartInitConfig } from '@/settings/designSetting'
import { FlipType } from '@/components/Flipper'
export interface OptionType {
dataset: number | string
flipperLength: number
flipperBgColor: string
flipperTextColor: string
flipperWidth: number
flipperHeight: number
flipperRadius: number
flipperGap: number
flipperType: FlipType
flipperSpeed: number
}
export const option: OptionType = {
dataset: 3234,
flipperLength: 6,
flipperBgColor: '#16293E',
flipperTextColor: '#4A9EF8FF',
flipperWidth: 30,
flipperHeight: 50,
flipperRadius: 5,
flipperGap: 10,
flipperType: 'down',
flipperSpeed: 450
}
export default class Config extends PublicConfigClass implements CreateComponentType {
public key = FlipperNumberConfig.key
public attr = { ...chartInitConfig, w: 300, h: 100, zIndex: -1 }
public chartConfig = cloneDeep(FlipperNumberConfig)
public option = cloneDeep(option)
}

View File

@ -0,0 +1,72 @@
<template>
<collapse-item name="翻牌" :expanded="true">
<setting-item-box name="内容">
<setting-item name="初始值">
<n-input-number v-model:value="optionData.dataset" size="small" :min="0"></n-input-number>
</setting-item>
<setting-item name="翻牌个数">
<n-input-number v-model:value="optionData.flipperLength" size="small" :min="1"></n-input-number>
</setting-item>
</setting-item-box>
<setting-item-box name="样式">
<setting-item name="宽度">
<n-input-number v-model:value="optionData.flipperWidth" size="small" :min="1"></n-input-number>
</setting-item>
<setting-item name="高度">
<n-input-number v-model:value="optionData.flipperHeight" size="small" :min="1"></n-input-number>
</setting-item>
<setting-item name="间隔">
<n-input-number v-model:value="optionData.flipperGap" size="small" :min="0"></n-input-number>
</setting-item>
<setting-item name="圆角">
<n-input-number v-model:value="optionData.flipperRadius" size="small" :min="0"></n-input-number>
</setting-item>
<setting-item name="背景色">
<n-color-picker
size="small"
:show-alpha="false"
:modes="['hex']"
v-model:value="optionData.flipperBgColor"
></n-color-picker>
</setting-item>
<setting-item name="字体色">
<n-color-picker size="small" :modes="['hex']" v-model:value="optionData.flipperTextColor"></n-color-picker>
</setting-item>
</setting-item-box>
<setting-item-box name="行为">
<setting-item name="动画">
<n-select
v-model:value="optionData.flipperType"
size="small"
:options="[
{ label: '下翻', value: 'down' },
{ label: '上翻', value: 'up' }
]"
></n-select>
</setting-item>
<setting-item name="翻牌速度(毫秒)">
<n-input-number
v-model:value="optionData.flipperSpeed"
size="small"
:min="100"
:max="900"
:step="100"
></n-input-number>
</setting-item>
</setting-item-box>
</collapse-item>
</template>
<script setup lang="ts">
import { PropType } from 'vue'
import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
import { OptionType } from './config'
defineProps({
optionData: {
type: Object as PropType<OptionType>,
required: true
}
})
</script>

View File

@ -0,0 +1,14 @@
import image from '@/assets/images/chart/decorates/flipper-number.png'
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
export const FlipperNumberConfig: ConfigType = {
key: 'FlipperNumber',
chartKey: 'VFlipperNumber',
conKey: 'VCFlipperNumber',
title: '数字翻牌',
category: ChatCategoryEnum.MORE,
categoryName: ChatCategoryEnumName.MORE,
package: PackagesCategoryEnum.DECORATES,
image
}

View File

@ -0,0 +1,81 @@
<template>
<n-space class="go-decorates-flipper-number" :size="flipperGap" align="center" justify="center">
<flipper
:count="item"
:width="flipperWidth"
:height="flipperHeight"
:front-color="flipperTextColor"
:back-color="flipperBgColor"
:radius="flipperRadius"
:flip-type="flipperType"
:duration="flipperSpeed"
v-for="(item, index) in flipperData"
:key="index"
class="go-d-block"
/>
</n-space>
</template>
<script setup lang="ts">
import { PropType, toRefs, watch, ref } from 'vue'
import { CreateComponentType } from '@/packages/index.d'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { useChartDataFetch } from '@/hooks'
import { Flipper } from '@/components/Flipper'
import { OptionType } from './config'
const props = defineProps({
chartConfig: {
type: Object as PropType<CreateComponentType>,
required: true
}
})
const { w, h } = toRefs(props.chartConfig.attr)
const {
flipperLength,
flipperBgColor,
flipperTextColor,
flipperWidth,
flipperHeight,
flipperRadius,
flipperGap,
flipperType,
flipperSpeed
} = toRefs(props.chartConfig.option as OptionType)
const flipperData = ref<string[] | number[]>([])
const getFlipperData = (val: string | number) => {
return val
.toString()
.padStart(flipperLength.value, '0') // |
.split('') //
.slice(flipperLength.value * -1) //
}
const updateDatasetHandler = (newVal: string | number) => {
flipperData.value = getFlipperData(newVal)
}
watch(
() => props.chartConfig.option,
newVal => {
updateDatasetHandler((newVal as OptionType).dataset)
},
{
immediate: true,
deep: true
}
)
useChartDataFetch(props.chartConfig, useChartEditStore, (newVal: string | number) => {
updateDatasetHandler(newVal)
})
</script>
<style lang="scss" scoped>
@include go('decorates-flipper-number') {
width: v-bind('`${w}px`');
height: v-bind('`${h}px`');
}
</style>

View File

@ -1,12 +1,12 @@
import image from '@/assets/images/chart/decorates/number.png' import image from '@/assets/images/chart/decorates/number.png'
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d' import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
import { ChatCategoryEnum,ChatCategoryEnumName } from '../../index.d' import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
export const NumberConfig: ConfigType = { export const NumberConfig: ConfigType = {
key: 'Number', key: 'Number',
chartKey: 'VNumber', chartKey: 'VNumber',
conKey: 'VCNumber', conKey: 'VCNumber',
title: '数字翻牌', title: '数字计数',
category: ChatCategoryEnum.MORE, category: ChatCategoryEnum.MORE,
categoryName: ChatCategoryEnumName.MORE, categoryName: ChatCategoryEnumName.MORE,
package: PackagesCategoryEnum.DECORATES, package: PackagesCategoryEnum.DECORATES,

View File

@ -1,5 +1,7 @@
import { NumberConfig } from './Number/index' import { NumberConfig } from './Number/index'
import { TimeCommonConfig } from './TimeCommon/index' import { TimeCommonConfig } from './TimeCommon/index'
import { ClockConfig } from './Clock/index' import { ClockConfig } from './Clock/index'
import { CountDownConfig } from './CountDown/index'
import { FlipperNumberConfig } from './FlipperNumber'
export default [TimeCommonConfig, NumberConfig, ClockConfig] export default [NumberConfig, FlipperNumberConfig, TimeCommonConfig, CountDownConfig, ClockConfig]

View File

@ -28,57 +28,29 @@
<SettingItem name="显示行号"> <SettingItem name="显示行号">
<n-switch size="small" v-model:value="optionData.index" /> <n-switch size="small" v-model:value="optionData.index" />
</SettingItem> </SettingItem>
</SettingItemBox> </SettingItemBox>
<SettingItemBox name="配置" :alone="true"> <SettingItemBox name="配置" :alone="true">
<SettingItem name="表头数据"> <SettingItem name="表头数据">
<n-input <n-input v-model:value="header" :min="1" size="small" placeholder="表头数据(英文','分割)"></n-input>
v-model:value="header"
:min="1"
size="small"
placeholder="表头数据(英文','分割)"
></n-input>
</SettingItem> </SettingItem>
<SettingItem name="列对齐方式"> <SettingItem name="列对齐方式">
<n-input <n-input v-model:value="align" :min="1" size="small" placeholder="对齐方式(英文','分割)"></n-input>
v-model:value="align"
:min="1"
size="small"
placeholder="对齐方式(英文','分割)"
></n-input>
</SettingItem> </SettingItem>
<SettingItem name="列宽度"> <SettingItem name="列宽度">
<n-input <n-input v-model:value="columnWidth" :min="1" size="small" placeholder="列宽度(英文','分割)"></n-input>
v-model:value="columnWidth"
:min="1"
size="small"
placeholder="列宽度(英文','分割)"
></n-input>
</SettingItem> </SettingItem>
</SettingItemBox> </SettingItemBox>
<SettingItemBox name="样式"> <SettingItemBox name="样式">
<SettingItem name="表头背景色"> <SettingItem name="表头背景色">
<n-color-picker <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.headerBGC"></n-color-picker>
size="small"
:modes="['hex']"
v-model:value="optionData.headerBGC"
></n-color-picker>
</SettingItem> </SettingItem>
<SettingItem name="奇数行背景色"> <SettingItem name="奇数行背景色">
<n-color-picker <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.oddRowBGC"></n-color-picker>
size="small"
:modes="['hex']"
v-model:value="optionData.oddRowBGC"
></n-color-picker>
</SettingItem> </SettingItem>
<SettingItem name="偶数行背景色"> <SettingItem name="偶数行背景色">
<n-color-picker <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.evenRowBGC"></n-color-picker>
size="small"
:modes="['hex']"
v-model:value="optionData.evenRowBGC"
></n-color-picker>
</SettingItem> </SettingItem>
</SettingItemBox> </SettingItemBox>
</CollapseItem> </CollapseItem>
@ -86,36 +58,43 @@
<script setup lang="ts"> <script setup lang="ts">
import { PropType, ref, watch } from 'vue' import { PropType, ref, watch } from 'vue'
import { import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
CollapseItem,
SettingItemBox,
SettingItem,
} from '@/components/Pages/ChartItemSetting'
import { option } from './config' import { option } from './config'
const props = defineProps({ const props = defineProps({
optionData: { optionData: {
type: Object as PropType<typeof option>, type: Object as PropType<typeof option>,
required: true, required: true
}, }
}) })
const header = ref(props.optionData.header.toString()) const header = ref()
const align = ref(props.optionData.align.toString()) const align = ref()
const columnWidth = ref(props.optionData.columnWidth.toString()) const columnWidth = ref()
watch([header, align, columnWidth],([headerNew,alignNew,columnWidthNew],[headerOld,alignOld,columnWidthOld])=>{ watch(
if(headerNew !== headerOld){ () => props.optionData,
newData => {
header.value = props.optionData.header.toString()
align.value = props.optionData.align.toString()
columnWidth.value = props.optionData.columnWidth.toString()
},
{
deep: false,
immediate: true
}
)
watch([header, align, columnWidth], ([headerNew, alignNew, columnWidthNew], [headerOld, alignOld, columnWidthOld]) => {
if (headerNew !== headerOld) {
props.optionData.header = headerNew.split(',') props.optionData.header = headerNew.split(',')
} }
if(alignNew !== alignOld){ if (alignNew !== alignOld) {
props.optionData.align = alignNew.split(',') props.optionData.align = alignNew.split(',')
} }
if(columnWidthNew !== columnWidthOld){ if (columnWidthNew !== columnWidthOld) {
// @ts-ignore // @ts-ignore
props.optionData.columnWidth = columnWidthNew.split(',') props.optionData.columnWidth = columnWidthNew.split(',')
} }
}) })
</script> </script>

View File

@ -36,6 +36,12 @@ interface EchartsDataType {
source: any[] source: any[]
} }
// 组件状态
export interface StatusType {
lock: boolean
hide: boolean
}
// 滤镜/变换枚举 // 滤镜/变换枚举
export enum FilterEnum { export enum FilterEnum {
// 是否启用 // 是否启用
@ -59,14 +65,36 @@ export enum FilterEnum {
// 倾斜 // 倾斜
SKEW_X = 'skewX', SKEW_X = 'skewX',
SKEW_Y = 'skewY' SKEW_Y = 'skewY',
// 混合模式
BLEND_MODE = 'blendMode'
} }
export const BlendModeEnumList = [
{ label: '正常', value: 'normal' },
{ label: '正片叠底', value: 'multiply' },
{ label: '叠加', value: 'overlay' },
{ label: '滤色', value: 'screen' },
{ label: '变暗', value: 'darken' },
{ label: '变亮', value: 'lighten' },
{ label: '颜色减淡', value: 'color-dodge' },
{ label: '颜色加深', value: 'color-burn;' },
{ label: '强光', value: 'hard-light' },
{ label: '柔光', value: 'soft-light' },
{ label: '差值', value: 'difference' },
{ label: '排除', value: 'exclusion' },
{ label: '色相', value: 'hue' },
{ label: '饱和度', value: 'saturation' },
{ label: '颜色', value: 'color' },
{ label: '亮度', value: 'luminosity' }
]
// 组件实例类 // 组件实例类
export interface PublicConfigType { export interface PublicConfigType {
id: string id: string
isGroup: boolean isGroup: boolean
attr: { x: number; y: number; w: number; h: number; zIndex: number; offsetX: number; offsetY: number; } attr: { x: number; y: number; w: number; h: number; zIndex: number; offsetX: number; offsetY: number }
styles: { styles: {
[FilterEnum.FILTERS_SHOW]: boolean [FilterEnum.FILTERS_SHOW]: boolean
[FilterEnum.OPACITY]: number [FilterEnum.OPACITY]: number
@ -81,14 +109,12 @@ export interface PublicConfigType {
[FilterEnum.SKEW_X]: number [FilterEnum.SKEW_X]: number
[FilterEnum.SKEW_Y]: number [FilterEnum.SKEW_Y]: number
[FilterEnum.BLEND_MODE]: string
// 动画 // 动画
animations: string[] animations: string[]
}, }
status: {
lock: boolean,
hide: boolean,
},
filter?: string filter?: string
status: StatusType
setPosition: Function setPosition: Function
} }

View File

@ -66,6 +66,9 @@ export class PublicConfigClass implements PublicConfigType {
skewX: 0, skewX: 0,
skewY: 0, skewY: 0,
// 混合模式
blendMode: 'normal',
// 动画 // 动画
animations: [] animations: []
} }

View File

@ -57,7 +57,12 @@ import {
ChevronDownOutline as ChevronDownOutlineIcon, ChevronDownOutline as ChevronDownOutlineIcon,
Pulse as PulseIcon, Pulse as PulseIcon,
Folder as FolderIcon, Folder as FolderIcon,
FolderOpen as FolderOpenIcon FolderOpen as FolderOpenIcon,
Image as ImageIcon,
Images as ImagesIcon,
List as ListIcon,
EyeOutline as EyeOutlineIcon,
EyeOffOutline as EyeOffOutlineIcon
} from '@vicons/ionicons5' } from '@vicons/ionicons5'
import { import {
@ -211,7 +216,16 @@ const ionicons5 = {
// 文件夹 // 文件夹
FolderIcon, FolderIcon,
// 文件夹打开 // 文件夹打开
FolderOpenIcon FolderOpenIcon,
// 图片
ImageIcon,
// 多个图片
ImagesIcon,
// 列表
ListIcon,
// 眼睛
EyeOutlineIcon,
EyeOffOutlineIcon
} }
const carbon = { const carbon = {

View File

@ -1,4 +1,4 @@
import type { App } from 'vue'; import type { App } from 'vue'
import { import {
create, create,
NA, NA,
@ -8,6 +8,7 @@ import {
NH3, NH3,
NH4, NH4,
NCode, NCode,
NCountdown,
NText, NText,
NTime, NTime,
NEllipsis, NEllipsis,
@ -98,7 +99,7 @@ import {
NWatermark, NWatermark,
NEmpty, NEmpty,
NCollapseTransition NCollapseTransition
} from 'naive-ui'; } from 'naive-ui'
const naive = create({ const naive = create({
components: [ components: [
@ -109,6 +110,7 @@ const naive = create({
NH3, NH3,
NH4, NH4,
NCode, NCode,
NCountdown,
NText, NText,
NTime, NTime,
NEllipsis, NEllipsis,
@ -199,9 +201,9 @@ const naive = create({
NWatermark, NWatermark,
NEmpty, NEmpty,
NCollapseTransition NCollapseTransition
], ]
}); })
export function setupNaive(app: App<Element>) { export function setupNaive(app: App<Element>) {
app.use(naive); app.use(naive)
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,66 +1,30 @@
[ [
{ {
"CMYK": [ "CMYK": [62, 0, 21, 16],
62, "RGB": [81, 214, 169],
0,
21,
16
],
"RGB": [
81,
214,
169
],
"hex": "#51d6a9", "hex": "#51d6a9",
"name": "碧空绿", "name": "碧空绿",
"pinyin": "bikonlv" "pinyin": "bikonlv"
}, },
{ {
"CMYK": [ "CMYK": [4, 13, 67, 0],
93, "RGB": [248, 223, 114],
0, "hex": "#f8df72",
31, "name": "茉莉黄",
0 "pinyin": "molihuang"
],
"RGB": [
16,
174,
194
],
"hex": "#10aec2",
"name": "甸子蓝",
"pinyin": "dianzilan"
}, },
{ {
"CMYK": [ "CMYK": [76, 51, 0, 0],
76, "RGB": [60, 126, 255],
51,
0,
0
],
"RGB": [
60,
126,
255
],
"hex": "#3c7eff", "hex": "#3c7eff",
"name": "深海蓝", "name": "深海蓝",
"pinyin": "shenhailan" "pinyin": "shenhailan"
}, },
{ {
"CMYK": [ "CMYK": [59, 12, 19, 0],
4, "RGB": [138, 188, 209],
13, "hex": "#8abcd1",
67, "name": "秋波蓝",
0 "pinyin": "qiubolan"
],
"RGB": [
248,
223,
114
],
"hex": "#f8df72",
"name": "茉莉黄",
"pinyin": "molihuang"
} }
] ]

View File

@ -77,6 +77,7 @@ export interface EditCanvasConfigType {
[FilterEnum.ROTATE_Y]: number [FilterEnum.ROTATE_Y]: number
[FilterEnum.SKEW_X]: number [FilterEnum.SKEW_X]: number
[FilterEnum.SKEW_Y]: number [FilterEnum.SKEW_Y]: number
[FilterEnum.BLEND_MODE]: string
// 大屏宽度 // 大屏宽度
[EditCanvasConfigEnum.WIDTH]: number [EditCanvasConfigEnum.WIDTH]: number
// 大屏高度 // 大屏高度

View File

@ -97,6 +97,8 @@ export const useChartEditStore = defineStore({
rotateY: 0, rotateY: 0,
skewX: 0, skewX: 0,
skewY: 0, skewY: 0,
// 混合模式
blendMode: 'normal',
// 默认背景色 // 默认背景色
background: undefined, background: undefined,
backgroundImage: undefined, backgroundImage: undefined,
@ -532,6 +534,10 @@ export const useChartEditStore = defineStore({
return return
} }
// 取消选中
this.setTargetSelectChart()
// 重新选中
let historyData = HistoryItem.historyData as Array<CreateComponentType | CreateComponentGroupType> let historyData = HistoryItem.historyData as Array<CreateComponentType | CreateComponentGroupType>
if (isArray(historyData)) { if (isArray(historyData)) {
// 选中目标元素,支持多个 // 选中目标元素,支持多个
@ -602,7 +608,8 @@ export const useChartEditStore = defineStore({
ids.push(item.id) ids.push(item.id)
}) })
} else { } else {
(historyData[0] as CreateComponentGroupType).groupList.forEach(item => { const group = historyData[0] as CreateComponentGroupType
group.groupList.forEach(item => {
ids.push(item.id) ids.push(item.id)
}) })
} }
@ -617,6 +624,38 @@ export const useChartEditStore = defineStore({
} }
return return
} }
// 处理锁定
const isLock = HistoryItem.actionType === HistoryActionTypeEnum.LOCK
const isUnLock = HistoryItem.actionType === HistoryActionTypeEnum.UNLOCK
if (isLock || isUnLock) {
if ((isLock && isForward) || (isUnLock && !isForward)) {
historyData.forEach(item => {
this.setLock(!item.status.lock, false)
})
return
}
historyData.forEach(item => {
this.setUnLock(false)
})
return
}
// 处理隐藏
const isHide = HistoryItem.actionType === HistoryActionTypeEnum.HIDE
const isShow = HistoryItem.actionType === HistoryActionTypeEnum.SHOW
if (isHide || isShow) {
if ((isHide && isForward) || (isShow && !isForward)) {
historyData.forEach(item => {
this.setHide(!item.status.hide, false)
})
return
}
historyData.forEach(item => {
this.setShow(false)
})
return
}
}, },
// * 撤回 // * 撤回
setBack() { setBack() {
@ -795,6 +834,72 @@ export const useChartEditStore = defineStore({
loadingFinish() loadingFinish()
} }
}, },
// * 锁定
setLock(status: boolean = true, isHistory: boolean = true) {
try {
// 暂不支持多选
if (this.getTargetChart.selectId.length > 1) return
loadingStart()
const index: number = this.fetchTargetIndex()
if (index !== -1) {
// 更新状态
const targetItem = this.getComponentList[index]
targetItem.status.lock = status
// 历史记录
if (isHistory) {
status
? chartHistoryStore.createLockHistory([targetItem])
: chartHistoryStore.createUnLockHistory([targetItem])
}
this.updateComponentList(index, targetItem)
// 锁定添加失焦效果
if (status) this.setTargetSelectChart(undefined)
loadingFinish()
return
}
} catch (value) {
loadingError()
}
},
// * 解除锁定
setUnLock(isHistory: boolean = true) {
this.setLock(false, isHistory)
},
// * 隐藏
setHide(status: boolean = true, isHistory: boolean = true) {
try {
// 暂不支持多选
if (this.getTargetChart.selectId.length > 1) return
loadingStart()
const index: number = this.fetchTargetIndex()
if (index !== -1) {
// 更新状态
const targetItem = this.getComponentList[index]
targetItem.status.hide = status
// 历史记录
if (isHistory) {
status
? chartHistoryStore.createHideHistory([targetItem])
: chartHistoryStore.createShowHistory([targetItem])
}
this.updateComponentList(index, targetItem)
loadingFinish()
// 隐藏添加失焦效果
if (status) this.setTargetSelectChart(undefined)
}
} catch (value) {
loadingError()
}
},
// * 显示
setShow(isHistory: boolean = true) {
this.setHide(false, isHistory)
},
// ---------------- // ----------------
// * 设置页面大小 // * 设置页面大小
setPageSize(scale: number): void { setPageSize(scale: number): void {

View File

@ -1,23 +1,23 @@
import { import { HistoryTargetTypeEnum, HistoryActionTypeEnum } from './chartHistoryStore.d'
HistoryTargetTypeEnum,
HistoryActionTypeEnum
} from './chartHistoryStore.d'
export const historyActionTypeName = { export const historyActionTypeName = {
[HistoryActionTypeEnum.ADD]: '新增图表', [HistoryActionTypeEnum.ADD]: '新增',
[HistoryActionTypeEnum.DELETE]: '删除图表', [HistoryActionTypeEnum.DELETE]: '删除',
[HistoryActionTypeEnum.UPDATE]: '修改属性', [HistoryActionTypeEnum.UPDATE]: '更新',
[HistoryActionTypeEnum.MOVE]: '移动图表', [HistoryActionTypeEnum.MOVE]: '移动',
[HistoryActionTypeEnum.PASTE]: '粘贴图表', [HistoryActionTypeEnum.PASTE]: '粘贴',
[HistoryActionTypeEnum.COPY]: '复制图表', [HistoryActionTypeEnum.COPY]: '复制',
[HistoryActionTypeEnum.CUT]: '剪切图表', [HistoryActionTypeEnum.CUT]: '剪切',
[HistoryActionTypeEnum.TOP]: '层级置顶', [HistoryActionTypeEnum.TOP]: '置顶',
[HistoryActionTypeEnum.BOTTOM]: '层级置底', [HistoryActionTypeEnum.BOTTOM]: '置底',
[HistoryActionTypeEnum.UP]: '层级上移', [HistoryActionTypeEnum.UP]: '上移',
[HistoryActionTypeEnum.DOWN]: '层级下移', [HistoryActionTypeEnum.DOWN]: '下移',
[HistoryActionTypeEnum.GROUP]: '创建分组', [HistoryActionTypeEnum.GROUP]: '成组',
[HistoryActionTypeEnum.UN_GROUP]: '解除分组', [HistoryActionTypeEnum.UN_GROUP]: '解组',
[HistoryActionTypeEnum.SELECT_HISTORY]: '选择记录', [HistoryActionTypeEnum.LOCK]: '锁定',
[HistoryActionTypeEnum.UNLOCK]: '解锁',
[HistoryActionTypeEnum.HIDE]: '隐藏',
[HistoryActionTypeEnum.SHOW]: '显示',
[HistoryTargetTypeEnum.CANVAS]: '画布初始化' [HistoryTargetTypeEnum.CANVAS]: '画布初始化'
} }

View File

@ -2,6 +2,7 @@ import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.
import { EditCanvasType } from '@/store/modules/chartEditStore/chartEditStore.d' import { EditCanvasType } from '@/store/modules/chartEditStore/chartEditStore.d'
// 操作类型枚举 // 操作类型枚举
export enum HistoryActionTypeEnum { export enum HistoryActionTypeEnum {
// 新增 // 新增
ADD = 'add', ADD = 'add',
@ -29,8 +30,14 @@ export enum HistoryActionTypeEnum {
GROUP = 'group', GROUP = 'group',
// 解组 // 解组
UN_GROUP = 'unGroup', UN_GROUP = 'unGroup',
// 选择历史记录 // 锁定
SELECT_HISTORY = 'selectHistory' LOCK = 'lock',
// 解除锁定
UNLOCK = 'unLock',
// 隐藏
HIDE = 'hide',
// 显示
SHOW = 'show'
} }
// 对象类型 // 对象类型

View File

@ -167,6 +167,22 @@ export const useChartHistoryStore = defineStore({
// * 解除分组 // * 解除分组
createUnGroupHistory(item: Array<CreateComponentType | CreateComponentGroupType>) { createUnGroupHistory(item: Array<CreateComponentType | CreateComponentGroupType>) {
this.createStackItem(item, HistoryActionTypeEnum.UN_GROUP, HistoryTargetTypeEnum.CHART) this.createStackItem(item, HistoryActionTypeEnum.UN_GROUP, HistoryTargetTypeEnum.CHART)
},
// * 锁定记录
createLockHistory(item: Array<CreateComponentType | CreateComponentGroupType>) {
this.createStackItem(item, HistoryActionTypeEnum.LOCK, HistoryTargetTypeEnum.CHART)
},
// * 解锁记录
createUnLockHistory(item: Array<CreateComponentType | CreateComponentGroupType>) {
this.createStackItem(item, HistoryActionTypeEnum.UNLOCK, HistoryTargetTypeEnum.CHART)
},
// * 隐藏记录
createHideHistory(item: Array<CreateComponentType | CreateComponentGroupType>) {
this.createStackItem(item, HistoryActionTypeEnum.HIDE, HistoryTargetTypeEnum.CHART)
},
// * 展示记录
createShowHistory(item: Array<CreateComponentType | CreateComponentGroupType>) {
this.createStackItem(item, HistoryActionTypeEnum.SHOW, HistoryTargetTypeEnum.CHART)
} }
} }
}) })

View File

@ -1,7 +1,13 @@
export enum LayerModeEnum {
THUMBNAIL = 'thumbnail',
TEXT = 'text'
}
export enum ChartLayoutStoreEnum { export enum ChartLayoutStoreEnum {
LAYERS = 'layers', LAYERS = 'layers',
CHARTS = 'charts', CHARTS = 'charts',
DETAILS = 'details', DETAILS = 'details',
LAYER_TYPE = 'layerType'
} }
export interface ChartLayoutType { export interface ChartLayoutType {
@ -11,4 +17,6 @@ export interface ChartLayoutType {
[ChartLayoutStoreEnum.CHARTS]: boolean [ChartLayoutStoreEnum.CHARTS]: boolean
// 详情设置 // 详情设置
[ChartLayoutStoreEnum.DETAILS]: boolean [ChartLayoutStoreEnum.DETAILS]: boolean
// 层级展示方式
[ChartLayoutStoreEnum.LAYER_TYPE]: LayerModeEnum
} }

View File

@ -1,5 +1,5 @@
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
import { ChartLayoutType } from './chartLayoutStore.d' import { ChartLayoutType, LayerModeEnum } from './chartLayoutStore.d'
import { setLocalStorage, getLocalStorage } from '@/utils' import { setLocalStorage, getLocalStorage } from '@/utils'
import { StorageEnum } from '@/enums/storageEnum' import { StorageEnum } from '@/enums/storageEnum'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
@ -20,7 +20,9 @@ export const useChartLayoutStore = defineStore({
// 图表组件 // 图表组件
charts: true, charts: true,
// 详情设置收缩为true // 详情设置收缩为true
details: false details: false,
// 图层类型(默认图片)
layerType: LayerModeEnum.THUMBNAIL
}, },
getters: { getters: {
getLayers(): boolean { getLayers(): boolean {
@ -31,6 +33,9 @@ export const useChartLayoutStore = defineStore({
}, },
getDetails(): boolean { getDetails(): boolean {
return this.details return this.details
},
getLayerType(): LayerModeEnum {
return this.layerType
} }
}, },
actions: { actions: {

View File

@ -1,7 +1,7 @@
@import './var.scss'; @import "./var.scss";
@import './format.scss'; @import "./format.scss";
@import './animation.scss'; @import "./animation.scss";
@import './mixins/mixins.scss'; @import "./mixins/mixins.scss";
// 过度 // 过度
.go-transition { .go-transition {
@ -49,14 +49,14 @@
// 毛玻璃 // 毛玻璃
.go-background-filter { .go-background-filter {
backdrop-filter: $--filter-blur-base; backdrop-filter: $--filter-blur-base;
@include fetch-bg-color('filter-color'); @include fetch-bg-color("filter-color");
box-shadow: $--border-shadow; box-shadow: $--border-shadow;
} }
// 毛玻璃 // 毛玻璃
.go-background-filter-shallow { .go-background-filter-shallow {
backdrop-filter: $--filter-blur-base; backdrop-filter: $--filter-blur-base;
@include fetch-bg-color('filter-color-shallow'); @include fetch-bg-color("filter-color-shallow");
box-shadow: $--border-shadow; box-shadow: $--border-shadow;
} }
@ -68,7 +68,7 @@
// 背景斑点需配合 @mixin background-image 使用 // 背景斑点需配合 @mixin background-image 使用
.go-point-bg { .go-point-bg {
@include fetch-theme-custom('background-color', 'background-color1'); @include fetch-theme-custom("background-color", "background-color1");
background-size: 15px 15px, 15px 15px; background-size: 15px 15px, 15px 15px;
} }
@ -118,3 +118,10 @@
#{$type}: 0 !important; #{$type}: 0 !important;
} }
} }
.go-d-inline-block {
display: inline-block;
}
.go-d-block {
display: block;
}

View File

@ -16,11 +16,11 @@ export const animationsClass = (animations: string[]) => {
// * 滤镜 // * 滤镜
export const getFilterStyle = (styles?: StylesType | EditCanvasConfigType) => { export const getFilterStyle = (styles?: StylesType | EditCanvasConfigType) => {
if(!styles || !styles.filterShow) return {} if (!styles || !styles.filterShow) return {}
const { opacity, saturate, contrast, hueRotate, brightness } = styles const { opacity, saturate, contrast, hueRotate, brightness } = styles
return { return {
opacity: opacity, opacity: opacity,
filter: `saturate(${saturate}) contrast(${contrast}) hue-rotate(${hueRotate}deg) brightness(${brightness})`, filter: `saturate(${saturate}) contrast(${contrast}) hue-rotate(${hueRotate}deg) brightness(${brightness})`
} }
} }
@ -28,7 +28,18 @@ export const getFilterStyle = (styles?: StylesType | EditCanvasConfigType) => {
export const getTransformStyle = (styles: StylesType) => { export const getTransformStyle = (styles: StylesType) => {
const { rotateZ, rotateX, rotateY, skewX, skewY } = styles const { rotateZ, rotateX, rotateY, skewX, skewY } = styles
return { return {
transform: `rotateZ(${rotateZ || 0}deg) rotateX(${rotateX || 0}deg) rotateY(${rotateY || 0}deg) skewX(${skewX || 0}deg) skewY(${skewY || 0}deg)`, transform: `rotateZ(${rotateZ || 0}deg) rotateX(${rotateX || 0}deg) rotateY(${rotateY || 0}deg) skewX(${
skewX || 0
}deg) skewY(${skewY || 0}deg)`
}
}
// * 混合模式
export const getBlendModeStyle = (styles: StylesType) => {
if (!styles || !styles.filterShow) return {}
const { blendMode } = styles
return {
'mix-blend-mode': blendMode
} }
} }
@ -38,7 +49,7 @@ export const getTransformStyle = (styles: StylesType) => {
* @param alpha 1 * @param alpha 1
* @returns * @returns
*/ */
export function alpha(color: string, alpha = 1 ) { export function alpha(color: string, alpha = 1) {
return Color(color).alpha(alpha).toString() return Color(color).alpha(alpha).toString()
} }

View File

@ -10,14 +10,9 @@
<slot name="icon"></slot> <slot name="icon"></slot>
</div> </div>
</n-space> </n-space>
<n-space> <n-space align="center" style="gap: 4px">
<slot name="top-right"></slot> <slot name="top-right"></slot>
<n-icon <n-icon v-show="backIcon" size="20" class="go-cursor-pointer go-d-block" @click="backHandle">
v-show="backIcon"
size="20"
class="go-cursor-pointer"
@click="backHandle"
>
<chevron-back-outline-icon></chevron-back-outline-icon> <chevron-back-outline-icon></chevron-back-outline-icon>
</n-icon> </n-icon>
</n-space> </n-space>
@ -165,9 +160,7 @@ $topOrBottomHeight: 40px;
height: calc(100vh - #{$--header-height} - #{$topOrBottomHeight}); height: calc(100vh - #{$--header-height} - #{$topOrBottomHeight});
} }
.content-height-show-both { .content-height-show-both {
height: calc( height: calc(100vh - #{$--header-height} - #{$topOrBottomHeight} - #{$topOrBottomHeight});
100vh - #{$--header-height} - #{$topOrBottomHeight} - #{$topOrBottomHeight}
);
} }
} }
</style> </style>

View File

@ -30,17 +30,11 @@
:onBeforeUpload="beforeUploadHandle" :onBeforeUpload="beforeUploadHandle"
> >
<n-upload-dragger> <n-upload-dragger>
<img <img v-if="canvasConfig.backgroundImage" class="upload-show" :src="canvasConfig.backgroundImage" alt="背景" />
v-if="canvasConfig.backgroundImage"
class="upload-show"
:src="canvasConfig.backgroundImage"
alt="背景"
/>
<div class="upload-img" v-show="!canvasConfig.backgroundImage"> <div class="upload-img" v-show="!canvasConfig.backgroundImage">
<img src="@/assets/images/canvas/noImage.png" /> <img src="@/assets/images/canvas/noImage.png" />
<n-text class="upload-desc" depth="3"> <n-text class="upload-desc" depth="3">
背景图需小于 {{ backgroundImageSize }}M 格式为 png/jpg/gif 背景图需小于 {{ backgroundImageSize }}M 格式为 png/jpg/gif 的文件
的文件
</n-text> </n-text>
</div> </div>
</n-upload-dragger> </n-upload-dragger>
@ -48,43 +42,52 @@
</n-card> </n-card>
<n-space vertical :size="12"> <n-space vertical :size="12">
<n-space> <n-space>
<n-text>背景色</n-text> <n-text>背景颜色</n-text>
<n-color-picker <div class="picker-height">
style="width: 326px;" <n-color-picker
:showPreview="true" v-if="!switchSelectColorLoading"
:swatches="swatchesColors" size="small"
v-model:value="canvasConfig.background" style="width: 250px"
></n-color-picker> v-model:value="canvasConfig.background"
:showPreview="true"
:swatches="swatchesColors"
></n-color-picker>
</div>
</n-space> </n-space>
<n-space> <n-space>
<n-text>颜色应用</n-text> <n-text>应用类型</n-text>
<n-switch <n-select
size="small" size="small"
v-model:value="canvasConfig.selectColor" style="width: 250px"
:loading="switchSelectColorLoading" v-model:value="selectColorValue"
:round="false"
:disabled="!canvasConfig.backgroundImage" :disabled="!canvasConfig.backgroundImage"
:onUpdate="switchSelectColorHandle" :options="selectColorOptions"
></n-switch> @update:value="selectColorValueHandle"
/>
</n-space> </n-space>
<n-space> <n-space>
<n-text>背景控制</n-text> <n-text>背景控制</n-text>
<n-button size="small" :disabled="!canvasConfig.backgroundImage" @click="clearImage">清除背景图</n-button> <n-button class="clear-btn" size="small" :disabled="!canvasConfig.backgroundImage" @click="clearImage">
<n-button size="small" :disabled="!canvasConfig.background" @click="clearColor">清除颜色</n-button> 清除背景
</n-button>
<n-button class="clear-btn" size="small" :disabled="!canvasConfig.background" @click="clearColor">
清除颜色
</n-button>
</n-space> </n-space>
<n-space> <n-space>
<n-text>预览方式</n-text> <n-text>预览方式</n-text>
<n-button-group> <n-button-group>
<n-button <n-button
ghost
v-for="item in previewTypeList" v-for="item in previewTypeList"
:key="item.key" :key="item.key"
:type="canvasConfig.previewScaleType === item.key ? 'primary' : 'tertiary'" :type="canvasConfig.previewScaleType === item.key ? 'primary' : 'tertiary'"
ghost
size="small" size="small"
@click="selectPreviewType(item.key)"> @click="selectPreviewType(item.key)"
>
<n-tooltip :show-arrow="false" trigger="hover"> <n-tooltip :show-arrow="false" trigger="hover">
<template #trigger> <template #trigger>
<n-icon size="18"> <n-icon class="select-preview-icon" size="18">
<component :is="item.icon"></component> <component :is="item.icon"></component>
</n-icon> </n-icon>
</template> </template>
@ -97,7 +100,7 @@
<!-- 滤镜 --> <!-- 滤镜 -->
<styles-setting :isCanvas="true" :chartStyles="canvasConfig"></styles-setting> <styles-setting :isCanvas="true" :chartStyles="canvasConfig"></styles-setting>
<n-divider style="margin: 10px 0;"></n-divider> <n-divider style="margin: 10px 0"></n-divider>
<!-- 主题选择和全局配置 --> <!-- 主题选择和全局配置 -->
<n-tabs class="tabs-box" size="small" type="segment"> <n-tabs class="tabs-box" size="small" type="segment">
@ -123,7 +126,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, nextTick } from 'vue' import { ref, nextTick, watch } from 'vue'
import { backgroundImageSize } from '@/settings/designSetting' import { backgroundImageSize } from '@/settings/designSetting'
import { FileTypeEnum } from '@/enums/fileTypeEnum' import { FileTypeEnum } from '@/enums/fileTypeEnum'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
@ -143,23 +146,25 @@ const editCanvas = chartEditStore.getEditCanvas
const uploadFileListRef = ref() const uploadFileListRef = ref()
const switchSelectColorLoading = ref(false) const switchSelectColorLoading = ref(false)
const selectColorValue = ref(0)
const ChartThemeColor = loadAsyncComponent(() => const ChartThemeColor = loadAsyncComponent(() => import('./components/ChartThemeColor/index.vue'))
import('./components/ChartThemeColor/index.vue')
)
// //
const swatchesColors = [ const selectColorOptions = [
'#232324', {
'#2a2a2b', label: '应用颜色',
'#313132', value: 0
'#373739', },
'#757575', {
'#e0e0e0', label: '应用背景',
'#eeeeee', value: 1
'#fafafa' }
] ]
//
const swatchesColors = ['#232324', '#2a2a2b', '#313132', '#373739', '#757575', '#e0e0e0', '#eeeeee', '#fafafa']
const globalTabList = [ const globalTabList = [
{ {
key: 'ChartTheme', key: 'ChartTheme',
@ -193,9 +198,19 @@ const previewTypeList = [
title: '铺满', title: '铺满',
icon: FitToScreenIcon, icon: FitToScreenIcon,
desc: '强行拉伸画面,填充所有视图' desc: '强行拉伸画面,填充所有视图'
}, }
] ]
watch(
() => canvasConfig.selectColor,
newValue => {
selectColorValue.value = newValue ? 0 : 1
},
{
immediate: true
}
)
// //
const validator = (x: number) => x > 50 const validator = (x: number) => x > 50
@ -212,9 +227,7 @@ const beforeUploadHandle = async ({ file }) => {
const size = file.file.size const size = file.file.size
if (size > 1024 * 1024 * backgroundImageSize) { if (size > 1024 * 1024 * backgroundImageSize) {
window['$message'].warning( window['$message'].warning(`图片超出 ${backgroundImageSize}M 限制,请重新上传!`)
`图片超出 ${backgroundImageSize}M 限制,请重新上传!`
)
return false return false
} }
if (type !== FileTypeEnum.PNG && type !== FileTypeEnum.JPEG && type !== FileTypeEnum.GIF) { if (type !== FileTypeEnum.PNG && type !== FileTypeEnum.JPEG && type !== FileTypeEnum.GIF) {
@ -224,38 +237,32 @@ const beforeUploadHandle = async ({ file }) => {
return true return true
} }
//
const selectColorValueHandle = (value: number) => {
canvasConfig.selectColor = value == 0
}
// //
const clearImage = () => { const clearImage = () => {
chartEditStore.setEditCanvasConfig( chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.BACKGROUND_IMAGE, undefined)
EditCanvasConfigEnum.BACKGROUND_IMAGE, chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.SELECT_COLOR, true)
undefined
)
chartEditStore.setEditCanvasConfig(
EditCanvasConfigEnum.SELECT_COLOR,
true
)
} }
// // /
const clearColor = () => {
chartEditStore.setEditCanvasConfig(
EditCanvasConfigEnum.BACKGROUND,
undefined
)
if (canvasConfig.backgroundImage) {
chartEditStore.setEditCanvasConfig(
EditCanvasConfigEnum.SELECT_COLOR,
false
)
}
}
// /
const switchSelectColorHandle = () => { const switchSelectColorHandle = () => {
switchSelectColorLoading.value = true switchSelectColorLoading.value = true
setTimeout(() => { setTimeout(() => {
switchSelectColorLoading.value = false switchSelectColorLoading.value = false
}, 1000) })
}
//
const clearColor = () => {
chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.BACKGROUND, undefined)
if (canvasConfig.backgroundImage) {
chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.SELECT_COLOR, false)
}
switchSelectColorHandle()
} }
// //
@ -264,14 +271,8 @@ const customRequest = (options: UploadCustomRequestOptions) => {
nextTick(() => { nextTick(() => {
if (file.file) { if (file.file) {
const ImageUrl = fileToUrl(file.file) const ImageUrl = fileToUrl(file.file)
chartEditStore.setEditCanvasConfig( chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.BACKGROUND_IMAGE, ImageUrl)
EditCanvasConfigEnum.BACKGROUND_IMAGE, chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.SELECT_COLOR, false)
ImageUrl
)
chartEditStore.setEditCanvasConfig(
EditCanvasConfigEnum.SELECT_COLOR,
false
)
} else { } else {
window['$message'].error('添加图片失败,请稍后重试!') window['$message'].error('添加图片失败,请稍后重试!')
} }
@ -285,8 +286,8 @@ const selectPreviewType = (key: PreviewScaleEnum) => {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
$updloadWidth: 326px; $uploadWidth: 326px;
$updloadHeight: 193px; $uploadHeight: 193px;
@include go(canvas-setting) { @include go(canvas-setting) {
padding-top: 20px; padding-top: 20px;
.upload-box { .upload-box {
@ -299,12 +300,12 @@ $updloadHeight: 193px;
} }
.n-upload-dragger { .n-upload-dragger {
padding: 5px; padding: 5px;
width: $updloadWidth; width: $uploadWidth;
} }
} }
.upload-show { .upload-show {
width: -webkit-fill-available; width: -webkit-fill-available;
height: $updloadHeight; height: $uploadHeight;
border-radius: 5px; border-radius: 5px;
} }
.upload-img { .upload-img {
@ -322,6 +323,17 @@ $updloadHeight: 193px;
.icon-position { .icon-position {
padding-top: 2px; padding-top: 2px;
} }
.picker-height {
min-height: 35px;
}
.clear-btn {
padding-left: 2.25em;
padding-right: 2.25em;
}
.select-preview-icon {
padding-right: .68em;
padding-left: .68em;
}
.tabs-box { .tabs-box {
margin-top: 20px; margin-top: 20px;
} }

View File

@ -41,7 +41,7 @@
@before-upload="beforeUpload" @before-upload="beforeUpload"
> >
<n-space> <n-space>
<n-button v-if="!ajax" class="sourceBtn-item"> <n-button v-if="!ajax" class="sourceBtn-item" :disabled="noData">
<template #icon> <template #icon>
<n-icon> <n-icon>
<document-add-icon /> <document-add-icon />
@ -52,7 +52,7 @@
</n-space> </n-space>
</n-upload> </n-upload>
<div> <div>
<n-button class="sourceBtn-item" @click="download"> <n-button class="sourceBtn-item" :disabled="noData" @click="download">
<template #icon> <template #icon>
<n-icon> <n-icon>
<document-download-icon /> <document-download-icon />
@ -111,6 +111,7 @@ const { DocumentAddIcon, DocumentDownloadIcon } = icon.carbon
const source = ref() const source = ref()
const dimensions = ref() const dimensions = ref()
const dimensionsAndSource = ref() const dimensionsAndSource = ref()
const noData = ref(false)
const { uploadFileListRef, customRequest, beforeUpload, download } = useFile(targetData) const { uploadFileListRef, customRequest, beforeUpload, download } = useFile(targetData)
@ -180,6 +181,7 @@ watch(
dimensionsAndSource.value = null dimensionsAndSource.value = null
source.value = newData source.value = newData
} else { } else {
noData.value = true
source.value = '此组件无数据源' source.value = '此组件无数据源'
} }
if (isArray(newData)) { if (isArray(newData)) {

View File

@ -5,7 +5,7 @@
<!-- 尺寸 --> <!-- 尺寸 -->
<size-setting :isGroup="targetData.isGroup" :chartAttr="targetData.attr"></size-setting> <size-setting :isGroup="targetData.isGroup" :chartAttr="targetData.attr"></size-setting>
<!-- 位置 --> <!-- 位置 -->
<position-setting :chartAttr="targetData.attr" :canvasConfig="chartEditStore.getEditCanvasConfig"/> <position-setting :chartAttr="targetData.attr" :canvasConfig="chartEditStore.getEditCanvasConfig" />
<!-- 滤镜 --> <!-- 滤镜 -->
<styles-setting :isGroup="targetData.isGroup" :chartStyles="targetData.styles"></styles-setting> <styles-setting :isGroup="targetData.isGroup" :chartStyles="targetData.styles"></styles-setting>
<!-- 自定义配置项 --> <!-- 自定义配置项 -->
@ -17,7 +17,6 @@
import { NameSetting, PositionSetting, SizeSetting, StylesSetting } from '@/components/Pages/ChartItemSetting' import { NameSetting, PositionSetting, SizeSetting, StylesSetting } from '@/components/Pages/ChartItemSetting'
import { useTargetData } from '../hooks/useTargetData.hook' import { useTargetData } from '../hooks/useTargetData.hook'
const { targetData, chartEditStore } = useTargetData() const { targetData, chartEditStore } = useTargetData()
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -11,7 +11,8 @@
...useComponentStyle(groupData.attr, groupIndex), ...useComponentStyle(groupData.attr, groupIndex),
...useSizeStyle(groupData.attr), ...useSizeStyle(groupData.attr),
...getFilterStyle(groupData.styles), ...getFilterStyle(groupData.styles),
...getTransformStyle(groupData.styles) ...getTransformStyle(groupData.styles),
...getBlendModeStyle(groupData.styles) as any
}" }"
@click="mouseClickHandle($event, groupData)" @click="mouseClickHandle($event, groupData)"
@mousedown="mousedownHandle($event, groupData)" @mousedown="mousedownHandle($event, groupData)"
@ -55,7 +56,7 @@ import { MenuEnum } from '@/enums/editPageEnum'
import { chartColors } from '@/settings/chartThemes/index' import { chartColors } from '@/settings/chartThemes/index'
import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d' import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d'
import { MenuOptionsItemType } from '@/views/chart/hooks/useContextMenu.hook.d' import { MenuOptionsItemType } from '@/views/chart/hooks/useContextMenu.hook.d'
import { animationsClass, getFilterStyle, getTransformStyle } from '@/utils' import { animationsClass, getFilterStyle, getTransformStyle, getBlendModeStyle } from '@/utils'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { useContextMenu, divider } from '@/views/chart/hooks/useContextMenu.hook' import { useContextMenu, divider } from '@/views/chart/hooks/useContextMenu.hook'
import { useMouseHandle } from '../../hooks/useDrag.hook' import { useMouseHandle } from '../../hooks/useDrag.hook'
@ -85,26 +86,32 @@ const optionsHandle = (
allList: MenuOptionsItemType[], allList: MenuOptionsItemType[],
targetInstance: CreateComponentType targetInstance: CreateComponentType
) => { ) => {
//
const moreMenuEnums = [MenuEnum.GROUP, MenuEnum.DELETE]
//
const singleMenuEnums = [MenuEnum.UN_GROUP]
const filter = (menulist: MenuEnum[]) => { const filter = (menulist: MenuEnum[]) => {
const list: MenuOptionsItemType[] = [] return allList.filter(i => menulist.includes(i.key as MenuEnum))
allList.forEach(item => {
if (menulist.includes(item.key as MenuEnum)) {
list.push(item)
}
})
return list
} }
// //
if (chartEditStore.getTargetChart.selectId.length > 1) { if (chartEditStore.getTargetChart.selectId.length > 1) {
return filter(moreMenuEnums) return filter([MenuEnum.GROUP, MenuEnum.DELETE])
} else { } else {
return [...filter(singleMenuEnums), divider(), ...targetList] const statusMenuEnums: MenuEnum[] = []
if (targetInstance.status.lock) {
statusMenuEnums.push(MenuEnum.LOCK)
} else {
statusMenuEnums.push(MenuEnum.UNLOCK)
}
if (targetInstance.status.hide) {
statusMenuEnums.push(MenuEnum.HIDE)
} else {
statusMenuEnums.push(MenuEnum.SHOW)
}
//
const singleMenuEnums = [MenuEnum.UN_GROUP]
return [
...filter(singleMenuEnums),
divider(),
...targetList.filter(i => !statusMenuEnums.includes(i.key as MenuEnum))
]
} }
} }

View File

@ -48,8 +48,19 @@ import {
HistoryActionTypeEnum HistoryActionTypeEnum
} from '@/store/modules/chartHistoryStore/chartHistoryStore.d' } from '@/store/modules/chartHistoryStore/chartHistoryStore.d'
const { DesktopOutlineIcon, PencilIcon, TrashIcon, CopyIcon, LayersIcon, DuplicateIcon, HelpOutlineIcon } = const {
icon.ionicons5 DesktopOutlineIcon,
PencilIcon,
TrashIcon,
CopyIcon,
LayersIcon,
DuplicateIcon,
HelpOutlineIcon,
LockClosedOutlineIcon,
LockOpenOutlineIcon,
EyeOffOutlineIcon,
EyeOutlineIcon
} = icon.ionicons5
const { StackedMoveIcon, Carbon3DCursorIcon, Carbon3DSoftwareIcon } = icon.carbon const { StackedMoveIcon, Carbon3DCursorIcon, Carbon3DSoftwareIcon } = icon.carbon
const chartHistoryStoreStore = useChartHistoryStore() const chartHistoryStoreStore = useChartHistoryStore()
@ -83,6 +94,14 @@ const iconHandle = (e: HistoryItemType) => {
return Carbon3DCursorIcon return Carbon3DCursorIcon
case HistoryActionTypeEnum.UN_GROUP: case HistoryActionTypeEnum.UN_GROUP:
return Carbon3DSoftwareIcon return Carbon3DSoftwareIcon
case HistoryActionTypeEnum.LOCK:
return LockClosedOutlineIcon
case HistoryActionTypeEnum.UNLOCK:
return LockOpenOutlineIcon
case HistoryActionTypeEnum.HIDE:
return EyeOffOutlineIcon
case HistoryActionTypeEnum.SHOW:
return EyeOutlineIcon
default: default:
return PencilIcon return PencilIcon
} }
@ -109,9 +128,7 @@ const options = computed(() => {
} }
}) })
return reverse(options.filter(item => { return reverse(options.filter(item => item.label))
return item.label
}))
}) })
</script> </script>

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="go-shape-box"> <div class="go-shape-box" :class="{ lock, hide }">
<slot></slot> <slot></slot>
<!-- 锚点 --> <!-- 锚点 -->
<template v-if="!hiddenPoint"> <template v-if="!hiddenPoint">
@ -55,14 +55,26 @@ const themeColor = computed(() => {
// //
const hover = computed(() => { const hover = computed(() => {
if (props.item.status.lock) return false
return props.item.id === chartEditStore.getTargetChart.hoverId return props.item.id === chartEditStore.getTargetChart.hoverId
}) })
// //
const select = computed(() => { const select = computed(() => {
const id = props.item.id const id = props.item.id
if (props.item.status.lock) return false
return chartEditStore.getTargetChart.selectId.find((e: string) => e === id) return chartEditStore.getTargetChart.selectId.find((e: string) => e === id)
}) })
//
const lock = computed(() => {
return props.item.status.lock
})
//
const hide = computed(() => {
return props.item.status.hide
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@ -70,6 +82,14 @@ const select = computed(() => {
position: absolute; position: absolute;
cursor: move; cursor: move;
&.lock {
cursor: default !important;
}
&.hide {
display: none;
}
/* 锚点 */ /* 锚点 */
.shape-point { .shape-point {
z-index: 1; z-index: 1;

View File

@ -63,6 +63,26 @@ const shortcutKeyOptions = [
win: `${WinKeyboard.CTRL.toUpperCase()} + ← `, win: `${WinKeyboard.CTRL.toUpperCase()} + ← `,
mac: `${MacKeyboard.CTRL.toUpperCase()} + ← ` mac: `${MacKeyboard.CTRL.toUpperCase()} + ← `
}, },
{
label: '锁定',
win: `${WinKeyboard.CTRL.toUpperCase()} + L `,
mac: `${MacKeyboard.CTRL.toUpperCase()} + L `
},
{
label: '解锁',
win: `${WinKeyboard.CTRL.toUpperCase()} + ${WinKeyboard.SHIFT.toUpperCase()}+ L `,
mac: `${MacKeyboard.CTRL.toUpperCase()} + ${MacKeyboard.SHIFT.toUpperCase()} + L `
},
{
label: '展示',
win: `${WinKeyboard.CTRL.toUpperCase()} + H `,
mac: `${MacKeyboard.CTRL.toUpperCase()} + H `
},
{
label: '隐藏',
win: `${WinKeyboard.CTRL.toUpperCase()} + ${WinKeyboard.SHIFT.toUpperCase()} + H `,
mac: `${MacKeyboard.CTRL.toUpperCase()} + ${MacKeyboard.SHIFT.toUpperCase()} + H `
},
{ {
label: '删除', label: '删除',
win: 'Delete'.toUpperCase(), win: 'Delete'.toUpperCase(),

View File

@ -179,7 +179,8 @@ $asideBottom: 70px;
} }
@include deep() { @include deep() {
.n-button__icon { .n-button__icon {
margin-right: 4px; margin-right: 0;
margin-left: 0;
margin-bottom: 12px; margin-bottom: 12px;
} }
} }

View File

@ -140,7 +140,9 @@ export const mousedownBoxSelect = (e: MouseEvent, item?: CreateComponentType | C
targetAttr.x1 - selectAttr.x1 >= 0 && targetAttr.x1 - selectAttr.x1 >= 0 &&
targetAttr.y1 - selectAttr.y1 >= 0 && targetAttr.y1 - selectAttr.y1 >= 0 &&
targetAttr.x2 - selectAttr.x2 <= 0 && targetAttr.x2 - selectAttr.x2 <= 0 &&
targetAttr.y2 - selectAttr.y2 <= 0 targetAttr.y2 - selectAttr.y2 <= 0 &&
!item.status.lock &&
!item.status.hide
) { ) {
isSelect = true isSelect = true
chartEditStore.setTargetSelectChart(item.id, true) chartEditStore.setTargetSelectChart(item.id, true)
@ -166,6 +168,7 @@ export const useMouseHandle = () => {
const mouseClickHandle = (e: MouseEvent, item: CreateComponentType | CreateComponentGroupType) => { const mouseClickHandle = (e: MouseEvent, item: CreateComponentType | CreateComponentGroupType) => {
e.preventDefault() e.preventDefault()
e.stopPropagation() e.stopPropagation()
if (item.status.lock) return
// 若此时按下了 CTRL, 表示多选 // 若此时按下了 CTRL, 表示多选
if ( if (
window.$KeyboardActive?.has(WinKeyboard.CTRL_SOURCE_KEY) || window.$KeyboardActive?.has(WinKeyboard.CTRL_SOURCE_KEY) ||
@ -185,6 +188,7 @@ export const useMouseHandle = () => {
const mousedownHandle = (e: MouseEvent, item: CreateComponentType | CreateComponentGroupType) => { const mousedownHandle = (e: MouseEvent, item: CreateComponentType | CreateComponentGroupType) => {
e.preventDefault() e.preventDefault()
e.stopPropagation() e.stopPropagation()
if (item.status.lock) return
onClickOutSide() onClickOutSide()
// 按下左键 + CTRL // 按下左键 + CTRL
if ( if (

View File

@ -37,7 +37,10 @@
v-else v-else
:data-id="item.id" :data-id="item.id"
:index="index" :index="index"
:style="useComponentStyle(item.attr, index)" :style="{
...useComponentStyle(item.attr, index),
...getBlendModeStyle(item.styles) as any
}"
:item="item" :item="item"
@click="mouseClickHandle($event, item)" @click="mouseClickHandle($event, item)"
@mousedown="mousedownHandle($event, item)" @mousedown="mousedownHandle($event, item)"
@ -81,7 +84,7 @@ import { onMounted, computed } from 'vue'
import { chartColors } from '@/settings/chartThemes/index' import { chartColors } from '@/settings/chartThemes/index'
import { MenuEnum } from '@/enums/editPageEnum' import { MenuEnum } from '@/enums/editPageEnum'
import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d' import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d'
import { animationsClass, getFilterStyle, getTransformStyle } from '@/utils' import { animationsClass, getFilterStyle, getTransformStyle, getBlendModeStyle } from '@/utils'
import { useContextMenu } from '@/views/chart/hooks/useContextMenu.hook' import { useContextMenu } from '@/views/chart/hooks/useContextMenu.hook'
import { MenuOptionsItemType } from '@/views/chart/hooks/useContextMenu.hook.d' import { MenuOptionsItemType } from '@/views/chart/hooks/useContextMenu.hook.d'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
@ -114,24 +117,22 @@ const optionsHandle = (
allList: MenuOptionsItemType[], allList: MenuOptionsItemType[],
targetInstance: CreateComponentType targetInstance: CreateComponentType
) => { ) => {
//
const moreMenuEnums = [MenuEnum.GROUP, MenuEnum.DELETE]
//
const singleMenuEnums = targetList
// //
if (chartEditStore.getTargetChart.selectId.length > 1) { if (chartEditStore.getTargetChart.selectId.length > 1) {
const list: MenuOptionsItemType[] = [] return allList.filter(i => [MenuEnum.GROUP, MenuEnum.DELETE].includes(i.key as MenuEnum))
allList.forEach(item => {
//
if (moreMenuEnums.includes(item.key as MenuEnum)) {
list.push(item)
}
})
return list
} }
return singleMenuEnums const statusMenuEnums: MenuEnum[] = []
if (targetInstance.status.lock) {
statusMenuEnums.push(MenuEnum.LOCK)
} else {
statusMenuEnums.push(MenuEnum.UNLOCK)
}
if (targetInstance.status.hide) {
statusMenuEnums.push(MenuEnum.HIDE)
} else {
statusMenuEnums.push(MenuEnum.SHOW)
}
return targetList.filter(i => !statusMenuEnums.includes(i.key as MenuEnum))
} }
// //

View File

@ -2,7 +2,7 @@
<div class="go-content-layers-group-list-item"> <div class="go-content-layers-group-list-item">
<div <div
class="root-item-content" class="root-item-content"
:class="{ hover: hover, select: select }" :class="{ hover, select, 'list-mini': selectText }"
@click="clickHandle($event)" @click="clickHandle($event)"
@mousedown="groupMousedownHandle($event)" @mousedown="groupMousedownHandle($event)"
@mouseenter="mouseenterHandle(componentGroupData)" @mouseenter="mouseenterHandle(componentGroupData)"
@ -18,11 +18,12 @@
<folder-icon></folder-icon> <folder-icon></folder-icon>
</template> </template>
</n-icon> </n-icon>
<n-ellipsis> <n-ellipsis style="margin-right: auto">
<n-text class="go-ml-2 list-text" :depth="2"> <n-text class="go-ml-2 list-text" :depth="2">
{{ componentGroupData.chartConfig.title }} {{ componentGroupData.chartConfig.title }}
</n-text> </n-text>
</n-ellipsis> </n-ellipsis>
<layers-status :isGroup="false" :hover="hover" :status="status"></layers-status>
</div> </div>
<div :class="{ 'select-modal': select }"></div> <div :class="{ 'select-modal': select }"></div>
</div> </div>
@ -31,6 +32,8 @@
v-for="element in componentGroupData.groupList" v-for="element in componentGroupData.groupList"
:key="element.id" :key="element.id"
:componentData="element" :componentData="element"
:layer-mode="layerMode"
:isGroup="true"
@mousedown="mousedownHandle($event, element, componentGroupData.id)" @mousedown="mousedownHandle($event, element, componentGroupData.id)"
@mouseenter="mouseenterHandle(element)" @mouseenter="mouseenterHandle(element)"
@mouseleave="mouseleaveHandle(element)" @mouseleave="mouseleaveHandle(element)"
@ -48,15 +51,20 @@ import { useDesignStore } from '@/store/modules/designStore/designStore'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { useContextMenu, divider } from '@/views/chart/hooks/useContextMenu.hook' import { useContextMenu, divider } from '@/views/chart/hooks/useContextMenu.hook'
import { MenuOptionsItemType } from '@/views/chart/hooks/useContextMenu.hook.d' import { MenuOptionsItemType } from '@/views/chart/hooks/useContextMenu.hook.d'
import { LayerModeEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d'
import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d' import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d'
import { LayersListItem } from '../LayersListItem' import { LayersListItem } from '../LayersListItem'
import throttle from 'lodash/throttle' import { LayersStatus } from '../LayersStatus/index'
import { icon } from '@/plugins' import { icon } from '@/plugins'
const props = defineProps({ const props = defineProps({
componentGroupData: { componentGroupData: {
type: Object as PropType<CreateComponentGroupType>, type: Object as PropType<CreateComponentGroupType>,
required: true required: true
},
layerMode: {
type: String as PropType<LayerModeEnum>,
default: LayerModeEnum.THUMBNAIL
} }
}) })
@ -77,6 +85,27 @@ const themeColor = computed(() => {
return designStore.getAppTheme return designStore.getAppTheme
}) })
//
const selectText = computed(() => {
return props.layerMode === LayerModeEnum.TEXT
})
//
const select = computed(() => {
const id = props.componentGroupData.id
return chartEditStore.getTargetChart.selectId.find((e: string) => e === id)
})
//
const hover = computed(() => {
return props.componentGroupData.id === chartEditStore.getTargetChart.hoverId
})
// /
const status = computed(() => {
return props.componentGroupData.status
})
// //
const optionsHandle = ( const optionsHandle = (
targetList: MenuOptionsItemType[], targetList: MenuOptionsItemType[],
@ -84,20 +113,29 @@ const optionsHandle = (
targetInstance: CreateComponentType targetInstance: CreateComponentType
) => { ) => {
const filter = (menulist: MenuEnum[]) => { const filter = (menulist: MenuEnum[]) => {
const list: MenuOptionsItemType[] = [] return allList.filter(i => menulist.includes(i.key as MenuEnum))
allList.forEach(item => {
if (menulist.includes(item.key as MenuEnum)) {
list.push(item)
}
})
return list
} }
// //
if (chartEditStore.getTargetChart.selectId.length > 1) { if (chartEditStore.getTargetChart.selectId.length > 1) {
return filter([MenuEnum.GROUP]) return filter([MenuEnum.GROUP])
} else { } else {
return [...filter([MenuEnum.UN_GROUP]), divider(), ...targetList] const statusMenuEnums: MenuEnum[] = []
if (targetInstance.status.lock) {
statusMenuEnums.push(MenuEnum.LOCK)
} else {
statusMenuEnums.push(MenuEnum.UNLOCK)
}
if (targetInstance.status.hide) {
statusMenuEnums.push(MenuEnum.HIDE)
} else {
statusMenuEnums.push(MenuEnum.SHOW)
}
return [
...filter([MenuEnum.UN_GROUP]),
divider(),
...targetList.filter(i => !statusMenuEnums.includes(i.key as MenuEnum))
]
} }
} }
@ -114,17 +152,6 @@ const clickHandle = (e: MouseEvent) => {
mousedownHandle(e, props.componentGroupData) mousedownHandle(e, props.componentGroupData)
} }
//
const select = computed(() => {
const id = props.componentGroupData.id
return chartEditStore.getTargetChart.selectId.find((e: string) => e === id)
})
//
const hover = computed(() => {
return props.componentGroupData.id === chartEditStore.getTargetChart.hoverId
})
// //
const groupMousedownHandle = (e: MouseEvent) => { const groupMousedownHandle = (e: MouseEvent) => {
onClickOutSide() onClickOutSide()
@ -148,7 +175,11 @@ const groupMousedownHandle = (e: MouseEvent) => {
} }
// //
const mousedownHandle = (e: MouseEvent, componentInstance: CreateComponentType | CreateComponentGroupType, id?: string) => { const mousedownHandle = (
e: MouseEvent,
componentInstance: CreateComponentType | CreateComponentGroupType,
id?: string
) => {
e.preventDefault() e.preventDefault()
e.stopPropagation() e.stopPropagation()
@ -169,6 +200,7 @@ const mouseleaveHandle = (componentInstance: CreateComponentType | CreateCompone
<style lang="scss" scoped> <style lang="scss" scoped>
$centerHeight: 52px; $centerHeight: 52px;
$centerMiniHeight: 28px;
$textSize: 10px; $textSize: 10px;
@include go(content-layers-group-list-item) { @include go(content-layers-group-list-item) {
@ -177,6 +209,20 @@ $textSize: 10px;
margin: 10px 5%; margin: 10px 5%;
margin-bottom: 5px; margin-bottom: 5px;
@extend .go-transition-quick; @extend .go-transition-quick;
@include deep() {
.go-content-layers-list-item {
margin-right: 0 !important;
width: 95% !important;
}
}
&:hover {
@include deep() {
.icon-item {
opacity: 1;
}
}
}
.root-item-content { .root-item-content {
height: $centerHeight; height: $centerHeight;
@ -196,6 +242,17 @@ $textSize: 10px;
border: 1px solid v-bind('themeColor') !important; border: 1px solid v-bind('themeColor') !important;
} }
} }
// mini
&.list-mini {
height: $centerMiniHeight;
.item-content {
height: calc(#{$centerMiniHeight} - 10px) !important;
}
.select-modal {
height: calc(#{$centerMiniHeight} + 2px) !important;
}
}
} }
.select-modal, .select-modal,
.item-content { .item-content {
@ -220,5 +277,9 @@ $textSize: 10px;
padding-left: 6px; padding-left: 6px;
font-size: $textSize; font-size: $textSize;
} }
.list-status-icon {
margin-left: 3px;
}
} }
</style> </style>

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="go-content-layers-list-item" :class="{ hover: hover, select: select }"> <div class="go-content-layers-list-item" :class="{ hover, select, 'list-mini': selectText }">
<div class="go-flex-center item-content"> <div class="go-flex-center item-content">
<n-image <n-image
class="list-img" class="list-img"
@ -8,54 +8,77 @@
:src="image" :src="image"
:fallback-src="requireErrorImg()" :fallback-src="requireErrorImg()"
></n-image> ></n-image>
<n-ellipsis> <n-ellipsis style="margin-right: auto">
<n-text class="list-text" :depth="2"> <n-text class="list-text" :depth="2">
{{ props.componentData.chartConfig.title }} {{ props.componentData.chartConfig.title }}
</n-text> </n-text>
</n-ellipsis> </n-ellipsis>
<layers-status :isGroup="isGroup" :hover="hover" :status="status"></layers-status>
</div> </div>
<div :class="{ 'select-modal': select }"></div> <div :class="{ 'select-modal': select }"></div>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { toRefs, computed } from 'vue' import { computed, PropType } from 'vue'
import { requireErrorImg } from '@/utils' import { requireErrorImg } from '@/utils'
import { useDesignStore } from '@/store/modules/designStore/designStore' import { useDesignStore } from '@/store/modules/designStore/designStore'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { LayerModeEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d'
// import { LayersStatus } from '../LayersStatus/index'
const designStore = useDesignStore()
const chartEditStore = useChartEditStore()
//
const themeColor = computed(() => {
return designStore.getAppTheme
})
const props = defineProps({ const props = defineProps({
componentData: { componentData: {
type: Object, type: Object,
required: true required: true
},
isGroup: {
type: Boolean,
default: false
},
layerMode: {
type: String as PropType<LayerModeEnum>,
default: LayerModeEnum.THUMBNAIL
} }
}) })
//
const designStore = useDesignStore()
const chartEditStore = useChartEditStore()
// eslint-disable-next-line vue/no-setup-props-destructure // eslint-disable-next-line vue/no-setup-props-destructure
const { image } = props.componentData.chartConfig const { image } = props.componentData.chartConfig
//
const themeColor = computed(() => {
return designStore.getAppTheme
})
// //
const select = computed(() => { const select = computed(() => {
const id = props.componentData.id const id = props.componentData.id
return chartEditStore.getTargetChart.selectId.find((e: string) => e === id) return chartEditStore.getTargetChart.selectId.find((e: string) => e === id)
}) })
//
const hover = computed(() => { const hover = computed(() => {
return props.componentData.id === chartEditStore.getTargetChart.hoverId return props.componentData.id === chartEditStore.getTargetChart.hoverId
}) })
// /
const status = computed(() => {
return props.componentData.status
})
//
const selectText = computed(() => {
return props.layerMode === LayerModeEnum.TEXT
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
$centerHeight: 52px; $centerHeight: 52px;
$centerMiniHeight: 28px;
$textSize: 10px; $textSize: 10px;
@include go(content-layers-list-item) { @include go(content-layers-list-item) {
@ -72,15 +95,14 @@ $textSize: 10px;
&:hover { &:hover {
@include fetch-bg-color('background-color4'); @include fetch-bg-color('background-color4');
} }
/* 选中 */ &:hover {
&.select { @include deep() {
border: 1px solid v-bind('themeColor'); .icon-item {
/* 需要设置最高级,覆盖 hover 的颜色 */ opacity: 1;
background-color: rgba(0, 0, 0, 0); }
.list-img {
border: 1px solid v-bind('themeColor') !important;
} }
} }
.select-modal, .select-modal,
.item-content { .item-content {
position: absolute; position: absolute;
@ -94,24 +116,39 @@ $textSize: 10px;
width: calc(100% - 10px); width: calc(100% - 10px);
height: calc(100% - 10px); height: calc(100% - 10px);
} }
.select-modal { .select-modal {
width: 100%; width: 100%;
height: 100%; height: 100%;
opacity: 0.3; opacity: 0.3;
background-color: v-bind('themeColor'); background-color: v-bind('themeColor');
} }
.list-img { .list-img {
flex-shrink: 0; flex-shrink: 0;
height: $centerHeight; height: $centerHeight;
border-radius: 5px; border-radius: 5px;
overflow: hidden; overflow: hidden;
border: 1px solid; border: none !important;
padding: 2px; padding: 2px;
@include hover-border-color('hover-border-color'); @include hover-border-color('hover-border-color');
} }
.list-text { .list-text {
padding-left: 6px; padding-left: 6px;
font-size: $textSize; font-size: $textSize;
} }
/* 选中样式 */
&.select {
border: 1px solid v-bind('themeColor');
/* 需要设置最高级,覆盖 hover 的颜色 */
background-color: rgba(0, 0, 0, 0);
}
// mini
&.list-mini {
height: $centerMiniHeight;
}
} }
</style> </style>

View File

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

View File

@ -0,0 +1,86 @@
<template>
<div class="icon-item-box" v-show="!isGroup">
<n-icon
class="go-ml-1 icon-item"
:class="{ active: status.lock }"
size="15"
:component="status.lock ? LockClosedOutlineIcon : LockOpenOutlineIcon"
@click="lockHandle"
/>
<n-icon
class="go-ml-1 icon-item"
:class="{ active: status.hide }"
size="15"
:component="status.hide ? EyeOffOutlineIcon : EyeOutlineIcon"
@click="showHandle"
/>
</div>
</template>
<script setup lang="ts">
import { computed, PropType } from 'vue'
import { useDesignStore } from '@/store/modules/designStore/designStore'
import { StatusType } from '@/packages/index.d'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { icon } from '@/plugins'
const props = defineProps({
isGroup: {
type: Boolean,
default: false
},
hover: {
type: Boolean,
default: false
},
status: {
type: Object as PropType<StatusType>,
default: () => ({
lock: false,
hide: false
})
}
})
const { LockClosedOutlineIcon, LockOpenOutlineIcon, EyeOutlineIcon, EyeOffOutlineIcon } = icon.ionicons5
const chartEditStore = useChartEditStore()
const designStore = useDesignStore()
//
const themeColor = computed(() => {
return designStore.getAppTheme
})
// /
const showHandle = (e: MouseEvent) => {
e.stopPropagation()
props.status.hide ? chartEditStore.setShow() : chartEditStore.setHide()
}
// /
const lockHandle = (e: MouseEvent) => {
e.stopPropagation()
props.status.lock ? chartEditStore.setUnLock() : chartEditStore.setLock()
}
</script>
<style lang="scss" scoped>
$activeColor: v-bind('themeColor');
.icon-item-box {
white-space: nowrap;
.icon-item {
opacity: 0;
padding-top: 5px;
@extend.go-transition;
&.active,
&:hover {
color: $activeColor;
}
&.active {
opacity: 1 !important;
}
}
}
</style>

View File

View File

@ -8,24 +8,49 @@
@mousedown="boxMousedownHandle($event)" @mousedown="boxMousedownHandle($event)"
> >
<template #icon> <template #icon>
<n-icon size="16" :depth="2"> <n-icon size="16" :depth="2" :component="LayersIcon" />
<component :is="LayersIcon"></component>
</n-icon>
</template> </template>
<template #top-right>
<n-button-group style="display: flex">
<n-button
v-for="(item, index) in layerModeList"
:key="index"
ghost
size="small"
:type="layerMode === item.value ? 'primary' : 'tertiary'"
@click="changeLayerType(item.value)"
>
<n-tooltip :show-arrow="false" trigger="hover">
<template #trigger>
<n-icon size="14" :component="item.icon" />
</template>
{{ item.label }}
</n-tooltip>
</n-button>
</n-button-group>
</template>
<!-- 图层内容 --> <!-- 图层内容 -->
<n-space v-if="reverseList.length === 0" justify="center"> <n-space v-if="reverseList.length === 0" justify="center">
<n-text class="not-layer-text">暂无图层~</n-text> <n-text class="not-layer-text">暂无图层~</n-text>
</n-space> </n-space>
<!-- https://github.com/SortableJS/vue.draggable.next --> <!-- https://github.com/SortableJS/vue.draggable.next -->
<draggable item-key="id" v-model="layerList" ghostClass="ghost" @change="onMoveCallback"> <draggable item-key="id" v-model="layerList" ghostClass="ghost" @change="onMoveCallback">
<template #item="{ element }"> <template #item="{ element }">
<div class="go-content-layer-box"> <div class="go-content-layer-box">
<!-- 组合 --> <!-- 组合 -->
<layers-group-list-item v-if="element.isGroup" :componentGroupData="element"></layers-group-list-item> <layers-group-list-item
v-if="element.isGroup"
:componentGroupData="element"
:layer-mode="layerMode"
></layers-group-list-item>
<!-- 单组件 --> <!-- 单组件 -->
<layers-list-item <layers-list-item
v-else v-else
:componentData="element" :componentData="element"
:layer-mode="layerMode"
@mousedown="mousedownHandle($event, element)" @mousedown="mousedownHandle($event, element)"
@mouseenter="mouseenterHandle(element)" @mouseenter="mouseenterHandle(element)"
@mouseleave="mouseleaveHandle(element)" @mouseleave="mouseleaveHandle(element)"
@ -43,7 +68,7 @@ import Draggable from 'vuedraggable'
import cloneDeep from 'lodash/cloneDeep' import cloneDeep from 'lodash/cloneDeep'
import { ContentBox } from '../ContentBox/index' import { ContentBox } from '../ContentBox/index'
import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore' import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore'
import { ChartLayoutStoreEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d' import { ChartLayoutStoreEnum, LayerModeEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d' import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d'
import { MenuOptionsItemType } from '@/views/chart/hooks/useContextMenu.hook.d' import { MenuOptionsItemType } from '@/views/chart/hooks/useContextMenu.hook.d'
@ -55,12 +80,18 @@ import { LayersGroupListItem } from './components/LayersGroupListItem/index'
import { icon } from '@/plugins' import { icon } from '@/plugins'
const { LayersIcon } = icon.ionicons5 const { LayersIcon, GridIcon, ListIcon } = icon.ionicons5
const chartLayoutStore = useChartLayoutStore() const chartLayoutStore = useChartLayoutStore()
const chartEditStore = useChartEditStore() const chartEditStore = useChartEditStore()
const { handleContextMenu, onClickOutSide } = useContextMenu() const { handleContextMenu, onClickOutSide } = useContextMenu()
const layerModeList = [
{ label: '缩略图', icon: GridIcon, value: LayerModeEnum.THUMBNAIL },
{ label: '文本列表', icon: ListIcon, value: LayerModeEnum.TEXT }
]
const layerList = ref<any>([]) const layerList = ref<any>([])
const layerMode = ref<LayerModeEnum>(chartLayoutStore.getLayerType)
// //
const reverseList = computed(() => { const reverseList = computed(() => {
@ -83,16 +114,21 @@ const optionsHandle = (
) => { ) => {
// //
if (chartEditStore.getTargetChart.selectId.length > 1) { if (chartEditStore.getTargetChart.selectId.length > 1) {
const list: MenuOptionsItemType[] = [] return targetList.filter(i => i.key === MenuEnum.GROUP)
targetList.forEach(item => {
//
if (item.key === MenuEnum.GROUP) {
list.push(item)
}
})
return list
} }
return targetList const statusMenuEnums: MenuEnum[] = []
//
if (targetInstance.status.lock) {
statusMenuEnums.push(MenuEnum.LOCK)
} else {
statusMenuEnums.push(MenuEnum.UNLOCK)
}
if (targetInstance.status.hide) {
statusMenuEnums.push(MenuEnum.HIDE)
} else {
statusMenuEnums.push(MenuEnum.SHOW)
}
return targetList.filter(item => !statusMenuEnums.includes(item.key as MenuEnum))
} }
// //
@ -156,10 +192,17 @@ const mouseenterHandle = (item: CreateComponentType) => {
const mouseleaveHandle = (item: CreateComponentType) => { const mouseleaveHandle = (item: CreateComponentType) => {
chartEditStore.setTargetHoverChart(undefined) chartEditStore.setTargetHoverChart(undefined)
} }
//
const changeLayerType = (value: LayerModeEnum) => {
layerMode.value = value
chartLayoutStore.setItem(ChartLayoutStoreEnum.LAYER_TYPE, value)
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
$wight: 170px; $wight: 200px;
@include go(content-layers) { @include go(content-layers) {
width: $wight; width: $wight;
flex-shrink: 0; flex-shrink: 0;
@ -177,5 +220,8 @@ $wight: 170px;
.ghost { .ghost {
opacity: 0; opacity: 0;
} }
.go-layer-mode-active {
color: #51d6a9;
}
} }
</style> </style>

View File

@ -7,7 +7,18 @@ import { MenuOptionsItemType } from './useContextMenu.hook.d'
import { MenuEnum } from '@/enums/editPageEnum' import { MenuEnum } from '@/enums/editPageEnum'
import cloneDeep from 'lodash/cloneDeep' import cloneDeep from 'lodash/cloneDeep'
const { CopyIcon, CutIcon, ClipboardOutlineIcon, TrashIcon, ChevronDownIcon, ChevronUpIcon } = icon.ionicons5 const {
CopyIcon,
CutIcon,
ClipboardOutlineIcon,
TrashIcon,
ChevronDownIcon,
ChevronUpIcon,
LockOpenOutlineIcon,
LockClosedOutlineIcon,
EyeOutlineIcon,
EyeOffOutlineIcon
} = icon.ionicons5
const { UpToTopIcon, DownToBottomIcon, PaintBrushIcon, Carbon3DSoftwareIcon, Carbon3DCursorIcon } = icon.carbon const { UpToTopIcon, DownToBottomIcon, PaintBrushIcon, Carbon3DSoftwareIcon, Carbon3DCursorIcon } = icon.carbon
const chartEditStore = useChartEditStore() const chartEditStore = useChartEditStore()
@ -17,7 +28,7 @@ const chartEditStore = useChartEditStore()
* @param {number} n > 2 * @param {number} n > 2
* @returns * @returns
*/ */
export const divider = (n:number = 3) => { export const divider = (n: number = 3) => {
return { return {
type: 'divider', type: 'divider',
key: `d${n}` key: `d${n}`
@ -26,6 +37,34 @@ export const divider = (n:number = 3) => {
// * 默认单组件选项 // * 默认单组件选项
export const defaultOptions: MenuOptionsItemType[] = [ export const defaultOptions: MenuOptionsItemType[] = [
{
label: '锁定',
key: MenuEnum.LOCK,
icon: renderIcon(LockClosedOutlineIcon),
fnHandle: chartEditStore.setLock
},
{
label: '解锁',
key: MenuEnum.UNLOCK,
icon: renderIcon(LockOpenOutlineIcon),
fnHandle: chartEditStore.setUnLock
},
{
label: '隐藏',
key: MenuEnum.HIDE,
icon: renderIcon(EyeOffOutlineIcon),
fnHandle: chartEditStore.setHide
},
{
label: '显示',
key: MenuEnum.SHOW,
icon: renderIcon(EyeOutlineIcon),
fnHandle: chartEditStore.setShow
},
{
type: 'divider',
key: 'd0'
},
{ {
label: '复制', label: '复制',
key: MenuEnum.COPY, key: MenuEnum.COPY,
@ -61,13 +100,13 @@ export const defaultOptions: MenuOptionsItemType[] = [
fnHandle: chartEditStore.setBottom fnHandle: chartEditStore.setBottom
}, },
{ {
label: '上移一层', label: '上移',
key: MenuEnum.UP, key: MenuEnum.UP,
icon: renderIcon(ChevronUpIcon), icon: renderIcon(ChevronUpIcon),
fnHandle: chartEditStore.setUp fnHandle: chartEditStore.setUp
}, },
{ {
label: '下移一层', label: '下移',
key: MenuEnum.DOWN, key: MenuEnum.DOWN,
icon: renderIcon(ChevronDownIcon), icon: renderIcon(ChevronDownIcon),
fnHandle: chartEditStore.setDown fnHandle: chartEditStore.setDown
@ -160,7 +199,9 @@ const handleContextMenu = (
target = target.parentNode target = target.parentNode
} }
// 展示列表 chartEditStore.setTargetSelectChart(targetInstance && targetInstance.id)
// 隐藏旧列表
chartEditStore.setRightMenuShow(false) chartEditStore.setRightMenuShow(false)
// * 多选默认选项 // * 多选默认选项

View File

@ -24,6 +24,10 @@ export const winKeyboardValue = {
[MenuEnum.FORWORD]: winCtrlMerge(winShiftMerge('z')), [MenuEnum.FORWORD]: winCtrlMerge(winShiftMerge('z')),
[MenuEnum.GROUP]: winCtrlMerge('g'), [MenuEnum.GROUP]: winCtrlMerge('g'),
[MenuEnum.UN_GROUP]: winCtrlMerge(winShiftMerge('g')), [MenuEnum.UN_GROUP]: winCtrlMerge(winShiftMerge('g')),
[MenuEnum.LOCK]: winCtrlMerge('l'),
[MenuEnum.UNLOCK]: winCtrlMerge(winShiftMerge('l')),
[MenuEnum.HIDE]: winCtrlMerge('h'),
[MenuEnum.SHOW]: winCtrlMerge(winShiftMerge('h')),
} }
// 这个 Ctrl 后面还是换成了 ⌘ // 这个 Ctrl 后面还是换成了 ⌘
@ -45,6 +49,10 @@ export const macKeyboardValue = {
[MenuEnum.FORWORD]: macCtrlMerge(macShiftMerge('z')), [MenuEnum.FORWORD]: macCtrlMerge(macShiftMerge('z')),
[MenuEnum.GROUP]: macCtrlMerge('g'), [MenuEnum.GROUP]: macCtrlMerge('g'),
[MenuEnum.UN_GROUP]: macCtrlMerge(macShiftMerge('g')), [MenuEnum.UN_GROUP]: macCtrlMerge(macShiftMerge('g')),
[MenuEnum.LOCK]: macCtrlMerge('l'),
[MenuEnum.UNLOCK]: macCtrlMerge(macShiftMerge('l')),
[MenuEnum.HIDE]: macCtrlMerge('h'),
[MenuEnum.SHOW]: macCtrlMerge(macShiftMerge('h')),
} }
// Win 快捷键列表 // Win 快捷键列表
@ -64,6 +72,12 @@ const winKeyList: Array<string> = [
winKeyboardValue.group, winKeyboardValue.group,
winKeyboardValue.unGroup, winKeyboardValue.unGroup,
winKeyboardValue.lock,
winKeyboardValue.unLock,
winKeyboardValue.hide,
winKeyboardValue.show,
] ]
// Mac 快捷键列表 // Mac 快捷键列表
@ -83,6 +97,12 @@ const macKeyList: Array<string> = [
macKeyboardValue.group, macKeyboardValue.group,
macKeyboardValue.unGroup, macKeyboardValue.unGroup,
macKeyboardValue.lock,
macKeyboardValue.unLock,
macKeyboardValue.hide,
macKeyboardValue.show,
] ]
// 处理键盘记录 // 处理键盘记录
@ -156,6 +176,24 @@ export const useAddKeyboard = () => {
case keyboardValue.unGroup: case keyboardValue.unGroup:
keymaster(e, throttle(() => { chartEditStore.setUnGroup(); return false }, throttleTime)) keymaster(e, throttle(() => { chartEditStore.setUnGroup(); return false }, throttleTime))
break; break;
// 锁定 ct+l
case keyboardValue.lock:
keymaster(e, throttle(() => { chartEditStore.setLock(); return false }, throttleTime))
break;
// 解除锁定 ct+sh+l
case keyboardValue.unLock:
keymaster(e, throttle(() => { chartEditStore.setUnLock(); return false }, throttleTime))
break;
// 锁定 ct+h
case keyboardValue.hide:
keymaster(e, throttle(() => { chartEditStore.setHide(); return false }, throttleTime))
break;
// 解除锁定 ct+sh+h
case keyboardValue.show:
keymaster(e, throttle(() => { chartEditStore.setShow(); return false }, throttleTime))
break;
} }
} }
winKeyList.forEach((key: string) => { winKeyList.forEach((key: string) => {

View File

@ -7,7 +7,9 @@
:style="{ :style="{
...getComponentAttrStyle(item.attr, groupIndex), ...getComponentAttrStyle(item.attr, groupIndex),
...getFilterStyle(item.styles), ...getFilterStyle(item.styles),
...getTransformStyle(item.styles) ...getTransformStyle(item.styles),
...getStatusStyle(item.status),
...getBlendModeStyle(item.styles) as any
}" }"
> >
<component <component
@ -23,8 +25,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { PropType } from 'vue' import { PropType } from 'vue'
import { CreateComponentGroupType } from '@/packages/index.d' import { CreateComponentGroupType } from '@/packages/index.d'
import { animationsClass, getFilterStyle, getTransformStyle } from '@/utils' import { animationsClass, getFilterStyle, getTransformStyle, getBlendModeStyle } from '@/utils'
import { getSizeStyle, getComponentAttrStyle } from '../../utils' import { getSizeStyle, getComponentAttrStyle, getStatusStyle } from '../../utils'
const props = defineProps({ const props = defineProps({
groupData: { groupData: {

View File

@ -7,8 +7,10 @@
:style="{ :style="{
...getComponentAttrStyle(item.attr, index), ...getComponentAttrStyle(item.attr, index),
...getFilterStyle(item.styles), ...getFilterStyle(item.styles),
...getTransformStyle(item.styles) ...getTransformStyle(item.styles),
}" ...getStatusStyle(item.status),
...getBlendModeStyle(item.styles) as any
} as any"
> >
<!-- 分组 --> <!-- 分组 -->
<preview-render-group <preview-render-group
@ -37,8 +39,8 @@ import { ChartEditStorageType } from '../../index.d'
import { PreviewRenderGroup } from '../PreviewRenderGroup/index' import { PreviewRenderGroup } from '../PreviewRenderGroup/index'
import { CreateComponentGroupType } from '@/packages/index.d' import { CreateComponentGroupType } from '@/packages/index.d'
import { chartColors } from '@/settings/chartThemes/index' import { chartColors } from '@/settings/chartThemes/index'
import { animationsClass, getFilterStyle, getTransformStyle } from '@/utils' import { animationsClass, getFilterStyle, getTransformStyle, getBlendModeStyle } from '@/utils'
import { getSizeStyle, getComponentAttrStyle } from '../../utils' import { getSizeStyle, getComponentAttrStyle, getStatusStyle } from '../../utils'
const props = defineProps({ const props = defineProps({
localStorageInfo: { localStorageInfo: {

View File

@ -2,7 +2,7 @@ import { PickCreateComponentType } from '@/packages/index.d'
import { EditCanvasConfigType } from '@/store/modules/chartEditStore/chartEditStore.d' import { EditCanvasConfigType } from '@/store/modules/chartEditStore/chartEditStore.d'
type AttrType = PickCreateComponentType<'attr'> type AttrType = PickCreateComponentType<'attr'>
type StylesType = PickCreateComponentType<'styles'> type StatusType = PickCreateComponentType<'status'>
// 设置位置 // 设置位置
export const getComponentAttrStyle = (attr: AttrType, index: number) => { export const getComponentAttrStyle = (attr: AttrType, index: number) => {
@ -16,10 +16,17 @@ export const getComponentAttrStyle = (attr: AttrType, index: number) => {
// 设置大小 // 设置大小
export const getSizeStyle = (attr: AttrType, scale?: number) => { export const getSizeStyle = (attr: AttrType, scale?: number) => {
return ({ return {
width: `${scale ? scale * attr.w : attr.w}px`, width: `${scale ? scale * attr.w : attr.w}px`,
height: `${scale ? scale * attr.h : attr.h}px` height: `${scale ? scale * attr.h : attr.h}px`
}) }
}
// 设置状态样式
export const getStatusStyle = (attr: StatusType) => {
return {
display: attr.hide ? 'none' : 'block'
}
} }
// 全局样式 // 全局样式