From 2f431971c09684a8a3d19549909d4711feb213fb Mon Sep 17 00:00:00 2001 From: hatame Date: Sat, 22 Aug 2026 11:14:07 +0330 Subject: [PATCH] git add . git commit "Complete project development and finalize features" --- .../Admin/ActivityLogController.php | 3 +- .../Controllers/Admin/Auth/AuthController.php | 5 +- .../Controllers/Admin/FlightController.php | 18 ---- .../Controllers/Admin/ProvinceController.php | 19 ---- app/Http/Controllers/Admin/RoleController.php | 2 - .../Controllers/Admin/SettingController.php | 6 -- app/Http/Controllers/Admin/TourController.php | 20 ----- app/Http/Controllers/Admin/UserController.php | 2 - app/Http/Controllers/Auth/LoginController.php | 1 - .../Controllers/Auth/LogoutController.php | 1 - .../Controllers/Auth/RegisterController.php | 3 - app/Http/Controllers/FavoriteController.php | 5 -- app/Http/Controllers/FlightController.php | 12 +-- app/Http/Controllers/HomeController.php | 7 +- .../Controllers/ReservationController.php | 6 +- app/Http/Controllers/TourController.php | 6 +- .../Requests/Admin/FlightStoreRequest.php | 36 +++++--- public/uploads/users/1787382448.jpg | Bin 0 -> 17393 bytes resources/views/account/layout/app.blade.php | 44 +++++++--- .../account/users/Reservation/index.blade.php | 52 +---------- .../views/account/users/dashboard.blade.php | 27 ------ .../account/users/favorite/index.blade.php | 1 - .../account/users/profile/edit.blade.php | 46 ---------- .../views/admin/activityLog/index.blade.php | 56 ++---------- resources/views/admin/admins/create.blade.php | 8 -- resources/views/admin/admins/edit.blade.php | 16 ---- resources/views/admin/admins/index.blade.php | 16 ---- resources/views/admin/auth/login.blade.php | 18 ---- resources/views/auth/login.blade.php | 83 ++++++------------ resources/views/auth/register.blade.php | 52 ++++------- resources/views/components/flight.blade.php | 10 +-- resources/views/components/tour.blade.php | 17 ---- resources/views/flights/index.blade.php | 41 --------- resources/views/flights/show.blade.php | 5 +- resources/views/home/index.blade.php | 1 - resources/views/layouts/footer.blade.php | 29 +----- resources/views/layouts/header.blade.php | 19 +--- resources/views/layouts/hero.blade.php | 16 +--- resources/views/tours/index.blade.php | 21 ----- resources/views/tours/show.blade.php | 33 ------- 40 files changed, 126 insertions(+), 637 deletions(-) create mode 100644 public/uploads/users/1787382448.jpg diff --git a/app/Http/Controllers/Admin/ActivityLogController.php b/app/Http/Controllers/Admin/ActivityLogController.php index 4e523b3..2572782 100644 --- a/app/Http/Controllers/Admin/ActivityLogController.php +++ b/app/Http/Controllers/Admin/ActivityLogController.php @@ -8,8 +8,7 @@ use Illuminate\Http\Request; class ActivityLogController extends Controller { - // - public function index() + public function index() { $logs=ActivityLog::with('admin') ->latest() diff --git a/app/Http/Controllers/Admin/Auth/AuthController.php b/app/Http/Controllers/Admin/Auth/AuthController.php index e90a69b..10b4f07 100644 --- a/app/Http/Controllers/Admin/Auth/AuthController.php +++ b/app/Http/Controllers/Admin/Auth/AuthController.php @@ -18,20 +18,21 @@ class AuthController extends Controller } public function loginPost(LoginPostRequest $request) { - $loginData=$request->validated(); + $login=$request->validated(); $admins=Admin::query() ->where('username',$request->input('username')) ->where('status',AdminStatus::Active) ->first(); - if (!$admins){ + if (!$admins || !\Hash::check($login['password'],$admins->password)){ return back()->withErrors([ 'general' => 'اطلاعات وارد شده نامعتبر است' ]); } Auth::guard('admin')->login($admins); + $request->session()->regenerate(); return redirect()->route('admin.dashboard.index'); } diff --git a/app/Http/Controllers/Admin/FlightController.php b/app/Http/Controllers/Admin/FlightController.php index 62ccdac..9eb39b5 100644 --- a/app/Http/Controllers/Admin/FlightController.php +++ b/app/Http/Controllers/Admin/FlightController.php @@ -24,14 +24,10 @@ class FlightController extends Controller return view('admin.flights.index', compact('flights')); } - - public function create() { return view('admin.flights.create'); } - - public function store(FlightStoreRequest $request) { DB::beginTransaction(); @@ -46,8 +42,6 @@ class FlightController extends Controller )->formatGregorian('Y-m-d'); } - - if ($request->hasFile('image')) { $data['image'] = $request @@ -70,7 +64,6 @@ class FlightController extends Controller DB::commit(); - return redirect() ->route('admin.flights.index') ->with('success','پرواز ثبت شد'); @@ -84,14 +77,10 @@ class FlightController extends Controller } } - - - public function edit(Flight $flight) { return view('admin.flights.edit',compact('flight')); } - public function update(FlightStoreRequest $request, Flight $flight) { @@ -118,12 +107,9 @@ class FlightController extends Controller ->delete($flight->image); } - - $data['image'] = $request ->file('image') ->store('flights','public'); - } $data['updated_by'] = auth('admin')->id(); @@ -140,12 +126,10 @@ class FlightController extends Controller DB::commit(); - return redirect() ->route('admin.flights.index') ->with('success','پرواز ویرایش شد'); - }catch(\Exception $e){ DB::rollBack(); @@ -155,7 +139,6 @@ class FlightController extends Controller } } - public function destroy(Flight $flight) { @@ -179,6 +162,5 @@ class FlightController extends Controller return back() ->with('success','پرواز حذف شد'); - } } diff --git a/app/Http/Controllers/Admin/ProvinceController.php b/app/Http/Controllers/Admin/ProvinceController.php index af390ed..629b2f1 100644 --- a/app/Http/Controllers/Admin/ProvinceController.php +++ b/app/Http/Controllers/Admin/ProvinceController.php @@ -8,7 +8,6 @@ use Illuminate\Http\Request; class ProvinceController extends Controller { - public function index() { $provinces = Province::latest()->paginate(5); @@ -16,15 +15,11 @@ class ProvinceController extends Controller return view('admin.provinces.index', compact('provinces')); } - - public function create() { return view('admin.provinces.create'); } - - public function store(Request $request) { @@ -42,41 +37,27 @@ class ProvinceController extends Controller ->route('admin.provinces.index'); } - - public function edit(Province $province) { return view('admin.provinces.edit',compact('province')); } - - public function update(Request $request, Province $province) { $request->validate([ 'name'=>'required' ]); - - $province->update([ 'name'=>$request->name ]); - - return redirect() ->route('admin.provinces.index'); } - - public function destroy(Province $province) { - $province->delete(); - - return back(); } - } diff --git a/app/Http/Controllers/Admin/RoleController.php b/app/Http/Controllers/Admin/RoleController.php index db98581..4bbf221 100644 --- a/app/Http/Controllers/Admin/RoleController.php +++ b/app/Http/Controllers/Admin/RoleController.php @@ -26,7 +26,5 @@ class RoleController extends Controller return redirect()->back()->with('success','دسترسی‌ها با موفقیت ذخیره شد'); } - - } diff --git a/app/Http/Controllers/Admin/SettingController.php b/app/Http/Controllers/Admin/SettingController.php index 3b91f20..5a090bc 100644 --- a/app/Http/Controllers/Admin/SettingController.php +++ b/app/Http/Controllers/Admin/SettingController.php @@ -18,14 +18,12 @@ class SettingController extends Controller return view('admin.settings.index', compact('settings')); } - public function create() { $settings = Setting::all(); return view('admin.settings.create',compact('settings')); } - public function store(SettingStoreRequest $request) { Setting::create($request->validated()); @@ -36,18 +34,14 @@ class SettingController extends Controller public function edit(Setting $setting) { return view('admin.settings.edit', compact('setting')); - } - public function update(SettingUpdateRequest $request,Setting $setting) { - $setting->update($request->validated()); return redirect() ->route('admin.settings.index') ->with('success', 'تنظیمات با موفقیت ویرایش شد.'); - } public function destroy(Setting $setting) diff --git a/app/Http/Controllers/Admin/TourController.php b/app/Http/Controllers/Admin/TourController.php index 530e011..8d45415 100644 --- a/app/Http/Controllers/Admin/TourController.php +++ b/app/Http/Controllers/Admin/TourController.php @@ -25,15 +25,10 @@ class TourController extends Controller return view('admin.tours.index', compact('tours')); } - - public function create() { - return view('admin.tours.create' ); } - - public function store(TourStoreRequest $request) { DB::beginTransaction(); @@ -49,7 +44,6 @@ class TourController extends Controller )->formatGregorian('Y-m-d'); } - if ($request->hasFile('image')) { $data['image'] = $request @@ -69,8 +63,6 @@ class TourController extends Controller 'model_id' => $tour->id, 'description' => 'ثبت تور جدید', ]); - - DB::commit(); @@ -78,7 +70,6 @@ class TourController extends Controller ->route('admin.tours.index') ->with('success','تور ثبت شد'); - } catch(\Exception $e) { DB::rollBack(); @@ -92,8 +83,6 @@ class TourController extends Controller return view('admin.tours.edit',compact('tour')); } - - public function update(TourStoreRequest $request, Tour $tour) { @@ -121,7 +110,6 @@ class TourController extends Controller } - $data['image'] = $request ->file('image') ->store('tours','public'); @@ -139,15 +127,12 @@ class TourController extends Controller 'description' => 'ویرایش تور', ]); - DB::commit(); - return redirect() ->route('admin.tours.index') ->with('success','تور ویرایش شد'); - }catch(\Exception $e){ DB::rollBack(); @@ -155,12 +140,10 @@ class TourController extends Controller dd($e->getMessage()); } - } public function destroy(Tour $tour) { - if($tour->image){ Storage::disk('public') @@ -176,12 +159,9 @@ class TourController extends Controller 'description' => 'حذف تور', ]); - $tour->delete(); - return back() ->with('success','تور حذف شد'); - } } diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 66ff969..c3bf8a7 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -49,7 +49,5 @@ class UserController extends Controller $user->update(['password'=>Hash::make($request->password)]); return back(); - - } } diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index 662558a..ef47ebd 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -18,7 +18,6 @@ class LoginController extends Controller return view('auth.login',compact('withoutHeader','withoutHero','withoutFooter')); } - public function post(LoginPostRequest $request) { $user = $request->validated(); diff --git a/app/Http/Controllers/Auth/LogoutController.php b/app/Http/Controllers/Auth/LogoutController.php index 948af54..b8107ee 100644 --- a/app/Http/Controllers/Auth/LogoutController.php +++ b/app/Http/Controllers/Auth/LogoutController.php @@ -16,6 +16,5 @@ class LogoutController extends Controller Request()->session()->regenerateToken(); return redirect()->route('index'); - } } diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index 78b41ed..9d4eec1 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -40,8 +40,6 @@ class RegisterController extends Controller $inputs['profile_image'] = $imageName; } - - $inputs['password']=Hash::make($inputs['password']); $inputs['status']=UserStatus::Draft; @@ -51,6 +49,5 @@ class RegisterController extends Controller return redirect()->route('index'); - } } diff --git a/app/Http/Controllers/FavoriteController.php b/app/Http/Controllers/FavoriteController.php index 2fbdd6b..23b028b 100644 --- a/app/Http/Controllers/FavoriteController.php +++ b/app/Http/Controllers/FavoriteController.php @@ -25,20 +25,15 @@ class FavoriteController extends Controller 'favoritable_id' => $request->id, ]); - return back(); } - - public function destroy(Favorite $favorite) { - $favorite->delete(); return back()->with( 'success', 'تور از علاقه‌مندی‌ها حذف شد.' ); - } } diff --git a/app/Http/Controllers/FlightController.php b/app/Http/Controllers/FlightController.php index bf53bca..5cbf0ce 100644 --- a/app/Http/Controllers/FlightController.php +++ b/app/Http/Controllers/FlightController.php @@ -15,26 +15,19 @@ class FlightController extends Controller ->applySearch($request->all()) ->paginate(10); - $newestFlight = Flight::latest() ->take(3) ->get(); - $newestTour = Tour::latest() ->take(3) ->get(); - $tours = Tour::latest() ->paginate(10); - - return view('flights.index', compact( - 'flights', - 'newestFlight', - 'newestTour', - 'tours' + return view('flights.index', compact('flights', 'newestFlight', + 'newestTour', 'tours' )); } public function show(Flight $flight) @@ -48,7 +41,6 @@ class FlightController extends Controller ->latest() ->get(); - return view('flights.show', compact('flight', 'comments')); } diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 36d55ce..860a466 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -24,11 +24,8 @@ class HomeController extends Controller $tours = Tour::latest() ->paginate(5); - return view('home.index', compact( - 'newestFlight', - 'newestTour', - 'flights', - 'tours' + return view('home.index', compact('newestFlight', + 'newestTour', 'flights', 'tours' )); } } diff --git a/app/Http/Controllers/ReservationController.php b/app/Http/Controllers/ReservationController.php index 193fa05..ab21053 100644 --- a/app/Http/Controllers/ReservationController.php +++ b/app/Http/Controllers/ReservationController.php @@ -16,11 +16,8 @@ class ReservationController extends Controller ->latest() ->get(); - return view('account.users.Reservation.index', compact('reservations')); - } - public function store(Request $request) { @@ -32,6 +29,7 @@ class ReservationController extends Controller 'status' => 'pending' ]); - return redirect()->route('users.reservations.index')->with('success','رزرو شما ثبت شد.'); } + return redirect()->route('users.reservations.index') + ->with('success','رزرو شما ثبت شد.'); } } diff --git a/app/Http/Controllers/TourController.php b/app/Http/Controllers/TourController.php index 0ff27b8..85cc8e3 100644 --- a/app/Http/Controllers/TourController.php +++ b/app/Http/Controllers/TourController.php @@ -17,9 +17,8 @@ class TourController extends Controller ->latest() ->paginate(2); - return view('tours.index', compact('tours')) - ->with('withoutHero', true); } - + return view('tours.index', compact('tours', 'newestTour')); + } public function show(Tour $tour) { @@ -33,7 +32,6 @@ class TourController extends Controller ->latest() ->get(); - return view('tours.show', compact('tour','comments')); } } diff --git a/app/Http/Requests/Admin/FlightStoreRequest.php b/app/Http/Requests/Admin/FlightStoreRequest.php index d53c449..2d65fb8 100644 --- a/app/Http/Requests/Admin/FlightStoreRequest.php +++ b/app/Http/Requests/Admin/FlightStoreRequest.php @@ -16,6 +16,27 @@ class FlightStoreRequest extends FormRequest return true; } + protected function prepareForValidation() + { + if ($this->departure_date) { + + try { + + $this->merge([ + 'departure_date' => verta($this->departure_date) + ->formatGregorian('Y-m-d') + ]); + + } catch (\Exception $e) { + + $this->merge([ + 'departure_date' => null + ]); + + } + + } + } /** * Get the validation rules that apply to the request. * @@ -46,20 +67,7 @@ class FlightStoreRequest extends FormRequest ], 'departure_date' => [ 'required', - function ($attribute, $value, $fail) { - - try { - $gregorian = Verta::parse($value) - ->formatGregorian('Y-m-d'); - } catch (\Exception $e) { - $fail('تاریخ حرکت معتبر نیست.'); - return; - } - - if ($gregorian < now()->format('Y-m-d')) { - $fail('تاریخ حرکت نمی‌تواند قبل از تاریخ امروز باشد.'); - } - }, + 'date' ], 'departure_time' => [ 'required', diff --git a/public/uploads/users/1787382448.jpg b/public/uploads/users/1787382448.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1c2daa202b52b84757355c6ceac73040d1336c41 GIT binary patch literal 17393 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