【共享单车】—— React后台管理系统开发手记:权限设置和菜单调整(未完)
前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录。最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star。
一、创建角色

- 权限菜单设计:RBAC权限模型(详解链接)
- RBAC,即基于角色的访问控制(Role-Based Access Control),是优秀的权限控制模型
- 主要通过角色和权限建立管理,再赋予用户不同的角色,来实现权限控制的目标
  
- 角色列表展示:对应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
 }
- 调用封装好的axios.requestList()获取角色数据 - componentWillMount(){
 this.requestList();
 } requestList = ()=>{
 axios.requestList(this, '/role/list', {})
 }
- 使用封装好的ETable组件实现角色列表的展示 - <div className="content-wrap"> 
 <ETable
 updateSelectedItem={Utils.updateSelectedItem.bind(this)}
 selectedRowKeys={this.state.selectedRowKeys}
 dataSource={this.state.list}
 columns={columns}
 />
 </div>
- 创建角色:Modal弹框中嵌入表单子组件 
- 表单组件: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);
- 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>
- 点击【创建角色】按钮弹出弹框:给onClick事件绑定this.handleRole(),设置this.state.isRoleVisible为true 
- 点击【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树形结构组件的使用
- TreeNode树形节点:const TreeNode = Tree.TreeNode;
- 加载完整的权限列表:本地定义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后台管理系统开发手记:权限设置和菜单调整(未完)的更多相关文章
- 【共享单车】—— React后台管理系统开发手记:主页面架构设计
		前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ... 
- 【共享单车】—— React后台管理系统开发手记:Redux集成开发
		前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ... 
- 【共享单车】—— React后台管理系统开发手记:项目工程化开发
		前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ... 
- 【共享单车】—— React后台管理系统开发手记:城市管理和订单管理
		前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ... 
- 【共享单车】—— React后台管理系统开发手记:AntD Form基础组件
		前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ... 
- 【共享单车】—— React后台管理系统开发手记:Router 4.0路由实战演练
		前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ... 
- 【共享单车】—— React后台管理系统开发手记:员工管理之增删改查
		前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ... 
- 【共享单车】—— React后台管理系统开发手记:AntD Table高级表格
		前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ... 
- 【共享单车】—— React后台管理系统开发手记:AntD  Table基础表格
		前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ... 
随机推荐
- 【CF Round 439 C. The Intriguing Obsession】
			time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ... 
- php中json_encode和json_decode的用法
			1.json_encode基本用法:数组转字符串 <?php $arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); ... 
- springMvc <form:form>标签  <form:input>标签需要注意的问题
			在用springMVC <form:form>表单时,喜欢报的错误如下所示: 错误的Controller层的代码如下: @RequestMapping(value = "test ... 
- RDM原始设备映射
			在一个存储区域网络(SAN)上,有两种方法为虚拟机配置存储.一种方法是使用VMFS,这是VMware Infrastructure(VI)提供的专有高性能集群文件系统.对大多数企业应用来说,在VMFS ... 
- 阿里云服务器ubuntu安装java运行环境
			服务器 阿里云服务器ubuntu安装java运行环境 转:http://www.codingyun.com/article/45.html 今天来给大家介绍一下在阿里云ubuntu服务器下安装java ... 
- Topcoder SRM 605 div1 题解
			日常打卡- Easy(250pts): 题目大意:你有n种汉堡包(统统吃掉-),每一种汉堡包有一个type值和一个taste值,你现在要吃掉若干个汉堡包,使得它们taste的总和*(不同的type值的 ... 
- Gradle for Android(二)全局设置、自定义BuildConfig
			全局设置 如果有很多项目,可以设置全局来统一管理版本号或依赖库,根目录下build.gradle下: ext { compileSdkVersion = 23 buildToolsVersion = ... 
- cms .net webform去服务器控件标签化 pagebase新版本
			这是最近在干一个webform的cms的时候用起来的,原来虽然做过很多技术,什么remoting,wcf,webservice,可是弄来弄去,最后也没个收藏的地儿,全都放在笔记本儿上了,可是人又懒地可 ... 
- 安全提示“X-Frame-Options头未设置”的解决方法
			漏洞检测提示“X-Frame-Options头未设置”,意思是网页可能被别人用iframe框架使用.事实上,我的网页已经通过js程序禁止被iframe框架嵌入使用了.不过,对于使用iis的网站来说,可 ... 
- Ubuntu配置网络遇到的一些问题
			Ubuntu配置网络遇到的一些问题 在配置Ubuntu网络时,曾遇到了一些问题.查找了一些博客,所幸都解决了.记录一下,以便日后查阅. 设置DNS sudo vim /etc/resolv.conf ... 
