antd-pro的权限跟我们用的不太一样,所以需要自己开发一套。
主要思路如下:
1.登录的时候获取所有的按钮并存到本地
2.进入页面的时候根据code判断是否显示按钮(组件形式,props.children)
3.特殊的(比如disabled)提供一个方法判断有无权限
1.登录页
let permissions = res.roleList[0].permissions;
sessionStorage.setItem('btnInfo', JSON.stringify(getBtns(permissions)));
2.页面中使用
import { HasPm, hasPm } from '../../../../ytCommon/utils/app';
<!-- 组件形式 -->
<!-- 一般用于是否显示按钮 -->
<HasPm key="add" permissionCode="admin_district_auth:add">
<a>
新增
</a>
</HasPm>,
<!-- 方法形式 -->
<!-- 一般用于特定的状态 -->
<Switch
disabled={!hasPm('admin_district_auth:modify')}
checked={e === '1' ? true : false}
onChange={() => onChangeSwitch(row)}
/>
3.其他的方法(getBtns,HasPm, hasPm)
//登录获取所有的按钮
export function getBtns(permissions: API.Permission[]) {
let arr: API.Permission[] = [];
function forEach(permissions: API.Permission[]) {
permissions.forEach((item: API.Permission) => {
if (item.childPermissionList.length > 0) {
forEach(item.childPermissionList);
} else {
arr = arr.concat(item);
}
});
}
forEach(permissions);
return arr;
}
// 判断有无按钮权限(组件形式)
let btnInfo: API.BtnInfo[] = [];
export const HasPm = (props: { permissionCode: string; children: any }) => {
const { permissionCode, children } = props;
// 先获取按钮列表
if (btnInfo.length === 0) {
btnInfo = JSON.parse(sessionStorage.getItem("btnInfo") || "[]");
}
// 判断有无权限
const t = btnInfo.some((item: API.BtnInfo) => {
if (item.permissionCode === permissionCode) {
return true;
} else {
return false;
}
});
if (t) {
return children;
} else {
return null;
}
};
// 只返回是否有权限(方法形式)
export const hasPm = (permissionCode: string) => {
// 先获取按钮列表
if (btnInfo.length === 0) {
btnInfo = JSON.parse(sessionStorage.getItem("btnInfo") || "[]");
}
// 判断有无权限
const t = btnInfo.some((item: API.BtnInfo) => {
if (item.permissionCode === permissionCode) {
return true;
} else {
return false;
}
});
return t;
};
这样就可以实现一套自己的按钮权限系统,接下来就是要解决配置多个paths的问题了。