Главная страница
Навигация по странице:

  • 1.3. Підготовка оціночного висновку

  • 2 ПЛАНУВАННЯ ЗМІСТУ СТРУКТУРИ РОБІТ ІТ-ПРОЕКТУ 2.1. Планування змісту структури робіт ІТ-проекту (WBS)

  • 2.2. Планування структури організації для впровадження готового проекту (OBS)

  • 3 ПОБУДОВА КАЛЕНДАРНОГО ГРАФІКУ ВИКОНАННЯ ІТ – ПРОЕКТУ 3.1. Побудова календарного графіку виконання ІТ-проекту

  • 3.2. Розрахунок бюджету IT-проекту

  • 4 ПЛАНУВАННЯ РИЗИКІВ ПРОЕКТУ

  • Ціль проекту Дуже слабкий вплив – 0, 05 Слабки й вплив - 0,01 Середній вплив

  • ДОДАТОК Б. КОД РЕАЛІЗАЗІЇ ІНФОРМАЦІЙНОЇ СИСТЕМИ 2014_10_12_000000_create_users_table.php

  • 2020_11_09_160729_create_tests_table.php

  • 2020_11_09_161530_create_test_questions_table.php

  • 2020_11_09_161221_create_test_results_table.php

  • /cabinet/

  • Інформаційні технології проектування


    Скачать 4.71 Mb.
    НазваниеІнформаційні технології проектування
    Дата25.05.2022
    Размер4.71 Mb.
    Формат файлаpdf
    Имя файлаmaster_thesis_Ivanchenko.pdf
    ТипПрограма
    #549885
    страница3 из 4
    1   2   3   4
    Тема
    Опис
    Specific
    (конкретна)
    Розробка інформаційної системи, за допомогою якої HR спеціалісти матимуть можливість створювати тестування та аналізувати отриманні дані. Користувачі матимуть можливість пройти тестування, отримати результати та фідбек від роботодавця.
    Measurable
    (вимірювана)
    Прогрес та якість буде вимірюватися в кількості користувачах та сесії проведення користувача на сайті.
    Achievable
    (досяжна)
    Данна інформаційна система буде розроблятися з використанням HTML, CSS,
    JavaScript, Vue.js для розробки візуальної частини та
    PHP, MySQL, Laravel для функціональної.
    Relevant
    (реалістична)
    Для виконання проекту є всі необхідні технічні та програмні засоби.
    Time-framed
    (обмежена у часі)
    Для проекту визначений дедлайн, тому робота буде виконана вчасно, що підтверджується календарним планом.

    67
    1.3. Підготовка оціночного висновку
    Інформаційна система оцінювання знань в області тестування програмного забезпечення буде ініціалізована по причині актуальності та релевантності обраної тематики. Для кандидатів пошуку роботи в області тестування програмного забезпечення – це перевірка знань з можливістю працевлаштування, а для роботодавців (HR-менеджерів) – тестування кандидатів на вакантні місця та швидкий аналіз отриманих результатів.
    2 ПЛАНУВАННЯ ЗМІСТУ СТРУКТУРИ РОБІТ ІТ-ПРОЕКТУ
    2.1. Планування змісту структури робіт ІТ-проекту (WBS)
    Планування змісту структури робіт ІТ-проекту (WBS - Work Breakdown
    Structure) – являє собою графічне представлення проекту як пакету робіт в
    ієрархічному вигляді. WBS структура реалізується шляхом декомпозиції проекту на декілька рівнів[16].
    Чітко визначена ієрархічна структура робіт (ІСР) може вплинути на успішність проекту. Невідповідність між ІСР, організаційною структурою і стилем управління проектного менеджера негативно впливає на ймовірність успішного завершення проекту. Існують різні підходи до побудови ІСР, незважаючи на те, що всі вони описують один і той самий проект.
    Однак різні підходи до побудови ІСР вимагають різних організаційних структур і стилів управління під час реалізації проекту. Таким чином, розробник
    ІСР вже значно впливає на те, як проект повинен управлятися на самому ранньому етапі, іноді навіть не усвідомлюючи цього[17-18].
    В даному випадку WBS структура має чотири основні фази:

    68
    − Ініціалізація
    − Планування
    − Реалізація
    − Завершення
    Загальна WBS структура представлена на рисунку А.2.1.

    69
    Рисунок А.2.1 – WBS структура проекту

    70
    2.2. Планування структури організації для впровадження
    готового проекту (OBS)
    Структура розподілу організації або OBS (Organization Breakdown
    Structure) – це ієрархічна модель, що описує встановлені організаційні рамки для планування проектів, управління ресурсами, відстеження часу та витрат, розподілу витрат, звітування про доходи / прибуток та управління роботою [19].
    Структура розподілу робіт (WBS) охоплює всі елементи проектів організовано. Розбиття великих, складних проектів на менші шматки проектів забезпечує кращу основу для організації та управління поточними та майбутніми проектами. WBS полегшує розподіл ресурсів, призначення завдань, вимірювання та контроль вартості проекту та виставлення рахунків. WBS використовується на початку проекту для визначення обсягу, визначення місць витрат і є відправною точкою для розробки планів проекту / діаграм Ганта[20].
    Структура розподілу організації об’єднує подібні проектні заходи або
    «робочі пакети» та пов’язує їх зі структурою організації. OBS (також відома як
    Організаційна структурна структура) використовується для визначення відповідальності за управління проектами, звітування про витрати, виставлення рахунків, складання бюджету та контроль над проектами. OBS забезпечує організаційну, а не перспективну перспективу проекту. Ієрархічна структура OBS дозволяє агрегувати (зводити) інформацію про проект на вищі рівні. Коли визначені обов'язки проекту та призначена робота, OBS та WBS з'єднуються, забезпечуючи можливість потужної аналітики для вимірювання продуктивності проекту та робочої сили на дуже високому рівні (приклад продуктивності бізнес- підрозділу) або до деталей (приклад роботи користувача над завдання).
    Загальна OBS структура представлена на рисунку А.2.2.

    71
    Рисунок А.2.2 – OBS структура проекту

    72
    3 ПОБУДОВА КАЛЕНДАРНОГО ГРАФІКУ ВИКОНАННЯ
    ІТ – ПРОЕКТУ
    3.1. Побудова календарного графіку виконання ІТ-проекту
    Базуючись Базуючись на сформованій інформації, а саме WBS та OBS, побудуємо календарний графік виконання ІТ-проекту.
    Діаграма Ганта — діаграма, яка використовується для ілюстрації плану, графіка робіт за будь-яким проектом [20]. Діаграма Ганта є одним з засобів планування та управління проектами. Діаграма Ганта також являє собою відрізки
    (графічні плашки), розміщені на горизонтальній шкалі часу. Кожен відрізок відповідає окремому завданню або підзадачі.
    Завдання і підзадачі, складові плану, розміщуються по вертикалі. Початок, кінець і довжина відрізка на шкалі часу відповідають початку, кінцю і тривалості завдання. На деяких діаграмах Ганта також показується залежність між завданнями. Діаграма може використовуватися для представлення поточного стану виконання робіт [20].
    Розглянемо створену діаграму Ганта до заданої інформаційної системи
    (рис.А.3.1).

    73
    Рисунок А.3.1 – Діаграма Ганта

    74
    Рисунок А.3.2 – Мережевий графік проекту
    3.2. Розрахунок бюджету IT-проекту
    Бюджет продукту IT-проекту – це кошторис продукту проекту, розподілений в часі на основі календарного плану реалізації робіт або за окремими WBS елементами [21]. В основу розроблення бюджету продукту IT- проекту покладають перелік робіт з проекту та необхідні витрати на їх виконання.
    Бюджетну вартість кожної з робіт розраховують на підставі кількості використаного ресурсу, його вартості та тривалості використання. використання.
    Розрахунок бюджету проекту:

    75 загальні витрати за проект представлені на рисунку А.3.3.
    Рисунок А.3.3 – Затрати за проект

    76
    4 ПЛАНУВАННЯ РИЗИКІВ ПРОЕКТУ
    Ретельне і детальне планування управління ризиками спрямовано на підвищення вірогідності досягнення цілей проекту. Даний процес повинен бути завершений на ранній стадії планування [22].
    Якісний аналіз ризиків включає розстановку пріоритетів для
    ідентифікованих ризиків, результати якої використовуються потім у ході кількісного аналізу ризиків і планування реагування на ризики.
    У ході якісного оцінювання використовується нечислова шкала вірогідності, наприклад:
    1 - дуже слабкий вплив;
    2 - слабкий вплив;
    3 - середній вплив;
    4 - сильний вплив;
    5 - дуже сильний вплив.
    Оцінку ризиків проводять за допомогою оцінки вірогідності і наслідків.
    Один з можливих прикладів подібної матриці, в якій показані тільки оцінки наслідків, представлений у таблиці (табл. А.4.1).

    77
    Таблиця А.4.1 – Матриця оцінки наслідків
    Ціль
    проекту
    Дуже
    слабкий
    вплив – 0,
    05
    Слабки
    й вплив
    - 0,01
    Середній
    вплив -
    0,2
    Сильний
    вплив -
    0,4
    Дуже
    сильний
    вплив -
    0,8
    Вартість
    Несуттєве збільшення бюджету
    Збільше ння бюджет у до
    10%
    Збільшен ня бюджету на 10-
    20%
    Збільшен ня бюджету на 20-
    30%
    Збільшен ня бюджету більше, ніж на
    40%
    Терміни
    Несуттєве збільшення календарно го плану
    Поруше ння календа рного плану не більше ніж на
    5%
    Порушен ня календар ного плану на
    5-10%
    Порушен ня календар ного плану на
    10-20%
    Порушен ня календар ного плану більш ніж на 20%
    Якість
    Несуттєве зниження якості
    Суттєве знижен ня якості
    Зниження якості потребує узгоджен ня з замовник ом
    Зниження якості неприйня тне для замовник а
    Результат проекту повністю даремний
    Існують три стратегії реагування на появу негативних ризиків, до яких відносяться:

    Ухилення від ризику передбачає змінення плану управління проектом таким чином, щоб виключити ризик, убезпечити цілі IT-проекту від наслідків ризику.

    78

    Передача ризику має на увазі перекладення негативних наслідків на третю сторону. Передача ризику просто переносить відповідальність за його управління іншій стороні, але ризик при цьому не зникає. Передача ризику є найбільш ефективною у відношенні фінансових ризиків. Передача ризику практично завжди передбачає виплату премії за ризик стороні, яка прийняла ризик на себе. В якості інструментів передачі ризиків використовуються страховки, гарантійні зобов’язання і т.п. У ряді випадків витрати на ризики можуть перекладатися на покупця або продавця, що оговорюється у контракті.

    Зниження ризику передбачає зниження вірогідності наслідків негативної ризикованої події до прийнятних границь.
    Прийняття попереджувальних заходів зі зниження вірогідності настання ризику або його наслідків часто буває більш ефективним, ніж зусилля з усунення негативних наслідків, що здійснюються після настання події ризику.

    79
    ДОДАТОК Б. КОД РЕАЛІЗАЗІЇ ІНФОРМАЦІЙНОЇ СИСТЕМИ
    2014_10_12_000000_create_users_table.php
    Міграція створення таблиці користувачів.
    { public function up()
    {
    Schema::create('users', function (Blueprint $table) {
    $table->id();
    $table->string('email')->unique();
    $table->string('password');
    $table->foreignId('account_role_id');
    $table->foreignId('country_id');
    $table->string('name');
    $table->string('surname');
    $table->boolean('sex');
    $table->string('date');
    $table->text('description')->nullable();
    $table->string('photo')->default('/img/no-image.png');
    $table->string('company')->nullable();
    $table->string('phone')->nullable();
    $table->rememberToken();
    $table->timestamps();
    });
    Schema::table('users', function (Blueprint $table) {
    $table->index('country_id');
    $table->foreign('country_id')->references('id')->on('country');
    });

    80
    Schema::table('users', function (Blueprint $table) {
    $table->index('account_role_id');
    $table->foreign('account_role_id')->references('id')->on('account_role');
    });
    } public function down()
    {
    Schema::dropIfExists('users');
    }
    }
    2020_11_09_160729_create_tests_table.php
    Міграція створення таблиці тестів.
    { public function up()
    {
    Schema::create('tests', function (Blueprint $table) {
    $table->id();
    $table->string('file')->nullable();
    $table->string('title');
    $table->text('description');
    $table->time('time', 0);
    $table->foreignId('account_id');
    $table->string('type')->default('tests');
    $table->timestamps();
    });
    Schema::table('tests', function (Blueprint $table) {
    $table->index('account_id');
    $table->foreign('account_id')->references('id')->on('users')->onDelete('cascade');
    });

    81
    } public function down()
    {
    Schema::dropIfExists('tests');
    }
    }
    2020_11_09_161530_create_test_questions_table.php
    Міграція створення таблиці завдань до тестів.
    { public function up()
    {
    Schema::create('test_questions', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    $table->text('description');
    $table->string('type');
    $table->text('answer');
    $table->foreignId('test_id');
    $table->boolean('ready')->default(0);
    $table->timestamps();
    });
    Schema::table('test_questions', function (Blueprint $table) {
    $table->index('test_id');
    $table->foreign('test_id')->references('id')->on('tests')->onDelete('cascade');
    });
    } public function down()
    {
    Schema::dropIfExists('test_questions');
    }

    82
    }
    2020_11_09_161221_create_test_results_table.php
    Міграція створення таблиці результатів пройдених тестів.
    { public function up()
    {
    Schema::create('test_results', function (Blueprint $table) {
    $table->id();
    $table->foreignId('account_id');
    $table->foreignId('test_id');
    $table->integer('procent');
    $table->integer('count_true');
    $table->integer('count');
    $table->time('time', 0);
    $table->timestamps();
    });
    Schema::table('test_results', function (Blueprint $table) {
    $table->index('account_id');
    $table->foreign('account_id')->references('id')->on('users')->onDelete('cascade');
    });
    Schema::table('test_results', function (Blueprint $table) {
    $table->index('test_id');
    $table->foreign('test_id')->references('id')->on('tests')->onDelete('cascade');
    });
    } public function down()
    {
    Schema::dropIfExists('test_results');

    83
    }
    }
    User.php
    Модель таблиці користувачів.
    { use Notifiable, HasApiTokens; protected $table = 'users'; protected $fillable = [
    'email',
    'password',
    'account_role_id',
    'country_id',
    'name',
    'surname',
    'sex',
    'date',
    'description',
    'photo',
    'company',
    'phone'
    ]; protected $hidden = [
    'password'
    ]; function country() {

    84 return $this->belongsTo('App\Models\Country', 'country_id');
    } function role() { return $this->belongsTo('App\Models\AccountRole', 'account_role_id');
    } function news() { return $this->hasMany('App\Models\News', 'account_id');
    } function socials() { return $this->HasMany('App\Models\AccountSocial', 'account_id');
    } function tests() { return $this->HasMany('App\Models\Tests', 'account_id');
    } function testResults() { return $this->HasMany('App\Models\TestResult', 'account_id');
    } function followers() { return $this->HasMany('App\Models\Followers', 'account_follower_id');
    } function myFollowers() { return $this->HasMany('App\Models\Followers', 'account_id');
    } function notifications() { return $this->HasMany('App\Models\Notifications', 'account_id');
    }
    }
    Tests.php
    Модель таблиці тестів.

    85 namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Tests extends Model
    { use HasFactory; protected $table = 'tests'; protected $fillable = [
    'file',
    'title',
    'description',
    'time',
    'account_id',
    'type'
    ]; function answer() { return $this->hasMany('App\Models\TestQuestions', 'test_id');
    } function user() { return $this->belongsTo('App\Models\User', 'account_id');
    } function results() { return $this->hasMany('App\Models\TestResult', 'test_id');
    } function comments() { return $this->hasMany('App\Models\Comments', 'post_id');
    }
    }
    TestQuestions.php
    Модель таблиці завдань до тестів.

    86
    { use HasFactory; protected $table = 'test_questions'; protected $fillable = [
    'title',
    'description',
    'type',
    'answer',
    'test_id',
    'ready'
    ];
    }
    TestResult.php
    Модель таблиці результатів пройдених тестів.
    { use HasFactory; protected $table = 'test_results'; protected $fillable = [

    87
    'account_id',
    'test_id',
    'procent',
    'time',
    'count',
    'count_true'
    ]; function test() { return $this->belongsTo('App\Models\Tests', 'test_id');
    } function user() { return $this->belongsTo('App\Models\User', 'account_id');
    }
    }
    AuthController.php
    Контроллер авторизації користувачів.
    {
    // register function register(Request $request) {
    $request->validate([
    'email' => 'required|string|email|unique:users',
    'password' => 'required|string'
    ]);
    $user = new User();
    $data = $request->all();

    88
    $data["password"] = Hash::make($request->password);
    $user->create($data);
    $credentials = request(['email', 'password']); if(!Auth::attempt($credentials)) { return response()->json(['message' => 'Unauthorized'], 401);
    }
    $authUser = Auth::user();
    $tokenResult = $authUser->createToken('Personal Access Token');
    $token = $tokenResult->token;
    $token->save(); return response()->json([
    'access_token' => 'Bearer '.$tokenResult->accessToken,
    'user' => $authUser
    ]);
    }
    // login function login(Request $request) { if(Auth::attempt(['email' => $request->email, 'password' => $request->password, 'account_role_id' => 1])
    || Auth::attempt(['email' => $request->email, 'password' => $request->password, 'account_role_id' => 2])) {
    $user = Auth::user();
    $tokenResult = $user->createToken('Personal Access Token');
    $token = $tokenResult->token; if($request->remember_me) {
    $token->expires_at = Carbon::now()->addWeeks(1);
    }
    $token->save(); return response()->json([
    'access_token' => 'Bearer '.$tokenResult->accessToken,
    'user' => $user
    ]);
    } else { return response()->json(['message' => 'Unauthorized'], 401);
    }
    }
    // loginAdmin function loginAdmin(Request $request) {

    89 if(Auth::attempt(['email' => $request->email, 'password' => $request->password, 'account_role_id' => 3]))
    {
    $user = $request->user();
    $tokenResult = $user->createToken('Personal Access Token');
    $token = $tokenResult->token;
    $token->save(); return response()->json([
    'access_token' => 'Bearer '.$tokenResult->accessToken
    ]);
    } else { return response()->json(['message' => 'Unauthorized'], 401);
    }
    }
    }
    UserController.php
    Контролер для роботи з користувачами.
    { protected $fileStorage = "userfiles/"; function delUser($id) {
    User::find($id)->delete();

    90 return response('ok', 200);
    }
    // users function users() {
    $data = User::with('country', 'role')->where('account_role_id', '!=', 3)->get(); return response()->json($data);
    }
    // search function search(Request $request) {
    $news = News::select('title', 'description', 'type', 'id')
    ->where('title', 'like', "%".$request->search."%")
    ->orWhere('description', 'like', "%".$request->search."%");
    $test = Tests::select('title', 'description', 'type', 'id')
    ->where('title', 'like', "%".$request->search."%")
    ->orWhere('description', 'like', "%".$request->search."%");
    $result = $news->union($test)->get(); return response()->json($result);
    }
    // updateUser function updateUser(Request $request) {
    $id = Auth::id();
    $data = $request->all(); if(isset($data['newPassword'])) {
    $user = Auth::user(); if (Hash::check($data['oldPassword'], $user->password)) {
    $data["password"] = Hash::make($request->newPassword);
    } else { return response('error', 401);
    }
    }
    User::find($id)->update($data); return response()->json(User::find($id));
    }
    // country function country() {

    91
    $data = Country::get(); return response()->json($data);
    }
    // cabinet function cabinet() {
    $data = User::with(
    'country',
    'role',
    'tests',
    'testResults',
    'testResults.test',
    'testResults.test.user',
    'myFollowers.user.followers',
    'followers.userFollower.followers',
    'socials.social',
    'notifications',
    'news.user',
    'news.comments'
    )->find(Auth::id());
    $mean = 0; foreach ($data['testResults'] as $key => $item) {
    $mean += $item->procent;
    $item->date = Carbon::parse($item->created_at)->format('d.m.Y H:i');
    } foreach ($data['news'] as $key => $item) {
    $item->date = Carbon::parse($item->created_at)->format('d.m.Y H:i');
    } if($mean > 0) {
    $data['mean'] = $mean / count($data['testResults']);
    } return response()->json($data);
    }
    // userId function userId($id) {
    $authId = Auth::id();
    $data = User::with(
    'country',

    92
    'role',
    'news.user',
    'socials.social',
    'testResults',
    'myFollowers.user.followers',
    'followers.userFollower.followers',
    'socials',
    'news.user',
    'news.comments',
    'tests'
    )->find($id);
    $mean = 0; foreach ($data['news'] as $key => $item) {
    $item->date = Carbon::parse($item->created_at)->format('d.m.Y H:i');
    } foreach ($data['testResults'] as $key => $item) {
    $mean += $item->procent;
    $item->date = Carbon::parse($item->created_at)->format('d.m.Y H:i');
    } if($mean > 0) {
    $data['mean'] = $mean / count($data['testResults']);
    } return response()->json($data);
    }
    // usersResults function usersResults() {
    $data = Tests::with('results.user')->where('account_id', Auth::id())->get(); foreach ($data as $key => $item) { foreach ($item['results'] as $k => $v) {
    $v->date = Carbon::parse($v->created_at)->format('d.m.Y H:i');
    }
    } return response()->json($data);
    }
    // postFollower function postFollower($id) {
    $model = new Followers(); if(!Followers::where('account_id', Auth::id())->where('account_follower_id', $id)->exists()) {

    93
    $model->create([
    "account_id" => Auth::id(),
    "account_follower_id" => $id
    ]);
    } return response('ok', 200);
    }
    // postFollower function delFollower($id) {
    Followers::where('account_id', Auth::id())->where('account_follower_id', $id)->delete(); return response('ok', 200);
    }
    // comments function postComment(Request $request, $id) {
    $model = new Comments();
    $response = $model->create([
    "account_id" => Auth::id(),
    "post_id" => $id,
    "text" => $request->comment
    ]); if($request->type == "news") {
    $post = News::find($id);
    $userId = $post['account_id'];
    $title = $post['title'];
    $notification = new Notifications();
    $textNotification = "Користувач " . Auth::user()['name'] . " " .
    Auth::user()['surname'] . " залишив коментар до Вашої публікації " . $title .
    "";
    $notification->create([
    "title" => "У Вас новий коментар",
    "account_id" => $userId,
    "text" => $textNotification
    ]);
    } if($request->type == "test") {
    $post = Tests::find($id);
    $userId = $post['account_id'];
    $title = $post['title'];

    94
    $notification = new Notifications();
    $textNotification = "Користувач " . Auth::user()['name'] . " " .
    Auth::user()['surname'] . " залишив коментар до Вашого тесту " . $title .
    "";
    $notification->create([
    "title" => "У Вас новий коментар",
    "account_id" => $userId,
    "text" => $textNotification
    ]);
    } return response()->json($response);
    } function delComment($id) {
    Comments::find($id)->delete(); return response('ok', 200);
    } function updateNotification($id) {
    Notifications::where('id', $id)->update([
    'watch' => true
    ]); return response('ok', 200);
    }
    // img Account function img(Request $request) { if(isset($request['photo'])) {
    $arr = []; if($request['photo']) {
    $file = uniqid().'_photo_min.png';
    $uploadfile = $this->fileStorage . $request['id'] . '/' . $file;
    $img = str_replace('data:image/png;base64,', '', $request['photo']);
    $img = str_replace(' ', '+', $img);
    $fileData = base64_decode($img); file_put_contents(public_path().'/'.$uploadfile, $fileData);
    $arr['status'] = 'success';
    $arr['path_mini'] = 'http://'.$_SERVER['HTTP_HOST'].'/'.$uploadfile;

    95
    $arr['file_mini'] = $file;
    }
    } else { if(!file_exists("userfiles/".$request['id'])) { mkdir($this->fileStorage.$request['id']);
    }
    $uploadfile = $this->fileStorage. $request['id'] . '/' . uniqid().'_photo_original.png';
    $arr = array(); if (move_uploaded_file($_FILES['file']['tmp_name'], public_path().'/'.$uploadfile)) {
    $arr['status'] = 'success';
    $arr['path_max'] = 'http://'.$_SERVER['HTTP_HOST'].'/'.$uploadfile;
    $arr['file_max'] = $_FILES['file']['name'];
    } else {
    $arr['status'] = 'fail';
    }
    } header('Content-type: application/json'); return response()->json($arr);
    }
    }
    TestController.php
    Котроллер для роботи с тестами.
    {

    96 protected $fileStorage = "/userfiles/";
    // get function get() {
    $data = Tests::with('user', 'comments.user', 'answer')->orderBy('created_at', 'desc')->get(); foreach ($data as $key => $item) {
    $item->date = Carbon::parse($item->created_at)->format('d.m.Y H:i');
    } return response()->json($data);
    }
    // getId function getId($id) {
    $data = Tests::with('user', 'answer', 'comments.user')->find($id);
    $data['date'] = Carbon::parse($data['created_at'])->format('d.m.Y H:i'); foreach ($data['answer'] as $key => $value) {
    $value['answer'] = json_decode($value['answer']);
    } return response()->json($data);
    } function getId2($id) {
    $data = Tests::with('answer', 'comments.user')->find($id);
    $userData = Tests::with('answer')->find($id);
    $data['date'] = Carbon::parse($data['created_at'])->format('d.m.Y H:i'); foreach ($data['answer'] as $key => $value) {
    $value['answer'] = json_decode($value['answer']);
    } foreach ($userData['answer'] as $key => $value) {
    $value['answer'] = json_decode($value['answer']);
    } return response()->json([
    'data' => $data,
    'userData' => $userData['answer']
    ]);
    }
    // post function post(Request $request) {
    $model = new Tests();
    $data = $request->all();

    97
    $data['account_id'] = Auth::id();
    $data['time'] = $request->hours . ":" . $request->minutes . ":00"; if(isset($request['file']) && $request['file'] != "null") {
    $puth = $this->fileStorage.Auth::id();
    $name = $puth."/".uniqid().'.'.$request['file']->getClientOriginalExtension();
    $request['file']->move(public_path().$puth, $name);
    $data['file'] = $name;
    }
    $response = $model->create($data); return response()->json($response);
    }
    // update function updateTest(Request $request, $id) {
    $model = Tests::find($id);
    $data = $request->all();
    $data['time'] = "00:" . $request->hours . ":" . $request->minutes; if(isset($request['file']) && $request['file'] != "null") {
    $puth = $this->fileStorage.Auth::id();
    $name = $puth."/".uniqid().'.'.$request['file']->getClientOriginalExtension();
    $request['file']->move(public_path().$puth, $name);
    $data['file'] = $name;
    }
    $model->update($data); return response()->json($model);
    }
    // delTest function delTest($id) {
    $model = Tests::find($id)->delete(); return response('ok', 200);
    }
    // postQuestion function postQuestion(Request $request, $id) {
    $model = new TestQuestions();
    $data = $request->all();
    $data['test_id'] = $id;
    $data['answer'] = json_encode($request[$request->type.'_answer']);
    $response = $model->create($data);
    $response['answer'] = json_decode($response['answer']); return response()->json($response);

    98
    }
    // updateQuestion function updateQuestion(Request $request, $id) {
    $model = TestQuestions::find($request->id);
    $data = $request->all();
    $data['answer'] = json_encode($request[$request->type.'_answer']);
    $model->update($data);
    $model['answer'] = json_decode($model['answer']); return response()->json($model);
    }
    // deleteQuestion function deleteQuestion($id) {
    $model = TestQuestions::find($id)->delete(); return response('ok', 200);
    }
    // saveResult function saveResult(Request $request, $id) {
    $model = new TestResult();
    $data = $request->all();
    $data['test_id'] = $id;
    $data['account_id'] = Auth::id();
    $response = $model->create($data);
    $response['date'] = Carbon::parse($response->created_at)->format('H:i:s');
    $test = Tests::find($id);
    $notifications = new Notifications();
    $textMessage = "Користувач " . Auth::user()['name'] . " " .
    Auth::user()['surname'] . " виконав Ваш тест " . $test['title'] . " з результатом " . $request->procent . "%.";
    $notifications->create([
    'account_id' => $test['account_id'],
    'title' => "Користувач виконав Ваш тест",
    'text' => $textMessage
    ]); return response()->json($response);
    }
    }
    ChatController.php
    Контроллер роботи чату.

    99
    { function postChat(Request $request) {
    $model1 = Chats::where("account_id_1", $request->account_id)->where("account_id_2", Auth::id());
    $model2 = Chats::where("account_id_1", Auth::id())->where("account_id_2", $request->account_id); if($model1->exists() || $model2->exists()) {
    $message = new Messages();
    $id1 = $model1->first()['id'];
    $id2 = $model2->first()['id'];
    $message->create([
    "text" => $request->message,
    "account_id" => $request->account_id,
    "chat_id" => $model1->exists() ? $id1 : $id2
    ]);
    } else {
    $chat = new Chats();
    $response = $chat->create([
    "account_id_1" => Auth::id(),
    "account_id_2" => $request->account_id,
    ]);
    $message = new Messages();
    $message->create([
    "text" => $request->message,
    "account_id" => Auth::id(),
    "chat_id" => $response['id']
    ]);
    }
    }

    100 function getChats() {
    $chats = Chats::with('messages.user')->where("account_id_1", Auth::id())->orWhere("account_id_2",
    Auth::id())->get(); foreach ($chats as $key => $chat) {
    $chat->date = Carbon::parse($chat->created_at)->format('d.m.Y H:i');
    } return response()->json($chats);
    } function postMessages(Request $request, $chat_id) {
    $user = Auth::user();
    $message = new Messages();
    $response = $message->create([
    "text" => $request->message,
    "account_id" => Auth::id(),
    "chat_id" => $chat_id
    ]); broadcast(new MessageSentEvent($response, $user, $chat_id))->toOthers(); return response()->json([
    'message' => $response,
    'account' => $user
    ]);
    } function getMessages($chat_id) {
    $result = [];
    $data = Messages::with('user')->where('chat_id', $chat_id)->get(); foreach ($data as $key => $chat) { array_push($result, [
    'message' => $chat,
    'account' => $chat['user']
    ]);
    } return response()->json($result);
    }

    101
    }
    MessageSentEvent.php
    Прослуховувач подів для роботи чату в реальному часі.
    { use Dispatchable, InteractsWithSockets, SerializesModels; public $message; public $account; public $chat_id; public function __construct(Messages $message, User $user, $chat_id)
    {
    $this->message = $message;
    $this->account = $user;
    $this->chat_id = $chat_id;
    } public function broadcastOn()
    { return new Channel('chat-' . $this->chat_id);
    }
    }

    102
    /cabinet/
    Index.vue
    Компонент кабінету користувача.
    1   2   3   4


    написать администратору сайта