version: v4.9.7

This commit is contained in:
XiaoDaiGua-Ray 2024-10-16 09:51:56 +08:00
parent f9473114e7
commit 11cbf8bca3
16 changed files with 574 additions and 489 deletions

View File

@ -1,5 +1,34 @@
# CHANGE LOG
## 4.9.7
从该版本开始,默认关闭了 `cdn` 构建生产环境;因为国内厂商真心不给力。
## Feats
- 更新 `vue` 版本至 `3.5.12`
- 更新 `@vueuse/core` 版本至 `11.1.0`
- 更新 `naive-ui` 版本至 `2.40.1`
- 更新 `MenuTag` 一些东西,移除了无用的 `ref` 注册,简化了代码;现在允许出现 `rootPath` 标签的关闭按钮了
- `useElementFullscreen` 新增 `currentWindowSize` 返回项,获取当前的窗口尺寸
- `RCollapseGrid` 组件默认开启 `bordered`
- `RCollapseGrid onUpdateValue` 方法更名为 `onUpdateOpen`
- `RTable` 组件默认开启 `wrapperBordered`
- `RTable` 组件默认开启 `bordered`
- 新增 `clearSigningCallback` 方法
- `vite.custom.config` 新增 `cdn` 配置项,是否启用 `cdn` 构建项目
- 配置 `cdn``false`,因为国内厂商更新资源速度有点慢,导致预览失败
- `Layout` 层注入 `--window-width`, `--window-height` `css var` 属性
- 稳定 `Layout` 层的 `css var` 属性
## Fixes
- 修复 `MenuTag` 鼠标移入并且加右键菜单操作时,会导致关闭按钮图标消失的问题
- 修复 `useElementFullscreen` 方法在窗口尺寸更新时,全屏元素失败的问题
- 修复 `MenuTag` 注入 `MENU_TAG_DATA` 错误的问题
- 修复 `Layout Content` 默认高度获取失败问题
- 修复 `RCollapseGrid` 组件自定义 `collapse` 插槽折叠失败的问题
## 4.9.6
由于 `cdn` 厂商更新 `cdn` 资源太慢的缘故,所以目前 `vue` 的版本只有 `3.5.3` 会导致构建线上生产环境报错的问题。

View File

@ -1,7 +1,7 @@
{
"name": "ray-template",
"private": false,
"version": "4.9.6",
"version": "4.9.7",
"type": "module",
"engines": {
"node": "^18.0.0 || >=20.0.0",
@ -33,7 +33,7 @@
]
},
"dependencies": {
"@vueuse/core": "^10.9.0",
"@vueuse/core": "^11.1.0",
"axios": "^1.7.5",
"clipboard": "^2.0.11",
"currency.js": "^2.0.4",
@ -44,11 +44,11 @@
"jsbarcode": "3.11.6",
"lodash-es": "^4.17.21",
"mockjs": "1.1.0",
"naive-ui": "^2.39.0",
"pinia": "^2.1.7",
"pinia-plugin-persistedstate": "^4.0.1",
"naive-ui": "^2.40.1",
"pinia": "^2.2.4",
"pinia-plugin-persistedstate": "^4.1.1",
"print-js": "^1.6.0",
"vue": "^3.5.8",
"vue": "^3.5.12",
"vue-demi": "0.14.6",
"vue-hooks-plus": "2.2.1",
"vue-i18n": "^9.13.1",

458
pnpm-lock.yaml generated
View File

@ -6,8 +6,8 @@ settings:
dependencies:
'@vueuse/core':
specifier: ^10.9.0
version: 10.9.0(vue@3.5.8)
specifier: ^11.1.0
version: 11.1.0(vue@3.5.12)
axios:
specifier: ^1.7.5
version: 1.7.5
@ -39,32 +39,32 @@ dependencies:
specifier: 1.1.0
version: 1.1.0
naive-ui:
specifier: ^2.39.0
version: 2.39.0(vue@3.5.8)
specifier: ^2.40.1
version: 2.40.1(vue@3.5.12)
pinia:
specifier: ^2.1.7
version: 2.1.7(typescript@5.2.2)(vue@3.5.8)
specifier: ^2.2.4
version: 2.2.4(typescript@5.2.2)(vue@3.5.12)
pinia-plugin-persistedstate:
specifier: ^4.0.1
version: 4.0.1(pinia@2.1.7)
specifier: ^4.1.1
version: 4.1.1(pinia@2.2.4)
print-js:
specifier: ^1.6.0
version: 1.6.0
vue:
specifier: ^3.5.8
version: 3.5.8(typescript@5.2.2)
specifier: ^3.5.12
version: 3.5.12(typescript@5.2.2)
vue-demi:
specifier: 0.14.6
version: 0.14.6(vue@3.5.8)
version: 0.14.6(vue@3.5.12)
vue-hooks-plus:
specifier: 2.2.1
version: 2.2.1(vue@3.5.8)
version: 2.2.1(vue@3.5.12)
vue-i18n:
specifier: ^9.13.1
version: 9.13.1(vue@3.5.8)
version: 9.13.1(vue@3.5.12)
vue-router:
specifier: ^4.3.2
version: 4.3.2(vue@3.5.8)
version: 4.3.2(vue@3.5.12)
vue3-next-qrcode:
specifier: 2.0.10
version: 2.0.10(typescript@5.2.2)
@ -105,10 +105,10 @@ devDependencies:
version: 6.21.0(eslint@8.57.0)(typescript@5.2.2)
'@vitejs/plugin-vue':
specifier: ^5.1.0
version: 5.1.0(vite@5.4.3)(vue@3.5.8)
version: 5.1.0(vite@5.4.3)(vue@3.5.12)
'@vitejs/plugin-vue-jsx':
specifier: ^4.0.0
version: 4.0.0(vite@5.4.3)(vue@3.5.8)
version: 4.0.0(vite@5.4.3)(vue@3.5.12)
'@vitest/ui':
specifier: 1.4.0
version: 1.4.0(vitest@1.5.2)
@ -120,7 +120,7 @@ devDependencies:
version: 12.0.0(eslint-plugin-vue@9.25.0)(eslint@8.57.0)(typescript@5.2.2)
'@vue/test-utils':
specifier: 2.4.3
version: 2.4.3(vue@3.5.8)
version: 2.4.3(vue@3.5.12)
autoprefixer:
specifier: ^10.4.16
version: 10.4.16(postcss@8.4.38)
@ -174,10 +174,10 @@ devDependencies:
version: 5.2.2
unplugin-auto-import:
specifier: ^0.18.2
version: 0.18.2(@vueuse/core@10.9.0)
version: 0.18.2(@vueuse/core@11.1.0)
unplugin-vue-components:
specifier: ^0.27.4
version: 0.27.4(vue@3.5.8)
version: 0.27.4(vue@3.5.12)
vite:
specifier: ^5.4.3
version: 5.4.3(@types/node@20.5.1)(sass@1.71.1)
@ -386,7 +386,7 @@ packages:
engines: {node: '>=6.9.0'}
dependencies:
'@babel/traverse': 7.24.8
'@babel/types': 7.24.9
'@babel/types': 7.25.2
transitivePeerDependencies:
- supports-color
dev: true
@ -442,7 +442,7 @@ packages:
resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/types': 7.24.9
'@babel/types': 7.25.2
dev: true
/@babel/helper-plugin-utils@7.24.8:
@ -478,7 +478,7 @@ packages:
engines: {node: '>=6.9.0'}
dependencies:
'@babel/traverse': 7.24.8
'@babel/types': 7.24.9
'@babel/types': 7.25.2
transitivePeerDependencies:
- supports-color
dev: true
@ -589,13 +589,6 @@ packages:
- supports-color
dev: true
/@babel/runtime@7.24.5:
resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==}
engines: {node: '>=6.9.0'}
dependencies:
regenerator-runtime: 0.14.1
dev: false
/@babel/standalone@7.25.6:
resolution: {integrity: sha512-Kf2ZcZVqsKbtYhlA7sP0z5A3q5hmCVYMKMWRWNK/5OVwHIve3JY1djVRmIVAx8FMueLIfZGKQDIILK2w8zO4mg==}
engines: {node: '>=6.9.0'}
@ -843,12 +836,12 @@ packages:
css-render: 0.15.14
dev: false
/@css-render/vue3-ssr@0.15.14(vue@3.5.8):
/@css-render/vue3-ssr@0.15.14(vue@3.5.12):
resolution: {integrity: sha512-//8027GSbxE9n3QlD73xFY6z4ZbHbvrOVB7AO6hsmrEzGbg+h2A09HboUyDgu+xsmj7JnvJD39Irt+2D0+iV8g==}
peerDependencies:
vue: ^3.0.11
dependencies:
vue: 3.5.8(typescript@5.2.2)
vue: 3.5.12(typescript@5.2.2)
dev: false
/@emotion/hash@0.8.0:
@ -1359,7 +1352,7 @@ packages:
jsonc-eslint-parser: 2.4.0
mlly: 1.6.1
source-map-js: 1.2.0
vue-i18n: 9.13.1(vue@3.5.8)
vue-i18n: 9.13.1(vue@3.5.12)
yaml-eslint-parser: 1.2.2
dev: true
@ -1408,7 +1401,7 @@ packages:
picocolors: 1.0.1
source-map-js: 1.2.0
unplugin: 1.10.1
vue-i18n: 9.13.1(vue@3.5.8)
vue-i18n: 9.13.1(vue@3.5.12)
transitivePeerDependencies:
- rollup
- supports-color
@ -1487,11 +1480,11 @@ packages:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.17.1
/@nuxt/kit@3.13.1:
resolution: {integrity: sha512-FkUL349lp/3nVfTIyws4UDJ3d2jyv5Pk1DC1HQUCOkSloYYMdbRcQAUcb4fe2TCLNWvHM+FhU8jnzGTzjALZYA==}
/@nuxt/kit@3.13.2:
resolution: {integrity: sha512-KvRw21zU//wdz25IeE1E5m/aFSzhJloBRAQtv+evcFeZvuroIxpIQuUqhbzuwznaUwpiWbmwlcsp5uOWmi4vwA==}
engines: {node: ^14.18.0 || >=16.10.0}
dependencies:
'@nuxt/schema': 3.13.1
'@nuxt/schema': 3.13.2
c12: 1.11.2
consola: 3.2.3
defu: 6.1.4
@ -1509,7 +1502,7 @@ packages:
semver: 7.6.3
ufo: 1.5.4
unctx: 2.3.1
unimport: 3.11.1
unimport: 3.13.1
untyped: 1.4.2
transitivePeerDependencies:
- magicast
@ -1518,8 +1511,8 @@ packages:
- webpack-sources
dev: false
/@nuxt/schema@3.13.1:
resolution: {integrity: sha512-ishbhzVGspjshG9AG0hYnKYY6LWXzCtua7OXV7C/DQ2yA7rRcy1xHpzKZUDbIRyxCHHCAcBd8jfHEUmEuhEPrA==}
/@nuxt/schema@3.13.2:
resolution: {integrity: sha512-CCZgpm+MkqtOMDEgF9SWgGPBXlQ01hV/6+2reDEpJuqFPGzV8HYKPBcIFvn7/z5ahtgutHLzjP71Na+hYcqSpw==}
engines: {node: ^14.18.0 || >=16.10.0}
dependencies:
compatx: 0.1.8
@ -1532,7 +1525,7 @@ packages:
std-env: 3.7.0
ufo: 1.5.4
uncrypto: 0.1.3
unimport: 3.11.1
unimport: 3.13.1
untyped: 1.4.2
transitivePeerDependencies:
- rollup
@ -1586,6 +1579,21 @@ packages:
'@types/estree': 1.0.5
estree-walker: 2.0.2
picomatch: 2.3.1
dev: true
/@rollup/pluginutils@5.1.2:
resolution: {integrity: sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==}
engines: {node: '>=14.0.0'}
peerDependencies:
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
dependencies:
'@types/estree': 1.0.5
estree-walker: 2.0.2
picomatch: 2.3.1
dev: false
/@rollup/rollup-android-arm-eabi@4.20.0:
resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==}
@ -1980,7 +1988,7 @@ packages:
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
dev: true
/@vitejs/plugin-vue-jsx@4.0.0(vite@5.4.3)(vue@3.5.8):
/@vitejs/plugin-vue-jsx@4.0.0(vite@5.4.3)(vue@3.5.12):
resolution: {integrity: sha512-A+6wL2AdQhDsLsDnY+2v4rRDI1HLJGIMc97a8FURO9tqKsH5QvjWrzsa5DH3NlZsM742W2wODl2fF+bfcTWtXw==}
engines: {node: ^18.0.0 || >=20.0.0}
peerDependencies:
@ -1991,12 +1999,12 @@ packages:
'@babel/plugin-transform-typescript': 7.24.8(@babel/core@7.24.7)
'@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.24.7)
vite: 5.4.3(@types/node@20.5.1)(sass@1.71.1)
vue: 3.5.8(typescript@5.2.2)
vue: 3.5.12(typescript@5.2.2)
transitivePeerDependencies:
- supports-color
dev: true
/@vitejs/plugin-vue@5.1.0(vite@5.4.3)(vue@3.5.8):
/@vitejs/plugin-vue@5.1.0(vite@5.4.3)(vue@3.5.12):
resolution: {integrity: sha512-QMRxARyrdiwi1mj3AW4fLByoHTavreXq0itdEW696EihXglf1MB3D4C2gBvE0jMPH29ZjC3iK8aIaUMLf4EOGA==}
engines: {node: ^18.0.0 || >=20.0.0}
peerDependencies:
@ -2004,7 +2012,7 @@ packages:
vue: ^3.2.25
dependencies:
vite: 5.4.3(@types/node@20.5.1)(sass@1.71.1)
vue: 3.5.8(typescript@5.2.2)
vue: 3.5.12(typescript@5.2.2)
dev: true
/@vitest/expect@1.5.2:
@ -2127,7 +2135,7 @@ packages:
'@babel/helper-module-imports': 7.22.15
'@babel/helper-plugin-utils': 7.24.8
'@babel/parser': 7.24.8
'@vue/compiler-sfc': 3.4.36
'@vue/compiler-sfc': 3.5.11
dev: true
/@vue/compiler-core@3.4.21:
@ -2150,21 +2158,21 @@ packages:
source-map-js: 1.2.0
dev: true
/@vue/compiler-core@3.4.36:
resolution: {integrity: sha512-qBkndgpwFKdupmOPoiS10i7oFdN7a+4UNDlezD0GlQ1kuA1pNrscg9g12HnB5E8hrWSuEftRsbJhL1HI2zpJhg==}
/@vue/compiler-core@3.5.11:
resolution: {integrity: sha512-PwAdxs7/9Hc3ieBO12tXzmTD+Ln4qhT/56S+8DvrrZ4kLDn4Z/AMUr8tXJD0axiJBS0RKIoNaR0yMuQB9v9Udg==}
dependencies:
'@babel/parser': 7.25.3
'@vue/shared': 3.4.36
entities: 5.0.0
'@vue/shared': 3.5.11
entities: 4.5.0
estree-walker: 2.0.2
source-map-js: 1.2.0
source-map-js: 1.2.1
dev: true
/@vue/compiler-core@3.5.8:
resolution: {integrity: sha512-Uzlxp91EPjfbpeO5KtC0KnXPkuTfGsNDeaKQJxQN718uz+RqDYarEf7UhQJGK+ZYloD2taUbHTI2J4WrUaZQNA==}
/@vue/compiler-core@3.5.12:
resolution: {integrity: sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==}
dependencies:
'@babel/parser': 7.25.3
'@vue/shared': 3.5.8
'@vue/shared': 3.5.12
entities: 4.5.0
estree-walker: 2.0.2
source-map-js: 1.2.1
@ -2183,18 +2191,18 @@ packages:
'@vue/shared': 3.4.27
dev: true
/@vue/compiler-dom@3.4.36:
resolution: {integrity: sha512-eEIjy4GwwZTFon/Y+WO8tRRNGqylaRlA79T1RLhUpkOzJ7EtZkkb8MurNfkqY6x6Qiu0R7ESspEF7GkPR/4yYg==}
/@vue/compiler-dom@3.5.11:
resolution: {integrity: sha512-pyGf8zdbDDRkBrEzf8p7BQlMKNNF5Fk/Cf/fQ6PiUz9at4OaUfyXW0dGJTo2Vl1f5U9jSLCNf0EZJEogLXoeew==}
dependencies:
'@vue/compiler-core': 3.4.36
'@vue/shared': 3.4.36
'@vue/compiler-core': 3.5.11
'@vue/shared': 3.5.11
dev: true
/@vue/compiler-dom@3.5.8:
resolution: {integrity: sha512-GUNHWvoDSbSa5ZSHT9SnV5WkStWfzJwwTd6NMGzilOE/HM5j+9EB9zGXdtu/fCNEmctBqMs6C9SvVPpVPuk1Eg==}
/@vue/compiler-dom@3.5.12:
resolution: {integrity: sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==}
dependencies:
'@vue/compiler-core': 3.5.8
'@vue/shared': 3.5.8
'@vue/compiler-core': 3.5.12
'@vue/shared': 3.5.12
/@vue/compiler-sfc@3.4.21:
resolution: {integrity: sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==}
@ -2224,28 +2232,28 @@ packages:
source-map-js: 1.2.0
dev: true
/@vue/compiler-sfc@3.4.36:
resolution: {integrity: sha512-rhuHu7qztt/rNH90dXPTzhB7hLQT2OC4s4GrPVqmzVgPY4XBlfWmcWzn4bIPEWNImt0CjO7kfHAf/1UXOtx3vw==}
/@vue/compiler-sfc@3.5.11:
resolution: {integrity: sha512-gsbBtT4N9ANXXepprle+X9YLg2htQk1sqH/qGJ/EApl+dgpUBdTv3yP7YlR535uHZY3n6XaR0/bKo0BgwwDniw==}
dependencies:
'@babel/parser': 7.25.3
'@vue/compiler-core': 3.4.36
'@vue/compiler-dom': 3.4.36
'@vue/compiler-ssr': 3.4.36
'@vue/shared': 3.4.36
'@vue/compiler-core': 3.5.11
'@vue/compiler-dom': 3.5.11
'@vue/compiler-ssr': 3.5.11
'@vue/shared': 3.5.11
estree-walker: 2.0.2
magic-string: 0.30.11
postcss: 8.4.40
source-map-js: 1.2.0
postcss: 8.4.47
source-map-js: 1.2.1
dev: true
/@vue/compiler-sfc@3.5.8:
resolution: {integrity: sha512-taYpngQtSysrvO9GULaOSwcG5q821zCoIQBtQQSx7Uf7DxpR6CIHR90toPr9QfDD2mqHQPCSgoWBvJu0yV9zjg==}
/@vue/compiler-sfc@3.5.12:
resolution: {integrity: sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==}
dependencies:
'@babel/parser': 7.25.3
'@vue/compiler-core': 3.5.8
'@vue/compiler-dom': 3.5.8
'@vue/compiler-ssr': 3.5.8
'@vue/shared': 3.5.8
'@vue/compiler-core': 3.5.12
'@vue/compiler-dom': 3.5.12
'@vue/compiler-ssr': 3.5.12
'@vue/shared': 3.5.12
estree-walker: 2.0.2
magic-string: 0.30.11
postcss: 8.4.47
@ -2265,18 +2273,18 @@ packages:
'@vue/shared': 3.4.27
dev: true
/@vue/compiler-ssr@3.4.36:
resolution: {integrity: sha512-Wt1zyheF0zVvRJyhY74uxQbnkXV2Le/JPOrAxooR4rFYKC7cFr+cRqW6RU3cM/bsTy7sdZ83IDuy/gLPSfPGng==}
/@vue/compiler-ssr@3.5.11:
resolution: {integrity: sha512-P4+GPjOuC2aFTk1Z4WANvEhyOykcvEd5bIj2KVNGKGfM745LaXGr++5njpdBTzVz5pZifdlR1kpYSJJpIlSePA==}
dependencies:
'@vue/compiler-dom': 3.4.36
'@vue/shared': 3.4.36
'@vue/compiler-dom': 3.5.11
'@vue/shared': 3.5.11
dev: true
/@vue/compiler-ssr@3.5.8:
resolution: {integrity: sha512-W96PtryNsNG9u0ZnN5Q5j27Z/feGrFV6zy9q5tzJVyJaLiwYxvC0ek4IXClZygyhjm+XKM7WD9pdKi/wIRVC/Q==}
/@vue/compiler-ssr@3.5.12:
resolution: {integrity: sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==}
dependencies:
'@vue/compiler-dom': 3.5.8
'@vue/shared': 3.5.8
'@vue/compiler-dom': 3.5.12
'@vue/shared': 3.5.12
/@vue/devtools-api@6.6.1:
resolution: {integrity: sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==}
@ -2329,8 +2337,8 @@ packages:
optional: true
dependencies:
'@volar/language-core': 2.2.0-alpha.8
'@vue/compiler-dom': 3.4.36
'@vue/shared': 3.4.36
'@vue/compiler-dom': 3.5.11
'@vue/shared': 3.5.11
computeds: 0.0.1
minimatch: 9.0.5
path-browserify: 1.0.1
@ -2338,33 +2346,33 @@ packages:
vue-template-compiler: 2.7.16
dev: true
/@vue/reactivity@3.5.8:
resolution: {integrity: sha512-mlgUyFHLCUZcAYkqvzYnlBRCh0t5ZQfLYit7nukn1GR96gc48Bp4B7OIcSfVSvlG1k3BPfD+p22gi1t2n9tsXg==}
/@vue/reactivity@3.5.12:
resolution: {integrity: sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==}
dependencies:
'@vue/shared': 3.5.8
'@vue/shared': 3.5.12
/@vue/runtime-core@3.5.8:
resolution: {integrity: sha512-fJuPelh64agZ8vKkZgp5iCkPaEqFJsYzxLk9vSC0X3G8ppknclNDr61gDc45yBGTaN5Xqc1qZWU3/NoaBMHcjQ==}
/@vue/runtime-core@3.5.12:
resolution: {integrity: sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==}
dependencies:
'@vue/reactivity': 3.5.8
'@vue/shared': 3.5.8
'@vue/reactivity': 3.5.12
'@vue/shared': 3.5.12
/@vue/runtime-dom@3.5.8:
resolution: {integrity: sha512-DpAUz+PKjTZPUOB6zJgkxVI3GuYc2iWZiNeeHQUw53kdrparSTG6HeXUrYDjaam8dVsCdvQxDz6ZWxnyjccUjQ==}
/@vue/runtime-dom@3.5.12:
resolution: {integrity: sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==}
dependencies:
'@vue/reactivity': 3.5.8
'@vue/runtime-core': 3.5.8
'@vue/shared': 3.5.8
'@vue/reactivity': 3.5.12
'@vue/runtime-core': 3.5.12
'@vue/shared': 3.5.12
csstype: 3.1.3
/@vue/server-renderer@3.5.8(vue@3.5.8):
resolution: {integrity: sha512-7AmC9/mEeV9mmXNVyUIm1a1AjUhyeeGNbkLh39J00E7iPeGks8OGRB5blJiMmvqSh8SkaS7jkLWSpXtxUCeagA==}
/@vue/server-renderer@3.5.12(vue@3.5.12):
resolution: {integrity: sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==}
peerDependencies:
vue: 3.5.8
vue: 3.5.12
dependencies:
'@vue/compiler-ssr': 3.5.8
'@vue/shared': 3.5.8
vue: 3.5.8(typescript@5.2.2)
'@vue/compiler-ssr': 3.5.12
'@vue/shared': 3.5.12
vue: 3.5.12(typescript@5.2.2)
/@vue/shared@3.4.21:
resolution: {integrity: sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==}
@ -2374,14 +2382,14 @@ packages:
resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==}
dev: true
/@vue/shared@3.4.36:
resolution: {integrity: sha512-fdPLStwl1sDfYuUftBaUVn2pIrVFDASYerZSrlBvVBfylObPA1gtcWJHy5Ox8jLEJ524zBibss488Q3SZtU1uA==}
/@vue/shared@3.5.11:
resolution: {integrity: sha512-W8GgysJVnFo81FthhzurdRAWP/byq3q2qIw70e0JWblzVhjgOMiC2GyovXrZTFQJnFVryYaKGP3Tc9vYzYm6PQ==}
dev: true
/@vue/shared@3.5.8:
resolution: {integrity: sha512-mJleSWbAGySd2RJdX1RBtcrUBX6snyOc0qHpgk3lGi4l9/P/3ny3ELqFWqYdkXIwwNN/kdm8nD9ky8o6l/Lx2A==}
/@vue/shared@3.5.12:
resolution: {integrity: sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==}
/@vue/test-utils@2.4.3(vue@3.5.8):
/@vue/test-utils@2.4.3(vue@3.5.12):
resolution: {integrity: sha512-F4K7mF+ad++VlTrxMJVRnenKSJmO6fkQt2wpRDiKDesQMkfpniGWsqEi/JevxGBo2qEkwwjvTUAoiGJLNx++CA==}
peerDependencies:
'@vue/server-renderer': ^3.0.1
@ -2391,28 +2399,28 @@ packages:
optional: true
dependencies:
js-beautify: 1.14.11
vue: 3.5.8(typescript@5.2.2)
vue: 3.5.12(typescript@5.2.2)
vue-component-type-helpers: 1.8.26
dev: true
/@vueuse/core@10.9.0(vue@3.5.8):
resolution: {integrity: sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==}
/@vueuse/core@11.1.0(vue@3.5.12):
resolution: {integrity: sha512-P6dk79QYA6sKQnghrUz/1tHi0n9mrb/iO1WTMk/ElLmTyNqgDeSZ3wcDf6fRBGzRJbeG1dxzEOvLENMjr+E3fg==}
dependencies:
'@types/web-bluetooth': 0.0.20
'@vueuse/metadata': 10.9.0
'@vueuse/shared': 10.9.0(vue@3.5.8)
vue-demi: 0.14.7(vue@3.5.8)
'@vueuse/metadata': 11.1.0
'@vueuse/shared': 11.1.0(vue@3.5.12)
vue-demi: 0.14.10(vue@3.5.12)
transitivePeerDependencies:
- '@vue/composition-api'
- vue
/@vueuse/metadata@10.9.0:
resolution: {integrity: sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==}
/@vueuse/metadata@11.1.0:
resolution: {integrity: sha512-l9Q502TBTaPYGanl1G+hPgd3QX5s4CGnpXriVBR5fEZ/goI6fvDaVmIl3Td8oKFurOxTmbXvBPSsgrd6eu6HYg==}
/@vueuse/shared@10.9.0(vue@3.5.8):
resolution: {integrity: sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==}
/@vueuse/shared@11.1.0(vue@3.5.12):
resolution: {integrity: sha512-YUtIpY122q7osj+zsNMFAfMTubGz0sn5QzE5gPzAIiCmtt2ha3uQUY1+JPyL4gRCTsLPX82Y9brNbo/aqlA91w==}
dependencies:
vue-demi: 0.14.7(vue@3.5.8)
vue-demi: 0.14.10(vue@3.5.12)
transitivePeerDependencies:
- '@vue/composition-api'
- vue
@ -3458,19 +3466,16 @@ packages:
is-data-view: 1.0.1
dev: true
/date-fns-tz@2.0.1(date-fns@2.30.0):
resolution: {integrity: sha512-fJCG3Pwx8HUoLhkepdsP7Z5RsucUi+ZBOxyM5d0ZZ6c4SdYustq0VMmOu6Wf7bli+yS/Jwp91TOCqn9jMcVrUA==}
/date-fns-tz@3.1.3(date-fns@3.6.0):
resolution: {integrity: sha512-ZfbMu+nbzW0mEzC8VZrLiSWvUIaI3aRHeq33mTe7Y38UctKukgqPR4nTDwcwS4d64Gf8GghnVsroBuMY3eiTeA==}
peerDependencies:
date-fns: 2.x
date-fns: ^3.0.0
dependencies:
date-fns: 2.30.0
date-fns: 3.6.0
dev: false
/date-fns@2.30.0:
resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
engines: {node: '>=0.11'}
dependencies:
'@babel/runtime': 7.24.5
/date-fns@3.6.0:
resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==}
dev: false
/dayjs@1.11.10:
@ -3566,8 +3571,8 @@ packages:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
dev: true
/deep-pick-omit@1.2.0:
resolution: {integrity: sha512-2CGvfTM2c+IP/MhdRZMpaHhTc6zIlgz3tQXJ/VGAkc7mjMrjqSU28qiI63yEcy+fcYfd/K+NNJcGRzap4M4bqw==}
/deep-pick-omit@1.2.1:
resolution: {integrity: sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw==}
dev: false
/deepmerge@1.3.2:
@ -3842,7 +3847,7 @@ packages:
'@one-ini/wasm': 0.1.1
commander: 10.0.1
minimatch: 9.0.1
semver: 7.6.2
semver: 7.6.3
dev: true
/ejs@3.1.9:
@ -3889,11 +3894,6 @@ packages:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
/entities@5.0.0:
resolution: {integrity: sha512-BeJFvFRJddxobhvEdm5GqHzRV/X+ACeuw0/BuuxsCh1EUZcAIz8+kYmBp/LrQuloy6K1f3a0M7+IhmZ7QnkISA==}
engines: {node: '>=0.12'}
dev: true
/error-ex@1.3.2:
resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
dependencies:
@ -4893,7 +4893,7 @@ packages:
array-union: 2.1.0
dir-glob: 3.0.1
fast-glob: 3.3.2
ignore: 5.3.1
ignore: 5.3.2
merge2: 1.4.1
slash: 3.0.0
dev: true
@ -5618,7 +5618,7 @@ packages:
acorn: 8.11.3
eslint-visitor-keys: 3.4.3
espree: 9.6.1
semver: 7.6.2
semver: 7.6.3
dev: true
/jsonfile@6.1.0:
@ -6140,31 +6140,31 @@ packages:
minimatch: 3.1.2
dev: true
/naive-ui@2.39.0(vue@3.5.8):
resolution: {integrity: sha512-5oUJzRG+rtLSH8eRU+fJvVYiQids2BxF9jp+fwGoAqHOptEINrBlgBu9uy+95RHE5FLJ7Q/z41o+qkoGnUrKxQ==}
/naive-ui@2.40.1(vue@3.5.12):
resolution: {integrity: sha512-3NkL+vLRQZKQxCHXa+7xiD6oM74OrQELaehDkGYRYpr6kjT+JJB+Z7h+5LC70gn8VkbgCAETv0+uRWF+6MLlgQ==}
peerDependencies:
vue: ^3.0.0
dependencies:
'@css-render/plugin-bem': 0.15.14(css-render@0.15.14)
'@css-render/vue3-ssr': 0.15.14(vue@3.5.8)
'@css-render/vue3-ssr': 0.15.14(vue@3.5.12)
'@types/katex': 0.16.7
'@types/lodash': 4.17.6
'@types/lodash-es': 4.17.12
async-validator: 4.2.5
css-render: 0.15.14
csstype: 3.1.3
date-fns: 2.30.0
date-fns-tz: 2.0.1(date-fns@2.30.0)
date-fns: 3.6.0
date-fns-tz: 3.1.3(date-fns@3.6.0)
evtd: 0.2.4
highlight.js: 11.9.0
lodash: 4.17.21
lodash-es: 4.17.21
seemly: 0.3.8
treemate: 0.3.11
vdirs: 0.1.8(vue@3.5.8)
vooks: 0.2.12(vue@3.5.8)
vue: 3.5.8(typescript@5.2.2)
vueuc: 0.4.58(vue@3.5.8)
vdirs: 0.1.8(vue@3.5.12)
vooks: 0.2.12(vue@3.5.12)
vue: 3.5.12(typescript@5.2.2)
vueuc: 0.4.64(vue@3.5.12)
dev: false
/nanoid@3.3.7:
@ -6225,7 +6225,7 @@ packages:
dependencies:
hosted-git-info: 4.1.0
is-core-module: 2.13.1
semver: 7.6.2
semver: 7.6.3
validate-npm-package-license: 3.0.4
dev: true
@ -6543,8 +6543,8 @@ packages:
hasBin: true
dev: true
/pinia-plugin-persistedstate@4.0.1(pinia@2.1.7):
resolution: {integrity: sha512-Gs2nhKUi6Rwhhc8PH9wvEAxfz4iZeJ/36qQv2ieYs94+zMozbGtMLIR4p9Aoim3c/PKf8J9orOz9n+f0ZF9CdA==}
/pinia-plugin-persistedstate@4.1.1(pinia@2.2.4):
resolution: {integrity: sha512-fUiUsbfBetGUZzX28z+ImAZw7FDXzwRrk+fN+ljF5OhQMhsSYfYeUzI9FLLtpjekYbfFHWvJiECkLI60RIuiPA==}
peerDependencies:
'@pinia/nuxt': '>=0.5.0'
pinia: '>=2.0.0'
@ -6554,11 +6554,11 @@ packages:
pinia:
optional: true
dependencies:
'@nuxt/kit': 3.13.1
deep-pick-omit: 1.2.0
'@nuxt/kit': 3.13.2
deep-pick-omit: 1.2.1
defu: 6.1.4
destr: 2.0.3
pinia: 2.1.7(typescript@5.2.2)(vue@3.5.8)
pinia: 2.2.4(typescript@5.2.2)(vue@3.5.12)
transitivePeerDependencies:
- magicast
- rollup
@ -6566,8 +6566,8 @@ packages:
- webpack-sources
dev: false
/pinia@2.1.7(typescript@5.2.2)(vue@3.5.8):
resolution: {integrity: sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==}
/pinia@2.2.4(typescript@5.2.2)(vue@3.5.12):
resolution: {integrity: sha512-K7ZhpMY9iJ9ShTC0cR2+PnxdQRuwVIsXDO/WIEV/RnMC/vmSoKDTKW/exNQYPI+4ij10UjXqdNiEHwn47McANQ==}
peerDependencies:
'@vue/composition-api': ^1.4.0
typescript: '>=4.4.4'
@ -6578,10 +6578,10 @@ packages:
typescript:
optional: true
dependencies:
'@vue/devtools-api': 6.6.1
'@vue/devtools-api': 6.6.3
typescript: 5.2.2
vue: 3.5.8(typescript@5.2.2)
vue-demi: 0.14.6(vue@3.5.8)
vue: 3.5.12(typescript@5.2.2)
vue-demi: 0.14.10(vue@3.5.12)
dev: false
/pkg-types@1.2.0:
@ -6652,15 +6652,6 @@ packages:
source-map-js: 1.2.0
dev: true
/postcss@8.4.40:
resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==}
engines: {node: ^10 || ^12 || >=14}
dependencies:
nanoid: 3.3.7
picocolors: 1.0.1
source-map-js: 1.2.0
dev: true
/postcss@8.4.45:
resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==}
engines: {node: ^10 || ^12 || >=14}
@ -6852,10 +6843,6 @@ packages:
strip-indent: 3.0.0
dev: true
/regenerator-runtime@0.14.1:
resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
dev: false
/regex-not@1.0.2:
resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==}
engines: {node: '>=0.10.0'}
@ -7117,12 +7104,6 @@ packages:
lru-cache: 6.0.0
dev: true
/semver@7.6.2:
resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==}
engines: {node: '>=10'}
hasBin: true
dev: true
/semver@7.6.3:
resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
engines: {node: '>=10'}
@ -7960,6 +7941,28 @@ packages:
transitivePeerDependencies:
- rollup
- webpack-sources
dev: true
/unimport@3.13.1:
resolution: {integrity: sha512-nNrVzcs93yrZQOW77qnyOVHtb68LegvhYFwxFMfuuWScmwQmyVCG/NBuN8tYsaGzgQUVYv34E/af+Cc9u4og4A==}
dependencies:
'@rollup/pluginutils': 5.1.2
acorn: 8.12.1
escape-string-regexp: 5.0.0
estree-walker: 3.0.3
fast-glob: 3.3.2
local-pkg: 0.5.0
magic-string: 0.30.11
mlly: 1.7.1
pathe: 1.1.2
pkg-types: 1.2.0
scule: 1.3.0
strip-literal: 2.1.0
unplugin: 1.14.1
transitivePeerDependencies:
- rollup
- webpack-sources
dev: false
/union-value@1.0.1:
resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==}
@ -7981,7 +7984,7 @@ packages:
engines: {node: '>= 0.8'}
dev: true
/unplugin-auto-import@0.18.2(@vueuse/core@10.9.0):
/unplugin-auto-import@0.18.2(@vueuse/core@11.1.0):
resolution: {integrity: sha512-Dwb3rAic75harVBrVjwiq6H24PT+nBq2dpxV5BH8NNI6sDFaTytvP+iyo4xy7prQbR3r5K6nMs4f5Wp9PE4g8A==}
engines: {node: '>=14'}
peerDependencies:
@ -7995,7 +7998,7 @@ packages:
dependencies:
'@antfu/utils': 0.7.10
'@rollup/pluginutils': 5.1.0
'@vueuse/core': 10.9.0(vue@3.5.8)
'@vueuse/core': 11.1.0(vue@3.5.12)
fast-glob: 3.3.2
local-pkg: 0.5.0
magic-string: 0.30.11
@ -8007,7 +8010,7 @@ packages:
- webpack-sources
dev: true
/unplugin-vue-components@0.27.4(vue@3.5.8):
/unplugin-vue-components@0.27.4(vue@3.5.12):
resolution: {integrity: sha512-1XVl5iXG7P1UrOMnaj2ogYa5YTq8aoh5jwDPQhemwO/OrXW+lPQKDXd1hMz15qxQPxgb/XXlbgo3HQ2rLEbmXQ==}
engines: {node: '>=14'}
peerDependencies:
@ -8030,7 +8033,7 @@ packages:
minimatch: 9.0.5
mlly: 1.7.1
unplugin: 1.13.1
vue: 3.5.8(typescript@5.2.2)
vue: 3.5.12(typescript@5.2.2)
transitivePeerDependencies:
- rollup
- supports-color
@ -8059,6 +8062,19 @@ packages:
acorn: 8.12.1
webpack-virtual-modules: 0.6.2
/unplugin@1.14.1:
resolution: {integrity: sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==}
engines: {node: '>=14.0.0'}
peerDependencies:
webpack-sources: ^3
peerDependenciesMeta:
webpack-sources:
optional: true
dependencies:
acorn: 8.12.1
webpack-virtual-modules: 0.6.2
dev: false
/unset-value@1.0.0:
resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==}
engines: {node: '>=0.10.0'}
@ -8145,13 +8161,13 @@ packages:
engines: {node: '>= 0.8'}
dev: true
/vdirs@0.1.8(vue@3.5.8):
/vdirs@0.1.8(vue@3.5.12):
resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==}
peerDependencies:
vue: ^3.0.11
dependencies:
evtd: 0.2.4
vue: 3.5.8(typescript@5.2.2)
vue: 3.5.12(typescript@5.2.2)
dev: false
/vite-bundle-analyzer@0.9.4:
@ -8429,20 +8445,34 @@ packages:
- terser
dev: true
/vooks@0.2.12(vue@3.5.8):
/vooks@0.2.12(vue@3.5.12):
resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==}
peerDependencies:
vue: ^3.0.0
dependencies:
evtd: 0.2.4
vue: 3.5.8(typescript@5.2.2)
vue: 3.5.12(typescript@5.2.2)
dev: false
/vue-component-type-helpers@1.8.26:
resolution: {integrity: sha512-CIwb7s8cqUuPpHDk+0DY8EJ/x8tzdzqw8ycX8hhw1GnbngTgSsIceHAqrrLjmv8zXi+j5XaiqYRQMw8sKyyjkw==}
dev: true
/vue-demi@0.14.6(vue@3.5.8):
/vue-demi@0.14.10(vue@3.5.12):
resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
peerDependencies:
'@vue/composition-api': ^1.0.0-rc.1
vue: ^3.0.0-0 || ^2.6.0
peerDependenciesMeta:
'@vue/composition-api':
optional: true
dependencies:
vue: 3.5.12(typescript@5.2.2)
/vue-demi@0.14.6(vue@3.5.12):
resolution: {integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==}
engines: {node: '>=12'}
hasBin: true
@ -8454,23 +8484,9 @@ packages:
'@vue/composition-api':
optional: true
dependencies:
vue: 3.5.8(typescript@5.2.2)
vue: 3.5.12(typescript@5.2.2)
dev: false
/vue-demi@0.14.7(vue@3.5.8):
resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
peerDependencies:
'@vue/composition-api': ^1.0.0-rc.1
vue: ^3.0.0-0 || ^2.6.0
peerDependenciesMeta:
'@vue/composition-api':
optional: true
dependencies:
vue: 3.5.8(typescript@5.2.2)
/vue-eslint-parser@9.3.2(eslint@8.57.0):
resolution: {integrity: sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==}
engines: {node: ^14.17.0 || >=16.0.0}
@ -8507,7 +8523,7 @@ packages:
- supports-color
dev: true
/vue-hooks-plus@2.2.1(vue@3.5.8):
/vue-hooks-plus@2.2.1(vue@3.5.12):
resolution: {integrity: sha512-YfZ+xwzeoTXpuXrCwu4zOe2kmc3hcOxD3eY9eoc5r+T8grCMQl25li0W9o8uY1/UA75sgLcE6B7KfKd2e3OURg==}
peerDependencies:
vue: ^3.2.25
@ -8519,10 +8535,10 @@ packages:
qs: 6.12.1
query-string: 7.1.3
screenfull: 5.2.0
vue: 3.5.8(typescript@5.2.2)
vue: 3.5.12(typescript@5.2.2)
dev: false
/vue-i18n@9.13.1(vue@3.5.8):
/vue-i18n@9.13.1(vue@3.5.12):
resolution: {integrity: sha512-mh0GIxx0wPtPlcB1q4k277y0iKgo25xmDPWioVVYanjPufDBpvu5ySTjP5wOrSvlYQ2m1xI+CFhGdauv/61uQg==}
engines: {node: '>= 16'}
peerDependencies:
@ -8531,15 +8547,15 @@ packages:
'@intlify/core-base': 9.13.1
'@intlify/shared': 9.13.1
'@vue/devtools-api': 6.6.1
vue: 3.5.8(typescript@5.2.2)
vue: 3.5.12(typescript@5.2.2)
/vue-router@4.3.2(vue@3.5.8):
/vue-router@4.3.2(vue@3.5.12):
resolution: {integrity: sha512-hKQJ1vDAZ5LVkKEnHhmm1f9pMiWIBNGF5AwU67PdH7TyXCj/a4hTccuUuYCAMgJK6rO/NVYtQIEN3yL8CECa7Q==}
peerDependencies:
vue: ^3.2.0
dependencies:
'@vue/devtools-api': 6.6.1
vue: 3.5.8(typescript@5.2.2)
vue: 3.5.12(typescript@5.2.2)
dev: false
/vue-template-compiler@2.7.16:
@ -8565,39 +8581,39 @@ packages:
resolution: {integrity: sha512-YwdQ1YjbHzcUsA7Vj5ziQLoX7oQZGWDZNaAadLu7EZzV9UU8Dd2IXAxGobF7dIHamgz5mPiOgH1Xb3qO8bCGDA==}
dependencies:
js-binary-schema-parser: 2.0.3
vue: 3.5.8(typescript@5.2.2)
vue: 3.5.12(typescript@5.2.2)
transitivePeerDependencies:
- typescript
dev: false
/vue@3.5.8(typescript@5.2.2):
resolution: {integrity: sha512-hvuvuCy51nP/1fSRvrrIqTLSvrSyz2Pq+KQ8S8SXCxTWVE0nMaOnSDnSOxV1eYmGfvK7mqiwvd1C59CEEz7dAQ==}
/vue@3.5.12(typescript@5.2.2):
resolution: {integrity: sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
dependencies:
'@vue/compiler-dom': 3.5.8
'@vue/compiler-sfc': 3.5.8
'@vue/runtime-dom': 3.5.8
'@vue/server-renderer': 3.5.8(vue@3.5.8)
'@vue/shared': 3.5.8
'@vue/compiler-dom': 3.5.12
'@vue/compiler-sfc': 3.5.12
'@vue/runtime-dom': 3.5.12
'@vue/server-renderer': 3.5.12(vue@3.5.12)
'@vue/shared': 3.5.12
typescript: 5.2.2
/vueuc@0.4.58(vue@3.5.8):
resolution: {integrity: sha512-Wnj/N8WbPRSxSt+9ji1jtDHPzda5h2OH/0sFBhvdxDRuyCZbjGg3/cKMaKqEoe+dErTexG2R+i6Q8S/Toq1MYg==}
/vueuc@0.4.64(vue@3.5.12):
resolution: {integrity: sha512-wlJQj7fIwKK2pOEoOq4Aro8JdPOGpX8aWQhV8YkTW9OgWD2uj2O8ANzvSsIGjx7LTOc7QbS7sXdxHi6XvRnHPA==}
peerDependencies:
vue: ^3.0.11
dependencies:
'@css-render/vue3-ssr': 0.15.14(vue@3.5.8)
'@css-render/vue3-ssr': 0.15.14(vue@3.5.12)
'@juggle/resize-observer': 3.4.0
css-render: 0.15.14
evtd: 0.2.4
seemly: 0.3.8
vdirs: 0.1.8(vue@3.5.8)
vooks: 0.2.12(vue@3.5.8)
vue: 3.5.8(typescript@5.2.2)
vdirs: 0.1.8(vue@3.5.12)
vooks: 0.2.12(vue@3.5.12)
vue: 3.5.12(typescript@5.2.2)
dev: false
/webidl-conversions@7.0.0:

View File

@ -43,29 +43,27 @@ export default defineComponent({
})
const collapseClick = () => {
const { onUpdateValue, 'onUpdate:value': _onUpdateValue } = props
const { onUpdateOpen, 'onUpdate:open': _onUpdateOpen } = props
modelCollapsed.value = !modelCollapsed.value
if (onUpdateValue) {
call(onUpdateValue, modelCollapsed.value)
if (onUpdateOpen) {
call(onUpdateOpen, modelCollapsed.value)
}
if (_onUpdateValue) {
call(_onUpdateValue, modelCollapsed.value)
if (_onUpdateOpen) {
call(_onUpdateOpen, modelCollapsed.value)
}
}
const CollapseIcon = () => (
const CollapseIcon = (collapse: boolean) => (
<div class="collapse-icon" onClick={collapseClick.bind(this)}>
<span>
{modelCollapsed.value
? props.collapseToggleText[0]
: props.collapseToggleText[1]}
{collapse ? props.collapseToggleText[0] : props.collapseToggleText[1]}
</span>
<RIcon
customClassName={`collapse-icon--arrow ${
modelCollapsed.value ? '' : 'collapse-icon--arrow__expanded'
collapse ? '' : 'collapse-icon--arrow__expanded'
}`}
name="expanded"
size="14"
@ -73,6 +71,10 @@ export default defineComponent({
</div>
)
watchEffect(() => {
modelCollapsed.value = !props.open
})
return {
modelCollapsed,
collapseClick,
@ -108,7 +110,9 @@ export default defineComponent({
<NGridItem suffix class="ray-collapse-grid__suffix--btn">
<NFlex justify="end" align="center">
{action?.()}
{collapse ? collapse(modelCollapsed) : CollapseIcon()}
{collapse
? collapse(modelCollapsed)
: CollapseIcon(modelCollapsed)}
</NFlex>
</NGridItem>
</NGrid>

View File

@ -48,13 +48,13 @@ const props = {
* `false`
*/
type: Boolean,
default: false,
default: true,
},
onUpdateValue: {
onUpdateOpen: {
type: [Function, Array] as PropType<MaybeArray<(bool: boolean) => void>>,
default: null,
},
'onUpdate:value': {
'onUpdate:open': {
type: [Function, Array] as PropType<MaybeArray<(bool: boolean) => void>>,
default: null,
},

View File

@ -149,11 +149,22 @@ const props = {
*
*
*
* @default false
* @default true
*/
wrapperBordered: {
type: Boolean,
default: false,
default: true,
},
/**
*
* @description
*
*
* @default true
*/
bordered: {
type: Boolean,
default: true,
},
/**
*

View File

@ -53,7 +53,8 @@ export const useMaximize = () => {
*
* @param full
*
* LayoutContent layoutContentMaximize
* @description
* LayoutContent layoutContentMaximize
*
* @example
* maximize(true, { MaximizeOptions })

View File

@ -1,15 +1,4 @@
/**
*
* @author Ray <https://github.com/XiaoDaiGua-Ray>
*
* @date 2023-12-04
*
* @workspace ray-template
*
* @remark
*/
import { unrefElement, effectDispose, isValueType } from '@/utils'
import { unrefElement, effectDispose, isValueType, setStyle } from '@/utils'
import { useWindowSize } from '@vueuse/core'
import type { BasicTarget } from '@/types'
@ -18,41 +7,56 @@ import type { CSSProperties } from 'vue'
export interface UseElementFullscreenOptions {
/**
*
*
* @description
*
*
* @default undefined
*/
beforeEnter?: () => void
/**
*
*
* @description
*
*
* @default undefined
*/
enter?: () => void
/**
*
* 退
* @description
* 退
*
* @default undefined
*/
beforeExit?: () => void
/**
*
* 退
* @description
* 退
*
* @default undefined
*/
exit?: () => void
/**
*
* z-index
* @description
* z-index
*
* @default 999
*/
zIndex?: number
/**
*
*
* @description
*
*
* @default null
*/
backgroundColor?: string
/**
*
* transition
* @description
* transition
*
* @default 'width 0.3s var(--r-bezier), height 0.3s var(--r-bezier)'
*/
@ -70,10 +74,11 @@ const styleElement = document.createElement('style')
* @param target target dom
* @param options useElementFullscreen options
*
* 使 API使 css
* transition
* @description
* 使 API使 css
* transition
*
* positionz-indextransitiontransformwidthheight
* positionz-indextransitiontransformwidthheight
*
* @example
* <template>
@ -102,6 +107,13 @@ export const useElementFullscreen = (
transition = 'all 0.3s var(--r-bezier)',
} = options ?? {}
let isSetup = false
const catchBoundingClientRect: {
x: number | null
y: number | null
} = {
x: null,
y: null,
}
const updateStyle = () => {
const element = unrefElement(target) as HTMLElement | null
@ -111,20 +123,38 @@ export const useElementFullscreen = (
}
const { left, top } = element.getBoundingClientRect()
const cssContent = `
[${ID_TAG}] {
position: fixed;
width: ${width.value}px !important;
height: ${height.value}px !important;
transform: translate(-${left}px, -${top}px) !important;
transition: ${transition};
z-index: ${
if (
catchBoundingClientRect.x === null &&
catchBoundingClientRect.y === null
) {
catchBoundingClientRect.x = -left
catchBoundingClientRect.y = -top
}
setStyle(document.body, {
'--element-fullscreen-z-index':
isValueType<null>(zIndex, 'Null') ||
isValueType<undefined>(zIndex, 'Undefined')
? currentZIndex
: zIndex
} !important;
background-color: ${backgroundColor ?? null};
: zIndex,
'--element-fullscreen-transition': transition,
'--element-fullscreen-background-color': backgroundColor,
'--element-fullscreen-width': `${width.value}px`,
'--element-fullscreen-height': `${height.value}px`,
'--element-fullscreen-transform-x': `${catchBoundingClientRect.x}px`,
'--element-fullscreen-transform-y': `${catchBoundingClientRect.y}px`,
})
const cssContent = `
[${ID_TAG}] {
position: fixed;
width: var(--element-fullscreen-width) !important;
height: var(--element-fullscreen-height) !important;
transform: translate(var(--element-fullscreen-transform-x), var(--element-fullscreen-transform-y)) !important;
transition: var(--element-fullscreen-transition);
z-index: var(--element-fullscreen-z-index) !important;
background-color: var(--element-fullscreen-background-color);
}
`
@ -206,6 +236,10 @@ export const useElementFullscreen = (
enter,
exit,
toggleFullscreen,
currentWindowSize: {
width,
height,
},
}
}

View File

@ -11,6 +11,7 @@
/**
*
* @description
* :
* - 关闭全部: 关闭所有标签页 rootRoute.path
* - 关闭右侧: 关闭右侧所有标签
@ -18,15 +19,15 @@
* - 关闭其他: 关闭其他所有标签
* - 关闭所有: 关闭所有标签页 root page
*
* root path
* key tag
* root path
* key tag
*
* MENU_TAG_DATA MenuTag
* MENU_TAG_DATA MenuTag
*
* Root Path MenuTag Root Tag
* Root Path MenuTag Root Tag
*
* outsideClick contextmenu
* 使 throttle
* outsideClick contextmenu
* 使 throttle
*/
import './index.scss'
@ -49,6 +50,7 @@ import { hasClass, uuid, queryElements } from '@/utils'
import { useMaximize, useSpinning, useAppRoot, useSiderBar } from '@/hooks'
import { throttle } from 'lodash-es'
import { getVariableToRefs } from '@/global-variable'
import { useTemplateRef } from 'vue'
import type { ScrollbarInst } from 'naive-ui'
import type { MenuTagOptions, AppMenuOption } from '@/types'
@ -56,12 +58,11 @@ import type { MenuTagOptions, AppMenuOption } from '@/types'
export default defineComponent({
name: 'AppMenuTag',
setup(_, { expose }) {
const scrollRef = ref<ScrollbarInst | null>(null)
const scrollRef = useTemplateRef<ScrollbarInst | null>('scrollRef')
const { getMenuKey, getMenuTagOptions } = useMenuGetters()
const { changeMenuModelValue } = useMenuActions()
const { getRootPath } = useAppRoot()
const { maximize } = useMaximize()
const { maximize, isLayoutContentMaximized } = useMaximize()
const { reload } = useSpinning()
const {
close,
@ -72,18 +73,20 @@ export default defineComponent({
checkCloseLeft,
checkCloseRight,
} = useSiderBar()
// 哪些下拉框允许禁用
const canDisabledOptions = [
'closeAll',
'closeRight',
'closeLeft',
'closeOther',
'closeCurrentPage',
] // 哪些下拉框允许禁用
let currentContextmenuIndex = Infinity // 当前右键标签页索引位置
]
// 当前右键标签页索引位置
let currentContextmenuIndex = Infinity
const iconConfig = {
size: 16,
}
// 下拉菜单
const moreOptions = ref([
{
label: '刷新页面',
@ -124,8 +127,9 @@ export default defineComponent({
icon: () => <RIcon name="resize_h" size={iconConfig.size} />,
disabled: false,
},
]) // 下拉菜单
const uuidScrollBar = uuid(16) // scroll bar uuid
])
// scroll bar uuid
const uuidScrollBar = uuid(16)
const actionMap = {
closeCurrentPage: () => {
getMenuKey.value !== getRootPath.value && close(currentContextmenuIndex)
@ -146,53 +150,47 @@ export default defineComponent({
$closeOther(currentContextmenuIndex)
},
}
/** 右键菜单 */
// 右键菜单
const actionState = reactive({
x: 0,
y: 0,
actionDropdownShow: false,
})
const MENU_TAG_DATA = 'menu_tag_data' // 注入 tag 前缀
// 注入 tag 前缀
const MENU_TAG_DATA = 'menu_tag_data'
const globalMainLayoutLoad = getVariableToRefs('globalMainLayoutLoad')
const naiveScrollbarContainerClass = 'n-scrollbar-container' // naive scrollbar 容器 class
// naive scrollbar 容器 class
const naiveScrollbarContainerClass = 'n-scrollbar-container'
// 缓存上一次的菜单 key
let catchMenuKey = getMenuKey.value
/**
*
* @param idx
*
* @remark `tag` ,
*/
// 关闭当前菜单标签,如果只有一个标签,则不允许关闭
const closeCurrentMenuTag = (idx: number) => {
close(idx)
}
// 动态设置右键菜单的禁用项
const setMoreOptionsDisabled = (
key: (typeof moreOptions.value)[number]['key'],
disabled: boolean,
) => {
moreOptions.value.forEach((curr) => {
for (const curr of moreOptions.value) {
if (curr.key === key) {
curr.disabled = disabled
return
break
}
}
})
}
/**
*
* @param option
*/
// 菜单标签点击更新当前菜单激活项
const menuTagClick = (option: AppMenuOption) => {
actionState.actionDropdownShow = false
changeMenuModelValue(option.fullPath, option)
}
/**
*
*
*/
// 获取滚动条容器
const getScrollElement = () => {
const scroll = document.getElementById(uuidScrollBar) // 获取滚动条容器
@ -208,25 +206,15 @@ export default defineComponent({
return findElement
}
return
}
/**
*
* @param type
*
*
*/
// 手动滚动容器
const scrollX = (type: 'left' | 'right') => {
const el = getScrollElement()
if (el) {
/**
*
* (class: n-scrollbar-container)
* scrollLeft ,
*/
// 找到实际横向滚动元素classn-scrollbar-container
// 获取 scrollLeft 属性后, 用于左右滚动边界值进行处理
const scrollX = el!.scrollLeft || 0
const rolling =
type === 'left' ? Math.max(0, scrollX - 200) : scrollX + 200
@ -238,23 +226,17 @@ export default defineComponent({
}
}
/** 更多操作操作栏 */
// 更多操作操作栏
const actionDropdownSelect = (key: string | number) => {
actionState.actionDropdownShow = false
const fn = actionMap[key as keyof typeof actionMap]
if (fn) {
fn()
}
fn?.()
}
/**
*
*
*
* ()
*/
// 右键点击标签页
// 缓存当前点击标签页索引值(用于关闭左或者右侧标签页操作)
const menuTagContextMenu = (idx: number, e: MouseEvent) => {
e.preventDefault()
@ -268,10 +250,7 @@ export default defineComponent({
})
}
/**
*
*
*/
// 动态设置某些项禁用
const setDisabledAccordionToIndex = () => {
const { closeable } =
getMenuTagOptions.value[currentContextmenuIndex] ??
@ -291,12 +270,8 @@ export default defineComponent({
: setMoreOptionsDisabled('closeLeft', true)
}
/**
*
* , currentContextmenuIndex
*
*
*/
// 如果通过更多按钮触发关闭事件,则根据当前标签所在索引值为 currentContextmenuIndex
// 并且动态设置是否可操作状态
const setCurrentContextmenuIndex = () => {
const index = getMenuTagOptions.value.findIndex(
(curr) => curr.fullPath === getMenuKey.value,
@ -307,7 +282,7 @@ export default defineComponent({
setDisabledAccordionToIndex()
}
/** 仅有 getMenuTagOptions 长度大于 1 并且非 root path 时, 才激活关闭按钮 */
// 仅有 getMenuTagOptions 长度大于 1 并且非 root path 时,才激活关闭按钮
const menuTagMouseenter = (option: MenuTagOptions) => {
if (
getMenuTagOptions.value.length > 1 &&
@ -317,18 +292,14 @@ export default defineComponent({
}
}
/** 移出 MenuTag 时, 判断是否为当前已激活 key */
// 移出 MenuTag 时,判断是否为当前已激活 key
const menuTagMouseleave = (option: MenuTagOptions) => {
if (option.fullPath !== getMenuKey.value) {
option.closeable = false
}
}
/**
*
* ,
* 使 nextTick
*/
// 每当新的页面打开后,将滚动条横向滚到至底部,使用 nextTick 避免元素未渲染挂载至页面
const updateScrollBarPosition = () => {
const el = getScrollElement()
@ -342,7 +313,7 @@ export default defineComponent({
}
}
/** 动态更新 menu tag 所在位置 */
// 动态更新 menu tag 所在位置
const positionMenuTag = () => {
nextTick().then(() => {
const tags = queryElements<HTMLElement>(
@ -362,7 +333,11 @@ export default defineComponent({
})
}
/** 如果有且只有一个标签页时, 禁止全部关闭操作 */
// 最大化内容区域按钮点击
const maximizeBtnClick = () => {
maximize(true)
}
watch(
() => getMenuTagOptions.value,
(ndata, odata) => {
@ -391,16 +366,18 @@ export default defineComponent({
immediate: true,
},
)
/** 动态设置关闭按钮是否可操作 */
watch(
() => actionState.actionDropdownShow,
(ndata) => {
watchEffect(() => {
if (actionState.actionDropdownShow) {
// 使用节流函数,避免右键菜单闪烁问题
if (ndata) {
throttle(setDisabledAccordionToIndex, 100)?.()
throttle(setDisabledAccordionToIndex, 300)?.()
}
},
)
if (catchMenuKey !== getMenuKey.value) {
catchMenuKey = getMenuKey.value
positionMenuTag()
}
})
expose({})
@ -425,22 +402,21 @@ export default defineComponent({
height: 22,
},
maximize,
getRootPath,
reload,
globalMainLayoutLoad,
maximizeBtnClick,
}
},
render() {
const {
iconConfig,
getRootPath,
uuidScrollBar,
getMenuTagOptions,
MENU_TAG_DATA,
globalMainLayoutLoad,
} = this
const {
maximize,
maximizeBtnClick,
closeCurrentMenuTag,
scrollX,
$t,
@ -496,7 +472,6 @@ export default defineComponent({
}}
>
<NFlex
ref="menuTagSpaceRef"
class="menu-tag-wrapper"
wrap={false}
align="center"
@ -516,7 +491,7 @@ export default defineComponent({
onContextmenu: menuTagContextMenu.bind(this, idx),
onMouseenter: menuTagMouseenter.bind(this, curr),
onMouseleave: menuTagMouseleave.bind(this, curr),
[MENU_TAG_DATA]: curr.path,
[MENU_TAG_DATA]: curr.fullPath,
}}
size="small"
>
@ -535,29 +510,14 @@ export default defineComponent({
},
}}
</span>
{(curr.closeable || getMenuTagOptions.length === 1) &&
curr.fullPath !== getRootPath ? (
<NIcon
class="menu-tag__btn-icon"
{...{
onMousedown: closeCurrentMenuTag.bind(
this,
idx,
),
onMousedown: closeCurrentMenuTag.bind(this, idx),
}}
>
<RIcon name="close" size="14" />
</NIcon>
) : (
// 默认使用一个空 NIcon 占位,避免不能正确的触发动画
<NIcon
class={[
curr.fullPath !== getRootPath
? 'menu-tag__btn-icon'
: 'menu-tag__btn-icon--hidden',
]}
/>
)}
</>
),
}}
@ -584,9 +544,7 @@ export default defineComponent({
width={iconConfig.width}
height={iconConfig.height}
customClassName="menu-tag__right-setting"
onClick={() => {
maximize(true)
}}
onClick={maximizeBtnClick}
/>
<RIcon
name="reload"

View File

@ -1,15 +1,4 @@
/**
*
* @author Ray <https://github.com/XiaoDaiGua-Ray>
*
* @date 2023-06-02
*
* @workspace ray-template
*
* @remark
*/
import { useElementBounding } from '@vueuse/core'
import { useElementBounding, useWindowSize } from '@vueuse/core'
import type { Ref } from 'vue'
@ -29,10 +18,14 @@ export const layoutCssVars = (
const siderBar = useElementBounding(element[0])
const menuTag = useElementBounding(element[1])
const footer = useElementBounding(element[2])
const { height, width } = useWindowSize()
return computed(() => {
return {
'--layout-content-height': `calc(100% - ${siderBar.height.value}px - ${menuTag.height.value}px - ${footer.height.value}px)`,
'--window-width': `${width.value}px`,
'--window-height': `${height.value}px`,
'--layout-content-height': `calc(${height.value}px - ${siderBar.height.value}px - ${menuTag.height.value}px - ${footer.height.value}px)`,
'--layout-content-width': `${siderBar.width.value}px`,
'--layout-siderbar-height': `${siderBar.height.value}px`,
'--layout-menutag-height': `${menuTag.height.value}px`,
'--layout-footer-height': `${footer.height.value}px`,

View File

@ -27,10 +27,11 @@ export const useSigningGetters = () => {
}
export const useSigningActions = () => {
const { signing, logout } = piniaSigningStore()
const { signing, logout, clearSigningCallback } = piniaSigningStore()
return {
signing,
logout,
clearSigningCallback,
}
}

View File

@ -308,6 +308,15 @@ export const piniaMenuStore = defineStore(
// 直接使用完整 url检查是否在 routes 中
const findMenuOption = getRoutes().find((curr) => curr.path === routePath)
// 避免匹配根页面路由
if (
findMenuOption?.path === '/' ||
!findMenuOption?.path ||
findMenuOption?.path === '/login'
) {
return
}
if (findMenuOption) {
// 使用 pick 提取仅需要的字段,避免 vue 抛错空引用,导致性能损耗
const pickOption = pick(

View File

@ -75,30 +75,58 @@ export const piniaSigningStore = defineStore(
/**
*
* 退
* 300ms
* @param toSigning 退
*
* @description
*
* toSigning true
*/
const logout = () => {
const clearSigningCallback = (toSigning: boolean) => {
const { closeAll } = useSiderBar()
const { appPiniaMenuStore, appPiniaSigningStore } = APP_CATCH_KEY
const {
appPiniaMenuStore,
appPiniaSigningStore,
token,
signing,
appMenuKey,
} = APP_CATCH_KEY
// 提示信息
window.$message.info('账号退出中...')
// 移除所有 sessionStorage 缓存
removeStorage('__all_sessionStorage__', 'sessionStorage')
// 移除指定 localStorage 缓存
removeStorage(appPiniaMenuStore, 'localStorage')
removeStorage(appPiniaSigningStore, 'localStorage')
removeStorage(appPiniaMenuStore, 'localStorage')
removeStorage(token, 'localStorage')
removeStorage(signing, 'localStorage')
removeStorage(appMenuKey, 'localStorage')
// 关闭所有侧边栏标签
closeAll()
// 延迟 300ms 后强制刷新当前系统
setTimeout(() => window.location.reload())
if (toSigning) {
window.location.replace('#/')
setTimeout(() => {
window.location.reload()
}, 0)
}
}
/**
*
* 退
* 300ms
*/
const logout = () => {
clearSigningCallback(true)
}
return {
...toRefs(state),
signing,
logout,
clearSigningCallback,
}
},
{

View File

@ -40,6 +40,7 @@ export interface AppPrimaryColor {
}
export interface Config {
cdn: boolean
server: ServerOptions
buildOptions: (mode: string) => BuildOptions
alias: AliasOptions

View File

@ -49,11 +49,13 @@ import type { AppConfigExport } from '@/types'
import type { BuildOptions } from 'vite'
const config: AppConfigExport = {
/** 公共基础路径配置, 如果为空则会默认以 '/' 填充 */
// 是否启用 cdn 构建项目
cdn: false,
// 公共基础路径配置, 如果为空则会默认以 '/' 填充
base: '/ray-template/',
/** 配置首屏加载信息 */
// 配置首屏加载信息
preloadingConfig: PRE_LOADING_CONFIG,
/** 默认主题色(不可省略, 必填), 也用于 ejs 注入 */
// 默认主题色(不可省略,必填),也用于 ejs 注入
appPrimaryColor: APP_THEME.appPrimaryColor,
sideBarLogo: SIDE_BAR_LOGO_DEFAULT,
/**
@ -79,10 +81,7 @@ const config: AppConfigExport = {
*
*/
title: htmlTitlePlugin(PRE_LOADING_CONFIG.title || 'Ray Template'),
/**
*
* HMR ()
*/
// 配置 HMR 特定选项(端口、主机、路径和协议)
server: {
host: '0.0.0.0',
port: 9527,
@ -100,10 +99,7 @@ const config: AppConfigExport = {
},
},
},
/**
*
*
*/
// 打包相关配置
buildOptions: (mode: string): BuildOptions => {
const productionBuildOptions = {
sourcemap: false,

View File

@ -55,11 +55,14 @@ function onlyReportOptions(mode: string): PluginOption[] {
// 仅适用于构建模式任何构建模式preview、build、report...
function onlyBuildOptions(mode: string): PluginOption[] {
const { cdn } = config
return [
viteCDNPlugin({
// modules 顺序 vue, vue-demi 必须保持当前顺序加载,否则会出现加载错误问题
resolve: cdnResolve(),
modules: [
modules: cdn
? [
{
name: 'vue',
global: 'Vue',
@ -122,7 +125,8 @@ function onlyBuildOptions(mode: string): PluginOption[] {
global: 'printJS',
relativeModule: 'print.min.js',
},
],
]
: [],
}),
]
}