Website Ticket Pesawat menggunakan Laravel

Berikut adalah tutorial pembuatan webisite e-commerce ticketing pesawat menggunakan laravel. 

 Website ini memiliki 4 jenis pengguna, yaitu:

  • Admin: Berperan sebagai pihak tertinggi yang bertugas menyetujui dan memvalidasi maskapai yang mendaftar di website ini.
  • Maskapai: Berperan dalam membuat dan mengelola jadwal penerbangan, tiket, serta menyetujui dan memvalidasi transaksi yang dilakukan oleh pengguna.
  • User: Berperan sebagai pengguna umum yang dapat mencari dan memesan tiket pesawat, serta melakukan pembayaran.
  • Unvalidated: Merupakan status akun bagi maskapai yang baru mendaftar dan sedang menunggu proses validasi oleh admin.

Secara singkat, cara kerja website ini adalah:

  • Maskapai mendaftar di website dan menunggu proses validasi oleh admin.
  • Setelah divalidasi, maskapai dapat membuat dan mengelola jadwal penerbangan dan tiket.
  • Pengguna dapat mencari dan memesan tiket pesawat yang tersedia.
  • Maskapai menyetujui dan memvalidasi transaksi yang dilakukan oleh pengguna.
  • Pengguna melakukan pembayaran ticket.
  • Pengguna mendapatkan e-tiket yang dapat digunakan untuk check-in penerbangan.

Tampilan sisi USER:






                Tampilan sisi MASKAPAI:

                Tampilan sisi ADMIN:




Tahapan

1. Migrasi Database

Tabel Airline :
Tabel ini berguna menyimpan data Maskapai yang tersedia di ticket,

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
/**
* Run the migrations.
*/

public function up(): void
{
Schema::create('airline', function (Blueprint $table) {
$table->id('id_airline');
$table->string('name');
});
}


/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('airline');
}
};


Tabel customer :
Tabel ini berguna menyimpan data customer,

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
/**
* Run the migrations.
*/

public function up(): void
{
Schema::create('customer', function (Blueprint $table) {
$table->id('id_customer');
$table->string('name');
$table->string('email');
$table->string('phone_number');
$table->string('address');
$table->unsignedBigInteger('id_user')->nullable();
$table->string('customer_status')->nullable();

// Define foreign key relationship
$table->foreign('id_user')->references('id')->on('users')->onDelete('set null');
});
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('customer');
}
};

 
Tabel flight :
Tabel ini berguna menyimpan data penerbangan,

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('flight', function (Blueprint $table) {
$table->id('id_flight');
$table->unsignedBigInteger('id_airline');
$table->string('no_flight');
$table->string('departure_city');
$table->string('arrival_city');
$table->date('departure_date');
$table->time('departure_time');
$table->date('arrival_date');
$table->time('arrival_time');
$table->integer('seat_availability');
$table->integer('price');
$table->unsignedBigInteger('id_user');

// Define foreign key relationships
$table->foreign('id_airline')->references('id_airline')->on('airline');
$table->foreign('id_user')->references('id')->on('users');
});
}


/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('flight');
}
};


Tabel Transaction :
Tabel ini akan menyimpan data transaksi yang dibuat oleh customer.

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
/**
* Run the migrations.
*/

public function up() : void
{
Schema::create('transaction', function (Blueprint $table) {
$table->id('id_transaction');
$table->unsignedBigInteger('id_flight');
$table->unsignedBigInteger('id_user');
$table->string('no_booking');
$table->integer('total_price');
$table->string('payment_status');
$table->integer('seat');

// Define foreign key relationships
$table->foreign('id_flight')->references('id_flight')->on('flight');
$table->foreign('id_user')->references('id')->on('users');
});
}


/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('transaction');
}
};


2. Autentikasi Role
Edit Controller AuthenticatedSessionController.php di app/Http/Controllers/Auth dengan script berikut :

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Http\Requests\Auth\LoginRequest;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\View\View;

class AuthenticatedSessionController extends Controller
{
/**
* Display the login view.
*/
public function create(): View
{
return view('auth.login');
}

/**
* Handle an incoming authentication request.
*/
public function store(LoginRequest $request): RedirectResponse
{
$request->authenticate();
$request->session()->regenerate();
if(Auth::user() && Auth::user()->role == 'user'){
return redirect()->route('ticket');
}else if(Auth::user() && Auth::user()->role == 'maskapai'){
return redirect()->route('maskapai.dashboard');
}else if(Auth::user() && Auth::user()->role == 'unvalidated'){
return redirect()->route('maskapai.unvalidated');
}else if(Auth::user() && Auth::user()->role == 'admin'){
return redirect()->route('admin.dashboard');
}else{
Auth::guard('web')->logout();
return redirect()->route('login')->with('status', 'You are not authorized to access this page.');
}
}

/**
* Destroy an authenticated session.
*/
public function destroy(Request $request): RedirectResponse
{
Auth::guard('web')->logout();

$request->session()->invalidate();

$request->session()->regenerateToken();

return redirect('/');
}
}


Edit juga Controller RegisteredUserController.php di app/Http/Controllers/Auth dengan script berikut :

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Models\airline;
use App\Models\User;
use App\Providers\RouteServiceProvider;
use Illuminate\Auth\Events\Registered;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rules;
use Illuminate\View\View;

class RegisteredUserController extends Controller
{
/**
* Display the registration view.
*/
public function create(): View
{
return view('auth.register');
}

/**
* Handle an incoming registration request.
*
* @throws \Illuminate\Validation\ValidationException
*/
public function store(Request $request): RedirectResponse
{
$request->validate([
'role' => ['required', 'string', 'in:user,unvalidated'],
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:'.User::class],
'password' => ['required', 'confirmed', Rules\Password::defaults()],
]);

$role = $request->role;

$user = User::create([
'role' => $role,
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);

event(new Registered($user));

Auth::login($user);

if($role='unvalidated'){
return redirect('/unvalidated');
}else if($role='user'){
return redirect('/home');
}
}
}


Kemudian tambahkan script berikut di app/Http/Kernel.php :
protected $middlewareAliases = [
        ......
'role' => \App\Http\Middleware\Role::class,
];
}

3. Membuat Controller dan Model

1. MaskapaiController.php

<?php

namespace App\Http\Controllers;

use App\Models\customer;
use App\Models\Flight;
use App\Models\transaction;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class maskapaiController extends Controller
{
public function index()
{
$flight = Flight::where('id_user',Auth::id())->get();
return view('maskapai.flightreport', compact('flight'));
}
public function indexUnvalidated()
{
return view('maskapai.unvalidated');
}
public function create()
{
return view('maskapai.addflight');
}
public function indexconfirmtransaction()
{
$transaction = transaction::where('payment_status','PAID')->get();
return view('maskapai.confirmtransaction', compact('transaction'));
}
public function confirmtransaction($id_transaction)
{
$transaction = transaction::findOrFail($id_transaction);
$transaction->payment_status = 'CONFIRMED';
$transaction->save();
return redirect()->back();
}
public function declinetransaction($id_transaction)
{
$transaction = transaction::findOrFail($id_transaction);
$transaction->payment_status = 'DECLINED';
$transaction->save();
return redirect()->back();
}
public function transactionreport()
{
$transaction = transaction::where('payment_status','CONFIRMED')->get();
return view('maskapai.transactionreport', compact('transaction'));
}
public function details(Request $request)
{
$transaction = transaction::where($request->id_transaction)->get();
$transaction = transaction::where($request->id_transaction)->get();
return view('maskapai.details', compact('flightdata','customerdata'));
}

public function store(Request $request)
{
$request->validate([
'no_flight' => ['required'],
'departure_city' => ['required'],
'arrival_city' => ['required'],
'departure_date' => ['required'],
'arrival_date' => ['required'],
'departure_time' => ['required'],
'arrival_time' => ['required'],
'departure_time' => ['required'],
'seat_availability' => ['required'],
'price' => ['required'],
]);

Flight::create([
'id_airline' => $request->id_airline,
'no_flight' => $request->no_flight,
'departure_city' => $request->departure_city,
'arrival_city' => $request->arrival_city,
'departure_date' => $request->departure_date,
'arrival_date' => $request->arrival_date,
'departure_time' => $request->departure_time,
'arrival_time' => $request->arrival_time,
'seat_availability' => $request->seat_availability,
'price' => $request->price,
'id_user' => Auth::id(),
]);
return redirect()->route('maskapai.dashboard')->with('status', 'Flight Created.');
}

/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}

/**
* Show the form for editing the specified resource.
*/
public function edit($id)
{
$dataflight = Flight::where('id_flight',$id)->get();
return view('maskapai.editflight', compact('dataflight'));
}

/**
* Update the specified resource in storage.
*/
public function update(Request $request)
{
$flight = Flight::findOrFail($request->id_flight);

$flight->no_flight = $request->input('no_flight');
$flight->departure_city = $request->input('departure_city');
$flight->arrival_city = $request->input('arrival_city');
$flight->departure_date = $request->input('departure_date');
$flight->departure_time = $request->input('departure_time');
$flight->arrival_date = $request->input('arrival_date');
$flight->arrival_time = $request->input('arrival_time');
$flight->seat_availability = $request->input('seat_availability');
$flight->price = $request->input('price');

$flight->save();

return redirect()->route('maskapai.dashboard')->with('status', 'Airline Updated.');
}

/**
* Remove the specified resource from storage.
*/
public function destroy($id_flight)
{
$flight = Flight::findOrFail($id_flight);
$flight->delete();
return redirect()->route('maskapai.dashboard')->with('success', 'Airline deleted successfully');
}

public function searchflight(Request $request)
{
$no_booking = $request->no_booking;


$transaction = transaction::where('no_booking', $no_booking)->get();

if ($transaction) {
return view('maskapai.transactionreport', compact('transaction'));
} else {
return view('no-results');
}
}
}

2. AdminController.php
<?php

namespace App\Http\Controllers;

use App\Models\airline;
use App\Models\User;
use Illuminate\Http\Request;

class adminController extends Controller
{
public function index()
{
return view('admin.dashboard');
}

public function store(Request $request)
{
$maskapai = User::findOrFail($request->id);

$maskapai->role = 'maskapai';

$maskapai->save();

$name = $request->name;

$id = User::where('name', $name)->pluck('id')->first();
$idAsString = (string) $id;
$idAsString = strval($id);

airline::create([
'id_airline' => $idAsString,
'name' => $name,
]);

return redirect()->route('admin.dashboard')->with('status', 'Airline Approved.');
}

public function getUnvalidatedAirline(Request $request)
{
$unvalidatedAirline = User::where('role', 'unvalidated')->get();
$validatedAirline = User::where('role', 'maskapai')->get();

return view('admin.approve', compact('unvalidatedAirline', 'validatedAirline'));
}

public function destroy(Request $request)
{
$airline = Airline::where('id_airline',$request->id);

$airline->delete();

return redirect()->route('admin.dashboard')->with('success', 'Airline deleted successfully');
}
}

3. UserController.php
<?php

namespace App\Http\Controllers;

use App\Models\airline;
use App\Models\customer;
use App\Models\Flight;
use App\Models\transaction;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;

use function Laravel\Prompts\select;

class userController extends Controller
{
public function index()
{
return view('dashboard');
}

public function searchticket(Request $request)
{
$departure_city = $request->departure_city;
$arrival_city = $request->arrival_city;
$departure_date = $request->departure_date;
$arrival_date = $request->arrival_date;

$query = Flight::where('departure_city', $departure_city)
->where('arrival_city', $arrival_city)
->where('departure_date', $departure_date)
->get();
// $queryname = airline::findorFail($query->id_airline)->get();

$queryname = [];
foreach ($query as $flight) {
$airline = Airline::findOrFail($flight->id_airline);
$queryname[$flight->id] = $airline->name;
}

if ($query) {
return view('tickets', compact('query','queryname'));
} else {
// Handle the case where no flight matches the search criteria
return view('no-results');
}
}

public function buyticket($id)
{
$customer = customer::where('id_user', Auth::id())->get();
$flight = Flight::where('id_flight', $id)->get();
$customer_status = customer::where('customer_status', 'PENDING')->where('id_user', Auth::id())->get();
$pendingamount = $customer_status->count();
if($customer){
return view('createtransaction', compact('id','customer','customer_status','flight','pendingamount'));
}else{
return view('addcustomer', compact('id'));
}
}

public function addcustomer($id){
return view('addcustomer',compact('id'));
}

public function createcustomer(Request $request, $id){
customer::create([
'name' => $request->name,
'email' => $request->email,
'phone_number' => $request->phone_number,
'address' => $request->address,
'id_user' => $request->id_user,
]);
return redirect()->route('buy.ticket',compact('id'));
}

public function addctoticket(Request $request){
$customer = customer::where('id_customer',$request->id_customer)->first();
if ($customer) {
$customer->customer_status = 'PENDING';
$customer->save();
return redirect()->back();
} else {
return redirect()->back()->withError('Customer not found.');
}
// $customer = customer::where('id_user', $request->id_user)->get();
}

public function removecfromticket(Request $request){
$customer = customer::where('id_customer',$request->id_customer)->first();
if ($customer) {
$customer->customer_status = '';
$customer->save();
return redirect()->back();
} else {
return redirect()->back()->withError('Customer not found.');
}
// $customer = customer::where('id_user', $request->id_user)->get();
}

public function createtransaction(Request $request,$id){
// try{
$id_user = Auth::id();
$customer_status = customer::where('customer_status', 'PENDING')->where('id_user',$id_user)->get();
$count = $customer_status->count();
transaction::create([
'id_user' => $id_user,
'id_flight' => $id,
'no_booking' => 'BO' . $id_user.$id,
'total_price' => $request->price * $count,
'payment_status' => 'PENDING',
'seat' => $count,
]);
// $flight = Flight::findOrFail($request->id_flight);
// $flight->seat_availability -= $count;
// $flight->save();

return redirect()->route('bookings');
}
public function bookings(){
$booking = transaction::where('id_user', Auth::id())
->where('payment_status', 'PENDING')
->get(); // Fetch pending bookings

$confirmedbooking = transaction::where('id_user', Auth::id())
->whereIn('payment_status', ['CONFIRMED', 'PAID', 'DECLINED'])
->get(); // Fetch confirmed, paid, or declined bookings

$flightdata = [];
$flightdataconfirmed = [];
$customerconfirmed = [];
$customer = [];

foreach ($booking as $bookingdata) {
$id_flight = $bookingdata->id_flight;
$flight = Flight::where('id_flight', $id_flight)->first();
if ($flight) {
$flightdata[] = $flight;
$customerdata = customer::where('id_customer', $bookingdata->id_customer)->get(); // Assuming there's a direct relation between transaction and customer
$customerconfirmed[] = $customerdata;
}
}

foreach ($confirmedbooking as $bookingdata) {
$id_flight = $bookingdata->id_flight;
$flight = Flight::where('id_flight', $id_flight)->first();
if ($flight) {
$flightdataconfirmed[] = $flight;
$customerdata = customer::where('id_customer', $bookingdata->id_customer)->get(); // Assuming there's a direct relation between transaction and customer
$customer[] = $customerdata;
}
}

return view('bookings', compact('booking', 'confirmedbooking', 'flightdata', 'flightdataconfirmed', 'customerconfirmed', 'customer'));
}

public function payment($id_transaction){
$transaction = transaction::findOrFail($id_transaction);
$transaction->payment_status = 'PAID';
$transaction->save();
return redirect()->back();
}
public function cancelbooking($id_transaction){
$transaction = transaction::findOrFail($id_transaction);
$transaction->delete();
return redirect()->back();
}
}

Model

1. Airline.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class airline extends Model
{
use HasFactory;
protected $table = "airline";
protected $primaryKey = "id_airline";

protected $fillable = [
'id_airline',
'name',
];
public $timestamps = false;

public function flights()
{
return $this->hasMany(flight::class);
}
}

2. Customer.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class customer extends Model
{
use HasFactory;
protected $table = "customer";
protected $primaryKey = "id_customer";

protected $fillable = [
'id_customer',
'name',
'email',
'phone_number',
'address',
'id_user',
'customer_status',
];
public $timestamps = false;

public function user()
{
return $this->belongsTo(User::class, 'id_user');
}
}

3. Flight.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
use HasFactory;
protected $table = "flight";
protected $primaryKey = 'id_flight';

protected $fillable = [
'id_flight',
'id_airline',
'no_flight',
'departure_city',
'arrival_city',
'departure_date',
'departure_time',
'arrival_date',
'arrival_time',
'seat_availability',
'price',
'id_user',
];
public $timestamps = false;

public function airline()
{
return $this->belongsTo(Airline::class, 'id_airline');
}

public function transactions()
{
return $this->hasMany(Transaction::class, 'id_flight');
}
}

4. Transaction.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class transaction extends Model
{
use HasFactory;
protected $table = "transaction";

protected $primaryKey = "id_transaction";

protected $fillable = [
'id_transaction',
'id_flight',
'id_user',
'no_booking',
'total_price',
'payment_status',
'seat',
];
public $timestamps = false;

public function flight()
{
return $this->belongsTo(Flight::class, 'id_flight');
}

public function user()
{
return $this->belongsTo(User::class, 'id_user');
}
}

5. User.php
<?php

namespace App\Models;

// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;

/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'id',
'role',
'name',
'email',
'password',
];

/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
'password',
'remember_token',
];

/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
'email_verified_at' => 'datetime',
'password' => 'hashed',
];
}
 

4. Routing

Web.php
<?php

use App\Http\Controllers\adminController;
use App\Http\Controllers\maskapaiController;
use App\Http\Controllers\ProfileController;
use App\Http\Controllers\userController;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "web" middleware group. Make something great!
|
*/

Route::get('/', function () {
return view('welcome');
});



Route::middleware('auth')->group(function () {
Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');
Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
Route::get('/ticket', [userController::class, 'index'])->name('ticket');
Route::get('/searchticket', [userController::class, 'searchticket'])->name('search.tickets');
Route::get('/buyticket/{id}', [userController::class, 'buyticket'])->name('buy.ticket');
Route::get('/addcustomer{id}', [userController::class, 'addcustomer'])->name('add.customer');
Route::post('/addctoticket', [userController::class, 'addctoticket'])->name('add.customer.toticket');
Route::post('/removecfromticket', [userController::class, 'removecfromticket'])->name('remove.customer.fromticket');
Route::post('/createcustomer/{id}', [userController::class, 'createcustomer'])->name('create.customer');
Route::post('/maketransaction/{id}', [userController::class, 'createtransaction'])->name('make.transaction');
Route::get('/booking', [userController::class, 'bookings'])->name('bookings');
Route::get('/cancelbooking/{id}', [userController::class, 'cancelbooking'])->name('cancel.booking');
Route::get('/payment/{id}', [userController::class, 'payment'])->name('pay.booking');
Route::get('/home', function () {return view('dashboard');})->name('dashboard');
});

Route::middleware('role:unvalidated')->group(function () {
Route::get('/unvalidated', [maskapaiController::class, 'indexUnvalidated'])->name('maskapai.unvalidated');
});

Route::middleware('role:maskapai')->group(function () {
Route::get('/maskapaidashboard', [maskapaiController::class, 'index'])->name('maskapai.dashboard');
Route::get('/addflight', [maskapaiController::class, 'create'])->name('add.flight');
Route::post('/storeflight', [maskapaiController::class, 'store'])->name('store.flight');
Route::get('/editflight/{id}', [maskapaiController::class, 'edit'])->name('edit.flight');
Route::post('/update', [maskapaiController::class, 'update'])->name('update.flight');
Route::get('/confirmtransaction', [maskapaiController::class, 'indexconfirmtransaction'])->name('transactions');
Route::get('/confirmtransaction/{id}', [maskapaiController::class, 'confirmtransaction'])->name('confirm.transaction');
Route::get('/declinetransaction/{id}', [maskapaiController::class, 'declinetransaction'])->name('decline.transaction');
Route::get('/reportts', [maskapaiController::class, 'transactionreport'])->name('transaction.report');
Route::get('/details/{id}', [maskapaiController::class, 'details'])->name('details');
Route::post('/deleteflight/{id}', [maskapaiController::class, 'destroy'])->name('delete.flight');
Route::get('/searchflight', [maskapaiController::class, 'searchflight'])->name('search.flight');
});
Route::middleware('role:admin')->group(function () {
Route::post('/approveairline', [adminController::class, 'store'])->name('admin.approve');
Route::post('/deleteairline', [adminController::class, 'destroy'])->name('admin.delete');
Route::get('/admindashboard', [adminController::class, 'getUnvalidatedAirline'])->name('admin.dashboard');
});

require __DIR__.'/auth.php';

5. View

register.blade.php
<x-guest-layout>
<form method="POST" action="{{ route('register') }}">
@csrf
<!-- Role Selection -->
<div>
<x-input-label for="role" :value="__('Daftar Sebagai')" />
<select id="role" class="block mt-1 w-full border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm" name="role" required>
<option value="unvalidated">Maskapai (Airline)</option>
<option value="user">User</option>
</select>
</div>
<!-- Name -->
<div class="mt-4">
<x-input-label for="name" :value="__('Name')" />
<x-text-input id="name" class="block mt-1 w-full" type="text" name="name" :value="old('name')" required autofocus autocomplete="name" />
<x-input-error :messages="$errors->get('name')" class="mt-2" />
</div>
<!-- Email Address -->
<div class="mt-4">
<x-input-label for="email" :value="__('Email')" />
<x-text-input id="email" class="block mt-1 w-full" type="email" name="email" :value="old('email')" required autocomplete="username" />
<x-input-error :messages="$errors->get('email')" class="mt-2" />
</div>
<!-- Password -->
<div class="mt-4">
<x-input-label for="password" :value="__('Password')" />
<x-text-input id="password" class="block mt-1 w-full" type="password" name="password" required autocomplete="new-password" />
<x-input-error :messages="$errors->get('password')" class="mt-2" />
</div>
<!-- Confirm Password -->
<div class="mt-4">
<x-input-label for="password_confirmation" :value="__('Confirm Password')" />
<x-text-input id="password_confirmation" class="block mt-1 w-full" type="password" name="password_confirmation" required autocomplete="new-password" />
<x-input-error :messages="$errors->get('password_confirmation')" class="mt-2" />
</div>
<div class="flex items-center justify-end mt-4">
<a class="underline text-sm text-gray-600 hover:text-gray-900 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500" href="{{ route('login') }}">
{{ __('Already registered?') }}
</a>
<x-primary-button class="ms-4">
{{ __('Register') }}
</x-primary-button>
</div>
</form>
</x-guest-layout>

login.blade.php
<x-guest-layout>
<!-- Session Status -->
<x-auth-session-status class="mb-4" :status="session('status')" />

<form method="POST" action="{{ route('login') }}">
@csrf

<!-- Email Address -->
<div>
<x-input-label for="email" :value="__('Email')" />
<x-text-input id="email" class="block mt-1 w-full" type="email" name="email" :value="old('email')" required autofocus autocomplete="username" />
<x-input-error :messages="$errors->get('email')" class="mt-2" />
</div>

<!-- Password -->
<div class="mt-4">
<x-input-label for="password" :value="__('Password')" />

<x-text-input id="password" class="block mt-1 w-full"
type="password"
name="password"
required autocomplete="current-password" />

<x-input-error :messages="$errors->get('password')" class="mt-2" />
</div>

<!-- Remember Me -->
<div class="block mt-4">
<label for="remember_me" class="inline-flex items-center">
<input id="remember_me" type="checkbox" class="rounded border-gray-300 text-indigo-600 shadow-sm focus:ring-indigo-500" name="remember">
<span class="ms-2 text-sm text-gray-600">{{ __('Remember me') }}</span>
</label>
</div>

<div class="flex items-center justify-end mt-4">
@if (Route::has('password.request'))
<a class="underline text-sm text-gray-600 hover:text-gray-900 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500" href="{{ route('password.request') }}">
{{ __('Forgot your password?') }}
</a>
@endif

<x-primary-button class="ms-3">
{{ __('Log in') }}
</x-primary-button>
</div>
</form>
</x-guest-layout>

Buat Folder admin dan maskapai pada resources/views

admin.blade.php
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}">

<title>{{ config('app.name', 'Laravel') }}</title>

<!-- Fonts -->
<link rel="preconnect" href="https://fonts.bunny.net">
<link href="https://fonts.bunny.net/css?family=figtree:400,500,600&display=swap" rel="stylesheet" />

<!-- Scripts -->
@vite(['resources/css/app.css', 'resources/js/app.js'])
</head>
<body class="font-sans antialiased">
<div class="min-h-screen bg-gray-100">
@include('admin.navigation')

<!-- Page Heading -->
@if (isset($header))
<header class="bg-white shadow">
<div class="max-w-7xl mx-auto py-6 px-4 sm:px-6 lg:px-8">
{{ $header }}
</div>
</header>
@endif

<!-- Page Content -->
<main>
@yield('content')
</main>
</div>
</body>
</html>

navigation.blade.php
<nav x-data="{ open: false }" class="bg-white border-b border-gray-100">
<!-- Primary Navigation Menu -->
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex justify-between h-16">
<div class="flex">
<!-- Logo -->
<div class="shrink-0 flex items-center">
<a href="{{ route('admin.dashboard') }}">
<x-application-logo class="block h-9 w-auto fill-current text-gray-800" />
</a>
</div>

<!-- Navigation Links -->
<div class="hidden space-x-8 sm:-my-px sm:ms-10 sm:flex">
<x-nav-link :href="route('admin.dashboard')" :active="request()->routeIs('admin.dashboard')">
{{ __('Dashboard Admin') }}
</x-nav-link>
</div>
</div>

<!-- Settings Dropdown -->
<div class="hidden sm:flex sm:items-center sm:ms-6">
<x-dropdown align="right" width="48">
<x-slot name="trigger">
<button class="inline-flex items-center px-3 py-2 border border-transparent text-sm leading-4 font-medium rounded-md text-gray-500 bg-white hover:text-gray-700 focus:outline-none transition ease-in-out duration-150">
<div>{{ Auth::user()->name }}</div>

<div class="ms-1">
<svg class="fill-current h-4 w-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd" />
</svg>
</div>
</button>
</x-slot>

<x-slot name="content">
<x-dropdown-link :href="route('profile.edit')">
{{ __('Profile') }}
</x-dropdown-link>

<!-- Authentication -->
<form method="POST" action="{{ route('logout') }}">
@csrf

<x-dropdown-link :href="route('logout')"
onclick="event.preventDefault();
this.closest('form').submit();">
{{ __('Log Out') }}
</x-dropdown-link>
</form>
</x-slot>
</x-dropdown>
</div>

<!-- Hamburger -->
<div class="-me-2 flex items-center sm:hidden">
<button @click="open = ! open" class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 focus:text-gray-500 transition duration-150 ease-in-out">
<svg class="h-6 w-6" stroke="currentColor" fill="none" viewBox="0 0 24 24">
<path :class="{'hidden': open, 'inline-flex': ! open }" class="inline-flex" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
<path :class="{'hidden': ! open, 'inline-flex': open }" class="hidden" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
</svg>
</button>
</div>
</div>
</div>

<!-- Responsive Navigation Menu -->
<div :class="{'block': open, 'hidden': ! open}" class="hidden sm:hidden">
<div class="pt-2 pb-3 space-y-1">
<x-responsive-nav-link :href="route('admin.dashboard')" :active="request()->routeIs('admin.dashboard')">
{{ __('Admin Dashboard') }}
</x-responsive-nav-link>
</div>

<!-- Responsive Settings Options -->
<div class="pt-4 pb-1 border-t border-gray-200">
<div class="px-4">
<div class="font-medium text-base text-gray-800">{{ Auth::user()->name }}</div>
<div class="font-medium text-sm text-gray-500">{{ Auth::user()->email }}</div>
</div>

<div class="mt-3 space-y-1">
<x-responsive-nav-link :href="route('profile.edit')">
{{ __('Profile') }}
</x-responsive-nav-link>

<!-- Authentication -->
<form method="POST" action="{{ route('logout') }}">
@csrf

<x-responsive-nav-link :href="route('logout')"
onclick="event.preventDefault();
this.closest('form').submit();">
{{ __('Log Out') }}
</x-responsive-nav-link>
</form>
</div>
</div>
</div>
</nav>


approve.blade.php
@extends('admin.admin')
@section('content')
<x-slot name="header">
<h2 class="font-semibold text-xl text-gray-800 leading-tight">
{{ __('Approve Airline') }}
</h2>
</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">
<h1 class="text-2xl font-semibold mb-6">Unvalidated Airlines</h1>
@foreach ($unvalidatedAirline as $airline)
<div class="max-w-md mx-auto bg-white shadow-lg rounded-lg overflow-hidden border border-gray-300 mb-4">
<div class="px-6 py-4">
<div class="font-bold text-xl mb-2">{{ $airline->name }}</div>
<p class="text-gray-700 text-base">{{ $airline->role }}</p>
</div>
<div class="px-6 py-4">
<form action="{{ route('admin.approve') }}" method="post">
@csrf
<input type="hidden" name="id" value="{{ $airline->id }}">
<input type="hidden" name="name" value="{{ $airline->name }}">
<x-primary-button type="submit">
Approve
</x-primary-button>
</form>
</div>
</div>
@endforeach
</div>
</div>
</div>
</div>

<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">
<h1 class="text-2xl font-semibold mb-6">Validated Airlines</h1>
@foreach ($validatedAirline as $airline)
<div class="max-w-md mx-auto bg-white shadow-lg rounded-lg overflow-hidden border border-gray-300 mb-4">
<div class="px-6 py-4">
<div class="font-bold text-xl mb-2">{{ $airline->name }}</div>
<p class="text-gray-700 text-base">{{ $airline->role }}</p>
</div>
<div class="px-6 py-4">
<form action="{{ route('admin.delete') }}" method="post">
@csrf
<input type="hidden" name="id" value="{{ $airline->id }}">
<x-danger-button type="submit" class="ml-3">
Delete Airline
</x-danger-button>
</form>
</div>
</div>
@endforeach
</div>
</div>
</div>
</div>
@endsection



Comments

Popular posts from this blog

Crud Laravel Single Field

Basic Android Studio dengan JAVA