Laravel 11 角色和权限9--创建和删除用户

67 阅读1分钟
用户控制器

App/Http/Controllers/UserController.php

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Spatie\Permission\Models\Role;
use Illuminate\Routing\Controllers\HasMiddleware;
use Illuminate\Routing\Controllers\Middleware;

class UserController extends Controller implements HasMiddleware
{
    public static function middleware(): array
    {
        return [
            new Middleware('permission:view users', only: ['index']),
            new Middleware('permission:edit users', only: ['edit']),
            new Middleware('permission:create users', only: ['create']),
            new Middleware('permission:delete users', only: ['destroy']),
        ];
    }


    /**
     * 新增用户页面
     */
    public function create()
    {
        // 查出所有用户
        $roles = Role::orderBy('name', 'ASC')->get();
        return view('users.create',compact('roles'));
    }

    /**
     * 执行新增用户
     */
    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'name' => 'required|min:6',
            'email' => 'required|email|unique:users,email',
            'password' => 'required|min:6|same:confirm_password',
            'confirm_password' => 'required',
        ]);

        if ($validator->fails()) {
            return redirect()->route('users.create')->withErrors($validator)->withInput();
        }

        $user = new User();
        $user->name = $request->input('name');
        $user->email = $request->input('email');
        $user->password = Hash::make($request->password);
        $user->save();

        // 允许你同步用户与角色之间的关联数据
        $user->syncRoles($request->role);

        return redirect()->route('users.index')->with('success', '用户新增成功~');

    }

    
    /**
     * 删除用户
     */
    public function destroy(Request $request)
    {
        $user = User::find($request->id);

        if ($user == null) {
            session()->flash('error', '未找到用户~');
            return response()->json([
                'status' => false
            ]);
        }

        $user->delete();
        session()->flash('success', '用户删除成功~');
        return response()->json([
            'status' => true
        ]);
    }

}
前端模版

resources/views/users/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('users.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('users.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">
                            </div>

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

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

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

                            </div>

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

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

                            </div>

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

                                @error('confirm_password')
                                <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($roles->isNotEmpty())
                                    @foreach($roles as $role)
                                        <div class="mt-3">
                                            <input type="checkbox"
                                                id="role-{{ $role->id }}" class="rounded"
                                                name="role[]"
                                                value="{{$role->name}}">
                                            <label for="role-{{ $role->id }}">{{$role->name}}</label>
                                        </div>
                                    @endforeach
                                @endif
                            </div>

                            <button class="bg-slate-700 hover:bg-slate-600 text-sm rounded-md text-white px-5 py-3">
                                新增
                            </button>
                        </div>
                    </form>

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

效果图:

image.png

模版权限
用户新增、编辑、删除授权

resources/views//users/list.blade.php Laravel 的原生 @can 指令来检查用户是否具有特定权限:

...
...
@can('create users')
<a href="{{ route('users.create') }}"
   class="bg-slate-700 text-sm rounded-md text-white px-3 py-2">新增</a>
@endcan
...
...
...
@can('edit users')
    <a href="{{route('users.edit',$user->id)}}"
       class="bg-slate-700 text-sm rounded-md text-white px-3 py-2 hover:bg-slate-600">编辑</a>
@endcan

@can('delete users')
    <a href="javascript:void(0);" onclick="deleteUser( {{$user->id}} )"
       class="bg-red-600 text-sm rounded-md text-white px-3 py-2 hover:bg-red-500">删除</a>
@endcan
...
...

效果图:

image.png