refactor: 分页响应数据结构调整
This commit is contained in:
@@ -2,6 +2,7 @@ import type { RouteRecordRaw } from "vue-router";
|
||||
import { constantRoutes } from "@/router";
|
||||
import { store } from "@/store";
|
||||
import router from "@/router";
|
||||
import { useUserStoreHook } from "@/store/modules/user";
|
||||
|
||||
import MenuAPI from "@/api/system/menu";
|
||||
import { RouteItem } from "@/types";
|
||||
@@ -67,6 +68,60 @@ export const usePermissionStore = defineStore("permission", () => {
|
||||
isRouteGenerated.value = false;
|
||||
};
|
||||
|
||||
let reloadPromise: Promise<RouteRecordRaw[]> | null = null;
|
||||
|
||||
/**
|
||||
* 重新加载动态路由(单飞)。
|
||||
*
|
||||
* 典型场景:后端权限变更导致接口返回权限不足(A0301),前端需要刷新路由和菜单以同步最新权限。
|
||||
*
|
||||
* - 会先清理已注册的动态路由(resetRouter)
|
||||
* - 重新从后端拉取路由(generateRoutes)
|
||||
* - 将动态路由注册到 vue-router(router.addRoute)
|
||||
*/
|
||||
async function reloadDynamicRoutesOnce(): Promise<RouteRecordRaw[]> {
|
||||
if (reloadPromise) return reloadPromise;
|
||||
|
||||
reloadPromise = (async () => {
|
||||
try {
|
||||
resetRouter();
|
||||
const dynamicRoutes = await generateRoutes();
|
||||
dynamicRoutes.forEach((route: RouteRecordRaw) => {
|
||||
router.addRoute(route);
|
||||
});
|
||||
return dynamicRoutes;
|
||||
} finally {
|
||||
reloadPromise = null;
|
||||
}
|
||||
})();
|
||||
|
||||
return reloadPromise;
|
||||
}
|
||||
|
||||
let snapshotPromise: Promise<void> | null = null;
|
||||
|
||||
/**
|
||||
* 刷新权限快照(单飞)。
|
||||
*
|
||||
* - 刷新用户信息(包含 perms/roles 等)
|
||||
* - 重新加载动态路由
|
||||
*/
|
||||
async function reloadPermissionSnapshotOnce(): Promise<void> {
|
||||
if (snapshotPromise) return snapshotPromise;
|
||||
|
||||
snapshotPromise = (async () => {
|
||||
try {
|
||||
const userStore = useUserStoreHook();
|
||||
await userStore.getUserInfo();
|
||||
await reloadDynamicRoutesOnce();
|
||||
} finally {
|
||||
snapshotPromise = null;
|
||||
}
|
||||
})();
|
||||
|
||||
return snapshotPromise;
|
||||
}
|
||||
|
||||
return {
|
||||
routes,
|
||||
mixLayoutSideMenus,
|
||||
@@ -74,6 +129,8 @@ export const usePermissionStore = defineStore("permission", () => {
|
||||
generateRoutes,
|
||||
setMixLayoutSideMenus,
|
||||
resetRouter,
|
||||
reloadDynamicRoutesOnce,
|
||||
reloadPermissionSnapshotOnce,
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
@@ -38,6 +38,23 @@ export const useUserStore = defineStore("user", () => {
|
||||
});
|
||||
}
|
||||
|
||||
let refreshPromise: Promise<void> | null = null;
|
||||
|
||||
/**
|
||||
* 刷新 token(单飞)。
|
||||
*
|
||||
* 多个并发请求遇到 token 过期时,共享同一次 refresh 请求。
|
||||
*/
|
||||
function refreshTokenOnce() {
|
||||
if (refreshPromise) return refreshPromise;
|
||||
|
||||
refreshPromise = refreshToken().finally(() => {
|
||||
refreshPromise = null;
|
||||
});
|
||||
|
||||
return refreshPromise;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户信息
|
||||
*
|
||||
@@ -146,6 +163,7 @@ export const useUserStore = defineStore("user", () => {
|
||||
resetAllState,
|
||||
resetUserState,
|
||||
refreshToken,
|
||||
refreshTokenOnce,
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user