From deaba87362207ce3d293026729b9770d3274f2ee Mon Sep 17 00:00:00 2001 From: fanfpy Date: Fri, 18 Jul 2025 16:13:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=87=8D=E6=9E=84=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E6=9E=B6=E6=9E=84=E5=B9=B6=E6=B7=BB=E5=8A=A0=E6=A0=B8=E5=BF=83?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增Pinia状态管理用于用户认证和全局状态 - 实现JWT认证工具类和API服务封装 - 添加路由权限控制和全局错误处理 - 重构项目结构,新增layouts目录和组件 - 完善工具函数库和常量定义 - 新增404页面和API接口模块 - 优化移动端导航和响应式布局 - 更新依赖并添加开发工具支持 --- services/frontend/package-lock.json | 136 +++++++++ services/frontend/package.json | 1 + services/frontend/src/App.vue | 7 +- services/frontend/src/api/auth.js | 57 ++++ services/frontend/src/api/index.js | 92 ++++++ services/frontend/src/api/jwt.js | 40 +++ services/frontend/src/api/user.js | 71 +++++ .../src/components/MobileBottomNav.vue | 10 +- services/frontend/src/components/Sidebar.vue | 12 +- .../frontend/src/composables/useDateTime.js | 171 +++++++++++ services/frontend/src/constants/index.js | 69 +++++ services/frontend/src/layouts/MainLayout.vue | 135 +++++++++ services/frontend/src/main.js | 51 +++- services/frontend/src/plugins/index.js | 64 +++++ services/frontend/src/router/index.js | 128 ++++++--- services/frontend/src/store/userStore.js | 128 +++++++++ services/frontend/src/utils/helper.js | 268 ++++++++++++++++++ services/frontend/src/utils/jwt.js | 74 +++++ services/frontend/src/utils/permission.js | 109 +++++++ services/frontend/src/views/Index.vue | 2 +- services/frontend/src/views/NotFoundView.vue | 50 ++++ services/frontend/src/views/private/Home.vue | 90 ------ services/frontend/src/views/public/Login.vue | 2 +- services/frontend/src/views/public/SignUp.vue | 2 +- services/frontend/vue.config.js | 7 + 25 files changed, 1621 insertions(+), 155 deletions(-) create mode 100644 services/frontend/src/api/auth.js create mode 100644 services/frontend/src/api/index.js create mode 100644 services/frontend/src/api/jwt.js create mode 100644 services/frontend/src/api/user.js create mode 100644 services/frontend/src/composables/useDateTime.js create mode 100644 services/frontend/src/constants/index.js create mode 100644 services/frontend/src/layouts/MainLayout.vue create mode 100644 services/frontend/src/plugins/index.js create mode 100644 services/frontend/src/store/userStore.js create mode 100644 services/frontend/src/utils/helper.js create mode 100644 services/frontend/src/utils/jwt.js create mode 100644 services/frontend/src/utils/permission.js create mode 100644 services/frontend/src/views/NotFoundView.vue delete mode 100644 services/frontend/src/views/private/Home.vue create mode 100644 services/frontend/vue.config.js diff --git a/services/frontend/package-lock.json b/services/frontend/package-lock.json index 38092ee..992378e 100644 --- a/services/frontend/package-lock.json +++ b/services/frontend/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "axios": "^1.3.4", "element-plus": "^2.10.4", + "pinia": "^3.0.3", "vue": "^3.2.45", "vue-router": "^4.5.1" }, @@ -1265,6 +1266,30 @@ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", "license": "MIT" }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz", + "integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.7", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz", + "integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, "node_modules/@vue/reactivity": { "version": "3.5.17", "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.17.tgz", @@ -2032,6 +2057,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/birpc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.5.0.tgz", + "integrity": "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -2683,6 +2717,21 @@ "dev": true, "license": "MIT" }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/copy-webpack-plugin": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz", @@ -4692,6 +4741,12 @@ "node": "*" } }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -5222,6 +5277,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -6076,6 +6143,12 @@ "dev": true, "license": "ISC" }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, "node_modules/module-alias": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.3.tgz", @@ -6747,6 +6820,12 @@ "node": ">=8" } }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -6776,6 +6855,36 @@ "node": ">=0.10.0" } }, + "node_modules/pinia": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.3.tgz", + "integrity": "sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^7.7.2" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.4.4", + "vue": "^2.7.0 || ^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/@vue/devtools-api": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.7.tgz", + "integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.7" + } + }, "node_modules/pirates": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", @@ -8072,6 +8181,12 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -8629,6 +8744,15 @@ "wbuf": "^1.7.3" } }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ssri": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", @@ -8875,6 +8999,18 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "license": "MIT", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", diff --git a/services/frontend/package.json b/services/frontend/package.json index dc28578..ed9d0a4 100644 --- a/services/frontend/package.json +++ b/services/frontend/package.json @@ -10,6 +10,7 @@ "dependencies": { "axios": "^1.3.4", "element-plus": "^2.10.4", + "pinia": "^3.0.3", "vue": "^3.2.45", "vue-router": "^4.5.1" }, diff --git a/services/frontend/src/App.vue b/services/frontend/src/App.vue index 714895c..3122a36 100644 --- a/services/frontend/src/App.vue +++ b/services/frontend/src/App.vue @@ -1,7 +1,7 @@