定义路由
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>