Laravel 11 药房管理系统2--登录与退出

214 阅读1分钟

数据库新增一个字段is_role

image.png

因为没有注册页面,所以需要我们手动新建一个账号 以下是生成一个密码出来

// 登录
public function login(Request $request)
{
    $password = Hash::make('123456');
    dd($password);
    return view('auth.login');
}

浏览器登录页刷新,复制到数据库 user表的密码中

image.png

定义中间件

php artisan make:middleware AdminMiddleware

App/Http/Middleware/AdminMiddleware.php

public function handle(Request $request, Closure $next): Response
{
    if(Auth::check())
    {
        if($request->user()->is_role == 1)
        {
            return $next($request);
        }
        else
        {
            Auth::logout();
            return redirect()->route('/');
        }
    }
    else
    {
        Auth::logout();
        return redirect()->route('/');
    }

}

注册中间件

bootstrap/app.php

$middleware->alias([
    'admin' => \App\Http\Middleware\AdminMiddleware::class,
]);

使用模板,我们可以通过调用 alias() 添加新的中间件别名: 在添加中间件之前,你需要更多的隐含知识,而不是一个易于阅读的Kernel.php 文件。

路由

// 执行登录
Route::post('login_post', [AuthController::class, 'login_post'])->name('admin.login_post');

// 账号退出
Route::get('logout', [AuthController::class, 'logout'])->name('admin.logout');

Route::group(['middleware' => 'admin'], function () {
    // 后台首页
    Route::get('admin/dashboard', [DashboardController::class, 'dashboard'])->name('admin.dashboard');
});
<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;
use App\Mail\ForgotPasswordMail;

class AuthController extends Controller
{
    // 登录
    public function login(Request $request)
    {
        return view('auth.login');
    }

    // 执行登录
    public function login_post(Request $request)
    {
        if (Auth::attempt([
            'email' => $request->email,
            'password' => $request->password
        ])) {
            if ($request->user()->is_role == '1') {
                // 认证通过
                return redirect()->intended(route('admin.dashboard'));
            } else {
                // 认证失败
                return redirect()->back()->with('error', '电子邮件/密码不正确');
            }
        } else {
            return redirect()->back()->with('error', '电子邮件/密码不正确');
        }
    }
}

表单验证文件

resources/views/_message.blade.php

{{-- 表单成功验证 --}}
@if(!empty(session('success')))
    <div class="alert alert-success" role="alert">
        {{ Session('success') }}
    </div>
@endif

{{-- session函数来与用户会话中的错误信息 --}}
@if(!empty(session('error')))
    <div class="alert alert-danger" role="alert">
        {{ Session('error') }}
    </div>
@endif

前端模版

登录也路由 表单验证 字段

@extends('layouts.app')

@section('title', '登录')

@section('content')

    <div class="card mb-3">

        <div class="card-body">

            <div class="pt-4 pb-2">
                {{-- 表单验证文件 --}}
                @include('_message')

                <h5 class="card-title text-center pb-0 fs-4">登录您的帐户</h5>
                <p class="text-center small">输入您的用户名 & 密码登录</p>
            </div>

            <form method="post" action="{{ route('admin.login_post') }}" class="row g-3 needs-validation" novalidate>
                @csrf

                <div class="col-12">
                    <label for="yourUsername" class="form-label">电子邮箱</label>
                    <div class="input-group has-validation">
                        <span class="input-group-text" id="inputGroupPrepend">@</span>
                        <input type="email" name="email" class="form-control" required value="{{ old('email') }}">
                        <div class="invalid-feedback">请输入您的邮箱.</div>
                    </div>
                </div>

                <div class="col-12">
                    <label class="form-label">密码</label>
                    <input type="password" name="password" class="form-control" required>
                    <div class="invalid-feedback">请输入您的密码!</div>
                </div>

                <div class="col-12">
                    <div class="form-check">
                        <input class="form-check-input" type="checkbox" name="remember" value="true">
                        <label class="form-check-label" for="rememberMe">记住我</label>
                    </div>
                </div>
                <div class="col-12">
                    <button class="btn btn-primary w-100" type="submit">登录</button>
                </div>
                <div class="col-12">
                    <p class="small mb-0">忘记密码?
                        <a href="/forgot">忘记账户</a>
                    </p>
                </div>
            </form>

        </div>
    </div>
@endsection

resources/views/layouts/_header.blade.php 绑定账号退出按钮方法

<li>
    <a class="dropdown-item d-flex align-items-center" href="{{ route('admin.logout') }}">
        <i class="bi bi-box-arrow-right"></i>
        <span>注销</span>
    </a>
</li>