git commit "style: improve tour flight details and auth pages"

This commit is contained in:
2026-08-20 12:08:53 +03:30
parent 73c8e52414
commit c04879b0d6
17 changed files with 1667 additions and 867 deletions
Binary file not shown.
+113 -62
View File
@@ -8,6 +8,7 @@
ویرایش پرواز
</h4>
@if($errors->any())
<div class="alert alert-danger">
<ul class="mb-0">
@@ -18,6 +19,7 @@
</div>
@endif
<form action="{{ route('admin.flights.update',$flight->id) }}"
method="POST"
enctype="multipart/form-data">
@@ -25,98 +27,76 @@
@csrf
@method('PUT')
<div class="row">
<div class="col-md-6 mb-3">
<label>
ایرلاین
</label>
<label>ایرلاین</label>
<input type="text"
name="airline"
class="form-control"
value="{{ old('airline') }}">
@error('airline')
<small class="text-danger">
{{ $message }}
</small>
@enderror
value="{{ old('airline',$flight->airline) }}">
</div>
<div class="col-md-6 mb-3">
<label>
شماره پرواز
</label>
<label>شماره پرواز</label>
<input type="text"
name="flight_number"
class="form-control"
value="{{ old('flight_number') }}">
@error('flight_number')
<small class="text-danger">
{{ $message }}
</small>
@enderror
value="{{ old('flight_number',$flight->flight_number) }}">
</div>
<div class="col-md-6 mb-3">
<label>
مبدا
</label>
<label>مبدا</label>
<input type="text"
name="origin"
class="form-control"
value="{{ old('origin') }}">
value="{{ old('origin',$flight->origin) }}">
</div>
<div class="col-md-6 mb-3">
<label>
مقصد
</label>
<label>مقصد</label>
<input type="text"
name="destination"
class="form-control"
value="{{ old('destination') }}">
value="{{ old('destination',$flight->destination) }}">
</div>
<div class="col-md-4 mb-3">
<label>
ساعت حرکت
</label>
<div class="col-md-4 mb-3">
<label>ساعت حرکت</label>
<input type="time"
name="departure_time"
class="form-control">
class="form-control"
value="{{ old('departure_time',$flight->departure_time) }}">
</div>
<div class="col-md-4 mb-3">
<label>
ساعت رسیدن
</label>
<label>ساعت رسیدن</label>
<input type="time"
name="arrival_time"
class="form-control">
class="form-control"
value="{{ old('arrival_time',$flight->arrival_time) }}">
</div>
<div class="col-md-4 mb-3">
<label>
@@ -124,21 +104,33 @@
</label>
<select name="type" class="form-control">
<option value="0">داخلی</option>
<option value="2">خارجی</option>
<option value="3">چارتر</option>
<option value="0" @selected($flight->type == 0)>
داخلی
</option>
<option value="2" @selected($flight->type == 2)>
خارجی
</option>
<option value="3" @selected($flight->type == 3)>
چارتر
</option>
</select>
</div>
<div class="col-md-4 mb-3">
<label>
تاریخ حرکت
</label>
<input type="text"
id="departure_date"
name="departure_date"
@@ -147,63 +139,85 @@
autocomplete="off"
value="{{ old('departure_date', $flight->departure_date ? verta($flight->departure_date)->format('Y/m/d') : '') }}">
@error('departure_date')
<div class="text-danger mt-2">{{ $message }}</div>
@enderror
</div>
<div class="col-md-4 mb-3">
<label>
کلاس پرواز
</label>
<input type="text"
name="flight_class"
class="form-control">
class="form-control"
value="{{ old('flight_class',$flight->flight_class) }}">
</div>
<div class="col-md-4 mb-3">
<label>
ظرفیت
</label>
<input type="number"
name="capacity"
class="form-control">
min="1"
class="form-control"
value="{{ old('capacity',$flight->capacity) }}">
</div>
<div class="col-md-4 mb-3">
<label>
قیمت
</label>
<input type="number"
name="price"
class="form-control">
class="form-control"
value="{{ old('price',$flight->price) }}">
</div>
<div class="col-md-4 mb-3">
<label>
عکس
عکس فعلی
</label>
@if($flight->image)
<div class="mb-2">
<img src="{{ asset('storage/'.$flight->image) }}"
width="120"
class="rounded">
</div>
@endif
<input type="file"
name="image"
class="form-control">
@@ -211,27 +225,57 @@
</div>
<div class="col-md-4 mb-3">
<label>
وضعیت
</label>
<select name="status" class="form-control">
<option value="0">پیش‌نویس</option>
<option value="1">فعال</option>
<option value="2">غیرفعال</option>
<option value="3">تمام شده</option>
<option value="4">لغو شده</option>
<option value="0" @selected($flight->status == 0)>
پیش‌نویس
</option>
<option value="1" @selected($flight->status == 1)>
فعال
</option>
<option value="2" @selected($flight->status == 2)>
غیرفعال
</option>
<option value="3" @selected($flight->status == 3)>
تمام شده
</option>
<option value="4" @selected($flight->status == 4)>
لغو شده
</option>
</select>
</div>
</div>
<button class="btn btn-primary">
ذخیره
ذخیره تغییرات
</button>
@@ -242,12 +286,19 @@
<script>
window.addEventListener('load', function () {
$("#departure_date").persianDatepicker({
format: 'YYYY/MM/DD',
autoClose: true,
initialValue: false,
minDate: new persianDate()
autoClose:true,
initialValue:false,
minDate:new persianDate()
});
});
</script>
@@ -1,3 +0,0 @@
<div>
<!-- Happiness is not something readymade. It comes from your own actions. - Dalai Lama -->
</div>
+1 -1
View File
@@ -1,4 +1,4 @@
@extends('layouts.app')
@extends('layouts.app')
@section('content')
<div class="theme-hero-area-bg-wrap">
+235 -4
View File
@@ -1,3 +1,235 @@
<style>
.flight-image {
height: 260px;
position: relative;
overflow: hidden;
}
.flight-image img {
transition: .6s ease;
}
.card:hover .flight-image img {
transform: scale(1.08);
}
.card.border-0.shadow-sm.rounded-4.overflow-hidden {
border-radius: 24px !important;
overflow: hidden;
position: relative;
background: #fff;
transition: .4s ease;
border: 1px solid #f1f1f1 !important;
}
.card.border-0.shadow-sm.rounded-4.overflow-hidden:hover {
transform: translateY(-8px);
box-shadow:
0 20px 45px rgba(0,0,0,.12)!important;
}
.card form {
position:absolute;
top:18px;
left:18px;
z-index:5;
}
.card form button {
border-radius:50px;
background:rgba(255,255,255,.9);
backdrop-filter:blur(8px);
border:none;
padding:10px 18px;
color:#e63946;
font-weight:600;
box-shadow:
0 8px 20px rgba(0,0,0,.15);
transition:.3s;
}
.card form button:hover {
background:#e63946;
color:white;
}
.flight-badge {
position:absolute;
right:20px;
bottom:20px;
background:white;
color:#0d6efd;
padding:8px 20px;
border-radius:50px;
font-size:14px;
font-weight:700;
box-shadow:
0 8px 20px rgba(0,0,0,.15);
}
.flight-image:after {
content:"";
position:absolute;
inset:0;
background:
linear-gradient(
transparent,
rgba(0,0,0,.45)
);
}
.card-body {
padding:28px !important;
}
.card-body h5 {
font-size:22px;
font-weight:800 !important;
color:#222;
}
.route {
display:flex;
justify-content:center;
align-items:center;
gap:15px;
margin:25px 0;
font-weight:700;
font-size:16px;
}
.route .line {
width:55px;
height:2px;
background:#dbe7ff;
position:relative;
}
.route .line:after {
content:"✈";
position:absolute;
top:50%;
left:50%;
transform:translate(-50%,-50%);
background:white;
padding:5px;
color:#0d6efd;
}
.card-body strong {
font-size:20px;
color:#0d6efd;
}
.card-body .btn-primary {
background:linear-gradient(
135deg,
#0062ff,
#00b7ff
);
border:none;
padding:11px 30px;
font-weight:700;
box-shadow:
0 10px 25px rgba(0,98,255,.3);
transition:.3s;
}
.card-body .btn-primary:hover {
transform:translateY(-3px);
box-shadow:
0 15px 30px rgba(0,98,255,.4);
}
</style>
<div class="col-md-4">
<div class="card border-0 shadow-sm rounded-4 overflow-hidden h-100">
<form action="{{ route('users.favorite.store') }}" method="POST">
@@ -18,11 +250,10 @@
</form>
<div class="flight-image">
<img src="{{ asset($flight->image) }}"
<img src="{{ $flight->image ? asset('storage/'.$flight->image) : asset('assets/img/placeholder.jpg') }}"
class="w-100 h-100 object-fit-cover"
alt="{{ $flight->airline }}">
<span class="flight-badge">
<span class="flight-badge">
پرواز
</span>
+3 -2
View File
@@ -20,8 +20,9 @@
<div class="flight-image">
<img src="{{ asset($tour->image) }}"
alt="{{ $tour->title }}">
<img src="{{ $tour->image ? asset('storage/'.$tour->image) : asset('assets/img/placeholder.jpg') }}"
class="w-100 h-100 object-fit-cover"
alt="{{ $tour->airline }}">
<span class="flight-badge">
+8 -431
View File
@@ -1,432 +1,14 @@
<style>
.flight-detail-page{
padding:80px 0;
background:
linear-gradient(135deg,#eef5ff,#f9fbff);
direction:rtl;
}
/* کارت اصلی */
.flight-detail-card{
background:rgba(255,255,255,.85);
backdrop-filter:blur(15px);
border-radius:35px;
overflow:hidden;
display:flex;
box-shadow:
0 25px 70px rgba(0,0,0,.12);
transition:.4s;
}
.flight-detail-card:hover{
transform:translateY(-8px);
box-shadow:
0 35px 90px rgba(25,118,210,.25);
}
/* تصویر */
.flight-detail-image{
width:42%;
min-height:400px;
position:relative;
}
.flight-detail-image:after{
content:"";
position:absolute;
inset:0;
background:
linear-gradient(
180deg,
transparent,
rgba(0,0,0,.35)
);
}
.flight-detail-image img{
width:100%;
height:100%;
object-fit:cover;
}
/* محتوا */
.flight-detail-content{
width:58%;
padding:55px;
}
.flight-detail-content h1{
font-size:38px;
font-weight:900;
color:#102a43;
}
/* badge */
.flight-badge-show{
background:
linear-gradient(135deg,#1976d2,#42a5f5);
color:white;
padding:10px 30px;
border-radius:50px;
font-weight:bold;
box-shadow:
0 10px 25px rgba(25,118,210,.35);
}
/* مسیر */
.route-box{
margin:40px 0;
padding:35px;
border-radius:25px;
background:#fff;
display:flex;
justify-content:space-around;
align-items:center;
box-shadow:
inset 0 0 20px rgba(0,0,0,.04);
}
.route-box small{
color:#90a4ae;
font-size:14px;
}
.route-box strong{
display:block;
margin-top:8px;
font-size:28px;
color:#102a43;
}
.route-line{
font-size:45px;
color:#f4b400;
animation:fly 2s infinite alternate;
}
@keyframes fly{
from{
transform:translateX(-10px);
}
to{
transform:translateX(10px);
}
}
/* اطلاعات */
.flight-info-grid{
display:grid;
grid-template-columns:repeat(2,1fr);
gap:20px;
}
.flight-info-grid div{
background:#fff;
padding:22px;
border-radius:20px;
border:1px solid #edf2f7;
transition:.3s;
}
.flight-info-grid div:hover{
transform:translateY(-5px);
box-shadow:
0 15px 35px rgba(0,0,0,.08);
}
.flight-info-grid span{
color:#78909c;
font-size:14px;
}
.flight-info-grid b,
.flight-info-grid strong{
display:block;
margin-top:10px;
color:#102a43;
font-size:20px;
}
/* فرم کامنت */
.flight-comments{
margin-top:45px;
background:#fff;
padding:35px;
border-radius:30px;
box-shadow:
0 15px 40px rgba(0,0,0,.08);
}
.flight-comments h3{
font-weight:900;
color:#102a43;
margin-bottom:25px;
}
.flight-comments textarea{
border-radius:20px;
border:2px solid #edf2f7;
padding:20px;
resize:none;
transition:.3s;
}
.flight-comments textarea:focus{
border-color:#1976d2;
box-shadow:
0 0 0 5px rgba(25,118,210,.12);
}
.flight-comments button{
width:100%;
padding:16px;
border-radius:20px;
border:none;
font-weight:800;
font-size:18px;
background:
linear-gradient(
135deg,
#1976d2,
#42a5f5
);
box-shadow:
0 15px 30px rgba(25,118,210,.35);
transition:.3s;
}
.flight-comments button:hover{
transform:translateY(-4px);
}
/* موبایل */
@media(max-width:900px){
.flight-detail-card{
flex-direction:column;
}
.flight-detail-image,
.flight-detail-content{
width:100%;
}
.flight-detail-image{
height:300px;
}
.flight-detail-content{
padding:30px;
}
.flight-info-grid{
grid-template-columns:1fr;
}
.route-box{
flex-direction:column;
gap:25px;
}
}
</style>
<link rel="stylesheet" href="{{ asset('assets/css/show.css') }}">
@extends('layouts.app')
@section('content')
<section class="flight-detail-page">
<div class="container">
<div class="flight-detail-card">
<div class="flight-detail-image">
<img src="{{ asset($flight->image) }}"
<img src="{{ $flight->image ? asset('storage/'.$flight->image) : asset('assets/img/placeholder.jpg') }}"
class="w-100 h-100 object-fit-cover"
alt="{{ $flight->airline }}">
</div>
@@ -500,7 +82,6 @@
<button type="submit" class="btn btn-success">
رزرو تور
</button>
</form> @else
<a href="{{ route('auth.login.index') }}" class="btn btn-warning btn-lg px-5">
@@ -537,23 +118,18 @@
name="flight_id"
value="{{ $flight->id }}"
>
<div class="mb-3">
<label for="rating">
<label>
امتیاز
</label>
<select name="rating" id="rating" class="form-control">
<select name="rating" class="form-control">
<option value="5">★★★★★</option>
<option value="4">★★★★</option>
<option value="3">★★★</option>
<option value="2">★★</option>
<option value="1">★</option>
</select>
</div>
<div class="mb-3">
@@ -622,3 +198,4 @@
</div>
</section>
@endsection
+2
View File
@@ -10,6 +10,8 @@
<link rel="stylesheet" href="{{asset('assets/css/weather-icons.css')}}"/>
<link rel="stylesheet" href="{{asset('assets/css/bootstrap.css')}}"/>
<link rel="stylesheet" href="{{ asset('assets/css/styles.css?v=2') }}">
<link rel="stylesheet" href="{{ asset('assets/css/flight_tour.css') }}">
<link rel="stylesheet" href="{{ asset('assets/css/header.css') }}">
</head>
<body>
-227
View File
@@ -1,230 +1,3 @@
<style>
.main-header {
background: #09203f;
box-shadow: 0 8px 30px rgba(0,0,0,.2);
padding: 15px 0;
}
.header-inner {
display:flex;
align-items:center;
justify-content:space-between;
}
.logo {
color:white;
font-size:28px;
font-weight:800;
text-decoration:none;
}
.menu {
display:flex;
gap:30px;
list-style:none;
margin:0;
padding:0;
}
.menu li a {
color:white;
text-decoration:none;
font-weight:600;
transition:.3s;
}
.menu li a:hover {
color:#ffc107;
}
.header-actions {
display:flex;
gap:10px;
}
.login-btn {
color:white;
border:1px solid white;
padding:10px 20px;
border-radius:30px;
text-decoration:none;
}
.register-btn {
background:#ffc107;
color:#09203f;
padding:10px 20px;
border-radius:30px;
text-decoration:none;
font-weight:700;
}
.user-btn {
color:white;
text-decoration:none;
}
.user-dropdown {
position: relative;
}
.user-btn {
background: transparent;
border: none;
color: white;
font-size: 15px;
cursor: pointer;
padding: 10px 15px;
}
.user-menu {
position: absolute;
top: 45px;
right: 0;
width: 200px;
background: white;
border-radius: 15px;
padding: 10px 0;
box-shadow: 0 15px 40px rgba(0,0,0,.15);
opacity: 0;
visibility: hidden;
transform: translateY(10px);
transition: .3s;
}
.user-dropdown:hover .user-menu {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
.user-menu a,
.user-menu button {
display: flex;
align-items: center;
gap: 10px;
width: 100%;
padding: 12px 20px;
color: #263238;
background: none;
border: none;
text-decoration: none;
font-size: 14px;
cursor: pointer;
}
.user-menu a:hover,
.user-menu button:hover {
background: #f1f5f9;
color: #1976d2;
}
</style>
<nav class="main-header">
<div class="container header-inner">
+1 -1
View File
@@ -4,7 +4,7 @@
<div class="flight-hero-content">
<span class="flight-badge">
<span>
سفر بعدی شما از اینجا شروع می‌شود
</span>
+132 -120
View File
@@ -1,18 +1,16 @@
<link rel="stylesheet" href="{{ asset('assets/css/show.css') }}">
@extends('layouts.app')
@section('content')
<section class="container mt-5">
<div class="card border-0 shadow rounded-4 overflow-hidden">
<div class="position-relative">
<img src="{{ asset($tour->image) }}"
alt="{{ $tour->title }}">
<div class="card border-0 shadow rounded-4 overflow-hidden mb-5">
<div class="tour-detail-image">
<img src="{{ $tour->image ? asset('storage/'.$tour->image) : asset('assets/img/placeholder.jpg') }}"
class="w-100 h-100 object-fit-cover"
alt="{{ $tour->airline }}">
<span class="badge bg-primary position-absolute top-0 end-0 m-4">
تور
</span>
@@ -20,206 +18,220 @@
</div>
<div class="card-body p-4">
<h1 class="fw-bold mb-4">
<h1 class="fw-bold mb-3">
{{ $tour->title }}
</h1>
<p class="text-muted">
{{ $tour->summary }}
</p>
<hr>
<div class="row g-4">
<div class="col-md-4">
<span class="text-secondary">
نوع سفر
</span>
<h5>
{{ $tour->travelType?->name ?? '-' }}
</h5>
<div class="tour-info-box">
<span>نوع سفر</span>
<h5>
{{ $tour->travelType?->name ?? '-' }}
</h5>
</div>
</div>
<div class="col-md-4">
<span class="text-secondary">
تاریخ حرکت
</span>
<h5>
{{ \Carbon\Carbon::parse($tour->departure_date)->format('Y/m/d') }}
</h5>
<div class="tour-info-box">
<span>تاریخ حرکت</span>
<h5>
{{ \Carbon\Carbon::parse($tour->departure_date)->format('Y/m/d') }}
</h5>
</div>
</div>
<div class="col-md-4">
<span class="text-secondary">
قیمت
</span>
<h5>
{{ number_format($tour->price) }}
تومان
</h5>
<div class="tour-info-box">
<span>قیمت</span>
<h5 class="tour-price">
{{ number_format($tour->price) }}
تومان
</h5>
</div>
</div>
</div>
<hr>
<h4 class="fw-bold">
توضیحات تور
</h4>
<p class="mt-3">
<p>
{{ $tour->description }}
</p>
<div class="mt-4">
<div class="reserve-area mt-5">
@auth
<form action="{{ route('users.reservations.store') }}" method="POST">
<form action="{{ route('users.reservations.store') }}"
method="POST"
class="reservation-form">
@csrf
<input type="hidden" name="reservable_id" value="{{ $tour->id }}">
<input type="hidden"
name="reservable_id"
value="{{ $tour->id }}">
<input type="hidden" name="reservable_type" value="App\Models\Tour">
<input type="hidden"
name="reservable_type"
value="App\Models\Tour">
<input type="hidden" name="price" value="{{ $tour->price }}">
<input type="hidden"
name="price"
value="{{ $tour->price }}">
<button type="submit" class="btn btn-success">
رزرو تور
<button type="submit"
class="btn btn-success rounded-pill px-5 py-3">
رزرو تور
</button>
</form> @else
</form>
@else
<a href="{{ route('auth.login.index') }}"
class="btn btn-warning rounded-pill px-5 py-3">
<a href="{{ route('auth.login.index') }}" class="btn btn-warning btn-lg px-5">
برای رزرو وارد شوید
</a>
@endauth
</div>
<div>
<span>تعداد مشاهده</span>
<strong>
{{ $tour->views ?? 0 }}
بازدید
</strong>
</div>
</div>
<form action="{{ route('comments.store') }}" method="POST">
</div>
<div class="comment-box mb-5">
<h3 class="fw-bold mb-4">
ثبت نظر درباره تور
</h3>
<form action="{{ route('comments.store') }}"
method="POST">
@csrf
<input
type="hidden"
name="tour_id"
value="{{ $tour->id }}"
>
<input type="hidden"
name="tour_id"
value="{{ $tour->id }}">
<div class="mb-3">
<label>
امتیاز
</label>
<select name="rating" class="form-control">
<select name="rating"
class="form-select">
<option value="5">★★★★★</option>
<option value="4">★★★★</option>
<option value="3">★★★</option>
<option value="2">★★</option>
<option value="1">★</option>
</select>
</div>
<div class="mb-3">
<label>
نظر شما
</label>
<textarea
name="comment"
rows="5"
class="form-control"
></textarea>
<textarea name="comment"
rows="5"
class="form-control rounded-4"
placeholder="نظر خود را بنویسید..."></textarea>
</div>
<button class="btn btn-primary">
<button class="btn btn-primary rounded-pill px-5">
ثبت نظر
</button>
</form>
<div class="comments-list mt-5">
<h3 class="mb-4">
نظرات کاربران
</h3>
@forelse($comments as $comment)
<div class="card p-4 mb-3 shadow-sm">
<div class="d-flex justify-content-between">
<strong>
{{ $comment->user?->name ?? 'کاربر مهمان' }}
</strong>
<small>
{{ $comment->created_at->diffForHumans() }}
</small>
</div>
<p class="mt-3 mb-0">
{{ $comment->comment }}
</p>
</div>
@empty
<div class="alert alert-secondary">
هنوز نظری ثبت نشده است.
</div>
@endforelse
</div>
</div>
<div class="comment-box">
<h3 class="fw-bold mb-4">
نظرات کاربران
</h3>
@forelse($comments as $comment)
<div class="comment-item">
<div class="d-flex justify-content-between">
<strong>
{{ $comment->user?->name ?? 'کاربر مهمان' }}
</strong>
<small>
{{ $comment->created_at->diffForHumans() }}
</small>
</div>
<p class="mt-3 mb-0">
{{ $comment->comment }}
</p>
</div>
@empty
<div class="alert alert-secondary rounded-4">
هنوز نظری ثبت نشده است.
</div>
@endforelse
</div>
</section>
@endsection