diff --git a/app/Models/City.php b/app/Models/City.php index fe7fda8..581b906 100644 --- a/app/Models/City.php +++ b/app/Models/City.php @@ -4,8 +4,13 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; - +use Illuminate\Database\Eloquent\SoftDeletes; class City extends Model { use HasFactory; + use SoftDeletes; + + protected $fillable = [ + 'name' + ]; } diff --git a/app/Models/Complex.php b/app/Models/Complex.php index 53efa95..f640ed3 100644 --- a/app/Models/Complex.php +++ b/app/Models/Complex.php @@ -4,12 +4,14 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\SoftDeletes; class Complex extends Model { use HasFactory; - - public function city() { - return $this->belongsTo(\App\Models\City::class, 'city_id'); + use SoftDeletes; + public function city() + { + return $this->belongsTo(\App\Models\City::class, 'city_id')->withTrashed(); } } diff --git a/app/Models/User/UserRole.php b/app/Models/User/UserRole.php index 3204fb8..9930e16 100644 --- a/app/Models/User/UserRole.php +++ b/app/Models/User/UserRole.php @@ -8,11 +8,16 @@ use App\Models\User\Role; class UserRole extends Model - { +{ use HasFactory; protected $fillable = [ 'user_id', 'role_id', ]; + + public function role() + { + return $this->belongsTo(Role::class, 'role_id'); } +} diff --git a/app/Modules/Admin/Http/Controllers/AdminCitiesController.php b/app/Modules/Admin/Http/Controllers/AdminCitiesController.php new file mode 100644 index 0000000..b10c0cb --- /dev/null +++ b/app/Modules/Admin/Http/Controllers/AdminCitiesController.php @@ -0,0 +1,65 @@ +filter) { + switch ( $request->filter ) + { + case 'trashed': + $cities->onlyTrashed(); + break; + case 'actual': + break; + default: + $cities->withTrashed(); + break; + } + //} + $cities = $cities->get(); + return view('admin::cities.index', [ + 'cities' => $cities, + 'filter' => $request->filter + ]); + } + public function edit(City $city) + { + return view('admin::companies.edit', [ + 'city' => $city, + ]); + } + + public function update(Request $request, City $city) + { + $city->update($request->only('name')); + return to_route('admin.companies'); + } + + public function create(Request $request) + { + $city = City::create($request->only('name')); + return to_route('admin.cities'); + } + + public function delete(City $city) + { + $city->delete(); + return to_route('admin.cities'); + } + + public function restore(City $city) + { + $city->restore(); + return to_route('admin.cities'); + } + +} diff --git a/app/Modules/Admin/Http/Controllers/AdminCompaniesController.php b/app/Modules/Admin/Http/Controllers/AdminCompaniesController.php new file mode 100644 index 0000000..a27680e --- /dev/null +++ b/app/Modules/Admin/Http/Controllers/AdminCompaniesController.php @@ -0,0 +1,35 @@ +get(); + return view('admin::companies.index', [ + 'companies' => $companies + ]); + } + public function edit(Company $company) + { + return view('admin::companies.edit', [ + 'company' => $company, + ]); + } + + public function update(Request $request, Company $company) + { + $company->update($request->only('name', 'email', 'phone')); + return to_route('admin.companies'); + } + +} diff --git a/app/Modules/Admin/Http/Controllers/AdminComplexesController.php b/app/Modules/Admin/Http/Controllers/AdminComplexesController.php new file mode 100644 index 0000000..e149344 --- /dev/null +++ b/app/Modules/Admin/Http/Controllers/AdminComplexesController.php @@ -0,0 +1,65 @@ +filter) { + switch ( $request->filter ) + { + case 'trashed': + $complexes->onlyTrashed(); + break; + case 'actual': + break; + default: + $complexes->withTrashed(); + break; + } + //} + $complexes = $complexes->get(); + return view('admin::complexes.index', [ + 'complexes' => $complexes, + 'filter' => $request->filter + ]); + } + public function edit(Complex $complex) + { + return view('admin::companies.edit', [ + 'complex' => $complex, + ]); + } + + public function update(Request $request, Complex $complex) + { + $complex->update($request->only('name')); + return to_route('admin.complexes'); + } + + public function create(Request $request) + { + $city = Complex::create($request->only('name')); + return to_route('admin.complexes'); + } + + public function delete(Complex $complex) + { + $complex->delete(); + return to_route('admin.complexes'); + } + + public function restore(Complex $complex) + { + $complex->restore(); + return to_route('admin.complexes'); + } + +} diff --git a/app/Modules/Admin/Http/Controllers/AdminPaymentsController.php b/app/Modules/Admin/Http/Controllers/AdminPaymentsController.php new file mode 100644 index 0000000..cff92d4 --- /dev/null +++ b/app/Modules/Admin/Http/Controllers/AdminPaymentsController.php @@ -0,0 +1,26 @@ + Company::orderBy('name')->get(), + 'complexes' => Complex::orderBy('name')->get(), + 'agents' => Agent::all() + ]); + } +} diff --git a/app/Modules/Admin/Http/Controllers/AdminUsersController.php b/app/Modules/Admin/Http/Controllers/AdminUsersController.php new file mode 100644 index 0000000..24f0689 --- /dev/null +++ b/app/Modules/Admin/Http/Controllers/AdminUsersController.php @@ -0,0 +1,62 @@ +role && $request->role != 'all') + { + $users->whereIn( + 'id', + UserRole::where('role_id', $request->role) + ->get() + ->map(function (UserRole $userRole) + { + return $userRole->user_id; + }) + ); + } + return view('admin::users.index', [ + 'users' => $users->get(), + 'roles' => Role::all(), + 'role' => $request->role + ]); + } + public function edit(User $user) + { + $roles = UserRole::where('user_id', $user->id)->get(); + return view('admin::users.edit', [ + 'user' => $user, + 'userRoles' => $roles, + 'roles' => Role::class + ]); + } + + public function update(Request $request, User $user) + { + $user->update($request->only('name', 'email', 'phone')); + return to_route('admin.users'); + } + + public function deleteUserRole(UserRole $userRole) + { + $user = User::find($userRole->user_id); + $userRole->delete(); + return to_route('admin.users.edit', [ + 'user' => $user + ]); + } +} diff --git a/app/Modules/Admin/Routes/web.php b/app/Modules/Admin/Routes/web.php index 3d81066..a848172 100644 --- a/app/Modules/Admin/Routes/web.php +++ b/app/Modules/Admin/Routes/web.php @@ -16,6 +16,31 @@ Route::get('/admin', [Modules\Admin\Http\Controllers\AdminController::class, 'index'])->name('admin.index'); + + Route::get('/admin/users', [Modules\Admin\Http\Controllers\AdminUsersController::class, 'index'])->name('admin.users'); + Route::get('/admin/users/{user}/edit', [Modules\Admin\Http\Controllers\AdminUsersController::class, 'edit'])->name('admin.users.edit'); + Route::post('/admin/users/{user}/update', [Modules\Admin\Http\Controllers\AdminUsersController::class, 'update'])->name('admin.users.update'); + Route::post('/admin/user-role/{userRole}/delete', [Modules\Admin\Http\Controllers\AdminUsersController::class, 'deleteUserRole'])->name('admin.users.role.delete'); + + Route::get('/admin/companies', [Modules\Admin\Http\Controllers\AdminCompaniesController::class, 'index'])->name('admin.companies'); + Route::get('/admin/companies/{company}/edit', [Modules\Admin\Http\Controllers\AdminCompaniesController::class, 'edit'])->name('admin.companies.edit'); + Route::post('/admin/companies/{company}/update', [Modules\Admin\Http\Controllers\AdminUsersController::class, 'update'])->name('admin.companies.update'); + Route::post('/admin/companies/{company}/delete', [Modules\Admin\Http\Controllers\AdminUsersController::class, 'update'])->name('admin.companies.delete'); + + Route::get('/admin/cities', [Modules\Admin\Http\Controllers\AdminCitiesController::class, 'index'])->name('admin.cities'); + Route::get('/admin/cities/{city}/edit', [Modules\Admin\Http\Controllers\AdminCitiesController::class, 'edit'])->name('admin.cities.edit'); + Route::post('/admin/cities/create', [Modules\Admin\Http\Controllers\AdminCitiesController::class, 'create'])->name('admin.cities.create'); + Route::post('/admin/cities/{city}/delete', [Modules\Admin\Http\Controllers\AdminCitiesController::class, 'delete'])->name('admin.cities.delete'); + Route::post('/admin/cities/{city}/restore', [Modules\Admin\Http\Controllers\AdminCitiesController::class, 'restore'])->withTrashed()->name('admin.cities.restore'); + + Route::get('/admin/complexes', [Modules\Admin\Http\Controllers\AdminComplexesController::class, 'index'])->name('admin.complexes'); + Route::get('/admin/complexes/{complex}/edit', [Modules\Admin\Http\Controllers\AdminComplexesController::class, 'edit'])->name('admin.complexes.edit'); + Route::post('/admin/complexes/create', [Modules\Admin\Http\Controllers\AdminComplexesController::class, 'create'])->name('admin.complexes.create'); + Route::post('/admin/complexes/{complex}/delete', [Modules\Admin\Http\Controllers\AdminComplexesController::class, 'delete'])->name('admin.complexes.delete'); + Route::post('/admin/complexes/{complex}/restore', [Modules\Admin\Http\Controllers\AdminComplexesController::class, 'restore'])->withTrashed()->name('admin.complexes.restore'); + + Route::get('/admin/payments', [Modules\Admin\Http\Controllers\AdminPaymentsController::class, 'index'])->name('admin.payments'); + Route::get('/admin/posts', [Modules\Admin\Http\Controllers\AdminPostsController::class, 'index'])->name('admin.posts'); Route::get('/admin/posts/create', [Modules\Admin\Http\Controllers\AdminPostsController::class, 'create'])->name('admin.posts.create'); Route::post('/admin/posts/store', [Modules\Admin\Http\Controllers\AdminPostsController::class, 'store'])->name('admin.posts.store'); diff --git a/app/Modules/Admin/Views/cities/index.blade.php b/app/Modules/Admin/Views/cities/index.blade.php new file mode 100644 index 0000000..c2ad165 --- /dev/null +++ b/app/Modules/Admin/Views/cities/index.blade.php @@ -0,0 +1,106 @@ +@extends('layouts.admin') +@section('content') +

Города

+ +
+
+ + + + + + + + +
+ + +
+ +
+
+
+ + + + + + + + + @foreach ($cities as $city) + + + + + + @endforeach + +
НазваниеДата создания +
+ {{ $city->name }} + + {{ $city->created_at ? $city->created_at->diffForHumans() : '' }} + + +
+
+ + + +@endsection diff --git a/app/Modules/Admin/Views/companies/edit.blade.php b/app/Modules/Admin/Views/companies/edit.blade.php new file mode 100644 index 0000000..1c02be2 --- /dev/null +++ b/app/Modules/Admin/Views/companies/edit.blade.php @@ -0,0 +1,77 @@ +@extends('layouts.admin') +@section('content') +
+ +

Редактировать данные пользователя

+
+ @csrf +
+ + + @error('name') +
{{ $message }}
+ @enderror +
+
+
+ + + @error('email') +
{{ $message }}
+ @enderror +
+
+ + + @error('phone') +
{{ $message }}
+ @enderror +
+
+ +
+
+ +
+

Роли пользователя

+ + + + + + + @foreach ($userRoles as $userRole) + + + + + + @endforeach + +
Роль + Когда назначена + +
+ {{ __($userRole->role->name) }} + + {{ $userRole->created_at->diffForHumans() }} + + +
+
+@endsection diff --git a/app/Modules/Admin/Views/companies/index.blade.php b/app/Modules/Admin/Views/companies/index.blade.php new file mode 100644 index 0000000..5d5ae51 --- /dev/null +++ b/app/Modules/Admin/Views/companies/index.blade.php @@ -0,0 +1,54 @@ +@extends('layouts.admin') +@section('content') +
+ @if ($companies->count() == 0) +
Нет данных для отображения
+ @else +
+ + + + + + + @foreach ($companies as $company) + + + + + + + @endforeach + +
Название + + + +
+ {{ $company->name }} + + + + + + +
+
+ @endif +
+ +@endsection diff --git a/app/Modules/Admin/Views/complexes/index.blade.php b/app/Modules/Admin/Views/complexes/index.blade.php new file mode 100644 index 0000000..a50143e --- /dev/null +++ b/app/Modules/Admin/Views/complexes/index.blade.php @@ -0,0 +1,111 @@ +@extends('layouts.admin') +@section('content') +

Жилые комплексы

+ +
+
+ + + + + + + + +
+ + +
+ +
+
+
+ + + + + + + + + @foreach ($complexes as $complex) + + + + + + + @endforeach + +
НазваниеГородДата создания + +
+ {{ $complex->name }} + + {{ $complex->city->name }} + + {{ $complex->created_at ? $complex->created_at->diffForHumans() : '' }} + + +
+
+ + + +@endsection diff --git a/app/Modules/Admin/Views/menu/index.blade.php b/app/Modules/Admin/Views/menu/index.blade.php index 02a69ae..049a02b 100644 --- a/app/Modules/Admin/Views/menu/index.blade.php +++ b/app/Modules/Admin/Views/menu/index.blade.php @@ -11,34 +11,29 @@ class="nav-link d-flex align-items-center gap-2 fs-5 border rounded-4 active" -
  • - -
  • -
  • + href="{{ route('admin.cities') }}">Города
  • + href="{{ route('admin.companies') }}">Организации + href="{{ route('admin.payments') }}">Вознаграждения @endif diff --git a/app/Modules/Admin/Views/payments/index.blade.php b/app/Modules/Admin/Views/payments/index.blade.php new file mode 100644 index 0000000..91958ec --- /dev/null +++ b/app/Modules/Admin/Views/payments/index.blade.php @@ -0,0 +1,28 @@ +@extends('layouts.admin') +@section('content') +

    Вознаграждения

    +
    + + + + + @foreach ($complexes as $complex) + + @endforeach + + + + @foreach ($companies as $company) + + + @foreach ($complexes as $complex) + + @endforeach + + @endforeach + +
    Компания{{ $complex->name }}
    + {{ $company->name }} + Наследовать
    +
    +@endsection diff --git a/app/Modules/Admin/Views/posts/index.blade.php b/app/Modules/Admin/Views/posts/index.blade.php index 83b8445..bdb0496 100644 --- a/app/Modules/Admin/Views/posts/index.blade.php +++ b/app/Modules/Admin/Views/posts/index.blade.php @@ -1,11 +1,9 @@ @extends('layouts.admin') @section('content')
    - -
    - + Добавить новость
    diff --git a/app/Modules/Admin/Views/posts/list.blade.php b/app/Modules/Admin/Views/posts/list.blade.php index 014f25f..74bff39 100644 --- a/app/Modules/Admin/Views/posts/list.blade.php +++ b/app/Modules/Admin/Views/posts/list.blade.php @@ -2,28 +2,32 @@ @if ($posts->count() == 0)
    Нет данных для отображения
    @else -
    +
    - @foreach ($posts as $post) - +
    ID Название Дата создания + Дата изменения
    - {{ $post->id }} - {{ $post->name }} {{ $post->created_at->diffForHumans() }} + @if ($post->created_at != $post->updated_at) + {{ $post->updated_at->diffForHumans() }} + @else + — + @endif + + +
    +

    Роли пользователя

    + + + + + + + @foreach ($userRoles as $userRole) + + + + + + @endforeach + +
    Роль + Когда назначена + +
    + {{ __($userRole->role->name) }} + + {{ $userRole->created_at->diffForHumans() }} + + +
    +
    +@endsection diff --git a/app/Modules/Admin/Views/users/index.blade.php b/app/Modules/Admin/Views/users/index.blade.php new file mode 100644 index 0000000..4d02f41 --- /dev/null +++ b/app/Modules/Admin/Views/users/index.blade.php @@ -0,0 +1,80 @@ +@extends('layouts.admin') +@section('content') +
    + @if ($users->count() == 0) +
    Нет данных для отображения
    + @else +
    +
    + + + @foreach ($roles as $roleItem) + id == $role ? 'checked' : '' }}> + + @endforeach +
    + +
    + +
    +
    + +
    + + + + + + + @foreach ($users as $user) + + + + + + + + @endforeach + +
    ФИО + Email + Телефон + Создан + +
    + {{ $user->name }} + + {{ $user->email }} + + {{ $user->phone }} + + {{ $user->created_at->diffForHumans() }} + + +
    +
    + @endif + @livewire('post.card') +
    + +@endsection diff --git a/database/migrations/2025_04_10_065707_add_deleted_at_column_to_cities_table.php b/database/migrations/2025_04_10_065707_add_deleted_at_column_to_cities_table.php new file mode 100644 index 0000000..4e7fc05 --- /dev/null +++ b/database/migrations/2025_04_10_065707_add_deleted_at_column_to_cities_table.php @@ -0,0 +1,30 @@ +softDeletes(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('cities', function (Blueprint $table) + { + // + }); + } +}; diff --git a/database/migrations/2025_04_10_073346_add_deleted_at_column_to_complexes_table.php b/database/migrations/2025_04_10_073346_add_deleted_at_column_to_complexes_table.php new file mode 100644 index 0000000..4e41f89 --- /dev/null +++ b/database/migrations/2025_04_10_073346_add_deleted_at_column_to_complexes_table.php @@ -0,0 +1,30 @@ +softDeletes(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('complexes', function (Blueprint $table) + { + // + }); + } +}; diff --git a/lang/ru.json b/lang/ru.json index 3755f2d..46a5c78 100644 --- a/lang/ru.json +++ b/lang/ru.json @@ -36,5 +36,9 @@ "Credits": "Ипотека", "News": "Новости", "Projects": "Проекты", - "Sale": "Акции" + "Sale": "Акции", + "Super admin": "Суперадмин", + "Company admin": "Администратор агентства", + "Agent": "Агент", + "Client": "Клиент" } \ No newline at end of file