Commit 31fe4e458f11e29b92941359f4cd44a8f37c58a1

Authored by Андрей Ларионов
1 parent df4edc01dc

Показ проекта заказчику

Showing 28 changed files with 615 additions and 242 deletions Side-by-side Diff

app/Http/Controllers/Admin/JobTitlesController.php
... ... @@ -5,6 +5,7 @@ namespace App\Http\Controllers\Admin;
5 5 use App\Http\Controllers\Controller;
6 6 use App\Http\Requests\JobTitlesRequest;
7 7 use App\Models\Job_title;
  8 +use App\Models\Positions;
8 9 use Illuminate\Http\Request;
9 10  
10 11 class JobTitlesController extends Controller
... ... @@ -32,8 +33,9 @@ class JobTitlesController extends Controller
32 33 orderBy('name')->
33 34 active()->
34 35 get();*/
  36 + $position = Positions::query()->get();
35 37  
36   - return view('admin.job_titles.add');
  38 + return view('admin.job_titles.add', compact('position'));
37 39 }
38 40  
39 41 /**
... ... @@ -67,7 +69,8 @@ class JobTitlesController extends Controller
67 69 */
68 70 public function edit(Job_title $job_title)
69 71 {
70   - return view('admin.job_titles.edit', compact('job_title'));
  72 + $position = Positions::query()->get();
  73 + return view('admin.job_titles.edit', compact('job_title', 'position'));
71 74 }
72 75  
73 76 /**
app/Http/Controllers/CompanyController.php
... ... @@ -30,6 +30,7 @@ class CompanyController extends Controller
30 30  
31 31 $emps = $emps->paginate(4);
32 32  
  33 +
33 34 if ($request->ajax()) {
34 35 if ($request->get('block') == '1')
35 36 return view('ajax.companies', compact('emps', 'count_emps'));
app/Http/Controllers/EmployerController.php
... ... @@ -114,9 +114,15 @@ class EmployerController extends Controller
114 114 // Форма добавления вакансий
115 115 public function cabinet_vacancie() {
116 116 $id = Auth()->user()->id;
117   - $jobs = Job_title::query()->OrderBy('name')->get();
  117 +
118 118 $categories = Category::query()->get();
119 119 $Positions = Positions::query()->get();
  120 + if ($Positions->count()) {
  121 + $jobs = Job_title::query()->OrderBy('name')->where('position_id', $Positions[0]->id)->get();
  122 + } else {
  123 + $jobs = Job_title::query()->OrderBy('name')->where('position_id', 0)->get();
  124 + }
  125 +
120 126 $Employer = Employer::query()->with('users')->with('ads')->with('flots')->
121 127 WhereHas('users',
122 128 function (Builder $query) use ($id) {$query->Where('id', $id);
... ... @@ -137,7 +143,7 @@ class EmployerController extends Controller
137 143 $jobs['job_title_id'] = $params['job_title_id'];
138 144 $jobs['description'] = $params['description'];
139 145 $jobs['region'] = $params['city'];
140   - $jobs['position_ship'] = $params['position_ship'];
  146 + //$titles['position_id'] = $params['position_id'];
141 147 unset($params['min_salary']);
142 148 unset($params['max_salary']);
143 149 unset($params['flot']);
... ... @@ -148,7 +154,8 @@ class EmployerController extends Controller
148 154  
149 155 $id = Ad_employer::create($params)->id;
150 156 $jobs['ad_employer_id'] = $id;
151   - Ad_jobs::create($jobs);
  157 + $ad_jobs = Ad_jobs::create($jobs);
  158 +
152 159 return redirect()->route('employer.vacancy_list');
153 160 }
154 161  
... ... @@ -169,7 +176,8 @@ class EmployerController extends Controller
169 176 default: $vacancy_list = $vacancy_list->orderBy('id')->orderby('updated_at'); break;
170 177 }
171 178 }
172   - $vacancy_list = $vacancy_list->get();
  179 + $vacancy_list = $vacancy_list->paginate(4);
  180 +
173 181  
174 182 //ajax
175 183 if ($request->ajax()) {
... ... @@ -182,19 +190,36 @@ class EmployerController extends Controller
182 190 // Карточка вакансии
183 191 public function vacancy_edit(Ad_employer $ad_employer) {
184 192 $id = Auth()->user()->id;
185   - $jobs = Job_title::query()->OrderBy('name')->get();
  193 +
  194 + $Positions = Positions::query()->get();
  195 + if ($Positions->count()) {
  196 + $jobs = Job_title::query()->OrderBy('name')->where('position_id', $Positions[0]->id)->get();
  197 + } else {
  198 + $jobs = Job_title::query()->OrderBy('name')->where('position_id', 0)->get();
  199 + }
  200 +
186 201 $categories = Category::query()->get();
187 202 $Employer = Employer::query()->with('users')->with('ads')->with('flots')->
188 203 where('user_id', $id)->first();
189 204  
190   - return view('employers.edit_vacancy', compact('ad_employer', 'categories','Employer', 'jobs'));
  205 + return view('employers.edit_vacancy', compact('ad_employer', 'Positions', 'categories','Employer', 'jobs'));
191 206 }
192 207  
193 208 // Сохранение-редактирование записи
194 209 public function vacancy_save_me(VacancyRequestEdit $request, Ad_employer $ad_employer) {
195   - $all = $request->all();
  210 + $params = $request->all();
196 211  
197   - $ad_employer->update($all);
  212 + //$jobs['flot'] = $params['flot'];
  213 + $jobs['job_title_id'] = $params['job_title_id'];
  214 + //$titles['position_id'] = $params['position_id'];
  215 + unset($params['job_title_id']);
  216 +
  217 + $ad_employer->update($params);
  218 +
  219 + $job_ = Ad_jobs::query()->where('job_title_id', $jobs['job_title_id'])->
  220 + where('ad_employer_id', $ad_employer->id)->first();
  221 + $data = Ad_jobs::find($job_->id);
  222 + $ad_jobs = $data->update($jobs);
198 223  
199 224 return redirect()->route('employer.vacancy_list');
200 225 }
... ... @@ -680,7 +705,13 @@ class EmployerController extends Controller
680 705 // Восстановление пароля
681 706 public function repair_password(Request $request) {
682 707 $params = $request->get('email');
  708 + }
683 709  
  710 + // Избранные люди на корабль
  711 + public function selected_people(Request $request) {
  712 + $id = $request->get('id');
  713 + $favorite_people = Job_title::query()->where('position_id', $id)->get();
684 714  
  715 + return view('favorite_people', compact('favorite_people'));
685 716 }
686 717 }
app/Http/Controllers/MainController.php
... ... @@ -41,7 +41,7 @@ class MainController extends Controller
41 41  
42 42 $Position = Positions::query()->get();
43 43  
44   - $BigFlot = Array();
  44 + /*$BigFlot = Array();
45 45 foreach ($Position as $position) {
46 46 $BigFlot[] = DB::table('ad_jobs')->selectRaw('name, job_titles.id as id_title, count(`ad_jobs`.`id`) as cnt, ad_jobs.position_ship')->
47 47 orderBy('job_titles.sort')->
... ... @@ -51,6 +51,30 @@ class MainController extends Controller
51 51 get();
52 52 }
53 53  
  54 + $BigFlot = Array();
  55 +
  56 + foreach ($Position as $position) {
  57 +
  58 + $BigFlot[] = Ad_jobs::query()->with(['job_title' => function($query) {
  59 + $query->OrderBy('sort');
  60 + }])->whereHas('job_title', function ($query) use ($position) {
  61 + $query->where('position_id', $position->id);
  62 + })->
  63 + distinct('job_title_id')->
  64 + get();
  65 + }*/
  66 +
  67 + $BigFlot = Array();
  68 + foreach ($Position as $position) {
  69 + $BigFlot[] = DB::table('ad_jobs')->
  70 + selectRaw('name, count(`ad_jobs`.`id`) as cnt, job_title_id, job_titles.name')->
  71 + orderByDesc('job_titles.sort')->
  72 + join('job_titles', 'job_titles.id', '=', 'ad_jobs.job_title_id')->
  73 + where('job_titles.position_id', $position->id)->
  74 + groupby('job_title_id')->
  75 + get();
  76 + }
  77 +
54 78 $employers = employers_main::query()->with('employer')->orderBy('id')->limit(8)->get();
55 79 $vacancy = Ad_jobs::query()->with('job_title')->orderBy('position_ship')->get();
56 80 return view('index', compact('news', 'categories', 'employers', 'vacancy', 'BigFlot', 'Position'));
... ... @@ -127,7 +151,7 @@ class MainController extends Controller
127 151  
128 152 $Position = Positions::query()->get();
129 153  
130   - $BigFlot = Array();
  154 + /*$BigFlot = Array();
131 155 foreach ($Position as $position) {
132 156 $War_flot = DB::table('ad_jobs')->selectRaw('name, job_titles.id as id_title, count(`ad_jobs`.`id`) as cnt, ad_jobs.position_ship')->
133 157 orderBy('job_titles.sort')->
... ... @@ -138,6 +162,20 @@ class MainController extends Controller
138 162 }
139 163 $War_flot = $War_flot->groupby('job_title_id','position_ship')->get();
140 164 $BigFlot[] = $War_flot;
  165 + }*/
  166 +
  167 + $BigFlot = Array();
  168 + foreach ($Position as $position) {
  169 + $WarFlot = DB::table('ad_jobs')->
  170 + selectRaw('name, count(`ad_jobs`.`id`) as cnt, job_title_id, job_titles.name')->
  171 + orderByDesc('job_titles.sort')->
  172 + join('job_titles', 'job_titles.id', '=', 'ad_jobs.job_title_id')->
  173 + where('job_titles.position_id', $position->id);
  174 + if (($request->has('job')) && ($request->get('job') > 0)) {
  175 + $WarFlot = $WarFlot->where('job_title_id', $request->get('job'));
  176 + }
  177 + $WarFlot = $WarFlot->groupby('job_title_id')->get();
  178 + $BigFlot[] = $WarFlot;
141 179 }
142 180  
143 181 if ($request->ajax()) {
app/Http/Controllers/WorkerController.php
... ... @@ -103,7 +103,7 @@ class WorkerController extends Controller
103 103 }
104 104  
105 105 $res_count = $resumes->count();
106   - $resumes = $resumes->paginate(6);
  106 + $resumes = $resumes->paginate(4);
107 107 if ($request->ajax()) {
108 108 // Условия обставлены
109 109 if ($request->has('block') && ($request->get('block') == 1)) {
... ... @@ -412,9 +412,7 @@ class WorkerController extends Controller
412 412 public function register_worker(Request $request)
413 413 {
414 414 $params = $request->all();
415   -
416   -
417   - dd($params);
  415 + $params['is_worker'] = 1;
418 416  
419 417 $rules = [
420 418 'surname' => ['required', 'string', 'max:255'],
... ... @@ -441,6 +439,30 @@ class WorkerController extends Controller
441 439 return json_encode(Array("ERROR" => "Error: Не совпадают пароль и подтверждение пароля"));
442 440 }
443 441  
  442 + $haystack = $request->get('password');
  443 +
  444 + $specsumbol = Array('!','~', '#', '$', '%', '^', '&', '*', '(', ')', '-', '=', ';', ':', '<', '>', '?');
  445 + $alpha = Array('Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'Z',
  446 + 'X', 'C', 'V', 'B', 'N', 'M');
  447 + $spec_bool = false;
  448 + $alpha_bool = false;
  449 +
  450 + foreach ($specsumbol as $it) {
  451 + if (strpos($haystack, $it) !== false) {
  452 + $spec_bool = true;
  453 + }
  454 + }
  455 +
  456 + foreach ($alpha as $it) {
  457 + if (strpos($haystack, $it) !== false) {
  458 + $alpha_bool = true;
  459 + }
  460 + }
  461 +
  462 + if ((!$spec_bool) || (!$alpha_bool)) {
  463 + return json_encode(Array("ERROR" => "Error: Нет спецсимволов в пароле, латинские буквы заглавные, а также один из символов: !~#$%^&*()-=;,:<>?"));
  464 + }
  465 +
444 466 if (($request->has('politik')) && ($request->get('politik') == 1)) {
445 467 $validator = Validator::make($request->all(), $rules, $messages);
446 468  
... ... @@ -449,10 +471,8 @@ class WorkerController extends Controller
449 471 } else {
450 472 $user = $this->create($params);
451 473 event(new Registered($user));
452   -
453 474 Auth::guard()->login($user);
454 475 }
455   -
456 476 if ($user) {
457 477 return json_encode(Array("REDIRECT" => redirect()->route('worker.cabinet')->getTargetUrl()));;
458 478 } else {
... ... @@ -462,11 +482,8 @@ class WorkerController extends Controller
462 482 } else {
463 483 return json_encode(Array("ERROR" => "Error3: Вы не согласились с политикой конфидициальности!"));
464 484 }
465   -
466   -
467 485 }
468 486  
469   -
470 487 // Звездная оценка и ответ
471 488 public function stars_answer(Request $request) {
472 489 $params = $request->all();
... ... @@ -604,6 +621,7 @@ class WorkerController extends Controller
604 621 public function up(Worker $worker) {
605 622 $worker->updated_at = Carbon::now();
606 623 $worker->save();
  624 + // 0
607 625 return redirect()->route('worker.cabinet')->with('success', 'Ваша анкета была поднята выше остальных');
608 626 }
609 627  
app/Models/Ad_jobs.php
... ... @@ -2,6 +2,7 @@
2 2  
3 3 namespace App\Models;
4 4  
  5 +use Filament\Tables\Actions\Position;
5 6 use Illuminate\Database\Eloquent\Factories\HasFactory;
6 7 use Illuminate\Database\Eloquent\Model;
7 8  
... ... @@ -27,4 +28,8 @@ class Ad_jobs extends Model
27 28 public function job_title() {
28 29 return $this->belongsTo(Job_title::class, 'job_title_id');
29 30 }
  31 +
  32 + public function positions() {
  33 + return $this->belongsToMany(Positions::class, 'job_titles');
  34 + }
30 35 }
app/Models/Job_title.php
... ... @@ -13,7 +13,8 @@ class Job_title extends Model
13 13 'name',
14 14 'is_remove',
15 15 'parent_id',
16   - 'sort'
  16 + 'sort',
  17 + 'position_id'
17 18 ];
18 19 /*
19 20 * Связь модели Вакансии (Ad_employer) с моделью Должности (Job_title)
database/migrations/2023_09_08_084707_alter_job_titles3_table.php
... ... @@ -15,6 +15,7 @@ return new class extends Migration
15 15 {
16 16 Schema::table('job_titles', function (Blueprint $table) {
17 17 $table->integer('sort')->default(100);
  18 + $table->integer('position_id')->nullable(false);
18 19 });
19 20 }
20 21  
... ... @@ -27,6 +28,7 @@ return new class extends Migration
27 28 {
28 29 Schema::table('job_titles', function (Blueprint $table) {
29 30 $table->dropColumn('sort');
  31 + $table->dropColumn('position_id');
30 32 });
31 33 }
32 34 };
public/js/script-vc.js
... ... @@ -0,0 +1,164 @@
  1 +let scripts = function () {
  2 +
  3 + $('.js-toggle').on('click', function () {
  4 + $(this).toggleClass('active');
  5 + });
  6 + $('.js-parent-toggle').on('click', function () {
  7 + $(this).parent().toggleClass('active');
  8 + });
  9 + $('.js-parent-remove').on('click', function () {
  10 + $(this).parent().remove();
  11 + });
  12 + $('.js-menu-toggle').on('click', function () {
  13 + window.scrollTo(0, 0);
  14 + $('#body').toggleClass('menu-is-actived');
  15 + });
  16 + $('.js-cookies-close').on('click', function () {
  17 + $('#body').removeClass('cookies-is-actived');
  18 + });
  19 + $('.js-works-edit').on('click', function () {
  20 + $(this).parent().parent().parent().addClass('active');
  21 + });
  22 + $('.js-works-remove').on('click', function () {
  23 + $(this).parent().parent().parent().parent().remove();
  24 + });
  25 +
  26 + $('[data-tab]').on('click', function () {
  27 + $('[data-tab]').removeClass('active');
  28 + $('[data-body]').removeClass('showed');
  29 + $(this).addClass('active');
  30 + var id = $(this).data('tab');
  31 + $('[data-body=' + id + ']').addClass('showed');
  32 + });
  33 +
  34 + $('.js-password-show').on('click', function () {
  35 + $(this).parent().addClass('active');
  36 + $(this).parent().parent().find('input').attr('type', 'text');
  37 + });
  38 +
  39 + $('.js-password-hide').on('click', function () {
  40 + $(this).parent().removeClass('active');
  41 + $(this).parent().parent().find('input').attr('type', 'password');
  42 + });
  43 +
  44 + let checkScrollTop = function () {
  45 + if ($(document).scrollTop() == 0) {
  46 + $('#body').removeClass('begin');
  47 + } else {
  48 + $('#body').addClass('begin');
  49 + }
  50 + }
  51 + checkScrollTop();
  52 + $(document).on('scroll', function () {
  53 + checkScrollTop();
  54 + });
  55 +
  56 + let closeAll = function () {
  57 + $('.js-toggle').removeClass('active');
  58 + $('.js-parent-toggle').parent().removeClass('active');
  59 + $('#body').removeClass('menu-is-actived');
  60 + $('#body').removeClass('cookies-is-actived');
  61 + }
  62 +
  63 + $(document).keyup(function (e) {
  64 + if (e.key === "Escape") {
  65 + closeAll();
  66 + }
  67 + });
  68 +
  69 + $('.js-scroll-to').bind('click', function (e) {
  70 + let anchor = $(this);
  71 + $('html,body').stop().animate({
  72 + scrollTop: $(anchor.attr('href')).offset().top
  73 + }, 300);
  74 + e.preventDefault();
  75 + });
  76 +
  77 + if ($('[type=tel]').is('[type=tel]')) {
  78 + $('[type=tel]').mask('+7 (999) 999-99-99');
  79 + }
  80 +
  81 + if ($('.js-select2').is('.js-select2')) {
  82 + $('.js-select2').select2();
  83 + }
  84 +
  85 + const starRating = document.querySelectorAll(".js-stars");
  86 + if (starRating.length) {
  87 + starRating.forEach(item => {
  88 + new StarRating(item);
  89 + });
  90 + }
  91 +
  92 + const checkboxes = document.querySelectorAll(".checkbox");
  93 + if (checkboxes.length) {
  94 + checkboxes.forEach(checkbox => {
  95 + const input = checkbox.querySelector("input");
  96 + checkbox.addEventListener("input", () => {
  97 + if (input.checked) {
  98 + input.setAttribute("checked", "");
  99 + } else {
  100 + input.removeAttribute("checked");
  101 + }
  102 + });
  103 + });
  104 + }
  105 +
  106 +};
  107 +
  108 +let swipers = function () {
  109 +
  110 + if ($('.js-employer-swiper').is('.js-employer-swiper')) {
  111 + let slider = new Swiper('.js-employer-swiper', {
  112 + autoplay: {
  113 + delay: 5000,
  114 + },
  115 + pagination: {
  116 + el: '.swiper-pagination',
  117 + clickable: true
  118 + },
  119 + breakpoints: {
  120 + 768: {
  121 + slidesPerView: 2,
  122 + },
  123 + 992: {
  124 + slidesPerView: 3,
  125 + },
  126 + 1280: {
  127 + slidesPerView: 4,
  128 + },
  129 + }
  130 + });
  131 + }
  132 +
  133 + if ($('.js-news-swiper').is('.js-news-swiper')) {
  134 + let slider = new Swiper('.js-news-swiper', {
  135 + spaceBetween: 20,
  136 + pagination: {
  137 + el: '.swiper-pagination',
  138 + clickable: true
  139 + },
  140 + navigation: {
  141 + prevEl: '.js-news-swiper-button-prev',
  142 + nextEl: '.js-news-swiper-button-next',
  143 + },
  144 + breakpoints: {
  145 + 768: {
  146 + slidesPerView: 2,
  147 + },
  148 + 992: {
  149 + slidesPerView: 3,
  150 + },
  151 + }
  152 + });
  153 + }
  154 +
  155 +};
  156 +
  157 +document.addEventListener("DOMContentLoaded", () => {
  158 + scripts();
  159 + swipers();
  160 +});
  161 +
  162 +$(window).resize(function () {
  163 + swipers();
  164 +});
public/js/script.js
... ... @@ -1,173 +0,0 @@
1   -let scripts = function () {
2   -
3   - $('.js-toggle').on('click', function () {
4   - $(this).toggleClass('active');
5   - });
6   - $('.js-parent-toggle').on('click', function () {
7   - $(this).parent().toggleClass('active');
8   - });
9   - $('.js-parent-remove').on('click', function () {
10   - $(this).parent().remove();
11   - });
12   - $('.js-menu-toggle').on('click', function () {
13   - window.scrollTo(0, 0);
14   - $('#body').toggleClass('menu-is-actived');
15   - });
16   - $('.js-cookies-close').on('click', function () {
17   - $('#body').removeClass('cookies-is-actived');
18   - });
19   - $('.js-works-edit').on('click', function () {
20   - $(this).parent().parent().parent().addClass('active');
21   - });
22   - $('.js-works-remove').on('click', function () {
23   - $(this).parent().parent().parent().parent().remove();
24   - });
25   -
26   - $('[data-tab]').on('click', function () {
27   - $('[data-tab]').removeClass('active');
28   - $('[data-body]').removeClass('showed');
29   - $(this).addClass('active');
30   - var id = $(this).data('tab');
31   - $('[data-body=' + id + ']').addClass('showed');
32   - });
33   -
34   - $('.js-password-show').on('click', function () {
35   - $(this).parent().addClass('active');
36   - $(this).parent().parent().find('input').attr('type', 'text');
37   - });
38   -
39   - $('.js-password-hide').on('click', function () {
40   - $(this).parent().removeClass('active');
41   - $(this).parent().parent().find('input').attr('type', 'password');
42   - });
43   -
44   - let checkScrollTop = function () {
45   - if ($(document).scrollTop() == 0) {
46   - $('#body').removeClass('begin');
47   - } else {
48   - $('#body').addClass('begin');
49   - }
50   - }
51   - checkScrollTop();
52   - $(document).on('scroll', function () {
53   - checkScrollTop();
54   - });
55   -
56   - let closeAll = function () {
57   - $('.js-toggle').removeClass('active');
58   - $('.js-parent-toggle').parent().removeClass('active');
59   - $('#body').removeClass('menu-is-actived');
60   - $('#body').removeClass('cookies-is-actived');
61   - }
62   -
63   - $(document).keyup(function (e) {
64   - if (e.key === "Escape") {
65   - closeAll();
66   - }
67   - });
68   -
69   - $('.js-scroll-to').bind('click', function (e) {
70   - let anchor = $(this);
71   - $('html,body').stop().animate({
72   - scrollTop: $(anchor.attr('href')).offset().top
73   - }, 300);
74   - e.preventDefault();
75   - });
76   -
77   - if ($('[type=tel]').is('[type=tel]')) {
78   - $('[type=tel]').mask('+7 (999) 999-99-99');
79   - }
80   -
81   - if ($('.js-select2').is('.js-select2')) {
82   - $('.js-select2').select2();
83   - }
84   -
85   - const starRating = document.querySelectorAll(".js-stars");
86   - if (starRating.length) {
87   - starRating.forEach(item => {
88   - new StarRating(item);
89   - });
90   - }
91   -
92   - // cookies
93   - const cookieItems = document.querySelectorAll(".js-ck");
94   - if (cookieItems.length) {
95   - cookieItems.forEach(item => {
96   - const id = item.dataset.id;
97   - const like = item.querySelector(".like");
98   - const checkLike = function () {
99   - if (like.classList.contains("active")) {
100   - Cookies.set('favor_vacan-'+id, id);
101   - } else {
102   - Cookies.remove(id);
103   - }
104   - }
105   - like.addEventListener("click", () => {
106   - checkLike();
107   - });
108   - if (Cookies.get('favor_vacan-'+id) == id) {
109   - like.classList.add("active");
110   - }
111   - });
112   - }
113   - console.log(Cookies.get());
114   -
115   -};
116   -
117   -let swipers = function () {
118   -
119   - if ($('.js-employer-swiper').is('.js-employer-swiper')) {
120   - let slider = new Swiper('.js-employer-swiper', {
121   - autoplay: {
122   - delay: 5000,
123   - },
124   - pagination: {
125   - el: '.swiper-pagination',
126   - clickable: true
127   - },
128   - breakpoints: {
129   - 768: {
130   - slidesPerView: 2,
131   - },
132   - 992: {
133   - slidesPerView: 3,
134   - },
135   - 1280: {
136   - slidesPerView: 4,
137   - },
138   - }
139   - });
140   - }
141   -
142   - if ($('.js-news-swiper').is('.js-news-swiper')) {
143   - let slider = new Swiper('.js-news-swiper', {
144   - spaceBetween: 20,
145   - pagination: {
146   - el: '.swiper-pagination',
147   - clickable: true
148   - },
149   - navigation: {
150   - prevEl: '.js-news-swiper-button-prev',
151   - nextEl: '.js-news-swiper-button-next',
152   - },
153   - breakpoints: {
154   - 768: {
155   - slidesPerView: 2,
156   - },
157   - 992: {
158   - slidesPerView: 3,
159   - },
160   - }
161   - });
162   - }
163   -
164   -};
165   -
166   -document.addEventListener("DOMContentLoaded", () => {
167   - scripts();
168   - swipers();
169   -});
170   -
171   -$(window).resize(function () {
172   - swipers();
173   -});
public/js/script0.js
... ... @@ -0,0 +1,173 @@
  1 +let scripts = function () {
  2 +
  3 + $('.js-toggle').on('click', function () {
  4 + $(this).toggleClass('active');
  5 + });
  6 + $('.js-parent-toggle').on('click', function () {
  7 + $(this).parent().toggleClass('active');
  8 + });
  9 + $('.js-parent-remove').on('click', function () {
  10 + $(this).parent().remove();
  11 + });
  12 + $('.js-menu-toggle').on('click', function () {
  13 + window.scrollTo(0, 0);
  14 + $('#body').toggleClass('menu-is-actived');
  15 + });
  16 + $('.js-cookies-close').on('click', function () {
  17 + $('#body').removeClass('cookies-is-actived');
  18 + });
  19 + $('.js-works-edit').on('click', function () {
  20 + $(this).parent().parent().parent().addClass('active');
  21 + });
  22 + $('.js-works-remove').on('click', function () {
  23 + $(this).parent().parent().parent().parent().remove();
  24 + });
  25 +
  26 + $('[data-tab]').on('click', function () {
  27 + $('[data-tab]').removeClass('active');
  28 + $('[data-body]').removeClass('showed');
  29 + $(this).addClass('active');
  30 + var id = $(this).data('tab');
  31 + $('[data-body=' + id + ']').addClass('showed');
  32 + });
  33 +
  34 + $('.js-password-show').on('click', function () {
  35 + $(this).parent().addClass('active');
  36 + $(this).parent().parent().find('input').attr('type', 'text');
  37 + });
  38 +
  39 + $('.js-password-hide').on('click', function () {
  40 + $(this).parent().removeClass('active');
  41 + $(this).parent().parent().find('input').attr('type', 'password');
  42 + });
  43 +
  44 + let checkScrollTop = function () {
  45 + if ($(document).scrollTop() == 0) {
  46 + $('#body').removeClass('begin');
  47 + } else {
  48 + $('#body').addClass('begin');
  49 + }
  50 + }
  51 + checkScrollTop();
  52 + $(document).on('scroll', function () {
  53 + checkScrollTop();
  54 + });
  55 +
  56 + let closeAll = function () {
  57 + $('.js-toggle').removeClass('active');
  58 + $('.js-parent-toggle').parent().removeClass('active');
  59 + $('#body').removeClass('menu-is-actived');
  60 + $('#body').removeClass('cookies-is-actived');
  61 + }
  62 +
  63 + $(document).keyup(function (e) {
  64 + if (e.key === "Escape") {
  65 + closeAll();
  66 + }
  67 + });
  68 +
  69 + $('.js-scroll-to').bind('click', function (e) {
  70 + let anchor = $(this);
  71 + $('html,body').stop().animate({
  72 + scrollTop: $(anchor.attr('href')).offset().top
  73 + }, 300);
  74 + e.preventDefault();
  75 + });
  76 +
  77 + if ($('[type=tel]').is('[type=tel]')) {
  78 + $('[type=tel]').mask('+7 (999) 999-99-99');
  79 + }
  80 +
  81 + if ($('.js-select2').is('.js-select2')) {
  82 + $('.js-select2').select2();
  83 + }
  84 +
  85 + const starRating = document.querySelectorAll(".js-stars");
  86 + if (starRating.length) {
  87 + starRating.forEach(item => {
  88 + new StarRating(item);
  89 + });
  90 + }
  91 +
  92 + // cookies
  93 + const cookieItems = document.querySelectorAll(".js-ck");
  94 + if (cookieItems.length) {
  95 + cookieItems.forEach(item => {
  96 + const id = item.dataset.id;
  97 + const like = item.querySelector(".like");
  98 + const checkLike = function () {
  99 + if (like.classList.contains("active")) {
  100 + Cookies.set('favor_vacan-'+id, id);
  101 + } else {
  102 + Cookies.remove(id);
  103 + }
  104 + }
  105 + like.addEventListener("click", () => {
  106 + checkLike();
  107 + });
  108 + if (Cookies.get('favor_vacan-'+id) == id) {
  109 + like.classList.add("active");
  110 + }
  111 + });
  112 + }
  113 + console.log(Cookies.get());
  114 +
  115 +};
  116 +
  117 +let swipers = function () {
  118 +
  119 + if ($('.js-employer-swiper').is('.js-employer-swiper')) {
  120 + let slider = new Swiper('.js-employer-swiper', {
  121 + autoplay: {
  122 + delay: 5000,
  123 + },
  124 + pagination: {
  125 + el: '.swiper-pagination',
  126 + clickable: true
  127 + },
  128 + breakpoints: {
  129 + 768: {
  130 + slidesPerView: 2,
  131 + },
  132 + 992: {
  133 + slidesPerView: 3,
  134 + },
  135 + 1280: {
  136 + slidesPerView: 4,
  137 + },
  138 + }
  139 + });
  140 + }
  141 +
  142 + if ($('.js-news-swiper').is('.js-news-swiper')) {
  143 + let slider = new Swiper('.js-news-swiper', {
  144 + spaceBetween: 20,
  145 + pagination: {
  146 + el: '.swiper-pagination',
  147 + clickable: true
  148 + },
  149 + navigation: {
  150 + prevEl: '.js-news-swiper-button-prev',
  151 + nextEl: '.js-news-swiper-button-next',
  152 + },
  153 + breakpoints: {
  154 + 768: {
  155 + slidesPerView: 2,
  156 + },
  157 + 992: {
  158 + slidesPerView: 3,
  159 + },
  160 + }
  161 + });
  162 + }
  163 +
  164 +};
  165 +
  166 +document.addEventListener("DOMContentLoaded", () => {
  167 + scripts();
  168 + swipers();
  169 +});
  170 +
  171 +$(window).resize(function () {
  172 + swipers();
  173 +});
resources/views/admin/job_titles/form.blade.php
... ... @@ -26,6 +26,21 @@
26 26 </label><br>
27 27  
28 28 <label class="block text-sm">
  29 + <span class="text-gray-700 dark:text-gray-400">Папка</span>
  30 +
  31 + @php
  32 + $position_id = old('position_id') ?? $job_title->position_id ?? 0;
  33 + @endphp
  34 + <select name="position_id" class="block w-full mt-1 text-sm dark:text-gray-300 dark:border-gray-600 dark:bg-gray-700 form-select focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray"
  35 + title="Родитель">
  36 + <option value="">Без родителя</option>
  37 + @foreach ($position as $it)
  38 + <option value="{{ $it->id }}" @if ($it->id == $position_id) selected @endif>{{ $it->name }}</option>
  39 + @endforeach
  40 + </select>
  41 + </label><br>
  42 +
  43 + <label class="block text-sm">
29 44 <span class="text-gray-700 dark:text-gray-400">Сортировка</span>
30 45 @php
31 46 $sort_num = 100;
resources/views/admin/positions/position.blade.php
1   -@extends('layout.admin', ['title' => 'Админка - Работники'])
  1 +@extends('layout.admin', ['title' => 'Админка - Позиции'])
2 2 @section('script')
3 3 <script>
4 4 $(document).ready(function() {
resources/views/block_real.blade.php
... ... @@ -5,14 +5,15 @@
5 5 @if ($flot->count())
6 6 @foreach ($flot as $key => $cat)
7 7 @if ($k == 0)
8   - <div class="vacancies__list-label">{{ $cat->position_ship }}</div>
  8 + <div class="vacancies__list-label">{{ $position->name }}</div>
9 9 @endif
10   - <a href="{{ route('list-vacancies', ['job' => $cat->id_title]) }}" class="vacancies__item">
11   - <span style="border-color:{{$colors[$i]}}">
12   - <b>{{ $cat->name }}</b>
13   - <i>Вакансий: <span>{{ $cat->cnt }}</span></i>
14   - </span>
15   - </a>
  10 +
  11 + <a href="{{ route('list-vacancies', ['job' => $cat->job_title_id]) }}" class="vacancies__item">
  12 + <span style="border-color:{{$colors[$i]}}">
  13 + <b>{{ $cat->name }}</b>
  14 + <i>Вакансий: <span>{{ $cat->cnt }}</span></i>
  15 + </span>
  16 + </a>
16 17  
17 18 @php
18 19 $i++;
resources/views/companies.blade.php
... ... @@ -93,7 +93,7 @@
93 93 <div class="container">
94 94 <div class="main__employers">
95 95 <div class="filters">
96   - <div class="filters__label">Показано @if ($count_emps < 4) 1 - {{ $count_emps }} @else 1 – 4 @endif из {{ $count_emps }} результатов поиска</div>
  96 + <div class="filters__label">Показано {{ $emps->firstItem() }} – {{ $emps->lastItem() }} из {{ $count_emps }} результатов поиска</div>
97 97 <div class="filters__body">
98 98 <div class="select filters__select">
99 99 <select class="js-select2" id="sort_ajax" name="sort_ajax">
... ... @@ -151,9 +151,11 @@
151 151 </div>
152 152  
153 153 {{ $emps->appends($_GET)->links('paginate') }}
  154 +
154 155 @else
155 156 <H2>Нет данных</H2>
156 157 @endif
  158 +
157 159 </div>
158 160 <div class="main__employers-body" data-body="2" id="block_2" name="block_2">
159 161 @if ($emps->count())
resources/views/education.blade.php
... ... @@ -74,7 +74,7 @@
74 74 <main class="main">
75 75 <div class="container">
76 76 <div class="filters">
77   - <div class="filters__label">Показано 1 – @if($count_edu < 6) {{ $count_edu }}@else 6 @endif из {{ $count_edu }} результатов поиска</div>
  77 + <div class="filters__label">Показано {{ $educations->firstItem() }} – {{ $educations->lastItem() }} из {{ $count_edu }} результатов поиска</div>
78 78 <div class="filters__body">
79 79 <div class="select filters__select">
80 80 <select class="js-select2" id="sort_ajax" name="sort_ajax">
... ... @@ -88,7 +88,6 @@
88 88 </div>
89 89 </div>
90 90  
91   -
92 91 <div class="main__ads" id="block" name="block">
93 92 @if ($educations->count())
94 93 @foreach($educations as $edu)
resources/views/employers/add_vacancy.blade.php
1 1 @extends('layout.frontend', ['title' => 'Добавление вакансии РекаМоре'])
2 2  
3 3 @section('scripts')
  4 + <script>
  5 + console.log('Приближаемся к системе, нас рой тут...');
  6 + $(document).on('change', '#position_id', function() {
  7 + var this_ = $(this);
  8 + var val_ = this_.val();
  9 + var ajax_ = $('#job_title_id');
  10 +
  11 + console.log('Создания списка людей, которые поднимутся на корабль...');
  12 +
  13 + $.ajax({
  14 + type: "GET",
  15 + url: "{{ route('employer.selected_people') }}",
  16 + data: "id="+val_,
  17 + success: function (data) {
  18 + console.log('Ответка пришла');
  19 + console.log('Список избранных людей создан');
  20 + ajax_.html(data);
  21 + },
  22 + headers: {
  23 + 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
  24 + },
  25 + error: function (data) {
  26 + console.log('Обрыв связи');
  27 + console.log('Error: ' + data);
  28 + }
  29 + });
  30 + });
  31 + </script>
4 32 @endsection
5 33 @section('content')
6 34 <section class="cabinet">
... ... @@ -44,6 +72,25 @@
44 72 @enderror
45 73 </div>
46 74 </div>
  75 +
  76 + <div class="cabinet__inputs-item cabinet__inputs-item_fullwidth form-group">
  77 + <label class="form-group__label">Позиция на корабле</label>
  78 + <div class="form-group__item">
  79 + <div class="select">
  80 + <select class="js-select2" name="position_id" id="position_id">
  81 + @foreach ($Positions as $it)
  82 + <option value="{{ $it->id }}">{{ $it->name }}</option>
  83 + @endforeach
  84 + </select>
  85 + @error('postion_id')
  86 + <span class="text-xs text-red-600 dark:text-red-400">
  87 + {{ $message }}
  88 + </span>
  89 + @enderror
  90 + </div>
  91 + </div>
  92 + </div>
  93 +
47 94 <div class="cabinet__inputs-item cabinet__inputs-item_fullwidth form-group">
48 95 <label class="form-group__label">Должность соискателя</label>
49 96 <div class="form-group__item">
... ... @@ -95,24 +142,6 @@
95 142 </div>
96 143  
97 144 <div class="cabinet__inputs-item cabinet__inputs-item_fullwidth form-group">
98   - <label class="form-group__label">Позиция на корабле</label>
99   - <div class="form-group__item">
100   - <div class="select">
101   - <select class="js-select2" name="position_ship" id="position_ship">
102   - @foreach ($Positions as $it)
103   - <option value="{{ $it->name }}">{{ $it->name }}</option>
104   - @endforeach
105   - </select>
106   - @error('postion_ship')
107   - <span class="text-xs text-red-600 dark:text-red-400">
108   - {{ $message }}
109   - </span>
110   - @enderror
111   - </div>
112   - </div>
113   - </div>
114   -
115   - <div class="cabinet__inputs-item cabinet__inputs-item_fullwidth form-group">
116 145 <label class="form-group__label">Телефон</label>
117 146 <div class="form-group__item">
118 147 <input type="text" class="input" name="telephone" id="telephone" value="{{ old('telephone') ?? $Employer[0]->telephone ?? '' }}" placeholder="Свой телефон">
resources/views/employers/ajax/list_vacancy.blade.php
... ... @@ -63,7 +63,8 @@
63 63 @endforeach
64 64 </tbody>
65 65 </table>
66   - </div>
  66 + </div><br>
  67 + {{ $vacancy_list->appends($_GET)->links('paginate') }}
67 68 </div>
68 69 @else
69 70  
resources/views/employers/edit_vacancy.blade.php
1 1 @extends('layout.frontend', ['title' => 'Редактирование вакансии РекаМоре'])
2 2  
3 3 @section('scripts')
  4 + <script>
  5 + console.log('Приближаемся к системе, нас рой тут...');
  6 + $(document).on('change', '#position_id', function() {
  7 + var this_ = $(this);
  8 + var val_ = this_.val();
  9 + var ajax_ = $('#job_title_id');
4 10  
  11 + console.log('Создания списка людей, которые поднимутся на корабль...');
  12 +
  13 + $.ajax({
  14 + type: "GET",
  15 + url: "{{ route('employer.selected_people') }}",
  16 + data: "id="+val_,
  17 + success: function (data) {
  18 + console.log('Ответка пришла');
  19 + console.log('Список избранных людей создан');
  20 + ajax_.html(data);
  21 + },
  22 + headers: {
  23 + 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
  24 + },
  25 + error: function (data) {
  26 + console.log('Обрыв связи');
  27 + console.log('Error: ' + data);
  28 + }
  29 + });
  30 + });
  31 + </script>
5 32 @endsection
6 33 @section('content')
7 34 <section class="cabinet">
... ... @@ -47,6 +74,24 @@
47 74 </div>
48 75  
49 76 <div class="cabinet__inputs-item cabinet__inputs-item_fullwidth form-group">
  77 + <label class="form-group__label">Позиция на корабле</label>
  78 + <div class="form-group__item">
  79 + <div class="select">
  80 + <select class="js-select2" name="position_id" id="position_id">
  81 + @foreach ($Positions as $it)
  82 + <option value="{{ $it->id }}">{{ $it->name }}</option>
  83 + @endforeach
  84 + </select>
  85 + @error('postion_id')
  86 + <span class="text-xs text-red-600 dark:text-red-400">
  87 + {{ $message }}
  88 + </span>
  89 + @enderror
  90 + </div>
  91 + </div>
  92 + </div>
  93 +
  94 + <div class="cabinet__inputs-item cabinet__inputs-item_fullwidth form-group">
50 95 <label class="form-group__label">Должность соискателя</label>
51 96 <div class="form-group__item">
52 97 <div class="select">
resources/views/employers/list_vacancy.blade.php
... ... @@ -149,8 +149,11 @@
149 149 @endforeach
150 150 </tbody>
151 151 </table>
152   - </div>
  152 + </div><br>
  153 + {{ $vacancy_list->appends($_GET)->links('paginate') }}
153 154 </div>
  155 +
  156 +
154 157 @else
155 158  
156 159 <div class="notify">
resources/views/favorite_people.blade.php
... ... @@ -0,0 +1,3 @@
  1 +@foreach ($favorite_people as $it)
  2 + <option value="{{ $it->id }}">{{ $it->name }}</option>
  3 +@endforeach
resources/views/index.blade.php
... ... @@ -103,10 +103,8 @@
103 103 <span>Скрыть</span>
104 104 </button>-->
105 105 <div class="vacancies__list" id="block_ajax" name="block_ajax">
106   -
107 106 @foreach ($BigFlot as $key => $flot)
108 107 <div class="vacancies__list-col">
109   -
110 108 @include('block_real', ['flot' => $flot, 'position' => $Position[$key]])
111 109 </div>
112 110 @endforeach
resources/views/js/modals.blade.php
... ... @@ -41,7 +41,7 @@
41 41 var field_login = $('#email_worker');
42 42 var field_pwd = $('#password_worker');
43 43 var field_confirm_pwd = $('#password_confirmation_worker');
44   - var field_politik_worker = $('#politik_worker');
  44 + var field_politik_worker = $('#politik');
45 45 var field_telephone_worker = $('#telephone_worker');
46 46 var field_job_titles_worker = $('#job_titles_worker');
47 47 var field_surname_worker = $('#surname_worker');
... ... @@ -59,6 +59,14 @@
59 59 var surname2 = field_surname2_worker.val();
60 60  
61 61  
  62 + if (field_politik_worker.attr('checked')) {
  63 + console.log('politik=1');
  64 + politik = 1;
  65 + } else {
  66 + politik = 0;
  67 + console.log('politik=0');
  68 + }
  69 +
62 70 console.log('login: '+login+' password: '+pwd);
63 71  
64 72 $.ajax({
... ... @@ -118,7 +126,13 @@
118 126  
119 127 console.log('login: '+login+' password: '+pwd);
120 128  
121   -
  129 + if (field_politik_employer.attr('checked')) {
  130 + console.log('politik=1');
  131 + politik = 1;
  132 + } else {
  133 + politik = 0;
  134 + console.log('politik=0');
  135 + }
122 136 $.ajax({
123 137 type: "GET",
124 138 url: "{{ route('register_employer') }}",
... ... @@ -138,7 +152,6 @@
138 152 $('#messages_error_reg').html(d['ERROR']);
139 153 }
140 154 console.log(d['REDIRECT']);
141   -
142 155 },
143 156 headers: {
144 157 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
resources/views/layout/frontend.blade.php
... ... @@ -277,7 +277,7 @@
277 277 <script src="{{ asset('js/jquery.fancybox.js') }}"></script>
278 278 <script src="{{ asset('js/jquery.select2.js') }}"></script>
279 279 <script src="{{ asset('js/swiper.js') }}"></script>
280   -<script src="{{ asset('js/script145.js') }}"></script>
  280 +<script src="{{ asset('js/script-vc.js') }}"></script>
281 281 <script src="{{ asset('js/star-rating.min.js') }}"></script>
282 282 <script>
283 283 var getUrlParameter = function getUrlParameter(sParam) {
resources/views/list_vacancies.blade.php
... ... @@ -161,7 +161,7 @@
161 161 <h2 class="main__vacancies-title" id="title_head" name="title_head">Все категории</h2>
162 162 @endif
163 163 <div class="filters main__vacancies-filters">
164   - <div class="filters__label" id="col-vo" name="col-vo">Показано @if ($Query_count < 3) {{$Query_count}} @else 3 @endif из @isset($Query_count) {{ $Query_count }} @else 0 @endisset результатов поиска</div>
  164 + <div class="filters__label" id="col-vo" name="col-vo">Показано {{ $Query->firstItem() }} – {{ $Query->lastItem() }} из @isset($Query_count) {{ $Query_count }} @else 0 @endisset результатов поиска</div>
165 165 <div class="filters__body">
166 166 <div class="select filters__select">
167 167 <select class="js-select2" id="sort_ajax" name="sort_ajax">
resources/views/news-list.blade.php
... ... @@ -97,12 +97,10 @@
97 97 <form class="thing__body" action="{{ route('news') }}" method="GET">
98 98 <ul class="breadcrumbs thing__breadcrumbs">
99 99 <li><a href="{{ route('index') }}">Главная</a></li>
100   - <li><a href="{{ route('vacancies') }}">Вакансии</a></li>
101   - <li><b>{{ isset($Name_categori[0]) ? $Name_categori[0]->name : 'Все категории' }}</b></li>
  100 + <li><b>Новости</b></li>
102 101 </ul>
103   - <h1 class="thing__title">Вакансии</h1>
104   - <p class="thing__text">С другой стороны, социально-экономическое развитие не оставляет шанса для
105   - существующих финансовых и административных условий.</p>
  102 + <h1 class="thing__title">Новости</h1>
  103 + <p class="thing__text">Информационные блоки и новости о компании и событиях в мире</p>
106 104 <div class="search thing__search">
107 105 <input type="search" id="search" name="search" class="input" placeholder="Введите наименование статьи" value="@if (!empty($_GET['search'])) {{ $_GET['search'] }} @endif">
108 106 <button type="submit" class="button">Найти</button>
... ... @@ -115,11 +113,11 @@
115 113 </form>
116 114 </div>
117 115 </section>
118   - <main class="main">
  116 + <main class="main rus">
119 117 <div class="container">
120 118 <div class="main__employers">
121 119 <div class="filters">
122   - <div class="filters__label" id="col-vo" name="col-vo">Показано @if ($Query_count < 3) {{$Query_count}} @else 6 @endif из @isset($Query_count) {{ $Query_count }} @else 0 @endisset результатов поиска</div>
  120 + <div class="filters__label" id="col-vo" name="col-vo">Показано {{ $Query->firstItem() }} – {{ $Query->lastItem() }} из @isset($Query_count) {{ $Query_count }} @else 0 @endisset результатов поиска</div>
123 121 <div class="filters__body">
124 122 <div class="select filters__select">
125 123 <select class="js-select2" id="sort_ajax" name="sort_ajax">
... ... @@ -155,7 +153,7 @@
155 153 {{ $Query->appends($_GET)->links('paginate') }}
156 154 @else
157 155 <div class="news__items">
158   -
  156 + Нет никакой информации
159 157 </div>
160 158 @endif
161 159 </div>
... ... @@ -164,4 +162,5 @@
164 162 </div>
165 163 </main>
166 164 </div>
  165 +
167 166 @endsection
resources/views/resume.blade.php
... ... @@ -235,7 +235,7 @@
235 235 <div class="main__resume-base">
236 236 <h2>Резюме работников</h2>
237 237 <div class="filters">
238   - <div class="filters__label">Показано @if ($res_count > 0) 1 @else 0 @endif – @if($res_count < 5) {{ $res_count }} @else 5 @endif из {{ $res_count }} результатов поиска</div>
  238 + <div class="filters__label">Показано {{ $resumes->firstItem() }} – {{ $resumes->lastItem() }} из {{ $res_count }} результатов поиска</div>
239 239 <div class="filters__body">
240 240 <div class="select filters__select">
241 241 <select class="js-select2" id="sort_ajax" name="sort_ajax">
... ... @@ -537,6 +537,8 @@ Route::group([
537 537 Route::get('cabinet/vacancie', [EmployerController::class, 'cabinet_vacancie'])->name('cabinet_vacancie');
538 538 Route::post('cabinet/vacancie', [EmployerController::class, 'cabinet_vacancy_save'])->name('vacancy_save');
539 539 Route::post('vacancie', [EmployerController::class, 'cabinet_vacancy_save1'])->name('vac_save');
  540 + Route::get('selected_people', [EmployerController::class, 'selected_people'])->name('selected_people');
  541 +
540 542  
541 543 // 3 страница - Мои вакансии
542 544 Route::get('cabinet/vacancy_list', [EmployerController::class, 'vacancy_list'])->name('vacancy_list');