Laravel 11 角色和权限3--角色列表和新增角色

73 阅读1分钟

定义路由

Route::middleware('auth')->group(function () {
    .
    .
    .
    // 角色页面
    Route::get('/roles', [RoleController::class, 'index'])->name('roles.index');
    // 新增角色页面
    Route::get('/roles/create', [RoleController::class, 'create'])->name('roles.create');
    // 执行新增角色
    Route::post('/roles', [RoleController::class, 'store'])->name('roles.store');
});

创建角色控制器

php artisan make:controller RoleController

App/Http/Controllers/RoleController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;

class RoleController extends Controller
{
    // 角色列表
    public function index()
    {
        $roles = Role::orderBy('name','ASC')->paginate(25);
        return view('roles.list',compact('roles'));
    }

    // 新建角色页
    public function create()
    {
        $permissions = Permission::orderBy('name', 'ASC')->get();

        return view('roles.create', compact('permissions'));
    }

    // 执行新建角色
    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'name' => 'required|unique:roles|max:20',
        ]);

        if ($validator->passes()) {
            $role = Role::create(['name' => $request->name]);
            if (!empty($request->permission)) {
                foreach ($request->permission as $name){
                    $role->givePermissionTo($name); // 角色分配权限
                }
            }
            return redirect()->route('roles.index')->with('success', '角色添加成功~~');
        } else {
            return redirect()->route('roles.create')->withErrors($validator)->withInput();
        }
    }

前端模版

  • 角色列表页-resources/views/Roles/list.blade.php
<x-app-layout>
    <x-slot name="header">
        <div class="flex justify-between">
            <h2 class="font-semibold text-xl text-gray-800 leading-tight">
                {{ __('角色列表') }}
            </h2>
            <a href="{{ route('roles.create') }}"
               class="bg-slate-700 text-sm rounded-md text-white px-3 py-2">新增</a>
        </div>
    </x-slot>

    <div class="py-12">
        <div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
            {{-- 表单成功验证 --}}
            <x-message></x-message>

            <table class="w-full">
                <thead class="bg-gray-50">
                <tr class="border-b">
                    <th class="px-6 py-3 text-left" width="60">#</th>
                    <th class="px-6 py-3 text-left">角色名</th>
                    <th class="px-6 py-3 text-left">权限</th>
                    <th class="px-6 py-3 text-left" width="180">创建时间</th>
                    <th class="px-6 py-3 text-center" width="180">操作</th>
                </tr>
                </thead>
                <tbody class="bg-white">

                @if($roles->isNotEmpty())
                    @foreach($roles as $role)
                        <tr class="border-b">
                            <td class="px-6 py-3 text-left">{{$role->id}}</td>
                            <td class="px-6 py-3 text-left">{{$role->name}}</td>
                            <td class="px-6 py-3 text-left">{{$role->permissions->pluck('name')->implode(',')}}</td>
                            <td class="px-6 py-3 text-left">{{$role->created_at}}</td>
                            <td class="px-6 py-3 text-center">
                                <a href="{{ route('permissions.edit',$role->id) }}"
                                   class="bg-slate-700 text-sm rounded-md text-white px-3 py-2 hover:bg-slate-600">编辑</a>
                                <a href="javascript:void(0);" onclick="deletePermission( {{$role->id}} )"
                                   class="bg-red-600 text-sm rounded-md text-white px-3 py-2 hover:bg-red-500">删除</a>
                            </td>
                        </tr>
                    @endforeach
                @endif

                </tbody>
            </table>

            <div class="my-3">
                {{--分页--}}
                {{$roles->links()}}
            </div>
        </div>
    </div>

    <x-slot name="script">
        <script type="text/javascript">
            function deletePermission(id) {
                if (confirm("您确定要删除么~~")) {
                    $.ajax({
                        url: '{{route('permissions.destroy')}}',
                        type: 'delete',
                        data: {id: id},
                        dataType: 'json',
                        headers: {
                            'x-csrf-token': '{{ csrf_token() }}'
                        },
                        success: function (response) {
                            window.location.href = '{{ route('permissions.index') }}';
                        }
                    });
                }
            }
        </script>
    </x-slot>
</x-app-layout>
  • 新建角色页-resources/views/Roles/create.blade.php
<x-app-layout>
    <x-slot name="header">
        <div class="flex justify-between">
            <h2 class="font-semibold text-xl text-gray-800 leading-tight">
                角色 / 新增
            </h2>
            <a href="{{ route('roles.index') }}"
               class="bg-slate-700 text-sm rounded-md text-white px-5 py-3">角色列表</a>
        </div>
    </x-slot>

    <div class="py-12">
        <div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
            <div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">
                <div class="p-6 text-gray-900">

                    <form action="{{ route('roles.store') }}" method="post">
                        @csrf

                        <div>
                            <label for="" class="text-sm font-medium">角色名</label>
                            <div class="my-3">
                                <input value="{{old('name')}}" name="name" placeholder="角色名" type="text"
                                       class="border-gray-300 shadow-sm w-1/2 rounded-lg">

                                @error('name')
                                <p class="text-red-400 font-medium">{{ $message }}</p>
                                @enderror

                            </div>
                            <label for="" class="text-sm font-medium">权限</label>
                            <div class="grid grid-cols-4 mb-3">
                                @if($permissions->isNotEmpty())
                                    @foreach($permissions as $permission)
                                        <div class="mt-3">
                                            <input type="checkbox" id="permission-{{ $permission->id }}" class="rounded" name="permission[]"
                                                   value="{{$permission->name}}">
                                            <label for="">{{$permission->name}}</label>
                                        </div>
                                    @endforeach
                                @endif
                            </div>

                            <button class="bg-slate-700 text-sm rounded-md text-white px-5 py-3">提交</button>
                        </div>
                    </form>

                </div>
            </div>
        </div>
    </div>
</x-app-layout>

导航栏

resources/views/layouts/navigation.blade.php

  • 添加一个角色导航跳转
<div class="hidden space-x-8 sm:-my-px sm:ms-10 sm:flex">
    <x-nav-link :href="route('permissions.index')" :active="request()->routeIs('permissions')">
        {{ __('角色') }}
    </x-nav-link>
</div>

image.png