前天需要增加MD5引用

  https://www.bootcdn.cn/blueimp-md5/

1、修改权限文件(CheckPermissions.js)使用自定义权限

  

2、配置异常页面

2.1、创建异常页面

  /src/pages/Exception

  1. import React from 'react';
  2. import { formatMessage } from 'umi/locale';
  3. import Link from 'umi/link';
  4. import Exception from '@/components/Exception';
  5.  
  6. const Exception400 = () => (
  7. <Exception
  8. type="400"
  9. desc={formatMessage({ id: 'app.exception.description.400' })}
  10. linkElement={Link}
  11. backText={formatMessage({ id: 'app.exception.back' })}
  12. />
  13. );
  14.  
  15. export default Exception400;

2.2、增加400页面配置项

  /src/components/Exception/typeConfig.js

  1. const config = {
  2. 400: {
  3. img: 'https://gw.alipayobjects.com/zos/rmsportal/wZcnGqRDyhPOEYFcZDnb.svg',
  4. title: '400',
  5. desc: '抱歉,你无权访问该页面或该页面不存在',
  6. },
  7. //......
  8. }

2.3、添加中英文菜单对照

  /src/locales/zh-CN.js

  1. 'app.exception.description.400': '抱歉,你无权限访问该页面或该页面不存在',

2.4、将400页面引入(BasicLayout.js)

  /src/layouts/BasicLayout.js  

  1. import Exception400 from '../pages/Exception/400';

3、权限菜单控制开发

3.1、获取远端服务器授权菜单

  /src/layouts/BasicLayout.js

  state中增加menuPermissionData参数 

  1. state = {
  2. rendering: true,
  3. isMobile: false,
  4. menuData: this.getMenuData(),
  5. menuPermissionData: '',
  6. }

  在componentWillMount中增加后端请求并赋值menuPermissionData

  1. dispatch({
  2. type: 'common/getMenuPermissionData',
  3. callback: res => {
  4. console.log(res);
  5. if (res && res.code == ) {
  6. this.setState({
  7. menuPermissionData: JSON.stringify(res.data),
  8. });
  9. }
  10. },
    });

对于model,service请求需要自行开发

返回值格式:

  1. {
  2. "code": 20000,
  3. "msg": "操作成功",
  4. "data": [
  5. {
  6. "menuList": [
  7. {
  8. "menuList": [],
  9. "url": "/data/#/menu1/son",
  10. },
  11. {
  12. "menuList": [
  13. {
  14. "menuList": [],
  15. "url": "/data/#/menu2/:id",
  16. },
  17. {
  18. "menuList": [],
  19. "url": "/data/#/menu3/:id/add",
  20. }
  21. ],
  22. "id": 399,
  23. "url": "/data/#/menu4",
  24. },
  25. ],
  26. "id": 384,
  27. "url": "",
  28. }
  29. ]
  30. }

后端接口可以返回:/data/#/menu3/:id/add菜单

针对

  1. /data/#/menu3/4/add
  2. /data/#/menu3/5/add

可以通过

3.2、控制逻辑,增加两个方法

  1. validMatchUrl =(menuPermissionDataStr, currentHashUrl) =>{
  2. // currentHashUrl = '/operate/skuFormField/6';
  3. let fullMatch = [];//完全匹配地址
  4. let ruleMatch = [];//规则匹配地址
  5. const regRule2 = /\//g;
  6. let menuPermissionData =JSON.parse(menuPermissionDataStr);
  7. const menuPermissionDataMd5 = localStorage.getItem('menuPermissionData');
  8. const currentMenuMd5 = md5(JSON.stringify(menuPermissionData));
  9. if (menuPermissionDataMd5 && menuPermissionDataMd5 === currentMenuMd5) {
  10. console.log('----cache-----',menuPermissionData);
  11. fullMatch = JSON.parse(localStorage.getItem('menuPermissionData_fullMatch'));
  12. ruleMatch = JSON.parse(localStorage.getItem('menuPermissionData_ruleMatch'));
  13. } else {
  14. console.log('----no cache-----',menuPermissionData);
  15. fullMatch.push("/");
  16. fullMatch.push("/index");
  17. menuPermissionData.map(t => {
  18. this.iterMenuList(fullMatch,ruleMatch,t.menuList);
  19. });
  20. localStorage.setItem('menuPermissionData_fullMatch', JSON.stringify(fullMatch));
  21. localStorage.setItem('menuPermissionData_ruleMatch', JSON.stringify(ruleMatch));
  22. localStorage.setItem('menuPermissionData', currentMenuMd5);
  23. }
  24. //全匹配地址
  25. console.log('using fullMatch route start');
  26. if (fullMatch.indexOf(currentHashUrl) != -1) {
  27. //匹配成功
  28. console.log('using fullMatch route result:true');
  29. console.log('using fullMatch route end');
  30. return true;
  31. }
  32. console.log('using fullMatch route end');
  33. //规则匹配地址
  34. // 原始URL分解
  35. //路由个数
  36. console.log('using ruleMatch route start');
  37. const routkeyNum = currentHashUrl.match(regRule2).length;
  38. const matchRouteObj=ruleMatch.find(e => e && e.key === routkeyNum);
  39. if(matchRouteObj && matchRouteObj.value && matchRouteObj.value.length>0){
  40. const tmpRuleMatchArr = matchRouteObj.value;
  41. for (let i = 0; i < tmpRuleMatchArr.length; i++) {
  42. const f = tmpRuleMatchArr[i];
  43. let tmpFlag = true;
  44. for (let i = 0; i < f.length; i++) {
  45. if (f[i] === '/:') {
  46. tmpFlag = true;
  47. continue;
  48. } else if (f[i] !== ('/' + currentHashUrl.split('/').filter(d => d && d.length > 0)[i])) {
  49. tmpFlag = false;
  50. break;
  51. }
  52. }
  53. if (tmpFlag){
  54. console.log('using ruleMatch route result:true');
  55. console.log('using ruleMatch route end');
  56. return true;
  57. }
  58. }
  59. }
  60. console.log('using ruleMatch route result:false');
  61. console.log('using ruleMatch route end');
  62. return false;
  63. }
  64.  
  65. iterMenuList=(fullMatch,ruleMatch,menuList)=>{
  66. const regRule2 = /\//g;
  67. if(menuList && menuList.length>0){
  68. menuList.map(a => {
  69. const url = a.url.indexOf('#') != -1 ? a.url.split('#')[1] : a.url;
  70. if (url.indexOf('/:') == -1) {
  71. fullMatch.push(url);//完全匹配地址
  72. } else {
  73. // 获取map是否有对应的路由个数
  74. const routkey = url.match(regRule2).length;
  75. const tmpMapValue = ruleMatch.find(c => {
  76. return c && c.key === routkey;
  77. });
  78. //构建当前URL
  79. const tmpRuleRuleArr = url.split('/').filter(c => {
  80. return c && c.length > 0;
  81. });
  82. const tmpRuleRuleArr2 = tmpRuleRuleArr.map(b => {
  83. if (b && b.length > 0) {
  84. return b = b.startsWith(':') ? '/:' : ('/' + b);
  85. }
  86. });
  87. if (tmpMapValue && tmpMapValue.value && tmpMapValue.value.length > 0) {
  88. tmpMapValue.value.push(tmpRuleRuleArr2);
  89. } else {
  90. // 没有的话添加
  91. const a = [];
  92. a.push(tmpRuleRuleArr2);
  93. ruleMatch.push({ key: routkey, value: a });
  94. }
  95. }
  96.  
  97. this.iterMenuList(fullMatch,ruleMatch,a.menuList);
  98. });
  99. }else{
  100. return ;
  101. }
  102. }

3.3、render增加权限控制

数据引入

  1. const { isMobile, menuData, menuPermissionData, openLocalConfig, isShowChildren } = this.state;

在Content中增加

  1. <Content style={this.getContentStyle()}>
  2. <Authorized
  3. authority={routerConfig && routerConfig.authority}
  4. noMatch={<Exception403 />}
  5. >
  6. {
  7. (menuPermissionData != '') ?
  8. (
  9. this.validMatchUrl(menuPermissionData,location.hash.split('?')[0].replace(new RegExp('#', 'g'), ''))
  10. ? children:<Exception400 />
  11. )
  12. :''
  13.  
  14. }
  15. </Authorized>
  16. </Content>

 

  

003-pro ant design 前端权限处理-支持URL参数的页面的更多相关文章

  1. 使用selenium操作ant design前端的页面,感觉页面没加载完

    因需要收集页面数据,遂准备使用selenium爬取瓦斯阅读页面, 瓦斯网站使用的是ant design,元素定位非常困难,页面元素都没有ID,现在还只是能做到操作登录,不能自动打开订阅,查询某公众号, ...

  2. ant design pro (四)新增页面

    一.概述 参看地址:https://pro.ant.design/docs/new-page-cn 这里的『页面』指配置了路由,能够通过链接直接访问的模块,要新建一个页面,通常只需要在脚手架的基础上进 ...

  3. ant design pro (十六)advanced 权限管理

    一.概述 原文地址:https://pro.ant.design/docs/authority-management-cn 权限控制是中后台系统中常见的需求之一,你可以利用我们提供的权限控制组件,实现 ...

  4. Ant Design Pro 鉴权/ 权限管理

    https://pro.ant.design/docs/authority-management-cn ant-design-pro 1.0.0 V4 最近需要项目需要用扫码登录,因此就使用antd ...

  5. ant design pro (十三)advanced 错误处理

    一.概述 原文地址:https://pro.ant.design/docs/error-cn 二.详细 2.1.页面级报错 2.1.1.应用场景 路由直接引导到报错页面,比如你输入的网址没有匹配到任何 ...

  6. ant design pro (十二)advanced UI 测试

    一.概述 原文地址:https://pro.ant.design/docs/ui-test-cn UI 测试是项目研发流程中的重要一环,有效的测试用例可以梳理业务需求,保证研发的质量和进度,让工程师可 ...

  7. ant design pro (十一)advanced Mock 和联调

    一.概述 原文地址:https://pro.ant.design/docs/mock-api-cn Mock 数据是前端开发过程中必不可少的一环,是分离前后端开发的关键链路.通过预先跟服务器端约定好的 ...

  8. ant design pro (八)构建和发布

    一.概述 原文地址:https://pro.ant.design/docs/deploy-cn 二.详细 2.1.构建 当项目开发完毕,只需要运行一行命令就可以打包你的应用: npm run buil ...

  9. Ant Design Pro (中后台系统)教程

    一.概念:https://pro.ant.design/docs/getting-started-cn(官方网站) 1.Ant Design Pro 是什么:  https://www.cnblogs ...

随机推荐

  1. [Bayes] runif: Inversion Sampling

    runifum Inversion Sampling 看样子就是个路人甲. Ref: [Bayes] Hist & line: Reject Sampling and Importance S ...

  2. [JS] ECMAScript 6 - Prototype : compare with c#

    开胃菜 prototype 对象 JavaScript 语言的继承则是通过“原型对象”(prototype). function Cat(name, color) { // <----构造函数 ...

  3. Java -- POI -- 随笔汇总

    1. 判断指定的单元格是否是合并单元格 /** * 功能:判断指定的单元格是否是合并单元格 * 原理:excel中的合并单元格其实就是首单元格,只不过该单元格增加了 rowspan和colspan两个 ...

  4. 获取linux服务进程号

    ps -ef | grep "服务名" | grep -v "grep" | awk '{print $2}' # ps -ef|grep "被查询的 ...

  5. IntelliJ IDE破解

    1.购买正版用户 2.激活码 一:下载以下jar,放到 bin 破解补丁无需使用注册码,下载地址 idea14 keygen下载地址 二:在下面两个文件中加入-javaagent:E:\IDEA\In ...

  6. ubuntu上安装docker

    author : headsen chen date : 2019-03-06  16:36:12 apt-get remove docker docker-engine docker-ce dock ...

  7. 【CF587D】Duff in Mafia 二分+前缀优化建图+2-SAT

    [CF587D]Duff in Mafia 题意:给你一张n个点m条边的无向图,边有颜色和边权.你要从中删去一些边,满足: 1.任意两条删掉的边没有公共的顶点.2.任意两条剩余的.颜色相同的边没有公共 ...

  8. [转]CDN(内容分发网络)技术原理

    1. 前言 Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高,虽然带宽不断增加, 用户数量也在不断增加,受Web服务器的负荷和传输距离 ...

  9. 10.20stark组件已经完工

    2018-10-20 19:37:31 stark组件已经做完!基本上和Django的admin一样! 放上github连接:https://github.com/TrueNewBee/pythonD ...

  10. Page Visibility API 页面是否获取焦点 Event: visibilitychange

    W3C 文档 https://www.w3.org/TR/page-visibility/ MDN 文档 https://www.w3.org/TR/page-visibility/ // Docum ...