From 54207dcf505e9340fa2db483768262162a8dd197 Mon Sep 17 00:00:00 2001 From: developer Date: Fri, 24 Apr 2026 18:37:41 +0800 Subject: [PATCH] =?UTF-8?q?=D1=80=D0=B0=D0=B7=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8?= =?UTF-8?q?=20=D0=BF=D1=83=D0=B1=D0=BB=D0=B8=D0=BA=D0=B0=D1=86=D0=B8=D0=B8?= =?UTF-8?q?=20=D0=BD=D0=BE=D0=B2=D0=BE=D1=81=D1=82=D0=B5=D0=B9=20=D0=BE?= =?UTF-8?q?=D1=82=20=D0=BC=D0=B5=D0=BD=D0=B5=D0=B4=D0=B6=D0=B5=D1=80=D0=BE?= =?UTF-8?q?=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Http/Controllers/AdminPostsController.php | 58 ++++++---- .../PostCreatePolicyAuthorization.php | 24 ++++ app/Modules/Admin/Routes/web.php | 10 +- .../Admin/Views/posts/create.blade.php | 52 +-------- app/Modules/Admin/Views/posts/edit.blade.php | 51 +-------- .../Views/posts/path/create-form.blade.php | 61 ++++++++++ .../Views/posts/path/edit-form.blade.php | 53 +++++++++ app/Modules/Main/Helpers/helper.php | 2 +- app/Modules/Main/Models/Scopes/CityScope.php | 8 +- .../Post/Http/Controllers/PostController.php | 4 +- .../Post/Http/Livewire/PostCreator.php | 106 ++++++++++++++++++ .../Post/Providers/ModuleServiceProvider.php | 2 +- app/Modules/Post/Routes/web.php | 1 + app/Modules/Post/Views/form/create.blade.php | 7 ++ app/Modules/Post/Views/index.blade.php | 12 +- resources/js/{trix.umd.min.js => trix-min.js} | 0 vite.config.js | 2 +- 17 files changed, 317 insertions(+), 136 deletions(-) create mode 100644 app/Modules/Admin/Http/Middleware/PostCreatePolicyAuthorization.php create mode 100644 app/Modules/Admin/Views/posts/path/create-form.blade.php create mode 100644 app/Modules/Admin/Views/posts/path/edit-form.blade.php create mode 100644 app/Modules/Post/Http/Livewire/PostCreator.php create mode 100644 app/Modules/Post/Views/form/create.blade.php rename resources/js/{trix.umd.min.js => trix-min.js} (100%) diff --git a/app/Modules/Admin/Http/Controllers/AdminPostsController.php b/app/Modules/Admin/Http/Controllers/AdminPostsController.php index 7435984..b563988 100644 --- a/app/Modules/Admin/Http/Controllers/AdminPostsController.php +++ b/app/Modules/Admin/Http/Controllers/AdminPostsController.php @@ -3,8 +3,13 @@ namespace Modules\Admin\Http\Controllers; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; +use Modules\User\Models\User; +use Modules\User\Models\Role; + use Modules\Main\Models\City; use Modules\Post\Models\Post; +use Modules\Post\Models\PostCity; use App\Http\Controllers\Controller; use Modules\Post\Models\PostCategory; @@ -15,8 +20,7 @@ class AdminPostsController extends Controller public function index() { $posts = Post::orderBy('id', 'desc'); - if (!auth()->user()->isAdmin() && auth()->user()->isCityManager()) - { + if (!auth()->user()->isAdmin() && auth()->user()->isCityManager()) { } $posts = $posts->get(); @@ -35,53 +39,65 @@ public function create() public function store(Request $request) { $validated = $request->validate([ - 'name' => 'required', - 'category' => 'required', + 'name' => 'required', + 'category' => 'required', 'short_text' => 'max:500', - 'text' => 'required', - 'imageFile' => 'required|mimes:jpg,bmp,png' + 'text' => 'required', + 'imageFile' => 'required|mimes:jpg,bmp,png' ]); + + if (!Auth::user()->hasRole(Role::SUPER_ADMIN)) { + if (!Auth::user()->hasRole(Role::CITY_MANAGER)) { + return back(); + } + if ($request->has('cities')) { + $availableCities = GetAvailableCities()->pluck('id')->toArray(); + foreach ($request->cities as $cityId) { + if (!in_array($cityId, $availableCities)) { + return back(); + } + } + } else { + return back(); + } + } $path = $request->file('imageFile')->store('posts', ['disk' => 'public']); $request['image'] = $path; $post = Post::create( $request->only(['name', 'short_text', 'text', 'category', 'image']) ); - if (array_key_exists('cities', $request->all()) && is_array($request['cities'])) - { - foreach ($request->cities as $cityId) - { - $post->cities()->create([ + if (array_key_exists('cities', $request->all()) && is_array($request['cities'])) { + foreach ($request->cities as $cityId) { + PostCity::create([ + 'post_id' => $post->id, 'city_id' => $cityId, ]); } } - return to_route('admin.posts'); + return back()->withSuccess('Новость добавлена успешно'); } public function edit(Post $post) { return view('admin::posts.edit', [ 'categories' => PostCategory::cases(), - 'post' => $post + 'post' => $post ]); } public function update(Request $request, Post $post) { $validated = $request->validate([ - 'name' => 'required', - 'category' => 'required', + 'name' => 'required', + 'category' => 'required', 'short_text' => 'max:500', - 'text' => 'required', + 'text' => 'required', ]); - if ($request->file('imageFile')) - { + if ($request->file('imageFile')) { $path = $request->file('imageFile')->store('posts', ['disk' => 'public']); $request['image'] = $path; - } - else - { + } else { $reuqest['image'] = $post->image; } $post = $post->update( diff --git a/app/Modules/Admin/Http/Middleware/PostCreatePolicyAuthorization.php b/app/Modules/Admin/Http/Middleware/PostCreatePolicyAuthorization.php new file mode 100644 index 0000000..3f3bc70 --- /dev/null +++ b/app/Modules/Admin/Http/Middleware/PostCreatePolicyAuthorization.php @@ -0,0 +1,24 @@ +can('viewAdminPath', User::class) && !Auth::user()->hasRole(Role::CITY_MANAGER)) + { + abort(403, 'Unauthorized action.'); + } + + return $next($request); + } +} \ No newline at end of file diff --git a/app/Modules/Admin/Routes/web.php b/app/Modules/Admin/Routes/web.php index ff89fc1..311ca8a 100644 --- a/app/Modules/Admin/Routes/web.php +++ b/app/Modules/Admin/Routes/web.php @@ -3,11 +3,17 @@ use Illuminate\Support\Facades\Route; use Modules\Admin\Http\Controllers\AdminController; use Modules\Admin\Http\Middleware\AdminPolicyAuthorization; +use Modules\Admin\Http\Middleware\PostCreatePolicyAuthorization; use Modules\Admin\Http\Middleware\GloabalAdminPathsPolicyAuthorization; Route::get('/admin', [Modules\Admin\Http\Controllers\AdminController::class, 'index'])->name('admin.index'); Route::post('/admin/set', [Modules\Admin\Http\Controllers\AdminController::class, 'setSuperAdmin'])->name('admin.setSuperAdmin'); - + +Route::middleware(['auth', PostCreatePolicyAuthorization::class])->group(function () +{ + Route::post('/admin/posts/store', [Modules\Admin\Http\Controllers\AdminPostsController::class, 'store'])->name('admin.posts.store'); + Route::post('/admin/post/{post}/update', [Modules\Admin\Http\Controllers\AdminPostsController::class, 'update'])->name('admin.posts.update'); +}); Route::middleware(['auth', AdminPolicyAuthorization::class])->group(function () { @@ -54,9 +60,7 @@ 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'); Route::get('/admin/post/{post}/edit', [Modules\Admin\Http\Controllers\AdminPostsController::class, 'edit'])->name('admin.posts.edit'); - Route::post('/admin/post/{post}/update', [Modules\Admin\Http\Controllers\AdminPostsController::class, 'update'])->name('admin.posts.update'); Route::post('/admin/post/{post}/delete', [Modules\Admin\Http\Controllers\AdminPostsController::class, 'delete'])->name('admin.posts.delete'); Route::get('/admin/docs', [Modules\Admin\Http\Controllers\AdminDocsController::class, 'index'])->name('admin.docs'); diff --git a/app/Modules/Admin/Views/posts/create.blade.php b/app/Modules/Admin/Views/posts/create.blade.php index 86c1d4a..0219736 100644 --- a/app/Modules/Admin/Views/posts/create.blade.php +++ b/app/Modules/Admin/Views/posts/create.blade.php @@ -1,55 +1,5 @@ @php($title = 'Новости') @extends('layouts.admin') @section('content') - - - -

Добавить новость

-
- @csrf -
- - - @error('name') -
{{ $message }}
- @enderror -
-
-
- - - @error('category') -
{{ $message }}
- @enderror -
-
- - - @error('imageFile') -
{{ $message }}
- @enderror -
-
-
- - - @error('short_text') -
{{ $message }}
- @enderror -
-
- - - - @error('text') -
{{ $message }}
- @enderror -
- - -
+ @include('admin::posts.path.create-form') @endsection diff --git a/app/Modules/Admin/Views/posts/edit.blade.php b/app/Modules/Admin/Views/posts/edit.blade.php index d3ced20..7cda1d2 100644 --- a/app/Modules/Admin/Views/posts/edit.blade.php +++ b/app/Modules/Admin/Views/posts/edit.blade.php @@ -1,54 +1,5 @@ @php($title = 'Новости') @extends('layouts.admin') @section('content') - - @vite(['trix.umd.min.js']) -

Добавить новость

-
- @csrf -
- - - @error('name') -
{{ $message }}
- @enderror -
-
-
- - - @error('category') -
{{ $message }}
- @enderror -
-
- - - @error('imageFile') -
{{ $message }}
- @enderror -
-
-
- - - @error('short_text') -
{{ $message }}
- @enderror -
-
- - - - @error('text') -
{{ $message }}
- @enderror -
- -
+ @include('admin::posts.path.edit-form') @endsection diff --git a/app/Modules/Admin/Views/posts/path/create-form.blade.php b/app/Modules/Admin/Views/posts/path/create-form.blade.php new file mode 100644 index 0000000..6ecc8a2 --- /dev/null +++ b/app/Modules/Admin/Views/posts/path/create-form.blade.php @@ -0,0 +1,61 @@ + + +

Добавить новость

+
+ @csrf +
+ + + @error('name') +
{{ $message }}
+ @enderror +
+
+ @if($availableCities = GetAvailableCities()) + @foreach($availableCities as $key=>$city) +
+ + +
+ @endforeach + @endif +
+
+
+ + + @error('category') +
{{ $message }}
+ @enderror +
+
+ + + @error('imageFile') +
{{ $message }}
+ @enderror +
+
+
+ + + @error('short_text') +
{{ $message }}
+ @enderror +
+
+ + + + @error('text') +
{{ $message }}
+ @enderror +
+ +
\ No newline at end of file diff --git a/app/Modules/Admin/Views/posts/path/edit-form.blade.php b/app/Modules/Admin/Views/posts/path/edit-form.blade.php new file mode 100644 index 0000000..4da1c18 --- /dev/null +++ b/app/Modules/Admin/Views/posts/path/edit-form.blade.php @@ -0,0 +1,53 @@ + + +

Добавить новость

+
+ @csrf +
+ + + @error('name') +
{{ $message }}
+ @enderror +
+
+
+ + + @error('category') +
{{ $message }}
+ @enderror +
+
+ + + @error('imageFile') +
{{ $message }}
+ @enderror +
+
+
+ + + @error('short_text') +
{{ $message }}
+ @enderror +
+
+ + + + @error('text') +
{{ $message }}
+ @enderror +
+ +
\ No newline at end of file diff --git a/app/Modules/Main/Helpers/helper.php b/app/Modules/Main/Helpers/helper.php index 43d25b4..bbe2f73 100644 --- a/app/Modules/Main/Helpers/helper.php +++ b/app/Modules/Main/Helpers/helper.php @@ -131,7 +131,7 @@ function GetAvailableCities() return City::all(); } if ($user->hasRole(Role::CITY_MANAGER)) { - $cititesOfManager = CityManager::where('user_id', $user->id)->pluck('city_id')->get(); + $cititesOfManager = CityManager::where('user_id', $user->id)->pluck('city_id'); if ($cititesOfManager->count()) { return City::whereIn('id', $cititesOfManager)->get(); } diff --git a/app/Modules/Main/Models/Scopes/CityScope.php b/app/Modules/Main/Models/Scopes/CityScope.php index 9f9f192..cd73ad7 100644 --- a/app/Modules/Main/Models/Scopes/CityScope.php +++ b/app/Modules/Main/Models/Scopes/CityScope.php @@ -12,21 +12,17 @@ class CityScope implements Scope */ public function apply(Builder $builder, Model $model): void { - if ($model->cities()->count()) { //если города для новости установлены + //dd(GetAvailableCities()); if ($cities = GetAvailableCities()) { //получаю доступные пользователю города $citiesIds = []; foreach ($cities as $city) { $citiesIds[] = $city->id; } $builder->whereHas('cities', fn($q) => $q->whereIn('cities.id', $citiesIds)); - + $builder->OrDoesntHave('cities'); } else { $builder->where('id', 0);//не знаю, как сделать, чтобы выбор был гарантированно пустой } - } else { - - } - //$builder->where('created_at', '<', now()->minus(years: 2000)); } } ?> \ No newline at end of file diff --git a/app/Modules/Post/Http/Controllers/PostController.php b/app/Modules/Post/Http/Controllers/PostController.php index 890bfe5..7f294ca 100644 --- a/app/Modules/Post/Http/Controllers/PostController.php +++ b/app/Modules/Post/Http/Controllers/PostController.php @@ -25,5 +25,7 @@ public function open(Post $post) 'post' => $post ]); } - + public function create() { + return view('post::form.create'); + } } diff --git a/app/Modules/Post/Http/Livewire/PostCreator.php b/app/Modules/Post/Http/Livewire/PostCreator.php new file mode 100644 index 0000000..81c52bd --- /dev/null +++ b/app/Modules/Post/Http/Livewire/PostCreator.php @@ -0,0 +1,106 @@ +dispatch('phoneInputAdded'); + + } + public function resetData() + { + $this->mount(); + } + public function back() + { + $this->status = FormStatus::IN_PROCESS; + } + + public function save() + { + $hasErrors = false; + foreach ($this->selectedObjects as $complexId=>$room) { + if ($this->createDeal($complexId, $room)) { + unset($this->selectedObjects[$complexId]); + } else { + $hasErrors = true; + } + } + if ($hasErrors) { + return $this->status = FormStatus::ERROR; + } + $this->status = FormStatus::SUCCESS; + } + + private function createDeal($complexId, $room) + { + if ( + !$deal = Deal::create([ + 'agent_id' => $this->agentId, + 'complex_id' => $complexId, + 'plan7_data' => (is_array($room) && array_key_exists('id', $room)) ? json_encode($room) : null + ]) + ) { + return false; + } + + foreach ($this->contacts as $contact) { + if ( + !$newUser = Client::updateOrCreate( + ['phone' => $contact['phones'][0]], + [ + 'name' => trim($contact['firstName'] . ' ' . $contact['secondName']), + 'phone' => $contact['phones'][0] + ] + ) + ) { + return false; + } + if ( + !$dealClient = DealClients::firstOrCreate([ + 'deal_id' => $deal->id, + 'client_id' => $newUser->id + ]) + ) { + return false; + } + } + $this->dispatch('clientCreated'); + return true; + } +} \ No newline at end of file diff --git a/app/Modules/Post/Providers/ModuleServiceProvider.php b/app/Modules/Post/Providers/ModuleServiceProvider.php index 7e77184..ea2d533 100644 --- a/app/Modules/Post/Providers/ModuleServiceProvider.php +++ b/app/Modules/Post/Providers/ModuleServiceProvider.php @@ -63,7 +63,7 @@ protected function registerLivewire() { Livewire::component('posts.list', \Modules\Post\Http\Livewire\PostsList::class); Livewire::component('post.card', \Modules\Post\Http\Livewire\PostCard::class); - + Livewire::component('post.form', \Modules\Post\Http\Livewire\PostCreator::class); } protected function registerComponent() diff --git a/app/Modules/Post/Routes/web.php b/app/Modules/Post/Routes/web.php index 2a055cc..ca7b57f 100644 --- a/app/Modules/Post/Routes/web.php +++ b/app/Modules/Post/Routes/web.php @@ -5,4 +5,5 @@ Route::middleware(['auth'])->group(function () { Route::get('/news', [Modules\Post\Http\Controllers\PostController::class, 'index'])->name('posts'); + Route::get('/news/create', [Modules\Post\Http\Controllers\PostController::class, 'create'])->name('post.create'); }); \ No newline at end of file diff --git a/app/Modules/Post/Views/form/create.blade.php b/app/Modules/Post/Views/form/create.blade.php new file mode 100644 index 0000000..c8be284 --- /dev/null +++ b/app/Modules/Post/Views/form/create.blade.php @@ -0,0 +1,7 @@ +@extends('layouts.app') + +@section('content') +
+ @include('admin::posts.path.create-form') +
+@endsection diff --git a/app/Modules/Post/Views/index.blade.php b/app/Modules/Post/Views/index.blade.php index d5b04ab..196c32e 100644 --- a/app/Modules/Post/Views/index.blade.php +++ b/app/Modules/Post/Views/index.blade.php @@ -49,5 +49,15 @@
@livewire('posts.list', $filter)
- +
+ + + + + +
+ @endsection diff --git a/resources/js/trix.umd.min.js b/resources/js/trix-min.js similarity index 100% rename from resources/js/trix.umd.min.js rename to resources/js/trix-min.js diff --git a/vite.config.js b/vite.config.js index 91602a0..4c80aa0 100644 --- a/vite.config.js +++ b/vite.config.js @@ -16,7 +16,7 @@ export default defineConfig({ 'resources/css/docs.css', 'resources/css/multiselect.css', 'resources/js/phone-format.js', - 'resources/js/trix.umd.min.js', + 'resources/js/trix-min.js', 'resources/fonts/TikTokSans.ttf', 'resources/woff/bootstrap-icons.woff2', ],