diff --git a/src/plugins/permission.ts b/src/plugins/permission.ts index 0493511a..33d4d601 100644 --- a/src/plugins/permission.ts +++ b/src/plugins/permission.ts @@ -1,6 +1,5 @@ import type { RouteRecordRaw } from "vue-router"; import NProgress from "@/utils/nprogress"; -import { Auth } from "@/utils/auth"; import router from "@/router"; import { usePermissionStore, useUserStore } from "@/store"; import { ROLE_ROOT } from "@/constants"; @@ -12,7 +11,8 @@ export function setupPermission() { NProgress.start(); try { - const isLoggedIn = Auth.isLoggedIn(); + // 使用 store 暴露的登录态,便于后续扩展(如基于过期时间等) + const isLoggedIn = useUserStore().isLoggedIn(); // 未登录处理 if (!isLoggedIn) { @@ -35,16 +35,17 @@ export function setupPermission() { const permissionStore = usePermissionStore(); const userStore = useUserStore(); - // 确保动态路由已生成 + // 路由未生成则生成 if (!permissionStore.isDynamicRoutesGenerated) { - /** 先获取最新的用户信息 */ - await userStore.getUserInfo(); + if (!userStore.userInfo?.roles?.length) { + await userStore.getUserInfo(); + } const dynamicRoutes = await permissionStore.generateRoutes(); dynamicRoutes.forEach((route: RouteRecordRaw) => { router.addRoute(route); }); - // 路由刚生成,重新导航 + next({ ...to, replace: true }); return; } diff --git a/src/store/modules/permission.store.ts b/src/store/modules/permission.store.ts index f0675d23..3365ac8c 100644 --- a/src/store/modules/permission.store.ts +++ b/src/store/modules/permission.store.ts @@ -22,7 +22,7 @@ export const usePermissionStore = defineStore("permission", () => { */ async function generateRoutes(): Promise { try { - const data = await MenuAPI.getRoutes(); + const data = await MenuAPI.getRoutes(); // 获取当前登录人拥有的菜单路由 const dynamicRoutes = parseDynamicRoutes(data); routes.value = [...constantRoutes, ...dynamicRoutes]; diff --git a/src/store/modules/user.store.ts b/src/store/modules/user.store.ts index 899897f6..7d714b8d 100644 --- a/src/store/modules/user.store.ts +++ b/src/store/modules/user.store.ts @@ -137,6 +137,7 @@ export const useUserStore = defineStore("user", () => { return { userInfo, rememberMe, + isLoggedIn: () => !!Auth.getAccessToken(), getUserInfo, login, logout, diff --git a/src/utils/auth.ts b/src/utils/auth.ts index db0a7403..ff354916 100644 --- a/src/utils/auth.ts +++ b/src/utils/auth.ts @@ -9,14 +9,6 @@ import { AUTH_KEYS } from "@/constants"; * - 记住我功能的状态管理 */ export class Auth { - /** - * 判断用户是否已登录 - * @returns 是否已登录 - */ - static isLoggedIn(): boolean { - return !!Auth.getAccessToken(); - } - /** * 获取当前有效的访问令牌 * 会根据"记住我"状态从适当的存储位置获取 diff --git a/src/views/login/components/Login.vue b/src/views/login/components/Login.vue index d55e6291..5c1b54d4 100644 --- a/src/views/login/components/Login.vue +++ b/src/views/login/components/Login.vue @@ -197,16 +197,11 @@ async function handleLoginSubmit() { // 2. 执行登录 await userStore.login(loginFormData.value); - // 3. 获取用户信息(包含用户角色,用于路由生成) - await userStore.getUserInfo(); - - // 4. 登录成功,简单跳转,让路由守卫处理后续逻辑 const redirectPath = (route.query.redirect as string) || "/"; - // 使用push而不是replace,避免与路由守卫冲突 await router.push(decodeURIComponent(redirectPath)); } catch (error) { - // 5. 统一错误处理 + // 4. 统一错误处理 getCaptcha(); // 刷新验证码 console.error("登录失败:", error); } finally {