121 lines
3.1 KiB
TypeScript
121 lines
3.1 KiB
TypeScript
/**
|
||
* 权限配置文件
|
||
* 用于配置特定页面的访问权限
|
||
*/
|
||
|
||
/**
|
||
* 权限配置接口
|
||
*/
|
||
export interface PermissionConfig {
|
||
/** 路由路径 */
|
||
path: string;
|
||
/** 允许访问的用户名列表 */
|
||
allowedUsers: string[];
|
||
/** 权限描述 */
|
||
description?: string;
|
||
}
|
||
|
||
/**
|
||
* 页面权限配置列表
|
||
* 在这里配置需要特殊权限控制的页面
|
||
*/
|
||
export const PAGE_PERMISSIONS: PermissionConfig[] = [
|
||
{
|
||
path: '/console/channel',
|
||
allowedUsers: ['cc', 'Guo'],
|
||
description: '号池管理页面 - 仅限cc和Guo用户访问',
|
||
},
|
||
{
|
||
path: '/console/system-statistics',
|
||
allowedUsers: ['cc', 'Guo'],
|
||
description: '系统统计页面 - 仅限cc和Guo用户访问',
|
||
},
|
||
{
|
||
path: '/console/announcement',
|
||
allowedUsers: ['cc', 'Guo'],
|
||
description: '公告管理页面 - 仅限cc和Guo用户访问',
|
||
},
|
||
// 可以在这里继续添加其他需要权限控制的页面
|
||
// {
|
||
// path: '/console/admin',
|
||
// allowedUsers: ['admin', 'superadmin'],
|
||
// description: '管理员页面',
|
||
// },
|
||
];
|
||
|
||
/**
|
||
* 检查用户是否有权限访问指定路径
|
||
* @param path 路由路径
|
||
* @param userName 用户名
|
||
* @returns 是否有权限
|
||
*/
|
||
export function checkPagePermission(path: string, userName: string | undefined): boolean {
|
||
// 如果没有用户名,返回false
|
||
if (!userName) {
|
||
return false;
|
||
}
|
||
|
||
// 查找该路径的权限配置
|
||
const permissionConfig = PAGE_PERMISSIONS.find(config => config.path === path);
|
||
|
||
// 如果没有配置权限,说明该页面不需要特殊权限,返回true
|
||
if (!permissionConfig) {
|
||
return true;
|
||
}
|
||
|
||
// 检查用户名是否在允许列表中(不区分大小写)
|
||
return permissionConfig.allowedUsers.some(
|
||
allowedUser => allowedUser.toLowerCase() === userName.toLowerCase(),
|
||
);
|
||
}
|
||
|
||
/**
|
||
* 获取用户无权访问的路由列表
|
||
* @param userName 用户名
|
||
* @returns 无权访问的路由路径数组
|
||
*/
|
||
export function getRestrictedRoutes(userName: string | undefined): string[] {
|
||
if (!userName) {
|
||
return PAGE_PERMISSIONS.map(config => config.path);
|
||
}
|
||
|
||
return PAGE_PERMISSIONS.filter(
|
||
config => !config.allowedUsers.some(
|
||
allowedUser => allowedUser.toLowerCase() === userName.toLowerCase(),
|
||
),
|
||
).map(config => config.path);
|
||
}
|
||
|
||
/**
|
||
* 检查路由是否需要权限控制
|
||
* @param path 路由路径
|
||
* @returns 是否需要权限控制
|
||
*/
|
||
export function isRestrictedRoute(path: string): boolean {
|
||
return PAGE_PERMISSIONS.some(config => config.path === path);
|
||
}
|
||
|
||
/**
|
||
* 过滤菜单路由,移除用户无权访问的菜单项
|
||
* @param routes 路由配置数组
|
||
* @param userName 用户名
|
||
* @returns 过滤后的路由配置数组
|
||
*/
|
||
export function filterMenuRoutes(routes: any[], userName: string | undefined): any[] {
|
||
return routes.filter((route) => {
|
||
// 检查当前路由是否有权限
|
||
const hasPermission = checkPagePermission(route.path, userName);
|
||
|
||
if (!hasPermission) {
|
||
return false;
|
||
}
|
||
|
||
// 如果有子路由,递归过滤
|
||
if (route.children && route.children.length > 0) {
|
||
route.children = filterMenuRoutes(route.children, userName);
|
||
}
|
||
|
||
return true;
|
||
});
|
||
}
|