fix: 优化登录相关权限问题 添加按键权限判断

This commit is contained in:
ZhuRui
2026-08-05 15:30:09 +08:00
parent 503ee266b0
commit 73d4d8fd34
18 changed files with 283 additions and 95 deletions
+17
View File
@@ -0,0 +1,17 @@
import type { AuthData } from './menu';
/** Promise 级缓存:并发调用共享同一个请求,失败时清除以便重试 */
let authDataPromise: Promise<AuthData> | null = null;
export function getAuthDataPromise() {
return authDataPromise;
}
export function setAuthDataPromise(promise: Promise<AuthData> | null) {
authDataPromise = promise;
}
/** 清除权限数据缓存(退出登录时调用,确保下次登录不读到旧数据) */
export function clearAuthDataCache() {
authDataPromise = null;
}
+34 -23
View File
@@ -1,15 +1,10 @@
import { get } from '@/utils/request';
import type { MenuNode, PermissionCode } from '@/types';
import { FALLBACK_MENU_NODES } from '@/config/fallbackRoutes';
import { getAuthDataPromise, setAuthDataPromise, clearAuthDataCache } from '@/api/authCache';
import { forceReLogin } from '@/hooks/useAuth';
// ============================================================
// 权限数据缓存(/op/permission 只请求一次)
// ============================================================
/**
* Promise 级缓存:并发调用共享同一个请求,失败时清除以便重试
*/
let authDataPromise: Promise<AuthData> | null = null;
export { clearAuthDataCache } from '@/api/authCache';
/**
* 权限数据(角色 + 权限码)
@@ -19,30 +14,46 @@ export interface AuthData {
permsList: string[];
}
const AUTH_FETCH_FAIL_MSG = '账户权限获取失败,请重新登录';
function normalizeAuthData(res: any): AuthData {
if (res?.code != null && res.code != 200) {
throw new Error(res.msg || AUTH_FETCH_FAIL_MSG);
}
const roleList = res?.data?.roleList || [];
const permsList = res?.data?.permsList || [];
if (permsList.length === 0) {
throw new Error(AUTH_FETCH_FAIL_MSG);
}
return { roleList, permsList };
}
function handleAuthFetchFailure() {
clearAuthDataCache();
forceReLogin(AUTH_FETCH_FAIL_MSG);
}
/**
* 获取当前用户的完整权限数据(角色列表 + 权限编码列表)
* 接口: GET /op/permission
* Promise 级缓存:并发调用共享同一个请求,失败时清除缓存以允许重试
*/
export function fetchAuthData(): Promise<AuthData> {
if (authDataPromise) return authDataPromise;
authDataPromise = get('/op/permission')
.then((res: any) => ({
roleList: res.data?.roleList || [],
permsList: res.data?.permsList || [],
}))
const cached = getAuthDataPromise();
if (cached) return cached;
const promise = get('/op/permission')
.then((res) => normalizeAuthData(res))
.catch((err) => {
authDataPromise = null;
handleAuthFetchFailure();
throw err;
});
return authDataPromise;
}
/**
* 清除权限数据缓存(退出登录时调用,确保下次登录不读到旧数据)
*/
export function clearAuthDataCache() {
authDataPromise = null;
setAuthDataPromise(promise);
return promise;
}
/**
@@ -95,7 +106,7 @@ function filterMenuNodesByPermission(nodes: MenuNode[], permsSet: Set<string>):
* 2. 用权限码过滤 FALLBACK_MENU_NODES
* 3. 返回过滤后的菜单树
*
* 异常时抛出,由调用方(menuStore.loadMenu)降级使用未过滤的兜底路由
* 权限获取失败时由 fetchAuthData 统一强制重新登录
*/
export function fetchMenuTree(): Promise<MenuNode[]> {
return fetchAuthData().then(({ permsList }) => {
+2 -2
View File
@@ -57,12 +57,12 @@ export function updateUser(params: UserUpdateParams): Promise<ApiResult<Record<s
export function toggleUserActive(
params: UserActiveParams,
): Promise<ApiResult<Record<string, never>>> {
return post('/sys/user/active', params);
return post('/admin/sys/user/active', params);
}
/** POST /sys/user/updatepwd — 修改密码(直接调接口) */
export function updateUserPwd(
params: UserUpdatePwdParams,
): Promise<ApiResult<Record<string, never>>> {
return post('/sys/user/updatepwd', params);
return post('/admin/sys/user/updatepwd', params);
}