first commit

This commit is contained in:
f4ilji
2024-09-19 16:06:49 +05:00
commit b686638a39
1664 changed files with 428174 additions and 0 deletions
@@ -0,0 +1,10 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class AcademicJournalController extends Controller
{
//
}
@@ -0,0 +1,41 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\ApplicantQuestion\StoreRequest;
use App\Http\Resources\ApplicantQuestionResource;
use App\Models\ApplicantQuestion;
use Illuminate\Http\Request;
use Inertia\Inertia;
class ApplicantQuestionController extends Controller
{
public function index(Request $request)
{
$applicantQuestions = ApplicantQuestionResource::collection(ApplicantQuestion::query()
->when(request()->input('search'), function ($query, $search) {
$query->whereRaw("LOWER(first_name || ' ' || last_name) LIKE ?", ["%{$search}%"])
->orWhere('email', 'like', "%{$search}%")
->orWhere('phone', 'like', "%{$search}%");
})
->orderBy('id', 'desc')
->paginate(request()->input('perPage', 9))
->withQueryString());
$filters = request()->input('search');
return Inertia::render('AdminPanel/ApplicantQuestion/Index', compact('applicantQuestions', 'filters'));
}
public function create()
{
return Inertia::render('AdminPanel/ApplicantQuestion/Create');
}
public function store(StoreRequest $request)
{
$data = $request->validated();
ApplicantQuestion::create($data);
return redirect()->route('admin.applicantQuestion.index');
}
}
@@ -0,0 +1,53 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Http\Requests\Auth\LoginRequest;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
use Inertia\Inertia;
use Inertia\Response;
class AuthenticatedSessionController extends Controller
{
/**
* Display the login view.
*/
public function create(): Response
{
return Inertia::render('Auth/Login', [
'canResetPassword' => Route::has('password.request'),
'status' => session('status'),
]);
}
/**
* Handle an incoming authentication request.
*/
public function store(LoginRequest $request): RedirectResponse
{
$request->authenticate();
$request->session()->regenerate();
return redirect()->intended(RouteServiceProvider::HOME);
}
/**
* Destroy an authenticated session.
*/
public function destroy(Request $request): RedirectResponse
{
Auth::guard('web')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/');
}
}
@@ -0,0 +1,42 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\ValidationException;
use Inertia\Inertia;
use Inertia\Response;
class ConfirmablePasswordController extends Controller
{
/**
* Show the confirm password view.
*/
public function show(): Response
{
return Inertia::render('Auth/ConfirmPassword');
}
/**
* Confirm the user's password.
*/
public function store(Request $request): RedirectResponse
{
if (! Auth::guard('web')->validate([
'email' => $request->user()->email,
'password' => $request->password,
])) {
throw ValidationException::withMessages([
'password' => __('auth.password'),
]);
}
$request->session()->put('auth.password_confirmed_at', time());
return redirect()->intended(RouteServiceProvider::HOME);
}
}
@@ -0,0 +1,25 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
class EmailVerificationNotificationController extends Controller
{
/**
* Send a new email verification notification.
*/
public function store(Request $request): RedirectResponse
{
if ($request->user()->hasVerifiedEmail()) {
return redirect()->intended(RouteServiceProvider::HOME);
}
$request->user()->sendEmailVerificationNotification();
return back()->with('status', 'verification-link-sent');
}
}
@@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Inertia\Inertia;
use Inertia\Response;
class EmailVerificationPromptController extends Controller
{
/**
* Display the email verification prompt.
*/
public function __invoke(Request $request): RedirectResponse|Response
{
return $request->user()->hasVerifiedEmail()
? redirect()->intended(RouteServiceProvider::HOME)
: Inertia::render('Auth/VerifyEmail', ['status' => session('status')]);
}
}
@@ -0,0 +1,69 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Auth\Events\PasswordReset;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Password;
use Illuminate\Support\Str;
use Illuminate\Validation\Rules;
use Illuminate\Validation\ValidationException;
use Inertia\Inertia;
use Inertia\Response;
class NewPasswordController extends Controller
{
/**
* Display the password reset view.
*/
public function create(Request $request): Response
{
return Inertia::render('Auth/ResetPassword', [
'email' => $request->email,
'token' => $request->route('token'),
]);
}
/**
* Handle an incoming new password request.
*
* @throws \Illuminate\Validation\ValidationException
*/
public function store(Request $request): RedirectResponse
{
$request->validate([
'token' => 'required',
'email' => 'required|email',
'password' => ['required', 'confirmed', Rules\Password::defaults()],
]);
// Here we will attempt to reset the user's password. If it is successful we
// will update the password on an actual user model and persist it to the
// database. Otherwise we will parse the error and return the response.
$status = Password::reset(
$request->only('email', 'password', 'password_confirmation', 'token'),
function ($user) use ($request) {
$user->forceFill([
'password' => Hash::make($request->password),
'remember_token' => Str::random(60),
])->save();
event(new PasswordReset($user));
}
);
// If the password was successfully reset, we will redirect the user back to
// the application's home authenticated view. If there is an error we can
// redirect them back to where they came from with their error message.
if ($status == Password::PASSWORD_RESET) {
return redirect()->route('login')->with('status', __($status));
}
throw ValidationException::withMessages([
'email' => [trans($status)],
]);
}
}
@@ -0,0 +1,29 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rules\Password;
class PasswordController extends Controller
{
/**
* Update the user's password.
*/
public function update(Request $request): RedirectResponse
{
$validated = $request->validate([
'current_password' => ['required', 'current_password'],
'password' => ['required', Password::defaults(), 'confirmed'],
]);
$request->user()->update([
'password' => Hash::make($validated['password']),
]);
return back();
}
}
@@ -0,0 +1,51 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Password;
use Illuminate\Validation\ValidationException;
use Inertia\Inertia;
use Inertia\Response;
class PasswordResetLinkController extends Controller
{
/**
* Display the password reset link request view.
*/
public function create(): Response
{
return Inertia::render('Auth/ForgotPassword', [
'status' => session('status'),
]);
}
/**
* Handle an incoming password reset link request.
*
* @throws \Illuminate\Validation\ValidationException
*/
public function store(Request $request): RedirectResponse
{
$request->validate([
'email' => 'required|email',
]);
// We will send the password reset link to this user. Once we have attempted
// to send the link, we will examine the response then see the message we
// need to show to the user. Finally, we'll send out a proper response.
$status = Password::sendResetLink(
$request->only('email')
);
if ($status == Password::RESET_LINK_SENT) {
return back()->with('status', __($status));
}
throw ValidationException::withMessages([
'email' => [trans($status)],
]);
}
}
@@ -0,0 +1,52 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Providers\RouteServiceProvider;
use Illuminate\Auth\Events\Registered;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rules;
use Inertia\Inertia;
use Inertia\Response;
class RegisteredUserController extends Controller
{
/**
* Display the registration view.
*/
public function create(): Response
{
return Inertia::render('Auth/Register');
}
/**
* Handle an incoming registration request.
*
* @throws \Illuminate\Validation\ValidationException
*/
public function store(Request $request): RedirectResponse
{
$request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:'.User::class,
'password' => ['required', 'confirmed', Rules\Password::defaults()],
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
event(new Registered($user));
Auth::login($user);
return redirect('/');
}
}
@@ -0,0 +1,28 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Auth\Events\Verified;
use Illuminate\Foundation\Auth\EmailVerificationRequest;
use Illuminate\Http\RedirectResponse;
class VerifyEmailController extends Controller
{
/**
* Mark the authenticated user's email address as verified.
*/
public function __invoke(EmailVerificationRequest $request): RedirectResponse
{
if ($request->user()->hasVerifiedEmail()) {
return redirect()->intended(RouteServiceProvider::HOME.'?verified=1');
}
if ($request->user()->markEmailAsVerified()) {
event(new Verified($request->user()));
}
return redirect()->intended(RouteServiceProvider::HOME.'?verified=1');
}
}
@@ -0,0 +1,67 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\CategoryResource;
use App\Http\Resources\PostResource;
use App\Models\AuthorPost;
use App\Models\Category;
use App\Models\Post;
use Illuminate\Http\Request;
use Inertia\Inertia;
class CategoryController extends Controller
{
public function index(Request $request)
{
$categories = CategoryResource::collection(Category::query()
->when(request()->input('search'), function ($query, $search) {
$query->where('title', 'like', "%{$search}%")
->orWhere('title', 'like', "%{$search}%");
})
->orderBy('id', 'desc')
->paginate(request()->input('perPage', 9))
->withQueryString());
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/Categories/Index', compact('categories', 'filters'));
}
public function create()
{
return Inertia::render('AdminPanel/Categories/Create');
}
public function store(Request $request)
{
$data = $request->validate([
'title' => 'required|unique:categories|max:50|min:5',
]);
Category::create($data);
return redirect()->route('admin.category.index');
}
public function edit(Category $category)
{
return Inertia::render('AdminPanel/Categories/Edit', compact('category'));
}
public function update(Category $category, Request $request)
{
$data = $request->validate([
'title' => 'required|unique:categories|max:50|min:5',
]);
$category->update($data);
return redirect()->route('admin.category.index');
}
public function destroy(string $id)
{
$category = Category::find($id);
$category->delete();
return redirect()->route('admin.category.index');
}
}
@@ -0,0 +1,39 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\ClientAcademicJournalListResource;
use App\Http\Resources\ClientVirtualExhibitionListResource;
use App\Models\AcademicJournal;
use App\Models\JournalIssue;
use App\Models\VirtualExhibition;
use Illuminate\Http\Request;
use Inertia\Inertia;
class ClientAcademicJournalController extends Controller
{
public function index()
{
$journals = ClientAcademicJournalListResource::collection(AcademicJournal::query()->get());
return Inertia::render('Client/AcademicJournals/Index', compact('journals'));
}
public function show(string $slug)
{
$journal = new ClientAcademicJournalListResource(AcademicJournal::query()->where('slug', '=', $slug)->firstOrFail());
$journalIssues = JournalIssue::all()
->groupBy('year_publication');
$journals = [];
$years = JournalIssue::select('year_publication')->distinct()->get();
foreach ($journalIssues as $year => $journalGroup) {
$journals[] = [
'year_publication' => $year,
'journalIssues' => $journalGroup
];
}
return Inertia::render('Client/AcademicJournals/Show', compact('journal', 'journals'));
}
}
@@ -0,0 +1,44 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\AdditionalEducationCategoryResource;
use App\Http\Resources\AdditionalEducationResource;
use App\Http\Resources\DirectionAdditionalEducationResource;
use App\Models\AdditionalEducation;
use App\Models\AdditionalEducationCategory;
use App\Models\DirectionAdditionalEducation;
use Illuminate\Http\Request;
use Inertia\Inertia;
class ClientAdditionalEducationController extends Controller
{
public function index(Request $request)
{
$directionAdditionalEducations = DirectionAdditionalEducationResource::collection(
DirectionAdditionalEducation::query()
->where('is_active', true)
->whereHas('additionalEducationCategories', function ($q) {
$q->whereHas('additionalEducations');
})
->get());
$additionalEducations = AdditionalEducationCategoryResource::collection(AdditionalEducationCategory::query()
->where('is_active', '=', true)
->when($request->input('dir_id'), function ($q, $direction_id) {
$q->where('dir_addit_educat_id', $direction_id);
})
->has('additionalEducations')
->with('additionalEducations')
->get());
$filters = [
'dir_id' => request()->input('dir_id')
];
return Inertia::render('Client/Additional-educations/Index', compact('directionAdditionalEducations', 'additionalEducations', 'filters'));
}
public function show(string $id)
{
$additionalEducation = new AdditionalEducationResource(AdditionalEducation::query()->with('category.direction')->find($id));
return Inertia::render('Client/Additional-educations/Show', compact('additionalEducation'));
}
}
@@ -0,0 +1,42 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\ClientDepartmentPreviewResource;
use App\Http\Resources\DepartmentResource;
use App\Models\Department;
use App\Models\Faculty;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Http\Request;
use Inertia\Inertia;
class ClientDepartmentController extends Controller
{
public function show(string $facultySlug, string $departmentSlug)
{
$faculty = Faculty::query()->where('slug', $facultySlug)->first();
$departments = ClientDepartmentPreviewResource::collection(
Department::query()
->where('is_active', true)
->where('faculty_id', $faculty->id)
->get()
);
$department = new DepartmentResource(Department::query()
->where('slug', $departmentSlug)
->where('is_active', true)
->with(['faculty', 'workers.userDetail', 'teachers.userDetail', 'programs.directionStudy'])
->first());
$directions = $this->groupProgramsByDirection($department->programs);
return Inertia::render('Client/Departments/Show', compact('department', 'departments', 'directions'));
}
private function groupProgramsByDirection(Collection $programs)
{
// Группируем программы по имени направления
$grouped = $programs->groupBy(function ($program) {
return $program->directionStudy->code . " " . $program->directionStudy->name; // Используем имя направления как ключ
});
return $grouped;
}
}
@@ -0,0 +1,24 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\DivisionResource;
use App\Models\Division;
use Illuminate\Http\Request;
use Inertia\Inertia;
class ClientDivisionController extends Controller
{
public function index()
{
$divisions = DivisionResource::collection(Division::query()->where('is_active', true)->get());
return Inertia::render('Client/Divisions/Index', compact('divisions'));
}
public function show(string $slug)
{
$divisions = DivisionResource::collection(Division::query()->where('is_active', true)->get());
$division = new DivisionResource(Division::with('workers.userDetail')->where('is_active', true)->where('slug', $slug)->first());
return Inertia::render('Client/Divisions/Show', compact('divisions', 'division'));
}
}
@@ -0,0 +1,200 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\ClientEventCategoryResource;
use App\Http\Resources\ClientEventFullResource;
use App\Http\Resources\ClientEventResource;
use App\Http\Resources\ClientNavigationResource;
use App\Models\Event;
use App\Models\EventCategory;
use Carbon\Carbon;
use DateTime;
use Illuminate\Http\Request;
use Inertia\Inertia;
class ClientEventController extends Controller
{
public function index(Request $request)
{
$currentDate = $this->getCurrentDate($request);
$filters = $this->getFilters();
$eventDates = $this->getEventDates($filters); // Передаем фильтры
$events = $this->getEvents($currentDate);
$categories = ClientEventCategoryResource::collection(EventCategory::has('events')->get());
return Inertia::render('Client/Events/Index', compact('eventDates', 'events', 'currentDate', 'filters', 'categories'));
}
public function show(string $slug)
{
$event = new ClientEventFullResource(Event::where('slug', '=', $slug)->with('category')->first());
return Inertia::render('Client/Events/Show', compact('event'));
}
private function getCurrentDate(Request $request): array
{
$dateInput = $request->input('date');
// Если дата введена, создаем объект Carbon, иначе получаем ближайшую дату события
if ($dateInput) {
$date = new Carbon($dateInput);
} else {
$nearestEvent = Event::whereDate('event_date_start', '>=', now())
->orderBy('event_date_start', 'asc')
->first();
// Проверяем, найдено ли событие
if ($nearestEvent) {
$date = new Carbon($nearestEvent->event_date_start);
} else {
// Если событий нет, устанавливаем текущую дату
$date = Carbon::now();
}
}
return [
'fullDate' => $date->format('Y-m-j'),
'day' => $date->format('j'),
'month' => $date->getTranslatedMonthName('Do MMMM'),
];
}
private function getEvents(array $currentDate)
{
return ClientEventResource::collection(Event::select('title', 'slug', 'event_date_start', 'event_time_start', 'address', 'is_online', 'category_id')
->whereDate('event_date_start', '=', $currentDate['fullDate'])
->with('category')
->when(request()->input('is_online'), function ($query, $value) {
$this->applyOnlineFilter($query, $value);
})
->when(request()->input('category'), function ($query) {
$slugs = request()->input('category');
if (is_array($slugs)) {
$query->whereHas('category', function ($query) use ($slugs) {
$query->whereIn('slug', $slugs);
});
}
})
->orderBy('event_time_start', 'asc')
->get());
}
private function getEventDates(array $filters): \Illuminate\Support\Collection
{
// Получаем события с учетом фильтров
$events = Event::select('event_date_start')
->distinct()
->where('event_date_start', '>=', date('Y-m-d'))
->when($filters['is_online_filter']['value'], function ($query, $value) {
if ($value === 'online') {
$query->where('is_online', true);
} elseif ($value === 'offline') {
$query->where('is_online', false);
}
})
->when($filters['category_filter']['value'], function ($query) {
$slugs = request()->input('category');
if (is_array($slugs)) {
$query->whereHas('category', function ($query) use ($slugs) {
$query->whereIn('slug', $slugs);
});
}
})
->orderBy('event_date_start')
->get();
// Извлекаем уникальные даты из событий
return $events->map(function ($event) {
$date = new DateTime($event->event_date_start);
return [
'day' => $date->format('j'),
'dayOfWeek' => $this->getDayOfWeekRussian($date->format('l')),
'date' => $date->format('Y-m-j')
];
})
->groupBy(function ($item) {
return (new DateTime($item['date']))->format('m');
})
->map(function ($group, $month) {
return [
'month' => $this->getMonthNameRussian((int)$month),
'events' => $group->toArray()
];
});
}
private function getFilters(): array
{
$categoriesContent = [];
if (request()->input('category')) {
foreach (request()->input('category') as $item) {
$categoriesContent[$item] = new ClientEventCategoryResource(EventCategory::where('slug', $item)->first());
}
}
return [
'category_filter' => [
'type' => 'category',
'value' => request()->input('category'),
'param' => 'category',
'content' => $categoriesContent,
],
'sortingBy_filter' => [
'type' => 'sort',
'value' => request()->input('sort'),
'param' => 'sort',
],
'is_online_filter' => [
'type' => 'is_online',
'value' => request()->input('is_online'),
'param' => 'is_online',
],
];
}
private function getDayOfWeekRussian(string $dayOfWeek): string
{
$russianDays = [
'Monday' => 'пн',
'Tuesday' => 'вт',
'Wednesday' => 'ср',
'Thursday' => 'чт',
'Friday' => 'пт',
'Saturday' => 'сб',
'Sunday' => 'вс'
];
return $russianDays[$dayOfWeek] ?? '';
}
private function getMonthNameRussian(int $month): string
{
$russianMonths = [
1 => 'Январь',
2 => 'Февраль',
3 => 'Март',
4 => 'Апрель',
5 => 'Май',
6 => 'Июнь',
7 => 'Июль',
8 => 'Август',
9 => 'Сентябрь',
10 => 'Октябрь',
11 => 'Ноябрь',
12 => 'Декабрь'
];
return $russianMonths[$month] ?? '';
}
private function applyOnlineFilter($query, $isOnline)
{
if ($isOnline === 'online') {
$query->where('is_online', true);
} elseif ($isOnline === 'offline') {
$query->where('is_online', false);
}
}
}
@@ -0,0 +1,10 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ClientExternalVacancyController extends Controller
{
//
}
@@ -0,0 +1,25 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\FacultyResource;
use App\Http\Resources\FullFacultyResource;
use App\Models\Faculty;
use Illuminate\Http\Request;
use Inertia\Inertia;
class ClientFacultyController extends Controller
{
public function index()
{
$faculties = FacultyResource::collection(Faculty::query()->where('is_active', true)->get());
return Inertia::render('Client/Faculties/Index', compact('faculties'));
}
public function show(string $slug)
{
$faculties = FacultyResource::collection(Faculty::query()->where('is_active', true)->get());
$faculty = new FullFacultyResource(Faculty::where('slug', $slug)->where('is_active', true)->with(['departments.faculty', 'workers.userDetail'])->first());
return Inertia::render('Client/Faculties/Show', compact('faculty', 'faculties'));
}
}
@@ -0,0 +1,26 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\ClientLibraryPostListResource;
use App\Models\LibraryNews;
use Illuminate\Http\Request;
use Inertia\Inertia;
class ClientLibraryNewsController extends Controller
{
public function index()
{
$posts = ClientLibraryPostListResource::collection(LibraryNews::query()
->where('is_active', true)
->orderBy('id', 'desc')
->paginate(6));
return Inertia::render('Client/Library-news/Index', compact('posts'));
}
public function show(string $id)
{
$post = new ClientLibraryPostListResource(LibraryNews::query()->find($id));
return Inertia::render('Client/Library-news/Show', compact('post'));
}
}
@@ -0,0 +1,111 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\CategoryResource;
use App\Http\Resources\ClientNavigationResource;
use App\Http\Resources\ClientPostListResource;
use App\Http\Resources\ClientTagResource;
use App\Http\Resources\MainSectionResource;
use App\Http\Resources\PostResource;
use App\Models\Category;
use App\Models\MainSection;
use App\Models\Post;
use App\Models\Tag;
use Doctrine\DBAL\Schema\Column;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Inertia\Inertia;
class ClientPostController extends Controller
{
public function index(Request $request)
{
$tagIds = DB::table('taggables')
->distinct()
->select('tag_id')
->where('taggable_type', Post::class)
->get()
->pluck('tag_id');
$tags = \Spatie\Tags\Tag::whereIn('id', $tagIds)->get();
$posts = ClientPostListResource::collection(Post::query()
->with('category')
->select('title', 'slug', 'authors', 'category_id', 'preview', 'search_data', 'created_at')
->where('status', '=', 'published')
->when(request()->input('search'), function ($query, $search) {
$query->whereRaw('LOWER(title) like ?', ["%".strtolower($search)."%"]);
})
->when(request()->input('category'), function ($query) {
$slugs = request()->input('category');
if (is_array($slugs)) {
$query->whereHas('category', function ($query) use ($slugs) {
$query->whereIn('slug', $slugs);
});
}
})
->when(request()->input('tag'), function ($query, $slugs) {
if (is_array($slugs)) {
return $query->withAnyTags($slugs);
}
$slugsArray = explode(',', $slugs);
return $query->withAnyTags($slugsArray);
})
->orderBy('id', request()->input('sort', 'desc'))
->paginate(6)
->withQueryString());
$categories = CategoryResource::collection(Category::has('posts')->get());
$categoriesContent = [];
if (request()->input('category')) {
foreach (request()->input('category') as $item) {
$categoriesContent[$item] = new CategoryResource(Category::where('slug', $item)->first());
}
}
$tagsContent = [];
if (request()->input('tag')) {
foreach (request()->input('tag') as $item) {
$tagsContent[$item] = new ClientTagResource(DB::table('tags')
->where(DB::raw("JSON_UNQUOTE(JSON_EXTRACT(slug, '$.ru'))"), $item)
->first());
}
}
$filters = [
'search_filter' => [
'type' => 'search',
'value' => request()->input('search'),
'param' => 'search'
],
'category_filter' => [
'type' => 'category',
'value' => request()->input('category'),
'param' => 'category',
'content' => $categoriesContent,
],
'tag_filter' => [
'type' => 'tag',
'value' => request()->input('tag'),
'param' => 'tag',
'content' => $tagsContent
],
'sortingBy_filter' => [
'type' => 'sort',
'value' => request()->input('sort'),
'param' => 'sort',
],
];
return Inertia::render('Client/Posts/Index', compact('filters', 'posts', 'categories', 'tags'));
}
public function show($slug)
{
$post = new PostResource(Post::where('slug', $slug)->firstOrFail());
return Inertia::render('Client/Posts/Show', compact('post'));
}
}
@@ -0,0 +1,196 @@
<?php
namespace App\Http\Controllers;
use App\Enums\BudgetEducation;
use App\Enums\FormEducation;
use App\Enums\LevelEducational;
use App\Http\Resources\CampaignDegreeResource;
use App\Http\Resources\ClientNavigationResource;
use App\Http\Resources\DirectionStudyResource;
use App\Http\Resources\EducationalProgramFullResource;
use App\Http\Resources\MainSectionResource;
use App\Models\AdmissionCampaign;
use App\Models\AdmissionPlan;
use App\Models\CampaignDegree;
use App\Models\DirectionStudy;
use App\Models\EducationalProgram;
use App\Models\MainSection;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use Inertia\Inertia;
class ClientProgramController extends Controller
{
public function index(Request $request)
{
$activeCampaign = AdmissionCampaign::query()->where('status', 1)->first();
$uniqueValues = EducationalProgram::distinct()->pluck('lvl_edu');
$levelsEducational = $uniqueValues->mapWithKeys(function ($level) {
return [$level->name => $level->getLabel()];
});
$direction_studies = DirectionStudy::query()
->withAdmissionCampaignByYear($activeCampaign->academic_year)
->withActivePrograms()
->get();
$level = request()->input('level');
$form = request()->input('form');
$budget = request()->input('budget');
$naprs = DirectionStudyResource::collection(
DirectionStudy::query()
->withAdmissionCampaignByYear($activeCampaign->academic_year)
->withActivePrograms()
->when($level, function ($query) use ($level) {
$query->where('lvl_edu', LevelEducational::fromName($level)->value);
})
->when($form, function ($query) use ($form) {
$this->applyFormFilter($query, $form);
})
->when($budget, function ($query) use ($budget) {
$this->applyBudgetFilter($query, $budget);
})
->when(request()->input('direction'), function ($query) {
$slugs = request()->input('direction');
if (is_array($slugs)) {
$query->whereIn('slug', $slugs);
}
})
->get()
);
$campaignName = $this->getAdmissionCampaignName();
$formsEducational = FormEducation::cases();
$formsEducational = collect($formsEducational);
$formsEdu = $formsEducational->mapWithKeys(function ($formEducational) {
return [$formEducational->name => $formEducational->getLabel()];
});
$typesBudget = BudgetEducation::cases();
$typesBudget = collect($typesBudget);
$budgetEdu = $typesBudget->mapWithKeys(function ($typeBudget) {
return [$typeBudget->name => $typeBudget->getLabel()];
});
$filters = [
'level_filter' => [
'type' => 'level',
'value' => request()->input('level'),
'param' => 'level'
],
'budget_filter' => [
'type' => 'budget',
'value' => request()->input('budget'),
'param' => 'budget'
],
'formEdu_filter' => [
'type' => 'form',
'value' => request()->input('form'),
'param' => 'form'
],
'direction_filter' => [
'type' => 'direction',
'value' => request()->input('direction'),
'param' => 'direction'
],
];
return Inertia::render('Client/Programs/Index',
compact(
'naprs',
'campaignName',
'levelsEducational',
'filters',
'formsEdu',
'budgetEdu',
'direction_studies'
));
}
public function show($id)
{
$program = new EducationalProgramFullResource(EducationalProgram::query()->where('id', $id)->with(['admission_plans', 'directionStudy'])->first());
$formsEducational = BudgetEducation::cases();
$formsEducational = collect($formsEducational);
$formsEdu = $formsEducational->mapWithKeys(function ($formEducational) {
return [$formEducational->value => $formEducational->getLabel()];
});
return Inertia::render('Client/Programs/Show', compact('program', 'formsEdu'));
}
private function getAdmissionCampaignName() : string
{
$campaign = AdmissionCampaign::query()->where('status', 1)->first();
return $campaign->name;
}
private function applyFormFilter($query, $form)
{
$formValue = Str::of(FormEducation::fromName($form)->value)->toString();
$query->whereHas('programs.admission_plans', function ($query) use ($formValue) {
$query->whereJsonContains('contests', ['form_education' => $formValue]);
})
->with(['programs' => function ($query) use ($formValue) {
$query->whereHas('admission_plans', function ($q) use ($formValue) {
$q->whereJsonContains('contests', ['form_education' => $formValue]);
});
}]);
}
private function applyBudgetFilter($query, $budget)
{
$budgetValue = Str::of(BudgetEducation::fromName($budget)->value)->toString();
$query->whereHas('programs.admission_plans', function ($query) use ($budgetValue) {
$query->whereJsonContains('contests', [['places' => ['form_budget' => $budgetValue]]]);
})
->with(['programs' => function ($query) use ($budgetValue) {
$query->whereHas('admission_plans', function ($query) use ($budgetValue) {
$query->whereJsonContains('contests', [['places' => ['form_budget' => $budgetValue]]]);
});
}]);
}
// public function bakalavriat()
// {
// $naprs = DirectionStudyResource::collection(
// DirectionStudy::forBachelorLevel()
// ->withActiveAdmissionCampaign()
// ->withActivePrograms()
// ->get()
// );
// $campaignName = $this->getAdmissionCampaignName();
// return Inertia::render('Client/Programs/Index', compact('naprs', 'campaignName'));
// }
//
// public function spo()
// {
// $naprs = DirectionStudyResource::collection(
// DirectionStudy::forMiddleLevel()
// ->withActiveAdmissionCampaign()
// ->withActivePrograms()
// ->get()
// );
// $campaignName = $this->getAdmissionCampaignName();
// return Inertia::render('Client/Programs/Index', compact('naprs', 'campaignName'));
//
// }
//
// public function magistratura()
// {
// $naprs = DirectionStudyResource::collection(
// DirectionStudy::forMasterLevel()
// ->withActiveAdmissionCampaign()
// ->withActivePrograms()
// ->get()
// );
// $campaignName = $this->getAdmissionCampaignName();
// return Inertia::render('Client/Programs/Index', compact('naprs', 'campaignName'));
//
// }
}
@@ -0,0 +1,42 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\ClientEducationalGroupResource;
use App\Http\Resources\ScheduleResource;
use App\Models\EducationalGroup;
use App\Models\Faculty;
use App\Models\Schedule;
use Illuminate\Http\Request;
use Inertia\Inertia;
class ClientScheduleController extends Controller
{
public function index(Request $request)
{
$educationalGroups = collect();
if (request()->filled('search')) {
$educationalGroups = ClientEducationalGroupResource::collection(EducationalGroup::query()
->has('schedules')
->whereHas('schedules', function ($q) {
$q->when(request()->input('search'), function ($query, $search) {
$query->whereRaw('LOWER(title) like ?', ["%".strtolower($search)."%"]);
});
})
->with('schedules')
->orderBy('title')
->get());
}
$searchRequest = request()->input('search');
return Inertia::render('Client/Schedules/Index', compact('educationalGroups', 'searchRequest'));
}
public function show($id)
{
$schedule = Schedule::find($id);
return Inertia::render('Client/Schedules/Show', compact('schedule'));
}
}
@@ -0,0 +1,10 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ClientVacantPositionController extends Controller
{
//
}
@@ -0,0 +1,26 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\ClientVirtualExhibitionListResource;
use App\Models\VirtualExhibition;
use Illuminate\Http\Request;
use Inertia\Inertia;
class ClientVirtualExhibitionController extends Controller
{
public function index()
{
$exhibitions = ClientVirtualExhibitionListResource::collection(VirtualExhibition::query()
->where('is_active', true)
->orderBy('id', 'desc')
->paginate(6));
return Inertia::render('Client/Library-exhibitions/Index', compact('exhibitions'));
}
public function show(string $id)
{
$exhibition = new ClientVirtualExhibitionListResource(VirtualExhibition::query()->find($id));
return Inertia::render('Client/Library-exhibitions/Show', compact('exhibition'));
}
}
@@ -0,0 +1,125 @@
<?php
namespace App\Http\Controllers;
use App\Enums\CustomFormStatus;
use App\Http\Requests\FormResponseRequest;
use App\Http\Resources\ClientFormResource;
use App\Models\CustomForm;
use App\Models\CustomFormResponse;
use App\Rules\UniqueJsonField;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class ClientWidgetFormController extends Controller
{
public function single(string $id)
{
return new ClientFormResource(CustomForm::query()->where('status', CustomFormStatus::PUBLISHED)->where('form_id', $id)->first());
}
public function submit(int $id, Request $request)
{
$data = CustomForm::findOrFail($id);
$rules = $this->generateValidationRules($data['columns'], $data['id']);
$messages = $this->generateValidationMessages($data['columns']);
$validateData = Validator::make($request->all(), $rules, $messages);
if ($validateData->fails()) {
return response()->json($validateData->errors(), 422);
}
$this->storeResponse($id, $validateData->validated());
return response()->json([
'message' => $data['send_message'],
'status' => 'ok'
]);
}
private function generateValidationRules(array $columns, int $id): array
{
$rules = [];
foreach ($columns as $column) {
// Извлекаем информацию о поле
$name = $column['data']['name_field'];
$rulesForField = [];
// Проверяем, является ли поле массивом (множественный выбор)
if ($column['type'] === 'multiple_choice') {
$rulesForField[] = 'required'; // Обязательно для множественного выбора
$rulesForField[] = 'array'; // Указывает, что это массив
$rulesForField[] = 'min:1'; // Минимум один элемент
$rules[$name] = $rulesForField; // Правила для каждого элемента массива
} else {
// Обработка обычных полей
if (!empty($column['data']['rules']['required'])) {
$rulesForField[] = 'required';
}
if (!empty($column['data']['rules']['min'])) {
$rulesForField[] = 'min:' . $column['data']['rules']['min'];
}
if (!empty($column['data']['rules']['max'])) {
$rulesForField[] = 'max:' . $column['data']['rules']['max'];
}
if (!empty($column['data']['rules']['unique']) && $column['data']['rules']['unique'] === true) {
$rulesForField[] = new UniqueJsonField($id, $name);
}
$rules[$name] = $rulesForField; // Добавляем правила для обычного поля
}
}
return $rules;
}
private function generateValidationMessages(array $columns): array
{
$messages = [];
foreach ($columns as $column) {
$name = $column['data']['name_field'];
if (!empty($column['data']['rules']['required'])) {
$messages[$name . '.required'] = 'Поле обязательно для заполнения.';
}
if (!empty($column['data']['rules']['min'])) {
$messages[$name . '.min'] = 'Минимальная длина поля должна быть ' . $column['data']['rules']['min'] . ' символов.';
}
if (!empty($column['data']['rules']['max'])) {
$messages[$name . '.max'] = 'Максимальная длина поля должна быть ' . $column['data']['rules']['max'] . ' символов.';
}
if (!empty($column['data']['rules']['unique'])) {
$messages[$name . '.max'] = 'Поле должно быть уникальным';
}
}
return $messages;
}
private function storeResponse(int $id, array $validateData): void
{
CustomFormResponse::create([
'custom_form_id' => $id,
'answers' => $validateData,
]);
}
}
@@ -0,0 +1,33 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\ClientPageNavigateResource;
use App\Http\Resources\PageResource;
use App\Models\Page;
use Illuminate\Http\Request;
class ClientWidgetPageController extends Controller
{
public function single(int $id)
{
$page = Page::query()
->with('section')
->find($id);
if (isset($page->section)) {
$breadcrumbs = [
'mainSection' => $page->section->mainSection->title,
'subSection' => $page->section->title,
'page' => $page->title,
];
} else {
$breadcrumbs = null;
}
return response()->json([
'data' => [
'page' => new ClientPageNavigateResource($page),
'breadcrumbs' => $breadcrumbs
],
], 200);
}
}
@@ -0,0 +1,34 @@
<?php
namespace App\Http\Controllers;
use App\Enums\PostStatus;
use App\Http\Resources\ClientPostListResource;
use App\Http\Resources\PostThumbnailResource;
use App\Models\Post;
use Illuminate\Http\Request;
class ClientWidgetPostController extends Controller
{
public function index()
{
return PostThumbnailResource::collection(
Post::query()
->where('status', PostStatus::PUBLISHED)
->when(request()->input('category'), function ($query, $category_id) {
$query->where('category_id', $category_id);
})
->with('category')
->orderBy('created_at', 'desc')
->take(request()->input('count', 5))
->get());
}
public function single(int $id)
{
return new PostThumbnailResource(
Post::query()->with('category')->find($id)
);
}
}
+12
View File
@@ -0,0 +1,12 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
class Controller extends BaseController
{
use AuthorizesRequests, ValidatesRequests;
}
@@ -0,0 +1,54 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\Department\StoreRequest;
use App\Http\Requests\Department\UpdateRequest;
use App\Http\Resources\DepartmentResource;
use App\Http\Resources\FacultyResource;
use App\Models\Department;
use App\Models\Faculty;
use Illuminate\Http\Request;
use Inertia\Inertia;
class DepartmentController extends Controller
{
public function index()
{
$departments = DepartmentResource::collection(Department::all());
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/Departments/Index', compact('departments', 'filters'));
}
public function create()
{
$faculties = FacultyResource::collection(Faculty::all());
return Inertia::render('AdminPanel/Departments/Create', compact('faculties'));
}
public function store(StoreRequest $request)
{
$data = $request->validated();
Department::firstOrCreate($data);
return redirect()->route('admin.department.index');
}
public function edit(Department $department)
{
return Inertia::render('AdminPanel/Departments/Edit', compact('department'));
}
public function update(UpdateRequest $request, Department $department)
{
$data = $request->validated();
$department->update($data);
return redirect()->route('admin.department.index');
}
public function destroy(Department $department)
{
$department->delete();
}
}
@@ -0,0 +1,66 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\Division\StoreRequest;
use App\Http\Requests\Division\UpdateRequest;
use App\Http\Resources\DivisionResource;
use App\Http\Resources\UserResource;
use App\Models\Division;
use App\Models\User;
use Illuminate\Http\Request;
use Inertia\Inertia;
class DivisionController extends Controller
{
public function index(Request $request)
{
$divisions = DivisionResource::collection(Division::query()
->when(request()->input('search'), function ($query, $search) {
$query->where('title', 'like', "%{$search}%");
})
->orderBy('id', 'desc')
->paginate(request()->input('perPage', 9))
->withQueryString());
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/Divisions/Index', compact('divisions', 'filters'));
}
public function create()
{
return Inertia::render('AdminPanel/Divisions/Create');
}
public function store(StoreRequest $request)
{
$data = $request->validated();
$data['description'] = json_encode($data['description']);
Division::create($data);
return redirect()->route('admin.division.index');
}
public function edit(Division $division)
{
$division = new DivisionResource($division);
$users = UserResource::collection(User::all());
return Inertia::render('AdminPanel/Divisions/Edit', compact('division', 'users'));
}
public function update(Division $division, UpdateRequest $request)
{
$data = $request->validated();
$data['description'] = json_encode($data['description']);
$division->update($data);
return redirect()->route('admin.division.index');
}
public function destroy(string $id)
{
$category = Division::find($id);
$category->delete();
return redirect()->route('admin.division.index');
}
}
+62
View File
@@ -0,0 +1,62 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\Event\StoreRequest;
use App\Http\Requests\Event\UpdateRequest;
use App\Http\Resources\EventResource;
use App\Models\Event;
use Illuminate\Http\Request;
use Inertia\Inertia;
class EventController extends Controller
{
public function index()
{
$events = EventResource::collection(Event::query()
->when(request()->input('search'), function ($query, $search) {
$query->where('title', 'like', "%{$search}%");
})
->orderBy('id', 'desc')
->paginate(request()->input('perPage', 9))
->withQueryString());
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/Posts/Index', compact('events', 'filters'));
}
public function create()
{
return Inertia::render('AdminPanel/Posts/Create');
}
public function store(StoreRequest $request)
{
$data = $request->validated();
$data['content'] = json_encode($data['content']);
Event::create($data);
return redirect()->route('admin.event.index');
}
public function edit(Event $event)
{
$event = new EventResource($event);
return Inertia::render('AdminPanel/Posts/Edit', compact('event'));
}
public function update(Event $event, UpdateRequest $request)
{
$data = $request->validated();
$data['content'] = json_encode($data['content']);
$event->update($data);
return redirect()->route('admin.event.index');
}
public function destroy(Event $event)
{
$event->delete();
return redirect()->route('admin.event.index');
}
}
@@ -0,0 +1,52 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\Faculty\StoreRequest;
use App\Http\Requests\Faculty\UpdateRequest;
use App\Http\Resources\FacultyResource;
use App\Models\Faculty;
use Illuminate\Http\Request;
use Inertia\Inertia;
class FacultyController extends Controller
{
public function index()
{
$faculties = FacultyResource::collection(Faculty::all());
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/Faculties/Index', compact('faculties', 'filters'));
}
public function create()
{
return Inertia::render('AdminPanel/Faculties/Create');
}
public function store(StoreRequest $request)
{
$data = $request->validated();
Faculty::firstOrCreate($data);
return redirect()->route('admin.faculty.index');
}
public function edit(Faculty $faculty)
{
return Inertia::render('AdminPanel/Faculties/Edit', compact('faculty'));
}
public function update(UpdateRequest $request, Faculty $faculty)
{
$data = $request->validated();
$faculty->update($data);
return redirect()->route('admin.faculty.index');
}
public function destroy(Faculty $faculty)
{
$faculty->delete();
}
}
@@ -0,0 +1,37 @@
<?php
namespace App\Http\Controllers;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class FileUploadController extends Controller
{
public function uploadFile(Request $request)
{
if ($request->hasFile('file')) {
$file = $request->file('file');
if ($file->isValid()) {
// Генерируем уникальное имя файла
$filename = md5(Carbon::now() . '_' . $file->getClientOriginalName()) . '.' . $file->getClientOriginalExtension();
// Сохраняем файл в папку public/files
$path = Storage::disk('public')->putFileAs('/files', $file, $filename);
// Генерируем полный URL к загруженному файлу с использованием функции asset
$fileUrl = '/storage/' . $path;
// Возвращаем JSON-ответ с заданным форматом
return response()->json([
'success' => 1,
'file' => [
'url' => $fileUrl,
],
]);
}
}
return response()->json(['error' => 'File upload failed'], 400);
}
}
+10
View File
@@ -0,0 +1,10 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class IconController extends Controller
{
//
}
+36
View File
@@ -0,0 +1,36 @@
<?php
namespace App\Http\Controllers;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Intervention\Image\ImageManagerStatic as ImageTool;
class ImageController extends Controller
{
public function uploadImage(Request $request)
{
if ($request->hasFile('image')) {
$image = $request->file('image');
// Генерируем уникальное имя файла, чтобы избежать конфликтов
$filename = md5(Carbon::now() . '_' . $image->getClientOriginalName()) . '.' . $image->getClientOriginalExtension();
// Сохраняем изображение в директорию public
ImageTool::configure(['driver' => 'imagick']);
ImageTool::make($image)
->resize(1200, null, function ($constraint) {
$constraint->aspectRatio();
$constraint->upsize();
})
->save(storage_path('app/public/images/' . $filename));
$path = "/storage/images/" . $filename;
// Генерируем URL для доступа к изображению
return response()->json(['success' => 1, 'file' => ['url' => $path]]);
}
return response()->json(['error' => 'Image upload failed']);
}
}
@@ -0,0 +1,81 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\PostResource;
use App\Http\Resources\StudentResource;
use App\Http\Resources\UserDetailResource;
use App\Models\Post;
use App\Models\Student;
use App\Models\UserDetail;
use Illuminate\Http\Request;
use Illuminate\Routing\Route;
class LinkToolController extends Controller
{
public function main(Request $request)
{
if ($request->input('url') == \route('client.person.show', ['userDetail' => substr($request->input('url'), -1)])) {
$userDetail = UserDetail::find(substr($request->input('url'), -1));
return response()->json([
'success' => 1,
'link' => Str($request->input('url')),
'meta' => [
'title' => $userDetail->surname . ' '. $userDetail->name . ' '. $userDetail->middleName,
'description' => $userDetail->administrativePosition,
'image' => [
'url' => $userDetail->photo
],
'type' => 'person',
'data' => new UserDetailResource($userDetail),
]
]);
}
if ($request->input('url') == \route('client.post.show', ['slug' => $this->getSlugFromUrl($request->input('url')) ])) {
$post = Post::query()->where('slug', '=', $this->getSlugFromUrl($request->input('url')))->first();
$content = json_decode($post->content);
foreach ($content->blocks as $data) {
if ($data->type === 'paragraph') {
return response()->json([
'success' => 1,
'link' => Str($request->input('url')),
'meta' => [
'title' => $post->title,
'description' => $data->data->text,
'type' => 'post',
'data' => new PostResource($post),
]
]);
}
}
}
if ($request->input('url') == \route('client.student.show', ['student' => substr($request->input('url'), -1)])) {
$student = Student::find(substr($request->input('url'), -1));
return response()->json([
'success' => 1,
'link' => Str($request->input('url')),
'meta' => [
'title' => $student->surname . ' '. $student->name . ' '. $student->middleName,
'description' => $student->position,
'image' => [
'url' => $student->photo
],
'type' => 'student',
'data' => new StudentResource($student),
]
]);
}
return false;
}
private function getSlugFromUrl($url)
{
$path = parse_url($url, PHP_URL_PATH);
$segments = explode('/', $path);
$lastSegment = end($segments);
return $lastSegment;
}
}
+49
View File
@@ -0,0 +1,49 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\AdditionalEducationResource;
use App\Http\Resources\ClientMainSliderResource;
use App\Http\Resources\ClientNavigationResource;
use App\Http\Resources\EventThumbnailResource;
use App\Http\Resources\MainSectionResource;
use App\Http\Resources\PostResource;
use App\Http\Resources\PostThumbnailResource;
use App\Models\AdditionalEducation;
use App\Models\AdditionalEducationCategory;
use App\Models\AdmissionCampaign;
use App\Models\Event;
use App\Models\MainSection;
use App\Models\MainSlider;
use App\Models\Post;
use App\Services\Filament\Icon\ArrayToCollectionService;
use DateTime;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Inertia\Inertia;
class MainController extends Controller
{
public function index()
{
$additional_educations = [
'educations_count' => AdditionalEducation::where('is_active', true)->count(),
'categories_count' => AdditionalEducationCategory::where('is_active', true)->count()
];
$today = new DateTime();
$event_date_start = $today->format('Y-m-d');
$sliders = ClientMainSliderResource::collection(MainSlider::query()->where('is_active', true)->orderBy('sort', 'asc')->get());
$posts = PostThumbnailResource::collection(Post::query()
->select('title', 'slug', 'authors', 'category_id', 'preview', 'search_data', 'created_at')
->with('category')
->where('status', '=', 'published')
->orderBy('id', 'desc')->limit(3)
->get());
$events = EventThumbnailResource::collection(Event::query()
->select('title', 'slug', 'event_date_start', 'address', 'is_online', 'category_id')
->where('event_date_start', '>=', $event_date_start)
->orderBy('event_date_start', 'asc')->limit(3)->get());
return Inertia::render('Main', compact('posts', 'events', 'sliders', 'additional_educations'));
}
}
@@ -0,0 +1,73 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\MainSectionResource;
use App\Models\MainSection;
use App\Models\SubSection;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Inertia\Inertia;
class MainSectionController extends Controller
{
public function index()
{
$mainSections = MainSectionResource::collection(MainSection::paginate(10));
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/MainSection/Index', compact('mainSections', 'filters'));
}
public function create()
{
$subSections = SubSection::query()->where('main_section_id', '=', null)->get();
return Inertia::render('AdminPanel/MainSection/Create', compact('subSections'));
}
public function store(Request $request)
{
$data = $request->validate([
'title' => 'required|unique:main_sections|max:50|min:5',
'subSection_ids' => 'array',
'subSection_ids.*' => 'exists:sub_sections,id'
]);
$subSection_ids = $data['subSection_ids'];
unset($data['subSection_ids']);
$mainSection = MainSection::create($data);
SubSection::whereIn('id', $subSection_ids)->update(['main_section_id' => $mainSection->id]);
return redirect()->route('admin.mainSection.index');
}
public function edit(MainSection $mainSection)
{
$subSections = SubSection::query()->where('main_section_id', '=', $mainSection->id)->
orWhere('main_section_id', '=', null)
->get();
$subSection_ids = SubSection::query()->where('main_section_id', '=', $mainSection->id)->pluck('id');
$mainSection = new MainSectionResource($mainSection);
return Inertia::render('AdminPanel/MainSection/Edit', compact('mainSection', 'subSections', 'subSection_ids'));
}
public function update(MainSection $mainSection, Request $request)
{
$data = $request->validate([
'title' => 'required|unique:main_sections|max:50|min:5',
'subSection_ids' => 'array',
'subSection_ids.*' => 'exists:sub_sections,id'
]);
$subSection_ids = $data['subSection_ids'];
unset($data['subSection_ids']);
$mainSection->update($data);
SubSection::query()->where('main_section_id', '=', $mainSection->id)->update(['main_section_id' => NULL]);
SubSection::whereIn('id', $subSection_ids)->update(['main_section_id' => $mainSection->id]);
return redirect()->route('admin.mainSection.index');
}
public function destroy(MainSection $mainSection)
{
SubSection::query()->where('main_section_id', '=', $mainSection->id)->update(['main_section_id' => NULL]);
$mainSection->delete();
}
}
+139
View File
@@ -0,0 +1,139 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\Page\StoreRequest;
use App\Http\Requests\Page\UpdateRequest;
use App\Http\Resources\ClientNavigationResource;
use App\Http\Resources\MainSectionResource;
use App\Http\Resources\PageResource;
use App\Http\Resources\RegisteredPageResource;
use App\Models\MainSection;
use App\Models\Page;
use App\Models\Post;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Redirect;
use Inertia\Inertia;
class PageController extends Controller
{
public function getRegisteredPages()
{
$pages = PageResource::collection(Page::query()
->when(request()->input('search'), function ($query, $search) {
$query->where('title', 'like', "%{$search}%");
})
->where('is_registered', true)
->where('is_visible', true)
->orderBy('id', 'desc')
->paginate(request()->input('perPage', 9))
->withQueryString());
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/Pages/Registered', compact('pages', 'filters'));
}
public function render($path)
{
$page = Page::where('path', '=', $path)->with('section.pages.section', 'section.mainSection')->first();
if ($page === null) {
abort(404);
}
if (isset($page->section)) {
$subSectionPages = PageResource::collection($page->section->pages);
$breadcrumbs = [
'mainSection' => $page->section->mainSection->title,
'subSection' => $page->section->title,
'page' => $page->title,
];
} else {
$subSectionPages = null;
$breadcrumbs = null;
}
$page = new PageResource($page);
$error = $page->code;
if ($page->code != 200) {
abort($error);
}
return Inertia::render($page->template, compact('page', 'subSectionPages', 'breadcrumbs'));
}
public function index()
{
$pages = PageResource::collection(Page::query()
->when(request()->input('search'), function ($query, $search) {
$query->where('title', 'like', "%{$search}%");
})
->where('is_registered', false)
->orderBy('id', 'desc')
->paginate(request()->input('perPage', 9))
->withQueryString());
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/Pages/Index', compact('pages', 'filters'));
}
public function edit($slug)
{
$page = new PageResource(Page::where('slug', '=', $slug)->first());
return Inertia::render('AdminPanel/Pages/Edit', compact('page'));
}
public function update(Page $page, UpdateRequest $request)
{
$data = $request->validated();
$data['content'] = json_encode($data['content']);
$page->update($data);
return redirect()->route('admin.page.index');
}
public function editRegisteredPage($id)
{
$page = new RegisteredPageResource(Page::find($id));
return Inertia::render('AdminPanel/Pages/EditRegisteredPage', compact('page'));
}
public function updateRegisteredPage($id, Request $request)
{
$data = $request->validate([
'title' => 'required',
'path' => 'required',
'is_visible' => 'required',
'code' => 'required'
]);
$page = Page::find($id);
$page->update($data);
return redirect()->route('admin.registered.page.index');
}
public function destroy(Page $page)
{
$page->delete();
return redirect()->route('admin.page.index');
}
public function create()
{
return Inertia::render('AdminPanel/Pages/Create');
}
public function store(StoreRequest $request)
{
$data = $request->validated();
$data['content'] = json_encode($data['content']);
Page::create($data);
return redirect()->route('admin.page.index');
}
}
+32
View File
@@ -0,0 +1,32 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\ClientFullInfoPersonResource;
use App\Http\Resources\ClientNavigationResource;
use App\Http\Resources\MainSectionResource;
use App\Http\Resources\UserDetailResource;
use App\Http\Resources\UserResource;
use App\Models\MainSection;
use App\Models\User;
use App\Models\UserDetail;
use Illuminate\Http\Request;
use Inertia\Inertia;
class PersonController extends Controller
{
public function index()
{
$persons = UserDetailResource::collection(UserDetail::all());
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('Client/Persons/Index', compact('persons', 'filters'));
}
public function show(string $id)
{
$person = new ClientFullInfoPersonResource(User::query()->with(['userDetail', 'departments_work.faculty', 'departments_teach.faculty', 'divisions', 'faculties'])->where('id', $id)->firstOrFail());
return Inertia::render('Client/Persons/Show', compact('person'));
}
}
+175
View File
@@ -0,0 +1,175 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\Post\StoreRequest;
use App\Http\Resources\CategoryResource;
use App\Http\Resources\GalleryResource;
use App\Http\Resources\PostResource;
use App\Models\AuthorPost;
use App\Models\Category;
use App\Models\Gallery;
use App\Models\Image;
use App\Models\Post;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Sleep;
use Illuminate\Support\Str;
use Inertia\Inertia;
use Illuminate\Support;
use Intervention\Image\ImageManagerStatic as ImageTool;
class PostController extends Controller
{
/**
* Display a listing of the resource.
*/
function index(Request $request)
{
$posts = PostResource::collection(Post::query()
->when(request()->input('search'), function ($query, $search) {
$query->where('title', 'like', "%{$search}%");
})
->orderBy('id', 'desc')
->paginate(request()->input('perPage', 9))
->withQueryString());
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/Events/Index', compact('posts', 'filters'));
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
$categories = CategoryResource::collection(Category::all());
return Inertia::render('AdminPanel/Events/Create', compact('categories'));
}
/**
* Store a newly created resource in storage.
*/
public function store(StoreRequest $request)
{
$data = $request->validated();
$data['slug'] = Str::slug($data['title'], '-');
$count = 0;
$original_slug = $data['slug'];
while (Post::where('slug', '=', $data['slug'])->exists()) {
$count++;
$data['slug'] = $original_slug . '-' . $count + 1;
}
$data['content'] = json_encode($data['content']);
$data['reading_time'] = $this->calculateReadingTime($data['search_data']);
$author = $data['author'];
$images = $data['images'];
unset($data['author']);
unset($data['images']);
$post = Post::create($data);
if (isset($author)) {
AuthorPost::create([
'name' => $author,
'post_id' => $post->id
]);
}
if (isset($images)) {
$gallery = Gallery::create([
'post_id' => $post->id,
]);
foreach ($images as $image) {
$filename = md5(Carbon::now() . '_' . $image->getClientOriginalName()) . '.' . 'jpeg';
ImageTool::configure(['driver' => 'imagick']);
ImageTool::make($image)
->resize(1200, null, function ($constraint) {
$constraint->aspectRatio();
$constraint->upsize();
})
->save(storage_path('app/public/images/' . $filename));
$path = "/storage/images/" . $filename;
Image::create([
'path' => $path,
'gallery_id' => $gallery->id,
]);
}
}
return redirect()->route('admin.post.index');
}
/**
* Display the specified resource.
*/
public function show($slug)
{
$post = new PostResource(Post::where('slug', $slug)->firstOrFail());
return Inertia::render('AdminPanel/Events/Show', compact('post'));
}
/**
* Show the form for editing the specified resource.
*/
public function edit(Post $post)
{
$categories = CategoryResource::collection(Category::all());
$post = new PostResource($post);
return Inertia::render('AdminPanel/Events/Edit', compact('post', 'categories'));
}
/**
* Update the specified resource in storage.
*/
public function update(Post $post, Request $request)
{
$data = $request->validate([
'title' => 'required|max:255|min:5',
'content' => 'required|array',
'content.blocks' => 'required|array|min:1',
'category_id' => 'nullable|exists:categories,id',
'is_published' => 'boolean',
]);
$data['slug'] = \Illuminate\Support\Str::slug($data['title'], '-');
$data['content'] = json_encode($data['content']);
$post->update($data);
return redirect()->route('admin.post.index');
}
/**
* Remove the specified resource from storage.
*/
public function destroy(Post $post)
{
$post->delete();
return redirect()->route('admin.post.index');
}
private function calculateReadingTime(string $text): int
{
$text = "lorem ipsum - это текст - часто используемый в печати и вэб-дизайне lorem ipsum является стандартной для текстов на латинице с начала xvi века в то время некий безымянный печатник создал большую коллекцию размеров и форм шрифтов используя lorem ipsum для распечатки образцов lorem ipsum не только успешно пережил без заметных изменений пять веков но и перешагнул в электронный дизайн его популяризации в новое время послужили публикация листов letraset с образцами lorem ipsum в 60-х годах и в более недавнее время программы электронной вёрстки типа aldus pagemaker в шаблонах которых используется lorem ipsum lorem ipsum - это текст - часто используемый в печати и вэб-дизайне lorem ipsum является стандартной для текстов на латинице с начала xvi века в то время некий безымянный печатник создал большую коллекцию размеров и форм шрифтов используя lorem ipsum для распечатки образцов lorem ipsum не только успешно пережил без заметных изменений пять веков но и перешагнул в электронный дизайн его популяризации в новое время послужили публикация листов letraset с образцами lorem ipsum в 60-х годах и в более недавнее время программы электронной вёрстки типа aldus pagemaker в шаблонах которых используется lorem ipsum";
// Calculate the number of words in the text
$wordCount = str_word_count($text,0,"АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя");
// Calculate the average reading speed in words per minute
$wordsPerMinute = 120; // You can adjust this value based on your desired reading speed
// Calculate the reading time in minutes
$readingTime = $wordCount / $wordsPerMinute;
// Round the reading time to the nearest integer
$readingTime = round($readingTime);
return $readingTime;
}
}
@@ -0,0 +1,63 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\ProfileUpdateRequest;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Redirect;
use Inertia\Inertia;
use Inertia\Response;
class ProfileController extends Controller
{
/**
* Display the user's profile form.
*/
public function edit(Request $request): Response
{
return Inertia::render('Profile/Edit', [
'mustVerifyEmail' => $request->user() instanceof MustVerifyEmail,
'status' => session('status'),
]);
}
/**
* Update the user's profile information.
*/
public function update(ProfileUpdateRequest $request): RedirectResponse
{
$request->user()->fill($request->validated());
if ($request->user()->isDirty('email')) {
$request->user()->email_verified_at = null;
}
$request->user()->save();
return Redirect::route('profile.edit');
}
/**
* Delete the user's account.
*/
public function destroy(Request $request): RedirectResponse
{
$request->validate([
'password' => ['required', 'current_password'],
]);
$user = $request->user();
Auth::logout();
$user->delete();
$request->session()->invalidate();
$request->session()->regenerateToken();
return Redirect::to('/');
}
}
@@ -0,0 +1,94 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\Schedule\StoreRequest;
use App\Http\Resources\ClientNavigationResource;
use App\Http\Resources\FacultyResource;
use App\Http\Resources\MainSectionResource;
use App\Http\Resources\ScheduleResource;
use App\Models\Faculty;
use App\Models\MainSection;
use App\Models\Schedule;
use App\Models\SubSchedule;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Validation\Rules\File;
use Inertia\Inertia;
class ScheduleController extends Controller
{
public function index()
{
$schedules = ScheduleResource::collection(Schedule::query()->ExistSubSchedule()->orderBy('name')->paginate(10));
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/Schedules/Index', compact('schedules', 'filters'));
}
public function create()
{
$faculties = FacultyResource::collection(Faculty::all());
return Inertia::render('AdminPanel/Schedules/Create', compact('faculties'));
}
public function store(StoreRequest $request)
{
$data = $request->validated();
$this->storeSchedules($request->file('files'), $data);
return redirect()->route('admin.index');
}
public function show(Schedule $schedule)
{
$schedule = new ScheduleResource($schedule);
return Inertia::render('AdminPanel/Schedules/Show', compact('schedule'));
}
public function destroy(Schedule $schedule)
{
$schedule->delete();
}
private function storeSchedules($files, $data)
{
foreach ($files as $file) {
$scheduleTitle = $this->generateScheduleTitle($file);
$schedule = $this->storeSchedule($scheduleTitle, $data);
$this->storeSubSchedule($file, $schedule);
}
}
private function generateScheduleTitle($file)
{
$str = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
$words = explode(' ', $str);
return implode(' ', array_slice($words, 0, 2));
}
private function storeSchedule($title, $data)
{
return Schedule::firstOrCreate([
'name' => $title,
'faculty_id' => $data['faculty_id'],
'is_fullTime' => $data['is_fullTime'],
]);
}
private function storeSubSchedule($file, $schedule)
{
$path = Storage::disk('public')->putFileAs('/schedules', $file, $file->getClientOriginalName());
SubSchedule::updateOrCreate([
'name' => pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME),
'path_file' => '/storage/'.$path,
'schedule_id' => $schedule->id,
]);
}
}
+109
View File
@@ -0,0 +1,109 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\AdditionalEducationSearchResource;
use App\Http\Resources\EducationalProgramSearchResource;
use App\Http\Resources\EducationGroupSearchResource;
use App\Http\Resources\EventSearchResource;
use App\Http\Resources\PageResource;
use App\Http\Resources\PageSearchResource;
use App\Http\Resources\PostResource;
use App\Http\Resources\PostSearchResource;
use App\Models\AdditionalEducation;
use App\Models\EducationalGroup;
use App\Models\EducationalProgram;
use App\Models\Event;
use App\Models\Page;
use App\Models\Post;
use Filament\Notifications\Collection;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Date;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Str;
use ProtoneMedia\LaravelCrossEloquentSearch\Search;
class SearchController extends Controller
{
public function index(Request $request)
{
$req = Str::lower($request->query('search'));
if (!$req) {
return response()->json([
'searchRes' => null,
]);
}
$results = Search::new()
->add(Post::where('status', '=', 'published'), ['title', 'search_data'])
->add(Page::where('searchable', '=', true), ['title', 'search_data'])
->add(Event::where('event_date_start', '>', Date::now()), 'title')
->add(AdditionalEducation::where('is_active', '=', true), 'title')
->add(EducationalGroup::with('schedules'), 'title')
->add(EducationalProgram::where('status', '=', true)->whereHas('admission_plans'), 'name')
->beginWithWildcard()
->orderByRelevance()
->includeModelType()
->ignoreCase(true)
->search($req);
$resources = collect($results)->map(function ($result) {
if ($result instanceof Post) {
return new PostSearchResource($result);
}
if ($result instanceof Page) {
return new PageSearchResource($result);
}
if ($result instanceof EducationalGroup) {
return new EducationGroupSearchResource($result);
}
if ($result instanceof EducationalProgram) {
return new EducationalProgramSearchResource($result);
}
if ($result instanceof Event) {
return new EventSearchResource($result);
}
if ($result instanceof AdditionalEducation) {
return new AdditionalEducationSearchResource($result);
}
});
$limitedRes = $resources->take(10);
return response()->json([
'searchRes' => $this->sortByType($limitedRes, $req),
]);
}
private function sortByType(object $data, string $searchRequest): array
{
$sortedData = [];
foreach ($data as $item) {
$searchData = $item['search_data'] ?? '';
$matches = $this->getMatches($searchData, $searchRequest);
$sortedData[$item['type']][] = [
'data' => $item,
'matches' => $matches,
'tag' => $item['type']
];
}
return $sortedData;
}
private function getMatches(string $haystack, string $needle): array
{
$matches = [];
$offset = 0;
while (($offset = mb_strpos($haystack, $needle, $offset, 'UTF-8')) !== false) {
$left = max(0, $offset - 50);
$right = min(mb_strlen($haystack, 'UTF-8'), $offset + 100);
$excerpt = mb_substr($haystack, $left, $right - $left, 'UTF-8');
$matches[] = $excerpt;
$offset += mb_strlen($needle, 'UTF-8');
}
return $matches;
}
}
@@ -0,0 +1,92 @@
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Inertia\Inertia;
use App\Models\Student;
use Illuminate\Http\Request;
use Illuminate\Http\UploadedFile;
use App\Http\Requests\Student\StoreRequest;
use App\Http\Requests\Student\UpdateRequest;
use App\Http\Resources\StudentResource;
use App\Models\UserDetail;
use Carbon\Carbon;
use Illuminate\Support\Facades\Storage;
use Intervention\Image\ImageManagerStatic as ImageTool;
class StudentController extends Controller
{
public function index()
{
$students = StudentResource::collection(Student::paginate(10));
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/Student/Index', compact('students', 'filters'));
}
public function show(Student $student)
{
$student = new StudentResource($student);
return Inertia::render('Client/Student/Show', compact('student'));
}
public function create()
{
return Inertia::render('AdminPanel/Student/Create');
}
public function store(StoreRequest $request)
{
$data = $request->validated();
if ($request->file('photo')) {
$data['photo'] = $this->storePhoto($request->file('photo'));
}
Student::create($data);
return redirect()->route('admin.student.index');
}
public function edit(Student $student)
{
return Inertia::render('AdminPanel/Student/Edit', compact('student'));
}
public function update(Student $student, UpdateRequest $request)
{
$data = $request->validated();
if ($request->file('photo')) {
$data['photo'] = $this->storePhoto($request->file('photo'));
}
$student->update($data);
return redirect()->route('admin.student.index');
}
public function destroy(Student $student)
{
$student->delete();
}
private function storePhoto(UploadedFile $file)
{
if ($file->isValid()) {
$image = $file;
// Генерируем уникальное имя файла, чтобы избежать конфликтов
$filename = md5(Carbon::now() . '_' . $image->getClientOriginalName()) . '.' . $image->getClientOriginalExtension();
// Сохраняем изображение в директорию public
ImageTool::configure(['driver' => 'imagick']);
ImageTool::make($image)
->resize(1200, null, function ($constraint) {
$constraint->aspectRatio();
$constraint->upsize();
})
->save(storage_path('app/public/photos/' . $filename));
$path = "/storage/photos/" . $filename;
// Генерируем URL для доступа к изображению
return $path;
}
}
}
@@ -0,0 +1,16 @@
<?php
namespace App\Http\Controllers;
use App\Models\SubSchedule;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class SubScheduleController extends Controller
{
public function destroy(SubSchedule $subSchedule)
{
Storage::delete($subSchedule->path_file);
$subSchedule->delete();
}
}
@@ -0,0 +1,79 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\SubSectionResource;
use App\Models\Page;
use App\Models\SubSection;
use Illuminate\Http\Request;
use Inertia\Inertia;
class SubSectionController extends Controller
{
public function index()
{
$subSections = SubSectionResource::collection(SubSection::paginate(10));
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/SubSection/Index', compact('subSections', 'filters'));
}
public function create()
{
$pages = Page::query()
->where('sub_section_id', '=', null)
->where('is_visible', '=', 1)
->where('title', '!=', null)
->get();
return Inertia::render('AdminPanel/SubSection/Create', compact('pages'));
}
public function store(Request $request)
{
$data = $request->validate([
'title' => 'required|unique:main_sections|max:50|min:5',
'page_ids' => 'array',
'page_ids.*' => 'exists:pages,id'
]);
$page_ids = $data['page_ids'];
unset($data['page_ids']);
$subSection = SubSection::create($data);
Page::whereIn('id', $page_ids)->update(['sub_section_id' => $subSection->id]);
return redirect()->route('admin.subSection.index');
}
public function edit(SubSection $subSection)
{
$pages = Page::query()->where('sub_section_id', $subSection->id)
->orWhere(function ($query) {
$query->where('sub_section_id', null);
$query->where('is_visible', 1);
$query->where('title', '!=', null);
})->get();
$page_ids = Page::query()->where('sub_section_id', '=', $subSection->id)->pluck('id');
$subSection = new SubSectionResource($subSection);
return Inertia::render('AdminPanel/SubSection/Edit', compact('subSection', 'pages', 'page_ids'));
}
public function update(SubSection $subSection, Request $request)
{
$data = $request->validate([
'title' => 'required|unique:categories|max:50|min:5',
'page_ids' => 'array',
'page_ids.*' => 'exists:pages,id'
]);
$page_ids = $data['page_ids'];
unset($data['page_ids']);
$subSection->update($data);
Page::query()->where('sub_section_id', '=', $subSection->id)->update(['sub_section_id' => NULL]);
Page::whereIn('id', $page_ids)->update(['sub_section_id' => $subSection->id]);
return redirect()->route('admin.subSection.index');
}
public function destroy(SubSection $subSection)
{
Page::query()->where('sub_section_id', '=', $subSection->id)->update(['sub_section_id' => NULL]);
$subSection->delete();
}
}
+10
View File
@@ -0,0 +1,10 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TagController extends Controller
{
//
}
@@ -0,0 +1,33 @@
<?php
namespace App\Http\Controllers;
use App\Jobs\CreateDirectionStudy;
use App\Jobs\CreateEducationalProgram;
use App\Services\Vicon\EducationalProgram\EducationalProgramService;
class UpdateEduDataApiController extends Controller
{
private $programService;
public function __construct()
{
$this->programService = new EducationalProgramService();
}
public function index()
{
$this->updateOrCreateDirectionStudy();
$this->updateOrCreateEducationProgram();
return redirect()->route('index');
}
private function updateOrCreateDirectionStudy() : void
{
dispatch(new CreateDirectionStudy());
}
private function updateOrCreateEducationProgram() : void
{
dispatch(new CreateEducationalProgram());
}
}
+59
View File
@@ -0,0 +1,59 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\User\StoreRequest;
use App\Http\Requests\User\UpdateRequest;
use App\Http\Resources\PostResource;
use App\Http\Resources\UserResource;
use App\Models\User;
use Illuminate\Http\Request;
use Inertia\Inertia;
class UserController extends Controller
{
public function index()
{
$users = UserResource::collection(User::all());
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/Users/Index', compact('users', 'filters'));
}
public function show(int $id)
{
$user = new PostResource(User::find($id));
return Inertia::render('AdminPanel/Users/Show', compact('user'));
}
public function create()
{
return Inertia::render('AdminPanel/Users/Create');
}
public function store(StoreRequest $request)
{
$data = $request->validated();
User::firstOrCreate($data);
return redirect()->route('admin.user.index');
}
public function edit(User $user)
{
$user = new UserResource($user);
return Inertia::render('AdminPanel/Users/Edit', compact('user'));
}
public function update(UpdateRequest $request, User $user)
{
$data = $request->validated();
$user->update($data);
return redirect()->route('admin.user.index');
}
public function destroy(User $user)
{
$user->delete();
}
}
@@ -0,0 +1,68 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\UserDetail\StoreRequest;
use App\Http\Requests\UserDetail\UpdateRequest;
use App\Models\User;
use App\Models\UserDetail;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Inertia\Inertia;
use Intervention\Image\ImageManagerStatic as ImageTool;
class UserDetailController extends Controller
{
public function create(User $user)
{
$userId = $user->id;
return Inertia::render('AdminPanel/UserDetail/Create', compact('userId'));
}
public function store(StoreRequest $request)
{
$data = $request->validated();
if ($request->file('photo')) {
$data['photo'] = $this->storePhoto($request->file('photo'));
}
UserDetail::create($data);
return redirect()->route('admin.user.index');
}
public function edit(UserDetail $userDetail)
{
return Inertia::render('AdminPanel/UserDetail/Edit', compact('userDetail'));
}
public function update(UserDetail $userDetail, UpdateRequest $request)
{
$data = $request->validated();
if ($request->file('photo')) {
$data['photo'] = $this->storePhoto($request->file('photo'));
}
$userDetail->update($data);
return redirect()->route('admin.user.index');
}
private function storePhoto(UploadedFile $file)
{
if ($file->isValid()) {
$image = $file;
// Генерируем уникальное имя файла, чтобы избежать конфликтов
$filename = md5(Carbon::now() . '_' . $image->getClientOriginalName()) . '.' . $image->getClientOriginalExtension();
// Сохраняем изображение в директорию public
ImageTool::configure(['driver' => 'imagick']);
ImageTool::make($image)
->resize(1200, null, function ($constraint) {
$constraint->aspectRatio();
$constraint->upsize();
})
->save(storage_path('app/public/photos/' . $filename));
$path = "/storage/photos/" . $filename;
// Генерируем URL для доступа к изображению
return $path;
}
}
}
@@ -0,0 +1,18 @@
<?php
namespace App\Http\Controllers\api;
use App\Http\Controllers\Controller;
use App\Http\Resources\ClientNavigationResource;
use App\Http\Resources\MainSectionResource;
use App\Models\MainSection;
use Illuminate\Http\Request;
class NavigateController extends Controller
{
public function index()
{
return ClientNavigationResource::collection(MainSection::with('subSections.pages')->orderBy('sort', 'asc')->get());
}
}