Update Auth
This commit is contained in:
parent
d6253aaacf
commit
631c86d8e6
|
@ -2,8 +2,15 @@
|
||||||
|
|
||||||
namespace App\Http\Controllers;
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Models\User;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
|
use Illuminate\Support\Facades\Hash;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
use Illuminate\Support\Facades\Validator;
|
||||||
|
use Illuminate\Support\Facades\Password;
|
||||||
|
use Illuminate\Support\Facades\Cookie;
|
||||||
|
use Illuminate\Support\Facades\Session;
|
||||||
|
|
||||||
class AuthController extends Controller
|
class AuthController extends Controller
|
||||||
{
|
{
|
||||||
|
@ -13,19 +20,158 @@ public function showLoginForm()
|
||||||
}
|
}
|
||||||
|
|
||||||
public function login(Request $request)
|
public function login(Request $request)
|
||||||
{
|
{
|
||||||
$credentials = $request->only(['nomorinduk', 'password']);
|
$credentials = $request->only(['username', 'password']);
|
||||||
|
|
||||||
if (Auth::attempt($credentials)) {
|
if (Auth::attempt($credentials)) {
|
||||||
$user = Auth::user();
|
$user = Auth::user();
|
||||||
|
|
||||||
if ($user->role === 'wakil_kepala') {
|
if ($user->role === 'wakil_kepala') {
|
||||||
return redirect()->intended('/wakil_kepala/dashboard');
|
return redirect()->intended('/wakil_kepala/dashboard');
|
||||||
} elseif ($user->role === 'siswa') {
|
} elseif ($user->role === 'siswa') {
|
||||||
return redirect()->intended('/siswa/dashboard');
|
return redirect()->intended('/siswa/dashboard');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$validator = Validator::make($request->all(), [
|
||||||
|
'username' => 'required',
|
||||||
|
'password' => 'required',
|
||||||
|
], [
|
||||||
|
'required' => ':attribute harus diisi.',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$userCount = User::where('username', $request->username)->count();
|
||||||
|
|
||||||
|
if ($validator->fails() || $userCount == 0) {
|
||||||
|
// Tambahkan pesan error khusus jika username tidak terdaftar
|
||||||
|
$validator->errors()->add('username', 'Akun tidak terdaftar.');
|
||||||
|
|
||||||
|
return redirect('/login')
|
||||||
|
->withErrors($validator)
|
||||||
|
->withInput();
|
||||||
|
}
|
||||||
|
|
||||||
|
$remember = true; // Sesuaikan dengan kebutuhan Anda
|
||||||
|
|
||||||
|
if (Auth::attempt(['username' => $request->username, 'password' => $request->password], $remember)) {
|
||||||
|
$user = Auth::user();
|
||||||
|
$request->session()->put('user_id', $user->id);
|
||||||
|
|
||||||
|
// Membuat dan menyimpan token "remember me"
|
||||||
|
$token = $user->createToken("auth-token")->plainTextToken;
|
||||||
|
$user->update(['remember_token' => $token]);
|
||||||
|
|
||||||
|
return redirect('/dashboard')->with('success', 'Login berhasil!');
|
||||||
|
} else {
|
||||||
|
return redirect('/login')
|
||||||
|
->withErrors(['username' => 'Username atau password salah.'])
|
||||||
|
->withInput();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect('/login')->with('error', 'Login gagal. Periksa kembali NIS/NIP dan password Anda.');
|
public function showRegisterForm()
|
||||||
|
{
|
||||||
|
return view('auth.register');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function register(Request $request)
|
||||||
|
{
|
||||||
|
$validator = Validator::make($request->all(), [
|
||||||
|
'name' => ['required', 'min:3', 'max:225'],
|
||||||
|
'username' => ['required', 'min:3', 'max:10'],
|
||||||
|
'email' => 'required|email',
|
||||||
|
'password' => 'required|min:5|max:255',
|
||||||
|
], [
|
||||||
|
'required' => ':attribute harus diisi.',
|
||||||
|
'email' => ':attribute harus berupa email yang valid.',
|
||||||
|
'min' => 'panjang :attribute minimal :min karakter.',
|
||||||
|
]);
|
||||||
|
|
||||||
|
if ($validator->fails()) {
|
||||||
|
return redirect('/register')
|
||||||
|
->withErrors($validator)
|
||||||
|
->withInput();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (User::where('username', $request->username)->exists() || User::where('email', $request->email)->exists()) {
|
||||||
|
return redirect('/register')
|
||||||
|
->withErrors(['username' => 'Username atau email sudah digunakan.'])
|
||||||
|
->withInput();
|
||||||
|
}
|
||||||
|
|
||||||
|
$user = User::create([
|
||||||
|
'name' => $request->name,
|
||||||
|
'username' => $request->username,
|
||||||
|
'email' => $request->email,
|
||||||
|
'password' => bcrypt($request->password),
|
||||||
|
'role' => 'siswa',
|
||||||
|
]);
|
||||||
|
|
||||||
|
return redirect('/login')->with('success', 'Registrasi berhasil! Silakan login.');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function showResetForm(Request $request, $token = null)
|
||||||
|
{
|
||||||
|
return view('auth.reset-password')->with(
|
||||||
|
['email' => $request->email, 'token' => $token]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function showLinkRequestForm(Request $request)
|
||||||
|
{
|
||||||
|
return view('auth.forgot-password');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mengirim email tautan reset password
|
||||||
|
public function sendResetLinkEmail(Request $request)
|
||||||
|
{
|
||||||
|
$request->validate(['email' => 'required|email']);
|
||||||
|
|
||||||
|
$status = Password::sendResetLink(
|
||||||
|
$request->only('email')
|
||||||
|
);
|
||||||
|
|
||||||
|
return $status === Password::RESET_LINK_SENT
|
||||||
|
? back()->with(['status' => __($status)])
|
||||||
|
: back()->withErrors(['email' => __($status)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Menangani proses reset password
|
||||||
|
public function resetPassword(Request $request)
|
||||||
|
{
|
||||||
|
$request->validate([
|
||||||
|
'token' => 'required',
|
||||||
|
'email' => 'required|email',
|
||||||
|
'password' => 'required|confirmed|min:6',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$status = Password::reset(
|
||||||
|
$request->only('email', 'password', 'password_confirmation', 'token'),
|
||||||
|
function ($user, $password) {
|
||||||
|
$user->forceFill([
|
||||||
|
'password' => bcrypt($password),
|
||||||
|
'remember_token' => Str::random(60),
|
||||||
|
])->save();
|
||||||
|
// Hapus token "remember me" setelah reset password
|
||||||
|
$user->tokens()->delete();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
return $status == Password::PASSWORD_RESET
|
||||||
|
? redirect('/login')->with(['status' => __($status)])
|
||||||
|
: back()->withErrors(['email' => [__($status)]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function logout(Request $request)
|
||||||
|
{
|
||||||
|
$guard = 'web'; // Sesuaikan dengan guard yang digunakan
|
||||||
|
|
||||||
|
// Hapus seluruh cookie sesi
|
||||||
|
Session::flush();
|
||||||
|
|
||||||
|
// Logout pengguna
|
||||||
|
Auth::guard($guard)->logout();
|
||||||
|
|
||||||
|
return redirect('/login')->with('success', 'Terimakasih sudah logout! Silakan login kembali.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,8 @@ class User extends Authenticatable
|
||||||
*/
|
*/
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
'name',
|
'name',
|
||||||
'nomorinduk', // Ubah 'email' menjadi 'NIS'
|
'username',
|
||||||
|
'email',
|
||||||
'password',
|
'password',
|
||||||
'role',
|
'role',
|
||||||
];
|
];
|
||||||
|
|
|
@ -14,7 +14,9 @@ public function up(): void
|
||||||
Schema::create('users', function (Blueprint $table) {
|
Schema::create('users', function (Blueprint $table) {
|
||||||
$table->id();
|
$table->id();
|
||||||
$table->string('name');
|
$table->string('name');
|
||||||
$table->string('nomorinduk')->unique();
|
$table->string('username');
|
||||||
|
$table->string('email')->unique();
|
||||||
|
$table->timestamp('email_verified_at')->nullable();
|
||||||
$table->string('password');
|
$table->string('password');
|
||||||
$table->string('role');
|
$table->string('role');
|
||||||
$table->rememberToken();
|
$table->rememberToken();
|
||||||
|
|
|
@ -381,8 +381,8 @@ .highcharts-root{
|
||||||
.bootstrap-select .dropdown-toggle{
|
.bootstrap-select .dropdown-toggle{
|
||||||
height: 45px;
|
height: 45px;
|
||||||
padding-right: 30px;
|
padding-right: 30px;
|
||||||
font-size: 14px;
|
font-size: 12px;
|
||||||
font-weight: 400;
|
font-weight: 200;
|
||||||
}
|
}
|
||||||
.bootstrap-select.form-control-sm .dropdown-toggle{
|
.bootstrap-select.form-control-sm .dropdown-toggle{
|
||||||
height: 38px;
|
height: 38px;
|
||||||
|
@ -1131,12 +1131,12 @@ .user-info-dropdown .dropdown-toggle{
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
}
|
}
|
||||||
.user-info-dropdown .dropdown-toggle .user-icon{
|
.user-info-dropdown .dropdown-toggle .user-icon{
|
||||||
width: 52px;
|
width: 20px;
|
||||||
height: 52px;
|
height: 20px;
|
||||||
font-size: 24px;
|
font-size: 10px;
|
||||||
background: #ebeff3;
|
background: #ebeff3;
|
||||||
color: #1b00ff;
|
color: #1b00ff;
|
||||||
line-height: 52px;
|
line-height: 20px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
|
@ -1468,7 +1468,7 @@ .sidebar-menu .dropdown-toggle .micon{
|
||||||
left: 10px;
|
left: 10px;
|
||||||
width: 42px;
|
width: 42px;
|
||||||
height: 42px;
|
height: 42px;
|
||||||
font-size: 22px;
|
font-size: 12px;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
@extends('layout.main')
|
||||||
|
|
||||||
|
<body class="forgot-password-page">
|
||||||
|
<div class="login-wrap d-flex align-items-center flex-wrap justify-content-center">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row align-items-center">
|
||||||
|
<div class="col-md-6 col-lg-7">
|
||||||
|
<img src="{{ asset('vendors/images/forgot-password.png') }}" alt="">
|
||||||
|
</div>
|
||||||
|
@if(session('error'))
|
||||||
|
<div class="alert alert-danger">{{ session('error') }}</div>
|
||||||
|
@endif
|
||||||
|
<div class="col-md-6 col-lg-5">
|
||||||
|
<div class="login-box bg-white box-shadow border-radius-10">
|
||||||
|
<div class="login-title">
|
||||||
|
<h2 class="text-center text-primary">Forgot Password</h2>
|
||||||
|
</div>
|
||||||
|
<form method="POST" action="{{ route('password.email') }}">
|
||||||
|
@csrf
|
||||||
|
<div class="input-group custom mb-2">
|
||||||
|
<input id="email" type="text" class="form-control" name="email" placeholder="email" value="{{ old('email') }}">
|
||||||
|
<div class="input-group-append custom">
|
||||||
|
<span class="input-group-text"><i class="icon-copy dw dw-user1"></i></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@if($errors->has('email'))
|
||||||
|
<div class="alert alert-danger">{{ $errors->first('email') }}</div>
|
||||||
|
@endif
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<div class="input-group mb-2">
|
||||||
|
<button class="btn btn-primary btn-lg btn-block" type="submit">Send Link</button>
|
||||||
|
</div>
|
||||||
|
<div class="input-group mb-2">
|
||||||
|
<a
|
||||||
|
class="btn btn-outline-primary btn-lg btn-block"
|
||||||
|
href="/login">Back to Login</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
|
@ -1,70 +1,72 @@
|
||||||
<!DOCTYPE html>
|
@extends('layout.main')
|
||||||
<html lang="en">
|
|
||||||
<head>
|
<body class="login-page">
|
||||||
<meta charset="UTF-8">
|
<div class="login-wrap d-flex align-items-center flex-wrap justify-content-center">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<div class="container">
|
||||||
<title>Login</title>
|
<div class="row align-items-center">
|
||||||
<link rel="stylesheet" href="{{ asset('css/app.css') }}">
|
<div class="col-md-6 col-lg-7">
|
||||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous">
|
<img src="{{ asset('vendors/images/login-page-img.png') }}" alt="">
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.css">
|
|
||||||
<link rel="stylesheet" href="https://unpkg.com/bootstrap@5.3.2/dist/css/bootstrap.min.css">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<section class="bg-light p-3 p-md-4 p-xl-5">
|
|
||||||
<div class="container">
|
|
||||||
<div class="row justify-content-center">
|
|
||||||
<div class="col-12 col-xxl-11">
|
|
||||||
<div class="card border-light-subtle shadow-sm">
|
|
||||||
<div class="row g-0">
|
|
||||||
<div class="col-12 col-md-6">
|
|
||||||
<img class="img-fluid rounded-start w-100 h-100 object-fit-cover" loading="lazy" src="{{ asset('img/login.jpeg') }}" alt="Welcome back you've been missed!">
|
|
||||||
</div>
|
|
||||||
<div class="col-12 col-md-6 d-flex align-items-center justify-content-center">
|
|
||||||
<div class="col-12 col-lg-11 col-xl-10">
|
|
||||||
<div class="card-body p-3 p-md-4 p-xl-5">
|
|
||||||
@if(session('error'))
|
|
||||||
<div class="alert alert-danger">{{ session('error') }}</div>
|
|
||||||
@endif
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-12">
|
|
||||||
<div class="mb-5">
|
|
||||||
<div class="text-center mb-4">
|
|
||||||
<a href="#!">
|
|
||||||
<img src="{{ asset('img/logo.png') }}" alt="BootstrapBrain Logo" width="220" height="90">
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<h4 class="text-center">Selamat Datang !</h4>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<form method="POST" action="{{ route('login') }}">
|
@if(session('error'))
|
||||||
@csrf
|
<div class="alert alert-danger">{{ session('error') }}</div>
|
||||||
<div class="row gy-3 overflow-hidden">
|
@endif
|
||||||
<div class="col-12">
|
<div class="col-md-6 col-lg-5">
|
||||||
<div class="form-floating mb-3">
|
<div class="login-box bg-white box-shadow border-radius-10">
|
||||||
<input id="nomorinduk" type="text" class="form-control" name="nomorinduk" placeholder="NIP/NIS">
|
<div class="login-title">
|
||||||
<label for="nomorinduk" class="form-label">NIP/NIS</label>
|
<h2 class="text-center text-primary">Login</h2>
|
||||||
</div>
|
</div>
|
||||||
|
<form method="POST" action="{{ route('login') }}">
|
||||||
|
@csrf
|
||||||
|
<div class="input-group custom mb-2">
|
||||||
|
<input id="username" type="text" class="form-control" name="username" placeholder="username" required>
|
||||||
|
<div class="input-group-append custom">
|
||||||
|
<span class="input-group-text"><i class="icon-copy dw dw-user1"></i></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@if($errors->has('username'))
|
||||||
|
<div class="alert alert-danger">{{ $errors->first('username') }}</div>
|
||||||
|
@endif
|
||||||
|
<div class="input-group custom mb-2">
|
||||||
|
<input type="password" class="form-control" name="password" id="password" value="" placeholder="password" required>
|
||||||
|
<div class="input-group-append custom">
|
||||||
|
<span class="input-group-text"><i class="dw dw-padlock1"></i></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@if($errors->has('password'))
|
||||||
|
<div class="alert alert-danger">{{ $errors->first('password') }}</div>
|
||||||
|
@endif
|
||||||
|
<div class="row pb-30">
|
||||||
|
<div class="col-6">
|
||||||
|
<div class="custom-control custom-checkbox">
|
||||||
|
<input type="checkbox" class="custom-control-input" id="customCheck1"/>
|
||||||
|
<label class="custom-control-label" for="customCheck1">Remember</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
<div class="forgot-password">
|
||||||
|
<a href="{{ route('password.request') }}">Forgot Password?</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<div class="input-group mb-0">
|
||||||
|
<button class="btn btn-primary btn-lg btn-block" type="submit">Login</button>
|
||||||
|
</div>
|
||||||
|
<small class="d-block text-center my-3">Don't have an account?
|
||||||
|
</small>
|
||||||
|
<div class="input-group mb-0">
|
||||||
|
<a
|
||||||
|
class="btn btn-outline-primary btn-lg btn-block"
|
||||||
|
href="/register">Register To Create Account</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12">
|
</div>
|
||||||
<div class="form-floating mb-3">
|
|
||||||
<input type="password" class="form-control" name="password" id="password" value="" placeholder="Password" required>
|
|
||||||
<label for="password" class="form-label">Password</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="d-grid">
|
|
||||||
<button class="btn btn-dark btn-lg" type="submit">Log in now</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</body>
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
</body>
|
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
@extends('layout.main')
|
||||||
|
|
||||||
|
<body class="register-page">
|
||||||
|
<div class="login-wrap d-flex align-items-center flex-wrap justify-content-center">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row align-items-center">
|
||||||
|
<div class="col-md-6 col-lg-7">
|
||||||
|
<img src="{{ asset('vendors/images/register-page-img.png') }}" alt="">
|
||||||
|
</div>
|
||||||
|
@if(session('error'))
|
||||||
|
<div class="alert alert-danger">{{ session('error') }}</div>
|
||||||
|
@endif
|
||||||
|
<div class="col-md-6 col-lg-5">
|
||||||
|
<div class="login-box bg-white box-shadow border-radius-10">
|
||||||
|
<div class="login-title">
|
||||||
|
<h2 class="text-center text-primary">Register</h2>
|
||||||
|
</div>
|
||||||
|
<form method="POST" action="{{ route('register') }}">
|
||||||
|
@csrf
|
||||||
|
<div class="input-group custom mb-2">
|
||||||
|
<input id="name" type="text" class="form-control" name="name" placeholder="name" value="{{ old('name') }}">
|
||||||
|
<div class="input-group-append custom">
|
||||||
|
<span class="input-group-text"><i class="icon-copy dw dw-user1"></i></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@if($errors->has('name'))
|
||||||
|
<div class="alert alert-danger">{{ $errors->first('name') }}</div>
|
||||||
|
@endif
|
||||||
|
<div class="input-group custom mb-2">
|
||||||
|
<input id="username" type="text" class="form-control" name="username" placeholder="username" value="{{ old('username') }}">
|
||||||
|
<div class="input-group-append custom">
|
||||||
|
<span class="input-group-text"><i class="icon-copy dw dw-user1"></i></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@if($errors->has('username'))
|
||||||
|
<div class="alert alert-danger">{{ $errors->first('username') }}</div>
|
||||||
|
@endif
|
||||||
|
<div class="input-group custom mb-2">
|
||||||
|
<input id="email" type="email" class="form-control" name="email" placeholder="email" value="{{ old('email') }}">
|
||||||
|
<div class="input-group-append custom">
|
||||||
|
<span class="input-group-text"><i class="icon-copy dw dw-email"></i></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@if($errors->has('email'))
|
||||||
|
<div class="alert alert-danger">{{ $errors->first('email') }}</div>
|
||||||
|
@endif
|
||||||
|
<div class="input-group custom mb-2">
|
||||||
|
<input type="password" class="form-control" name="password" id="password" value="" placeholder="password" required>
|
||||||
|
<div class="input-group-append custom">
|
||||||
|
<span class="input-group-text"><i class="dw dw-padlock1"></i></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@if($errors->has('password'))
|
||||||
|
<div class="alert alert-danger">{{ $errors->first('password') }}</div>
|
||||||
|
@endif
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<div class="input-group mb-0">
|
||||||
|
<button class="btn btn-primary btn-lg btn-block" type="submit">Register</button>
|
||||||
|
</div>
|
||||||
|
<small class="d-block text-center my-3">Already have an account?</small>
|
||||||
|
<div class="input-group mb-0">
|
||||||
|
<a class="btn btn-outline-primary btn-lg btn-block" href="/login">Login</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
|
@ -0,0 +1,61 @@
|
||||||
|
@extends('layout.main')
|
||||||
|
|
||||||
|
<body class="reset-password-page">
|
||||||
|
<div class="login-wrap d-flex align-items-center flex-wrap justify-content-center">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row align-items-center">
|
||||||
|
<div class="col-md-6 col-lg-7">
|
||||||
|
<img src="{{ asset('vendors/images/forgot-password.png') }}" alt="">
|
||||||
|
{{-- <img src="vendors/images/login-page-img.png" alt="" /> --}}
|
||||||
|
</div>
|
||||||
|
@if(session('error'))
|
||||||
|
<div class="alert alert-danger">{{ session('error') }}</div>
|
||||||
|
@endif
|
||||||
|
<div class="col-md-6 col-lg-5">
|
||||||
|
<div class="login-box bg-white box-shadow border-radius-10">
|
||||||
|
<div class="login-title">
|
||||||
|
<h2 class="text-center text-primary">Reset Password</h2>
|
||||||
|
</div>
|
||||||
|
<form method="POST" action="{{ route('password.update') }}">
|
||||||
|
@csrf
|
||||||
|
@if($errors->has('email'))
|
||||||
|
<div class="alert alert-danger">{{ $errors->first('email') }}</div>
|
||||||
|
@endif
|
||||||
|
<div class="input-group custom mb-2">
|
||||||
|
<input id="email" type="text" class="form-control" name="email" placeholder="email" value="{{ $email ?? old('email') }}">
|
||||||
|
<div class="input-group-append custom">
|
||||||
|
<span class="input-group-text"><i class="icon-copy dw dw-user1"></i></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@if($errors->has('password'))
|
||||||
|
<div class="alert alert-danger">{{ $errors->first('password') }}</div>
|
||||||
|
@endif
|
||||||
|
<div class="input-group custom mb-2">
|
||||||
|
<input type="password" class="form-control" name="password" id="password" value="" placeholder="password" required>
|
||||||
|
<div class="input-group-append custom">
|
||||||
|
<span class="input-group-text"><i class="dw dw-padlock1"></i></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@if($errors->has('password_confirmation'))
|
||||||
|
<div class="alert alert-danger">{{ $errors->first('password_confirmation') }}</div>
|
||||||
|
@endif
|
||||||
|
<div class="input-group custom mb-2">
|
||||||
|
<input type="password_confirmation" class="form-control" name="password_confirmation" id="password_confirmation" value="" placeholder="confirm password" required>
|
||||||
|
<div class="input-group-append custom">
|
||||||
|
<span class="input-group-text"><i class="dw dw-padlock1"></i></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<div class="input-group mb-2">
|
||||||
|
<button class="btn btn-primary btn-lg btn-block" type="submit">Reset</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
|
@ -0,0 +1 @@
|
||||||
|
ini halaman index
|
|
@ -0,0 +1,91 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<!-- Basic Page Info -->
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<title>DeskApp</title>
|
||||||
|
|
||||||
|
<!-- Site favicon -->
|
||||||
|
<link rel="apple-touch-icon" sizes="180x180" href="{{ asset('vendors/images/apple-touch-icon.png') }}" />
|
||||||
|
<link rel="icon" type="image/png" sizes="32x32" href="{{ asset('vendors/images/favicon-32x32.png') }}" />
|
||||||
|
<link rel="icon" type="image/png" sizes="16x16" href="{{ asset('vendors/images/favicon-16x16.png') }}" />
|
||||||
|
|
||||||
|
<!-- Mobile Specific Metas -->
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
|
||||||
|
|
||||||
|
<!-- Google Font -->
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap"
|
||||||
|
rel="stylesheet" />
|
||||||
|
<!-- CSS -->
|
||||||
|
<link rel="stylesheet" type="text/css" href="{{ asset('vendors/styles/core.css') }}" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="{{ asset('vendors/styles/icon-font.min.css') }}" />
|
||||||
|
<link rel="stylesheet" type="text/css"
|
||||||
|
href="{{ asset('src/plugins/datatables/css/dataTables.bootstrap4.min.css') }}" />
|
||||||
|
<link rel="stylesheet" type="text/css"
|
||||||
|
href="{{ asset('src/plugins/datatables/css/responsive.bootstrap4.min.css') }}" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="{{ asset('vendors/styles/style.css') }}" />
|
||||||
|
|
||||||
|
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||||
|
<script async src="https://www.googletagmanager.com/gtag/js?id=G-GBZ3SGGX85"></script>
|
||||||
|
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2973766580778258"
|
||||||
|
crossorigin="anonymous"></script>
|
||||||
|
<script>
|
||||||
|
window.dataLayer = window.dataLayer || [];
|
||||||
|
|
||||||
|
function gtag() {
|
||||||
|
dataLayer.push(arguments);
|
||||||
|
}
|
||||||
|
gtag("js", new Date());
|
||||||
|
|
||||||
|
gtag("config", "G-GBZ3SGGX85");
|
||||||
|
</script>
|
||||||
|
<!-- Google Tag Manager -->
|
||||||
|
<script>
|
||||||
|
(function(w, d, s, l, i) {
|
||||||
|
w[l] = w[l] || [];
|
||||||
|
w[l].push({
|
||||||
|
"gtm.start": new Date().getTime(),
|
||||||
|
event: "gtm.js"
|
||||||
|
});
|
||||||
|
var f = d.getElementsByTagName(s)[0],
|
||||||
|
j = d.createElement(s),
|
||||||
|
dl = l != "dataLayer" ? "&l=" + l : "";
|
||||||
|
j.async = true;
|
||||||
|
j.src = "https://www.googletagmanager.com/gtm.js?id=" + i + dl;
|
||||||
|
f.parentNode.insertBefore(j, f);
|
||||||
|
})(window, document, "script", "dataLayer", "GTM-NXZMQSS");
|
||||||
|
</script>
|
||||||
|
<!-- End Google Tag Manager -->
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="app">
|
||||||
|
|
||||||
|
@yield('body')
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- js -->
|
||||||
|
<script src="{{ asset('vendors/scripts/core.js') }}"></script>
|
||||||
|
<script src="{{ asset('vendors/scripts/script.min.js') }}"></script>
|
||||||
|
<script src="{{ asset('vendors/scripts/process.js') }}"></script>
|
||||||
|
<script src="{{ asset('vendors/scripts/layout-settings.js') }}"></script>
|
||||||
|
<script src="{{ asset('src/plugins/apexcharts/apexcharts.min.js') }}"></script>
|
||||||
|
<script src="{{ asset('src/plugins/datatables/js/jquery.dataTables.min.js') }}"></script>
|
||||||
|
<script src="{{ asset('src/plugins/datatables/js/dataTables.bootstrap4.min.js') }}"></script>
|
||||||
|
<script src="{{ asset('src/plugins/datatables/js/dataTables.responsive.min.js') }}"></script>
|
||||||
|
<script src="{{ asset('src/plugins/datatables/js/responsive.bootstrap4.min.js') }}"></script>
|
||||||
|
<script src="{{ asset('vendors/scripts/dashboard.js') }}"></script>
|
||||||
|
|
||||||
|
<!-- Google Tag Manager (noscript) -->
|
||||||
|
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NXZMQSS" height="0" width="0"
|
||||||
|
style="display: none; visibility: hidden"></iframe></noscript>
|
||||||
|
<!-- End Google Tag Manager (noscript) -->
|
||||||
|
|
||||||
|
{{-- @include('sweetalert::alert') --}}
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,65 @@
|
||||||
|
@extends('layout.main')
|
||||||
|
|
||||||
|
<div class="header">
|
||||||
|
<div class="header-left">
|
||||||
|
<div class="menu-icon bi bi-list"></div>
|
||||||
|
<div class="search-toggle-icon bi bi-search" data-toggle="header_search"></div>
|
||||||
|
<div class="header-search">
|
||||||
|
<form>
|
||||||
|
<div class="form-group mb-0">
|
||||||
|
<i class="dw dw-search2 search-icon"></i>
|
||||||
|
<input type="text" class="form-control search-input" placeholder="Search Here" />
|
||||||
|
<div class="dropdown">
|
||||||
|
<div class="dropdown-menu dropdown-menu-right">
|
||||||
|
<div class="form-group row">
|
||||||
|
<label class="col-sm-12 col-md-2 col-form-label">From</label>
|
||||||
|
<div class="col-sm-12 col-md-10">
|
||||||
|
<input class="form-control form-control-sm form-control-line" type="text" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<label class="col-sm-12 col-md-2 col-form-label">To</label>
|
||||||
|
<div class="col-sm-12 col-md-10">
|
||||||
|
<input class="form-control form-control-sm form-control-line" type="text" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<label class="col-sm-12 col-md-2 col-form-label">Subject</label>
|
||||||
|
<div class="col-sm-12 col-md-10">
|
||||||
|
<input class="form-control form-control-sm form-control-line" type="text" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="text-right">
|
||||||
|
<button class="btn btn-primary">Search</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="header-right">
|
||||||
|
<div class="user-info-dropdown">
|
||||||
|
<div class="dropdown">
|
||||||
|
<a class="dropdown-toggle" href="#" role="button" data-toggle="dropdown">
|
||||||
|
<span class="user-icon">
|
||||||
|
{{ strtoupper(substr(Auth::user()->username, 0, 2)) }}
|
||||||
|
</span>
|
||||||
|
<span class="user-name"> Hi, {{ Auth::user()->username }}</span>
|
||||||
|
</a>
|
||||||
|
<div class="dropdown-menu dropdown-menu-right dropdown-menu-icon-list">
|
||||||
|
<a class="dropdown-item" href="profile.html"><i class="dw dw-user1"></i> Profile</a>
|
||||||
|
@auth
|
||||||
|
<a href="{{ route('logout') }}" class="dropdown-item has-icon text-danger"
|
||||||
|
onclick="event.preventDefault(); document.getElementById('logout-form').submit();">
|
||||||
|
<i class="dw dw-logout"></i> Logout
|
||||||
|
</a>
|
||||||
|
<form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">
|
||||||
|
@csrf
|
||||||
|
</form>
|
||||||
|
@endauth
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -0,0 +1,40 @@
|
||||||
|
@extends('layout.main')
|
||||||
|
|
||||||
|
<div class="main-container">
|
||||||
|
<div class="pd-ltr-20 xs-pd-20-10">
|
||||||
|
<div class="min-height-200px">
|
||||||
|
<div class="page-header">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 col-sm-12">
|
||||||
|
<div class="title">
|
||||||
|
<h4>blank</h4>
|
||||||
|
</div>
|
||||||
|
<nav aria-label="breadcrumb" role="navigation">
|
||||||
|
<ol class="breadcrumb">
|
||||||
|
<li class="breadcrumb-item"><a href="index.html">Home</a></li>
|
||||||
|
<li class="breadcrumb-item active" aria-current="page">blank</li>
|
||||||
|
</ol>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 col-sm-12 text-right">
|
||||||
|
<div class="dropdown">
|
||||||
|
<a class="btn btn-primary dropdown-toggle" href="#" role="button" data-toggle="dropdown">
|
||||||
|
January 2018
|
||||||
|
</a>
|
||||||
|
<div class="dropdown-menu dropdown-menu-right">
|
||||||
|
<a class="dropdown-item" href="#">Export List</a>
|
||||||
|
<a class="dropdown-item" href="#">Policies</a>
|
||||||
|
<a class="dropdown-item" href="#">View Assets</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="pd-20 bg-white border-radius-4 box-shadow mb-30">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="footer-wrap pd-20 mb-20 card-box">
|
||||||
|
DeskApp - Bootstrap 4 Admin Template By <a href="https://github.com/dropways" target="_blank">Ankit Hingarajiya</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -0,0 +1,75 @@
|
||||||
|
@extends('layout.main')
|
||||||
|
|
||||||
|
<div class="left-side-bar">
|
||||||
|
<div class="brand-logo">
|
||||||
|
<a href="index.html">
|
||||||
|
<img src="{{ asset('vendors/images/deskapp-logo.svg') }}" alt="" class="dark-logo" />
|
||||||
|
<img src="{{ asset('vendors/images/deskapp-logo-white.svg') }}" alt="" class="light-logo" />
|
||||||
|
</a>
|
||||||
|
<div class="close-sidebar" data-toggle="left-sidebar-close">
|
||||||
|
<i class="ion-close-round"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="menu-block customscroll">
|
||||||
|
<div class="sidebar-menu">
|
||||||
|
<ul id="accordion-menu">
|
||||||
|
<li>
|
||||||
|
<div class="sidebar-small-cap">Home</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="{{ route('siswa.dashboard') }}" class="dropdown-toggle no-arrow">
|
||||||
|
<span class="micon bi bi-house"></span><span class="mtext">Dashboard</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<div class="dropdown-divider"></div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<div class="sidebar-small-cap">Master</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="invoice.html" class="dropdown-toggle no-arrow">
|
||||||
|
<span class="micon bi bi-house"></span><span class="mtext">Data Kriteria</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="invoice.html" class="dropdown-toggle no-arrow">
|
||||||
|
<span class="micon bi bi-house"></span><span class="mtext">Data Sub Kriteria</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="invoice.html" class="dropdown-toggle no-arrow">
|
||||||
|
<span class="micon bi bi-house"></span><span class="mtext">Data Ekstrakurikuler</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="invoice.html" class="dropdown-toggle no-arrow">
|
||||||
|
<span class="micon bi bi-house"></span><span class="mtext">Data User</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<div class="dropdown-divider"></div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<div class="sidebar-small-cap">Perhitungan</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="invoice.html" class="dropdown-toggle no-arrow">
|
||||||
|
<span class="micon bi bi-house"></span><span class="mtext">Hasil Hitung Kriteria</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<div class="dropdown-divider"></div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<div class="sidebar-small-cap">Penilaian</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="invoice.html" class="dropdown-toggle no-arrow">
|
||||||
|
<span class="micon bi bi-house"></span><span class="mtext">Input Penilaian</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -1,25 +1,21 @@
|
||||||
@extends('layouts.siswa')
|
@extends('layout.main')
|
||||||
|
@section('body')
|
||||||
|
|
||||||
|
@include('layout.navbar')
|
||||||
|
@include('layout.sidebar')
|
||||||
|
|
||||||
<div class="main-container">
|
<div class="main-container">
|
||||||
<div class="pd-ltr-20">
|
<div class="pd-ltr-20">
|
||||||
<div class="card-box pd-20 height-50-p mb-30">
|
<div class="card-box pd-20 height-50-p mb-30">
|
||||||
<div class="row align-items-center">
|
<div class="row align-items-center">
|
||||||
<div class="col-md-4">
|
|
||||||
<img src="{{ asset('vendors/images/banner-img.png') }}" alt="" />
|
|
||||||
</div>
|
|
||||||
<div class="col-md-8">
|
<div class="col-md-8">
|
||||||
<h1 class="font-20 weight-500 mb-10 text-capitalize">
|
<h1 class="font-20 weight-500 mb-10 text-capitalize">
|
||||||
Selamat Datang
|
Welcome Back!
|
||||||
<div class="weight-600 font-30 text-blue">Hi, {{ auth()->user()->name }}!</div>
|
<div class="weight-600 font-30 text-blue">{{ auth()->user()->name }}!</div>
|
||||||
</h1>
|
</h1>
|
||||||
<p class="font-18 max-width-600">
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Unde
|
|
||||||
hic non repellendus debitis iure, doloremque assumenda. Autem
|
|
||||||
modi, corrupti, nobis ea iure fugiat, veniam non quaerat
|
|
||||||
mollitia animi error corporis.
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
use App\Http\Controllers\AuthController;
|
use App\Http\Controllers\AuthController;
|
||||||
use App\Http\Controllers\WakilKepalaController;
|
use App\Http\Controllers\WakilKepalaController;
|
||||||
use App\Http\Controllers\SiswaController;
|
use App\Http\Controllers\SiswaController;
|
||||||
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
@ -29,10 +30,35 @@
|
||||||
})->name('ekstrakurikuler');
|
})->name('ekstrakurikuler');
|
||||||
|
|
||||||
|
|
||||||
|
// Route::get('/login', function () {
|
||||||
|
// if (Auth::check()) {
|
||||||
|
// return redirect('/dashboard');
|
||||||
|
// }
|
||||||
|
// return view('auth.login');
|
||||||
|
// })->name('login');
|
||||||
Route::get('/login', [AuthController::class, 'showLoginForm'])->name('login');
|
Route::get('/login', [AuthController::class, 'showLoginForm'])->name('login');
|
||||||
|
|
||||||
Route::post('/login', [AuthController::class, 'login']);
|
Route::post('/login', [AuthController::class, 'login']);
|
||||||
|
|
||||||
|
// Route::get('/register', function () {
|
||||||
|
// if (Auth::check()) {
|
||||||
|
// return redirect('/dashboard');
|
||||||
|
// }
|
||||||
|
// return view('auth.register');
|
||||||
|
// })->name('register');
|
||||||
|
Route::get('/register', [AuthController::class, 'showRegisterForm'])->name('register');
|
||||||
|
Route::post('/register', [AuthController::class, 'register']);
|
||||||
|
|
||||||
|
Route::get('/forgot-password', function () {
|
||||||
|
if (Auth::check()) {
|
||||||
|
return redirect('/dashboard');
|
||||||
|
}
|
||||||
|
return view('auth.forgot-password');
|
||||||
|
})->name('password.request');
|
||||||
|
Route::post('/forgot-password', [AuthController::class, 'sendResetLinkEmail'])->name('password.email');
|
||||||
|
|
||||||
|
Route::get('/reset-password/{token}', [AuthController::class, 'showResetForm'])->name('password.reset');
|
||||||
|
Route::post('/reset-password', [AuthController::class, 'resetPassword'])->name('password.update');
|
||||||
|
|
||||||
Route::middleware(['auth', 'role:wakil_kepala'])->group(function () {
|
Route::middleware(['auth', 'role:wakil_kepala'])->group(function () {
|
||||||
Route::get('/wakil_kepala/dashboard', [WakilKepalaController::class, 'dashboard'])->name('wakil_kepala.dashboard');
|
Route::get('/wakil_kepala/dashboard', [WakilKepalaController::class, 'dashboard'])->name('wakil_kepala.dashboard');
|
||||||
Route::get('/wakil_kepala/kriteria', [WakilKepalaController::class, 'kriteria'])->name('wakil_kepala.kriteria');
|
Route::get('/wakil_kepala/kriteria', [WakilKepalaController::class, 'kriteria'])->name('wakil_kepala.kriteria');
|
||||||
|
@ -42,3 +68,6 @@
|
||||||
Route::middleware(['auth', 'role:siswa'])->group(function () {
|
Route::middleware(['auth', 'role:siswa'])->group(function () {
|
||||||
Route::get('/siswa/dashboard', [SiswaController::class, 'dashboard'])->name('siswa.dashboard');
|
Route::get('/siswa/dashboard', [SiswaController::class, 'dashboard'])->name('siswa.dashboard');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Route::get('/logout', [AuthController::class, 'logout'])->name('logout');
|
||||||
|
Route::post('/logout', [AuthController::class, 'logout'])->name('logout');
|
||||||
|
|
Loading…
Reference in New Issue