laravel rbac笔记片段

三表:用户表、角色表、权限表

角色表:role

 

权限表:auth

 

1、创建需要迁移文件

php artisan make:migration create_role_table
php artisan make:migration create_auth_table

2、迁移代码

2020_04_05_003842_create_role_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateRoleTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('role', function (Blueprint $table) {
            $table->increments('id');
            $table->string('role_name',20)->notNull();
            $table->text('auth_ids');
            $table->text('auth_ac');

        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('role');
    }
}
2020_04_05_003854_create_auth_table.php

②执行迁移文件生成数据表

php artisan migrate

3 确定需要的路由

添加页面:/admin/auth/add                            any类型

列表页面:/admin/auth/index                         get类型

 

4 创建需要的控制器文件

 

php artisan make:controller Admin/AuthController

 

 5 创建2个方法,Auth控制器下的index方法、add方法,展示各自的视图即可

 

6 权限的添加

先添加auth模型

 

php artisan make:model Admin/Auth

 

定义模型

protected $table="auth";
public $timestamps=false;

 控制器中引入模型

use App\Admin\Auth;

7、视图代码

<!DOCTYPE html>
<html class="x-admin-sm">
<head>
    <meta charset="UTF-8">
    <title>添加权限</title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport"
          content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi"/>
    <link rel="stylesheet" href="/static/css/font.css">
    <link rel="stylesheet" href="/static/css/style.css">
    <script src="/static/lib/layui/layui.js" charset="utf-8"></script>
    <script type="text/javascript" src="/static/js/xadmin.js"></script>
    <script type="text/javascript" src="/static/js/jquery.min.js"></script>
    <!--[if lt IE 9]>
    <script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
    <script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->
</head>
<body>
<div class="x-nav">
          <span class="layui-breadcrumb">
            <a href="">首页</a>
            <a href="">演示</a>
            <a>
              <cite>导航元素</cite></a>
          </span>
    <a class="layui-btn layui-btn-small" style="line-height:1.6em;margin-top:3px;float:right"
       onclick="location.reload()" title="刷新">
        <i class="layui-icon layui-icon-refresh" style="line-height:30px"></i></a>
</div>
<div class="layui-fluid">
    <div class="layui-row layui-col-space15">
        <div class="layui-col-md12">
            <div class="layui-card">
                <div class="layui-card-body ">
                    <form method="post" id="auth_from" class="layui-form layui-col-space5"
                          action="{{route('auth_add')}}">

                        <div class="layui-inline layui-show-xs-block">
                            <input class="layui-input" placeholder="权限名(必填)" id="auth_name" name="auth_name">
                        </div>
                        <div class="layui-inline layui-show-xs-block">
                            <input id="controller" class="layui-input" placeholder="控制器名" name="controller">
                        </div>
                        <div class="layui-inline layui-show-xs-block">
                            <input class="layui-input" placeholder="方法名" name="action" id="action">
                        </div>
                        <div class="layui-inline layui-show-xs-block">

                            <select name="pid" id="select" lay-filter="select">
                                <option value="0">作为顶级权限</option>@foreach($data as $val)
                                    <option value="{{$val->id}}">{{$val->auth_name}}</option>
                                @endforeach
                            </select>
                        </div>
                        <div class="layui-inline layui-show-xs-block">
                            <input type="checkbox" name="is_nav" lay-skin="primary" title="作为导航" value="1" checked="">
                        </div>
                        <div class="layui-inline layui-show-xs-block">
                            <button class="layui-btn" lay-submit="" lay-filter="auth_add"><i class="layui-icon"></i>增加
                            </button>
                        </div>{{csrf_field()}}
                    </form>
                </div>
                <div class="layui-card-header">
                    <button class="layui-btn layui-btn-danger" onclick="delAll()"><i class="layui-icon"></i>批量删除
                    </button>
                </div>
                <div class="layui-card-body ">
                    <table class="layui-table layui-form">
                        <thead>
                        <tr>
                            <th>
                                <input type="checkbox" name="" lay-skin="primary">
                            </th>
                            <th>ID</th>
                            <th>权限名称</th>
                            <th>控制器名称</th>
                            <th>方法名称</th>
                            <th>父级权限</th>
                            <th>作为导航</th>
                            <th>操作</th>
                        </thead>
                        <tbody>
                        @foreach($result as $val)
                        <tr>
                            <td>
                                <input type="checkbox" name="" lay-skin="primary">
                            </td>
                            <td>{{$val->id}}</td>
                            <td>@if ($val->auth_name){{$val->auth_name}} @else N/A @endif</td>
                            <td>@if ($val->controller){{$val->controller}}@else N/A @endif</td>
                            <td>@if($val->action){{$val->action}}@else N/A @endif</td>
                            <td>@if($val->parent_name){{$val->parent_name}}@else N/A @endif</td>
                            <td>@if($val->is_nav=='1')是 @else 否 @endif</td>
                            <td class="td-manage">
                                <a title="编辑" onclick="xadmin.open('编辑','xxx.html')" href="javascript:">
                                    <i class="layui-icon">&#xe642;</i>
                                </a>
                                <a title="删除" onclick="member_del(this,'要删除的id')" href="javascript:">
                                    <i class="layui-icon">&#xe640;</i>
                                </a>
                            </td>
                        </tr>@endforeach
                        </tbody>
                    </table>
                </div>
                <div class="layui-card-body ">
                    <div class="page">
                        <div>
                            <a class="prev" href="">&lt;&lt;</a>
                            <a class="num" href="">1</a>
                            <span class="current">2</span>
                            <a class="num" href="">3</a>
                            <a class="num" href="">489</a>
                            <a class="next" href="">&gt;&gt;</a>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<script language="JavaScript">
    layui.use(['laydate', 'form'], function () {
        var laydate = layui.laydate;
        var form = layui.form;
        $("#controller,#action").hide();
        form.on('select(select)', function (data) {
            var _val =$("#select").val();
           if (_val >0){
               $("#controller,#action").show();
           }else{
               $("#controller,#action").val('');
               $("#controller,#action").hide();
           }
        });
        form.on('submit(auth_add)', function (data) {
            data = data.field;
            if (data.auth_name.length < 3) {
                layer.tips('权限名必须大于2个汉字', '#auth_name', {
                    tips: [3, '#009688']
                });
                return false;
            }
            $.ajax({
                url: '{{route('auth_add')}}',
                data: data,
                dataType: 'text',
                type: 'post',
                success: function (data) {
                    if (data == 1) {
                        layer.alert('添加成功', {
                            icon: 1,
                            skin: 'layui-layer-molv' //样式类名
                            , closeBtn: 0
                        },function(){
                            window.location.reload();
                           // document.getElementById("auth_from").reset();
                            $("#auth_from")[0].reset();
                        });
                    } else {
                        layer.alert('添加失败', {
                            icon: 2,
                            skin: 'layui-layer-molv' //样式类名
                            , closeBtn: 0
                        });
                    }
                }
            });
            return false;
        });
        //执行一个laydate实例
        laydate.render({
            elem: '#start' //指定元素
        });

        //执行一个laydate实例
        laydate.render({
            elem: '#end' //指定元素
        });
    });

    /*用户-停用*/
    function member_stop(obj, id) {
        layer.confirm('确认要停用吗?', function (index) {

            if ($(obj).attr('title') == '启用') {

                //发异步把用户状态进行更改
                $(obj).attr('title', '停用');
                $(obj).find('i').html('&#xe62f;');

                $(obj).parents("tr").find(".td-status").find('span').addClass('layui-btn-disabled').html('已停用');
                layer.msg('已停用!', {icon: 5, time: 1000});

            } else {
                $(obj).attr('title', '启用');
                $(obj).find('i').html('&#xe601;');

                $(obj).parents("tr").find(".td-status").find('span').removeClass('layui-btn-disabled').html('已启用');
                layer.msg('已启用!', {icon: 5, time: 1000});
            }

        });
    }

    /*用户-删除*/
    function member_del(obj, id) {
        layer.confirm('确认要删除吗?', function (index) {
            //发异步删除数据
            $(obj).parents("tr").remove();
            layer.msg('已删除!', {icon: 1, time: 1000});
        });
    }


    function delAll(argument) {

        var data = tableCheck.getData();

        layer.confirm('确认要删除吗?' + data, function (index) {
            //捉到所有被选中的,发异步进行删除
            layer.msg('删除成功', {icon: 1});
            $(".layui-form-checked").not('.header').parents('tr').remove();
        });
    }
</script>
</body>


</html>
View Code

 

8、 控制器代码

<?php

    namespace App\Http\Controllers\Admin;

    use App\Http\Controllers\Controller;
    use Illuminate\Http\Request;
    use App\Admin\Auth;
    use DB;

    class AuthController extends Controller
    {
        public function index()
        {
            $data=Auth::where('pid','=','0')->get();
            $result=DB::table('auth as t1') ->select('t1.*','t2.auth_name as parent_name')->leftJoin('auth as t2','t1.pid','=','t2.id')->get();
            return view('admin.auth_index',compact('data','result'));

        }

        public function add(Request $request)
        {
            $this->validate($request, [
                'auth_name' => 'required|min:3',  //最小2
            ]);
            $data = $request->except('_token');
            $result = Auth::insert($data);
            return $result ? '1' : '0';
        }

    }

 上面auth控制器已经实现了权限的添加和查询

 

9 角色的增删改查

        Route::get('role/index', 'Admin\RoleController@index')->name('role_index');
        Route::any('role/add', 'Admin\RoleController@add')->name('role_add');
        Route::any('role/edit', 'Admin\RoleController@edit')->name('role_edit');
        Route::post('role/del', 'Admin\RoleController@del')->name('role_del');

10 控制器

<?php

    namespace App\Http\Controllers\Admin;
    use App\Admin\Role;
    use App\Http\Controllers\Controller;
    use Illuminate\Http\Request;
    use App\Admin\Auth;

    class RoleController extends Controller
    {
        public function index()
        {
            $data = Role::all();
            return view('admin.role_index', compact('data'));
        }

        public function add(Request $request)
        {
            if ($request->isMethod('post')) {
                $this->validate($request, [
                    'role_name' => 'required|min:2',  //最小2字符
                ]);
                $data = $request->except('_token');
                if ($request->get('auth_ids')) {
                    $role=new Role();
                    return $role->assignRole($data);
                } else {

                    return Role::insert($data);
                }
            } else {
                $top = Auth::where('pid', '0')->get();
                $cat = Auth::where('pid', '!=', '0')->get();
                return view('admin.role_add', compact('top', 'cat'));
            }
        }

        public function edit(Request $request){
            $data = $request->except('_token');
            if ($request->isMethod('post')){
                if ($request->get('auth_ids')){
                    $role=new Role();
                    return $role->assignRole($data);
                }else{
                    $post=[];
                    $post['auth_ids']='';
                    $post['auth_ac']='';
                    return Role::where('id',$data['id'])->update($post);
                }
            }else{
                $result=Role::where('id',$request->get('id'))->get();
                $top = Auth::where('pid', '0')->get();
                $cat = Auth::where('pid', '!=', '0')->get();
                return view('admin.role_edit', compact('top', 'cat','result'));
            }

        }
        public function del(Request $request){
            $this->validate($request,[
                'id' => 'required',
            ]);
            $data=$request->only('id');
            return Role::where('id',$data['id'])->delete();

        }

    }

11 视图文件

index

<!DOCTYPE html>
<html class="x-admin-sm">
    <head>
        <meta charset="UTF-8">
        <title>欢迎页面-X-admin2.2</title>
        <meta name="renderer" content="webkit">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <meta name="viewport" content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi" />
        <link rel="stylesheet" href="/static/css/font.css">
        <link rel="stylesheet" href="/static/css/style.css">
        <script src="/static/lib/layui/layui.js" charset="utf-8"></script>
        <script type="text/javascript" src="/static/js/xadmin.js"></script>
        <!--[if lt IE 9]>
          <script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
          <script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
        <![endif]-->
    </head>
    <body>
        <div class="x-nav">
          <span class="layui-breadcrumb">
            <a href="">首页</a>
            <a href="">演示</a>
            <a>
              <cite>导航元素</cite></a>
          </span>
          <a class="layui-btn layui-btn-small" style="line-height:1.6em;margin-top:3px;float:right" onclick="location.reload()" title="刷新">
            <i class="layui-icon layui-icon-refresh" style="line-height:30px"></i></a>
        </div>
        <div class="layui-fluid">
            <div class="layui-row layui-col-space15">
                <div class="layui-col-md12">
                    <div class="layui-card">
                        <div class="layui-card-body ">
                            <form class="layui-form layui-col-space5">
                                <div class="layui-inline layui-show-xs-block">
                                    <input class="layui-input"  autocomplete="off" placeholder="开始日" name="start" id="start">
                                </div>
                                <div class="layui-inline layui-show-xs-block">
                                    <input class="layui-input"  autocomplete="off" placeholder="截止日" name="end" id="end">
                                </div>
                                <div class="layui-inline layui-show-xs-block">
                                    <input type="text" name="username"  placeholder="请输入用户名" autocomplete="off" class="layui-input">
                                </div>
                                <div class="layui-inline layui-show-xs-block">
                                    <button class="layui-btn"  lay-submit="" lay-filter="sreach"><i class="layui-icon">&#xe615;</i></button>
                                </div>
                            </form>
                        </div>
                        <div class="layui-card-header">
                            <button class="layui-btn layui-btn-danger" onclick="delAll()"><i class="layui-icon"></i>批量删除</button>
                            <button class="layui-btn" onclick="xadmin.open('添加角色','{{route('role_add')}}',800,600)"><i class="layui-icon"></i>添加角色</button>
                        </div>
                        <div class="layui-card-body ">
                            <table class="layui-table layui-form">
                              <thead>
                                <tr>
                                  <th>
                                    选择
                                  </th>
                                  <th>ID</th>
                                  <th>角色名</th>
                                 {{-- <th>权限Id集合</th>
                                  <th>权限Ac集合</th>--}}
                                  <th>状态</th>
                                  <th>操作</th>
                              </thead>
                              <tbody>
                              @foreach($data as $val)
                                <tr>
                                  <td width="80">
                                    <input type="checkbox" name=""  lay-skin="primary">
                                  </td>
                                  <td width="80">{{$val->id}}</td>
                                  <td width="120">{{$val->role_name}}</td>
                                  {{-- <td>{{$val->auth_ids}}</td>
                                  <td>{{$val->auth_ac}}</td> --}}
                                  <td class="td-status"  width="80">
                                    <span class="layui-btn layui-btn-normal layui-btn-xs">已启用</span></td>
                                  <td class="td-manage">
                                    <a onclick="member_stop(this,'10001')" href="javascript:;"  title="启用" class="layui-btn layui-btn-xs layui-btn-primary">
                                      <i class="layui-icon"  >&#xe601;</i>启用
                                    </a>
                                    <a title="编辑权限"  onclick="xadmin.open('编辑','{{route('role_edit')}}?id={{$val->id}}','900','500')" href="javascript:;" class="layui-btn layui-btn-xs layui-btn-primary">
                                      <i class="layui-icon">&#xe642;</i>编辑
                                    </a>
                                    <a title="删除" onclick="role_del(this,'{{$val->id}}')" href="javascript:;" class="layui-btn layui-btn-xs layui-btn-primary">
                                      <i class="layui-icon">&#xe640;</i>删除
                                    </a>
                                  </td>
                                </tr>@endforeach
                              </tbody>
                            </table>
                        </div>
                        <div class="layui-card-body ">
                            <div class="page">
                                <div>
                                  <a class="prev" href="">&lt;&lt;</a>
                                  <a class="num" href="">1</a>
                                  <span class="current">2</span>
                                  <a class="num" href="">3</a>
                                  <a class="num" href="">489</a>
                                  <a class="next" href="">&gt;&gt;</a>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </body>
    <script>
      layui.use(['laydate','form'], function(){
        var laydate = layui.laydate;
        var form = layui.form;

        //执行一个laydate实例
        laydate.render({
          elem: '#start' //指定元素
        });
        laydate.render({
          elem: '#end' //指定元素
        });
      });

       /*用户-停用*/
      function member_stop(obj,id){
          layer.confirm('确认要停用吗?',function(index){

              if($(obj).attr('title')=='启用'){
                $(obj).attr('title','停用')
                $(obj).find('i').html('&#xe62f;');
                $(obj).parents("tr").find(".td-status").find('span').addClass('layui-btn-disabled').html('已停用');
                layer.msg('已停用!',{icon: 5,time:1000});
              }else{
                $(obj).attr('title','启用')
                $(obj).find('i').html('&#xe601;');
                $(obj).parents("tr").find(".td-status").find('span').removeClass('layui-btn-disabled').html('已启用');
                layer.msg('已启用!',{icon: 5,time:1000});
              }

          });
      }
      function role_del(obj,id){
          layer.confirm('确认要删除吗?',function(){
              $.ajax({
                  url: '{{route('role_del')}}',
                  data: {
                      "id": id,
                      "_token":'{{csrf_token()}}'
                  },
                  dataType: 'text',
                  type: 'post',
                  success: function (data) {
                      if (data == 1) {
                          layer.alert('删除成功', {
                              icon: 1,
                              skin: 'layui-layer-molv' //样式类名
                              , closeBtn: 0
                          },function(){
                              window.location.reload();
                          });
                      } else {
                          layer.alert('删除失败', {
                              icon: 2,
                              skin: 'layui-layer-molv' //样式类名
                              , closeBtn: 0
                          });
                      }
                  }
              });


          });
      }

    </script>

</html>
View Code

add

<!DOCTYPE html>
<html class="x-admin-sm">

  <head>
    <meta charset="UTF-8">
    <title>欢迎页面-X-admin2.2</title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi" />
    <link rel="stylesheet" href="/static/css/font.css">
    <link rel="stylesheet" href="/static/css/style.css">
    <script type="text/javascript" src="/static/lib/layui/layui.js" charset="utf-8"></script>
    <script type="text/javascript" src="/static/js/xadmin.js"></script>
    <!-- 让IE8/9支持媒体查询,从而兼容栅格 -->
    <!--[if lt IE 9]>
      <script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
      <script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->
  </head>

  <body>
    <div class="layui-fluid">
        <div class="layui-row">
            <form action="" method="post" class="layui-form layui-form-pane">
                <div class="layui-form-item">
                    <label for="name" class="layui-form-label">
                        <span class="x-red">*</span>角色名
                    </label>
                    <div class="layui-input-inline">
                        <input type="text" id="role_name" name="role_name"   autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item layui-form-text">
                    <label class="layui-form-label">
                        拥有权限
                    </label>
                    <table  class="layui-table layui-input-block">
                        <tbody>
                        @foreach($top as $val)
                            <tr>
                                <td>
                                    <input type="checkbox" name="auth_ids[]" lay-skin="primary" lay-filter="father" title="{{$val->auth_name}}" value="{{$val->id}}">
                                </td>
                                <td>
                                    <div class="layui-input-block">
                                        @foreach($cat as $val_cat)
                                            @if($val_cat->pid == $val->id)
                                        <input name="auth_ids[]" lay-skin="primary" type="checkbox" title="{{$val_cat->auth_name}}" value="{{$val_cat->id}}">
                                            @endif
                                            @endforeach
                                    </div>
                                </td>
                            </tr>
                            @endforeach
                        </tbody>
                    </table>
                </div>
                <div class="layui-form-item">
                <button class="layui-btn" lay-submit="" lay-filter="add">增加</button>
              </div>
                {{csrf_field()}}
            </form>
        </div>
    </div>
    <script>
        layui.use(['form','layer'], function(){
            $ = layui.jquery;
          var form = layui.form
          ,layer = layui.layer;
          form.on('submit(add)', function(data){
              data = data.field;
              if (data.role_name.length < 2) {
                  layer.tips('权限名必须大于1个汉字', '#role_name', {
                      tips: [2, '#009688']
                  });
                  return false;
              }
              $.ajax({
                  url: '{{route('role_add')}}',
                  data: data,
                  dataType: 'text',
                  type: 'post',
                  success: function (data) {
                      if (data == 1) {
                          layer.alert('添加成功', {
                              icon: 1,
                              skin: 'layui-layer-molv' //样式类名
                              , closeBtn: 0
                          },function(){
                              //window.location.reload();
                              // document.getElementById("auth_from").reset();
                              //$("#auth_from")[0].reset();
                              var index = parent.layer.getFrameIndex(window.name);
                              //关闭当前frame
                              parent.layer.close(index);
                              parent.location.reload(); //刷新父级页面
                          });
                      } else {
                          layer.alert('添加失败', {
                              icon: 2,
                              skin: 'layui-layer-molv' //样式类名
                              , closeBtn: 0
                          });
                      }
                  }
              });
            return false;
          });


        form.on('checkbox(father)', function(data){

            if(data.elem.checked){
                $(data.elem).parent().siblings('td').find('input').prop("checked", true);
                form.render();
            }else{
               $(data.elem).parent().siblings('td').find('input').prop("checked", false);
                form.render();
            }
        });


        });
    </script>
  </body>

</html>
View Code

edit

<!DOCTYPE html>
<html class="x-admin-sm">

<head>
    <meta charset="UTF-8">
    <title>欢迎页面-X-admin2.2</title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi" />
    <link rel="stylesheet" href="/static/css/font.css">
    <link rel="stylesheet" href="/static/css/style.css">
    <script type="text/javascript" src="/static/lib/layui/layui.js" charset="utf-8"></script>
    <script type="text/javascript" src="/static/js/xadmin.js"></script>
    <!-- 让IE8/9支持媒体查询,从而兼容栅格 -->
    <!--[if lt IE 9]>
    <script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
    <script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->
</head>

<body>
<div class="layui-fluid">
    <div class="layui-row">
        <form action="" method="post" class="layui-form layui-form-pane">
            <div class="layui-form-item">
                <label for="name" class="layui-form-label">
                    <span class="x-red">*</span>角色名
                </label>
                <div class="layui-input-inline">
                    <input readonly="readonly" disabled type="text" id="role_name" name="role_name" autocomplete="off" class="layui-input" value="{{$result[0]->role_name}}">
                </div>
            </div>
            <div class="layui-form-item layui-form-text">
                <label class="layui-form-label">
                    拥有权限
                </label>
                <table  class="layui-table layui-input-block">
                    <tbody>
                    @foreach($top as $val)
                        <tr>
                            <td>
                                <input type="checkbox" name="auth_ids[]" lay-skin="primary" lay-filter="father" title="{{$val->auth_name}}" value="{{$val->id}}" @if(in_array($val->id,explode(',',$result[0]->auth_ids))) checked @endif>
                            </td>
                            <td>
                                <div class="layui-input-block">
                                    @foreach($cat as $val_cat)
                                        @if($val_cat->pid == $val->id)
                                            <input name="auth_ids[]" lay-skin="primary" type="checkbox" title="{{$val_cat->auth_name}}" value="{{$val_cat->id}}" @if(in_array($val_cat->id,explode(',',$result[0]->auth_ids))) checked @endif>
                                        @endif
                                    @endforeach
                                </div>
                            </td>
                        </tr>
                    @endforeach
                    </tbody>
                </table>
            </div>
{{csrf_field()}}
            <div class="layui-form-item">
                <button class="layui-btn" lay-submit="" lay-filter="edit">增加</button>
            </div>
        </form>
    </div>
</div>
<script>
    layui.use(['form','layer'], function(){
        $ = layui.jquery;
        var form = layui.form
            ,layer = layui.layer;
        form.on('submit(edit)', function(data){
            data = data.field;
            $.ajax({
                url: '',
                data: data,
                dataType: 'text',
                type: 'post',
                success: function (data) {
                    if (data == 1) {
                        layer.alert('修改成功', {
                            icon: 1,
                            skin: 'layui-layer-molv' //样式类名
                            , closeBtn: 0
                        },function(){
                            //window.location.reload();
                            // document.getElementById("auth_from").reset();
                            //$("#auth_from")[0].reset();
                            var index = parent.layer.getFrameIndex(window.name);
                            //关闭当前frame
                            parent.layer.close(index);
                            parent.location.reload(); //刷新父级页面
                        });
                    } else {
                        layer.alert('权限无改变,修改失败!', {
                            icon: 2,
                            skin: 'layui-layer-molv' //样式类名
                            , closeBtn: 0
                        });
                    }
                }
            });
            return false;
        });


        form.on('checkbox(father)', function(data){

            if(data.elem.checked){
                $(data.elem).parent().siblings('td').find('input').prop("checked", true);
                form.render();
            }else{
                $(data.elem).parent().siblings('td').find('input').prop("checked", false);
                form.render();
            }
        });


    });
</script>

</body>

</html>
View Code

 

12 role模型

<?php

    namespace App\Admin;

    use Illuminate\Database\Eloquent\Model;

    class Role extends Model
    {
        protected $table = "role";
        public $timestamps = false;

        public function assignRole($data)
        {
            //获取ac字段
            $tmp = \App\Admin\Auth::where('pid', '!=', '0')->whereIn('id', $data['auth_ids'])->get();
            $data['auth_ids'] = implode(',', $data['auth_ids']);
            $ac = '';
            foreach ($tmp as $key => $value) {
                $ac .= $value->controller . '@' . $value->action . ',';
            }
            $data['auth_ac'] = strtolower(rtrim($ac, ','));
            if(array_key_exists('id',$data)){
                $post['auth_ids']=$data['auth_ids'];
                $post['auth_ac']=$data['auth_ac'];
                return self::where('id',$data['id'])->update($post);
            }else{
                return self::insert($data);
            }

        }
    }

 13 中间件

创建 中间件

 php artisan make:middleware CheckRbac

14 注册中间件   app/Http/Kernel.php文件中

protected $routeMiddleware 数组中加入 
'checkrbac'        => \App\Http\Middleware\CheckRbac::class,

15 使用中间件  web.php中

Route::group(['prefix' => 'admin', 'middleware' => ['auth:admin','checkrbac']], function () {

 16 中间件代码

<?php

namespace App\Http\Middleware;

use Closure;
use Route;  //因为要获取当前路由 需要引入
use Auth;  //获取当前用户的信息   需要引入

class CheckRbac
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
if(Auth::guard('admin') -> user() -> role_id != '1'){  //获取当前用户角色的id
$route = Route::currentRouteAction();//获取当前路由 $ac = Auth::guard('admin') -> user() -> role -> auth_ac; //获取ac集合 $ac = strtolower($ac . ',indexcontroller@index,indexcontroller@welcome'); $routeArr = explode('\\', $route); //将当前路由分割为数组 因为\是转移符 所以用\\ if(strpos($ac,strtolower(end($routeArr))) === false){ exit("<h1>您没有访问权限!</h1>"); } } return $next($request); } }

 

posted @ 2020-04-05 01:01  _callback  阅读(224)  评论(0编辑  收藏  举报