diff --git a/app/Http/Controllers/NewsController.php b/app/Http/Controllers/NewsController.php
new file mode 100644
index 0000000..24437bb
--- /dev/null
+++ b/app/Http/Controllers/NewsController.php
@@ -0,0 +1,61 @@
+sortDesc();
+ return view('admin.news.index', compact('news'));
+ }
+
+ public function create()
+ {
+ return view('admin.news.create');
+ }
+
+ public function store(StoreNewsRequest $request)
+ {
+ $validated = $request->validated();
+ $urlPhoto = Storage::put('public', $request->file('photo'));
+
+ $news = new News();
+ $news->name = $validated['name'];
+ $news->text = $validated['text'];
+ $news->photo = Storage::url($urlPhoto);
+ $news->save();
+ return redirect()->route('news.index');
+ }
+
+ public function show(News $news)
+ {
+ return view('admin.news.show', compact('news'));
+ }
+
+ public function edit(News $news)
+ {
+ return view('admin.news.edit', compact('news'));
+ }
+
+ public function update(UpdateNewsRequest $request, News $news)
+ {
+ $validated = $request->validated();
+
+ $news->name = $validated['name'];
+ $news->text = $validated['text'];
+ $news->save();
+ return redirect()->route('news.index');
+ }
+
+ public function destroy(News $news)
+ {
+ $news->delete();
+ return redirect()->route('news.index');
+ }
+}
diff --git a/app/Http/Requests/admin/StoreNewsRequest.php b/app/Http/Requests/admin/StoreNewsRequest.php
new file mode 100644
index 0000000..5f92520
--- /dev/null
+++ b/app/Http/Requests/admin/StoreNewsRequest.php
@@ -0,0 +1,22 @@
+ 'required|string|max:255',
+ 'text' => 'string',
+ 'photo' => 'required|file',
+ ];
+ }
+}
diff --git a/app/Http/Requests/admin/UpdateNewsRequest.php b/app/Http/Requests/admin/UpdateNewsRequest.php
new file mode 100644
index 0000000..e72b94f
--- /dev/null
+++ b/app/Http/Requests/admin/UpdateNewsRequest.php
@@ -0,0 +1,21 @@
+ 'required|string|max:255',
+ 'text' => 'string',
+ ];
+ }
+}
diff --git a/app/Models/News.php b/app/Models/News.php
new file mode 100644
index 0000000..468d8a8
--- /dev/null
+++ b/app/Models/News.php
@@ -0,0 +1,19 @@
+ fake()->name(),
+ 'text' => fake()->text(),
+ 'photo' => fake()->url(),
+ ];
+ }
+}
diff --git a/database/migrations/2024_03_20_070333_create_news_table.php b/database/migrations/2024_03_20_070333_create_news_table.php
new file mode 100644
index 0000000..f460ac5
--- /dev/null
+++ b/database/migrations/2024_03_20_070333_create_news_table.php
@@ -0,0 +1,30 @@
+id();
+ $table->string('name', 255);
+ $table->text('text');
+ $table->string('photo', 255);
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('news');
+ }
+};
diff --git a/database/seeders/NewsSeeder.php b/database/seeders/NewsSeeder.php
new file mode 100644
index 0000000..782967e
--- /dev/null
+++ b/database/seeders/NewsSeeder.php
@@ -0,0 +1,29 @@
+insert([
+ [
+ 'name' => 'Первая новость',
+ 'text' => fake()->realText(),
+ 'photo' => '1',
+ ],
+ [
+ 'name' => 'Вторая новость',
+ 'text' => fake()->realText(),
+ 'photo' => '2',
+ ],
+ ]);
+ }
+}
diff --git a/lang/ru/tooltips.php b/lang/ru/tooltips.php
index cc0cf7f..55ffb99 100644
--- a/lang/ru/tooltips.php
+++ b/lang/ru/tooltips.php
@@ -82,4 +82,9 @@ return [
'faculty_id' => 'Поле "Факультет" указывает на привязку к факультету',
'slug' => 'Поле "URL" нужно для отображения в браузере'
],
+ 'news' => [
+ 'name' => 'Поле "Название" - заголовок новости для отображения на сайте',
+ 'text' => 'Поле "Текст" - текст новости для отображения на сайте',
+ 'photo' => 'Поле "Путь к фото" - текст новости для отображения на сайте',
+ ],
];
diff --git a/resources/views/admin/news/create.blade.php b/resources/views/admin/news/create.blade.php
new file mode 100644
index 0000000..962687c
--- /dev/null
+++ b/resources/views/admin/news/create.blade.php
@@ -0,0 +1,68 @@
+@php use App\Helpers\PositionHelper; @endphp
+@extends('layouts.admin_layout')
+@section('content')
+ @auth()
+
+
+
Создать Новость
+ {{ Form::open(['url' => route('news.store'), 'method' => 'POST', 'files'=>'true', 'class' => 'needs-validation', 'novalidate']) }}
+
+
+
+ {{ Form::label('name', 'Название', ['data-bs-toggle' => "tooltip", 'data-bs-title' => __('tooltips.news.name')]) }}
+ *
+
+
+ {{ Form::text('name', '', ['class' => 'form-control', 'data-bs-toggle' => "tooltip", 'data-bs-title' => __('tooltips.news.name'), 'required']) }}
+
+ Поле "Название" обязательно!
+
+
+
+ @if ($errors->any())
+ {{ $errors->first('name') }}
+ @endif
+
+
+
+ {{ Form::label('text', 'Текст', ['data-bs-toggle' => "tooltip", 'data-bs-title' => __('tooltips.news.text')]) }}
+ *
+
+
+ {{ Form::textarea('text', '', ['class' => 'form-control', 'data-bs-toggle' => "tooltip", 'data-bs-title' => __('tooltips.news.text'), 'required']) }}
+
+ Поле "Текст" обязательно!
+
+
+
+ @if ($errors->any())
+ {{ $errors->first('name') }}
+ @endif
+
+
+
+ {{ Form::label('photo', 'Путь к фото') }}
+ *
+
+
+ {{ Form::file('photo', ['class' => 'form-control', 'data-bs-toggle' => "tooltip", 'data-bs-title' => __('tooltips.news.photo'), 'required']) }}
+
+ Поле "Путь к фото" обязательно!
+
+
+
+ @if ($errors->any())
+ {{ $errors->first('photo') }}
+ @endif
+
+
+
+ {{ Form::submit('Создать', ['class' => 'btn btn-primary']) }}
+
+
+ {{ Form::close() }}
+
+
+ @endauth
+ @include('layouts.bootstrap_validation')
+@endsection
diff --git a/resources/views/admin/news/edit.blade.php b/resources/views/admin/news/edit.blade.php
new file mode 100644
index 0000000..44a900e
--- /dev/null
+++ b/resources/views/admin/news/edit.blade.php
@@ -0,0 +1,52 @@
+@php use App\Helpers\PositionHelper; @endphp
+@extends('layouts.admin_layout')
+@section('content')
+ @auth()
+
+
+
Изменить Новость
+ {{ Form::open(['url' => route('news.update', $news), 'method' => 'PATCH', 'files'=>'true', 'class' => 'needs-validation', 'novalidate']) }}
+
+
+
+ {{ Form::label('name', 'Название', ['data-bs-toggle' => "tooltip", 'data-bs-title' => __('tooltips.news.name')]) }}
+ *
+
+
+ {{ Form::text('name', $news->name, ['class' => 'form-control', 'data-bs-toggle' => "tooltip", 'data-bs-title' => __('tooltips.news.name'), 'required']) }}
+
+ Поле "Название" обязательно!
+
+
+
+ @if ($errors->any())
+ {{ $errors->first('name') }}
+ @endif
+
+
+
+ {{ Form::label('text', 'Текст', ['data-bs-toggle' => "tooltip", 'data-bs-title' => __('tooltips.news.text')]) }}
+ *
+
+
+ {{ Form::textarea('text', $news->text, ['class' => 'form-control', 'data-bs-toggle' => "tooltip", 'data-bs-title' => __('tooltips.news.text'), 'required']) }}
+
+ Поле "Текст" обязательно!
+
+
+
+ @if ($errors->any())
+ {{ $errors->first('name') }}
+ @endif
+
+
+
+ {{ Form::submit('Изменить', ['class' => 'btn btn-primary']) }}
+
+
+ {{ Form::close() }}
+
+
+ @endauth
+ @include('layouts.bootstrap_validation')
+@endsection
diff --git a/resources/views/admin/news/index.blade.php b/resources/views/admin/news/index.blade.php
new file mode 100644
index 0000000..a74052c
--- /dev/null
+++ b/resources/views/admin/news/index.blade.php
@@ -0,0 +1,38 @@
+@extends('layouts.admin_layout')
+@section('content')
+
+
+@endsection
diff --git a/resources/views/admin/news/show.blade.php b/resources/views/admin/news/show.blade.php
new file mode 100644
index 0000000..9cecd9c
--- /dev/null
+++ b/resources/views/admin/news/show.blade.php
@@ -0,0 +1,13 @@
+@extends('layouts.admin_layout')
+@section('content')
+ @auth()
+
+
Название
+
{{ $news->name }}
+
Текст
+
{{ $news->text }}
+
Фото
+
+
+ @endauth
+@endsection
diff --git a/resources/views/layouts/admin_layout.blade.php b/resources/views/layouts/admin_layout.blade.php
index 3821ead..56fe108 100644
--- a/resources/views/layouts/admin_layout.blade.php
+++ b/resources/views/layouts/admin_layout.blade.php
@@ -48,6 +48,7 @@