前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >React权限管理分享

React权限管理分享

作者头像
用户9914333
发布2022-07-21 19:43:24
8730
发布2022-07-21 19:43:24
举报
文章被收录于专栏:bug收集bug收集

权限管理不在只是后端的事情了,现在权限分为了前端权限与后端权限。

前端权限,主要是两部分:一是控制显示,没有对应权限不进行显示,二是拦截非法的请求,下文介绍了在React中去做前端权限的步骤与代码:

React中的权限管理

1. antd ui框架来做

框架下载

安装axios ,react-router-dom,mobx,mobx-react ,

babel(装饰器)相关的,antd

引用antd

代码语言:javascript
复制
import { Button } from 'antd';

修改 src/App.css,

添加@import '~antd/dist/antd.css';

2. 项目架构

public

src

|-- component 组件

|-- pages 页面级组件

|-- assets 资源文件

|-- router 路由相关文件

|-- store 状态

|-- api 请求接口

|-- util 公共的Js文件,比如,发邮件,发短信

app.css

app.js

index.js

3. 权限管理实现

3.1 登录 => 点击登录,进行登录判断,如果登录成功,获取登录数据数据有:

token

userInfo : 用户相关数据

menuInfo: 用户有权访问的模块

以上,都是后台数据返回,在获取数据后,存储在mobx中,代码如下

代码语言:javascript
复制
@observable user =[]
@observable token = ""
@action
    login=(user,pwd)=>{
return new Promise((resolve,reject)=>{
            Axios.post(Api.user.userLogin,
                {userName:user,userPwd:pwd}
                )
                .then((res)=>{
console.log(res)
if(res.data.returnCode===200){
console.log(res.data.data)
this.user = res.data.data;
this.token = res.data.token;
                    resolve('登录成功')
                }else{
                    reject('登录失败')
                }
            })
        })
    }

用户点击登录按钮,触发mobx的登录操作

代码语言:javascript
复制
//需要将值 ,提到服务器端进行判断
  this.props.user.login(obj.username,obj.password)
  then((data)=>{
             this.props.history.push("/index")
   }).catch(function(err){
             console.log(err)
  });

3.2 首页 =》显示后台管理的框架,左边菜单(动态加载) ,上面,也可以菜单,右边,显示不同页面即:点击左边的菜单,右边发生变化,需要添加链接,还需要动态添加路由(Router)

3.2.1左边动态菜单

代码如下:

代码语言:javascript
复制
bindMenu(menulist){
let MenuList= menulist.map((item,index)=>{
if(item.menuChilds.length===0){  //没有子菜单
let IconMenu =antIcons[item.menuImgClass];
return <Menu.Item key={item.menuId} icon={  <IconMenu />}>
<Link to={item.menuUrl}>{item.menuName}</Link>
</Menu.Item>
        }
        else{
            let IconMenu =antIcons[item.menuImgClass];
            return <SubMenu key={item.menuId} icon={  <IconMenu />} title={item.menuName}>
                {this.bindMenu(item.menuChilds)}
</SubMenu>
        }

    })
    return MenuList;
}
     componentDidMount(){
         let menuList =this.bindMenu(this.props.user.user.menuInfo);
         this.setState({
             leftMenu :menuList
         })
     }

3.2.2 动态路由

代码如下:

代码语言:javascript
复制
bindRouter(list){
      let routerList= list.map((item)=>{
if(item.menuChilds.length===0){
return  <Route key={item.menuId} path={item.menuUrl} component={ loadable(() => import(`./${item.componentPath}`))}/>
            }else{
// return [...this.bindRouter(item.menuChilds),<Route key={item.menuId} path={item.menuUrl} component={ loadable(() => import(`./${item.componentPath}`))}/>]
return  <Route key={item.menuId} path={item.menuUrl} render={() =>{
                   let ComponentName =loadable(() => import(`./${item.componentPath}`));
return <ComponentName {...this.props}>
                        {this.bindRouter(item.menuChilds)}
                    </ComponentName>
                       }}>
               </Route>
            }
        })
return routerList;
    }
    componentDidMount(){
        let menuList =this.bindRouter(this.props.user.user.menuInfo);
this.setState({
            routerList :menuList
        })
    }

3.2.3 首页

引用菜单组件,与路由组件

代码语言:javascript
复制
render()
    {
        return (
            <Layout>
                <Header className="header">
                    <div className="logo" />
                    <Menu theme="dark" mode="horizontal" defaultSelectedKeys={['2']}>
                        <Menu.Item key="1">nav 1</Menu.Item>
                        <Menu.Item key="2">nav 2</Menu.Item>
                        <Menu.Item key="3">nav 3</Menu.Item>
                    </Menu>
                </Header>
                <Layout>
                    <Sider width={200} className="site-layout-background">
                        {/*这里写一个组件,根据数据生成Menu*/}
                     <LeftMenu />
                    </Sider>
                    <Layout style={{ padding: '0 24px 24px' }}>
                        <Breadcrumb style={{ margin: '16px 0' }}>
                            <Breadcrumb.Item>Home</Breadcrumb.Item>
                            <Breadcrumb.Item>List</Breadcrumb.Item>
                            <Breadcrumb.Item>App</Breadcrumb.Item>
                        </Breadcrumb>
                        <Content
                            className="site-layout-background"
                            style={{
                                padding: 24,
                                margin: 0,
                                minHeight: 280,
                            }}
                        >
                            <PrivateRouter/>
                        </Content>
                    </Layout>
                </Layout>
            </Layout>
        )
    }

源码地址:https://github.com/doubleyong/reactRole.git

需要源码的,可以到github下载,欢迎一起讨论

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 bug收集 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
短信
腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档