3 Commits

Author SHA1 Message Date
1010c47dbb chore(deps): update all non-major dependencies
Some checks are pending
renovate/stability-days Updates have not met minimum release age requirement
/ lint-build-and-check (push) Successful in 6m0s
/ surge (push) Successful in 3m26s
/ playwright (push) Successful in 1m37s
/ cleanup_surge (push) Successful in 17s
2025-07-04 13:39:04 +08:00
5487dc321e feat: enhance responsive design for sidebar and drawer in AppLayout
All checks were successful
/ build-and-deploy-to-vercel (push) Successful in 3m12s
/ cleanup_surge (push) Successful in 21s
/ surge (push) Successful in 3m4s
/ playwright (push) Successful in 1m43s
/ lint-build-and-check (push) Successful in 6m5s
2025-07-04 12:34:55 +08:00
ec4906f441 feat: update layout configuration to use naive-ui/AppLayout
All checks were successful
/ build-and-deploy-to-vercel (push) Successful in 3m15s
/ surge (push) Successful in 3m32s
/ playwright (push) Successful in 1m3s
/ cleanup_surge (push) Successful in 13s
/ lint-build-and-check (push) Successful in 6m2s
2025-07-04 12:06:40 +08:00
5 changed files with 432 additions and 108 deletions

View File

@ -49,12 +49,12 @@
"@intlify/unplugin-vue-i18n": "^6.0.8",
"@pinia/colada": "^0.17.1",
"@primeuix/themes": "^1.1.2",
"@splinetool/runtime": "^1.10.19",
"@splinetool/runtime": "^1.10.21",
"@types/p5": "^1.7.6",
"@types/sortablejs": "^1.15.8",
"@unhead/vue": "^2.0.11",
"@vant/use": "^1.6.0",
"@vueuse/core": "^13.4.0",
"@vueuse/core": "^13.5.0",
"alova": "^3.3.4",
"ant-design-vue": "~4.2.6",
"axios": "^1.10.0",
@ -78,7 +78,7 @@
"primevue": "^4.3.5",
"radash": "^12.1.1",
"radix-vue": "^1.9.17",
"reka-ui": "^2.3.1",
"reka-ui": "^2.3.2",
"satellite.js": "^6.0.0",
"sortablejs": "^1.15.6",
"tailwind-merge": "^3.3.1",
@ -90,7 +90,7 @@
"vue": "^3.5.17",
"vue-data-ui": "^2.12.7",
"vue-draggable-plus": "^0.6.0",
"vue-i18n": "^11.1.7",
"vue-i18n": "^11.1.9",
"vue-page-stack": "^3.2.0",
"vue-router": "^4.5.1"
},
@ -160,7 +160,7 @@
"vite-plugin-vue-layouts": "^0.11.0",
"vite-plugin-vue-meta-layouts": "^0.5.1",
"vite-plugin-webfont-dl": "^3.10.5",
"vue-component-type-helpers": "^3.0.0",
"vue-tsc": "^3.0.0"
"vue-component-type-helpers": "^3.0.1",
"vue-tsc": "^3.0.1"
}
}

196
pnpm-lock.yaml generated
View File

@ -6,7 +6,7 @@ settings:
overrides:
vite: ^7.0.0
vue-tsc: ^3.0.0
vue-tsc: ^3.0.1
'@primevue/auto-import-resolver': ^4.3.5
importers:
@ -21,7 +21,7 @@ importers:
version: 0.8.2
'@intlify/unplugin-vue-i18n':
specifier: ^6.0.8
version: 6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.30.1(jiti@2.4.2))(rollup@4.42.0)(typescript@5.8.3)(vue-i18n@11.1.7(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3))
version: 6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.30.1(jiti@2.4.2))(rollup@4.42.0)(typescript@5.8.3)(vue-i18n@11.1.9(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3))
'@pinia/colada':
specifier: ^0.17.1
version: 0.17.1(pinia@3.0.3(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3)))
@ -29,8 +29,8 @@ importers:
specifier: ^1.1.2
version: 1.1.2
'@splinetool/runtime':
specifier: ^1.10.19
version: 1.10.19
specifier: ^1.10.21
version: 1.10.21
'@types/p5':
specifier: ^1.7.6
version: 1.7.6
@ -44,8 +44,8 @@ importers:
specifier: ^1.6.0
version: 1.6.0(vue@3.5.17(typescript@5.8.3))
'@vueuse/core':
specifier: ^13.4.0
version: 13.4.0(vue@3.5.17(typescript@5.8.3))
specifier: ^13.5.0
version: 13.5.0(vue@3.5.17(typescript@5.8.3))
alova:
specifier: ^3.3.4
version: 3.3.4
@ -116,8 +116,8 @@ importers:
specifier: ^1.9.17
version: 1.9.17(vue@3.5.17(typescript@5.8.3))
reka-ui:
specifier: ^2.3.1
version: 2.3.1(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3))
specifier: ^2.3.2
version: 2.3.2(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3))
satellite.js:
specifier: ^6.0.0
version: 6.0.0
@ -138,7 +138,7 @@ importers:
version: 4.1.0
utils4u:
specifier: ^4.2.3
version: 4.2.3(@vueuse/core@13.4.0(vue@3.5.17(typescript@5.8.3)))(dayjs@1.11.13)(nprogress@0.2.0)(primevue@4.3.5(vue@3.5.17(typescript@5.8.3)))(vant@4.9.20(vue@3.5.17(typescript@5.8.3)))(vue-router@4.5.1(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3))
version: 4.2.3(@vueuse/core@13.5.0(vue@3.5.17(typescript@5.8.3)))(dayjs@1.11.13)(nprogress@0.2.0)(primevue@4.3.5(vue@3.5.17(typescript@5.8.3)))(vant@4.9.20(vue@3.5.17(typescript@5.8.3)))(vue-router@4.5.1(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3))
vant:
specifier: ^4.9.20
version: 4.9.20(vue@3.5.17(typescript@5.8.3))
@ -152,8 +152,8 @@ importers:
specifier: ^0.6.0
version: 0.6.0(@types/sortablejs@1.15.8)
vue-i18n:
specifier: ^11.1.7
version: 11.1.7(vue@3.5.17(typescript@5.8.3))
specifier: ^11.1.9
version: 11.1.9(vue@3.5.17(typescript@5.8.3))
vue-page-stack:
specifier: ^3.2.0
version: 3.2.0(vue-router@4.5.1(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3))
@ -304,7 +304,7 @@ importers:
version: 0.5.0(unocss-preset-animations@1.2.1(@unocss/preset-wind3@66.3.2)(unocss@66.3.2(postcss@8.5.6)(vite@7.0.0(@types/node@22.16.0)(jiti@2.4.2)(less@4.3.0)(sass-embedded@1.89.1)(terser@5.42.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))))(unocss@66.3.2(postcss@8.5.6)(vite@7.0.0(@types/node@22.16.0)(jiti@2.4.2)(less@4.3.0)(sass-embedded@1.89.1)(terser@5.42.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)))
unplugin-auto-import:
specifier: ^19.3.0
version: 19.3.0(@nuxt/kit@3.17.5)(@vueuse/core@13.4.0(vue@3.5.17(typescript@5.8.3)))
version: 19.3.0(@nuxt/kit@3.17.5)(@vueuse/core@13.5.0(vue@3.5.17(typescript@5.8.3)))
unplugin-icons:
specifier: ^22.1.0
version: 22.1.0(@vue/compiler-sfc@3.5.17)
@ -313,7 +313,7 @@ importers:
version: 28.8.0(@babel/parser@7.27.7)(@nuxt/kit@3.17.5)(vue@3.5.17(typescript@5.8.3))
unplugin-vue-macros:
specifier: ^2.14.5
version: 2.14.5(@vueuse/core@13.4.0(vue@3.5.17(typescript@5.8.3)))(esbuild@0.25.5)(rollup@4.42.0)(typescript@5.8.3)(vite@7.0.0(@types/node@22.16.0)(jiti@2.4.2)(less@4.3.0)(sass-embedded@1.89.1)(terser@5.42.0)(yaml@2.8.0))(vue-tsc@3.0.0(typescript@5.8.3))(vue@3.5.17(typescript@5.8.3))
version: 2.14.5(@vueuse/core@13.5.0(vue@3.5.17(typescript@5.8.3)))(esbuild@0.25.5)(rollup@4.42.0)(typescript@5.8.3)(vite@7.0.0(@types/node@22.16.0)(jiti@2.4.2)(less@4.3.0)(sass-embedded@1.89.1)(terser@5.42.0)(yaml@2.8.0))(vue-tsc@3.0.1(typescript@5.8.3))(vue@3.5.17(typescript@5.8.3))
unplugin-vue-markdown:
specifier: ^29.1.0
version: 29.1.0(vite@7.0.0(@types/node@22.16.0)(jiti@2.4.2)(less@4.3.0)(sass-embedded@1.89.1)(terser@5.42.0)(yaml@2.8.0))
@ -328,7 +328,7 @@ importers:
version: 7.0.0(@types/node@22.16.0)(jiti@2.4.2)(less@4.3.0)(sass-embedded@1.89.1)(terser@5.42.0)(yaml@2.8.0)
vite-plugin-checker:
specifier: ^0.9.3
version: 0.9.3(eslint@9.30.1(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@7.0.0(@types/node@22.16.0)(jiti@2.4.2)(less@4.3.0)(sass-embedded@1.89.1)(terser@5.42.0)(yaml@2.8.0))(vue-tsc@3.0.0(typescript@5.8.3))
version: 0.9.3(eslint@9.30.1(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@7.0.0(@types/node@22.16.0)(jiti@2.4.2)(less@4.3.0)(sass-embedded@1.89.1)(terser@5.42.0)(yaml@2.8.0))(vue-tsc@3.0.1(typescript@5.8.3))
vite-plugin-fake-server:
specifier: ^2.2.0
version: 2.2.0
@ -357,11 +357,11 @@ importers:
specifier: ^3.10.5
version: 3.10.5(vite@7.0.0(@types/node@22.16.0)(jiti@2.4.2)(less@4.3.0)(sass-embedded@1.89.1)(terser@5.42.0)(yaml@2.8.0))
vue-component-type-helpers:
specifier: ^3.0.0
version: 3.0.0
specifier: ^3.0.1
version: 3.0.1
vue-tsc:
specifier: ^3.0.0
version: 3.0.0(typescript@5.8.3)
specifier: ^3.0.1
version: 3.0.1(typescript@5.8.3)
packages:
@ -1208,24 +1208,24 @@ packages:
vue-i18n:
optional: true
'@intlify/core-base@11.1.7':
resolution: {integrity: sha512-gYiGnQeJVp3kNBeXQ73m1uFOak0ry4av8pn+IkEWigyyPWEMGzB+xFeQdmGMFn49V+oox6294oGVff8bYOhtOw==}
'@intlify/core-base@11.1.9':
resolution: {integrity: sha512-Lrdi4wp3XnGhWmB/mMD/XtfGUw1Jt+PGpZI/M63X1ZqhTDjNHRVCs/i8vv8U1cwaj1A9fb0bkCQHLSL0SK+pIQ==}
engines: {node: '>= 16'}
'@intlify/message-compiler@11.1.5':
resolution: {integrity: sha512-YLSBbjD7qUdShe3ZAat9Hnf9E8FRpN6qmNFD/x5Xg5JVXjsks0kJ90Zj6aAuyoppJQA/YJdWZ8/bB7k3dg2TjQ==}
engines: {node: '>= 16'}
'@intlify/message-compiler@11.1.7':
resolution: {integrity: sha512-0ezkep1AT30NyuKj8QbRlmvMORCCRlOIIu9v8RNU8SwDjjTiFCZzczCORMns2mCH4HZ1nXgrfkKzYUbfjNRmng==}
'@intlify/message-compiler@11.1.9':
resolution: {integrity: sha512-84SNs3Ikjg0rD1bOuchzb3iK1vR2/8nxrkyccIl5DjFTeMzE/Fxv6X+A7RN5ZXjEWelc1p5D4kHA6HEOhlKL5Q==}
engines: {node: '>= 16'}
'@intlify/shared@11.1.5':
resolution: {integrity: sha512-+I4vRzHm38VjLr/CAciEPJhGYFzWWW4HMTm+6H3WqknXLh0ozNX9oC8ogMUwTSXYR/wGUb1/lTpNziiCH5MybQ==}
engines: {node: '>= 16'}
'@intlify/shared@11.1.7':
resolution: {integrity: sha512-4yZeMt2Aa/7n5Ehy4KalUlvt3iRLcg1tq9IBVfOgkyWFArN4oygn6WxgGIFibP3svpaH8DarbNaottq+p0gUZQ==}
'@intlify/shared@11.1.9':
resolution: {integrity: sha512-H/83xgU1l8ox+qG305p6ucmoy93qyjIPnvxGWRA7YdOoHe1tIiW9IlEu4lTdsOR7cfP1ecrwyflQSqXdXBacXA==}
engines: {node: '>= 16'}
'@intlify/unplugin-vue-i18n@6.0.8':
@ -1631,8 +1631,8 @@ packages:
resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
engines: {node: '>=18'}
'@splinetool/runtime@1.10.19':
resolution: {integrity: sha512-DNEQ+ai3q25rP9An8R55Ics1KmeFseYVFUWLREJORlS/Uw8P9QJGBOPK1LocmxlaxwUlmRneG1gtWj5QmIUJLA==}
'@splinetool/runtime@1.10.21':
resolution: {integrity: sha512-Ru4OMefF9SYqWAZBGlEX57XjPsenQXZvX/w0PLjky5FEBwJJ4fS74JM9FQATFd6ltZvr8W5ch56R4g5Y2UUBSQ==}
'@spz-loader/core@0.1.0':
resolution: {integrity: sha512-atqn/DLy0xNkqRgz3l/5CD12y1M44JdjTmAFQYDKvzf0pIyj+NlJ/PeCRlSJQfXmZ2JndNOCpcGOFVldANf/EA==}
@ -2078,17 +2078,17 @@ packages:
'@volar/language-core@2.4.14':
resolution: {integrity: sha512-X6beusV0DvuVseaOEy7GoagS4rYHgDHnTrdOj5jeUb49fW5ceQyP9Ej5rBhqgz2wJggl+2fDbbojq1XKaxDi6w==}
'@volar/language-core@2.4.16':
resolution: {integrity: sha512-mcoAFkYVQV4iiLYjTlbolbsm9hhDLtz4D4wTG+rwzSCUbEnxEec+KBlneLMlfdVNjkVEh8lUUSsCGNEQR+hFdA==}
'@volar/language-core@2.4.17':
resolution: {integrity: sha512-chmRZMbKmcGpKMoO7Reb70uiLrzo0KWC2CkFttKUuKvrE+VYgi+fL9vWMJ07Fv5ulX0V1TAyyacN9q3nc5/ecA==}
'@volar/source-map@2.4.14':
resolution: {integrity: sha512-5TeKKMh7Sfxo8021cJfmBzcjfY1SsXsPMMjMvjY7ivesdnybqqS+GxGAoXHAOUawQTwtdUxgP65Im+dEmvWtYQ==}
'@volar/source-map@2.4.16':
resolution: {integrity: sha512-4rBiAhOw4MfFTpkvweDnjbDkixpmWNgBws95rpu2oFdMprkTtqFEb8pUOxQ/ruru8/zXSYLwRNXNozznjW9Vtw==}
'@volar/source-map@2.4.17':
resolution: {integrity: sha512-QDybtQyO3Ms/NjFqNHTC5tbDN2oK5VH7ZaKrcubtfHBDj63n2pizHC3wlMQ+iT55kQXZUUAbmBX5L1C8CHFeBw==}
'@volar/typescript@2.4.16':
resolution: {integrity: sha512-CrRuG20euPerYc4H0kvDWSSLTBo6qgSI1/0BjXL9ogjm5j6l0gIffvNzEvfmVjr8TAuoMPD0NxuEkteIapfZQQ==}
'@volar/typescript@2.4.17':
resolution: {integrity: sha512-3paEFNh4P5DkgNUB2YkTRrfUekN4brAXxd3Ow1syMqdIPtCZHbUy4AW99S5RO/7mzyTWPMdDSo3mqTpB/LPObQ==}
'@vue-macros/api@0.13.4':
resolution: {integrity: sha512-owQSbo1sVzMBZpu8MJ6GiSxwBDMSOgqBIajZj1HOj6U8wTHk/F55X77I02PZi+/TXgGdGSVK2OsiV8dOLgiCcg==}
@ -2257,7 +2257,7 @@ packages:
resolution: {integrity: sha512-CU2/XTH1Md06bpE+Opc8LDnY9t06tX8V2daZTWemsNb2NxxzRE+5Xj+EUGR/pG3R9dDXAZ7kQfERiIgO+dAb8w==}
engines: {node: '>=16.14.0'}
peerDependencies:
vue-tsc: ^3.0.0
vue-tsc: ^3.0.1
peerDependenciesMeta:
vue-tsc:
optional: true
@ -2353,8 +2353,8 @@ packages:
typescript:
optional: true
'@vue/language-core@3.0.0':
resolution: {integrity: sha512-V+bSGOIuE59SAVNwzpoyk3VoytmqKPd3RBaHb0ROmK5SNOe9+774t4zmWxzztZGAg3FOGQnb1ZhXECyXLPzWZA==}
'@vue/language-core@3.0.1':
resolution: {integrity: sha512-sq+/Mc1IqIexWEQ+Q2XPiDb5SxSvY5JPqHnMOl/PlF5BekslzduX8dglSkpC17VeiAQB6dpS+4aiwNLJRduCNw==}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
@ -2401,8 +2401,8 @@ packages:
'@vueuse/core@12.8.2':
resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==}
'@vueuse/core@13.4.0':
resolution: {integrity: sha512-OnK7zW3bTq/QclEk17+vDFN3tuAm8ONb9zQUIHrYQkkFesu3WeGUx/3YzpEp+ly53IfDAT9rsYXgGW6piNZC5w==}
'@vueuse/core@13.5.0':
resolution: {integrity: sha512-wV7z0eUpifKmvmN78UBZX8T7lMW53Nrk6JP5+6hbzrB9+cJ3jr//hUlhl9TZO/03bUkMK6gGkQpqOPWoabr72g==}
peerDependencies:
vue: ^3.5.0
@ -2412,8 +2412,8 @@ packages:
'@vueuse/metadata@12.8.2':
resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==}
'@vueuse/metadata@13.4.0':
resolution: {integrity: sha512-CPDQ/IgOeWbqItg1c/pS+Ulum63MNbpJ4eecjFJqgD/JUCJ822zLfpw6M9HzSvL6wbzMieOtIAW/H8deQASKHg==}
'@vueuse/metadata@13.5.0':
resolution: {integrity: sha512-euhItU3b0SqXxSy8u1XHxUCdQ8M++bsRs+TYhOLDU/OykS7KvJnyIFfep0XM5WjIFry9uAPlVSjmVHiqeshmkw==}
'@vueuse/shared@10.11.1':
resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==}
@ -2421,8 +2421,8 @@ packages:
'@vueuse/shared@12.8.2':
resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==}
'@vueuse/shared@13.4.0':
resolution: {integrity: sha512-+AxuKbw8R1gYy5T21V5yhadeNM7rJqb4cPaRI9DdGnnNl3uqXh+unvQ3uCaA2DjYLbNr1+l7ht/B4qEsRegX6A==}
'@vueuse/shared@13.5.0':
resolution: {integrity: sha512-K7GrQIxJ/ANtucxIXbQlUHdB0TPA8c+q5i+zbrjxuhJCnJ9GtBg75sBSnvmLSxHKPg2Yo8w62PWksl9kwH0Q8g==}
peerDependencies:
vue: ^3.5.0
@ -4491,8 +4491,8 @@ packages:
resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==}
hasBin: true
reka-ui@2.3.1:
resolution: {integrity: sha512-2SjGeybd7jvD8EQUkzjgg7GdOQdf4cTwdVMq/lDNTMqneUFNnryGO43dg8WaM/jaG9QpSCZBvstfBFWlDdb2Zg==}
reka-ui@2.3.2:
resolution: {integrity: sha512-lCysSCILH2uqShEnt93/qzlXnB7ySvK7scR0Q5C+a2iXwFVzHhvZQsMaSnbQYueoCihx6yyUZTYECepnmKrbRA==}
peerDependencies:
vue: '>= 3.2.0'
@ -5224,7 +5224,7 @@ packages:
vite: ^7.0.0
vls: '*'
vti: '*'
vue-tsc: ^3.0.0
vue-tsc: ^3.0.1
peerDependenciesMeta:
'@biomejs/biome':
optional: true
@ -5359,8 +5359,8 @@ packages:
vue-component-type-helpers@2.2.10:
resolution: {integrity: sha512-iDUO7uQK+Sab2tYuiP9D1oLujCWlhHELHMgV/cB13cuGbG4qwkLHvtfWb6FzvxrIOPDnU0oHsz2MlQjhYDeaHA==}
vue-component-type-helpers@3.0.0:
resolution: {integrity: sha512-J1HtqhZIqmYoNg4SLcYVFdCdsVUkMo4Z6/Wx4sQMfY8TFIIqDmd3mS2whfBIKzAA7dHMexarwYbvtB/fOUuEsw==}
vue-component-type-helpers@3.0.1:
resolution: {integrity: sha512-j23mCB5iEbGsyIhnVdXdWUOg+UdwmVxpKnYYf2j+4ppCt5VSFXKjwu9YFt0QYxUaf5G99PuHsVfRScjHCRSsGQ==}
vue-data-ui@2.12.7:
resolution: {integrity: sha512-at75OR5o46oqwHsXdQlmNEXglWVjSG5sBBHXrUdfLX9cNymKdZmTlYk4qXp2X021CvRrTABkFTAij0Z2k2sgcw==}
@ -5402,8 +5402,8 @@ packages:
peerDependencies:
vue: ^3.4.37
vue-i18n@11.1.7:
resolution: {integrity: sha512-CDrU7Cmyh1AxJjerQmipV9nVa//exVBdhTcWGlbfcDCN8bKp/uAe7Le6IoN4//5emIikbsSKe9Uofmf/xXkhOA==}
vue-i18n@11.1.9:
resolution: {integrity: sha512-N9ZTsXdRmX38AwS9F6Rh93RtPkvZTkSy/zNv63FTIwZCUbLwwrpqlKz9YQuzFLdlvRdZTnWAUE5jMxr8exdl7g==}
engines: {node: '>= 16'}
peerDependencies:
vue: ^3.0.0
@ -5419,8 +5419,8 @@ packages:
peerDependencies:
vue: ^3.2.0
vue-tsc@3.0.0:
resolution: {integrity: sha512-oDJk0cadq1yZIZ87xgMzyfvl8Z81xNHsi4gMt7bZ7zulWev/ZlyGBO1BWyuVxB+BSRkMhSe9ZoX++eIQWYPU3g==}
vue-tsc@3.0.1:
resolution: {integrity: sha512-UvMLQD0hAGL1g/NfEQelnSVB4H5gtf/gz2lJKjMMwWNOUmSNyWkejwJagAxEbSjtV5CPPJYslOtoSuqJ63mhdg==}
hasBin: true
peerDependencies:
typescript: '>=5.0.0'
@ -6393,7 +6393,7 @@ snapshots:
dependencies:
'@swc/helpers': 0.5.17
'@intlify/bundle-utils@10.0.1(vue-i18n@11.1.7(vue@3.5.17(typescript@5.8.3)))':
'@intlify/bundle-utils@10.0.1(vue-i18n@11.1.9(vue@3.5.17(typescript@5.8.3)))':
dependencies:
'@intlify/message-compiler': 11.1.5
'@intlify/shared': 11.1.5
@ -6405,33 +6405,33 @@ snapshots:
source-map-js: 1.2.1
yaml-eslint-parser: 1.3.0
optionalDependencies:
vue-i18n: 11.1.7(vue@3.5.17(typescript@5.8.3))
vue-i18n: 11.1.9(vue@3.5.17(typescript@5.8.3))
'@intlify/core-base@11.1.7':
'@intlify/core-base@11.1.9':
dependencies:
'@intlify/message-compiler': 11.1.7
'@intlify/shared': 11.1.7
'@intlify/message-compiler': 11.1.9
'@intlify/shared': 11.1.9
'@intlify/message-compiler@11.1.5':
dependencies:
'@intlify/shared': 11.1.5
source-map-js: 1.2.1
'@intlify/message-compiler@11.1.7':
'@intlify/message-compiler@11.1.9':
dependencies:
'@intlify/shared': 11.1.7
'@intlify/shared': 11.1.9
source-map-js: 1.2.1
'@intlify/shared@11.1.5': {}
'@intlify/shared@11.1.7': {}
'@intlify/shared@11.1.9': {}
'@intlify/unplugin-vue-i18n@6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.30.1(jiti@2.4.2))(rollup@4.42.0)(typescript@5.8.3)(vue-i18n@11.1.7(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3))':
'@intlify/unplugin-vue-i18n@6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.30.1(jiti@2.4.2))(rollup@4.42.0)(typescript@5.8.3)(vue-i18n@11.1.9(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3))':
dependencies:
'@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2))
'@intlify/bundle-utils': 10.0.1(vue-i18n@11.1.7(vue@3.5.17(typescript@5.8.3)))
'@intlify/bundle-utils': 10.0.1(vue-i18n@11.1.9(vue@3.5.17(typescript@5.8.3)))
'@intlify/shared': 11.1.5
'@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.5)(@vue/compiler-dom@3.5.17)(vue-i18n@11.1.7(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3))
'@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.5)(@vue/compiler-dom@3.5.17)(vue-i18n@11.1.9(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3))
'@rollup/pluginutils': 5.1.4(rollup@4.42.0)
'@typescript-eslint/scope-manager': 8.33.1
'@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3)
@ -6445,7 +6445,7 @@ snapshots:
unplugin: 1.16.1
vue: 3.5.17(typescript@5.8.3)
optionalDependencies:
vue-i18n: 11.1.7(vue@3.5.17(typescript@5.8.3))
vue-i18n: 11.1.9(vue@3.5.17(typescript@5.8.3))
transitivePeerDependencies:
- '@vue/compiler-dom'
- eslint
@ -6453,14 +6453,14 @@ snapshots:
- supports-color
- typescript
'@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.5)(@vue/compiler-dom@3.5.17)(vue-i18n@11.1.7(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3))':
'@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.5)(@vue/compiler-dom@3.5.17)(vue-i18n@11.1.9(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3))':
dependencies:
'@babel/parser': 7.27.5
optionalDependencies:
'@intlify/shared': 11.1.5
'@vue/compiler-dom': 3.5.17
vue: 3.5.17(typescript@5.8.3)
vue-i18n: 11.1.7(vue@3.5.17(typescript@5.8.3))
vue-i18n: 11.1.9(vue@3.5.17(typescript@5.8.3))
'@isaacs/cliui@8.0.2':
dependencies:
@ -6781,7 +6781,7 @@ snapshots:
'@sindresorhus/merge-streams@4.0.0': {}
'@splinetool/runtime@1.10.19':
'@splinetool/runtime@1.10.21':
dependencies:
on-change: 4.0.2
semver-compare: 1.0.0
@ -7297,17 +7297,17 @@ snapshots:
dependencies:
'@volar/source-map': 2.4.14
'@volar/language-core@2.4.16':
'@volar/language-core@2.4.17':
dependencies:
'@volar/source-map': 2.4.16
'@volar/source-map': 2.4.17
'@volar/source-map@2.4.14': {}
'@volar/source-map@2.4.16': {}
'@volar/source-map@2.4.17': {}
'@volar/typescript@2.4.16':
'@volar/typescript@2.4.17':
dependencies:
'@volar/language-core': 2.4.16
'@volar/language-core': 2.4.17
path-browserify: 1.0.1
vscode-uri: 3.1.0
@ -7375,13 +7375,13 @@ snapshots:
unplugin: 1.16.1
vue: 3.5.17(typescript@5.8.3)
'@vue-macros/define-models@1.3.5(@vueuse/core@13.4.0(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3))':
'@vue-macros/define-models@1.3.5(@vueuse/core@13.5.0(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3))':
dependencies:
'@vue-macros/common': 1.16.1(vue@3.5.17(typescript@5.8.3))
ast-walker-scope: 0.6.2
unplugin: 1.16.1
optionalDependencies:
'@vueuse/core': 13.4.0(vue@3.5.17(typescript@5.8.3))
'@vueuse/core': 13.5.0(vue@3.5.17(typescript@5.8.3))
transitivePeerDependencies:
- vue
@ -7536,7 +7536,7 @@ snapshots:
transitivePeerDependencies:
- vue
'@vue-macros/volar@0.30.15(typescript@5.8.3)(vue-tsc@3.0.0(typescript@5.8.3))(vue@3.5.17(typescript@5.8.3))':
'@vue-macros/volar@0.30.15(typescript@5.8.3)(vue-tsc@3.0.1(typescript@5.8.3))(vue@3.5.17(typescript@5.8.3))':
dependencies:
'@vue-macros/boolean-prop': 0.5.5(vue@3.5.17(typescript@5.8.3))
'@vue-macros/common': 1.16.1(vue@3.5.17(typescript@5.8.3))
@ -7547,7 +7547,7 @@ snapshots:
muggle-string: 0.4.1
ts-macro: 0.1.33
optionalDependencies:
vue-tsc: 3.0.0(typescript@5.8.3)
vue-tsc: 3.0.1(typescript@5.8.3)
transitivePeerDependencies:
- typescript
- vue
@ -7754,9 +7754,9 @@ snapshots:
optionalDependencies:
typescript: 5.8.3
'@vue/language-core@3.0.0(typescript@5.8.3)':
'@vue/language-core@3.0.1(typescript@5.8.3)':
dependencies:
'@volar/language-core': 2.4.16
'@volar/language-core': 2.4.17
'@vue/compiler-dom': 3.5.17
'@vue/compiler-vue2': 2.7.16
'@vue/shared': 3.5.17
@ -7822,18 +7822,18 @@ snapshots:
transitivePeerDependencies:
- typescript
'@vueuse/core@13.4.0(vue@3.5.17(typescript@5.8.3))':
'@vueuse/core@13.5.0(vue@3.5.17(typescript@5.8.3))':
dependencies:
'@types/web-bluetooth': 0.0.21
'@vueuse/metadata': 13.4.0
'@vueuse/shared': 13.4.0(vue@3.5.17(typescript@5.8.3))
'@vueuse/metadata': 13.5.0
'@vueuse/shared': 13.5.0(vue@3.5.17(typescript@5.8.3))
vue: 3.5.17(typescript@5.8.3)
'@vueuse/metadata@10.11.1': {}
'@vueuse/metadata@12.8.2': {}
'@vueuse/metadata@13.4.0': {}
'@vueuse/metadata@13.5.0': {}
'@vueuse/shared@10.11.1(vue@3.5.17(typescript@5.8.3))':
dependencies:
@ -7848,7 +7848,7 @@ snapshots:
transitivePeerDependencies:
- typescript
'@vueuse/shared@13.4.0(vue@3.5.17(typescript@5.8.3))':
'@vueuse/shared@13.5.0(vue@3.5.17(typescript@5.8.3))':
dependencies:
vue: 3.5.17(typescript@5.8.3)
@ -9994,7 +9994,7 @@ snapshots:
dependencies:
jsesc: 3.0.2
reka-ui@2.3.1(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3)):
reka-ui@2.3.2(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3)):
dependencies:
'@floating-ui/dom': 1.7.1
'@floating-ui/vue': 1.1.6(vue@3.5.17(typescript@5.8.3))
@ -10567,7 +10567,7 @@ snapshots:
- supports-color
- vue
unplugin-auto-import@19.3.0(@nuxt/kit@3.17.5)(@vueuse/core@13.4.0(vue@3.5.17(typescript@5.8.3))):
unplugin-auto-import@19.3.0(@nuxt/kit@3.17.5)(@vueuse/core@13.5.0(vue@3.5.17(typescript@5.8.3))):
dependencies:
local-pkg: 1.1.1
magic-string: 0.30.17
@ -10577,7 +10577,7 @@ snapshots:
unplugin-utils: 0.2.4
optionalDependencies:
'@nuxt/kit': 3.17.5
'@vueuse/core': 13.4.0(vue@3.5.17(typescript@5.8.3))
'@vueuse/core': 13.5.0(vue@3.5.17(typescript@5.8.3))
unplugin-combine@1.2.1(esbuild@0.25.5)(rollup@4.42.0)(unplugin@1.16.1)(vite@7.0.0(@types/node@22.16.0)(jiti@2.4.2)(less@4.3.0)(sass-embedded@1.89.1)(terser@5.42.0)(yaml@2.8.0)):
optionalDependencies:
@ -10628,7 +10628,7 @@ snapshots:
transitivePeerDependencies:
- vue
unplugin-vue-macros@2.14.5(@vueuse/core@13.4.0(vue@3.5.17(typescript@5.8.3)))(esbuild@0.25.5)(rollup@4.42.0)(typescript@5.8.3)(vite@7.0.0(@types/node@22.16.0)(jiti@2.4.2)(less@4.3.0)(sass-embedded@1.89.1)(terser@5.42.0)(yaml@2.8.0))(vue-tsc@3.0.0(typescript@5.8.3))(vue@3.5.17(typescript@5.8.3)):
unplugin-vue-macros@2.14.5(@vueuse/core@13.5.0(vue@3.5.17(typescript@5.8.3)))(esbuild@0.25.5)(rollup@4.42.0)(typescript@5.8.3)(vite@7.0.0(@types/node@22.16.0)(jiti@2.4.2)(less@4.3.0)(sass-embedded@1.89.1)(terser@5.42.0)(yaml@2.8.0))(vue-tsc@3.0.1(typescript@5.8.3))(vue@3.5.17(typescript@5.8.3)):
dependencies:
'@vue-macros/better-define': 1.11.4(vue@3.5.17(typescript@5.8.3))
'@vue-macros/boolean-prop': 0.5.5(vue@3.5.17(typescript@5.8.3))
@ -10636,7 +10636,7 @@ snapshots:
'@vue-macros/common': 1.16.1(vue@3.5.17(typescript@5.8.3))
'@vue-macros/config': 0.6.1(vue@3.5.17(typescript@5.8.3))
'@vue-macros/define-emit': 0.5.4(vue@3.5.17(typescript@5.8.3))
'@vue-macros/define-models': 1.3.5(@vueuse/core@13.4.0(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3))
'@vue-macros/define-models': 1.3.5(@vueuse/core@13.5.0(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3))
'@vue-macros/define-prop': 0.6.5(vue@3.5.17(typescript@5.8.3))
'@vue-macros/define-props': 4.0.6(@vue-macros/reactivity-transform@1.1.6(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3))
'@vue-macros/define-props-refs': 1.3.5(vue@3.5.17(typescript@5.8.3))
@ -10658,7 +10658,7 @@ snapshots:
'@vue-macros/short-bind': 1.1.5(vue@3.5.17(typescript@5.8.3))
'@vue-macros/short-emits': 1.6.5(vue@3.5.17(typescript@5.8.3))
'@vue-macros/short-vmodel': 1.5.5(vue@3.5.17(typescript@5.8.3))
'@vue-macros/volar': 0.30.15(typescript@5.8.3)(vue-tsc@3.0.0(typescript@5.8.3))(vue@3.5.17(typescript@5.8.3))
'@vue-macros/volar': 0.30.15(typescript@5.8.3)(vue-tsc@3.0.1(typescript@5.8.3))(vue@3.5.17(typescript@5.8.3))
unplugin: 1.16.1
unplugin-combine: 1.2.1(esbuild@0.25.5)(rollup@4.42.0)(unplugin@1.16.1)(vite@7.0.0(@types/node@22.16.0)(jiti@2.4.2)(less@4.3.0)(sass-embedded@1.89.1)(terser@5.42.0)(yaml@2.8.0))
unplugin-vue-define-options: 1.5.5(vue@3.5.17(typescript@5.8.3))
@ -10766,9 +10766,9 @@ snapshots:
util-deprecate@1.0.2: {}
utils4u@4.2.3(@vueuse/core@13.4.0(vue@3.5.17(typescript@5.8.3)))(dayjs@1.11.13)(nprogress@0.2.0)(primevue@4.3.5(vue@3.5.17(typescript@5.8.3)))(vant@4.9.20(vue@3.5.17(typescript@5.8.3)))(vue-router@4.5.1(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3)):
utils4u@4.2.3(@vueuse/core@13.5.0(vue@3.5.17(typescript@5.8.3)))(dayjs@1.11.13)(nprogress@0.2.0)(primevue@4.3.5(vue@3.5.17(typescript@5.8.3)))(vant@4.9.20(vue@3.5.17(typescript@5.8.3)))(vue-router@4.5.1(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3)):
optionalDependencies:
'@vueuse/core': 13.4.0(vue@3.5.17(typescript@5.8.3))
'@vueuse/core': 13.5.0(vue@3.5.17(typescript@5.8.3))
dayjs: 1.11.13
nprogress: 0.2.0
primevue: 4.3.5(vue@3.5.17(typescript@5.8.3))
@ -10797,7 +10797,7 @@ snapshots:
dependencies:
vite: 7.0.0(@types/node@22.16.0)(jiti@2.4.2)(less@4.3.0)(sass-embedded@1.89.1)(terser@5.42.0)(yaml@2.8.0)
vite-plugin-checker@0.9.3(eslint@9.30.1(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@7.0.0(@types/node@22.16.0)(jiti@2.4.2)(less@4.3.0)(sass-embedded@1.89.1)(terser@5.42.0)(yaml@2.8.0))(vue-tsc@3.0.0(typescript@5.8.3)):
vite-plugin-checker@0.9.3(eslint@9.30.1(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@7.0.0(@types/node@22.16.0)(jiti@2.4.2)(less@4.3.0)(sass-embedded@1.89.1)(terser@5.42.0)(yaml@2.8.0))(vue-tsc@3.0.1(typescript@5.8.3)):
dependencies:
'@babel/code-frame': 7.27.1
chokidar: 4.0.3
@ -10813,7 +10813,7 @@ snapshots:
eslint: 9.30.1(jiti@2.4.2)
optionator: 0.9.4
typescript: 5.8.3
vue-tsc: 3.0.0(typescript@5.8.3)
vue-tsc: 3.0.1(typescript@5.8.3)
vite-plugin-fake-server@2.2.0:
dependencies:
@ -10949,7 +10949,7 @@ snapshots:
vue-component-type-helpers@2.2.10: {}
vue-component-type-helpers@3.0.0: {}
vue-component-type-helpers@3.0.1: {}
vue-data-ui@2.12.7(vue@3.5.17(typescript@5.8.3)):
dependencies:
@ -10980,10 +10980,10 @@ snapshots:
dependencies:
vue: 3.5.17(typescript@5.8.3)
vue-i18n@11.1.7(vue@3.5.17(typescript@5.8.3)):
vue-i18n@11.1.9(vue@3.5.17(typescript@5.8.3)):
dependencies:
'@intlify/core-base': 11.1.7
'@intlify/shared': 11.1.7
'@intlify/core-base': 11.1.9
'@intlify/shared': 11.1.9
'@vue/devtools-api': 6.6.4
vue: 3.5.17(typescript@5.8.3)
@ -10999,10 +10999,10 @@ snapshots:
'@vue/devtools-api': 6.6.4
vue: 3.5.17(typescript@5.8.3)
vue-tsc@3.0.0(typescript@5.8.3):
vue-tsc@3.0.1(typescript@5.8.3):
dependencies:
'@volar/typescript': 2.4.16
'@vue/language-core': 3.0.0(typescript@5.8.3)
'@volar/typescript': 2.4.17
'@vue/language-core': 3.0.1(typescript@5.8.3)
typescript: 5.8.3
vue-types@3.0.2(vue@3.5.17(typescript@5.8.3)):

View File

@ -15,9 +15,11 @@ const themeConfig = computed(() => {
</script>
<template>
<a-config-provider :theme="themeConfig">
<RouterView />
</a-config-provider>
<n-config-provider preflight-style-disabled>
<a-config-provider :theme="themeConfig">
<RouterView />
</a-config-provider>
</n-config-provider>
<DynamicDialog /> <ConfirmDialog /> <Toast />
</template>

View File

@ -0,0 +1,321 @@
<script setup lang="ts">
import type { MenuOption } from 'naive-ui';
import { createGetRoutes } from '@/plugins/router';
const router = useRouter();
// 响应式断点检测
const isMobile = ref(false);
const isTablet = ref(false);
// 检测屏幕尺寸
const updateScreenSize = () => {
const width = window.innerWidth;
const wasMobile = isMobile.value;
isMobile.value = width < 768;
isTablet.value = width >= 768 && width < 1024;
// 当从移动端切换到桌面端时,关闭抽屉并重置折叠状态
if (wasMobile && !isMobile.value) {
drawerVisible.value = false;
collapsed.value = false;
}
// 当从桌面端切换到移动端时,关闭抽屉
else if (!wasMobile && isMobile.value) {
drawerVisible.value = false;
}
};
// 侧边栏状态管理
const collapsed = ref(false);
const drawerVisible = ref(false);
// 初始化屏幕尺寸检测
onMounted(() => {
updateScreenSize();
window.addEventListener('resize', updateScreenSize);
// 移动端默认收起侧边栏
if (isMobile.value) {
collapsed.value = true;
drawerVisible.value = false;
}
});
onUnmounted(() => {
window.removeEventListener('resize', updateScreenSize);
});
// 菜单项类型定义
type MenuItemWithRoute = MenuOption & {
routeName?: string;
parentId?: string;
originalPath?: string;
};
// 生成菜单项
const menuOptions = computed(() => {
let flatArray: MenuItemWithRoute[] = createGetRoutes(router)()
.filter((route) => !route.path.includes('/:'))
.filter((route) => !route.meta.hidden)
.map((route) => ({
key: route.path,
label: route.meta.title || `${(route.name as string) || route.path}`,
routeName: route.name as string,
}));
flatArray = flatArray.map((item) => {
const originalPath = item.key as string; // 保存原始路径
let id = item.key as string;
if (flatArray.some((item) => (item.key as string).startsWith(`${id}/`))) {
id = `${id}/index`;
}
// 去掉最前面的 /
id = id.replace(/^\//, '');
let parentId = id.replace(/\/[^/]+$/, '');
if (parentId === id) {
parentId = '_ROOT_';
}
return {
...item,
key: id,
parentId,
originalPath, // 保存原始路径用于后续映射
};
});
const groupItems: MenuItemWithRoute[] = [];
for (const flatArrayItem of flatArray) {
if (!groupItems.some((item) => item.key === flatArrayItem.parentId) && flatArrayItem.parentId !== '_ROOT_') {
let groupItemParentId = flatArrayItem.parentId!.replace(/\/[^/]+$/, '');
if (groupItemParentId === flatArrayItem.parentId) groupItemParentId = '_ROOT_';
groupItems.push({
key: flatArrayItem.parentId!,
label: `Group ${flatArrayItem.parentId}`,
parentId: groupItemParentId,
});
}
}
const tree = arrayToTree([...flatArray, ...groupItems], {
id: 'key',
parentId: 'parentId',
rootId: '_ROOT_',
});
// 递归转换树形结构为 naive-ui menu 格式
function convertToMenuOptions(tree: MenuItemWithRoute[]): MenuOption[] {
return tree.map((item) => {
const menuItem: MenuOption = {
key: item.key,
label: item.label,
};
if (item.children && item.children.length > 0) {
menuItem.children = convertToMenuOptions(item.children);
} else if (item.routeName) {
// 叶子节点,存储路由映射
menuRouteMap.set(item.key as string, item.routeName);
// 同时存储路径到 key 的映射(用于高亮显示)
if (item.originalPath) {
pathToKeyMap.set(item.originalPath, item.key as string);
}
(menuItem as MenuItemWithRoute).routeName = item.routeName;
}
return menuItem;
});
}
// 清空之前的映射
menuRouteMap.clear();
pathToKeyMap.clear();
const result = convertToMenuOptions(tree);
// 菜单生成后,重新设置当前选中的菜单项
nextTick(() => {
const currentPath = router.currentRoute.value.path;
const menuKey = pathToKeyMap.get(currentPath);
if (menuKey) {
selectedKey.value = menuKey;
} else {
const pathWithoutSlash = currentPath.replace(/^\//, '');
selectedKey.value = pathWithoutSlash;
}
});
return result;
});
// 当前选中的菜单项
const selectedKey = ref<string>();
// 存储菜单项与路由名称的映射
const menuRouteMap = new Map<string, string>();
// 存储路由路径与菜单 key 的映射(用于高亮显示)
const pathToKeyMap = new Map<string, string>();
// 处理菜单点击
const handleMenuSelect = (key: string, item: MenuOption) => {
const routeName = menuRouteMap.get(key) || (item as MenuItemWithRoute).routeName;
if (routeName) {
router.push({ name: routeName as never });
// 移动端点击菜单项后自动收起侧边栏
if (isMobile.value) {
drawerVisible.value = false;
}
}
};
// 监听路由变化,更新选中的菜单项
watch(
() => router.currentRoute.value.path,
(newPath) => {
// 使用路径到 key 的映射来找到对应的菜单项
const menuKey = pathToKeyMap.get(newPath);
if (menuKey) {
selectedKey.value = menuKey;
} else {
// 如果没有找到精确匹配,尝试去掉前面的 / 再匹配
const pathWithoutSlash = newPath.replace(/^\//, '');
selectedKey.value = pathWithoutSlash;
}
},
{ immediate: true },
);
// 切换侧边栏状态
const toggleSidebar = () => {
if (isMobile.value) {
// 移动端使用抽屉模式
drawerVisible.value = !drawerVisible.value;
} else {
// 桌面端使用折叠模式
collapsed.value = !collapsed.value;
}
};
</script>
<template>
<n-layout :has-sider="!isMobile">
<!-- 移动端抽屉 -->
<n-drawer
v-if="isMobile"
v-model:show="drawerVisible"
:width="280"
placement="left"
:trap-focus="false"
:block-scroll="false"
>
<n-drawer-content title="菜单" :native-scrollbar="false">
<n-menu :options="menuOptions" :value="selectedKey" @update:value="handleMenuSelect" />
</n-drawer-content>
</n-drawer>
<!-- 桌面端侧边栏 -->
<n-layout-sider
v-if="!isMobile"
:collapsed="collapsed"
:native-scrollbar="false"
bordered
collapse-mode="width"
:collapsed-width="64"
:width="240"
show-trigger
@collapse="collapsed = true"
@expand="collapsed = false"
>
<n-menu
:collapsed="collapsed"
:collapsed-width="64"
:collapsed-icon-size="22"
:options="menuOptions"
:value="selectedKey"
@update:value="handleMenuSelect"
/>
</n-layout-sider>
<n-layout>
<n-layout-header
bordered
:style="{
height: '64px',
padding: isMobile ? '0 16px' : '0 24px',
display: 'flex',
alignItems: 'center',
}"
>
<n-button
quaternary
@click="toggleSidebar"
:style="{
marginRight: isMobile ? '8px' : '12px',
padding: isMobile ? '8px' : '6px',
}"
:size="isMobile ? 'medium' : 'small'"
>
<template #icon>
<n-icon :size="isMobile ? 20 : 18">
<svg viewBox="0 0 24 24">
<path
v-if="!isMobile && collapsed"
fill="currentColor"
d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"
/>
<path
v-else-if="!isMobile && !collapsed"
fill="currentColor"
d="M3 18h13v-2H3v2zm0-5h10v-2H3v2zm0-7v2h13V6H3zm18 9.59L17.42 12 21 8.41 19.59 7l-5 5 5 5L21 15.59z"
/>
<!-- 移动端始终显示菜单图标 -->
<path v-else fill="currentColor" d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z" />
</svg>
</n-icon>
</template>
</n-button>
<span
:style="{
fontSize: isMobile ? '16px' : '18px',
fontWeight: '500',
overflow: 'hidden',
textOverflow: 'ellipsis',
whiteSpace: 'nowrap',
}"
>
Vue TS Example
</span>
</n-layout-header>
<n-layout-content
:content-style="{
padding: isMobile ? '16px' : '24px',
minHeight: 'calc(100vh - 64px - 72px)', // 减去头部和底部高度
}"
>
<router-view />
</n-layout-content>
<n-layout-footer
bordered
:style="{
padding: isMobile ? '16px' : '24px',
textAlign: 'center',
}"
>
<span
:style="{
color: 'var(--n-text-color-disabled)',
fontSize: isMobile ? '12px' : '14px',
}"
>
© 2025 Vue TS Example. All rights reserved.
</span>
</n-layout-footer>
</n-layout>
</n-layout>
</template>

View File

@ -66,7 +66,8 @@ export function Plugins() {
// https://github.com/dishait/vite-plugin-vue-meta-layouts
MetaLayouts({
defaultLayout: 'sakai-vue/AppLayout',
// defaultLayout: 'sakai-vue/AppLayout',
defaultLayout: 'naive-ui/AppLayout',
skipTopLevelRouteLayout: false, // 打开修复 https://github.com/JohnCampionJr/vite-plugin-vue-layouts/issues/134默认为 false 关闭
}),