From 6807cd94a1ff22d66f79b3b0c6b1b7d338e725fd Mon Sep 17 00:00:00 2001 From: notyclaw Date: Sat, 28 Mar 2026 18:36:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E7=AB=AF=E5=AE=89=E5=85=A8=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=EF=BC=9A=E7=99=BB=E5=BD=95=E6=8E=A5=E5=8F=A3=E6=94=B9?= =?UTF-8?q?=E7=94=A8=E7=BB=9F=E4=B8=80auth=E6=8E=A5=E5=8F=A3=E3=80=81Dashb?= =?UTF-8?q?oard=E8=BF=87=E6=BB=A4=E6=9D=A1=E4=BB=B6=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E3=80=81RBAC=20token=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/router/index.js | 11 ++++++--- src/utils/api.js | 37 ++++++++++++++++++++++++++++ src/views/Applications.vue | 8 +++--- src/views/Approvals.vue | 12 ++++----- src/views/Complaints.vue | 10 ++++---- src/views/Conflicts.vue | 10 ++++---- src/views/Customers.vue | 10 ++++---- src/views/Dashboard.vue | 20 ++++++++------- src/views/Disputes.vue | 6 ++--- src/views/Finance.vue | 4 ++- src/views/Layout.vue | 9 +++++-- src/views/Login.vue | 50 ++++++++++++++++++++++++++++---------- src/views/Orders.vue | 14 +++++------ src/views/Payments.vue | 10 ++++---- src/views/Stores.vue | 8 +++--- src/views/Vehicles.vue | 10 ++++---- vite.config.js | 21 +++++++++++++++- 17 files changed, 172 insertions(+), 78 deletions(-) create mode 100644 src/utils/api.js diff --git a/src/router/index.js b/src/router/index.js index 4f575d8..3bfcc6f 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -29,10 +29,15 @@ const router = createRouter({ routes }) -// 路由守卫 +// 路由守卫:检查 token router.beforeEach((to, from, next) => { - // 暂时禁用登录验证 - next() + if (to.meta.requiresAuth && !localStorage.getItem('token')) { + next('/login') + } else if (to.path === '/login' && localStorage.getItem('token')) { + next('/') + } else { + next() + } }) export default router diff --git a/src/utils/api.js b/src/utils/api.js new file mode 100644 index 0000000..82a2f10 --- /dev/null +++ b/src/utils/api.js @@ -0,0 +1,37 @@ +/** + * 封装 axios,自动附加 Authorization header + * 所有需要鉴权的 API 请求统一走这里 + */ +import axios from 'axios' + +const api = axios.create({ + baseURL: '/api', + timeout: 15000 +}) + +// 请求拦截器:自动附加 token +api.interceptors.request.use( + (config) => { + const token = localStorage.getItem('token') + if (token) { + config.headers.Authorization = `Bearer ${token}` + } + return config + }, + (error) => Promise.reject(error) +) + +// 响应拦截器:token 过期则跳转登录 +api.interceptors.response.use( + (response) => response, + (error) => { + if (error.response?.status === 401) { + localStorage.removeItem('token') + localStorage.removeItem('riderInfo') + window.location.href = '/login' + } + return Promise.reject(error) + } +) + +export default api diff --git a/src/views/Applications.vue b/src/views/Applications.vue index b713d09..4be5042 100644 --- a/src/views/Applications.vue +++ b/src/views/Applications.vue @@ -80,7 +80,7 @@ diff --git a/src/views/Orders.vue b/src/views/Orders.vue index 586c89f..b00ec3c 100644 --- a/src/views/Orders.vue +++ b/src/views/Orders.vue @@ -126,7 +126,7 @@