Реализована система управления рестораном, созданная на Kotlin и работающая на Spring Boot. Она работает в многопоточной среде и позволяет клиентам добавлять блюда в свои заказы в реальном времени, отслеживать статусы заказов. Система обслуживает две основные роли пользователей: посетителей и администраторов, где администраторы имеют возможность управлять меню, включая добавление или удаление блюд, просмотр всей нужной информации, а также настройку количества, цены и времени приготовления.
- Запуск приложения:
- Перейти в папку с проектом:
./gradlew bootRun
- Открытие приложения: Далее перейдите по ссылке http://localhost:8080
Проверьте, пожалуйста, что на вашей системе установлена и настроена как минимум JDK 17.
-
Аутентификация пользователей:
- Регистрация и вход в систему для пользователей.
- Администраторы могут просматривать всех зарегистрированных пользователей.
- Выход пользователя из системы.
-
Управление меню:
- Администраторы могут обновлять меню, добавляя новые блюда.
- Удаление блюд из меню администраторами.
- Полный список всех блюд доступен для просмотра.
-
Управление заказами:
- Клиенты могут создавать заказы, выбирая блюда из текущего меню.
- Заказы обрабатываются асинхронно, симулируя процесс приготовления.
- Гибкость для клиентов добавлять блюда к существующим заказам во время их обработки.
- Отмена заказа возможна до его завершения.
- Обновления статуса заказа в реальном времени ("Принят", "Готовится", "Готов", "Отменён", "Оплачен").
- Клиенты могут оплатить свои заказы по завершении.
- Возможность для клиентов оставить отзыв после оплаты.
- Клиенты могут посмотреть список своих заказов. Администраторы могут посмотреть список всех заказов.
-
Просмотр статистики ресторана:
- Информация о объемах заказов и сгенерированной выручке.
- Определение популярных блюд.
- Заказы, отсортированные по рейтингу.
- Расчет средней стоимости заказа.
-
Проверка состояния системы:
- Проверка доступности приложения.
-
Тестовые данные:
- Доступен эндпоинт
/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.
Приоритетная система: простая очередь (кто первый заказал, тот первый получит).