git commit "Complete today's development"

This commit is contained in:
2026-08-16 16:56:21 +03:30
parent 6302570d75
commit 043b6ed931
17 changed files with 1107 additions and 825 deletions
+7 -3
View File
@@ -10,8 +10,12 @@ class CityController extends Controller
//
public function getCities($province)
{
return City::where('province_id', $province)
$cities = City::where('province_id',$province)
->orderBy('name')
->get();
}
}
return response()->json($cities);
}}
+30
View File
@@ -0,0 +1,30 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\FlightSearchRequest;
use App\Models\Flight;
class FlightController extends Controller
{
public function search(FlightSearchRequest $request)
{
$filters = $request->validated();
$flights = Flight::query()
->applySearch($filters)
->get();
return view('flights.search', compact('flights'));
}
public function archive()
{
$flights = Flight::query()
->latest()
->paginate(12);
return view('flights.archive', compact('flights'));
}
}
+7 -3
View File
@@ -2,13 +2,17 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Flight;
class HomeController extends Controller
{
//
public function index()
{
return view('layouts.app');
$latestFlights = Flight::query()
->latest()
->take(6)
->get();
return view('home.index', compact('latestFlights'));
}
}
+46
View File
@@ -0,0 +1,46 @@
<?php
namespace App\Http\Requests;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class FlightSearchRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'origin' =>
[
'required',
],
'destination' =>
[
'required',
],
'departure_date' =>
[
'required',
'date',
],
'passengers' =>
[ 'required',
'integer',
'min:1',
],
]; }
}
+6 -2
View File
@@ -12,13 +12,13 @@ use Illuminate\Database\Eloquent\Model;
/**
* Class City
*
*
* @property int $id
* @property int $provinces
* @property string $name
* @property Carbon $created_at
* @property Carbon $updated_at
*
*
* @property Collection|User[] $users
*
* @package App\Models
@@ -41,4 +41,8 @@ class City extends Model
{
return $this->hasMany(User::class);
}
public function province()
{
return $this->hasMany(Province::class);
}
}
+21 -1
View File
@@ -7,11 +7,13 @@
namespace App\Models;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
/**
* Class Flight
*
*
* @property int $id
* @property string|null $airline
* @property string|null $flight_number
@@ -56,4 +58,22 @@ class Flight extends Model
'price',
'status'
];
#[Scope]
public function applySearch(Builder $query, array $filters): void
{
$query
->when($filters['origin'] ?? null, function ($query, $origin) {
$query->where('origin', $origin);
})
->when($filters['destination'] ?? null, function ($query, $destination) {
$query->where('destination', $destination);
})
->when($filters['departure_date'] ?? null, function ($query, $date) {
$query->whereDate('departure_date', $date);
})
->when($filters['passengers'] ?? null, function ($query, $passengers) {
$query->where('capacity', '>=', $passengers);
});
}
}
+4
View File
@@ -32,5 +32,9 @@ class Province extends Model
{
return $this->hasMany(User::class);
}
public function cities()
{
return $this->hasMany(City::class);
}
}
+9 -1
View File
@@ -2,6 +2,7 @@
namespace App\Providers;
use App\Models\Province;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
@@ -19,6 +20,13 @@ class AppServiceProvider extends ServiceProvider
*/
public function boot(): void
{
//
\Illuminate\Support\Facades\View::composer('layouts.hero', function ($view) {
$provinces = Province::orderBy('name')->get();
$view->with('provinces', $provinces);
});
}
}
@@ -0,0 +1,26 @@
<?php
namespace App\View\Components\Home;
use Closure;
use Illuminate\Contracts\View\View;
use Illuminate\View\Component;
class LatestFlights extends Component
{
/**
* Create a new component instance.
*/
public function __construct()
{
//
}
/**
* Get the view / contents that represent the component.
*/
public function render(): View|Closure|string
{
return view('components.home.latest-flights');
}
}
+107 -355
View File
@@ -1,361 +1,113 @@
'use strict';
$(document).ready(function () {
var mobileViewport = 992;
var isSafari = navigator.userAgent.indexOf("Safari") > -1;
var isChrome = navigator.userAgent.indexOf('Chrome') > -1;
if((isSafari) && (isChrome)) {
isSafari = false;
}
$(document).ready(function(){
OwlCarousel();
$('#origin_province').on('change', function () {
$('.blur-area').blurArea();
$('.ws-action').windowScrollAction();
checkboxes();
afternavHeight();
activeBookmark();
magnificLightbox();
priceSlider();
BSTabsActions();
heroSearchSections();
$('.quantity-selector').quantitySelector();
autocomplete();
searchResultsCollapse();
comingSoonCountdown();
smoothScroll();
let provinceId = $(this).val();
$('#origin_city').html(
'<option value="">در حال دریافت...</option>'
);
if(provinceId){
$.ajax({
url: '/users/cities/' + provinceId,
type: 'GET',
success:function (cities) {
$('#origin_city').empty();
$('#origin_city').append(
'<option value="">انتخاب شهر</option>'
);
$.each(cities,function(index,city){
$('#origin_city').append(
`<option value="${city.id}">
${city.name}
</option>`
);
});
}
});
}
});
$('#destination_province').on('change', function () {
let provinceId = $(this).val();
$('#destination_city').html(
'<option value="">در حال دریافت...</option>'
);
if(provinceId){
$.ajax({
url:'/users/cities/' + provinceId,
type:'GET',
success:function(cities){
$('#destination_city').empty();
$('#destination_city').append(
'<option value="">انتخاب شهر</option>'
);
$.each(cities,function(index,city){
$('#destination_city').append(
`<option value="${city.id}">
${city.name}
</option>`
);
});
}
});
}
});
if($(window).width() > mobileViewport) {
YouTubeVideo();
stickySidebars();
}
if($(window).width() < mobileViewport) {
mobileFilters();
}
});
googleMaps();
function smoothScroll() {
var scroll = new SmoothScroll('a[data-scroll]');
}
function YouTubeVideo() {
var $video = $('#youtube-video');
if($video.length) {
$video.YTPlayer({
fitToBackground: true,
videoId: $video.data('video-id'),
events: {
onReady: function() {
$video.data('ytPlayer').player.mute();
}
}
});
$(document).on('scroll', function(){
videoScroll();
});
function videoScroll() {
var fraction = 0.75,
player = $video.data('ytPlayer').player,
videoHeight = $video.height(),
videoOffsetTop = $video.offset().top,
windowScrollY = window.scrollY;
if(windowScrollY > (videoHeight + videoOffsetTop) *fraction) {
player.pauseVideo();
} else {
player.playVideo();
}
}
}
}
function OwlCarousel() {
$('.owl-carousel').each( function() {
var $carousel = $(this);
$carousel.owlCarousel({
// dots : false,
// items : $carousel.data("items"),
slideBy : $carousel.data("slideby"),
center : $carousel.data("center"),
loop : $carousel.data("loop"),
margin : $carousel.data("margin"),
autoplay : $carousel.data("autoplay"),
autoplayTimeout : $carousel.data("autoplay-timeout"),
navText : [ '<span class="fa fa-angle-left"><span>', '<span class="fa fa-angle-right"></span>' ],
responsive: {
0 : {
items: 1,
dots: true,
nav: false
},
992 : {
items: $carousel.data("items"),
dots: false,
nav : $carousel.data("nav")
}
}
});
});
}
function stickySidebars() {
$('.sticky-col').stick_in_parent({
parent: $('#sticky-parent')
});
$('.sticky-cols').stick_in_parent({
parent: $('.sticky-parent')
});
}
function mobileFilters() {
if($('#mobileFilters').length) {
$(document).on('scroll', function(){
filtersScroll();
});
}
function filtersScroll() {
var filters = $('#mobileFilters');
var footer = $('#mainFooter');
if(filters.offset().top + filters.height() > footer.offset().top - 10 || !$(document).scrollTop()) {
filters.removeClass('active');
} else {
filters.addClass('active');
}
if($(document).scrollTop + window.innerHeight > footer.offset().top) {
filters.addClass('active');
}
}
}
function checkboxes() {
$('.icheck, .iradio').iCheck({
checkboxClass: 'icheck',
radioClass: 'iradio'
});
}
function googleMaps() {
if($('.google-map').length) {
window.initMap = function() {
$('.google-map').gmap();
}
} else {
window.initMap = function() {
return;
}
}
}
function afternavHeight() {
$('.afternav-height').each(function(){
var $mainNav = $('#main-nav'),
mainNavHeight = $mainNav.height(),
height = $(window).height() - mainNavHeight;
$(this).css('height', height);
});
}
function activeBookmark() {
$('.theme-search-results-item-bookmark').each(function(index, el){
$(el).on('click', function(e){
e.preventDefault();
$(this).toggleClass('active');
});
});
}
function magnificLightbox() {
$('.magnific-gallery').each(function(index, el){
$(el).magnificPopup({
delegate: 'a',
type: 'image',
gallery: {
enabled: true,
navigateByImgClick: true,
preload: [0,1]
}
})
});
$('.magnific-gallery-link').each(function(index , value){
var gallery = $(this);
var galleryImages = $(this).data('items').split(',');
var items = [];
for(var i=0;i<galleryImages.length; i++){
items.push({
src:galleryImages[i],
title:''
});
}
gallery.magnificPopup({
mainClass: 'mfp-fade',
items:items,
gallery:{
enabled:true,
tPrev: $(this).data('prev-text'),
tNext: $(this).data('next-text')
},
type: 'image'
});
});
$('.magnific-inline').magnificPopup({
type: 'inline',
fixedContentPos: true
});
$('.magnific-iframe').magnificPopup({
type: 'iframe'
});
}
function priceSlider() {
$("#price-slider").ionRangeSlider({
type: "double",
prefix: " ت "
});
$("#price-slider-mob").ionRangeSlider({
type: "double",
prefix: " ت "
});
}
function BSTabsActions() {
$('#sticky-tab').on('shown.bs.tab', function (e) {
$('.sticky-tab-col').stick_in_parent({
parent: $('#sticky-tab-parent')
});
});
$('#slideTabs a').click(function (e) {
e.preventDefault();
$(this).tab('show');
var control = $(this).attr('aria-controls')
var active = $('#slideTabsSlides').find('.active')[0];
var target = $('#slideTabsSlides').find("[data-tab='" + control + "']")[0];
if(active !== target) {
$(active).removeClass('active');
$(target).addClass('active');
}
});
}
function heroSearchSections() {
$('.theme-hero-search-section').each(function(){
var label,
input;
label = $(this).find('.theme-hero-search-section-label');
input = $(this).find('.theme-hero-search-section-input');
if(input.val()) {
label.addClass('active');
}
input.focus(function(){
label.addClass('active');
});
input.blur(function(){
if(!input.val()) {
label.removeClass('active');
}
});
});
}
function autocomplete() {
$('.typeahead').typeahead({
minLength: 3,
showHintOnFocus: true,
source: function(q, cb) {
return $.ajax({
dataType: 'jsonp',
type: 'get',
url: 'http://gd.geobytes.com/AutoCompleteCity?callback=?&q=' + q,
chache: false,
success: function(data) {
var res = [];
$.each(data, function(index, val){
if(val !== "%s") {
res.push({
id: index,
name: val
})
}
})
cb(res);
}
})
}
})
}
function searchResultsCollapse() {
$('.theme-search-results-item-collapse').on('shown.bs.collapse', function(){
$(this).parents('.theme-search-results-item').addClass('active');
});
$('.theme-search-results-item-collapse').on('hidden.bs.collapse', function(){
$(this).parents('.theme-search-results-item').removeClass('active');
});
}
function comingSoonCountdown() {
$('#commingSoonCountdown').countdown('1400/10/10', function(e){
$(this).html(e.strftime(''
+ '<div><p>%D</p><span>روز</span></div>'
+ '<div><p>%H</p><span>ساعت</span></div>'
+ '<div><p>%M</p><span>دقیه</span></div>'
+ '<div><p>%S</p><span>ثانیه</span></div>'
));
});
}
$('.mobile-picker').each(function(i, item){
if(!isSafari) {
$(item).attr('type', 'text');
$(item).val($(item).attr('value'));
$(item).on('focus', function(){
$(item).attr('type', 'date');
});
$(item).on('blur', function(){
$(item).attr('type', 'text');
});
}
});
+130
View File
@@ -0,0 +1,130 @@
@foreach($flights as $flight)
<!-- FLIGHT ITEM -->
<div class="swiper-slide flight-card group">
<!-- flight header -->
<div class="flight-card_header">
<div>
<span class="flight-airline">
{{ $flight->airline }}
</span>
<span class="flight-number">
{{ $flight->flight_number }}
</span>
</div>
@if($flight->flight_class)
<span class="flight-class">
{{ $flight->flight_class }}
</span>
@endif
</div>
<!-- flight route -->
<div class="flight-card_route">
<div class="flight-airport">
<span>
مبدا
</span>
<strong>
{{ $flight->origin }}
</strong>
</div>
<div class="flight-route-line">
✈
</div>
<div class="flight-airport">
<span>
مقصد
</span>
<strong>
{{ $flight->destination }}
</strong>
</div>
</div>
<!-- flight details -->
<div class="flight-card_details">
<div>
<span>
تاریخ پرواز
</span>
<strong>
{{ $flight->departure_date?->format('Y/m/d') }}
</strong>
</div>
<div>
<span>
ساعت حرکت
</span>
<strong>
{{ $flight->departure_time?->format('H:i') }}
</strong>
</div>
<div>
<span>
ساعت رسیدن
</span>
<strong>
{{ $flight->arrival_time?->format('H:i') }}
</strong>
</div>
</div>
<!-- flight footer -->
<div class="flight-card_footer">
<div class="flight-price">
<span>
قیمت
</span>
<strong>
{{ number_format($flight->price) }}
<small>
تومان
</small>
</strong>
</div>
<a href="#" class="flight-detail-button">
جزئیات
</a>
</div>
</div>
@endforeach
+75
View File
@@ -0,0 +1,75 @@
@foreach($tours as $tour)
<!-- TOUR ITEM -->
<div class="swiper-slide tour-card group">
<!-- tour image -->
<a href="#">
<img
class="tour-card_img"
src="{{ $tour->image ?? asset('assets/img/placeholder.jpg') }}"
alt="{{ $tour->title }}"
>
</a>
<!-- tour content -->
<div class="tour-card_content">
<!-- title -->
<a href="#" class="tour-card_title">
{{ $tour->title }}
</a>
<!-- destination -->
<div class="tour-card_destination">
<span>
📍
</span>
{{ $tour->destination }}
</div>
<!-- details -->
<div class="tour-card_details">
<div>
<span>مدت تور</span>
<strong>
{{ $tour->duration }} روز
</strong>
</div>
<div>
<span>ظرفیت</span>
<strong>
{{ $tour->capacity }} نفر
</strong>
</div>
</div>
<!-- price -->
<div class="tour-card_price">
<span>
شروع قیمت از
</span>
<strong>
{{ number_format($tour->price) }}
<small>تومان</small>
</strong>
</div>
</div>
</div>
@endforeach
+35
View File
@@ -0,0 +1,35 @@
@extends('layouts.app')
@section('content')
<div class="container">
<h2>آرشیو پروازها</h2>
@foreach($flights as $flight)
<div>
{{ $flight->airline }}
-
{{ $flight->flight_number }}
<br>
{{ $flight->origin }}
→
{{ $flight->destination }}
<br>
{{ $flight->departure_date }}
</div>
<hr>
@endforeach
{{ $flights->links() }}
</div>
@endsection
+136
View File
@@ -0,0 +1,136 @@
@extends('layouts.app')
@section('content')
<div class="theme-page-section _pt-100 _pb-100">
<div class="container">
<div class="theme-search-results">
<div class="theme-search-results-header">
<h2>نتایج جستجوی پرواز</h2>
<p>
{{ $flights->count() }} پرواز پیدا شد
</p>
</div>
@forelse($flights as $flight)
<div class="theme-search-results-item">
<div class="row">
{{-- ایرلاین --}}
<div class="col-md-2">
<strong>
{{ $flight->airline }}
</strong>
<div>
{{ $flight->flight_number }}
</div>
</div>
{{-- مبدا --}}
<div class="col-md-2 text-center">
<strong>
{{ $flight->origin }}
</strong>
<div>
{{ $flight->departure_time }}
</div>
</div>
{{-- مسیر --}}
<div class="col-md-2 text-center">
<span>
→
</span>
</div>
{{-- مقصد --}}
<div class="col-md-2 text-center">
<strong>
{{ $flight->destination }}
</strong>
<div>
{{ $flight->arrival_time }}
</div>
</div>
{{-- کلاس --}}
<div class="col-md-2 text-center">
<div>
کلاس:
{{ $flight->flight_class }}
</div>
<div>
ظرفیت:
{{ $flight->capacity }}
</div>
</div>
{{-- قیمت --}}
<div class="col-md-2 text-center">
<strong>
{{ number_format($flight->price) }}
</strong>
<div>
تومان
</div>
<button class="btn btn-primary">
انتخاب پرواز
</button>
</div>
</div>
</div>
@empty
<div class="text-center">
<h3>
پروازی پیدا نشد
</h3>
<p>
لطفاً مبدا، مقصد یا تاریخ دیگری را امتحان کنید.
</p>
</div>
@endforelse
</div>
</div>
</div>
@endsection
+7
View File
@@ -1 +1,8 @@
@extends('layouts.app')
@section('content')
@include('components.flight')
@include('components.tour')
@endsection
+454 -460
View File
@@ -1,462 +1,456 @@
<div class="theme-hero-area theme-hero-area-primary">
<div class="theme-hero-area-bg-wrap">
<div class="theme-hero-area-bg ws-action" style="background-image:url(img/o14abktz5iy_1500x800.jpg);" data-parallax="true"></div>
<div class="theme-hero-area-mask theme-hero-area-mask-half"></div>
<div class="theme-hero-area-inner-shadow theme-hero-area-inner-shadow-light"></div>
</div>
<div class="theme-hero-area-body">
<div class="_pt-250 _pb-200 _pv-mob-50">
<div class="container">
<div class="theme-search-area-tabs">
<div class="theme-search-area-tabs-header _c-w _ta-mob-c">
<h1 class="theme-search-area-tabs-title">سفر خود را شروع کنید</h1>
<p class="theme-search-area-tabs-subtitle">صدها وب سایت مسافرتی را همزمان با هم مقایسه کنید</p>
</div>
<div class="tabbable">
<ul class="nav nav-tabs nav-line nav-white nav-lg nav-mob-inline" role="tablist">
<li class="active" role="presentation">
<a aria-controls="SearchAreaTabs-1" role="tab" data-toggle="tab" href="#SearchAreaTabs-1">هتل</a>
</li>
<li role="presentation">
<a aria-controls="SearchAreaTabs-2" role="tab" data-toggle="tab" href="#SearchAreaTabs-2">خانه ها</a>
</li>
<li role="presentation">
<a aria-controls="SearchAreaTabs-3" role="tab" data-toggle="tab" href="#SearchAreaTabs-3">پروازها</a>
</li>
<li role="presentation">
<a aria-controls="SearchAreaTabs-4" role="tab" data-toggle="tab" href="#SearchAreaTabs-4">ماشین </a>
</li>
<li role="presentation">
<a aria-controls="SearchAreaTabs-5" role="tab" data-toggle="tab" href="#SearchAreaTabs-5">تجربیات </a>
</li>
</ul>
<div class="tab-content _pt-20">
<div class="tab-pane active" id="SearchAreaTabs-1" role="tab-panel">
<div class="theme-search-area theme-search-area-stacked">
<div class="theme-search-area-form">
<div class="row" data-gutter="none">
<div class="col-md-3 ">
<div class="theme-search-area-section first theme-search-area-section-curved theme-search-area-section-bg-white theme-search-area-section-no-border theme-search-area-section-mr">
<div class="theme-search-area-section-inner">
<i class="theme-search-area-section-icon lin lin-location-pin"></i>
<input class="theme-search-area-section-input typeahead" type="text" placeholder="موقعیت هتل" data-provide="typeahead">
</div>
</div>
</div>
<div class="col-md-4 ">
<div class="row" data-gutter="none">
<div class="col-md-6 ">
<div class="theme-search-area-section theme-search-area-section-curved theme-search-area-section-bg-white theme-search-area-section-no-border theme-search-area-section-mr">
<div class="theme-search-area-section-inner">
<i class="theme-search-area-section-icon lin lin-calendar"></i>
<input class="theme-search-area-section-input datePickerStart _mob-h " value="تاریخ رفت" type="text" placeholder="تاریخ رفت" data-jdp>
<input class="theme-search-area-section-input _desk-h mobile-picker" value="تاریخ" type="text" data-jdp>
</div>
</div>
</div>
<div class="col-md-6 ">
<div class="theme-search-area-section theme-search-area-section-curved theme-search-area-section-bg-white theme-search-area-section-no-border theme-search-area-section-mr">
<div class="theme-search-area-section-inner">
<i class="theme-search-area-section-icon lin lin-calendar"></i>
<input class="theme-search-area-section-input datePickerEnd _mob-h" type="text" placeholder="تاریخ برگشت" data-jdp>
<input class="theme-search-area-section-input _desk-h mobile-picker" value="تاریخ برگشت" type="text" data-jdp>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-4 ">
<div class="row" data-gutter="none">
<div class="col-md-6 ">
<div class="theme-search-area-section theme-search-area-section-curved theme-search-area-section-bg-white theme-search-area-section-no-border theme-search-area-section-mr quantity-selector" data-increment="اتاق ها">
<div class="theme-search-area-section-inner">
<i class="theme-search-area-section-icon lin lin-tag"></i>
<input class="theme-search-area-section-input" value="1 اتاق" type="text">
<div class="quantity-selector-box" id="HotelSearchRooms">
<div class="quantity-selector-inner">
<p class="quantity-selector-title">اتاق ها</p>
<ul class="quantity-selector-controls">
<li class="quantity-selector-decrement">
<a href="#">-</a>
</li>
<li class="quantity-selector-current">1</li>
<li class="quantity-selector-increment">
<a href="#">+</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6 ">
<div class="theme-search-area-section theme-search-area-section-curved theme-search-area-section-bg-white theme-search-area-section-no-border theme-search-area-section-mr quantity-selector" data-increment="مهمان">
<div class="theme-search-area-section-inner">
<i class="theme-search-area-section-icon lin lin-people"></i>
<input class="theme-search-area-section-input" value="2 مهمان" type="text">
<div class="quantity-selector-box" id="HotelSearch مهمان">
<div class="quantity-selector-inner">
<p class="quantity-selector-title">مهمان</p>
<ul class="quantity-selector-controls">
<li class="quantity-selector-decrement">
<a href="#">-</a>
</li>
<li class="quantity-selector-current">1</li>
<li class="quantity-selector-increment">
<a href="#">+</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-1 ">
<button class="theme-search-area-submit _mt-0 theme-search-area-submit-no-border theme-search-area-submit-curved">جستجو</button>
</div>
</div>
</div>
<div class="theme-search-area-options _mob-h theme-search-area-options-white theme-search-area-options-dot-primary-inverse clearfix">
<div class="btn-group theme-search-area-options-list" data-toggle="buttons">
<label class="btn btn-primary active">
<input type="radio" name="hotel-options" id="hotel-option-1" checked=""> هرجایی
</label>
<label class="btn btn-primary">
<input type="radio" name="hotel-options" id="hotel-option-2">کسب و کار
</label>
<label class="btn btn-primary">
<input type="radio" name="hotel-options" id="hotel-option-3">خانواده
</label>
<label class="btn btn-primary">
<input type="radio" name="hotel-options" id="hotel-option-4">لوکس
</label>
<label class="btn btn-primary">
<input type="radio" name="hotel-options" id="hotel-option-5">بودجه
</label>
<label class="btn btn-primary">
<input type="radio" name="hotel-options" id="hotel-option-6">رومانتیک
</label>
</div>
</div>
</div>
</div>
<div class="tab-pane" id="SearchAreaTabs-2" role="tab-panel">
<div class="theme-search-area theme-search-area-stacked">
<div class="theme-search-area-form">
<div class="row" data-gutter="none">
<div class="col-md-4 ">
<div class="theme-search-area-section first theme-search-area-section-curved theme-search-area-section-bg-white theme-search-area-section-no-border theme-search-area-section-mr">
<div class="theme-search-area-section-inner">
<i class="theme-search-area-section-icon lin lin-location-pin"></i>
<input class="theme-search-area-section-input typeahead" type="text" placeholder="موقعیت آپارتمان" data-provide="typeahead">
</div>
</div>
</div>
<div class="col-md-7 ">
<div class="row" data-gutter="none">
<div class="col-md-4 ">
<div class="theme-search-area-section theme-search-area-section-curved theme-search-area-section-bg-white theme-search-area-section-no-border theme-search-area-section-mr">
<div class="theme-search-area-section-inner">
<i class="theme-search-area-section-icon lin lin-calendar"></i>
<input class="theme-search-area-section-input datePickerStart _mob-h" value="تاریخ رفت" id="datepicker-Depart" type="text" placeholder="تاریخ رفت" data-jdp>
<input class="theme-search-area-section-input _desk-h mobile-picker" value="تاریخ" type="text" data-jdp>
</div>
</div>
</div>
<div class="col-md-4 ">
<div class="theme-search-area-section theme-search-area-section-curved theme-search-area-section-bg-white theme-search-area-section-no-border theme-search-area-section-mr">
<div class="theme-search-area-section-inner">
<i class="theme-search-area-section-icon lin lin-calendar"></i>
<input class="theme-search-area-section-input datePickerEnd _mob-h" type="text" placeholder="تاریخ برگشت" data-jdp>
<input class="theme-search-area-section-input _desk-h mobile-picker" value="تاریخ برگشت" type="text" data-jdp>
</div>
</div>
</div>
<div class="col-md-4 ">
<div class="theme-search-area-section theme-search-area-section-curved theme-search-area-section-bg-white theme-search-area-section-no-border theme-search-area-section-mr quantity-selector" data-increment="مهمان">
<div class="theme-search-area-section-inner">
<i class="theme-search-area-section-icon lin lin-people"></i>
<input class="theme-search-area-section-input" value="2 مهمان" type="text">
<div class="quantity-selector-box" id="RoomSearch مهمان">
<div class="quantity-selector-inner">
<p class="quantity-selector-title">مهمان</p>
<ul class="quantity-selector-controls">
<li class="quantity-selector-decrement">
<a href="#">-</a>
</li>
<li class="quantity-selector-current">1</li>
<li class="quantity-selector-increment">
<a href="#">+</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-1 ">
<button class="theme-search-area-submit _mt-0 theme-search-area-submit-no-border theme-search-area-submit-curved">جستجو</button>
</div>
</div>
</div>
<div class="theme-search-area-options _mob-h theme-search-area-options-white theme-search-area-options-dot-primary-inverse clearfix">
<div class="btn-group theme-search-area-options-list" data-toggle="buttons">
<label class="btn btn-primary active">
<input type="radio" name="room-options" id="room-option-1" checked=""> هرجایی
</label>
<label class="btn btn-primary">
<input type="radio" name="room-options" id="room-option-2">کل خانه
</label>
<label class="btn btn-primary">
<input type="radio" name="room-options" id="room-option-3">اتاق خصوصی
</label>
<label class="btn btn-primary">
<input type="radio" name="room-options" id="room-option-4">فضای به اشتراک گذاشته شده
</label>
</div>
</div>
</div>
</div>
<div class="tab-pane" id="SearchAreaTabs-3" role="tab-panel">
<div class="theme-search-area theme-search-area-stacked">
<div class="theme-search-area-form">
<div class="row" data-gutter="none">
<div class="col-md-5 ">
<div class="row" data-gutter="none">
<div class="col-md-6 ">
<div class="theme-search-area-section first theme-search-area-section-curved theme-search-area-section-bg-white theme-search-area-section-no-border theme-search-area-section-mr">
<div class="theme-search-area-section-inner">
<i class="theme-search-area-section-icon lin lin-location-pin"></i>
<input class="theme-search-area-section-input typeahead" type="text" placeholder="مبدا" data-provide="typeahead">
</div>
</div>
</div>
<div class="col-md-6 ">
<div class="theme-search-area-section theme-search-area-section-curved theme-search-area-section-bg-white theme-search-area-section-no-border theme-search-area-section-mr">
<div class="theme-search-area-section-inner">
<i class="theme-search-area-section-icon lin lin-location-pin"></i>
<input class="theme-search-area-section-input typeahead" type="text" placeholder="مقصد" data-provide="typeahead">
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6 ">
<div class="row" data-gutter="none">
<div class="col-md-4 ">
<div class="theme-search-area-section theme-search-area-section-curved theme-search-area-section-bg-white theme-search-area-section-no-border theme-search-area-section-mr">
<div class="theme-search-area-section-inner">
<i class="theme-search-area-section-icon lin lin-calendar"></i>
<input class="theme-search-area-section-input datePickerStart _mob-h" value="تاریخ رفت" id="datepicker-tour-Depart" type="text" placeholder="تاریخ رفت" data-jdp>
<input class="theme-search-area-section-input _desk-h mobile-picker" value="تاریخ" type="text" data-jdp>
</div>
</div>
</div>
<div class="col-md-4 ">
<div class="theme-search-area-section theme-search-area-section-curved theme-search-area-section-bg-white theme-search-area-section-no-border theme-search-area-section-mr">
<div class="theme-search-area-section-inner">
<i class="theme-search-area-section-icon lin lin-calendar"></i>
<input class="theme-search-area-section-input datePickerEnd _mob-h" type="text" placeholder="تاریخ برگشت" id="datepicker-tour-Return">
<input class="theme-search-area-section-input _desk-h mobile-picker" value="تاریخ برگشت" type="text" data-jdp>
</div>
</div>
</div>
<div class="col-md-4 ">
<div class="theme-search-area-section theme-search-area-section-curved theme-search-area-section-bg-white theme-search-area-section-no-border theme-search-area-section-mr quantity-selector" data-increment="مسافر">
<div class="theme-search-area-section-inner">
<i class="theme-search-area-section-icon lin lin-people"></i>
<input class="theme-search-area-section-input" value="1 مسافر" type="text">
<div class="quantity-selector-box" id="FlySearchPassengers">
<div class="quantity-selector-inner">
<p class="quantity-selector-title">مسافران</p>
<ul class="quantity-selector-controls">
<li class="quantity-selector-decrement">
<a href="#">-</a>
</li>
<li class="quantity-selector-current">1</li>
<li class="quantity-selector-increment">
<a href="#">+</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-1 ">
<button class="theme-search-area-submit _mt-0 theme-search-area-submit-no-border theme-search-area-submit-curved">جستجو</button>
</div>
</div>
</div>
<div class="theme-search-area-options theme-search-area-options-white theme-search-area-options-dot-primary-inverse clearfix">
<div class="btn-group theme-search-area-options-list" data-toggle="buttons">
<label class="btn btn-primary active">
<input type="radio" name="flight-options" id="flight-option-1" checked="">رفت و برگشت
</label>
<label class="btn btn-primary">
<input type="radio" name="flight-options" id="flight-option-2">یک طرفه
</label>
</div>
</div>
</div>
</div>
<div class="tab-pane" id="SearchAreaTabs-4" role="tab-panel">
<div class="theme-search-area theme-search-area-stacked">
<div class="theme-search-area-form">
<div class="row" data-gutter="none">
<div class="col-md-7 ">
<div class="row" data-gutter="none">
<div class="col-md-6 ">
<div class="theme-search-area-section first theme-search-area-section-curved theme-search-area-section-bg-white theme-search-area-section-no-border theme-search-area-section-mr">
<div class="theme-search-area-section-inner">
<i class="theme-search-area-section-icon lin lin-location-pin"></i>
<input class="theme-search-area-section-input typeahead" type="text" placeholder="مبدا" data-provide="typeahead">
</div>
</div>
</div>
<div class="col-md-6 ">
<div class="theme-search-area-section theme-search-area-section-curved theme-search-area-section-bg-white theme-search-area-section-no-border theme-search-area-section-mr">
<div class="theme-search-area-section-inner">
<i class="theme-search-area-section-icon lin lin-location-pin"></i>
<input class="theme-search-area-section-input typeahead" type="text" placeholder="مقصد" data-provide="typeahead">
</div>
</div>
</div>
</div>
</div>
<div class="col-md-2 ">
<div class="theme-search-area-section theme-search-area-section-curved theme-search-area-section-bg-white theme-search-area-section-no-border theme-search-area-section-mr">
<div class="theme-search-area-section-inner">
<i class="theme-search-area-section-icon lin lin-calendar"></i>
<input class="theme-search-area-section-input datePickerStart _mob-h" value="تاریخ رفت" id="data-car" type="text" placeholder="تاریخ رفت" data-jdp>
<input class="theme-search-area-section-input _desk-h mobile-picker" value="تاریخ" type="text" data-jdp>
</div>
</div>
</div>
<div class="col-md-2 ">
<div class="theme-search-area-section theme-search-area-section-curved theme-search-area-section-bg-white theme-search-area-section-no-border theme-search-area-section-mr">
<div class="theme-search-area-section-inner">
<i class="theme-search-area-section-icon lin lin-calendar"></i>
<input class="theme-search-area-section-input datePickerEnd _mob-h" type="text" placeholder="تاریخ برگشت" data-jdp>
<input class="theme-search-area-section-input _desk-h mobile-picker" value="تاریخ برگشت" type="text" data-jdp>
</div>
</div>
</div>
<div class="col-md-1 ">
<button class="theme-search-area-submit _mt-0 theme-search-area-submit-no-border theme-search-area-submit-curved">جستجو</button>
</div>
</div>
</div>
<div class="theme-search-area-options _mob-h theme-search-area-options-white theme-search-area-options-dot-primary-inverse clearfix">
<div class="btn-group theme-search-area-options-list" data-toggle="buttons">
<label class="btn btn-primary active">
<input type="radio" name="car-options" id="car-option-1" checked=""> هرجایی
</label>
<label class="btn btn-primary">
<input type="radio" name="car-options" id="car-option-2">کوپه
</label>
<label class="btn btn-primary">
<input type="radio" name="car-options" id="car-option-3">هاچ بک
</label>
<label class="btn btn-primary">
<input type="radio" name="car-options" id="car-option-4">ماشین شاسی بلند
</label>
<label class="btn btn-primary">
<input type="radio" name="car-options" id="car-option-5"> سواری
</label>
<label class="btn btn-primary">
<input type="radio" name="car-options" id="car-option-6"> خارجی
</label>
</div>
</div>
</div>
</div>
<div class="tab-pane" id="SearchAreaTabs-5" role="tab-panel">
<div class="theme-search-area theme-search-area-stacked">
<div class="theme-search-area-form">
<div class="row" data-gutter="none">
<div class="col-md-4 ">
<div class="theme-search-area-section first theme-search-area-section-curved theme-search-area-section-bg-white theme-search-area-section-no-border theme-search-area-section-mr">
<div class="theme-search-area-section-inner">
<i class="theme-search-area-section-icon lin lin-location-pin"></i>
<input class="theme-search-area-section-input typeahead" type="text" placeholder="مقصد" data-provide="typeahead">
</div>
</div>
</div>
<div class="col-md-7 ">
<div class="row" data-gutter="none">
<div class="col-md-4 ">
<div class="theme-search-area-section theme-search-area-section-curved theme-search-area-section-bg-white theme-search-area-section-no-border theme-search-area-section-mr">
<div class="theme-search-area-section-inner">
<i class="theme-search-area-section-icon lin lin-calendar"></i>
<input class="theme-search-area-section-input datePickerStart _mob-h" value="تاریخ رفت" id="date-exp" type="text" placeholder="تاریخ رفت" data-jdp>
<input class="theme-search-area-section-input _desk-h mobile-picker" value="تاریخ" type="text" data-jdp>
</div>
</div>
</div>
<div class="col-md-4 ">
<div class="theme-search-area-section theme-search-area-section-curved theme-search-area-section-bg-white theme-search-area-section-no-border theme-search-area-section-mr">
<div class="theme-search-area-section-inner">
<i class="theme-search-area-section-icon lin lin-calendar"></i>
<input class="theme-search-area-section-input datePickerEnd _mob-h" type="text" placeholder="تاریخ برگشت" id="exo-date-back">
<input class="theme-search-area-section-input _desk-h mobile-picker" value="تاریخ برگشت" type="text" data-jdp>
</div>
</div>
</div>
<div class="col-md-4 ">
<div class="theme-search-area-section theme-search-area-section-curved theme-search-area-section-bg-white theme-search-area-section-no-border theme-search-area-section-mr quantity-selector" data-increment="مهمان">
<div class="theme-search-area-section-inner">
<i class="theme-search-area-section-icon lin lin-people"></i>
<input class="theme-search-area-section-input" value="2 مهمان" type="text">
<div class="quantity-selector-box" id="ExpSearch مهمان">
<div class="quantity-selector-inner">
<p class="quantity-selector-title">مهمان</p>
<ul class="quantity-selector-controls">
<li class="quantity-selector-decrement">
<a href="#">-</a>
</li>
<li class="quantity-selector-current">1</li>
<li class="quantity-selector-increment">
<a href="#">+</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-1 ">
<button class="theme-search-area-submit _mt-0 theme-search-area-submit-no-border theme-search-area-submit-curved">جستجو</button>
</div>
</div>
</div>
<div class="theme-search-area-options _mob-h theme-search-area-options-white theme-search-area-options-dot-primary-inverse clearfix">
<div class="btn-group theme-search-area-options-list" data-toggle="buttons">
<label class="btn btn-primary active">
<input type="radio" name="exp-options" id="exp-option-1" checked=""> هرجایی
</label>
<label class="btn btn-primary">
<input type="radio" name="exp-options" id="exp-option-2">تجربیات
</label>
<label class="btn btn-primary">
<input type="radio" name="exp-options" id="exp-option-3">غوطه ور شدن
</label>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<section class="flight-hero">
<div class="container">
<div class="flight-hero-content">
<span class="flight-badge">
✈️ سفر بعدی شما از اینجا شروع می‌شود
</span>
<h1>
پرواز خود را
<span>پیدا کنید</span>
</h1>
<p>
مبدا، مقصد و تاریخ سفر خود را انتخاب کنید.
</p>
</div>
<div class="flight-search-card">
<div class="flight-search-header">
<div>
<h3>
جستجوی پرواز
</h3>
<span>
اطلاعات سفر خود را وارد کنید
</span>
</div>
<div class="flight-type">
<label>
<input
type="radio"
name="trip_type"
value="one_way"
checked
>
یک طرفه
</label>
<label>
<input
type="radio"
name="trip_type"
value="round_trip"
>
رفت و برگشت
</label>
</div>
</div>
<form action="{{ route('flights.search') }}" method="GET">
<div class="flight-fields">
{{-- مبدا --}}
<div class="flight-field">
<label for="origin">
مبدا
</label>
<select id="origin_province">
<option value="">استان مبدا</option>
@foreach($provinces as $province)
<option value="{{ $province->id }}">
{{ $province->name }}
</option>
@endforeach
</select>
<select name="origin" id="origin_city">
<option value="">شهر مبدا</option>
</select>
</div>
{{-- مقصد --}}
<div class="flight-field">
<label for="destination">
مقصد
</label>
<select id="destination_province">
<option value="">استان مقصد</option>
@foreach($provinces as $province)
<option value="{{ $province->id }}">
{{ $province->name }}
</option>
@endforeach
</select>
<select name="destination" id="destination_city">
<option value="">شهر مقصد</option>
</select>
</div>
{{-- تاریخ رفت --}}
<div class="flight-field">
<label for="departure_date">
تاریخ رفت
</label>
<input
type="date"
name="departure_date"
id="departure_date"
>
</div>
{{-- تاریخ برگشت --}}
<div class="flight-field">
<label for="return_date">
تاریخ برگشت
</label>
<input
type="date"
name="return_date"
id="return_date"
>
</div>
{{-- تعداد مسافر --}}
<div class="flight-field">
<label for="passengers">
تعداد مسافر
</label>
<select
name="passengers"
id="passengers"
>
@for($i = 1; $i <= 9; $i++)
<option value="{{ $i }}">
{{ $i }} مسافر
</option>
@endfor
</select>
</div>
{{-- جستجو --}}
<div class="flight-button-wrapper">
<button
type="submit"
class="flight-search-button"
>
🔍
جستجوی پرواز
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<style>
.flight-hero {
padding: 80px 0 100px;
background:
linear-gradient(
135deg,
#09203f,
#176b87
);
color: #fff;
}
.flight-hero-content {
text-align: center;
margin-bottom: 40px;
}
.flight-badge {
display: inline-block;
padding: 8px 18px;
margin-bottom: 18px;
border-radius: 30px;
background: rgba(255,255,255,.12);
font-size: 14px;
}
.flight-hero h1 {
margin: 0;
font-size: 48px;
font-weight: 800;
}
.flight-hero h1 span {
color: #ffc107;
}
.flight-hero p {
margin-top: 15px;
font-size: 17px;
opacity: .85;
}
.flight-search-card {
max-width: 1100px;
margin: auto;
padding: 30px;
background: #fff;
border-radius: 18px;
color: #263238;
box-shadow:
0 20px 60px rgba(0,0,0,.25);
}
.flight-search-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 25px;
}
.flight-search-header h3 {
margin: 0 0 5px;
}
.flight-search-header span {
color: #78909c;
font-size: 13px;
}
.flight-type {
display: flex;
gap: 20px;
font-size: 14px;
}
.flight-fields {
display: grid;
grid-template-columns:
repeat(3, 1fr);
gap: 18px;
}
.flight-field label {
display: block;
margin-bottom: 8px;
font-size: 13px;
font-weight: 600;
}
.flight-field select,
.flight-field input {
width: 100%;
height: 50px;
padding: 0 12px;
border: 1px solid #e0e6ed;
border-radius: 9px;
background: #f8fafc;
outline: none;
}
.flight-field select:focus,
.flight-field input:focus {
border-color: #1976d2;
background: #fff;
}
.flight-button-wrapper {
display: flex;
align-items: end;
}
.flight-search-button {
width: 100%;
height: 50px;
border: none;
border-radius: 9px;
background: #1976d2;
color: #fff;
font-weight: 700;
cursor: pointer;
}
.flight-search-button:hover {
background: #125ca8;
}
@media (max-width: 768px) {
.flight-hero {
padding: 60px 15px 70px;
}
.flight-hero h1 {
font-size: 34px;
}
.flight-search-header {
flex-direction: column;
align-items: flex-start;
gap: 15px;
}
.flight-fields {
grid-template-columns: 1fr;
}
}
</style>
<script>
$('#origin_province').on('change', function(){
let provinceId = $(this).val();
$.ajax({
url: '/users/cities/' + provinceId,
type:'GET',
success:function(data){
$('#origin_city').html('');
$.each(data,function(key,value){
$('#origin_city').append(
`<option value="${value.id}">
${value.name}
</option>`
);
});
}
});
});
</script>
+7
View File
@@ -4,6 +4,7 @@ use App\Http\Controllers\CityController;
use App\Http\Controllers\CommentController;
use App\Http\Controllers\DashboardController;
use App\Http\Controllers\FavoriteController;
use App\Http\Controllers\FlightController;
use App\Http\Controllers\HomeController;
use App\Http\Controllers\ProfileController;
use Illuminate\Support\Facades\Route;
@@ -12,6 +13,12 @@ use Illuminate\Support\Facades\Route;
Route::get('/', [HomeController::class,'index'])
->name('index');
Route::get('/flights/search', [FlightController::class, 'search'])
->name('flights.search');
Route::get('/flights/archive', [FlightController::class, 'archive'])
->name('flights.archive');
Route::prefix('users')->name('users.')->middleware('auth:web')->group(function (){
Route::get('/',[DashboardController::class,'index'])->name('dashboard');