003-pro ant design 前端权限处理-支持URL参数的页面
前天需要增加MD5引用
https://www.bootcdn.cn/blueimp-md5/
1、修改权限文件(CheckPermissions.js)使用自定义权限

2、配置异常页面
2.1、创建异常页面
/src/pages/Exception
import React from 'react';
import { formatMessage } from 'umi/locale';
import Link from 'umi/link';
import Exception from '@/components/Exception'; const Exception400 = () => (
<Exception
type="400"
desc={formatMessage({ id: 'app.exception.description.400' })}
linkElement={Link}
backText={formatMessage({ id: 'app.exception.back' })}
/>
); export default Exception400;
2.2、增加400页面配置项
/src/components/Exception/typeConfig.js
const config = {
400: {
img: 'https://gw.alipayobjects.com/zos/rmsportal/wZcnGqRDyhPOEYFcZDnb.svg',
title: '400',
desc: '抱歉,你无权访问该页面或该页面不存在',
},
//......
}
2.3、添加中英文菜单对照
/src/locales/zh-CN.js
'app.exception.description.400': '抱歉,你无权限访问该页面或该页面不存在',
2.4、将400页面引入(BasicLayout.js)
/src/layouts/BasicLayout.js
import Exception400 from '../pages/Exception/400';
3、权限菜单控制开发
3.1、获取远端服务器授权菜单
/src/layouts/BasicLayout.js
state中增加menuPermissionData参数
state = {
rendering: true,
isMobile: false,
menuData: this.getMenuData(),
menuPermissionData: '',
}
在componentWillMount中增加后端请求并赋值menuPermissionData
dispatch({
type: 'common/getMenuPermissionData',
callback: res => {
console.log(res);
if (res && res.code == ) {
this.setState({
menuPermissionData: JSON.stringify(res.data),
});
}
},
});
对于model,service请求需要自行开发
返回值格式:
{
"code": 20000,
"msg": "操作成功",
"data": [
{
"menuList": [
{
"menuList": [],
"url": "/data/#/menu1/son",
},
{
"menuList": [
{
"menuList": [],
"url": "/data/#/menu2/:id",
},
{
"menuList": [],
"url": "/data/#/menu3/:id/add",
}
],
"id": 399,
"url": "/data/#/menu4",
},
],
"id": 384,
"url": "",
}
]
}
后端接口可以返回:/data/#/menu3/:id/add菜单
针对
/data/#/menu3/4/add
/data/#/menu3/5/add
可以通过
3.2、控制逻辑,增加两个方法
validMatchUrl =(menuPermissionDataStr, currentHashUrl) =>{
// currentHashUrl = '/operate/skuFormField/6';
let fullMatch = [];//完全匹配地址
let ruleMatch = [];//规则匹配地址
const regRule2 = /\//g;
let menuPermissionData =JSON.parse(menuPermissionDataStr);
const menuPermissionDataMd5 = localStorage.getItem('menuPermissionData');
const currentMenuMd5 = md5(JSON.stringify(menuPermissionData));
if (menuPermissionDataMd5 && menuPermissionDataMd5 === currentMenuMd5) {
console.log('----cache-----',menuPermissionData);
fullMatch = JSON.parse(localStorage.getItem('menuPermissionData_fullMatch'));
ruleMatch = JSON.parse(localStorage.getItem('menuPermissionData_ruleMatch'));
} else {
console.log('----no cache-----',menuPermissionData);
fullMatch.push("/");
fullMatch.push("/index");
menuPermissionData.map(t => {
this.iterMenuList(fullMatch,ruleMatch,t.menuList);
});
localStorage.setItem('menuPermissionData_fullMatch', JSON.stringify(fullMatch));
localStorage.setItem('menuPermissionData_ruleMatch', JSON.stringify(ruleMatch));
localStorage.setItem('menuPermissionData', currentMenuMd5);
}
//全匹配地址
console.log('using fullMatch route start');
if (fullMatch.indexOf(currentHashUrl) != -1) {
//匹配成功
console.log('using fullMatch route result:true');
console.log('using fullMatch route end');
return true;
}
console.log('using fullMatch route end');
//规则匹配地址
// 原始URL分解
//路由个数
console.log('using ruleMatch route start');
const routkeyNum = currentHashUrl.match(regRule2).length;
const matchRouteObj=ruleMatch.find(e => e && e.key === routkeyNum);
if(matchRouteObj && matchRouteObj.value && matchRouteObj.value.length>0){
const tmpRuleMatchArr = matchRouteObj.value;
for (let i = 0; i < tmpRuleMatchArr.length; i++) {
const f = tmpRuleMatchArr[i];
let tmpFlag = true;
for (let i = 0; i < f.length; i++) {
if (f[i] === '/:') {
tmpFlag = true;
continue;
} else if (f[i] !== ('/' + currentHashUrl.split('/').filter(d => d && d.length > 0)[i])) {
tmpFlag = false;
break;
}
}
if (tmpFlag){
console.log('using ruleMatch route result:true');
console.log('using ruleMatch route end');
return true;
}
}
}
console.log('using ruleMatch route result:false');
console.log('using ruleMatch route end');
return false;
}
iterMenuList=(fullMatch,ruleMatch,menuList)=>{
const regRule2 = /\//g;
if(menuList && menuList.length>0){
menuList.map(a => {
const url = a.url.indexOf('#') != -1 ? a.url.split('#')[1] : a.url;
if (url.indexOf('/:') == -1) {
fullMatch.push(url);//完全匹配地址
} else {
// 获取map是否有对应的路由个数
const routkey = url.match(regRule2).length;
const tmpMapValue = ruleMatch.find(c => {
return c && c.key === routkey;
});
//构建当前URL
const tmpRuleRuleArr = url.split('/').filter(c => {
return c && c.length > 0;
});
const tmpRuleRuleArr2 = tmpRuleRuleArr.map(b => {
if (b && b.length > 0) {
return b = b.startsWith(':') ? '/:' : ('/' + b);
}
});
if (tmpMapValue && tmpMapValue.value && tmpMapValue.value.length > 0) {
tmpMapValue.value.push(tmpRuleRuleArr2);
} else {
// 没有的话添加
const a = [];
a.push(tmpRuleRuleArr2);
ruleMatch.push({ key: routkey, value: a });
}
}
this.iterMenuList(fullMatch,ruleMatch,a.menuList);
});
}else{
return ;
}
}
3.3、render增加权限控制
数据引入
const { isMobile, menuData, menuPermissionData, openLocalConfig, isShowChildren } = this.state;
在Content中增加
<Content style={this.getContentStyle()}>
<Authorized
authority={routerConfig && routerConfig.authority}
noMatch={<Exception403 />}
>
{
(menuPermissionData != '') ?
(
this.validMatchUrl(menuPermissionData,location.hash.split('?')[0].replace(new RegExp('#', 'g'), ''))
? children:<Exception400 />
)
:''
}
</Authorized>
</Content>
003-pro ant design 前端权限处理-支持URL参数的页面的更多相关文章
- 使用selenium操作ant design前端的页面,感觉页面没加载完
因需要收集页面数据,遂准备使用selenium爬取瓦斯阅读页面, 瓦斯网站使用的是ant design,元素定位非常困难,页面元素都没有ID,现在还只是能做到操作登录,不能自动打开订阅,查询某公众号, ...
- ant design pro (四)新增页面
一.概述 参看地址:https://pro.ant.design/docs/new-page-cn 这里的『页面』指配置了路由,能够通过链接直接访问的模块,要新建一个页面,通常只需要在脚手架的基础上进 ...
- ant design pro (十六)advanced 权限管理
一.概述 原文地址:https://pro.ant.design/docs/authority-management-cn 权限控制是中后台系统中常见的需求之一,你可以利用我们提供的权限控制组件,实现 ...
- Ant Design Pro 鉴权/ 权限管理
https://pro.ant.design/docs/authority-management-cn ant-design-pro 1.0.0 V4 最近需要项目需要用扫码登录,因此就使用antd ...
- ant design pro (十三)advanced 错误处理
一.概述 原文地址:https://pro.ant.design/docs/error-cn 二.详细 2.1.页面级报错 2.1.1.应用场景 路由直接引导到报错页面,比如你输入的网址没有匹配到任何 ...
- ant design pro (十二)advanced UI 测试
一.概述 原文地址:https://pro.ant.design/docs/ui-test-cn UI 测试是项目研发流程中的重要一环,有效的测试用例可以梳理业务需求,保证研发的质量和进度,让工程师可 ...
- ant design pro (十一)advanced Mock 和联调
一.概述 原文地址:https://pro.ant.design/docs/mock-api-cn Mock 数据是前端开发过程中必不可少的一环,是分离前后端开发的关键链路.通过预先跟服务器端约定好的 ...
- ant design pro (八)构建和发布
一.概述 原文地址:https://pro.ant.design/docs/deploy-cn 二.详细 2.1.构建 当项目开发完毕,只需要运行一行命令就可以打包你的应用: npm run buil ...
- Ant Design Pro (中后台系统)教程
一.概念:https://pro.ant.design/docs/getting-started-cn(官方网站) 1.Ant Design Pro 是什么: https://www.cnblogs ...
随机推荐
- IntelliJ IDEA 激活 及 License Server 安装使用 Window篇
IDEA版本: IntelliJ IDEA 2017.2Build #IU-172.3317.76, built on July 15, 2017Licensed to Administrator J ...
- 【ArcGIS】栅格分析-问题之001(转)
在arcgis中进行栅格计算时,碰到这样的错误ERROR 000539:Error running expression:rcexec()<type 'exceptions.ValueError ...
- Qt编写守护程序保证程序一直运行(开源)
没有任何人敢保证自己写的程序没有任何BUG,尤其是在商业项目中,程序量越大,复杂度越高,出错的概率越大,尤其是现场环境千差万别,和当初本地电脑测试环境很可能不一样,有很多特殊情况没有考虑到,如果需要保 ...
- [原]Jenkins(八)---jenkins构建项目报错时发送错误报告邮件
/** * lihaibo * 文章内容都是根据自己工作情况实践得出. * 版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horizonli/p/533 ...
- smarty模板操作变量
smarty模板技术分配变量的细节问题. 从php中获取数据 一句话:可以分配php支持的各种数据类型. php: 基本数据类型 int double string bool ...
- shell 脚本部分变量含义
$ # 传递到脚本的参数个数$ * 以一个单字符串显示所有向脚本传递的参数.与位置变量不同,此选项参数可超过9个$ $ 脚本运行的当前进程I D号$ ! 后台运行的最后一个进程的进程I D号$ @ 与 ...
- django高并发优化
我开始对web开发产生了兴趣,并决定自己也尝试开发一个网站.在此之前,我做过3年的java application的开发,对web开发应该算一无所知.在比较了java,php,ror,和python后 ...
- IIS 使用域账户访问SQL 需要配置
打开应用程序的 Web.config 文件并添加以下元素: <authentication mode="Windows" /> <identity imper ...
- [No0000144]深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing)理解堆与栈1/4
前言 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC).另外,了解内存管理可以帮助我们理解在每一个程 ...
- iOS中UITableView的一些问题思考
UITableview的数据源为什么是代理,而不是引用? 我的理解,一般情况下控制器会引用tableView, 数据源和代理方法都是tableView的一个若引用,出了“tableView.datas ...