Download Laravel App
composer create-project --prefer-dist laravel/laravel my-app
C:\xampp\htdocs\laravel>composer create-project --prefer-dist laravel/laravel my-app
Connecting our Database
open .env file root directory.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laraveldb
DB_USERNAME=root
DB_PASSWORD=
Create Controller AuthController
php artisan make:controller Admin/AuthController
C:\xampp\htdocs\laravel\my-app>php artisan make:controller Admin/AuthController
app\Http\Controllers\Admin\AuthController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | //app\Http\Controllers\Admin\AuthController.php <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; class AuthController extends Controller { public function getLogin(){ $pass = "123456" ; $passhash = Hash::make( $pass ); echo $passhash ; return view( 'admin.auth.login' ); } public function postLogin(Request $request ){ $request ->validate([ 'email' => 'required|email' , 'password' => 'required' ]); $validated =auth()->attempt([ 'email' => $request ->email, 'password' => $request ->password, 'is_admin' =>1 ], $request ->password); if ( $validated ){ return redirect()->route( 'dashboard' )->with( 'success' , 'Login Successfull' ); } else { return redirect()->back()->with( 'error' , 'Invalid credentials' ); } } } |
php artisan make:controller Admin/ProfileController
C:\xampp\htdocs\laravel\my-app>php artisan make:controller Admin/ProfileController
app\Http\Controllers\Admin\ProfileController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | //app\Http\Controllers\Admin\ProfileController.php <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class ProfileController extends Controller { public function dashboard(){ $data =[ 'title' => 'Dashboard' ]; return view( 'admin.dashboard' , $data ); } public function logout(){ auth()->logout(); return redirect()->route( 'getLogin' )->with( 'success' , 'You have been successfully logged out' ); } } |
php artisan make:controller Admin/UserController
C:\xampp\htdocs\laravel\my-app>php artisan make:controller Admin/UserController
app\Http\Controllers\Admin\UserController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //app\Http\Controllers\Admin\UserController.php <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class UserController extends Controller { public function index(){ $data =[ 'title' => 'Users' ]; return view( 'admin.users.index' , $data ); } } |
database/migrations/create_users_table.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | //database/migrations/create_users_table.php <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { public function up() { Schema::create( 'users' , function (Blueprint $table ) { $table ->id(); $table ->string( 'name' ); $table ->string( 'email' )->unique(); $table ->timestamp( 'email_verified_at' )->nullable(); $table ->string( 'password' ); $table ->boolean( 'is_admin' )-> default (false); //add is_admin boolean $table ->rememberToken(); $table ->timestamps(); }); } public function down() { Schema::dropIfExists( 'users' ); } }; |
C:\xampp\htdocs\laravel\my-app>php artisan migrate
SB Admin 2
https://startbootstrap.com/theme/sb-admin-2
A free Bootstrap 4 admin theme built with HTML/CSS and a modern development workflow environment ready to use to build your next dashboard or web application
create folder name admin resources/views/admin
resources/views/main-layout.blade.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | //resources/views/main-layout.blade.php <!DOCTYPE html> <html lang= "en" > <head> <meta charset= "utf-8" > <meta http-equiv= "X-UA-Compatible" content= "IE=edge" > <meta name= "viewport" content= "width=device-width, initial-scale=1, shrink-to-fit=no" > <meta name= "description" content= "" > <meta name= "author" content= "" > <title>Admin Panel {{isset( $title )? '| ' . $title : '' }}</title> <!-- Custom fonts for this template--> <link href= "{{asset('admin_assets/vendor/fontawesome-free/css/all.min.css')}}" rel= "stylesheet" type= "text/css" > <link href= "https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i" rel= "stylesheet" > <!-- Custom styles for this template--> <link href= "{{asset('admin_assets/css/sb-admin-2.min.css')}}" rel= "stylesheet" > </head> <body id= "page-top" > <!-- Page Wrapper --> <div id= "wrapper" > @ include ( 'admin.partials.left-sidebar' ) <!-- Content Wrapper --> <div id= "content-wrapper" class = "d-flex flex-column" > <!-- Main Content --> <div id= "content" > @yield( 'content-header' ) <!-- Begin Page Content --> <div class = "container-fluid" > @yield( 'body' ) </div> <!-- /.container-fluid --> </div> <!-- End of Main Content --> <!-- Footer --> <footer class = "sticky-footer bg-white" > <div class = "container my-auto" > <div class = "copyright text-center my-auto" > <span>Copyright © Your Website 2021</span> </div> </div> </footer> <!-- End of Footer --> </div> <!-- End of Content Wrapper --> </div> <!-- End of Page Wrapper --> <!-- Scroll to Top Button--> <a class = "scroll-to-top rounded" href= "#page-top" > <i class = "fas fa-angle-up" ></i> </a> <!-- Logout Modal--> <div class = "modal fade" id= "logoutModal" tabindex= "-1" role= "dialog" aria-labelledby= "exampleModalLabel" aria-hidden= "true" > <div class = "modal-dialog" role= "document" > <div class = "modal-content" > <div class = "modal-header" > <h5 class = "modal-title" id= "exampleModalLabel" >Ready to Leave?</h5> <button class = "close" type= "button" data-dismiss= "modal" aria-label= "Close" > <span aria-hidden= "true" >×</span> </button> </div> <div class = "modal-body" >Select "Logout" below if you are ready to end your current session.</div> <div class = "modal-footer" > <button class = "btn btn-secondary" type= "button" data-dismiss= "modal" >Cancel</button> <a class = "btn btn-primary" href= "{{route('logout')}}" >Logout</a> </div> </div> </div> </div> <!-- Bootstrap core JavaScript--> <script src= "{{asset('admin_assets/vendor/jquery/jquery.min.js')}}" ></script> <script src= "{{asset('admin_assets/vendor/bootstrap/js/bootstrap.bundle.min.js')}}" ></script> <!-- Core plugin JavaScript--> <script src= "{{asset('admin_assets/vendor/jquery-easing/jquery.easing.min.js')}}" ></script> <!-- Custom scripts for all pages--> <script src= "{{asset('admin_assets/js/sb-admin-2.min.js')}}" ></script> <!-- Page level plugins --> <script src= "{{asset('admin_assets/vendor/chart.js/Chart.min.js')}}" ></script> <!-- Page level custom scripts --> <script src= "{{asset('admin_assets/js/demo/chart-area-demo.js')}}" ></script> <script src= "{{asset('admin_assets/js/demo/chart-pie-demo.js')}}" ></script> </body> </html> |
resources/views/admin/dashboard.blade.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | //resources/views/admin/dashboard.blade.php @ extends ( 'admin.main-layout' ) @section( 'content-header' ) <nav class = "navbar navbar-expand navbar-light bg-white topbar mb-4 static-top shadow" > <!-- Sidebar Toggle (Topbar) --> <button id= "sidebarToggleTop" class = "btn btn-link d-md-none rounded-circle mr-3" > <i class = "fa fa-bars" ></i> </button> <!-- Topbar Search --> <form class = "d-none d-sm-inline-block form-inline mr-auto ml-md-3 my-2 my-md-0 mw-100 navbar-search" > <div class = "input-group" > <input type= "text" class = "form-control bg-light border-0 small" placeholder= "Search for..." aria-label= "Search" aria-describedby= "basic-addon2" > <div class = "input-group-append" > <button class = "btn btn-primary" type= "button" > <i class = "fas fa-search fa-sm" ></i> </button> </div> </div> </form> <ul class = "navbar-nav ml-auto" > <div class = "topbar-divider d-none d-sm-block" ></div> <!-- Nav Item - User Information --> <li class = "nav-item dropdown no-arrow" > <a class = "nav-link dropdown-toggle" href= "#" id= "userDropdown" role= "button" data-toggle= "dropdown" aria-haspopup= "true" aria-expanded= "false" > <span class = "mr-2 d-none d-lg-inline text-gray-600 small" >Douglas McGee</span> <img class = "img-profile rounded-circle" src= "{{asset('admin_assets/img/undraw_profile.svg')}}" > </a> <!-- Dropdown - User Information --> <div class = "dropdown-menu dropdown-menu-right shadow animated--grow-in" aria-labelledby= "userDropdown" > <a class = "dropdown-item" href= "#" > <i class = "fas fa-user fa-sm fa-fw mr-2 text-gray-400" ></i> Profile </a> <a class = "dropdown-item" href= "#" > <i class = "fas fa-cogs fa-sm fa-fw mr-2 text-gray-400" ></i> Settings </a> <a class = "dropdown-item" href= "#" > <i class = "fas fa-list fa-sm fa-fw mr-2 text-gray-400" ></i> Activity Log </a> <div class = "dropdown-divider" ></div> <a class = "dropdown-item" href= "#" data-toggle= "modal" data-target= "#logoutModal" > <i class = "fas fa-sign-out-alt fa-sm fa-fw mr-2 text-gray-400" ></i> Logout </a> </div> </li> </ul> </nav> <!-- /.content-header --> @endsection @section( 'body' ) <!-- Main row --> <div class = "row" > <div class = "container-fluid" > Dashboard </div> </div> <!-- /.row (main row) --> @endsection |
resources/views/admin/auth/login.blade.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | //resources/views/admin/auth/login.blade.php <!DOCTYPE html> <html lang= "en" > <head> <meta charset= "utf-8" > <meta http-equiv= "X-UA-Compatible" content= "IE=edge" > <meta name= "viewport" content= "width=device-width, initial-scale=1, shrink-to-fit=no" > <meta name= "description" content= "" > <meta name= "author" content= "" > <title>SB Admin 2 - Login</title> <!-- Custom fonts for this template--> <link href= "{{asset('admin_assets/vendor/fontawesome-free/css/all.min.css')}}" rel= "stylesheet" type= "text/css" > <link href= "https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i" rel= "stylesheet" > <!-- Custom styles for this template--> <link href= "{{asset('admin_assets/css/sb-admin-2.min.css')}}" rel= "stylesheet" > </head> <body class = "bg-gradient-primary" > <div class = "container" > <!-- Outer Row --> <div class = "row justify-content-center" > <div class = "col-xl-10 col-lg-12 col-md-9" > <div class = "card o-hidden border-0 shadow-lg my-5" > <div class = "card-body p-0" > <!-- Nested Row within Card Body --> <div class = "row" > <div class = "col-lg-6 d-none d-lg-block bg-login-image" ></div> <div class = "col-lg-6" > <div class = "p-5" > <div class = "text-center" > @ if (session( 'error' )) <div class = "text-danger text-center" >{{session( 'error' )}}</div> @ endif @ if (session( 'success' )) <div class = "text-success text-center" >{{session( 'success' )}}</div> @ endif <p class = "login-box-msg" >Sign in to start your session</p> </div> <form class = "user" action= "{{route('postLogin')}}" method= "post" > @csrf <div class = "form-group" > <input name= "email" type= "email" class = "form-control form-control-user" id= "exampleInputEmail" aria-describedby= "emailHelp" placeholder= "Enter Email Address..." > @error( 'email' ) <div class = "text-danger" >{{ $message }}</div> @enderror </div> <div class = "form-group" > <input name= "password" type= "password" class = "form-control form-control-user" id= "exampleInputPassword" placeholder= "Password" > @error( 'password' ) <div class = "text-danger" >{{ $message }}</div> @enderror </div> <div class = "form-group" > <div class = "custom-control custom-checkbox small" > <input type= "checkbox" class = "custom-control-input" id= "customCheck" > <label class = "custom-control-label" for = "customCheck" >Remember Me</label> </div> </div> <button type= "submit" class = "btn btn-primary btn-user btn-block" >Sign In</button> <hr> <a href= "index.html" class = "btn btn-google btn-user btn-block" > <i class = "fab fa-google fa-fw" ></i> Login with Google </a> <a href= "index.html" class = "btn btn-facebook btn-user btn-block" > <i class = "fab fa-facebook-f fa-fw" ></i> Login with Facebook </a> </form> <hr> <div class = "text-center" > <a class = "small" href= "forgot-password.html" >Forgot Password?</a> </div> <div class = "text-center" > <a class = "small" href= "register.html" >Create an Account!</a> </div> </div> </div> </div> </div> </div> </div> </div> </div> <!-- Bootstrap core JavaScript--> <script src= "{{asset('admin_assets/vendor/jquery/jquery.min.js')}}" ></script> <script src= "{{asset('admin_assets/vendor/bootstrap/js/bootstrap.bundle.min.js')}}" ></script> <!-- Core plugin JavaScript--> <script src= "{{asset('admin_assets/vendor/jquery-easing/jquery.easing.min.js')}}" ></script> <!-- Custom scripts for all pages--> <script src= "{{asset('admin_assets/js/sb-admin-2.min.js')}}" ></script> </body> </html> |
resources/views/admin/users/index.blade.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | //resources/views/admin/users/index.blade.php @ extends ( 'admin.main-layout' ) @section( 'content-header' ) <nav class = "navbar navbar-expand navbar-light bg-white topbar mb-4 static-top shadow" > <!-- Sidebar Toggle (Topbar) --> <button id= "sidebarToggleTop" class = "btn btn-link d-md-none rounded-circle mr-3" > <i class = "fa fa-bars" ></i> </button> <!-- Topbar Search --> <form class = "d-none d-sm-inline-block form-inline mr-auto ml-md-3 my-2 my-md-0 mw-100 navbar-search" > <div class = "input-group" > <input type= "text" class = "form-control bg-light border-0 small" placeholder= "Search for..." aria-label= "Search" aria-describedby= "basic-addon2" > <div class = "input-group-append" > <button class = "btn btn-primary" type= "button" > <i class = "fas fa-search fa-sm" ></i> </button> </div> </div> </form> <ul class = "navbar-nav ml-auto" > <div class = "topbar-divider d-none d-sm-block" ></div> <!-- Nav Item - User Information --> <li class = "nav-item dropdown no-arrow" > <a class = "nav-link dropdown-toggle" href= "#" id= "userDropdown" role= "button" data-toggle= "dropdown" aria-haspopup= "true" aria-expanded= "false" > <span class = "mr-2 d-none d-lg-inline text-gray-600 small" >Douglas McGee</span> <img class = "img-profile rounded-circle" src= "{{asset('admin_assets/img/undraw_profile.svg')}}" > </a> <!-- Dropdown - User Information --> <div class = "dropdown-menu dropdown-menu-right shadow animated--grow-in" aria-labelledby= "userDropdown" > <a class = "dropdown-item" href= "#" > <i class = "fas fa-user fa-sm fa-fw mr-2 text-gray-400" ></i> Profile </a> <a class = "dropdown-item" href= "#" > <i class = "fas fa-cogs fa-sm fa-fw mr-2 text-gray-400" ></i> Settings </a> <a class = "dropdown-item" href= "#" > <i class = "fas fa-list fa-sm fa-fw mr-2 text-gray-400" ></i> Activity Log </a> <div class = "dropdown-divider" ></div> <a class = "dropdown-item" href= "#" data-toggle= "modal" data-target= "#logoutModal" > <i class = "fas fa-sign-out-alt fa-sm fa-fw mr-2 text-gray-400" ></i> Logout </a> </div> </li> </ul> </nav> <!-- /.content-header --> @endsection @section( 'body' ) <!-- Main row --> <div class = "row" > <div class = "container-fluid" > Users List </div> </div> <!-- /.row (main row) --> @endsection |
resources/views/admin/partials/left-sidebar.blade.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | //resources/views/admin/partials/left-sidebar.blade.php @php $current_route =request()->route()->getName(); @endphp <!-- Main Sidebar Container --> <!-- Sidebar --> <ul class = "navbar-nav bg-gradient-primary sidebar sidebar-dark accordion" id= "accordionSidebar" > <!-- Sidebar - Brand --> <a class = "sidebar-brand d-flex align-items-center justify-content-center" href= "index.html" > <div class = "sidebar-brand-icon rotate-n-15" > <i class = "fas fa-laugh-wink" ></i> </div> <div class = "sidebar-brand-text mx-3" >{{auth()->user()->name}}</div> </a> <!-- Divider --> <hr class = "sidebar-divider my-0" > <!-- Nav Item - Dashboard --> <li class = "nav-item active" > <a href= "{{route('dashboard')}}" class = "nav-link {{$current_route=='dashboard'?'active':''}}" > <i class = "fas fa-fw fa-tachometer-alt" ></i> <span>Dashboard</span></a> </li> <!-- Divider --> <hr class = "sidebar-divider" > <!-- Heading --> <div class = "sidebar-heading" > User Management </div> <li class = "nav-item" > <a href= "{{route('users.index')}}" class = "nav-link {{$current_route=='users.index'?'active':''}}" > <i class = "fas fa-fw fa-table" ></i> <span>Users</span></a> </li> </ul> <!-- End of Sidebar --> |
app/Http/Middleware/AdminAuth.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | //app/Http/Middleware/AdminAuth.php <?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; class AdminAuth { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse */ public function handle(Request $request , Closure $next ) { if (auth()->check()){ if (!auth()->user()->is_admin){ return redirect()->route( 'getLogin' )->with( 'error' , 'You have to be admin user to access this page' ); } } else { return redirect()->route( 'getLogin' )->with( 'error' , 'You have to be logged in to access this page' ); } return $next ( $request ); } } |
app/Http/Kernel.php
Add AdminAuth::class
protected $routeMiddleware = [
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'admin_auth' => \App\Http\Middleware\AdminAuth::class,
];
Routes
routes/web.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | //routes/web.php <?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\Admin\{AuthController,ProfileController,UserController}; Route::get( '/' , function () { return view( 'welcome' ); }); Route::get( '/admin/login' ,[AuthController:: class , 'getLogin' ])->name( 'getLogin' ); Route::post( '/admin/login' ,[AuthController:: class , 'postLogin' ])->name( 'postLogin' ); Route::group([ 'middleware' =>[ 'admin_auth' ]], function (){ Route::get( '/admin/dashboard' ,[ProfileController:: class , 'dashboard' ])->name( 'dashboard' ); Route::get( '/admin/users' ,[UserController:: class , 'index' ])->name( 'users.index' ); Route::get( '/admin/logout' ,[ProfileController:: class , 'logout' ])->name( 'logout' ); }); |
Starting Laravel development server: http://127.0.0.1:8000