feat: implement register logic and make register page dynamic

This commit is contained in:
2026-08-16 11:30:44 +03:30
parent a394aa79e0
commit c78b52b6f2
3 changed files with 266 additions and 89 deletions
@@ -2,8 +2,17 @@
namespace App\Http\Controllers\Auth;
use App\Enums\UserStatus;
use App\Http\Controllers\Controller;
use App\Http\Requests\Auth\RegisterPostRequest;
use App\Models\File;
use App\Models\Province;
use App\Models\User;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Storage;
class RegisterController extends Controller
{
@@ -13,11 +22,89 @@ class RegisterController extends Controller
$withOutHeader = true;
$withOutFooter = true;
return view('auth.register' , compact('title' , 'withOutHeader' , 'withOutFooter'));
$provinces = Province::where('status', 1)
->orderBy('name')
->pluck('name', 'id');
return view('auth.register' , compact('title' , 'withOutHeader' , 'withOutFooter' , 'provinces'));
}
public function post()
public function post(RegisterPostRequest $request)
{
$data = $request->validated();
DB::beginTransaction();
try {
$fileId = null;
if ($request->hasFile('avatar')) {
$image = $request->file('avatar');
$imageName = time() . '_' . rand(11111, 99999) . '.' . $image->extension();
$path = $image->storeAs(
'user_avatar',
$imageName,
'public'
);
$file = File::create([
'name' => $imageName,
'original_name' => $image->getClientOriginalName(),
'extension' => $image->extension(),
'size' => $image->getSize(),
'path' => $path,
]);
$fileId = $file->id;
}
$user = User::create([
'first_name' => $data['first_name'],
'last_name' => $data['last_name'],
'file_id' => $fileId,
'province_id' => $data['province_id'] ?? null,
'city_id' => $data['city_id'] ?? null,
'national_code' => $data['national_code'],
'gender' => $data['gender'],
'marital_status' => $data['marital_status'],
'spouse_name' => $data['spouse_name'] ?? null,
'mobile' => $data['mobile'],
'email' => $data['email'],
'username' => $data['username'],
'password' => Hash::make($data['password']),
'status' => UserStatus::ENABLE->value,
]);
DB::commit();
Auth::login($user);
return redirect()
->route('index')
->with('success', 'ثبت‌نام شما با موفقیت انجام شد.');
} catch (\Exception $exception) {
DB::rollBack();
if (isset($path) && Storage::disk('public')->exists($path)) {
Storage::disk('public')->delete($path);
}
return back()
->withInput()
->with('error', 'ثبت‌نام با خطا مواجه شد. لطفاً دوباره تلاش کنید.');
}
}
}
+64 -11
View File
@@ -2,8 +2,11 @@
namespace App\Http\Requests\Auth;
use App\Enums\UserGender;
use App\Enums\UserMarital;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
class RegisterPostRequest extends FormRequest
{
@@ -41,19 +44,69 @@ class RegisterPostRequest extends FormRequest
'required',
'string',
'digits:10',
'regex:/^[0-9]{10}$/',
'unique:users,national_code'
],
'gender' => [],
'marital_status' => [],
'spouse_name' => [],
'mobile' => [],
'email' => [],
'username' => [],
'avatar' => [],
'password' => [],
'password_confirmation' => [],
'user_province' => [],
'user_city' => [],
'gender' => [
'required',
'integer',
Rule::enum(UserGender::class),
],
'marital_status' => [
'required',
'integer',
Rule::enum(UserMarital::class),
],
'spouse_name' => [
'nullable',
'string',
'min:5',
'max:255',
'persian_alpha'
],
'mobile' => [
'required',
'string',
'ir_mobile:zero'
],
'email' => [
'required',
'email',
'max:150',
'unique:users,email'
],
'username' => [
'required',
'string',
'regex:/^[a-zA-Z0-9]+$/',
'alpha_num',
'min:8',
'max:100',
'unique:users,username'
],
'avatar' => [
'nullable',
'image',
'mimes:jpg,png,jpeg,webp',
'max:800'
],
'password' => [
'required',
'min:8',
'max:255',
'alpha_num',
'confirmed'
],
'user_province' => [
'nullable',
'integer',
'exists:provinces,id'
],
'user_city' => [
'nullable',
'integer',
'exists:cities,id'
]
];
}
}
+113 -76
View File
@@ -7,7 +7,7 @@
<div class="container">
<h2 class="breadcrumb-title">ثبت نام</h2>
<ul class="breadcrumb-menu">
<li><a href="{{route('index')}}">صفحه اصلی</a></li>
<li><a href="{{ route('index') }}">صفحه اصلی</a></li>
<li class="active">ثبت نام</li>
</ul>
</div>
@@ -15,162 +15,165 @@
<div class="login-area py-120">
<div class="container">
<!-- چون تعداد فیلدها زیاد شده، عرض کانتینر رو از col-md-5 به col-md-8 یا 9 تغییر دادم تا فضا باز بشه -->
@if(session('error'))
<span style="color: red" >{{session('error')}}</span>
@endif
@if(session('success'))
<span style="color: red" >{{session('success')}}</span>
@endif
<div class="col-md-8 mx-auto">
<div class="login-form">
<div class="login-header">
<a href="{{route('index')}}">
<img src="{{asset('assets/img/logo/logo-dark.png')}}" alt="Logo">
<a href="{{ route('index') }}">
<img src="{{ asset('assets/img/logo/logo-dark.png') }}" alt="Logo">
</a>
<p>حساب MyTrip خود را ایجاد کنید</p>
</div>
<form action="#" method="POST" enctype="multipart/form-data">
<form action="{{route('auth.register.post')}}" method="POST" enctype="multipart/form-data">
@csrf
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="first_name">نام</label>
<label for="first_name">نام <span style="color: red">*</span></label>
<div class="form-group-icon">
<input type="text" id="first_name" name="first_name" class="form-control" placeholder="نام" value="{{old('first_name')}}">
<input type="text" id="first_name" name="first_name" class="form-control" placeholder="نام" value="{{ old('first_name') }}">
<i class="far fa-user"></i>
</div>
@error('first_name')
<span style="color: red">{{$message}}</span>
<span style="color: red">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="last_name">نام خانوادگی</label>
<label for="last_name">نام خانوادگی<span style="color: red">*</span></label>
<div class="form-group-icon">
<input type="text" id="last_name" name="last_name" class="form-control" placeholder="نام خانوادگی" value="{{old('last_name')}}">
<input type="text" id="last_name" name="last_name" class="form-control" placeholder="نام خانوادگی" value="{{ old('last_name') }}">
<i class="far fa-user"></i>
</div>
@error('last_name')
<span style="color: red">{{$message}}</span>
<span style="color: red">{{ $message }}</span>
@enderror
</div>
</div>
</div>
<div class="row">
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="national_code">کد ملی</label>
<label for="national_code">کد ملی<span style="color: red">*</span></label>
<div class="form-group-icon">
<input type="text" id="national_code" name="national_code" class="form-control" placeholder="کد ملی" value="{{old('national_code')}}">
<input type="text" id="national_code" name="national_code" class="form-control" placeholder="کد ملی" value="{{ old('national_code') }}">
<i class="far fa-id-card"></i>
</div>
@error('national_code')
<span style="color: red">{{$message}}</span>
<span style="color: red">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="gender">جنسیت</label>
<label for="gender">جنسیت<span style="color: red">*</span></label>
<div class="form-group-icon">
<select id="gender" name="gender" class="form-control">
<option value="">انتخاب کنید</option>
<option value="male">آقا</option>
<option value="female">خانم</option>
<option value="" @selected(old('gender') === null || old('gender') === '')>انتخاب کنید</option>
<option value="{{ \App\Enums\UserGender::UNKNOWN->value }}" @selected(old('gender') !== null && old('gender') !== '' && old('gender') == \App\Enums\UserGender::UNKNOWN->value)>نامشخص</option>
<option value="{{ \App\Enums\UserGender::MALE->value }}" @selected(old('gender') !== null && old('gender') !== '' && old('gender') == \App\Enums\UserGender::MALE->value)>آقا</option>
<option value="{{ \App\Enums\UserGender::FEMALE->value }}" @selected(old('gender') !== null && old('gender') !== '' && old('gender') == \App\Enums\UserGender::FEMALE->value)>خانم</option>
</select>
<i class="far fa-venus-mars"></i>
</div>
@error('gender')
<span style="color: red">{{$message}}</span>
<span style="color: red">{{ $message }}</span>
@enderror
</div>
</div>
</div>
<div class="row">
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="marital_status">وضعیت تاهل</label>
<label for="marital_status">وضعیت تاهل<span style="color: red">*</span></label>
<div class="form-group-icon">
<select id="marital_status" name="marital_status" class="form-control">
<option value="">انتخاب کنید</option>
<option value="single">مجرد</option>
<option value="married">متأهل</option>
<option value="" @selected(old('marital_status') === null || old('marital_status') === '')>انتخاب کنید</option>
<option value="{{ \App\Enums\UserMarital::SINGLE->value }}" @selected(old('marital_status') !== null && old('marital_status') !== '' && old('marital_status') == \App\Enums\UserMarital::SINGLE->value)>مجرد</option>
<option value="{{ \App\Enums\UserMarital::MARRIED->value }}" @selected(old('marital_status') !== null && old('marital_status') !== '' && old('marital_status') == \App\Enums\UserMarital::MARRIED->value)>متأهل</option>
<option value="{{ \App\Enums\UserMarital::DIVORCED->value }}" @selected(old('marital_status') !== null && old('marital_status') !== '' && old('marital_status') == \App\Enums\UserMarital::DIVORCED->value)>جدا شده</option>
</select>
<i class="fas fa-ring"></i>
</div>
@error('marital_status')
<span style="color: red">{{$message}}</span>
<span style="color: red">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="spouse_name">نام و نام خانوادگی همسر</label>
<div class="form-group-icon">
<input type="text" id="spouse_name" name="spouse_name" class="form-control" placeholder="نام همسر" value="{{old('spouse_name')}}">
<input type="text" id="spouse_name" name="spouse_name" class="form-control" placeholder="نام همسر" value="{{ old('spouse_name') }}">
<i class="far fa-user-friends"></i>
</div>
@error('spouse_name')
<span style="color: red">{{$message}}</span>
<span style="color: red">{{ $message }}</span>
@enderror
</div>
</div>
</div>
<div class="row">
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="mobile">شماره همراه</label>
<label for="mobile">شماره همراه<span style="color: red">*</span></label>
<div class="form-group-icon">
<input type="text" id="mobile" name="mobile" class="form-control" placeholder="0912..." value="{{old('mobile')}}">
<input type="text" id="mobile" name="mobile" class="form-control" placeholder="0912..." value="{{ old('mobile') }}">
<i class="fas fa-phone"></i>
</div>
@error('mobile')
<span style="color: red">{{$message}}</span>
<span style="color: red">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="email">آدرس ایمیل</label>
<label for="email">آدرس ایمیل<span style="color: red">*</span></label>
<div class="form-group-icon">
<input type="email" id="mobile" name="email" class="form-control" placeholder="ایمیل خود را وارد کنید" value="{{old('email')}}">
<input type="email" id="email" name="email" class="form-control" placeholder="ایمیل خود را وارد کنید" value="{{ old('email') }}">
<i class="far fa-envelope"></i>
</div>
@error('email')
<span style="color: red">{{$message}}</span>
<span style="color: red">{{ $message }}</span>
@enderror
</div>
</div>
</div>
<div class="row">
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="username">نام کاربری</label>
<label for="username">نام کاربری<span style="color: red">*</span></label>
<div class="form-group-icon">
<input type="text" id="username" name="username" class="form-control" placeholder="Username" value="{{old('username')}}">
<input type="text" id="username" name="username" class="form-control" placeholder="Username" value="{{ old('username') }}">
<i class="far fa-user-circle"></i>
</div>
@error('username')
<span style="color: red">{{$message}}</span>
<span style="color: red">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="avatar">عکس پروفایل</label>
@@ -179,72 +182,73 @@
<i class="far fa-image"></i>
</div>
@error('avatar')
<span style="color: red">{{$message}}</span>
<span style="color: red">{{ $message }}</span>
@enderror
</div>
</div>
</div>
<div class="row">
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="password">رمز عبور</label>
<label for="password">رمز عبور<span style="color: red">*</span></label>
<div class="form-group-icon">
<input type="password" id="password" name="password" class="form-control" placeholder="رمز عبور" required>
<input type="password" id="password" name="password" class="form-control" placeholder="رمز عبور">
<i class="far fa-lock"></i>
</div>
@error('password')
<span style="color: red">{{$message}}</span>
<span style="color: red">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="password_confirmation" >تایید رمز عبور</label>
<label for="password_confirmation">تایید رمز عبور</label>
<div class="form-group-icon">
<input type="password" id="password_confirmation" name="password_confirmation" class="form-control" placeholder="تکرار رمز عبور" required>
<input type="password" id="password_confirmation" name="password_confirmation" class="form-control" placeholder="تکرار رمز عبور">
<i class="far fa-check-circle"></i>
</div>
@error('password_confirmation')
<span style="color: red">{{$message}}</span>
<span style="color: red">{{ $message }}</span>
@enderror
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="user_province">استان</label>
<div class="form-group-icon">
<input type="text" id="user_province" name="user_province" class="form-control" placeholder="استان" value="{{old('user_province')}}">
<i class="fas fa-map-marker-alt"></i>
</div>
@error('user_province')
<span style="color: red">{{$message}}</span>
@enderror
</div>
<label for="province_id">استان</label>
<select id="province_id" name="province_id" class="form-control">
<option value="">انتخاب استان</option>
@foreach ($provinces as $id => $name)
<option value="{{ $id }}" @selected(old('province_id') == $id)>
{{ $name }}
</option>
@endforeach
</select>
@error('province_id')
<span style="color: red">{{ $message }}</span>
@enderror
</div>
<div class="col-md-6">
<div class="form-group">
<label for="user_city">شهر</label>
<div class="form-group-icon">
<input type="text" id="user_city" name="user_city" class="form-control" placeholder="شهر" value="{{old('user_city')}}">
<i class="fas fa-city"></i>
</div>
@error('user_city')
<span style="color: red">{{$message}}</span>
@enderror
</div>
<label for="city_id">شهر</label>
<select id="city_id" name="city_id" class="form-control" disabled>
<option value="">ابتدا استان را انتخاب کنید</option>
</select>
@error('city_id')
<span style="color: red">{{ $message }}</span>
@enderror
</div>
</div>
<div class="form-check form-group mt-3">
<input class="form-check-input" type="checkbox" name="terms" value="1" id="agree" required>
<label class="form-check-label" for="agree">
@@ -259,7 +263,7 @@
<div class="login-footer">
<div class="login-divider"><span>یا</span></div>
<p>از قبل حساب کاربری دارید؟ <a href="{{route('auth.login.index')}}">وارد شدن.</a></p>
<p>از قبل حساب کاربری دارید؟ <a href="{{ route('auth.login.index') }}">وارد شدن.</a></p>
</div>
</div>
</div>
@@ -267,4 +271,37 @@
</div>
</main>
<script>
$(document).ready(function () {
$('#province_id').on('change', function () {
let provinceId = $(this).val();
let citySelect = $('#city_id');
citySelect.prop('disabled', true);
if (!provinceId) {
citySelect.html('<option value="">ابتدا استان را انتخاب کنید</option>');
return;
}
citySelect.html('<option value="">در حال بارگذاری...</option>');
$.get('/get-cities/' + provinceId, function (data) {
citySelect.html('<option value="">انتخاب شهر</option>');
$.each(data, function (key, city) {
citySelect.append(
'<option value="' + city.id + '">' + city.name + '</option>'
);
});
citySelect.prop('disabled', false);
}).fail(function () {
citySelect.html('<option value="">خطا در دریافت شهرها</option>');
});
});
});
</script>
@endsection