Skip to content

aevdokimov/tredium

Repository files navigation

Тестовое задание - статейник

Разрабатывался на PHP 8.1, MySQL 8.0. Laravel 9.11, Vue 3.2, Vue Router 4, Pinia 2, Bootstrap 5.1

Описание

Необходимо написать небольшой сайт - статейник. Макет не принципиален. Можно взять bootstrap или любой другой фреймворк. Так же можно использовать любые JS фреймворки. Главное, чтобы на страницах присутствовали все компоненты.

Среднее время выполнения: 4 часа.

Можно не реализовывать хранение изображений. Для заглушек можно юзать сервис https://placeholder.com/ или подобный (чтобы не заморачиваться с нарезкой). Либо сделать 2 изображения (миниатюра и обычное) и переиспользовать их.

Всю логику реализуем встроенным функционалом Laravel.

Результат необходимо загрузить в публичный репозиторий GitHub.

Разделы сайта

Страницы сайта

  • Главная страница Url: /
  • Каталог статей Url: /articles
  • Страница статьи Url: /articles/{slug}

Описание страниц

Главная страница

Компоненты:

Каталог статей

Компоненты:

Статья

Компоненты:

Компоненты

Навигационное меню

Необходимо сделать так, чтобы в блоке меню был помечен пункт раздела, в котором находится в текущий момент пользователь. Правила формирования подсветки выбранного раздела описаны в блоке Описание страниц

Пейджинация

Стандартная пейджинация Laravel (https://laravel.com/docs/7.x/pagination#introduction)

Миниатюра статьи

Блок состоит из следующих элементов:

  • миниатюра обложки статьи
  • заголовок статьи
  • краткое описание статьи - первые 100 симоволов от текста статьи

Тег статьи

Ссылка. Состоит из url и label.

Счетчик лайков статьи

Элемент является кнопкой, на которой в качестве label написано число. При клике на кнопку отправляется AJAX запрос, инкрементирующий счетчик. В ответе на запрос возвращается новое значение, которое необходимо отобразить в label.

Счетчик просмотров статьи

Текстовый элемент, отображающие текущий счетчик просмотров. Через 5 секунд после открытия статьи отправляется запрос, инкрементирующий счетчик. В ответе на запрос возвращается новое значение, которое необходимо отобразить в элементе.

Форма комментария

Форма, состоящая из 2х полей:

  • Тема сообщения
  • Текст сообщения

При нажатии на кнопку "Отправить" отправляется AJAX запрос. При успешной обработке форма заменяется на плашку "Ваше сообщение успешно отправлено".

API методы

При реализации API методов учтите, что онлайн блога заранее не известен. Ваша реализация должна позволять избежать блокировок БД в случае огромного количества входящих запросов (допустим 1 млн входящих запрос на инкрементацию счетчика просмотров). Это требования необходимо вам для организации правильного хранения лайков и просмотров. Ответ: application/json

Инкрементирование счетчика лайка

Ответ: новое значение счетчика

Инкрементирование счетчика просмотров

Ответ: новое значение счетчика

Создание комментария к статье

Вводные данные: Подразумеваем, что данный механизм очень медленный по какой то причине (100500 операций). Для того, чтобы не городить реально долго выполняющуюся логику, используйте для теста команду sleep(600), которая остановит исполнение кода на 10 минут.

Необходимо реализовать следующую механику:

  • API метод получает запрос
  • метод возращает ответ клиенту
  • метод исполняет логику в фоновом режиме

Передаваемые поля:

  • subject. Varchar(255).
  • body. LongText

Ответы:

  • ValidationException. Если не заполнено одно из полей.
  • Success. Любой, главное чтобы с 200 кодом.

Развертывание

Развертывание должно производиться через стандартные механизмы:

  • git clone ...
  • php artisan migrate
  • php artisan db:seed
  • php artisan serve

То есть никакие импорты SQL файлов \ загрузка zip архивов - не приемлемы.

Тестирование

  • ArticleSeed. Должен сгенерировать 20 статей с рандомной датой и рандомным текстом (длина текста от 200 символов). Используем Faker.
  • ArticleTagSeed. Должен сгенерировать некоторое количество тегов, чтобы хотя бы 1 был в каждой статье.

Чек-лист сдачи проекта

  • удаляем директорию vendor и node_modules (если требуется)
  • удаляем все таблицы с тестовой БД (или пересоздаем БД)
  • удаляем файл .env из корня проекта
  • создаем файл .env на базе .env.example
  • запускаем composer install
  • запускаем npm install (если требуется)
  • создаем ключ (php artisan key:generate)
  • запускаем миграции (php artisan migrate)
  • запускаем сиды (php artisan db:seed)
  • запускаем локальный сервер (php artisan serve)
  • проверяем весь написанный функционал. Все страницы должны содержать все элементы, описанные в блоке Описание страниц