laravel框架权限管理增删改查

创建角色表

先创建迁移

php artisan make:migration create_roles_table

编写迁移文件

Schema::create('roles', function (Blueprint $table) {
    
    
       $table->bigIncrements('id');
       $table->string('name','20')->comment('角色名称');
       $table->timestamps();
       // 软删除
       $table->softDeletes();
   });

创建节点表

php artisan make:migration create_nodes_table

编写节点迁移数据

        Schema::create('nodes', function (Blueprint $table) {
    
    
            $table->bigIncrements('id');

            $table->string('name',50)->comment('节点名称');
            $table->string('route_name',100)->nullable()->default('')->comment('路由别名,权限认证标识');
            $table->unsignedInteger('pid')->default(0)->comment('上级ID');
            $table->enum('is_menu',['0','1'])->default('0')->comment('是否为菜单0否,1是');

            $table->timestamps();
            $table->softDeletes();
        });

创建中间表,用来链接两个表的内容

php artisan make:migration create_role_node_table

编写迁移数据

        Schema::create('role_node', function (Blueprint $table) {
    
    
            // 角色ID
            $table->unsignedInteger('role_id')->default(0)->comment('角色ID');
            // 节点ID
            $table->unsignedInteger('node_id')->default(0)->comment('节点ID');
        });

之后执行迁移

php artisan migrate

创建模型层

角色模型

php artisan make:model Models/Role

需要继承管理模型

class Role extends Base
{
    
    
    // 角色与权限  多对多
    public function nodes() {
    
    
        // 参1 关联模型
        // 参2 中间表的表名,没有前缀
        // 参3 本模型对应的外键ID
        // 参4 关联模型对应的外键ID
        return $this->belongsToMany(Node::class,'role_node','role_id','node_id');
    }
}

编写节点模型

php artisan make:model Models/Node

编写setRouteNameAttribute方法

    // 修改器 route_name   RouteName  set字段名Attribute 字段名首字母大写,遇下划线后字母大写
    public function setRouteNameAttribute($value) {
    
    
        // 如果字段值为null,则设置为空字符串  修改和添加时生效  create 或 update
        $this->attributes['route_name'] = empty($value) ? '' : $value;
    }

编写菜单访问器方法

    public function getMenuAttribute() {
    
    
        return $this->is_menu == '1' ? '<span class="label label-success radius">是</span>' : '<span class="label label-danger radius">否</span>';
    }

获取全部数据

    // 获取全部的数据
    public function getAllList() {
    
    
        $data = self::get()->toArray();
        return $this->treeLevel($data);
    }

获得层级目录

    public function treeData($allow_node) {
    
    
        $query = Node::where('is_menu', '1');
        if (is_array($allow_node)) {
    
    
            $query->whereIn('id', array_keys($allow_node));
        }
        $menuData = $query->get()->toArray();

        return $this->subTree($menuData);
    }

编写控制器

创建角色控制器

php artisan make:controller Admin/RoleController

展示角色列表

    public function index(Request $request) {
    
    
        // 获取搜索框
        $name = $request->get('name', '');

        // 分页 搜索
        // 参数1, 变量值存在。则执行 参数2--->匿名函数
        $data = Role::when($name, function ($query) use ($name) {
    
    
            $query->where('name', 'like', "%{
      
      $name}%");
        })->paginate($this->pagesize);
        return view('admin.role.index', compact('data', 'name'));
    }

添加方法

    /**
     * 添加显示
     */
    public function create() {
    
    

        return view('admin.role.create');
    }

添加处理

    public function store(Request $request) {
    
    
        // 异常处理
        try {
    
    
            $this->validate($request, [
                'name' => 'required|unique:roles,name'
            ]);
        } catch (\Exception $e) {
    
    
            return ['status' => 1000, 'msg' => '验证不通过'];
        }
        // 接受 all 接受所有的数据
        Role::create($request->only('name'));

        return ['status' => 0, 'msg' => '添加角色成功'];
    }

修改显示

    public function edit(int $id) {
    
    
        $model = Role::find($id);
        return view('admin.role.edit', compact('model'));
    }

修改处理

public function update(Request $request, int $id) {
    
    
        // 异常处理
        try {
    
    
            $this->validate($request, [
                // unique:表名,唯一字段,[排除行的值,以那个字段来排除]
                // 排除id=3的哪行名为name的字段值
                'name' => 'required|unique:roles,name,' . $id . ',id'
            ]);
        } catch (\Exception $e) {
    
    
            return ['status' => 1000, 'msg' => '验证不通过'];
        }
        // 修改角色入库
        //Role::where('id', $id)->update($request->only(['name']));
        Role::where([['id', '=', $id]])->update($request->only(['name']));
        return ['status' => 0, 'msg' => '修改用户成功'];
    }

给角色分配权限

    // 给角色分配权限
    public function node(Role $role) {
    
    
        //dump($role->nodes->toArray());
        //dump($role->nodes()->pluck('name','id')->toArray());
        // 读取出所有的权限
        $nodeAll = (new Node())->getAllList();
        // 读取当前角色所拥有的权限
        $nodes = $role->nodes()->pluck('id')->toArray();

        return view('admin.role.node',compact('role','nodeAll','nodes'));
    }

分配处理

    // 分配处理
    public function nodeSave(Request $request,Role $role) {
    
    
        // 关联模型的数据同步
        $role->nodes()->sync($request->get('node'));
        return redirect(route('admin.role.node',$role));
    }

记得引入工具类,一定要继承BaseC

use App\Models\Node;
use App\Models\User;
use Illuminate\Http\Request;
use App\Models\Role;

创建节点控制器

php artisan make:controller Admin/NodeController --resource

节点列表展示

    public function index() {
    
    
        // 获取所有的节点 返回是数组
        $data =(new Node)->getAllList();
        return view('admin.node.index', compact('data'));
    }

添加方法

    public function create() {
    
    
        // 获取所有的顶部
        $data = Node::where('pid', 0)->get();
        return view('admin.node.create', compact('data'));
    }

添加处理

    public function store(Request $request) {
    
    
        // 表单验证
        // try() catch()
        // 入库
        /*$data = $request->except('_token');
        $data['route_name'] = empty()*/
        Node::create($request->except('_token'));
        return ['status' => 0, 'msg' => '添加权限成功'];
    }

编写路由文件

Route::group(['prefix' => 'admin', 'namespace' => 'Admin'], function () {
    
    

    // 登录显示   name 给路由起一个别名
    Route::get('login', 'LoginController@index')->name('admin.login');
    // 登录处理
    Route::post('login', 'LoginController@login')->name('admin.login');

    // 后台需要验证才能通过
    Route::group(['middleware' => ['ckadmin'], 'as' => 'admin.'], function () {
    
    

        // 后台首页显示
        Route::get('index', 'IndexController@index')->name('index');
        // 欢迎页面显示  绑定路由中间件
        #Route::get('welcome','IndexController@welcome')->name('welcome')->middleware(['ckadmin']);
        Route::get('welcome', 'IndexController@welcome')->name('welcome');
        // 退出
        Route::get('logout', 'IndexController@logout')->name('logout');


        // 用户管理----------------------
        // 用户列表
        Route::get('user/index', 'UserController@index')->name('user.index');

        // 添加用户显示
        Route::get('user/add', 'UserController@create')->name('user.create');
        // 添加用户处理
        Route::post('user/add', 'UserController@store')->name('user.store');

        // 删除用户
        Route::delete('user/del/{id}', 'UserController@del')->name('user.del');
        // 还原
        Route::get('user/restore/{id}', 'UserController@restore')->name('user.restore');
        // 全选删除
        Route::delete('user/delall', 'UserController@delall')->name('user.delall');

        // 修改用户 显示
        Route::get('user/edit/{id}', 'UserController@edit')->name('user.edit');
        // 修改用户处理
        Route::put('user/edit/{id}', 'UserController@update')->name('user.edit');

        // 给用户分配角色
        Route::match(['get', 'post'], 'user/role/{user}', 'UserController@role')->name('user.role');


        // 角色管理
        // 分配权限
        Route::get('role/node/{role}', 'RoleController@node')->name('role.node');
        Route::post('role/node/{role}', 'RoleController@nodeSave')->name('role.node');
        // 资源路由 /admin/role/xxx
        Route::resource('role', 'RoleController');

        // 节点管理
        Route::resource('node', 'NodeController');

        // 文章管理 admin/article/upfile
        Route::post('article/upfile','ArticleController@upfile')->name('article.upfile');
        // 资源路由
        Route::resource('article', 'ArticleController');

    });
});

编写视图层

角色视图index.blade.php

@extends('admin.common.main')


@section('cnt')
    <nav class="breadcrumb">
        <i class="Hui-iconfont">&#xe67f;</i> 首页
        <span class="c-gray en">&gt;</span> 用户中心
        <span class="c-gray en">&gt;</span> 权限列表
        <a class="btn btn-success radius r" style="line-height:1.6em;margin-top:3px" href="javascript:location.replace(location.href);" title="刷新"><i class="Hui-iconfont">&#xe68f;</i></a>
    </nav>
    {
    
    {
    
    -- 消息提示 --}}
    @include('admin.common.msg')

    <div class="page-container">
        <form method="get" class="text-c"> 输入想要搜索的角色名称:
            <input type="text" class="input-text" style="width:250px" placeholder="角色" value="{
    
    { $name }}" name="name" autocomplete="off">
            <button type="submit" class="btn btn-success radius"><i class="Hui-iconfont">&#xe665;</i> 搜角色</button>
        </form>
        <div class="cl pd-5 bg-1 bk-gray mt-20">
        <span class="l">
            <a href="{
    
    { route('admin.role.create') }}" class="btn btn-primary radius">
                <i class="Hui-iconfont">&#xe600;</i> 添加角色
            </a>
        </span>
        </div>
        <div class="mt-20">
            <table class="table table-border table-bordered table-hover table-bg table-sort">
                <thead>
                <tr class="text-c">
                    <th width="80">ID</th>
                    <th width="100">角色名称</th>
                    <th width="100">查看权限</th>
                    <th width="130">加入时间</th>
                    <th width="100">操作</th>
                </tr>
                </thead>
                <tbody>
                @foreach($data as $item)
                    <tr class="text-c">
                        <td>{
    
    {
    
     $item->id }}</td>
                        <td>{
    
    {
    
     $item->name }}</td>
                        <td>
                            <a class="label label-success radius" href="{
    
    { route('admin.role.node',$item) }}">权限</a>
                        </td>
                        <td>{
    
    {
    
     $item->created_at }}</td>
                        <td class="td-manage">
                            <a href="{
    
    { route('admin.role.edit',$item) }}" class="label label-secondary radius">修改</a>
                            <a href="{
    
    { route('admin.role.destroy',['id'=>$item->id]) }}" class="label label-warning radius">删除</a>
                        </td>
                    </tr>
                @endforeach
                </tbody>
            </table>
            {
    
    {
    
    -- 分页 支持搜索功能 --}}
            {
    
    {
    
     $data->appends(request()->except('page'))->links() }}
        </div>
    </div>
@endsection
@section('js')
    <!--请在下方写此页面业务相关的脚本-->
    <script type="text/javascript" src="/admin/lib/My97DatePicker/4.8/WdatePicker.js"></script>
    <script type="text/javascript" src="/admin/lib/datatables/1.10.0/jquery.dataTables.min.js"></script>
    <script type="text/javascript" src="/admin/lib/laypage/1.2/laypage.js"></script>
    <script>
      // 生成一个token crsf
      const _token = "{
    
    { csrf_token() }}";
      // 给删除按钮绑定事件
      $('.delbtn').click(function (evt) {
    
    
        // 得到请求的url地址
        let url = $(this).attr('href');
        // 发起一个delete请求
        $.ajax({
    
    
          url,
          data: {
    
    _token},
          type: 'DELETE',
          dataType: 'json'
        }).then(({
    
    status, msg}) => {
    
    
          if (status == 0) {
    
    
            // 提示插件
            layer.msg(msg, {
    
    time: 2000, icon: 1}, () => {
    
    
              // 删除当前行
              $(this).parents('tr').remove();
            });
          }
        });
        // jquery取消默认事件
        return false;
      });

      // 全选删除
      function deleteAll() {
    
    
        // 询问框
        layer.confirm('您是真的要删除选中的用户吗?', {
    
    
          btn: ['确认删除', '思考一下']
        }, () => {
    
    
          // 选中的用户
          let ids = $('input[name="id[]"]:checked');
          // 删除的ID
          let id = [];
          // 循环
          $.each(ids, (key, val) => {
    
    
            // dom对象 转为 jquery对象 $(dom对象)
            // id.push($(val).val());
            id.push(val.value);
          });
          if (id.length > 0) {
    
    
            // 发起ajax
            $.ajax({
    
    
              url: "{
    
    { route('admin.user.delall') }}",
              data: {
    
    id, _token},
              type: 'DELETE'
            }).then(ret => {
    
    
              if (ret.status == 0) {
    
    
                layer.msg(ret.msg, {
    
    time: 2000, icon: 1}, () => {
    
    
                  location.reload();
                })
              }
            })
          }
        });
      }
    </script>
@endsection

角色展示分配权限node.blade.php

@extends('admin.common.main')

@section('cnt')
    <nav class="breadcrumb">
        <i class="Hui-iconfont">&#xe67f;</i> 首页
        <span class="c-gray en">&gt;</span> 用户中心
        <span class="c-gray en">&gt;</span> 给角色分配权限
        <a class="btn btn-success radius r" style="line-height:1.6em;margin-top:3px" href="javascript:location.replace(location.href);" title="刷新"><i class="Hui-iconfont">&#xe68f;</i></a>
    </nav>
    <article class="page-container">
        <form action="{
    
    { route('admin.role.node',$role) }}" method="post" class="form form-horizontal" id="form-member-add">
            @csrf
            @foreach($nodeAll as $item)
            <div>
                <input type="checkbox" name="node[]" value="{
    
    { $item['id'] }}"
                @if(in_array($item['id'],$nodes)) checked @endif
                >
                {
    
    {
    
     $item['html'] }}{
    
    {
    
     $item['name'] }}
            </div>
            @endforeach


            <div class="row cl">
                <div class="col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-3">
                    <input class="btn btn-primary radius" type="submit" value="分配权限">
                </div>
            </div>
        </form>
    </article>
@endsection

@section('js')
@endsection

猜你喜欢

转载自blog.csdn.net/weixin_47716362/article/details/109278504