From 2b885dc3512e97f3e7cb23c4c4f0041557b4b027 Mon Sep 17 00:00:00 2001 From: FalingCliff Date: Sun, 15 Jun 2025 00:33:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E7=B3=BB=E7=BB=9F=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 + pnpm-lock.yaml | 219 ++++++++ src/App.vue | 86 +--- src/assets/base.css | 86 ---- src/assets/main.css | 35 -- src/components.d.ts | 17 +- src/components/HelloWorld.vue | 41 -- src/components/TheWelcome.vue | 93 ---- src/components/WelcomeItem.vue | 87 ---- src/components/__tests__/HelloWorld.spec.ts | 11 - src/components/common/Breadcrumb.vue | 74 +++ src/components/icons/IconCommunity.vue | 7 - src/components/icons/IconDocumentation.vue | 7 - src/components/icons/IconEcosystem.vue | 7 - src/components/icons/IconSupport.vue | 7 - src/components/icons/IconTooling.vue | 19 - src/components/layout/AdminLayout.vue | 332 ++++++++++++ src/components/layout/FooterBar.vue | 52 ++ src/components/layout/HeaderNav.vue | 105 ++++ src/components/layout/MainContent.vue | 65 +++ src/components/layout/SideMenu.vue | 133 +++++ src/main.ts | 4 +- src/router/index.ts | 92 +++- src/views/AboutView.vue | 15 - src/views/Dashboard.vue | 538 ++++++++++++++++++++ src/views/HomeView.vue | 9 - src/views/Login.vue | 152 ++++++ src/views/NotFound.vue | 32 ++ src/views/system/MenuManagement.vue | 389 ++++++++++++++ src/views/system/RoleManagement.vue | 390 ++++++++++++++ src/views/system/UserManagement.vue | 282 ++++++++++ 31 files changed, 2862 insertions(+), 527 deletions(-) delete mode 100644 src/assets/base.css delete mode 100644 src/assets/main.css delete mode 100644 src/components/HelloWorld.vue delete mode 100644 src/components/TheWelcome.vue delete mode 100644 src/components/WelcomeItem.vue delete mode 100644 src/components/__tests__/HelloWorld.spec.ts create mode 100644 src/components/common/Breadcrumb.vue delete mode 100644 src/components/icons/IconCommunity.vue delete mode 100644 src/components/icons/IconDocumentation.vue delete mode 100644 src/components/icons/IconEcosystem.vue delete mode 100644 src/components/icons/IconSupport.vue delete mode 100644 src/components/icons/IconTooling.vue create mode 100644 src/components/layout/AdminLayout.vue create mode 100644 src/components/layout/FooterBar.vue create mode 100644 src/components/layout/HeaderNav.vue create mode 100644 src/components/layout/MainContent.vue create mode 100644 src/components/layout/SideMenu.vue delete mode 100644 src/views/AboutView.vue create mode 100644 src/views/Dashboard.vue delete mode 100644 src/views/HomeView.vue create mode 100644 src/views/Login.vue create mode 100644 src/views/NotFound.vue create mode 100644 src/views/system/MenuManagement.vue create mode 100644 src/views/system/RoleManagement.vue create mode 100644 src/views/system/UserManagement.vue diff --git a/package.json b/package.json index 376dcf3..8648708 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,9 @@ "format": "prettier --write src/" }, "dependencies": { + "@ant-design/icons-vue": "^7.0.1", + "ant-design-vue": "^4.2.6", + "echarts": "^5.6.0", "pinia": "^3.0.1", "vue": "^3.5.13", "vue-router": "^4.5.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8c10277..0e55110 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,15 @@ importers: .: dependencies: + '@ant-design/icons-vue': + specifier: ^7.0.1 + version: 7.0.1(vue@3.5.16(typescript@5.8.3)) + ant-design-vue: + specifier: ^4.2.6 + version: 4.2.6(vue@3.5.16(typescript@5.8.3)) + echarts: + specifier: ^5.6.0 + version: 5.6.0 pinia: specifier: ^3.0.1 version: 3.0.3(typescript@5.8.3)(vue@3.5.16(typescript@5.8.3)) @@ -100,6 +109,17 @@ packages: 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==} @@ -230,6 +250,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/runtime@7.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + engines: {node: '>=6.9.0'} + '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} @@ -270,6 +294,16 @@ packages: resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} + '@ctrl/tinycolor@3.6.1': + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + + '@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.25.5': resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} engines: {node: '>=18'} @@ -685,6 +719,9 @@ packages: '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@simonwep/pickr@1.8.2': + resolution: {integrity: sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==} + '@sindresorhus/merge-streams@4.0.0': resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} @@ -983,6 +1020,12 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + ant-design-vue@4.2.6: + resolution: {integrity: sha512-t7eX13Yj3i9+i5g9lqFyYneoIb3OzTvQjq9Tts1i+eiOd3Eva/6GagxBSXM1fOCjqemIu0FYVE1ByZ/38epR3Q==} + engines: {node: '>=12.22.0'} + peerDependencies: + vue: '>=3.2.0' + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -990,10 +1033,16 @@ packages: 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==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1064,6 +1113,9 @@ packages: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} + compute-scroll-into-view@1.0.20: + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -1083,6 +1135,9 @@ packages: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} engines: {node: '>=12.13'} + core-js@3.43.0: + resolution: {integrity: sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1103,6 +1158,9 @@ packages: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} @@ -1137,9 +1195,18 @@ packages: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} + 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==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + echarts@5.6.0: + resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==} + editorconfig@1.0.4: resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} engines: {node: '>=14'} @@ -1455,6 +1522,10 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + 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==} @@ -1563,12 +1634,19 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 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@3.1.3: resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} @@ -1634,6 +1712,9 @@ packages: engines: {node: ^18 || >=20} hasBin: true + nanopop@2.4.2: + resolution: {integrity: sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==} + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -1809,6 +1890,9 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -1842,6 +1926,9 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} + 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==} @@ -1854,6 +1941,9 @@ packages: engines: {node: '>=10'} hasBin: true + 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'} @@ -1918,6 +2008,9 @@ packages: strip-literal@3.0.0: resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + superjson@2.2.2: resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} engines: {node: '>=16'} @@ -1933,6 +2026,10 @@ packages: resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} engines: {node: ^14.18.0 || >=16.0.0} + throttle-debounce@5.0.2: + resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} + engines: {node: '>=12.22'} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -1984,6 +2081,9 @@ packages: peerDependencies: typescript: '>=4.8.4' + tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -2185,6 +2285,12 @@ packages: peerDependencies: typescript: '>=5.0.0' + vue-types@3.0.2: + resolution: {integrity: sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==} + engines: {node: '>=10.15.0'} + peerDependencies: + vue: ^3.0.0 + vue@3.5.16: resolution: {integrity: sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==} peerDependencies: @@ -2197,6 +2303,9 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} + warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -2277,6 +2386,9 @@ packages: resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} engines: {node: '>=18'} + zrender@5.6.1: + resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==} + snapshots: '@ampproject/remapping@2.3.0': @@ -2284,6 +2396,18 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@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.16(typescript@5.8.3))': + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons-svg': 4.4.2 + vue: 3.5.16(typescript@5.8.3) + '@antfu/utils@0.7.10': {} '@asamuzakjp/css-color@3.2.0': @@ -2460,6 +2584,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/runtime@7.27.6': {} + '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 @@ -2503,6 +2629,12 @@ snapshots: '@csstools/css-tokenizer@3.0.4': {} + '@ctrl/tinycolor@3.6.1': {} + + '@emotion/hash@0.9.2': {} + + '@emotion/unitless@0.8.1': {} + '@esbuild/aix-ppc64@0.25.5': optional: true @@ -2782,6 +2914,11 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} + '@simonwep/pickr@1.8.2': + dependencies: + core-js: 3.43.0 + nanopop: 2.4.2 + '@sindresorhus/merge-streams@4.0.0': {} '@tsconfig/node22@22.0.2': {} @@ -3176,6 +3313,32 @@ snapshots: ansi-styles@6.2.1: {} + ant-design-vue@4.2.6(vue@3.5.16(typescript@5.8.3)): + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons-vue': 7.0.1(vue@3.5.16(typescript@5.8.3)) + '@babel/runtime': 7.27.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.6 + throttle-debounce: 5.0.2 + vue: 3.5.16(typescript@5.8.3) + vue-types: 3.0.2(vue@3.5.16(typescript@5.8.3)) + warning: 4.0.3 + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -3183,8 +3346,12 @@ snapshots: argparse@2.0.1: {} + array-tree-filter@2.1.0: {} + assertion-error@2.0.1: {} + async-validator@4.2.5: {} + balanced-match@1.0.2: {} binary-extensions@2.3.0: {} @@ -3258,6 +3425,8 @@ snapshots: commander@10.0.1: {} + compute-scroll-into-view@1.0.20: {} + concat-map@0.0.1: {} confbox@0.1.8: {} @@ -3275,6 +3444,8 @@ snapshots: dependencies: is-what: 4.1.16 + core-js@3.43.0: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -3295,6 +3466,8 @@ snapshots: whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 + dayjs@1.11.13: {} + de-indent@1.0.2: {} debug@4.4.1: @@ -3316,8 +3489,17 @@ snapshots: define-lazy-prop@3.0.0: {} + dom-align@1.12.4: {} + + dom-scroll-into-view@2.0.1: {} + eastasianwidth@0.2.0: {} + echarts@5.6.0: + dependencies: + tslib: 2.3.0 + zrender: 5.6.1 + editorconfig@1.0.4: dependencies: '@one-ini/wasm': 0.1.1 @@ -3654,6 +3836,8 @@ snapshots: is-plain-obj@4.1.0: {} + is-plain-object@3.0.1: {} + is-potential-custom-element-name@1.0.1: {} is-stream@4.0.1: {} @@ -3764,10 +3948,16 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash-es@4.17.21: {} + lodash.merge@4.6.2: {} lodash@4.17.21: {} + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + loupe@3.1.3: {} lru-cache@10.4.3: {} @@ -3822,6 +4012,8 @@ snapshots: nanoid@5.1.5: {} + nanopop@2.4.2: {} + natural-compare@1.4.0: {} node-releases@2.0.19: {} @@ -3989,6 +4181,8 @@ snapshots: dependencies: picomatch: 2.3.1 + resize-observer-polyfill@1.5.1: {} + resolve-from@4.0.0: {} reusify@1.1.0: {} @@ -4035,12 +4229,18 @@ snapshots: dependencies: xmlchars: 2.2.0 + scroll-into-view-if-needed@2.2.31: + dependencies: + compute-scroll-into-view: 1.0.20 + scule@1.3.0: {} semver@6.3.1: {} semver@7.7.2: {} + shallow-equal@1.2.1: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -4095,6 +4295,8 @@ snapshots: dependencies: js-tokens: 9.0.1 + stylis@4.3.6: {} + superjson@2.2.2: dependencies: copy-anything: 3.0.5 @@ -4109,6 +4311,8 @@ snapshots: dependencies: '@pkgr/core': 0.2.7 + throttle-debounce@5.0.2: {} + tinybench@2.9.0: {} tinyexec@0.3.2: {} @@ -4148,6 +4352,8 @@ snapshots: dependencies: typescript: 5.8.3 + tslib@2.3.0: {} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -4392,6 +4598,11 @@ snapshots: '@vue/language-core': 2.2.10(typescript@5.8.3) typescript: 5.8.3 + vue-types@3.0.2(vue@3.5.16(typescript@5.8.3)): + dependencies: + is-plain-object: 3.0.1 + vue: 3.5.16(typescript@5.8.3) + vue@3.5.16(typescript@5.8.3): dependencies: '@vue/compiler-dom': 3.5.16 @@ -4406,6 +4617,10 @@ snapshots: dependencies: xml-name-validator: 5.0.0 + warning@4.0.3: + dependencies: + loose-envify: 1.4.0 + webidl-conversions@7.0.0: {} webpack-virtual-modules@0.6.2: {} @@ -4461,3 +4676,7 @@ snapshots: yocto-queue@0.1.0: {} yoctocolors@2.1.1: {} + + zrender@5.6.1: + dependencies: + tslib: 2.3.0 diff --git a/src/App.vue b/src/App.vue index 7905b05..0c918dd 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,85 +1,21 @@ - diff --git a/src/assets/base.css b/src/assets/base.css deleted file mode 100644 index 8816868..0000000 --- a/src/assets/base.css +++ /dev/null @@ -1,86 +0,0 @@ -/* color palette from */ -:root { - --vt-c-white: #ffffff; - --vt-c-white-soft: #f8f8f8; - --vt-c-white-mute: #f2f2f2; - - --vt-c-black: #181818; - --vt-c-black-soft: #222222; - --vt-c-black-mute: #282828; - - --vt-c-indigo: #2c3e50; - - --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); - --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); - --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); - --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); - - --vt-c-text-light-1: var(--vt-c-indigo); - --vt-c-text-light-2: rgba(60, 60, 60, 0.66); - --vt-c-text-dark-1: var(--vt-c-white); - --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); -} - -/* semantic color variables for this project */ -:root { - --color-background: var(--vt-c-white); - --color-background-soft: var(--vt-c-white-soft); - --color-background-mute: var(--vt-c-white-mute); - - --color-border: var(--vt-c-divider-light-2); - --color-border-hover: var(--vt-c-divider-light-1); - - --color-heading: var(--vt-c-text-light-1); - --color-text: var(--vt-c-text-light-1); - - --section-gap: 160px; -} - -@media (prefers-color-scheme: dark) { - :root { - --color-background: var(--vt-c-black); - --color-background-soft: var(--vt-c-black-soft); - --color-background-mute: var(--vt-c-black-mute); - - --color-border: var(--vt-c-divider-dark-2); - --color-border-hover: var(--vt-c-divider-dark-1); - - --color-heading: var(--vt-c-text-dark-1); - --color-text: var(--vt-c-text-dark-2); - } -} - -*, -*::before, -*::after { - box-sizing: border-box; - margin: 0; - font-weight: normal; -} - -body { - min-height: 100vh; - color: var(--color-text); - background: var(--color-background); - transition: - color 0.5s, - background-color 0.5s; - line-height: 1.6; - font-family: - Inter, - -apple-system, - BlinkMacSystemFont, - 'Segoe UI', - Roboto, - Oxygen, - Ubuntu, - Cantarell, - 'Fira Sans', - 'Droid Sans', - 'Helvetica Neue', - sans-serif; - font-size: 15px; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} diff --git a/src/assets/main.css b/src/assets/main.css deleted file mode 100644 index 36fb845..0000000 --- a/src/assets/main.css +++ /dev/null @@ -1,35 +0,0 @@ -@import './base.css'; - -#app { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - font-weight: normal; -} - -a, -.green { - text-decoration: none; - color: hsla(160, 100%, 37%, 1); - transition: 0.4s; - padding: 3px; -} - -@media (hover: hover) { - a:hover { - background-color: hsla(160, 100%, 37%, 0.2); - } -} - -@media (min-width: 1024px) { - body { - display: flex; - place-items: center; - } - - #app { - display: grid; - grid-template-columns: 1fr 1fr; - padding: 0 2rem; - } -} diff --git a/src/components.d.ts b/src/components.d.ts index d56c9ca..8160ece 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -8,15 +8,16 @@ export {} /* prettier-ignore */ declare module 'vue' { export interface GlobalComponents { - HelloWorld: typeof import('./components/HelloWorld.vue')['default'] - IconCommunity: typeof import('./components/icons/IconCommunity.vue')['default'] - IconDocumentation: typeof import('./components/icons/IconDocumentation.vue')['default'] - IconEcosystem: typeof import('./components/icons/IconEcosystem.vue')['default'] - IconSupport: typeof import('./components/icons/IconSupport.vue')['default'] - IconTooling: typeof import('./components/icons/IconTooling.vue')['default'] + AdminLayout: typeof import('./components/layout/AdminLayout.vue')['default'] + AdvancedForm: typeof import('./components/form/AdvancedForm.vue')['default'] + AdvancedTable: typeof import('./components/table/AdvancedTable.vue')['default'] + Breadcrumb: typeof import('./components/common/Breadcrumb.vue')['default'] + FooterBar: typeof import('./components/layout/FooterBar.vue')['default'] + HeaderNav: typeof import('./components/layout/HeaderNav.vue')['default'] + MainContent: typeof import('./components/layout/MainContent.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] - TheWelcome: typeof import('./components/TheWelcome.vue')['default'] - WelcomeItem: typeof import('./components/WelcomeItem.vue')['default'] + SideMenu: typeof import('./components/layout/SideMenu.vue')['default'] + YourComponent: typeof import('./components/YourComponent.vue')['default'] } } diff --git a/src/components/HelloWorld.vue b/src/components/HelloWorld.vue deleted file mode 100644 index d174cf8..0000000 --- a/src/components/HelloWorld.vue +++ /dev/null @@ -1,41 +0,0 @@ - - - - - diff --git a/src/components/TheWelcome.vue b/src/components/TheWelcome.vue deleted file mode 100644 index 004d9e1..0000000 --- a/src/components/TheWelcome.vue +++ /dev/null @@ -1,93 +0,0 @@ - - - diff --git a/src/components/WelcomeItem.vue b/src/components/WelcomeItem.vue deleted file mode 100644 index 6d7086a..0000000 --- a/src/components/WelcomeItem.vue +++ /dev/null @@ -1,87 +0,0 @@ - - - diff --git a/src/components/__tests__/HelloWorld.spec.ts b/src/components/__tests__/HelloWorld.spec.ts deleted file mode 100644 index 2533202..0000000 --- a/src/components/__tests__/HelloWorld.spec.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { describe, it, expect } from 'vitest' - -import { mount } from '@vue/test-utils' -import HelloWorld from '../HelloWorld.vue' - -describe('HelloWorld', () => { - it('renders properly', () => { - const wrapper = mount(HelloWorld, { props: { msg: 'Hello Vitest' } }) - expect(wrapper.text()).toContain('Hello Vitest') - }) -}) diff --git a/src/components/common/Breadcrumb.vue b/src/components/common/Breadcrumb.vue new file mode 100644 index 0000000..5a2f866 --- /dev/null +++ b/src/components/common/Breadcrumb.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/src/components/icons/IconCommunity.vue b/src/components/icons/IconCommunity.vue deleted file mode 100644 index 2dc8b05..0000000 --- a/src/components/icons/IconCommunity.vue +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/src/components/icons/IconDocumentation.vue b/src/components/icons/IconDocumentation.vue deleted file mode 100644 index 6d4791c..0000000 --- a/src/components/icons/IconDocumentation.vue +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/src/components/icons/IconEcosystem.vue b/src/components/icons/IconEcosystem.vue deleted file mode 100644 index c3a4f07..0000000 --- a/src/components/icons/IconEcosystem.vue +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/src/components/icons/IconSupport.vue b/src/components/icons/IconSupport.vue deleted file mode 100644 index 7452834..0000000 --- a/src/components/icons/IconSupport.vue +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/src/components/icons/IconTooling.vue b/src/components/icons/IconTooling.vue deleted file mode 100644 index 660598d..0000000 --- a/src/components/icons/IconTooling.vue +++ /dev/null @@ -1,19 +0,0 @@ - - diff --git a/src/components/layout/AdminLayout.vue b/src/components/layout/AdminLayout.vue new file mode 100644 index 0000000..3e639b9 --- /dev/null +++ b/src/components/layout/AdminLayout.vue @@ -0,0 +1,332 @@ + + + + + diff --git a/src/components/layout/FooterBar.vue b/src/components/layout/FooterBar.vue new file mode 100644 index 0000000..753397d --- /dev/null +++ b/src/components/layout/FooterBar.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/src/components/layout/HeaderNav.vue b/src/components/layout/HeaderNav.vue new file mode 100644 index 0000000..1b394af --- /dev/null +++ b/src/components/layout/HeaderNav.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/src/components/layout/MainContent.vue b/src/components/layout/MainContent.vue new file mode 100644 index 0000000..a254a7c --- /dev/null +++ b/src/components/layout/MainContent.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/src/components/layout/SideMenu.vue b/src/components/layout/SideMenu.vue new file mode 100644 index 0000000..3a20448 --- /dev/null +++ b/src/components/layout/SideMenu.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/src/main.ts b/src/main.ts index 5dcad83..b563029 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,7 +1,8 @@ -import './assets/main.css' +import 'ant-design-vue/dist/reset.css'; import { createApp } from 'vue' import { createPinia } from 'pinia' +import Antd from 'ant-design-vue'; import App from './App.vue' import router from './router' @@ -10,5 +11,6 @@ const app = createApp(App) app.use(createPinia()) app.use(router) +app.use(Antd); app.mount('#app') diff --git a/src/router/index.ts b/src/router/index.ts index 3e49915..4bc46a3 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -1,23 +1,77 @@ -import { createRouter, createWebHistory } from 'vue-router' -import HomeView from '../views/HomeView.vue' +import { createRouter, createWebHistory } from 'vue-router'; +import AdminLayout from '@/components/layout/AdminLayout.vue'; + +const routes = [ + { + path: '/login', + name: 'login', + component: () => import('@/views/Login.vue'), + meta: { requiresAuth: false } + }, + { + path: '/', + component: AdminLayout, + redirect: '/dashboard', + children: [ + { + path: 'dashboard', + name: 'dashboard', + component: () => import('@/views/Dashboard.vue'), + meta: { title: '仪表盘', icon: 'dashboard' } + }, + { + path: 'system', + name: 'system', + redirect: '/system/user', + meta: { title: '系统管理', icon: 'setting' }, + children: [ + { + path: 'user', + name: 'user', + component: () => import('@/views/system/UserManagement.vue'), + meta: { title: '用户管理', icon: 'user' } + }, + { + path: 'role', + name: 'role', + component: () => import('@/views/system/RoleManagement.vue'), + meta: { title: '角色管理', icon: 'team' } + }, + { + path: 'menu', + name: 'menu', + component: () => import('@/views/system/MenuManagement.vue'), + meta: { title: '菜单管理', icon: 'menu' } + } + ] + } + ] + }, + // 404页面 + { + path: '/:pathMatch(.*)*', + name: 'not-found', + component: () => import('@/views/NotFound.vue') + } +]; const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), - routes: [ - { - path: '/', - name: 'home', - component: HomeView, - }, - { - path: '/about', - name: 'about', - // route level code-splitting - // this generates a separate chunk (About.[hash].js) for this route - // which is lazy-loaded when the route is visited. - component: () => import('../views/AboutView.vue'), - }, - ], -}) + routes, +}); -export default router +// 路由守卫 +router.beforeEach((to, from, next) => { + // 这里可以添加身份验证逻辑 + // 例如:检查用户是否已登录,如果未登录且访问需要认证的页面,则重定向到登录页 + const requiresAuth = to.matched.some(record => record.meta.requiresAuth !== false); + const isAuthenticated = localStorage.getItem('token'); // 简单的身份验证检查 + + if (requiresAuth && !isAuthenticated) { + next('/login'); + } else { + next(); + } +}); + +export default router; diff --git a/src/views/AboutView.vue b/src/views/AboutView.vue deleted file mode 100644 index 756ad2a..0000000 --- a/src/views/AboutView.vue +++ /dev/null @@ -1,15 +0,0 @@ - - - diff --git a/src/views/Dashboard.vue b/src/views/Dashboard.vue new file mode 100644 index 0000000..bf8c778 --- /dev/null +++ b/src/views/Dashboard.vue @@ -0,0 +1,538 @@ + + + + + diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue deleted file mode 100644 index d5c0217..0000000 --- a/src/views/HomeView.vue +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/src/views/Login.vue b/src/views/Login.vue new file mode 100644 index 0000000..8654253 --- /dev/null +++ b/src/views/Login.vue @@ -0,0 +1,152 @@ + + + + + diff --git a/src/views/NotFound.vue b/src/views/NotFound.vue new file mode 100644 index 0000000..ed2083f --- /dev/null +++ b/src/views/NotFound.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/src/views/system/MenuManagement.vue b/src/views/system/MenuManagement.vue new file mode 100644 index 0000000..879e93b --- /dev/null +++ b/src/views/system/MenuManagement.vue @@ -0,0 +1,389 @@ + + + + + diff --git a/src/views/system/RoleManagement.vue b/src/views/system/RoleManagement.vue new file mode 100644 index 0000000..34bc0f1 --- /dev/null +++ b/src/views/system/RoleManagement.vue @@ -0,0 +1,390 @@ + + + + + diff --git a/src/views/system/UserManagement.vue b/src/views/system/UserManagement.vue new file mode 100644 index 0000000..f13ea2e --- /dev/null +++ b/src/views/system/UserManagement.vue @@ -0,0 +1,282 @@ + + + + +