天天看点

laravel rabc 菜单权限控制设计思路(一)

rabc 权限控制

最简单设计方案 三张表 用户表 角色表 权限表

laravel rabc 菜单权限控制设计思路(一)

用户表的角色id 对应角色表中 id

角色表中的权限id 是字符串,根据逗号分隔,对应的权限表id

三个表,满足普通 的要求。

业务比较复杂时,推荐使用四个表 操作

laravel rabc 菜单权限控制设计思路(一)

多了一个 角色与权限的中间表 进行管理和操作

1.数据表

user 用户表

$table->bigIncrements('id');
            $table->unsignedBigInteger('role_id')->default(0)->comment('角色id');
            $table->string('username',50)->comment("账号");
            $table->string('truename',255)->default('')->comment("真实姓名");
            $table->string('password',255)->comment("密码");
            //nullable 可以为空
            $table->string('email',50)->nullable()->comment('邮箱');
            $table->string('phone',15)->default('')->comment('手机号');
            $table->enum('sex',['先生','女士'])->default('先生')->comment('性别');
           

role 角色表

$table->bigIncrements('id');
            $table->string('name',50)->comment('角色名称');
           

权限表

$table->string('name',50)->comment('名称');
            // nullable 可以为空
            $table->string('route_name',100)->nullable()->default('')->comment('路由别名/权限认证');
            $table->unsignedBigInteger('pid')->default(0)->comment('上级菜单');
            $table->enum('is_menu',['0','1'])->default('0')->comment('是否是菜单0否1是');
            $table->timestamps();
           

权限和角色关联表

//角色id
            $table->unsignedBigInteger('role_id')->default(0)->comment('角色id');
            //权限id
            $table->unsignedBigInteger('node_id')->default(0)->comment('权限id');

           

主要记录下 模型操作

1.角色和权限 关联

laravel rabc 菜单权限控制设计思路(一)

读取 已经设置的权限id 和 所有的权限 节点数据,

/**
     *角色 权限控制
     */
    public function node(Role $role)
    {
        //获取当前 已经设置的权限id'
        $nodes   = $role->nodes()->pluck('id')->toArray();
        //获取所有的权限
        $nodeall = (new Node())->getAllLevel();
        return view('admin.role.node',compact('role','nodes','nodeall'));
    }

           

nodes() 是多对多模型 操作

在role表 进行操作具体模型方法如下

因为是多对多 使用belongstomany

//角色和权限关联模型
    public function nodes(){
        //多对多
        // 1. 关联的模型
        // 2. 关联表中间表
        // 3.本模型对应的外键id
        // 4.关联模型对应的外键id
        return  $this->belongsToMany(
            Node::class,
            'role_node',
            'role_id',
            'node_id'
        );
    }
           

获取所有的权限 节点 ,这个地方需要递归,查询对应的子权限,组装对应的数据

//获取权限节点 层级关系
    public  function getAllLevel(){
    	//获取所有的 权限  self::all()->toArray()
        return $this->treelevel(self::all()->toArray());
    }
	 //递归 查询权限节点 层级关系
    public function treelevel($data,$pid=0,$html="--",$level=0){
        static $arr =[];
        foreach ($data as $value){
        	//当前循环的pid 和 传入的pid相同时 进行操作 默认为0 就是一级权限列表 
            if($value['pid'] == $pid){
                // 等级 
                $value['level'] = $level+1; 
		 	    //重复一个字符多少次 设置名称
                $value['name']  = str_repeat($html,$level*2).$value['name'];
                $arr[]=$value;
                //查找 对应子权限 
                $this->treelevel($data,$value['id'],$html,$value['level']);
            }
        }
        return $arr;
    }
           

最终效果

laravel rabc 菜单权限控制设计思路(一)

处理操作

/**
     *角色 权限操作
     */
    public function nodesave(Request $request, Role $role)
    {
        if($request->wantsJson()){
            //  sync 可以将之前是删除,然后在更新  模型操作 很方便   
            $re = $role->nodes()->sync($request->get('node'));
            if($re){
                return  $this->reSuJson('成功');
            }
            return  $this->reErJson('失败');;
        }
        return view('admin.role.index');
    }

           

`用户 和角色 操作

一对一 一个用户对应一个角色

//角色分配
    public function  role(Request $request,int $id){
        //当前用户角色
        $user = User::find($id);
        //判断是否是 修改操作
        if($request->isMethod('post')){
            $post = $this->validate($request,[
                'role_id'=>"required"
            ]);
            //修改 角色id 
            $re = $user->update($post);
            if($re){
                return  $this->reSuJson('成功');
            }
            return $this->reErJson('失败');
        }
        //获取所有的校色
        $roleAll = Role::all();
        return  view('admin.user.role',compact('user','roleAll'));
    }

           

最终效果

laravel rabc 菜单权限控制设计思路(一)

角色 权限 用户表 三个表权限 关联操作完成。

菜单 权限操作 后面更新