fix: 🐛 修复登录和路由重复获取用户信息的问题

This commit is contained in:
Ray.Hao
2025-08-14 18:34:56 +08:00
parent 9b8299e895
commit d9b2f55a5e
5 changed files with 10 additions and 21 deletions

View File

@@ -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;
}

View File

@@ -22,7 +22,7 @@ export const usePermissionStore = defineStore("permission", () => {
*/
async function generateRoutes(): Promise<RouteRecordRaw[]> {
try {
const data = await MenuAPI.getRoutes();
const data = await MenuAPI.getRoutes(); // 获取当前登录人拥有的菜单路由
const dynamicRoutes = parseDynamicRoutes(data);
routes.value = [...constantRoutes, ...dynamicRoutes];

View File

@@ -137,6 +137,7 @@ export const useUserStore = defineStore("user", () => {
return {
userInfo,
rememberMe,
isLoggedIn: () => !!Auth.getAccessToken(),
getUserInfo,
login,
logout,

View File

@@ -9,14 +9,6 @@ import { AUTH_KEYS } from "@/constants";
* - 记住我功能的状态管理
*/
export class Auth {
/**
* 判断用户是否已登录
* @returns 是否已登录
*/
static isLoggedIn(): boolean {
return !!Auth.getAccessToken();
}
/**
* 获取当前有效的访问令牌
* 会根据"记住我"状态从适当的存储位置获取

View File

@@ -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 {