Skip to content

chokoladis/TWCatalogAndAdmin

Repository files navigation

Тестовое задание для Junior Full-Stack Developer (Laravel + Vue.js)

Цель: Разработать простое веб-приложение — каталог товаров с административной панелью для их управления.

Стек:

  • Бэкенд: Laravel 10+ (RESTful API)
  • Фронтенд: Vue.js 3 (Composition API) + InertiaJS — обязательно. Можно использовать
  • UI-библиотеку (например, Element Plus, PrimeVue, или просто Tailwind CSS).
  • База данных: PostgreSQL.

Часть 1: Бэкенд (Laravel API)

Разработать RESTful API со следующим функционалом:

  1. Модели и Миграции:
    • Product (Товар): id, name, description, price, category_id, created_at, updated_at.
    • Category (Категория): id, name, description, created_at, updated_at.
    • Связь: Один товар принадлежит одной категории (belongsTo). Одна категория имеет много товаров (hasMany).
  2. API Эндпоинты (с использованием Resource-контроллеров и Form Request Validation):
    • Товары (Products):

    ■ GET /api/products — список всех товаров с пагинацией (по 10-15 штук). Должен включать информацию о категории.
    ■ GET /api/products/{id} — просмотр одного товара.
    ■ POST /api/products — создание товара (требуется аутентификация).
    ■ PUT/PATCH /api/products/{id} — обновление товара (требуется аутентификация).
    ■ DELETE /api/products/{id} — удаление товара (требуется аутентификация).

    • Категории (Categories):

    ■ GET /api/categories — список всех категорий (без пагинации, для выпадающего списка).

  3. Аутентификация (Sanctum):
    • Реализовать простую аутентификацию по токену для административных действий (создание, редактирование, удаление).
    • Достаточно одного предустановленного пользователя (логин/пароль) или эндпоинта POST /api/login, который возвращает токен.
    • Эндпоинты на чтение (GET) должны быть публичными.
  4. Валидация:
    • При создании/обновлении товара проверять: name (обязательно, строка), price (обязательно, число, больше 0), category_id (существует в таблице категорий).

Часть 2: Фронтенд (Vue.js)

  1. Публичная часть (без аутентификации):

    • Главная страница (/): Список товаров с пагинацией. Для каждого товара отображать: название, категорию, цену, краткое описание.
    • Карточка товара (/product/{id}): Подробная информация о товаре.
    • Фильтрация: На странице списка товаров добавить выпадающий список для фильтрации по категории. При выборе категории — AJAX-запрос за отфильтрованными товарами.
  2. Административная часть (требуется аутентификация):

    • Логин: Простая страница ввода логина/пароля. Токен сохранять в локальном хранилище. После входа появляется меню с пунктами "Управление товарами" и "Выйти".
    • Список товаров для администратора (/admin/products): Похож на публичный список, но в каждой строке есть кнопки "Редактировать" и "Удалить", а также кнопка "Добавить товар".
    • Форма создания/редактирования товара (/admin/products/create, /admin/products/{id}/edit): ■ Поля:

    Название (input),
    Категория (select, загружается из GET /api/categories),
    Описание (textarea),
    Цена (input type number).

    ■ Валидация на фронтенде (можно простую, required, min для цены).
    ■ Отправка данных на соответствующий API эндпоинт.
    ■ После успешного сохранения — редирект на список товаров администратора.


Что мы оцениваем (Критерии проверки):

  1. Общее:
    • Работоспособность всего функционала.
    • Чистота и структура кода, именование переменных и функций.
    • Умение работать с Git (история коммитов должна быть внятной, а не один огромный коммит "finish").
  2. Бэкенд (Laravel):
    • Использование возможностей Eloquent (отношения, with для eager loading).
    • Корректное разделение логики: контроллеры, модели, Form Request.
    • Правильные HTTP-коды ответов.
    • Использование Resource/Collection для формирования ответа API.
  3. Фронтенд (Vue.js):
    • Корректное использование Composition API (ref, reactive, computed, watch).
    • Работа с состоянием для хранения токена авторизации и, возможно, состояния загрузки/ошибок.
    • Обработка ошибок API (например, если товар не найден, или нет доступа).
  • Бонусные задачи (не обязательно, но будет большим плюсом):
    • Использование docker и docker compose для запуска проекта.
    • Добавить мягкое удаление (Soft Deletes) для товаров.
    • Добавить сидеры (Seeders) для наполнения базы тестовыми товарами и категориями.
    • Написать базовые тесты (например, для API создания товара).
    • Использование композаблов (composables) для выноса логики работы с API (например, useProductApi, useAuth).
    • Реализация красивого и отзывчивого UI с использованием какой-либо библиотеки компонентов.
    • Добавление подтверждения (модального окна) перед удалением товара.
    • Дебаунс для поля поиска (если добавить поиск).

Готовое приложение выложить на GitHub / Bitbucket


Запуск

  1. .env
  2. make up

php artisan migrate || php artisan db:seeder
или
make db-restore

About

Test work by laravel v12 + vue.js v3 + InertiaJS

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors