From a2cef00908db34a1b69863e738edbe225863e2af Mon Sep 17 00:00:00 2001 From: Sakurasan <26715255+Sakurasan@users.noreply.github.com> Date: Tue, 1 Sep 2026 20:20:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=9C=AA=E7=99=BB=E5=BD=95=E8=AE=BF?= =?UTF-8?q?=E9=97=AE=E7=AE=A1=E7=90=86=E5=90=8E=E5=8F=B0=E4=B8=8D=E5=86=8D?= =?UTF-8?q?=E9=97=AA=E7=8E=B0=E9=A1=B5=E9=9D=A2=EF=BC=8C=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E5=AE=88=E5=8D=AB=E6=94=B9=E4=B8=BA=E6=9C=8D=E5=8A=A1=E7=AB=AF?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 守卫先经 /profile 校验 token 有效后才放行受保护路由,无效 token 直接跳登录并带 redirect 回跳 - DashboardLayout 用户信息就绪前只渲染 spinner,不渲染后台内容 - manager 路由增加 requiresAdmin 校验(role >= 10),非管理员重定向回仪表盘 - 401 拦截器改用 router.push 软跳转,避免整页刷新与双重跳转 - pinia 先于 router 安装;登录页支持 redirect 参数回跳原目标 --- frontend/src/api/client.ts | 8 +++++- frontend/src/layouts/DashboardLayout.vue | 6 ++++- frontend/src/main.ts | 2 +- frontend/src/router/index.ts | 34 +++++++++++++++++++----- frontend/src/utils/router_menu.ts | 3 ++- frontend/src/views/auth/Login.vue | 10 ++++--- 6 files changed, 50 insertions(+), 13 deletions(-) diff --git a/frontend/src/api/client.ts b/frontend/src/api/client.ts index 4766f91..30d9814 100644 --- a/frontend/src/api/client.ts +++ b/frontend/src/api/client.ts @@ -2,6 +2,7 @@ import axios from 'axios' import type { AxiosError, InternalAxiosRequestConfig } from 'axios' import { useAuthStore } from '@/stores/auth' +import router from '@/router' const baseURL = import.meta.env.VITE_API_BASE_URL || '/api' if (import.meta.env.DEV) { // Vite 的方式判断开发环境 @@ -49,7 +50,12 @@ service.interceptors.response.use( if (error.response && error.response.status === 401) { const authStore = useAuthStore(); authStore.clear(); - window.location.href = '/login'; + // 守卫校验期间(尚未进入受保护路由)由守卫负责跳登录; + // 这里只处理已登录状态下 token 失效的情况,且不再用 location.href 硬刷新 + const current = router.currentRoute.value; + if (current.matched.some(record => record.meta.requiresAuth)) { + router.push({ path: '/login', query: { redirect: current.fullPath } }); + } } return Promise.reject(error); } diff --git a/frontend/src/layouts/DashboardLayout.vue b/frontend/src/layouts/DashboardLayout.vue index 09d24a6..56a4953 100644 --- a/frontend/src/layouts/DashboardLayout.vue +++ b/frontend/src/layouts/DashboardLayout.vue @@ -1,6 +1,10 @@