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