fix: 🐛 修复登录和路由重复获取用户信息的问题
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -137,6 +137,7 @@ export const useUserStore = defineStore("user", () => {
|
||||
return {
|
||||
userInfo,
|
||||
rememberMe,
|
||||
isLoggedIn: () => !!Auth.getAccessToken(),
|
||||
getUserInfo,
|
||||
login,
|
||||
logout,
|
||||
|
||||
@@ -9,14 +9,6 @@ import { AUTH_KEYS } from "@/constants";
|
||||
* - 记住我功能的状态管理
|
||||
*/
|
||||
export class Auth {
|
||||
/**
|
||||
* 判断用户是否已登录
|
||||
* @returns 是否已登录
|
||||
*/
|
||||
static isLoggedIn(): boolean {
|
||||
return !!Auth.getAccessToken();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前有效的访问令牌
|
||||
* 会根据"记住我"状态从适当的存储位置获取
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user