fix: 优化登录相关权限问题 添加按键权限判断
This commit is contained in:
@@ -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
@@ -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 }) => {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user