Skip to content

StepaKH/Restaurant_IHW2

Repository files navigation

Restaurant on Pokrovsky Boulevard

Реализована система управления рестораном, созданная на Kotlin и работающая на Spring Boot. Она работает в многопоточной среде и позволяет клиентам добавлять блюда в свои заказы в реальном времени, отслеживать статусы заказов. Система обслуживает две основные роли пользователей: посетителей и администраторов, где администраторы имеют возможность управлять меню, включая добавление или удаление блюд, просмотр всей нужной информации, а также настройку количества, цены и времени приготовления.

Начало работы

  1. Запуск приложения:
    • Перейти в папку с проектом:
    ./gradlew bootRun
  2. Открытие приложения: Далее перейдите по ссылке http://localhost:8080

Проверьте, пожалуйста, что на вашей системе установлена и настроена как минимум JDK 17.

Доступные функции

  1. Аутентификация пользователей:

    • Регистрация и вход в систему для пользователей.
    • Администраторы могут просматривать всех зарегистрированных пользователей.
    • Выход пользователя из системы.
  2. Управление меню:

    • Администраторы могут обновлять меню, добавляя новые блюда.
    • Удаление блюд из меню администраторами.
    • Полный список всех блюд доступен для просмотра.
  3. Управление заказами:

    • Клиенты могут создавать заказы, выбирая блюда из текущего меню.
    • Заказы обрабатываются асинхронно, симулируя процесс приготовления.
    • Гибкость для клиентов добавлять блюда к существующим заказам во время их обработки.
    • Отмена заказа возможна до его завершения.
    • Обновления статуса заказа в реальном времени ("Принят", "Готовится", "Готов", "Отменён", "Оплачен").
    • Клиенты могут оплатить свои заказы по завершении.
    • Возможность для клиентов оставить отзыв после оплаты.
    • Клиенты могут посмотреть список своих заказов. Администраторы могут посмотреть список всех заказов.
  4. Просмотр статистики ресторана:

    • Информация о объемах заказов и сгенерированной выручке.
    • Определение популярных блюд.
    • Заказы, отсортированные по рейтингу.
    • Расчет средней стоимости заказа.
  5. Проверка состояния системы:

    • Проверка доступности приложения.
  6. Тестовые данные:

    • Доступен эндпоинт /fill-mock-data для заполнения системы тестовыми данными, включающими администратора, двух посетителей и десять случайных блюд.

Аутентификация

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

Структура проекта

В соответствии с принципами ООП и SOLID:

  • controllers: Содержит контроллеры, ответственные за обработку HTTP-запросов и ответов.
  • data/controllers: Включает шаблоны запросов и ответов для всех контроллеров.
  • data/files: Содержит интерфейсы, определяющие контракты для классов или компонентов.
  • data/models: Содержит классы данных, представляющие сущности, такие как User, Dish и Order.
  • statuses: Определяет перечисления, представляющие константные значения.
  • repositories: Реализует шаблон репозитория для хранения и извлечения данных.
  • database: Хранит JSON-файлы с данными.
  • services: Включает классы, содержащие бизнес-логику для действий пользователей и обработки заказов.
  • components: Содержит вспомогательные инструменты и утилиты.

Решение использовать JSON-файлы для хранения данных принято с целью упростить задачу. Тем не менее, в проекте используется шаблон репозитория для управления данными.

Паттерны проектирования

Проект использует различные шаблоны проектирования, обеспечивая чистоту и поддерживаемость кода:

  • MVC: Применяется в качестве основного паттерна для разработки веб-сервиса.
  • Шаблон репозитория: Применяется для управления доступом к данным и их хранения.
  • Одиночка (Singleton): Применяется для хранения данных о ресторане.

Многопоточность

Сервис OrderProcessingService предназначен для обработки заказов в многопоточном режиме. При поступлении нового заказа метод processOrder добавляет его в очередь orderQueue. Затем запускается метод processNextOrder для обработки следующего заказа в очереди.

Внутри метода processNextOrder каждый заказ обрабатывается в собственной корутине. Сначала вычисляется общее время приготовления заказа путем суммирования времени приготовления каждого блюда. Затем симулируется приготовление с помощью задержки delay. По завершении приготовления обновляется статус заказа, а прибыль ресторана пересчитывается в соответствии с ценой заказа.

Метод cancel используется для отмены обработки заказа, если он находится в процессе приготовления.

Сервис также использует семафор для контроля над доступными рабочими потоками. Изначальное значение семафора берется из application.properties.

Приоритетная система: простая очередь (кто первый заказал, тот первый получит).

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages