前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录。最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star。


一、创建角色

  1. RBAC,即基于角色的访问控制(Role-Based Access Control),是优秀的权限控制模型
  2. 主要通过角色和权限建立管理,再赋予用户不同的角色,来实现权限控制的目标

      

  • 角色列表展示:对应Easy Mock数据接口/role/list

    {
    "code": 0,
    "list": {
    "item_list|7": [{
    "id|+1": 1,
    "role_name": /(管理人员)|(客服专员)|(财务专员)|(市场专员)|(人力专员)|(研发)|(测试)|(系统管理员)/,
    "status|0-1": 1,
    "authorize_user_name": "@cname",
    "authorize_time": 1521270166000,
    "create_time": 1499305790000,
    "menus": ["/home", "/ui/buttons", "/ui/modals", "/ui/loadings", "/ui/notification", "/ui/messages", "/ui/tabs", "/ui/gallery", "/ui/carousel", "/ui"]
    }]
    },
    "page": 1,
    "page_size": 10,
    "total_count": 25,
    "page_count": 3
    }
  1. 调用封装好的axios.requestList()获取角色数据

    componentWillMount(){
    this.requestList();
    } requestList = ()=>{
    axios.requestList(this, '/role/list', {})
    }
  2. 使用封装好的ETable组件实现角色列表的展示

    <div className="content-wrap">
    <ETable
    updateSelectedItem={Utils.updateSelectedItem.bind(this)}
    selectedRowKeys={this.state.selectedRowKeys}
    dataSource={this.state.list}
    columns={columns}
    />
    </div>
  • 创建角色:Modal弹框中嵌入表单子组件

  1. 表单组件:RoleForm = Form.create({})(RoleForm)实现表单数据的双向绑定

    // 角色创建
    class RoleForm extends React.Component{ render(){
    const { getFieldDecorator } = this.props.form;
    const formItemLayout = {
    labelCol: {span: 5},
    wrapperCol: {span: 16}
    };
    return (
    <Form layout="horizontal">
    <FormItem label="角色名称" {...formItemLayout}>
    {
    getFieldDecorator('role_name',{
    initialValue:''
    })(
    <Input type="text" placeholder="请输入角色名称"/>
    )
    }
    </FormItem>
    <FormItem label="状态" {...formItemLayout}>
    {
    getFieldDecorator('state',{
    initialValue:1
    })(
    <Select>
    <Option value={1}>开启</Option>
    <Option value={0}>关闭</Option>
    </Select>
    )}
    </FormItem>
    </Form>
    );
    }
    }
    RoleForm = Form.create({})(RoleForm);
  2. Modal弹框中应用表单组件:通过wrappedComponentRef={(inst) => this.roleForm = inst }获取表单元素的数据对象

    <Modal
    title="创建角色"
    visible={this.state.isRoleVisible}
    onOk={this.handleRoleSubmit}
    onCancel={()=>{
    this.roleForm.props.form.resetFields();//表单重置
    this.setState({
    isRoleVisible:false
    })
    }}
    >
    <RoleForm wrappedComponentRef={(inst) => this.roleForm = inst }/>
    </Modal>
  3. 点击【创建角色】按钮弹出弹框:给onClick事件绑定this.handleRole(),设置this.state.isRoleVisible为true

  4. 点击【OK】提交创建角色:给onOk事件绑定this.handleRoleSubmit()。①通过this.roleForm.props.form.getFieldsValue()获取表单的值,赋给params;②接口访问成功后,关闭弹框,刷新列表数据。

    // 角色提交
    handleRoleSubmit = ()=>{
    let data = this.roleForm.props.form.getFieldsValue(); //获取表单的值
    axios.ajax({
    url:'role/create', //Easy Mock中只有{"code": 0}
    data:{
    params:{
    ...data
    }
    }
    }).then((res)=>{
    if(res.code === 0){
    this.setState({
    isRoleVisible:false //关闭弹框
    })
    this.requestList(); //刷新列表数据
    }
    })
    }

      

二、设置权限

  • 设置权限表单组件 :AntD Tree树形结构组件的使用
  1. TreeNode树形节点:const TreeNode = Tree.TreeNode;
  2. 加载完整的权限列表:本地定义menuConfig.js权限列表文件,通过递归方法渲染TreeNode
    import menuConfig from '../../config/menuConfig'
    
    renderTreeNodes = (data,key='') => {
    return data.map((item) => {
    let parentKey = key+item.key;
    if (item.children) {
    return (
    <TreeNode title={item.title} key={parentKey} dataRef={item} className="op-role-tree">
    {this.renderTreeNodes(item.children,parentKey)}
    </TreeNode>
    );
    } else if (item.btnList) {
    return (
    <TreeNode title={item.title} key={parentKey} dataRef={item} className="op-role-tree">
    { this.renderBtnTreedNode(item,parentKey) }
    </TreeNode>
    );
    }
    return <TreeNode {...item} />;
    });
    }; renderBtnTreedNode = (menu,parentKey='')=> {
    const btnTreeNode = []
    menu.btnList.forEach((item)=> {
    // console.log(parentKey+'-btn-'+item.key);
    btnTreeNode.push(<TreeNode title={item.title} key={parentKey+'-btn-'+item.key} className="op-role-tree"/>);
    })
    return btnTreeNode;
    } <Tree
    checkable
    defaultExpandAll
    >
    <TreeNode title="平台权限" key="platform_all">
    {this.renderTreeNodes(menuConfig)}
    </TreeNode>
    </Tree>      
  • Modal弹框中应用表单组件:
  • 点击【设置权限】按钮弹出弹框:判断若没有this.state.selectedItem,提示需“选择”

    //权限设置
    handlePermission = ()=>{
    if (!this.state.selectedItem) {
    Modal.info({
    title: '信息',
    content: '请选择一个角色'
    })
    return;
    }
    this.setState({
    isPermVisible: true,
    detailInfo: this.state.selectedItem //角色详细信息
    });
    let menuList = this.state.selectedItem.menus; //角色权限
    this.setState({
    menuInfo:menuList
    })
    }  
  • 点击【OK】提交权限:给onOk事件绑定this.handlePermEditSubmit()

三、菜单调整

四、用户授权


注:项目来自慕课网

【共享单车】—— React后台管理系统开发手记:权限设置和菜单调整(未完)的更多相关文章

  1. 【共享单车】—— React后台管理系统开发手记:主页面架构设计

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  2. 【共享单车】—— React后台管理系统开发手记:Redux集成开发

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  3. 【共享单车】—— React后台管理系统开发手记:项目工程化开发

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  4. 【共享单车】—— React后台管理系统开发手记:城市管理和订单管理

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  5. 【共享单车】—— React后台管理系统开发手记:AntD Form基础组件

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  6. 【共享单车】—— React后台管理系统开发手记:Router 4.0路由实战演练

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  7. 【共享单车】—— React后台管理系统开发手记:员工管理之增删改查

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  8. 【共享单车】—— React后台管理系统开发手记:AntD Table高级表格

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  9. 【共享单车】—— React后台管理系统开发手记:AntD Table基础表格

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

随机推荐

  1. h5 Visibility API总结

    最近活动中的小游戏,有涉及页面隐藏或app后台运行时候,暂停游戏的功能,使用了h5的Visibility API,在此总结如下: 两个属性 document.hidden (Read only) 如果 ...

  2. 【CZY选讲·一道图论好题】

    题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,不仅有边权还有点权.LYK给出了一个子图的定义,一张图G'={V',E'}被称作G的子图,当且仅当: · ...

  3. 手动编写一个简单的loadrunner脚本

    loadrunner除了自动录制脚本外,还可以手动编写脚本,通过右键+inset step添加步骤,还可以手动添加事务,集合点等 下面是一个简单的Action脚本,服务是运行在本机的flask服务: ...

  4. error LNK2019: 无法解析的外部符号 _deflate

    我的环境为: Win764 + VS2005 + zlib1.2.8 zlib1.2.8我使用VS2010来编译. ------------------------------------------ ...

  5. appium+python自动化26-模拟手势点击坐标(tap)【转载】

    ​# 前言:有时候定位元素的时候,你使出了十八班武艺还是定位不到,怎么办呢?(面试经常会问)那就拿出绝招:点元素所在位置的坐标 tap用法 1.tap是模拟手指点击,一般页面上元素的语法有两个参数,第 ...

  6. python每日一类(4):slice

    class slice(stop)class slice(start, stop[, step]) Return a slice object representing the set of indi ...

  7. hdu 5063(思路题-反向操作数组)

    Operation the Sequence Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  8. 通过GitHub部署项目到Nginx服务器

    1.更新源: 2.安装nginx 3.安装成功 4.DNS域名解析 5.访问域名就会找到相应IP地址的主机,一个IP可对应多个域名 6.提交到gitHub 复制这两行 填上邮箱和密码 7.提交成功 8 ...

  9. 如何跳转到其他APP(android)

    有很多小伙伴会遇上这样的需求,从自己的app页面跳转到其他APP界面,一般情况下都是在自己的主包中跳转到公司其他APP,或者是合作方的APP,如果手机中没有这款APP会下载这款APP . 今天,博主就 ...

  10. [Usaco2010]Chocolate Eating

    题目描述 贝西从大牛那里收到了N块巧克力.她不想把它们马上吃完,而是打算制定一个计划, 使得在接下来的D天里,她能够尽量地快乐.贝西的快乐指数可以用一个整数来衡量,一开始的时候是0,当她每天晚上睡觉的 ...