From 1539b70ae4c5100d40826602bbfcd58314c268f4 Mon Sep 17 00:00:00 2001 From: Windows Store Date: Wed, 19 Aug 2026 19:19:03 +0330 Subject: [PATCH] feat: add tour list and show and edit and delete tours in admin panel --- app/Http/Controllers/Admin/TourController.php | 84 ++++++ .../Requests/Tours/TourUpdatePostRequest.php | 66 +++++ app/Models/Tour.php | 3 +- app/Models/TourDetail.php | 7 +- resources/views/admin/dashboard.blade.php | 6 +- resources/views/admin/tours/edit.blade.php | 245 ++++++++++++++++++ resources/views/admin/tours/index.blade.php | 132 ++++++++++ .../views/dashboard/layouts/sidebar.blade.php | 2 +- resources/views/dashboard/setting.blade.php | 2 +- resources/views/index.blade.php | 220 ---------------- resources/views/layouts/app.blade.php | 32 ++- resources/views/layouts/navbar.blade.php | 6 +- routes/admins.php | 36 ++- 13 files changed, 594 insertions(+), 247 deletions(-) create mode 100644 app/Http/Controllers/Admin/TourController.php create mode 100644 app/Http/Requests/Tours/TourUpdatePostRequest.php create mode 100644 resources/views/admin/tours/edit.blade.php create mode 100644 resources/views/admin/tours/index.blade.php diff --git a/app/Http/Controllers/Admin/TourController.php b/app/Http/Controllers/Admin/TourController.php new file mode 100644 index 0000000..8d70d64 --- /dev/null +++ b/app/Http/Controllers/Admin/TourController.php @@ -0,0 +1,84 @@ +latest() + ->paginate(10); + + return view('admin.tours.index', compact('tours')); + } + public function edit(Tour $tour) + { + $airports = Airport::all(); + + $tour->load([ + 'tour_details', + 'originAirport', + 'destinationAirport', + 'file', + ]); + + return view('admin.tours.edit', compact('tour' , 'airports')); + } + + /** + * @throws \Exception + */ + public function update(TourUpdatePostRequest $request, Tour $tour) + { + $tour->update([ + 'title' => $request->title, + 'tour_type' => $request->tour_type, + 'summary' => $request->summary, + 'description' => $request->description, + 'origin_airports_id' => $request->origin_airports_id, + 'destination_airports_id' => $request->destination_airports_id, + ]); + + $tourDetail = $tour->tour_details()->first(); + + if ($tourDetail) { + + $startDate = Verta::parseFormat('Y/m/d', $request->start_date)->datetime(); + + $endDate = Verta::parseFormat('Y/m/d', $request->end_date)->datetime(); + + $tourDetail->update([ + 'start_date' => $startDate, + 'end_date' => $endDate, + ]); + } + + return redirect() + ->route('admin.tours.index') + ->with('success', 'تور با موفقیت بروزرسانی شد.'); + } + public function destroy(Tour $tour) + { + $tour->tour_details()->delete(); + + $tour->delete(); + + return redirect() + ->route('admin.tours.index') + ->with('success', 'تور با موفقیت حذف شد.'); + } +} diff --git a/app/Http/Requests/Tours/TourUpdatePostRequest.php b/app/Http/Requests/Tours/TourUpdatePostRequest.php new file mode 100644 index 0000000..c26dd4d --- /dev/null +++ b/app/Http/Requests/Tours/TourUpdatePostRequest.php @@ -0,0 +1,66 @@ +|string> + */ + public function rules(): array + { + return [ + + 'title' => [ + 'required', + 'string', + 'min:3', + 'max:150', + ], + + 'file_id' => [ + 'nullable', + 'exists:files,id', + ], + + 'tour_type' => [ + 'required', + 'string', + 'max:255', + ], + + 'summary' => [ + 'required', + 'string', + ], + + 'description' => [ + 'required', + 'string', + ], + + 'origin_airports_id' => [ + 'required', + 'exists:airports,id', + ], + + 'destination_airports_id' => [ + 'required', + 'exists:airports,id', + ], + ]; + } +} diff --git a/app/Models/Tour.php b/app/Models/Tour.php index 4355e98..98b9c2c 100644 --- a/app/Models/Tour.php +++ b/app/Models/Tour.php @@ -9,7 +9,7 @@ namespace App\Models; use Carbon\Carbon; use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Model; - +use Illuminate\Database\Eloquent\SoftDeletes; /** * Class Tour * @@ -33,6 +33,7 @@ use Illuminate\Database\Eloquent\Model; */ class Tour extends Model { + use SoftDeletes; /** * @var float|mixed|null */ diff --git a/app/Models/TourDetail.php b/app/Models/TourDetail.php index decad16..0dfb435 100644 --- a/app/Models/TourDetail.php +++ b/app/Models/TourDetail.php @@ -8,10 +8,10 @@ namespace App\Models; use Carbon\Carbon; use Illuminate\Database\Eloquent\Model; - +use Illuminate\Database\Eloquent\SoftDeletes; /** * Class TourDetail - * + * * @property int $id * @property int $tour_id * @property Carbon $start_date @@ -21,13 +21,14 @@ use Illuminate\Database\Eloquent\Model; * @property int $status * @property Carbon $created_at * @property Carbon $updated_at - * + * * @property Tour $tour * * @package App\Models */ class TourDetail extends Model { + use SoftDeletes; protected $table = 'tour_details'; protected $casts = [ diff --git a/resources/views/admin/dashboard.blade.php b/resources/views/admin/dashboard.blade.php index bfa42be..d0e2c6f 100644 --- a/resources/views/admin/dashboard.blade.php +++ b/resources/views/admin/dashboard.blade.php @@ -25,7 +25,7 @@ تعداد تور
- +
@@ -33,10 +33,10 @@

{{$totalFlights}} عدد

- تعداد پرواز ها + تعداد پرواز ها
- +
diff --git a/resources/views/admin/tours/edit.blade.php b/resources/views/admin/tours/edit.blade.php new file mode 100644 index 0000000..91fd3df --- /dev/null +++ b/resources/views/admin/tours/edit.blade.php @@ -0,0 +1,245 @@ +@extends('dashboard.layouts.app') + +@section('title','ویرایش تور') + +@section('account-content') + +
+ + @if(session('success')) +
+
+ {{session('success')}} +
+
+ @endif + +
+ +
+ +
+ +@endsection + + +@section('scripts') + + + +@endsection diff --git a/resources/views/admin/tours/index.blade.php b/resources/views/admin/tours/index.blade.php new file mode 100644 index 0000000..81cc825 --- /dev/null +++ b/resources/views/admin/tours/index.blade.php @@ -0,0 +1,132 @@ +@extends('dashboard.layouts.app') + +@section('title', 'لیست تورها') + +@section('account-content') + +
+ + @if(session('success')) +
+
+ {{ session('success') }} +
+
+ @endif + +
+ +
+ +
+ +@endsection diff --git a/resources/views/dashboard/layouts/sidebar.blade.php b/resources/views/dashboard/layouts/sidebar.blade.php index 3a61b49..603b71f 100644 --- a/resources/views/dashboard/layouts/sidebar.blade.php +++ b/resources/views/dashboard/layouts/sidebar.blade.php @@ -59,7 +59,7 @@
  • - + مدیریت تورها diff --git a/resources/views/dashboard/setting.blade.php b/resources/views/dashboard/setting.blade.php index 01c50fe..c63fb75 100644 --- a/resources/views/dashboard/setting.blade.php +++ b/resources/views/dashboard/setting.blade.php @@ -71,7 +71,7 @@
    - + @error('user_city') diff --git a/resources/views/index.blade.php b/resources/views/index.blade.php index 1070a5c..cc3addb 100644 --- a/resources/views/index.blade.php +++ b/resources/views/index.blade.php @@ -120,226 +120,6 @@
    -
    -
    -
    -
    -
    - توصیه ها و گواهینامه -

    لورم ایپسوم متن ساختگی با تولید سادگی است.

    -

    انواع مختلفی از عبارات بر خلاف باور عمومی موجود است اما - اکثریت با طنز تزریق شده یا کلمات تصادفی به نوعی دچار تغییر شده اند - که حتی کمی به نظر نمی رسد از یک گذرگاه باورنکردنی استفاده کنید.

    - کاوش کردن بیشتر -
    -
    -
    - -
    -
    -
    -
    - @endsection diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 902a09d..26aa02c 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -1,4 +1,3 @@ - @@ -23,7 +22,13 @@ + + {{-- Persian Datepicker --}} + + +
    @@ -53,20 +58,32 @@
    -@includeUnless(isset($withoutHeader) , 'layouts.header') +@includeUnless(isset($withoutHeader), 'layouts.header') +
    @yield('content')
    -@includeUnless(isset($withoutFooter) , 'layouts.footer') +@includeUnless(isset($withoutFooter), 'layouts.footer') - + + + + + +{{-- jQuery فقط یک بار --}} + + +{{-- Persian Date --}} + + +{{-- Persian Datepicker --}} + - @@ -82,6 +99,9 @@ + + +@yield('scripts') + - diff --git a/resources/views/layouts/navbar.blade.php b/resources/views/layouts/navbar.blade.php index e4627d2..e6fa56b 100644 --- a/resources/views/layouts/navbar.blade.php +++ b/resources/views/layouts/navbar.blade.php @@ -41,18 +41,18 @@
  • - +
    diff --git a/routes/admins.php b/routes/admins.php index ca6d533..0e3515c 100644 --- a/routes/admins.php +++ b/routes/admins.php @@ -1,17 +1,18 @@ name('admin.')->group(function () { Route::controller(LoginController::class)->middleware('admin.guest')->group(function () { - Route::get('login', 'index')->name('login'); - Route::post('login', 'login')->name('login.post'); - }); + Route::get('login', 'index')->name('login'); + Route::post('login', 'login')->name('login.post'); + }); Route::middleware('admin.auth')->group(function () { Route::post('logout', [LoginController::class, 'logout'])->name('logout'); Route::get('dashboard', [DashboardController::class, 'index'])->name('dashboard'); @@ -25,11 +26,28 @@ Route::prefix('admin')->name('admin.')->group(function () { }); Route::prefix('admins')->controller(AdminController::class)->name('admins.')->group(function () { - Route::get('/', 'index')->name('index'); - Route::get('{admin}/edit', 'edit')->name('edit'); - Route::put('{admin}', 'update')->name('update'); - Route::delete('{admin}', 'destroy')->name('destroy'); - }); + Route::get('/', 'index')->name('index'); + Route::get('{admin}/edit', 'edit')->name('edit'); + Route::put('{admin}', 'update')->name('update'); + Route::delete('{admin}', 'destroy')->name('destroy'); + }); + Route::prefix('tours')->controller(TourController::class)->name('tours.')->group(function () { + + Route::get('/', 'index')->name('index'); + + Route::get('create', 'create')->name('create'); + + Route::post('/', 'store')->name('store'); + + Route::get('{tour}', 'show')->name('show'); + + Route::get('{tour}/edit', 'edit')->name('edit'); + + Route::put('{tour}', 'update')->name('update'); + + Route::delete('{tour}', 'destroy')->name('destroy'); + + }); });