提交 09ed5c22 authored 作者: yanyalin's avatar yanyalin

页面调整

上级 96121ad7
{
"globals": {
"Component": true,
"ComponentPublicInstance": true,
"ComputedRef": true,
"EffectScope": true,
"ExtractDefaultPropTypes": true,
"ExtractPropTypes": true,
"ExtractPublicPropTypes": true,
"InjectionKey": true,
"PropType": true,
"Ref": true,
"VNode": true,
"WritableComputedRef": true,
"acceptHMRUpdate": true,
"computed": true,
"createApp": true,
"createPinia": true,
"customRef": true,
"defineAsyncComponent": true,
"defineComponent": true,
"defineStore": true,
"effectScope": true,
"getActivePinia": true,
"getCurrentInstance": true,
"getCurrentScope": true,
"h": true,
"inject": true,
"isProxy": true,
"isReactive": true,
"isReadonly": true,
"isRef": true,
"mapActions": true,
"mapGetters": true,
"mapState": true,
"mapStores": true,
"mapWritableState": true,
"markRaw": true,
"nextTick": true,
"onActivated": true,
"onBeforeMount": true,
"onBeforeRouteLeave": true,
"onBeforeRouteUpdate": true,
"onBeforeUnmount": true,
"onBeforeUpdate": true,
"onDeactivated": true,
"onErrorCaptured": true,
"onMounted": true,
"onRenderTracked": true,
"onRenderTriggered": true,
"onScopeDispose": true,
"onServerPrefetch": true,
"onUnmounted": true,
"onUpdated": true,
"provide": true,
"reactive": true,
"readonly": true,
"ref": true,
"resolveComponent": true,
"setActivePinia": true,
"setMapStoreSuffix": true,
"shallowReactive": true,
"shallowReadonly": true,
"shallowRef": true,
"storeToRefs": true,
"toRaw": true,
"toRef": true,
"toRefs": true,
"toValue": true,
"triggerRef": true,
"unref": true,
"useAttrs": true,
"useCssModule": true,
"useCssVars": true,
"useLink": true,
"useMouse": true,
"useMyFetch": true,
"useRoute": true,
"useRouter": true,
"useSlots": true,
"watch": true,
"watchEffect": true,
"watchPostEffect": true,
"watchSyncEffect": true
}
}
......@@ -7,7 +7,8 @@ module.exports = {
'plugin:vue/vue3-essential',
'eslint:recommended',
'@vue/eslint-config-typescript',
'@vue/eslint-config-prettier/skip-formatting'
'@vue/eslint-config-prettier/skip-formatting',
"./.eslintrc-auto-import.json",
],
parserOptions: {
ecmaVersion: 'latest'
......
......@@ -18,6 +18,7 @@
"@logicflow/core": "~1.2.28",
"@logicflow/extension": "~1.2.28",
"@vueuse/core": "^11.0.3",
"ant-design-vue": "^4.2.3",
"axios": "^1.7.7",
"codemirror": "^6.0.1",
"cropperjs": "^1.6.2",
......@@ -37,6 +38,7 @@
"nprogress": "^0.2.0",
"pinia": "^2.1.6",
"pinyin-pro": "^3.18.2",
"qs": "^6.13.0",
"screenfull": "^6.0.2",
"use-element-plus-theme": "^0.0.5",
"vue": "^3.5.4",
......@@ -53,17 +55,24 @@
"@types/lodash": "^4.17.7",
"@types/node": "^18.17.5",
"@types/nprogress": "^0.2.0",
"@vitejs/plugin-vue": "^4.3.1",
"@types/qs": "^6.9.15",
"@vitejs/plugin-vue": "^5.1.3",
"@vitejs/plugin-vue-jsx": "^4.0.1",
"@vue/eslint-config-prettier": "^8.0.0",
"@vue/eslint-config-typescript": "^11.0.3",
"@vue/test-utils": "^2.4.1",
"@vue/tsconfig": "^0.4.0",
"autoprefixer": "^10.4.20",
"eslint": "~8.57.0",
"eslint-plugin-vue": "^9.16.1",
"jsdom": "^22.1.0",
"postcss": "^8.4.45",
"prettier": "^3.0.0",
"sass": "^1.66.1",
"tailwindcss": "^3.4.11",
"typescript": "~5.6.2",
"unplugin-auto-import": "^0.18.3",
"unplugin-vue-components": "^0.27.4",
"vite": "^5.4.4",
"vite-plugin-vue-devtools": "^7.4.5",
"vitest": "^0.34.2",
......
......@@ -15,14 +15,17 @@ importers:
specifier: ^2.3.1
version: 2.3.1(vue@3.5.4(typescript@5.6.2))
'@logicflow/core':
specifier: ^1.2.27
specifier: ~1.2.28
version: 1.2.28
'@logicflow/extension':
specifier: ^1.2.27
specifier: ~1.2.28
version: 1.2.28
'@vueuse/core':
specifier: ^11.0.3
version: 11.0.3(vue@3.5.4(typescript@5.6.2))
ant-design-vue:
specifier: ^4.2.3
version: 4.2.3(vue@3.5.4(typescript@5.6.2))
axios:
specifier: ^1.7.7
version: 1.7.7
......@@ -80,6 +83,9 @@ importers:
pinyin-pro:
specifier: ^3.18.2
version: 3.24.2
qs:
specifier: ^6.13.0
version: 6.13.0
screenfull:
specifier: ^6.0.2
version: 6.0.2
......@@ -123,9 +129,15 @@ importers:
'@types/nprogress':
specifier: ^0.2.0
version: 0.2.3
'@types/qs':
specifier: ^6.9.15
version: 6.9.15
'@vitejs/plugin-vue':
specifier: ^4.3.1
version: 4.6.2(vite@5.4.4(@types/node@18.19.50)(sass@1.78.0))(vue@3.5.4(typescript@5.6.2))
specifier: ^5.1.3
version: 5.1.3(vite@5.4.4(@types/node@18.19.50)(sass@1.78.0))(vue@3.5.4(typescript@5.6.2))
'@vitejs/plugin-vue-jsx':
specifier: ^4.0.1
version: 4.0.1(vite@5.4.4(@types/node@18.19.50)(sass@1.78.0))(vue@3.5.4(typescript@5.6.2))
'@vue/eslint-config-prettier':
specifier: ^8.0.0
version: 8.0.0(eslint@8.57.0)(prettier@3.3.3)
......@@ -138,6 +150,9 @@ importers:
'@vue/tsconfig':
specifier: ^0.4.0
version: 0.4.0
autoprefixer:
specifier: ^10.4.20
version: 10.4.20(postcss@8.4.45)
eslint:
specifier: ~8.57.0
version: 8.57.0
......@@ -147,15 +162,27 @@ importers:
jsdom:
specifier: ^22.1.0
version: 22.1.0
postcss:
specifier: ^8.4.45
version: 8.4.45
prettier:
specifier: ^3.0.0
version: 3.3.3
sass:
specifier: ^1.66.1
version: 1.78.0
tailwindcss:
specifier: ^3.4.11
version: 3.4.11
typescript:
specifier: ~5.6.2
version: 5.6.2
unplugin-auto-import:
specifier: ^0.18.3
version: 0.18.3(@vueuse/core@11.0.3(vue@3.5.4(typescript@5.6.2)))(rollup@4.21.3)
unplugin-vue-components:
specifier: ^0.27.4
version: 0.27.4(@babel/parser@7.25.6)(rollup@4.21.3)(vue@3.5.4(typescript@5.6.2))
vite:
specifier: ^5.4.4
version: 5.4.4(@types/node@18.19.50)(sass@1.78.0)
......@@ -171,10 +198,25 @@ importers:
packages:
'@alloc/quick-lru@5.2.0':
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
'@ampproject/remapping@2.3.0':
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
engines: {node: '>=6.0.0'}
'@ant-design/colors@6.0.0':
resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==}
'@ant-design/icons-svg@4.4.2':
resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==}
'@ant-design/icons-vue@7.0.1':
resolution: {integrity: sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==}
peerDependencies:
vue: '>=3.0.3'
'@antfu/utils@0.7.10':
resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==}
......@@ -378,6 +420,10 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/runtime@7.25.6':
resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==}
engines: {node: '>=6.9.0'}
'@babel/template@7.25.0':
resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==}
engines: {node: '>=6.9.0'}
......@@ -501,6 +547,12 @@ packages:
peerDependencies:
vue: ^3.2.0
'@emotion/hash@0.9.2':
resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==}
'@emotion/unitless@0.8.1':
resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==}
'@esbuild/aix-ppc64@0.21.5':
resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
engines: {node: '>=12'}
......@@ -1130,6 +1182,9 @@ packages:
'@rushstack/ts-command-line@4.19.1':
resolution: {integrity: sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg==}
'@simonwep/pickr@1.8.2':
resolution: {integrity: sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==}
'@sinclair/typebox@0.27.8':
resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
......@@ -1243,6 +1298,9 @@ packages:
'@types/prettier@2.7.3':
resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==}
'@types/qs@6.9.15':
resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==}
'@types/semver@7.5.8':
resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==}
......@@ -1331,11 +1389,18 @@ packages:
'@vavt/util@2.1.0':
resolution: {integrity: sha512-YIfAvArSFVXmWvoF+DEGD0FhkhVNcCtVWWkfYtj76eSrwHh/wuEEFhiEubg1XLNM3tChO8FH8xJCT/hnizjgFQ==}
'@vitejs/plugin-vue@4.6.2':
resolution: {integrity: sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==}
engines: {node: ^14.18.0 || >=16.0.0}
'@vitejs/plugin-vue-jsx@4.0.1':
resolution: {integrity: sha512-7mg9HFGnFHMEwCdB6AY83cVK4A6sCqnrjFYF4WIlebYAQVVJ/sC/CiTruVdrRlhrFoeZ8rlMxY9wYpPTIRhhAg==}
engines: {node: ^18.0.0 || >=20.0.0}
peerDependencies:
vite: ^4.0.0 || ^5.0.0
vite: ^5.0.0
vue: ^3.0.0
'@vitejs/plugin-vue@5.1.3':
resolution: {integrity: sha512-3xbWsKEKXYlmX82aOHufFQVnkbMC/v8fLpWwh6hWOUrK5fbbtBh9Q/WWse27BFgSy2/e2c0fz5Scgya9h2GLhw==}
engines: {node: ^18.0.0 || >=20.0.0}
peerDependencies:
vite: ^5.0.0
vue: ^3.2.25
'@vitest/expect@0.34.6':
......@@ -1539,16 +1604,31 @@ packages:
resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
engines: {node: '>=12'}
ant-design-vue@4.2.3:
resolution: {integrity: sha512-kqGyWvZtFlSInFP93Ow6wS8LzEsxxUgpI+ZY5jQQkuX8WAcqdwXCA7IcHMpECW6JB89DZMo2Bw85jUg2SjlgQA==}
engines: {node: '>=12.22.0'}
peerDependencies:
vue: '>=3.2.0'
any-promise@1.3.0:
resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
anymatch@3.1.3:
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
engines: {node: '>= 8'}
arg@5.0.2:
resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
argparse@1.0.10:
resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
array-tree-filter@2.1.0:
resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==}
array-union@2.1.0:
resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
engines: {node: '>=8'}
......@@ -1562,6 +1642,13 @@ packages:
asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
autoprefixer@10.4.20:
resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==}
engines: {node: ^10 || ^12 || >=14}
hasBin: true
peerDependencies:
postcss: ^8.1.0
axios@1.7.7:
resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==}
......@@ -1635,10 +1722,18 @@ packages:
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
engines: {node: '>=8'}
call-bind@1.0.7:
resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
engines: {node: '>= 0.4'}
callsites@3.1.0:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
camelcase-css@2.0.1:
resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
engines: {node: '>= 6'}
camelcase@5.3.1:
resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
engines: {node: '>=6'}
......@@ -1723,6 +1818,10 @@ packages:
commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
commander@4.1.1:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'}
commander@7.2.0:
resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
engines: {node: '>= 10'}
......@@ -1735,6 +1834,9 @@ packages:
resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==}
engines: {node: ^12.20.0 || >=14}
compute-scroll-into-view@1.0.20:
resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==}
computeds@0.0.1:
resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==}
......@@ -1760,6 +1862,9 @@ packages:
copy-to-clipboard@3.3.3:
resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==}
core-js@3.38.1:
resolution: {integrity: sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==}
cose-base@1.0.3:
resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==}
......@@ -2000,6 +2105,10 @@ packages:
resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==}
engines: {node: '>=18'}
define-data-property@1.1.4:
resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
engines: {node: '>= 0.4'}
define-lazy-prop@3.0.0:
resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
engines: {node: '>=12'}
......@@ -2022,6 +2131,9 @@ packages:
resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
engines: {node: '>=8'}
didyoumean@1.2.2:
resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
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}
......@@ -2038,10 +2150,19 @@ packages:
resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
engines: {node: '>=8'}
dlv@1.1.3:
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
doctrine@3.0.0:
resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
engines: {node: '>=6.0.0'}
dom-align@1.12.4:
resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==}
dom-scroll-into-view@2.0.1:
resolution: {integrity: sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==}
domexception@2.0.1:
resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==}
engines: {node: '>=8'}
......@@ -2097,6 +2218,14 @@ packages:
error-stack-parser-es@0.1.5:
resolution: {integrity: sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==}
es-define-property@1.0.0:
resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
engines: {node: '>= 0.4'}
es-errors@1.3.0:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
esbuild@0.18.20:
resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
engines: {node: '>=12'}
......@@ -2126,6 +2255,10 @@ packages:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
escape-string-regexp@5.0.0:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'}
escodegen@2.1.0:
resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==}
engines: {node: '>=6.0'}
......@@ -2202,6 +2335,9 @@ packages:
estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
estree-walker@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
esutils@2.0.3:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
engines: {node: '>=0.10.0'}
......@@ -2291,6 +2427,9 @@ packages:
resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
engines: {node: '>= 6'}
fraction.js@4.3.7:
resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
fs-extra@11.2.0:
resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==}
engines: {node: '>=14.14'}
......@@ -2321,6 +2460,10 @@ packages:
get-func-name@2.0.2:
resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==}
get-intrinsic@1.2.4:
resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
engines: {node: '>= 0.4'}
get-package-type@0.1.0:
resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
engines: {node: '>=8.0.0'}
......@@ -2364,6 +2507,9 @@ packages:
good-listener@1.2.2:
resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==}
gopd@1.0.1:
resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
......@@ -2378,6 +2524,17 @@ packages:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
has-property-descriptors@1.0.2:
resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
has-proto@1.0.3:
resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
engines: {node: '>= 0.4'}
has-symbols@1.0.3:
resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
engines: {node: '>= 0.4'}
hasown@2.0.2:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
......@@ -2522,6 +2679,10 @@ packages:
resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
engines: {node: '>=8'}
is-plain-object@3.0.1:
resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==}
engines: {node: '>=0.10.0'}
is-potential-custom-element-name@1.0.1:
resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
......@@ -2708,6 +2869,10 @@ packages:
node-notifier:
optional: true
jiti@1.21.6:
resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==}
hasBin: true
jju@1.4.0:
resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==}
......@@ -2723,6 +2888,9 @@ packages:
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
js-tokens@9.0.0:
resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==}
js-yaml@3.14.1:
resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
hasBin: true
......@@ -2809,6 +2977,14 @@ packages:
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
engines: {node: '>= 0.8.0'}
lilconfig@2.1.0:
resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
engines: {node: '>=10'}
lilconfig@3.1.2:
resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==}
engines: {node: '>=14'}
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
......@@ -2819,6 +2995,10 @@ packages:
resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==}
engines: {node: '>=14'}
local-pkg@0.5.0:
resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==}
engines: {node: '>=14'}
locate-path@5.0.0:
resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
engines: {node: '>=8'}
......@@ -2849,6 +3029,10 @@ packages:
lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
loose-envify@1.4.0:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true
loupe@2.3.7:
resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
......@@ -3047,11 +3231,17 @@ packages:
muggle-string@0.3.1:
resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==}
mz@2.7.0:
resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
nanoid@3.3.7:
resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
nanopop@2.4.2:
resolution: {integrity: sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==}
natural-compare-lite@1.4.0:
resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==}
......@@ -3076,6 +3266,10 @@ packages:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
normalize-range@0.1.2:
resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
engines: {node: '>=0.10.0'}
normalize-wheel-es@1.2.0:
resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==}
......@@ -3096,6 +3290,18 @@ packages:
nwsapi@2.2.12:
resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==}
object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
object-hash@3.0.0:
resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
engines: {node: '>= 6'}
object-inspect@1.13.2:
resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==}
engines: {node: '>= 0.4'}
once@1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
......@@ -3202,6 +3408,10 @@ packages:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
pify@2.3.0:
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
engines: {node: '>=0.10.0'}
pinia@2.2.2:
resolution: {integrity: sha512-ja2XqFWZC36mupU4z1ZzxeTApV7DOw44cV4dhQ9sGwun+N89v/XP7+j7q6TanS1u1tdbK4r+1BUx7heMaIdagA==}
peerDependencies:
......@@ -3228,10 +3438,43 @@ packages:
pkg-types@1.2.0:
resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==}
postcss-import@15.1.0:
resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
engines: {node: '>=14.0.0'}
peerDependencies:
postcss: ^8.0.0
postcss-js@4.0.1:
resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
engines: {node: ^12 || ^14 || >= 16}
peerDependencies:
postcss: ^8.4.21
postcss-load-config@4.0.2:
resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
engines: {node: '>= 14'}
peerDependencies:
postcss: '>=8.0.9'
ts-node: '>=9.0.0'
peerDependenciesMeta:
postcss:
optional: true
ts-node:
optional: true
postcss-nested@6.2.0:
resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
engines: {node: '>=12.0'}
peerDependencies:
postcss: ^8.2.14
postcss-selector-parser@6.1.2:
resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
engines: {node: '>=4'}
postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
postcss@8.4.45:
resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==}
engines: {node: ^10 || ^12 || >=14}
......@@ -3281,6 +3524,10 @@ packages:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
qs@6.13.0:
resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
engines: {node: '>=0.6'}
querystringify@2.2.0:
resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
......@@ -3293,10 +3540,16 @@ packages:
react-is@18.3.1:
resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
read-cache@1.0.0:
resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
readdirp@3.6.0:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'}
regenerator-runtime@0.14.1:
resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
require-directory@2.1.1:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'}
......@@ -3304,6 +3557,9 @@ packages:
requires-port@1.0.0:
resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
resize-observer-polyfill@1.5.1:
resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==}
resolve-cwd@3.0.0:
resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
engines: {node: '>=8'}
......@@ -3389,6 +3645,12 @@ packages:
resolution: {integrity: sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==}
engines: {node: ^14.13.1 || >=16.0.0}
scroll-into-view-if-needed@2.2.31:
resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==}
scule@1.3.0:
resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==}
select@1.1.2:
resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==}
......@@ -3406,6 +3668,13 @@ packages:
engines: {node: '>=10'}
hasBin: true
set-function-length@1.2.2:
resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
engines: {node: '>= 0.4'}
shallow-equal@1.2.1:
resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==}
shebang-command@2.0.0:
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
engines: {node: '>=8'}
......@@ -3414,6 +3683,10 @@ packages:
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
engines: {node: '>=8'}
side-channel@1.0.6:
resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
engines: {node: '>= 0.4'}
siginfo@2.0.0:
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
......@@ -3510,12 +3783,20 @@ packages:
strip-literal@1.3.0:
resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==}
strip-literal@2.1.0:
resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==}
style-mod@4.1.2:
resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==}
stylis@4.3.4:
resolution: {integrity: sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==}
sucrase@3.35.0:
resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
engines: {node: '>=16 || 14 >=14.17'}
hasBin: true
superjson@2.2.1:
resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==}
engines: {node: '>=16'}
......@@ -3550,6 +3831,11 @@ packages:
resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==}
engines: {node: ^14.18.0 || >=16.0.0}
tailwindcss@3.4.11:
resolution: {integrity: sha512-qhEuBcLemjSJk5ajccN9xJFtM/h0AVCPaA6C92jNP+M2J8kX+eMJHI7R2HFKUvvAsMpcfLILMCFYSeDwpMmlUg==}
engines: {node: '>=14.0.0'}
hasBin: true
terminal-link@2.1.1:
resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==}
engines: {node: '>=8'}
......@@ -3561,9 +3847,20 @@ packages:
text-table@0.2.0:
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
thenify-all@1.6.0:
resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
engines: {node: '>=0.8'}
thenify@3.3.1:
resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
throat@6.0.2:
resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==}
throttle-debounce@5.0.2:
resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==}
engines: {node: '>=12.22'}
tiny-emitter@2.1.0:
resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==}
......@@ -3612,6 +3909,9 @@ packages:
resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==}
engines: {node: '>=6.10'}
ts-interface-checker@0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
tslib@1.14.1:
resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
......@@ -3669,6 +3969,9 @@ packages:
undici-types@5.26.5:
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
unimport@3.12.0:
resolution: {integrity: sha512-5y8dSvNvyevsnw4TBQkIQR1Rjdbb+XjVSwQwxltpnVZrStBvvPkMPcZrh1kg5kY77kpx6+D4Ztd3W6FOBH/y2Q==}
unist-util-stringify-position@3.0.3:
resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==}
......@@ -3684,6 +3987,40 @@ packages:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'}
unplugin-auto-import@0.18.3:
resolution: {integrity: sha512-q3FUtGQjYA2e+kb1WumyiQMjHM27MrTQ05QfVwtLRVhyYe+KF6TblBYaEX9L6Z0EibsqaXAiW+RFfkcQpfaXzg==}
engines: {node: '>=14'}
peerDependencies:
'@nuxt/kit': ^3.2.2
'@vueuse/core': '*'
peerDependenciesMeta:
'@nuxt/kit':
optional: true
'@vueuse/core':
optional: true
unplugin-vue-components@0.27.4:
resolution: {integrity: sha512-1XVl5iXG7P1UrOMnaj2ogYa5YTq8aoh5jwDPQhemwO/OrXW+lPQKDXd1hMz15qxQPxgb/XXlbgo3HQ2rLEbmXQ==}
engines: {node: '>=14'}
peerDependencies:
'@babel/parser': ^7.15.8
'@nuxt/kit': ^3.2.2
vue: 2 || 3
peerDependenciesMeta:
'@babel/parser':
optional: true
'@nuxt/kit':
optional: true
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
update-browserslist-db@1.1.0:
resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==}
hasBin: true
......@@ -3899,6 +4236,12 @@ packages:
peerDependencies:
typescript: '*'
vue-types@3.0.2:
resolution: {integrity: sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==}
engines: {node: '>=10.15.0'}
peerDependencies:
vue: ^3.0.0
vue@3.5.4:
resolution: {integrity: sha512-3yAj2gkmiY+i7+22A1PWM+kjOVXjU74UPINcTiN7grIVPyFFI0lpGwHlV/4xydDmobaBn7/xmi+YG8HeSlCTcg==}
peerDependencies:
......@@ -3925,6 +4268,9 @@ packages:
walker@1.0.8:
resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
warning@4.0.3:
resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==}
web-worker@1.3.0:
resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==}
......@@ -3940,6 +4286,9 @@ packages:
resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
engines: {node: '>=12'}
webpack-virtual-modules@0.6.2:
resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
whatwg-encoding@1.0.5:
resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==}
......@@ -4039,6 +4388,11 @@ packages:
yallist@4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
yaml@2.5.1:
resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==}
engines: {node: '>= 14'}
hasBin: true
yargs-parser@20.2.9:
resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
engines: {node: '>=10'}
......@@ -4065,11 +4419,25 @@ packages:
snapshots:
'@alloc/quick-lru@5.2.0': {}
'@ampproject/remapping@2.3.0':
dependencies:
'@jridgewell/gen-mapping': 0.3.5
'@jridgewell/trace-mapping': 0.3.25
'@ant-design/colors@6.0.0':
dependencies:
'@ctrl/tinycolor': 3.6.1
'@ant-design/icons-svg@4.4.2': {}
'@ant-design/icons-vue@7.0.1(vue@3.5.4(typescript@5.6.2))':
dependencies:
'@ant-design/colors': 6.0.0
'@ant-design/icons-svg': 4.4.2
vue: 3.5.4(typescript@5.6.2)
'@antfu/utils@0.7.10': {}
'@babel/code-frame@7.24.7':
......@@ -4316,6 +4684,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@babel/runtime@7.25.6':
dependencies:
regenerator-runtime: 0.14.1
'@babel/template@7.25.0':
dependencies:
'@babel/code-frame': 7.24.7
......@@ -4603,6 +4975,10 @@ snapshots:
dependencies:
vue: 3.5.4(typescript@5.6.2)
'@emotion/hash@0.9.2': {}
'@emotion/unitless@0.8.1': {}
'@esbuild/aix-ppc64@0.21.5':
optional: true
......@@ -5243,6 +5619,11 @@ snapshots:
transitivePeerDependencies:
- '@types/node'
'@simonwep/pickr@1.8.2':
dependencies:
core-js: 3.38.1
nanopop: 2.4.2
'@sinclair/typebox@0.27.8': {}
'@sinonjs/commons@1.8.6':
......@@ -5359,6 +5740,8 @@ snapshots:
'@types/prettier@2.7.3': {}
'@types/qs@6.9.15': {}
'@types/semver@7.5.8': {}
'@types/stack-utils@2.0.3': {}
......@@ -5465,7 +5848,17 @@ snapshots:
'@vavt/util@2.1.0': {}
'@vitejs/plugin-vue@4.6.2(vite@5.4.4(@types/node@18.19.50)(sass@1.78.0))(vue@3.5.4(typescript@5.6.2))':
'@vitejs/plugin-vue-jsx@4.0.1(vite@5.4.4(@types/node@18.19.50)(sass@1.78.0))(vue@3.5.4(typescript@5.6.2))':
dependencies:
'@babel/core': 7.25.2
'@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.25.2)
'@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.25.2)
vite: 5.4.4(@types/node@18.19.50)(sass@1.78.0)
vue: 3.5.4(typescript@5.6.2)
transitivePeerDependencies:
- supports-color
'@vitejs/plugin-vue@5.1.3(vite@5.4.4(@types/node@18.19.50)(sass@1.78.0))(vue@3.5.4(typescript@5.6.2))':
dependencies:
vite: 5.4.4(@types/node@18.19.50)(sass@1.78.0)
vue: 3.5.4(typescript@5.6.2)
......@@ -5759,17 +6152,49 @@ snapshots:
ansi-styles@6.2.1: {}
ant-design-vue@4.2.3(vue@3.5.4(typescript@5.6.2)):
dependencies:
'@ant-design/colors': 6.0.0
'@ant-design/icons-vue': 7.0.1(vue@3.5.4(typescript@5.6.2))
'@babel/runtime': 7.25.6
'@ctrl/tinycolor': 3.6.1
'@emotion/hash': 0.9.2
'@emotion/unitless': 0.8.1
'@simonwep/pickr': 1.8.2
array-tree-filter: 2.1.0
async-validator: 4.2.5
csstype: 3.1.3
dayjs: 1.11.13
dom-align: 1.12.4
dom-scroll-into-view: 2.0.1
lodash: 4.17.21
lodash-es: 4.17.21
resize-observer-polyfill: 1.5.1
scroll-into-view-if-needed: 2.2.31
shallow-equal: 1.2.1
stylis: 4.3.4
throttle-debounce: 5.0.2
vue: 3.5.4(typescript@5.6.2)
vue-types: 3.0.2(vue@3.5.4(typescript@5.6.2))
warning: 4.0.3
any-promise@1.3.0: {}
anymatch@3.1.3:
dependencies:
normalize-path: 3.0.0
picomatch: 2.3.1
arg@5.0.2: {}
argparse@1.0.10:
dependencies:
sprintf-js: 1.0.3
argparse@2.0.1: {}
array-tree-filter@2.1.0: {}
array-union@2.1.0: {}
assertion-error@1.1.0: {}
......@@ -5778,6 +6203,16 @@ snapshots:
asynckit@0.4.0: {}
autoprefixer@10.4.20(postcss@8.4.45):
dependencies:
browserslist: 4.23.3
caniuse-lite: 1.0.30001660
fraction.js: 4.3.7
normalize-range: 0.1.2
picocolors: 1.1.0
postcss: 8.4.45
postcss-value-parser: 4.2.0
axios@1.7.7:
dependencies:
follow-redirects: 1.15.9
......@@ -5884,8 +6319,18 @@ snapshots:
cac@6.7.14: {}
call-bind@1.0.7:
dependencies:
es-define-property: 1.0.0
es-errors: 1.3.0
function-bind: 1.1.2
get-intrinsic: 1.2.4
set-function-length: 1.2.2
callsites@3.1.0: {}
camelcase-css@2.0.1: {}
camelcase@5.3.1: {}
camelcase@6.3.0: {}
......@@ -5985,6 +6430,8 @@ snapshots:
commander@2.20.3: {}
commander@4.1.1: {}
commander@7.2.0: {}
commander@8.3.0: {}
......@@ -5992,6 +6439,8 @@ snapshots:
commander@9.5.0:
optional: true
compute-scroll-into-view@1.0.20: {}
computeds@0.0.1: {}
concat-map@0.0.1: {}
......@@ -6015,6 +6464,8 @@ snapshots:
dependencies:
toggle-selection: 1.0.6
core-js@3.38.1: {}
cose-base@1.0.3:
dependencies:
layout-base: 1.0.2
......@@ -6269,6 +6720,12 @@ snapshots:
bundle-name: 4.1.0
default-browser-id: 5.0.0
define-data-property@1.1.4:
dependencies:
es-define-property: 1.0.0
es-errors: 1.3.0
gopd: 1.0.1
define-lazy-prop@3.0.0: {}
delaunator@5.0.1:
......@@ -6283,6 +6740,8 @@ snapshots:
detect-newline@3.1.0: {}
didyoumean@1.2.2: {}
diff-sequences@27.5.1: {}
diff-sequences@29.6.3: {}
......@@ -6293,10 +6752,16 @@ snapshots:
dependencies:
path-type: 4.0.0
dlv@1.1.3: {}
doctrine@3.0.0:
dependencies:
esutils: 2.0.3
dom-align@1.12.4: {}
dom-scroll-into-view@2.0.1: {}
domexception@2.0.1:
dependencies:
webidl-conversions: 5.0.0
......@@ -6360,6 +6825,12 @@ snapshots:
error-stack-parser-es@0.1.5: {}
es-define-property@1.0.0:
dependencies:
get-intrinsic: 1.2.4
es-errors@1.3.0: {}
esbuild@0.18.20:
optionalDependencies:
'@esbuild/android-arm': 0.18.20
......@@ -6421,6 +6892,8 @@ snapshots:
escape-string-regexp@4.0.0: {}
escape-string-regexp@5.0.0: {}
escodegen@2.1.0:
dependencies:
esprima: 4.0.1
......@@ -6533,6 +7006,10 @@ snapshots:
estree-walker@2.0.2: {}
estree-walker@3.0.3:
dependencies:
'@types/estree': 1.0.5
esutils@2.0.3: {}
execa@5.1.1:
......@@ -6639,6 +7116,8 @@ snapshots:
combined-stream: 1.0.8
mime-types: 2.1.35
fraction.js@4.3.7: {}
fs-extra@11.2.0:
dependencies:
graceful-fs: 4.2.11
......@@ -6664,6 +7143,14 @@ snapshots:
get-func-name@2.0.2: {}
get-intrinsic@1.2.4:
dependencies:
es-errors: 1.3.0
function-bind: 1.1.2
has-proto: 1.0.3
has-symbols: 1.0.3
hasown: 2.0.2
get-package-type@0.1.0: {}
get-stream@6.0.1: {}
......@@ -6715,6 +7202,10 @@ snapshots:
dependencies:
delegate: 3.2.0
gopd@1.0.1:
dependencies:
get-intrinsic: 1.2.4
graceful-fs@4.2.11: {}
graphemer@1.4.0: {}
......@@ -6723,6 +7214,14 @@ snapshots:
has-flag@4.0.0: {}
has-property-descriptors@1.0.2:
dependencies:
es-define-property: 1.0.0
has-proto@1.0.3: {}
has-symbols@1.0.3: {}
hasown@2.0.2:
dependencies:
function-bind: 1.1.2
......@@ -6841,6 +7340,8 @@ snapshots:
is-path-inside@3.0.3: {}
is-plain-object@3.0.1: {}
is-potential-custom-element-name@1.0.1: {}
is-stream@2.0.1: {}
......@@ -7251,6 +7752,8 @@ snapshots:
- ts-node
- utf-8-validate
jiti@1.21.6: {}
jju@1.4.0: {}
js-beautify@1.15.1:
......@@ -7265,6 +7768,8 @@ snapshots:
js-tokens@4.0.0: {}
js-tokens@9.0.0: {}
js-yaml@3.14.1:
dependencies:
argparse: 1.0.10
......@@ -7385,6 +7890,10 @@ snapshots:
prelude-ls: 1.2.1
type-check: 0.4.0
lilconfig@2.1.0: {}
lilconfig@3.1.2: {}
lines-and-columns@1.2.4: {}
linkify-it@5.0.0:
......@@ -7393,6 +7902,11 @@ snapshots:
local-pkg@0.4.3: {}
local-pkg@0.5.0:
dependencies:
mlly: 1.7.1
pkg-types: 1.2.0
locate-path@5.0.0:
dependencies:
p-locate: 4.1.0
......@@ -7417,6 +7931,10 @@ snapshots:
lodash@4.17.21: {}
loose-envify@1.4.0:
dependencies:
js-tokens: 4.0.0
loupe@2.3.7:
dependencies:
get-func-name: 2.0.2
......@@ -7723,8 +8241,16 @@ snapshots:
muggle-string@0.3.1: {}
mz@2.7.0:
dependencies:
any-promise: 1.3.0
object-assign: 4.1.1
thenify-all: 1.6.0
nanoid@3.3.7: {}
nanopop@2.4.2: {}
natural-compare-lite@1.4.0: {}
natural-compare@1.4.0: {}
......@@ -7741,6 +8267,8 @@ snapshots:
normalize-path@3.0.0: {}
normalize-range@0.1.2: {}
normalize-wheel-es@1.2.0: {}
npm-run-path@4.0.1:
......@@ -7759,6 +8287,12 @@ snapshots:
nwsapi@2.2.12: {}
object-assign@4.1.1: {}
object-hash@3.0.0: {}
object-inspect@1.13.2: {}
once@1.4.0:
dependencies:
wrappy: 1.0.2
......@@ -7857,6 +8391,8 @@ snapshots:
picomatch@2.3.1: {}
pify@2.3.0: {}
pinia@2.2.2(typescript@5.6.2)(vue@3.5.4(typescript@5.6.2)):
dependencies:
'@vue/devtools-api': 6.6.4
......@@ -7879,11 +8415,37 @@ snapshots:
mlly: 1.7.1
pathe: 1.1.2
postcss-import@15.1.0(postcss@8.4.45):
dependencies:
postcss: 8.4.45
postcss-value-parser: 4.2.0
read-cache: 1.0.0
resolve: 1.22.8
postcss-js@4.0.1(postcss@8.4.45):
dependencies:
camelcase-css: 2.0.1
postcss: 8.4.45
postcss-load-config@4.0.2(postcss@8.4.45):
dependencies:
lilconfig: 3.1.2
yaml: 2.5.1
optionalDependencies:
postcss: 8.4.45
postcss-nested@6.2.0(postcss@8.4.45):
dependencies:
postcss: 8.4.45
postcss-selector-parser: 6.1.2
postcss-selector-parser@6.1.2:
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
postcss-value-parser@4.2.0: {}
postcss@8.4.45:
dependencies:
nanoid: 3.3.7
......@@ -7927,6 +8489,10 @@ snapshots:
punycode@2.3.1: {}
qs@6.13.0:
dependencies:
side-channel: 1.0.6
querystringify@2.2.0: {}
queue-microtask@1.2.3: {}
......@@ -7935,14 +8501,22 @@ snapshots:
react-is@18.3.1: {}
read-cache@1.0.0:
dependencies:
pify: 2.3.0
readdirp@3.6.0:
dependencies:
picomatch: 2.3.1
regenerator-runtime@0.14.1: {}
require-directory@2.1.1: {}
requires-port@1.0.0: {}
resize-observer-polyfill@1.5.1: {}
resolve-cwd@3.0.0:
dependencies:
resolve-from: 5.0.0
......@@ -8032,6 +8606,12 @@ snapshots:
screenfull@6.0.2: {}
scroll-into-view-if-needed@2.2.31:
dependencies:
compute-scroll-into-view: 1.0.20
scule@1.3.0: {}
select@1.1.2: {}
semver@6.3.1: {}
......@@ -8042,12 +8622,30 @@ snapshots:
semver@7.6.3: {}
set-function-length@1.2.2:
dependencies:
define-data-property: 1.1.4
es-errors: 1.3.0
function-bind: 1.1.2
get-intrinsic: 1.2.4
gopd: 1.0.1
has-property-descriptors: 1.0.2
shallow-equal@1.2.1: {}
shebang-command@2.0.0:
dependencies:
shebang-regex: 3.0.0
shebang-regex@3.0.0: {}
side-channel@1.0.6:
dependencies:
call-bind: 1.0.7
es-errors: 1.3.0
get-intrinsic: 1.2.4
object-inspect: 1.13.2
siginfo@2.0.0: {}
signal-exit@3.0.7: {}
......@@ -8126,10 +8724,24 @@ snapshots:
dependencies:
acorn: 8.12.1
strip-literal@2.1.0:
dependencies:
js-tokens: 9.0.0
style-mod@4.1.2: {}
stylis@4.3.4: {}
sucrase@3.35.0:
dependencies:
'@jridgewell/gen-mapping': 0.3.5
commander: 4.1.1
glob: 10.4.5
lines-and-columns: 1.2.4
mz: 2.7.0
pirates: 4.0.6
ts-interface-checker: 0.1.13
superjson@2.2.1:
dependencies:
copy-anything: 3.0.5
......@@ -8162,6 +8774,33 @@ snapshots:
'@pkgr/core': 0.1.1
tslib: 2.7.0
tailwindcss@3.4.11:
dependencies:
'@alloc/quick-lru': 5.2.0
arg: 5.0.2
chokidar: 3.6.0
didyoumean: 1.2.2
dlv: 1.1.3
fast-glob: 3.3.2
glob-parent: 6.0.2
is-glob: 4.0.3
jiti: 1.21.6
lilconfig: 2.1.0
micromatch: 4.0.8
normalize-path: 3.0.0
object-hash: 3.0.0
picocolors: 1.1.0
postcss: 8.4.45
postcss-import: 15.1.0(postcss@8.4.45)
postcss-js: 4.0.1(postcss@8.4.45)
postcss-load-config: 4.0.2(postcss@8.4.45)
postcss-nested: 6.2.0(postcss@8.4.45)
postcss-selector-parser: 6.1.2
resolve: 1.22.8
sucrase: 3.35.0
transitivePeerDependencies:
- ts-node
terminal-link@2.1.1:
dependencies:
ansi-escapes: 4.3.2
......@@ -8175,8 +8814,18 @@ snapshots:
text-table@0.2.0: {}
thenify-all@1.6.0:
dependencies:
thenify: 3.3.1
thenify@3.3.1:
dependencies:
any-promise: 1.3.0
throat@6.0.2: {}
throttle-debounce@5.0.2: {}
tiny-emitter@2.1.0: {}
tinybench@2.9.0: {}
......@@ -8214,6 +8863,8 @@ snapshots:
ts-dedent@2.2.0: {}
ts-interface-checker@0.1.13: {}
tslib@1.14.1: {}
tslib@2.3.0: {}
......@@ -8251,6 +8902,25 @@ snapshots:
undici-types@5.26.5: {}
unimport@3.12.0(rollup@4.21.3):
dependencies:
'@rollup/pluginutils': 5.1.0(rollup@4.21.3)
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
unist-util-stringify-position@3.0.3:
dependencies:
'@types/unist': 2.0.11
......@@ -8261,6 +8931,47 @@ snapshots:
universalify@2.0.1: {}
unplugin-auto-import@0.18.3(@vueuse/core@11.0.3(vue@3.5.4(typescript@5.6.2)))(rollup@4.21.3):
dependencies:
'@antfu/utils': 0.7.10
'@rollup/pluginutils': 5.1.0(rollup@4.21.3)
fast-glob: 3.3.2
local-pkg: 0.5.0
magic-string: 0.30.11
minimatch: 9.0.5
unimport: 3.12.0(rollup@4.21.3)
unplugin: 1.14.1
optionalDependencies:
'@vueuse/core': 11.0.3(vue@3.5.4(typescript@5.6.2))
transitivePeerDependencies:
- rollup
- webpack-sources
unplugin-vue-components@0.27.4(@babel/parser@7.25.6)(rollup@4.21.3)(vue@3.5.4(typescript@5.6.2)):
dependencies:
'@antfu/utils': 0.7.10
'@rollup/pluginutils': 5.1.0(rollup@4.21.3)
chokidar: 3.6.0
debug: 4.3.7
fast-glob: 3.3.2
local-pkg: 0.5.0
magic-string: 0.30.11
minimatch: 9.0.5
mlly: 1.7.1
unplugin: 1.14.1
vue: 3.5.4(typescript@5.6.2)
optionalDependencies:
'@babel/parser': 7.25.6
transitivePeerDependencies:
- rollup
- supports-color
- webpack-sources
unplugin@1.14.1:
dependencies:
acorn: 8.12.1
webpack-virtual-modules: 0.6.2
update-browserslist-db@1.1.0(browserslist@4.23.3):
dependencies:
browserslist: 4.23.3
......@@ -8507,6 +9218,11 @@ snapshots:
semver: 7.6.3
typescript: 5.6.2
vue-types@3.0.2(vue@3.5.4(typescript@5.6.2)):
dependencies:
is-plain-object: 3.0.1
vue: 3.5.4(typescript@5.6.2)
vue@3.5.4(typescript@5.6.2):
dependencies:
'@vue/compiler-dom': 3.5.4
......@@ -8535,6 +9251,10 @@ snapshots:
dependencies:
makeerror: 1.0.12
warning@4.0.3:
dependencies:
loose-envify: 1.4.0
web-worker@1.3.0: {}
webidl-conversions@5.0.0: {}
......@@ -8543,6 +9263,8 @@ snapshots:
webidl-conversions@7.0.0: {}
webpack-virtual-modules@0.6.2: {}
whatwg-encoding@1.0.5:
dependencies:
iconv-lite: 0.4.24
......@@ -8619,6 +9341,8 @@ snapshots:
yallist@4.0.0: {}
yaml@2.5.1: {}
yargs-parser@20.2.9: {}
yargs@16.2.0:
......
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}
<template>
<router-view />
</template>
\ No newline at end of file
</template>
<script setup lang="ts">
import { useFavicon, useTitle } from "@vueuse/core";
import { getConfigInfo } from '@/utils/api'
const title = useTitle();
getConfigInfo("PRODUCT-NAME").then(res => {
title.value = res;
});
const icon = useFavicon();
getConfigInfo("ICON").then(res => {
icon.value = "data:image/x-icon;base64," + res;
});
const logoImage = ref<string>("");
getConfigInfo("LOGO").then(res => {
logoImage.value = "data:image/jpg;base64," + res;
});
provide("logoImage", logoImage);
</script>
<style>
@tailwind base;
@tailwind components;
@tailwind utilities;
</style>
\ No newline at end of file
......@@ -80,15 +80,15 @@ interface ResetCurrentUserPasswordRequest {
/**
* 验证码
*/
code: string
password: string
/**
*密码
*/
password: string
new_password: string
/**
* 确认密码
*/
re_password: string
repeat_new_password: string
}
interface ResetPasswordRequest {
......
<template>
<div class="login-form-container">
<div class="login-title">
<div class="logo text-center">
<LogoFull height="45px" />
</div>
<div class="sub-title text-center" v-if="subTitle">
<el-text type="info">{{ subTitle }}</el-text>
</div>
<div class="text-[28px] text-center mb-8">
{{ subTitle }}
</div>
<el-card class="login-card">
<slot></slot>
......@@ -18,18 +13,11 @@ defineOptions({ name: 'LoginContainer' })
defineProps({
title: String,
subTitle: String
})
});
</script>
<style lang="scss" scoped>
.login-form-container {
width: 480px;
.login-title {
margin-bottom: 32px;
.sub-title {
font-size: 16px;
}
}
.login-card {
border-radius: 8px;
padding: 18px;
......
<template>
<div class="login-warp flex-center">
<div class="login-container w-full h-full">
<el-row class="container w-full h-full">
<el-col :xs="0" :sm="0" :md="10" :lg="10" :xl="10" class="left-container">
<div class="login-image" :style="{ backgroundImage: `url(${loginImage})` }"></div>
<el-row class="w-full h-full">
<el-col :xs="0" :sm="0" :md="10" :lg="10" :xl="14" class="left-container">
<div class="login-image"><img class="w-full h-full block" src="@/assets/login.png" alt="" /></div>
</el-col>
<el-col :xs="24" :sm="24" :md="14" :lg="14" :xl="14" class="right-container flex-center">
<el-col :xs="24" :sm="24" :md="14" :lg="14" :xl="10" class="right-container flex-center">
<slot></slot>
</el-col>
</el-row>
......@@ -13,42 +13,13 @@
</div>
</template>
<script setup lang="ts">
import { computed } from 'vue'
import { getThemeImg } from '@/utils/theme'
import useStore from '@/stores'
import { request } from '@/request'
defineOptions({ name: 'LoginLayout' })
const { user } = useStore()
const fileURL = computed(() => {
if (user.themeInfo?.loginImage) {
if (typeof user.themeInfo?.loginImage === 'string') {
return user.themeInfo?.loginImage
} else {
return URL.createObjectURL(user.themeInfo?.loginImage)
}
} else {
return ''
}
})
const loginImage = computed(() => {
if (user.themeInfo?.loginImage) {
return `${fileURL.value}`
} else {
return new URL(`../../assets/theme/${getThemeImg(user.themeInfo?.theme)}.jpg`, import.meta.url)
.href
}
})
</script>
<style lang="scss" scoped>
.login-warp {
height: 100vh;
.login-image {
background-repeat: no-repeat;
background-position: center;
background-size: cover;
width: 100%;
height: 100%;
}
......
<template>
<el-dialog v-model="resetPasswordDialog" :title="$t('layout.topbar.avatar.resetPassword')">
<el-form
class="reset-password-form mb-24"
ref="resetPasswordFormRef"
:model="resetPasswordForm"
:rules="rules"
>
<p class="mb-8 lighter">{{ $t("layout.topbar.avatar.dialog.newPassword") }}</p>
<el-form-item prop="password" style="margin-bottom: 8px">
<el-dialog v-model="resetPasswordDialog" title="修改密码">
<el-form ref="resetPasswordFormRef" :model="resetPasswordForm" :rules="rules">
<el-form-item prop="password">
<el-input
type="password"
class="input-item"
v-model="resetPasswordForm.password"
:placeholder="$t('layout.topbar.avatar.dialog.enterPassword')"
placeholder="请输入密码"
show-password
>
</el-input>
/>
</el-form-item>
<el-form-item prop="re_password">
<el-form-item prop="new_password">
<el-input
type="password"
class="input-item"
v-model="resetPasswordForm.re_password"
:placeholder="$t('layout.topbar.avatar.dialog.confirmPassword')"
v-model="resetPasswordForm.new_password"
placeholder="请输入密码"
show-password
>
</el-input>
</el-form-item>
<p class="mb-8 lighter">{{ $t("layout.topbar.avatar.dialog.useEmail") }}</p>
<el-form-item style="margin-bottom: 8px">
<el-form-item prop="repeat_new_password">
<el-input
type="password"
class="input-item"
:disabled="true"
v-bind:modelValue="user.userInfo?.email"
:placeholder="$t('layout.topbar.avatar.dialog.enterEmail')"
v-model="resetPasswordForm.repeat_new_password"
placeholder="请输入确认密码"
show-password
>
</el-input>
</el-form-item>
<el-form-item prop="code">
<div class="flex-between w-full">
<el-input class="code-input" v-model="resetPasswordForm.code" :placeholder="$t('layout.topbar.avatar.dialog.enterVerificationCode')">
</el-input>
<el-button
:disabled="isDisabled"
class="send-email-button ml-8"
@click="sendEmail"
:loading="loading"
>
{{ isDisabled ? $t('layout.topbar.avatar.dialog.resend', { time }) : $t('layout.topbar.avatar.dialog.getVerificationCode') }}
</el-button>
</div>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="resetPasswordDialog = false">{{ $t('layout.topbar.avatar.dialog.cancel') }}</el-button>
<el-button type="primary" @click="resetPassword"> {{ $t('layout.topbar.avatar.dialog.save') }} </el-button>
<el-button @click="resetPasswordDialog = false">取消</el-button>
<el-button type="primary" @click="resetPassword">保存</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import type { ResetCurrentUserPasswordRequest } from '@/api/type/user'
import type { FormInstance, FormRules } from 'element-plus'
import { MsgSuccess } from '@/utils/message'
import UserApi from '@/api/user'
import useStore from '@/stores'
import { useRouter } from 'vue-router'
import { t } from '@/locales'
import { editPassword } from "@/utils/api";
const router = useRouter()
const { user } = useStore()
const resetPasswordDialog = ref<boolean>(false)
const resetPasswordForm = ref<ResetCurrentUserPasswordRequest>({
code: '',
password: '',
re_password: ''
new_password: '',
repeat_new_password: ''
})
const resetPasswordFormRef = ref<FormInstance>()
const loading = ref<boolean>(false)
const isDisabled = ref<boolean>(false)
const time = ref<number>(60)
const rules = ref<FormRules<ResetCurrentUserPasswordRequest>>({
// @ts-ignore
code: [{ required: true, message: t('layout.topbar.avatar.dialog.enterVerificationCode'), trigger: 'blur' }],
password: [
password: [{ required: true, message: "请输入旧密码", trigger: 'blur' }],
new_password: [
{
required: true,
message: t('layout.topbar.avatar.dialog.enterPassword'),
message: '请输入新密码',
trigger: 'blur'
},
{
min: 6,
max: 20,
message: t('layout.topbar.avatar.dialog.passwordLength'),
message: '长度在6~20',
trigger: 'blur'
}
],
re_password: [
repeat_new_password: [
{
required: true,
message: t('layout.topbar.avatar.dialog.confirmPassword'),
message: '请确认新密码',
trigger: 'blur'
},
{
min: 6,
max: 20,
message: t('layout.topbar.avatar.dialog.passwordLength'),
message: '长度在6~20',
trigger: 'blur'
},
{
validator: (rule, value, callback) => {
if (resetPasswordForm.value.password != resetPasswordForm.value.re_password) {
callback(new Error(t('layout.topbar.avatar.dialog.passwordMismatch')))
if (resetPasswordForm.value.new_password != resetPasswordForm.value.repeat_new_password) {
callback(new Error('两次密码不一致'))
} else {
callback()
}
......@@ -126,49 +95,24 @@ const rules = ref<FormRules<ResetCurrentUserPasswordRequest>>({
}
]
})
/**
* 发送验证码
*/
const sendEmail = () => {
UserApi.sendEmailToCurrent(loading).then(() => {
MsgSuccess(t('verificationCodeSentSuccess'))
isDisabled.value = true
handleTimeChange()
})
}
const handleTimeChange = () => {
if (time.value <= 0) {
isDisabled.value = false
time.value = 60
} else {
setTimeout(() => {
time.value--
handleTimeChange()
}, 1000)
}
}
const open = () => {
resetPasswordForm.value = {
code: '',
password: '',
re_password: ''
new_password: '',
repeat_new_password: ''
}
resetPasswordDialog.value = true
resetPasswordFormRef.value?.resetFields()
}
const resetPassword = () => {
resetPasswordFormRef.value
?.validate()
.then(() => {
return UserApi.resetCurrentUserPassword(resetPasswordForm.value)
})
.then(() => {
return user.logout()
})
.then(() => {
router.push({ name: 'login' })
resetPasswordFormRef.value?.validate().then(() => {
editPassword(resetPasswordForm.value).then(res => {
if (res) {
sessionStorage.clear();
router.push("/login")
}
})
})
}
const close = () => {
......@@ -176,7 +120,4 @@ const close = () => {
}
defineExpose({ open, close })
</script>
<style lang="scss" scoped></style>
......@@ -4,7 +4,7 @@
<AppAvatar>
<img src="@/assets/user-icon.svg" style="width: 54%" alt=""/>
</AppAvatar>
<span class="ml-8">{{ user.userInfo?.username }}</span>
<span class="ml-4">{{ user.name }}</span>
<el-icon class="el-icon--right">
<CaretBottom/>
</el-icon>
......@@ -12,88 +12,32 @@
<template #dropdown>
<el-dropdown-menu class="avatar-dropdown">
<div class="userInfo">
<p class="bold mb-4" style="font-size: 14px">{{ user.userInfo?.username }}</p>
<p>
<el-text type="info">
{{ user.userInfo?.email }}
</el-text>
</p>
</div>
<el-dropdown-item class="border-t p-8" @click="openResetPassword">
{{ $t('layout.topbar.avatar.resetPassword') }}
</el-dropdown-item>
<div v-hasPermission="new ComplexPermission([], ['x-pack'], 'OR')">
<el-dropdown-item class="border-t p-8" @click="openAPIKeyDialog">
{{ $t('layout.topbar.avatar.apiKey') }}
</el-dropdown-item>
</div>
<el-dropdown-item class="border-t" @click="openAbout">
{{ $t('layout.topbar.avatar.about') }}
<el-dropdown-item @click="openResetPassword">
重置密码
</el-dropdown-item>
<el-dropdown-item class="border-t" @click="logout">
{{ $t('layout.topbar.avatar.logout') }}
退出
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
<ResetPassword ref="resetPasswordRef"></ResetPassword>
<AboutDialog ref="AboutDialogRef"></AboutDialog>
<APIKeyDialog :user-id="user.userInfo?.id" ref="APIKeyDialogRef"/>
<UserPwdDialog ref="UserPwdDialogRef"/>
</template>
<script setup lang="ts">
import {ref, onMounted} from 'vue'
import useStore from '@/stores'
import {useRouter} from 'vue-router'
import ResetPassword from './ResetPassword.vue'
import AboutDialog from './AboutDialog.vue'
import UserPwdDialog from '@/views/user-manage/component/UserPwdDialog.vue'
import APIKeyDialog from './APIKeyDialog.vue'
import {ComplexPermission} from '@/utils/permission/type'
const {user} = useStore()
import { layout } from "@/utils/api";
const router = useRouter()
const UserPwdDialogRef = ref()
const AboutDialogRef = ref()
const APIKeyDialogRef = ref()
const resetPasswordRef = ref<InstanceType<typeof ResetPassword>>()
const openAbout = () => {
AboutDialogRef.value?.open()
}
function openAPIKeyDialog() {
APIKeyDialogRef.value.open()
}
const openResetPassword = () => {
resetPasswordRef.value?.open()
}
const logout = () => {
user.logout().then(() => {
layout().then(() => {
router.push({name: 'login'})
})
}
onMounted(() => {
if (user.userInfo?.is_edit_password) {
UserPwdDialogRef.value.open(user.userInfo)
}
})
const user = JSON.parse(sessionStorage.getItem("userInfo"));
</script>
<style lang="scss" scoped>
.avatar-dropdown {
min-width: 210px;
.userInfo {
padding: 12px 11px;
}
:deep(.el-dropdown-menu__item) {
padding: 12px 11px;
}
}
</style>
......@@ -3,47 +3,11 @@
<div class="top-bar-container border-b flex-between">
<div class="flex-center h-full">
<div class="app-title-container cursor" @click="router.push('/')">
<div class="logo flex-center">
<LogoFull />
</div>
<img :src="logo" class="w-[180px] mt-[8px]" alt="" />
</div>
<TopMenu></TopMenu>
</div>
<div class="flex-center avatar">
<el-button
v-if="!user.isEnterprise()"
link
type="primary"
@click="toUrl('https://maxkb.cn/pricing.html')"
class="mr-8"
>
<AppIcon iconName="app-pricing" class="mr-8" style="font-size: 20px"></AppIcon>
购买专业版
</el-button>
<el-tooltip effect="dark" :content="$t('layout.topbar.github')" placement="top">
<AppIcon
iconName="app-github"
class="cursor color-secondary mr-8 ml-8"
style="font-size: 20px"
@click="toUrl('https://github.com/1Panel-dev/MaxKB')"
></AppIcon>
</el-tooltip>
<el-tooltip effect="dark" :content="$t('layout.topbar.wiki')" placement="top">
<AppIcon
iconName="app-reading"
class="cursor color-secondary mr-8 ml-8"
style="font-size: 20px"
@click="toUrl('https://maxkb.cn/docs/')"
></AppIcon>
</el-tooltip>
<el-tooltip effect="dark" :content="$t('layout.topbar.forum')" placement="top">
<AppIcon
iconName="app-help"
class="cursor color-secondary mr-16 ml-8"
style="font-size: 20px"
@click="toUrl('https://bbs.fit2cloud.com/c/mk/11')"
></AppIcon>
</el-tooltip>
<el-dropdown v-if="false" trigger="click" type="primary">
<template #dropdown>
<el-dropdown-menu>
......@@ -71,22 +35,19 @@
import TopMenu from './top-menu/index.vue'
import Avatar from './avatar/index.vue'
import { useRouter } from 'vue-router'
import { langList } from '@/locales/index'
import { langList } from '@/locales'
import { useLocale } from '@/locales/useLocale'
import useStore from '@/stores'
const { user } = useStore()
const router = useRouter()
const { changeLocale } = useLocale()
const changeLang = (lang: string) => {
changeLocale(lang)
}
function toUrl(url: string) {
window.open(url, '_blank')
}
const logo: string = inject("logoImage");
</script>
<style lang="scss">
<style scoped lang="scss">
.top-bar-container {
height: var(--app-header-height);
box-sizing: border-box;
......
......@@ -2,7 +2,6 @@
<div class="top-menu-container flex align-center h-full">
<MenuItem
:menu="menu"
v-hasPermission="menu.meta?.permission"
v-for="(menu, index) in topMenuList"
:key="index"
>
......@@ -10,14 +9,10 @@
</div>
</template>
<script setup lang="ts">
import { computed } from 'vue'
import { getChildRouteListByPathAndName } from '@/router/index'
import { getChildRouteListByPathAndName } from '@/router'
import MenuItem from './MenuItem.vue'
const topMenuList = computed(() => {
return getChildRouteListByPathAndName('/', 'home')
})
</script>
<style lang="scss" scoped>
</style>
});
</script>
\ No newline at end of file
......@@ -58,5 +58,4 @@ app.use(ElementPlus, {
app.use(router)
app.use(i18n)
app.use(Components)
app.mount('#app')
export { app }
app.mount('#app');
\ No newline at end of file
......@@ -14,6 +14,7 @@ const router = createRouter({
})
// 路由前置拦截器
/*
router.beforeEach(
async (to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) => {
if (to.name === '404') {
......@@ -41,6 +42,7 @@ router.beforeEach(
next()
}
)
*/
export const getChildRouteListByPathAndName = (path: any, name?: RouteRecordName | any) => {
return getChildRouteList(routes, path, name)
......
import Layout from '@/layout/layout-template/DetailLayout.vue'
const applicationRouter = {
path: '/application',
name: 'application',
meta: { title: '应用', permission: 'APPLICATION:READ' },
path: '/',
name: 'app',
meta: { title: '应用' },
redirect: '/application',
component: () => import('@/layout/layout-template/AppLayout.vue'),
children: [
......
import type { RouteRecordRaw } from 'vue-router'
import { Role } from '@/utils/permission/type'
import type { RouteRecordRaw } from 'vue-router';
const modules: any = import.meta.glob('./modules/*.ts', { eager: true })
const rolesRoutes: RouteRecordRaw[] = [...Object.keys(modules).map((key) => modules[key].default)]
const rolesRoutes: RouteRecordRaw[] = [...Object.keys(modules).map((key) => modules[key].default)];
export const routes: Array<RouteRecordRaw> = [
{
path: '/',
name: 'home',
redirect: '/application',
children: [...rolesRoutes]
children: [rolesRoutes[0]]
},
// 高级编排
{
path: '/application/:id/workflow',
......@@ -32,16 +29,6 @@ export const routes: Array<RouteRecordRaw> = [
component: () => import('@/views/login/index.vue')
},
{
path: '/register',
name: 'register',
component: () => import('@/views/login/register/index.vue')
},
{
path: '/forgot_password',
name: 'forgot_password',
component: () => import('@/views/login/forgot-password/index.vue')
},
{
path: '/reset_password/:code/:email',
name: 'reset_password',
component: () => import('@/views/login/reset-password/index.vue')
......
......@@ -117,8 +117,8 @@ const useUserStore = defineStore({
})
},
async login(username: string, password: string) {
return UserApi.login({ username, password }).then((ok) => {
async login(email: string, password: string) {
return UserApi.login({ email, password }).then((ok) => {
this.token = ok.data
localStorage.setItem('token', ok.data)
return this.profile()
......
import {request, api} from "@/utils/request";
import {message, Modal} from "ant-design-vue";
import qs from "qs";
import {useRoute} from "vue-router";
//登录
export const loginPort = function (data) {
return new Promise((resolve) => {
request.post("/login/", data).then((res) => {
if (res.data) {
sessionStorage.setItem("token", res.data);
message.success("登录成功");
resolve(true);
} else {
message.error(res.message);
resolve(false);
}
})
})
}
//退出
export const layout = function () {
return request.get("/logout/")
}
//TODO 标签管理相关
export const getLabelList = function (params) {
return request.get("/tags/", params)
}
//TODO 知识库列表相关
//1.知识库列表查询接口
export const getDataSetList = function (search, pagination) {
const json = qs.stringify({
page: pagination.current,
limit: pagination.pageSize,
keyword: search.keyword,
tag_ids: search.tag_ids
}, {arrayFormat: 'repeat'})
return new Promise((resolve) => {
request.get("/datasets/?" + json).then((res) => {
resolve(res)
})
})
}
//知识库删除
export const delDatasets = function (id) {
return new Promise((resolve) => {
Modal.confirm({
title: '提示',
content: '确认删除当前知识库',
onOk() {
request.delete("/datasets/" + id).then((res) => {
if (res.status_code === 200) {
message.success(res.message);
} else {
message.error(res.message);
}
resolve(res.data)
}).catch(() => {
resolve(false)
})
},
onCancel() {
resolve(false);
}
});
})
}
//5.知识库创建文档上传接口
export const upload = function (file, type = "datasets") {
return request.postForm("/files/upload", {file}, {source: type})
}
//知识库新建
export const addDatasets = function (data) {
return request.post("/datasets/init", data)
}
//空白知识库创建
export const addEmptyDatasets = function (name) {
return request.post("/datasets/", {name})
}
//文档分页接口查询
export const getDocumentList = function (id, param) {
return request.get("/datasets/" + id + "/documents", param)
}
//文档分段接口
export const getSegments = function (id, docId, params) {
if (!docId) {
return Promise.reject()
}
return request.get(`/datasets/${id}/documents/${docId}/segments`, params)
}
//文档详情查看接口
export const getDocumentInfo = function (id, docId) {
return request.get(`/datasets/${id}/documents/${docId}?metadata=without`)
}
//文档切换状态
export const switchStatus = function (id, docId, action) {
return new Promise(resolve => {
request.patch(`/datasets/${id}/documents/${docId}/status/${action}`).then(res => {
if (res.status_code === 200) {
message.success(res.message);
} else {
message.error(res.message);
}
resolve(res.data)
})
})
}
//修改文件名称
export const editFileName = function (id, docId, name) {
return new Promise(resolve => {
request.post(`/datasets/${id}/documents/${docId}/rename`, {name}).then(res => {
if (res.name) {
message.success("重命名成功")
}
resolve(res)
})
})
}
//删除知识库文件
export const delDocument = function (id, docId) {
return new Promise((resolve) => {
Modal.confirm({
title: '提示',
content: '确认删除当前文档',
onOk() {
request.delete("/datasets/" + id + "/documents/" + docId).then(() => {
resolve(true)
})
},
onCancel() {
resolve(false);
}
});
})
}
//知识库内上传文档接口
export const docUpload = function (id, data) {
return request.post(`/datasets/${id}/documents`, data)
}
//3.知识库编辑接口
export const editDataSets = function (id, data) {
return new Promise(resolve => {
request.patch("/datasets/" + id, data).then(res => {
if (res.message) {
message.error(res.message);
resolve(false);
} else {
message.success("成功")
resolve(true);
}
})
})
}
//文本分段与清洗自定义策略查询接口
export const getCreateDocumentInfo = function (id) {
return request.get("/datasets/process-rule", {document_id: id})
}
//查询文档状态接口
export const getFileStatus = function (id, batch) {
return request.get(`/datasets/${id}/batch/${batch}/indexing-status`)
}
//应用列表查询
export const getAppList = function (params) {
const json = qs.stringify(params, {arrayFormat: 'repeat'});
return request.get("/apps/?" + json)
}
//应用删除
export const delApp = function (id) {
return new Promise((resolve) => {
Modal.confirm({
title: '提示',
content: '确认删除当前应用',
onOk() {
request.delete("/apps/" + id).then((res) => {
message.success("删除成功")
resolve(true)
}).catch(() => {
resolve(false)
})
},
onCancel() {
resolve(false);
}
});
})
}
//创建应用
export const addApp = function (data) {
return new Promise((resolve) => {
request.post("/apps/", data).then((res) => {
if (res.status_code !== '200') {
message.error(res.message);
resolve(false);
} else {
message.success(res.message)
resolve({
bool: true,
id: res.data.id
});
}
})
})
}
//应用编辑
export const editApp = function (id, data) {
return new Promise((resolve) => {
request.put("/apps/" + id, data).then((res) => {
if (res.status_code !== '200') {
message.error(res.message);
resolve(false);
} else {
message.success(res.message)
resolve(true);
}
})
})
}
//应用详情
export const getAppsInfo = function (id) {
return request.get("/apps/" + id)
}
//查询知识库列表
export const getDatasetsAll = function () {
return request.get("/datasets/", {page: 1, limit: 9999})
}
//查询知识库详情
export const getDatasetsInfo = function (id) {
return request.get("/datasets/" + id)
}
//修改知识库设置
export const editDatasets = function (id, data) {
return new Promise(resolve => {
request.patch("/datasets/" + id, data).then(res => {
message.success("修改成功");
resolve(true)
}).catch((error) => {
message.error(error.message)
resolve(false)
})
})
}
//修改文档状态
export const switchSegments = function (id, docId, status) {
return request.patch(`/datasets/${id}/segments/${docId}/${status}`)
}
//发送消息
export const sendMessage = function (id, data) {
return fetch(`/console/api/apps/${id}/chat-messages`,
{
method: "post",
responseType: "stream",
headers: {
Authorization: "Bearer " + sessionStorage.getItem("token"),
"Content-Type": "application/json",
},
body: JSON.stringify(data),
}
);
}
//应用发布
export const appRelease = function (id, data) {
return request.post(`/apps/${id}/model-config`, data)
}
// 获取聊天应用的接口
export const getChatPort = function () {
const route = useRoute();
return new Promise((resolve) => {
api.requestConfig({
url: "/passport",
headers: {
"X-App-Code": route.params.id,
}
}).then(res => {
sessionStorage.setItem("console-token", res.access_token);
setTimeout(() => {
resolve(undefined);
}, 1000);
})
})
}
//获取聊天信息
export const getSite = function () {
return api.get("/site")
}
//获取聊天配置
export const getParameters = function () {
return api.get("/parameters")
}
//获取聊天列表
export const getConversations = function (pageSize = 100) {
return api.get("/conversations", {pinned: false, limit: pageSize})
}
//聊天接口
export const chatMessage = function (data) {
return fetch(`/api/chat-messages`,
{
method: "post",
responseType: "stream",
headers: {
Authorization: "Bearer " + sessionStorage.getItem("console-token"),
"Content-Type": "application/json",
},
body: JSON.stringify(data),
}
);
}
//文本聊天接口
export const completionMessage = function (data) {
return fetch(`/api/completion-messages`,
{
method: "post",
responseType: "stream",
headers: {
Authorization: "Bearer " + sessionStorage.getItem("console-token"),
"Content-Type": "application/json",
},
body: JSON.stringify(data),
}
);
}
//获取消息
export const getMessages = function (id) {
return api.get("/messages", {conversation_id: id, limit: 100})
}
//发送消息停止
export const stepMessages = function (id) {
return api.post(`/chat-messages/${id}/stop`)
}
//修改名称
export const editName = function (id, name) {
return api.post(`/conversations/${id}/name`, {name})
}
//删除会话
export const delConversations = function (id) {
return api.delete("/conversations/" + id)
}
//系统默认配置信息
export const getDefaultMode = function () {
const url = [
"/workspaces/current/default-model?model_type=text-embedding",
"/workspaces/current/default-model?model_type=rerank",
"/workspaces/current/default-model?model_type=llm",
]
const requestAll = url.map((item) => {
return request.get(item)
})
return new Promise(resolve => {
Promise.all(requestAll).then(res => {
const arr = [];
res.forEach(item => {
arr.push(item.data.model)
})
resolve(arr);
})
})
}
//模型设置-模型列表信息查询
export const getModelType = function () {
const url = [
"/workspaces/current/models/model-types/text-embedding",
"/workspaces/current/models/model-types/rerank",
"/workspaces/current/models/model-types/llm",
];
const requestAll = url.map((item) => {
return request.get(item)
})
return new Promise(resolve => {
Promise.all(requestAll).then(res => {
const arr = [];
res.forEach(item => {
if (item.data[0]?.models) {
arr.push(item.data[0]?.models)
}
})
resolve(arr);
})
})
}
//查询模型列表信息
export const getModelList = function () {
const url = [
"/workspaces/current/model-providers/ollama/models",
"/workspaces/current/model-providers/xinference/models"
];
const requestAll = url.map((item) => {
return request.get(item)
})
return Promise.all(requestAll)
}
//设置系统模型
export const setModel = function (data) {
return new Promise(resolve => {
request.post("/workspaces/current/default-model", data).then(res => {
if (res.message) {
message.error(res.message);
resolve(false);
} else {
message.success("设置成功")
resolve(true);
}
})
})
}
//新增,修改模型
export const addModel = function (type, data) {
return new Promise(resolve => {
request.post(`/workspaces/current/model-providers/${type}/models`, data).then(res => {
if (res.message) {
message.error(res.message);
resolve(false);
} else {
message.success("成功")
resolve(true);
}
})
})
}
//删除模型
export const delModel = function (type, data) {
return new Promise((resolve) => {
Modal.confirm({
title: '提示',
content: '确认删除当前模型?',
onOk() {
request.requestConfig({
url: `/workspaces/current/model-providers/${type}/models`,
data,
method: "delete",
}).then(res => {
console.log(res.result)
resolve(res.result === "success");
}).catch(() => {
resolve(false);
})
},
onCancel() {
resolve(false);
}
});
})
}
//模型查询详情
export const getModelInfo = function (type, param) {
return request.get(`/workspaces/current/model-providers/${type}/models/credentials`, param)
}
//召回测试最近查询
export const getQueries = function (id) {
return request.get(`/datasets/${id}/queries?limit=999&page=1`)
}
//召回测试
export const testing = function (id, data) {
return request.post(`/datasets/${id}/hit-testing`, data)
}
//用户列表
export const getUserList = function (params) {
return request.get("/user/page", params)
}
//新增用户
export const addUser = function (data) {
return new Promise(resolve => {
request.post("/user/", data).then(res => {
if (!res.data) {
message.error(res.message);
resolve(false);
} else {
message.success(res.message);
resolve(true);
}
})
})
}
//删除用户
export const delUser = function (id) {
return new Promise((resolve) => {
Modal.confirm({
title: '提示',
content: '确认删除当前用户',
onOk() {
request.delete("/user/" + id).then((res) => {
console.log(res)
if (res.status_code !== 200) {
message.success(res.message);
resolve(true)
} else {
message.error(res.message);
resolve(false);
}
})
},
onCancel() {
resolve(false);
}
});
})
}
//启用/禁用用户
export const disabledUser = function (id, status) {
return new Promise(resolve => {
request.get(`/user/${id}/${status}`).then(res => {
if (res.status_code === 200) {
message.success(res.message);
resolve(true)
} else {
message.error(res.message);
resolve(false);
}
})
})
}
//修改用户
export const editUser = function (id, data) {
console.log(id)
return new Promise(resolve => {
request.patch(`/user/`, {...data, id}).then(res => {
if (res.status_code === "200") {
message.success(res.message);
resolve(true)
} else {
message.error(res.message);
resolve(false);
}
})
})
}
//获取系统配置
export const getConfig = function () {
return request.get("/system-config/")
}
//添加系统配置
export const setConfig = function (data) {
return new Promise(resolve => {
request.postForm("/system-config/", data).then(res => {
if (res === 200) {
message.success("配置成功")
} else {
message.error("配置失败")
}
resolve(res);
})
})
}
//获取系统配置
export const getConfigInfo = function (type: "LOGO" | "ICON" | "PRODUCT-NAME") {
return new Promise<string>(resolve => {
request.get("/system-config/" + type).then((res) => {
if (type !== "PRODUCT-NAME") {
resolve(res.file_binary);
} else {
resolve(res.name);
}
})
})
}
//获取应用api key
export const getAppKeys = function (id) {
return request.get(`/apps/${id}/api-keys`)
}
//添加api keys
export const addAppkeys = function (id) {
return request.post(`/apps/${id}/api-keys`)
}
//删除api keys
export const delAppkeys = function (id, key) {
return request.delete(`/apps/${id}/api-keys/${key}`)
}
//应用日志查询
export const getChatConversations = function (id, params) {
return request.get(`/apps/${id}/chat-conversations`, params)
}
//应用日志插查询,文本生成
export const getCompletionConversations = function (id, params) {
return request.get(`/apps/${id}/completion-conversations`, params)
}
//标注查询
export const getAnnotations = function (id, params) {
return request.get(`/apps/${id}/annotations`, params)
}
//标注添加
export const addAnnotations = function (id, data) {
return request.post(`/apps/${id}/annotations`, data)
}
//标注删除
export const delAnnotations = function (id, dataId) {
return new Promise(resolve => {
Modal.confirm({
title: '提示',
content: '确认删除当前段落',
onOk() {
request.delete(`/apps/${id}/annotations/${dataId}`).then((res) => {
if (res.status_code === 200) {
message.success(res.message);
} else {
message.error(res.message);
}
resolve(res.data);
}).catch((e) => {
resolve(false)
})
},
onCancel() {
resolve(false);
}
});
})
}
//标注修改
export const editAnnotations = function (id, dataId, data) {
return request.post(`/apps/${id}/annotations/${dataId}`, data)
}
//获取标注设置
export const getAnnotationSetting = function (id) {
return request.get(`/apps/${id}/annotation-setting`)
}
//标注回复初始设置
export const settingAnnotation = function (id, status, data) {
return request.post(`/apps/${id}/annotation-reply/${status}`, data)
}
//查询标注状态是否完成
export const searchAnnotationStatus = function (id, status, jobId) {
return request.get(`/apps/${id}/annotation-reply/${status}/status/${jobId}`)
}
//获取用户信息
export const userInfo = function () {
return request.get("/account/profile")
}
//文档段落删除
export const delDocumentSegments = function (dataSetid, id, segmentsId) {
return new Promise(resolve => {
Modal.confirm({
title: '提示',
content: '确认删除当前段落',
onOk() {
request.delete(`/datasets/${dataSetid}/documents/${id}/segments/${segmentsId}`).then((res) => {
if (res.status_code === 200) {
message.success(res.message);
} else {
message.error(res.message);
}
resolve(res.data);
}).catch((e) => {
resolve(false)
})
},
onCancel() {
resolve(false);
}
});
})
}
//文档段落编辑
export const editDocumentSegments = function (dataSetid, id, segmentsId, data) {
return request.patch(`/datasets/${dataSetid}/documents/${id}/segments/${segmentsId}`, data)
}
//文档段落添加
export const addDocumentSegments = function (dataSetid, id, data) {
return request.post(`/datasets/${dataSetid}/documents/${id}/segment`, data)
}
//文本生成聊天
export const completionMessages = function (id, json) {
return fetch(`/console/api/apps/${id}/completion-messages`, {
method: "post",
responseType: "stream",
headers: {
Authorization: "Bearer " + sessionStorage.getItem("token"),
"Content-Type": "application/json",
},
body: JSON.stringify(json),
})
}
//获取索引文档
export const messagesConversation = function (id, conversation_id) {
return request.get(`/apps/${id}/chat-messages`, {conversation_id})
}
//应用概览汇总
export const getInteractions = function () {
return request.get("/apps/statistics/basic-quantitative-analysis")
}
//应用数量变化
export const appCount = function () {
return request.get("/apps/statistics/app-count")
}
//应用活跃用户数
export const dailyUsers = function () {
return request.get("/apps/statistics/daily-end-users")
}
//全部消息数
export const dailyConversations = function () {
return request.get("/apps/statistics/daily-conversations")
}
//应用平均会花数
export const averageInteractions = function () {
return request.get("/apps/statistics/average-session-interactions")
}
//知识库,统计
export const tableCounts = function () {
return request.get("/apps/statistics/table-counts")
}
//文档解析top5
export const topLongest = function () {
return request.get("/apps/statistics/top-5-longest")
}
//知识库数量
export const datasetsDailyCount = function () {
return request.get("/apps/statistics/datasets-daily-count")
}
//文档数量
export const documentsDailyCount = function () {
return request.get("/apps/statistics/documents-daily-count")
}
//pdf解析时长分布
export const timeStatistics = function () {
return request.get("/apps/statistics//time-statistics")
}
//历史会话
export const messagesList = function (id, conversation_id) {
return request.get(`/apps/${id}/chat-messages?conversation_id=${conversation_id}&limit=30`)
}
//历史会话
export const completionConversationsHistory = function (id, conversation_id) {
return request.get(`/apps/${id}/completion-conversations/${conversation_id}`)
}
//导入文件
export const batchImport = function (id, file) {
return request.postForm(`/apps/${id}/annotations/batch-import`, { file })
}
//聊天,添加对话记录
export const addName = function (id) {
return api.post(`/conversations/${id}/name`, { auto_generate: true })
}
//修改密码
export const editPassword = function (data) {
return request.post("/account/password", data)
}
//文件大小接口
export const fileSize = function () {
return request.get("/files/upload")
}
//文件类型接口
export const fileType = function () {
return request.get("/files/support-type")
}
//文本记录保存
export const saveMessage = function (message_id) {
return new Promise(resolve => {
api.post("/saved-messages/", {message_id}).then(res => {
if (res.status_code === 200) {
message.success(res.message);
} else {
message.error(res.message);
}
resolve(res.data);
})
})
}
//文本记录查询
export const getMessage = function () {
return api.get("/saved-messages/")
}
//文本记录删除
export const removeMessage = function (id) {
return new Promise(resolve => {
Modal.confirm({
title: '提示',
content: '确认删除当前结果',
onOk() {
api.delete(`/saved-messages/` + id).then((res) => {
if (res.status_code === 200) {
message.success(res.message);
} else {
message.error(res.message);
}
resolve(res.data);
}).catch((e) => {
resolve(false)
})
},
onCancel() {
resolve(false);
}
});
});
}
//获取知识库关联应用
export const relatedApps = function (id) {
return request.get(`/datasets/${id}/related-apps`);
}
//文档重试
export const retry = function (id, document_ids) {
return new Promise(resolve => {
Modal.confirm({
title: '提示',
content: '确认重试该文档',
onOk() {
request.post(`/datasets/${id}/retry`, {document_ids}).then((res) => {
if (res.status_code === 200) {
message.success(res.message || "成功");
} else {
message.error(res.message || "失败");
}
resolve(res.data);
})
},
onCancel() {
resolve(false);
}
});
});
}
//下一步建议
export const suggestedQuestions = function (id, messageId) {
return request.get(`/apps/${id}/chat-messages/${messageId}/suggested-questions`)
}
//聊天。下一步开启
export const chatSuggestedQuestions = function (id) {
return api.get(`/messages/${id}/suggested-questions`)
}
//工具类型查询接口
export const toolLabels = function () {
return request.get("/workspaces/current/tool-labels")
}
//工具详细信息集合接口
export const builtin = function (name, labels) {
return request.get("/workspaces/current/tools/builtin", { name, labels })
}
//自定义工具
export const toolsApi = function (name, labels) {
return request.get("/workspaces/current/tools/api", { name, labels })
}
//发布的工作流
export const toolsWorkflow = function (name, labels) {
return request.get("/workspaces/current/tools/workflow", { name, labels })
}
//获取工具图片
export const toolProviders = function () {
return request.get("/workspaces/current/tool-providers")
}
//获取工具类型
export const getTools = function (type, id) {
return request.get(`/workspaces/current/tool-provider/${type}/${id}/tools`)
}
import axios from "axios";
import type { AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from "axios";
import { ElNotification } from 'element-plus';
import router from "@/router";
let bool = false;
function layout(text?: string) {
!bool && ElNotification.error({
title: "通知",
message: text || "登录超时",
});
!bool && router.push("/login");
bool = true
const timout = setTimeout(() => {
bool = false
clearTimeout(timout);
}, 4500)
}
const regex = /^2([0-9]{2})$/; //判断数字大于等于200,小于300
interface ISettings {
prompt?: boolean; //报错是否全局提示
}
type jsonData = Record<string, any>;
class Config {
private instance: AxiosInstance;
private settings: ISettings;
constructor(
requeseConfig,
settings = { prompt: true },
) {
this.instance = axios.create(requeseConfig);
this.settings = settings;
// 全局请求拦截
this.instance.interceptors.request.use(
(config: InternalAxiosRequestConfig) => {
if (config.baseURL === "/console/api") {
config.headers["Authorization"] = "Bearer " + sessionStorage.getItem("token");
} else if (config.baseURL === "/api") {
config.headers["Authorization"] = "Bearer " + sessionStorage.getItem("console-token");
}
return config;
},
(error) => {
return error;
},
);
// 全局响应拦截
this.instance.interceptors.response.use(
(res) => {
if (res.data.status === 401) {
layout();
return;
}
return res;
},
(error) => {
if (error?.response) {
switch (error.response.status) {
case 400:
this.settings?.prompt &&
ElNotification.error({
title: "通知",
message: error.response.data.message,
});
break;
case 401:
layout(error.response.data.message);
break;
case 403:
this.settings?.prompt &&
ElNotification.error({
title: "通知",
message: error.response.data.message,
});
break;
case 404:
this.settings?.prompt &&
ElNotification.error({
title: "通知",
message: error.response.data.message,
});
break;
case 405:
this.settings?.prompt &&
ElNotification.error({
title: "通知",
message:
"请求方法未允许 " + error.response.data.message,
});
break;
case 408:
this.settings?.prompt &&
ElNotification.error({
title: "通知",
message: error.response.data.message,
});
break;
case 413:
this.settings?.prompt &&
ElNotification.error({
title: "通知",
message: error.response.data.message,
});
break;
case 409:
this.settings?.prompt &&
ElNotification.error({
title: "通知",
message: error.response.data.message,
});
break;
case 500:
this.settings?.prompt &&
ElNotification.error({
title: "通知",
message: error.response.data.message || error.response.data.statusText,
});
break;
case 501:
this.settings?.prompt &&
ElNotification.error({
title: "通知",
message: "网络未实现",
});
break;
case 502:
this.settings?.prompt &&
ElNotification.error({
title: "服务异常",
message: "服务重启中...",
});
break;
case 503:
this.settings?.prompt &&
ElNotification.error({
title: "服务异常",
message: "服务重启中...",
});
break;
case 504:
this.settings?.prompt &&
ElNotification.error({
title: "通知",
message: "网络超时",
});
break;
case 505:
this.settings?.prompt &&
ElNotification.error({
title: "通知",
message: "http版本不支持该请求",
});
break;
default:
this.settings?.prompt &&
ElNotification.error({
title: "通知",
message: `连接错误`,
});
}
}
return error?.response?.data || error;
},
);
}
get(url: string, params?: jsonData, headers?: jsonData) {
return new Promise<any>((resolve, reject) => {
this.instance
.get(url, { params, headers })
.then((res) => {
if (regex.test(res.status as any as string)) {
resolve(res.data);
} else {
reject(res)
}
})
.catch((err) => {
reject(err);
});
});
}
post(url: string, data?: any, params?: jsonData, headers?: jsonData) {
return new Promise<any>((resolve, reject) => {
this.instance
.post(url, data, { params, headers })
.then((res) => {
if (regex.test(res.status as any as string)) {
resolve(res.data);
} else {
reject(res)
}
})
.catch((err) => {
reject(err);
});
});
}
delete(url: string, config?: AxiosRequestConfig) {
return new Promise<any>((resolve, reject) => {
this.instance
.delete(url, config)
.then((res) => {
if (regex.test(res.status as any as string)) {
resolve(res.data);
} else {
reject(res)
}
})
.catch((err) => {
reject(err);
});
});
}
put(url: string, data: any, params?: jsonData, headers?: jsonData) {
return new Promise<any>((resolve, reject) => {
this.instance
.put(url, data, { params, headers })
.then((res) => {
if (regex.test(res.status as any as string)) {
resolve(res.data);
} else {
reject(res)
}
})
.catch((err) => {
reject(err);
});
});
}
patch(url: string, data?: any, params?: jsonData, headers?: jsonData) {
return new Promise<any>((resolve, reject) => {
this.instance
.patch(url, data, { params, headers })
.then((res) => {
if (regex.test(res.status as any as string)) {
resolve(res.data);
} else {
reject(res)
}
})
.catch((err) => {
reject(err);
});
});
}
requestConfig(config: AxiosRequestConfig) {
return new Promise<any>((resolve, reject) => {
this.instance
.request(config)
.then((res) => {
if (regex.test(res.status as any as string)) {
resolve(res.data);
} else {
reject(res)
}
})
.catch((err) => {
reject(err);
});
});
}
postForm(url: string, data: jsonData, params?: jsonData, headers?: jsonData) {
return new Promise<any>((resolve, reject) => {
this.instance
.postForm(url, data, { params, headers })
.then((res) => {
if (regex.test(res.status as any as string)) {
resolve(res.data);
} else {
reject(res)
}
})
.catch((err) => {
reject(err);
});
});
}
}
export default Config;
import Config from "./config";
export const request = new Config({baseURL: "/console/api"});
export const api = new Config({baseURL: "/api"});
export const noPrompt = new Config({baseURL: "/console/api"}, { prompt: false });
<template>
<login-layout>
<LoginContainer subTitle="欢迎使用 MaxKB 智能知识库">
<h2 class="mb-24">忘记密码</h2>
<el-form
class="register-form"
ref="resetPasswordFormRef"
:model="CheckEmailForm"
:rules="rules"
>
<div class="mb-24">
<el-form-item prop="email">
<el-input
size="large"
class="input-item"
v-model="CheckEmailForm.email"
placeholder="请输入邮箱"
>
</el-input>
</el-form-item>
</div>
<div class="mb-24">
<el-form-item prop="code">
<div class="flex-between w-full">
<el-input
size="large"
class="code-input"
v-model="CheckEmailForm.code"
placeholder="请输入验证码"
>
</el-input>
<el-button
:disabled="isDisabled"
size="large"
class="send-email-button ml-12"
@click="sendEmail"
:loading="loading"
>
{{ isDisabled ? `重新发送(${time}s)` : '获取验证码' }}</el-button
>
</div>
</el-form-item>
</div>
</el-form>
<el-button size="large" type="primary" class="w-full" @click="checkCode">立即验证</el-button>
<div class="operate-container mt-12">
<el-button
class="register"
@click="router.push('/login')"
link
type="primary"
icon="ArrowLeft"
>
返回登录
</el-button>
</div>
</LoginContainer>
</login-layout>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import type { CheckCodeRequest } from '@/api/type/user'
import { useRouter } from 'vue-router'
import type { FormInstance, FormRules } from 'element-plus'
import UserApi from '@/api/user'
import { MsgSuccess } from '@/utils/message'
const router = useRouter()
const CheckEmailForm = ref<CheckCodeRequest>({
email: '',
code: '',
type: 'reset_password'
})
const resetPasswordFormRef = ref<FormInstance>()
const rules = ref<FormRules<CheckCodeRequest>>({
email: [
{ required: true, message: '请输入邮箱', trigger: 'blur' },
{
validator: (rule, value, callback) => {
const emailRegExp = /^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$/
if (!emailRegExp.test(value) && value != '') {
callback(new Error('请输入有效邮箱格式!'))
} else {
callback()
}
},
trigger: 'blur'
}
],
code: [{ required: true, message: '请输入验证码' }]
})
const loading = ref<boolean>(false)
const isDisabled = ref<boolean>(false)
const time = ref<number>(60)
const checkCode = () => {
resetPasswordFormRef.value
?.validate()
.then(() => UserApi.checkCode(CheckEmailForm.value, loading))
.then(() => router.push({ name: 'reset_password', params: CheckEmailForm.value }))
}
/**
* 发送验证码
*/
const sendEmail = () => {
resetPasswordFormRef.value?.validateField('email', (v: boolean) => {
if (v) {
UserApi.sendEmit(CheckEmailForm.value.email, 'reset_password', loading).then(() => {
MsgSuccess('发送验证码成功')
isDisabled.value = true
handleTimeChange()
})
}
})
}
const handleTimeChange = () => {
if (time.value <= 0) {
isDisabled.value = false
time.value = 60
} else {
setTimeout(() => {
time.value--
handleTimeChange()
}, 1000)
}
}
</script>
<style lang="scss" scoped></style>
<template>
<login-layout v-if="user.isEnterprise() ? user.themeInfo : true" v-loading="loading">
<LoginContainer :subTitle="user.themeInfo?.slogan || '欢迎使用 MaxKB 智能知识库'">
<LoginContainer subTitle="欢迎使用 快际新云 智能知识库">
<el-form
class="login-form"
:rules="rules"
......@@ -8,45 +8,28 @@
ref="loginFormRef"
@keyup.enter="login"
>
<div class="mb-24">
<el-form-item prop="username">
<el-input
size="large"
class="input-item"
v-model="loginForm.email"
placeholder="请输入用户名"
>
</el-input>
</el-form-item>
</div>
<div class="mb-24">
<el-form-item prop="password">
<el-input
type="password"
size="large"
class="input-item"
v-model="loginForm.password"
placeholder="请输入密码"
show-password
>
</el-input>
</el-form-item>
</div>
<el-form-item prop="username" class="mb-[30px]">
<el-input
size="large"
class="input-item"
v-model="loginForm.email"
placeholder="请输入用户名"
>
</el-input>
</el-form-item>
<el-form-item prop="password" class="mb-[30px]">
<el-input
type="password"
size="large"
class="input-item"
v-model="loginForm.password"
placeholder="请输入密码"
show-password
>
</el-input>
</el-form-item>
</el-form>
<el-button size="large" type="primary" class="w-full" @click="login">登录</el-button>
<div class="operate-container flex-between mt-12">
<!-- <el-button class="register" @click="router.push('/register')" link type="primary">
注册
</el-button> -->
<el-button
class="forgot-password"
@click="router.push('/forgot_password')"
link
type="primary"
>
忘记密码?
</el-button>
</div>
</LoginContainer>
</login-layout>
</template>
......@@ -56,6 +39,7 @@ import type {LoginRequest} from '@/api/type/user'
import {useRouter} from 'vue-router'
import type {FormInstance, FormRules} from 'element-plus'
import useStore from '@/stores'
import { loginPort, userInfo } from '@/utils/api'
const loading = ref<boolean>(false)
const {user} = useStore()
......@@ -86,12 +70,18 @@ const loginFormRef = ref<FormInstance>()
const login = () => {
loginFormRef.value?.validate().then(() => {
loading.value = true
user
.login(loginForm.value.email, loginForm.value.password)
.then(() => {
router.push({name: 'home'})
})
.finally(() => (loading.value = false))
loginPort(loginForm.value).then((res) => {
res && userInfo().then(res => {
sessionStorage.setItem("userInfo", JSON.stringify(res));
const timer = setTimeout(() => {
router.push({name: 'home'});
loading.value = false;
clearTimeout(timer);
}, 300)
})
}).catch(() => {
loading.value = false;
})
})
}
......
<template>
<login-layout>
<LoginContainer subTitle="欢迎使用 MaxKB 智能知识库">
<h2 class="mb-24">用户注册</h2>
<el-form class="register-form" :model="registerForm" :rules="rules" ref="registerFormRef">
<div class="mb-24">
<el-form-item prop="username">
<el-input
size="large"
class="input-item"
v-model="registerForm.username"
placeholder="请输入用户名"
>
</el-input>
</el-form-item>
</div>
<div class="mb-24">
<el-form-item prop="password">
<el-input
type="password"
size="large"
class="input-item"
v-model="registerForm.password"
placeholder="请输入密码"
show-password
>
</el-input>
</el-form-item>
</div>
<div class="mb-24">
<el-form-item prop="re_password">
<el-input
type="password"
size="large"
class="input-item"
v-model="registerForm.re_password"
placeholder="请输入确认密码"
show-password
>
</el-input>
</el-form-item>
</div>
<div class="mb-24">
<el-form-item prop="email">
<el-input
size="large"
class="input-item"
v-model="registerForm.email"
placeholder="请输入邮箱"
>
</el-input>
</el-form-item>
</div>
<div class="mb-24">
<el-form-item prop="code">
<div class="flex-between w-full">
<el-input
size="large"
class="code-input"
v-model="registerForm.code"
placeholder="请输入验证码"
>
</el-input>
<el-button
:disabled="isDisabled"
size="large"
class="send-email-button ml-12"
@click="sendEmail"
:loading="sendEmailLoading"
>
{{ isDisabled ? `重新发送(${time}s)` : '获取验证码' }}</el-button
>
</div>
</el-form-item>
</div>
</el-form>
<el-button size="large" type="primary" class="w-full" @click="register">注册</el-button>
<div class="operate-container mt-12">
<el-button
class="register"
@click="router.push('/login')"
link
type="primary"
icon="ArrowLeft"
>
返回登录
</el-button>
</div>
</LoginContainer>
</login-layout>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import type { RegisterRequest } from '@/api/type/user'
import { useRouter } from 'vue-router'
import UserApi from '@/api/user'
import { MsgSuccess } from '@/utils/message'
import type { FormInstance, FormRules } from 'element-plus'
const router = useRouter()
const registerForm = ref<RegisterRequest>({
username: '',
password: '',
re_password: '',
email: '',
code: ''
})
const rules = ref<FormRules<RegisterRequest>>({
username: [
{
required: true,
message: '请输入用户名',
trigger: 'blur'
},
{
min: 6,
max: 20,
message: '长度在 6 到 20 个字符',
trigger: 'blur'
}
],
password: [
{
required: true,
message: '请输入密码',
trigger: 'blur'
},
{
min: 6,
max: 20,
message: '长度在 6 到 20 个字符',
trigger: 'blur'
}
],
re_password: [
{
required: true,
message: '请输入确认密码',
trigger: 'blur'
},
{
min: 6,
max: 20,
message: '长度在 6 到 20 个字符',
trigger: 'blur'
},
{
validator: (rule, value, callback) => {
if (registerForm.value.password != registerForm.value.re_password) {
callback(new Error('密码不一致'))
} else {
callback()
}
},
trigger: 'blur'
}
],
email: [
{ required: true, message: '请输入邮箱', trigger: 'blur' },
{
validator: (rule, value, callback) => {
const emailRegExp = /^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$/
if (!emailRegExp.test(value) && value != '') {
callback(new Error('请输入有效邮箱格式!'))
} else {
callback()
}
},
trigger: 'blur'
}
],
code: [{ required: true, message: '请输入验证码' }]
})
const registerFormRef = ref<FormInstance>()
const register = () => {
registerFormRef.value
?.validate()
.then(() => {
return UserApi.register(registerForm.value)
})
.then(() => {
router.push('login')
})
}
const sendEmailLoading = ref<boolean>(false)
const isDisabled = ref<boolean>(false)
const time = ref<number>(60)
/**
* 发送验证码
*/
const sendEmail = () => {
registerFormRef.value?.validateField('email', (v: boolean) => {
if (v) {
UserApi.sendEmit(registerForm.value.email, 'register', sendEmailLoading).then(() => {
MsgSuccess('发送验证码成功')
isDisabled.value = true
handleTimeChange()
})
}
})
}
const handleTimeChange = () => {
if (time.value <= 0) {
isDisabled.value = false
time.value = 60
} else {
setTimeout(() => {
time.value--
handleTimeChange()
}, 1000)
}
}
</script>
<style lang="scss" scoped></style>
/** @type {import('tailwindcss').Config} */
export default {
content: ["./index.html", "./src/**/*.{vue,js,jsx,tsx}"],
corePlugins: {
preflight: false,
},
theme: {
screens: {
sm: "640px",
md: "768px",
lg: "1024px",
xl: "1280px",
"2xl": "1536px",
},
colors: {
primary: "#0c599d",
danger: "#ff0000",
white: "#ffffff",
success: "#67C23A",
warning: "#E6A23C",
info: "#909399",
blue: "#409EFF"
},
extend: {},
},
plugins: [],
}
{
"extends": "@vue/tsconfig/tsconfig.dom.json",
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
"exclude": ["src/**/__tests__/*"],
"include": ["env.d.ts", "src/**/*", "src/**/*.vue", "./auto-imports.d.ts"],
"exclude": ["src/**/__tests__/*", "node_modules", "public"],
"compilerOptions": {
"composite": true,
"moduleResolution": "node",
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"target": "ESNext",
"module": "ESNext",
"moduleResolution": "bundler",
"strict": false,
"jsx": "preserve",
"importHelpers": true,
"experimentalDecorators": true,
"strictFunctionTypes": false,
"skipLibCheck": true,
"esModuleInterop": true,
"isolatedModules": true,
"allowSyntheticDefaultImports": true,
"forceConsistentCasingInFileNames": true,
"sourceMap": true,
"allowJs": false,
"resolveJsonModule": true,
"lib": [
"ESNext",
"DOM"
],
"baseUrl": ".",
"target": "esnext", // 使用ES最新语法
"module": "esnext", // 使用ES模块语法
"paths": {
"@/*": ["./src/*"]
"@/*": ["./src/*"],
}
}
}
......@@ -2,27 +2,77 @@ import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from "@vitejs/plugin-vue-jsx";
import vueDevTools from "vite-plugin-vue-devtools";
import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {
return {
plugins: [vue(), vueDevTools()],
plugins: [
vue(),
vueDevTools(),
vueJsx(),
AutoImport({
include: [
/\.[j]sx?$/, // .ts, .tsx, .js, .jsx
/\.vue$/,
/\.vue\?vue/, // .vue
/\.md$/, // .md
],
// 全局引入插件
imports: [
// presets
"vue",
"vue-router",
"pinia",
// custom
{
"@vueuse/core": [
// named imports
"useMouse", // import { useMouse } from '@vueuse/core',
// alias
["useFetch", "useMyFetch"], // import { useFetch as useMyFetch } from '@vueuse/core',
],
},
],
eslintrc: {
enabled: false,
filepath: './.eslintrc-auto-import.json',
globalsPropValue: true,
},
resolvers: [],
}),
Components({
resolvers: [],
}),
],
server: {
port: 8917,
cors: true,
proxy: {
"/console": {
target: "https://klm-service-dev.apps.iytcloud.com/",
changeOrigin: true,
secure: false,
},
"/api": {
target: "http://192.168.121.203:18080",
target: "https://klm-service-dev.apps.iytcloud.com/",
changeOrigin: true,
secure: false,
},
"/workspaces": {
target: "https://klm-service-dev.apps.iytcloud.com/",
changeOrigin: true,
secure: false,
}
},
},
resolve: {
extensions: ['.vue', '.ts', '.js', '.json', '.tsx', '.jsx'],
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
"@": fileURLToPath(new URL("./src", import.meta.url)),
}
},
esbuild: {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论