refactor: 分页响应数据结构调整

This commit is contained in:
Ray.Hao
2026-02-12 21:01:48 +08:00
parent c09ce3e4a8
commit 9480b426dc
45 changed files with 1013 additions and 1026 deletions

View File

@@ -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-routerrouter.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,
};
});

View File

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