Films Area — учебный мультплатформенный проект для просмотра фильмов, публикации отзывов и бронирования билетов в кино.
Решение объединяет REST API на Node.js, базу данных MongoDB и несколько пользовательских интерфейсов: основное React-приложение, отдельную PHP-страницу и мобильный прототип на React Native.
Проект демонстрирует работу нескольких клиентов с единым API и общей моделью данных.
Проект включает четыре части:
- Backend — REST API для фильмов, отзывов и билетов.
- React frontend — основной веб-интерфейс с каталогом и бронированием.
- PHP service — отдельный серверный клиент для просмотра статистики и поиска отзывов.
- Mobile App — мобильный интерфейс на React Native и Expo.
React frontend ─┐
PHP service ────┼── HTTP / JSON ── Express API ── MongoDB
Mobile App ─────┘
- главная промостраница кинотеатра;
- просмотр каталога фильмов;
- поиск фильма по названию;
- сортировка каталога по году выпуска;
- переход на страницу выбранного фильма;
- отображение описания, жанра, рейтинга, режиссёра и стоимости;
- просмотр отзывов;
- добавление отзыва с оценкой;
- выбор фильма, даты, времени и количества билетов;
- автоматический расчёт итоговой стоимости;
- отправка бронирования на сервер.
- получение списка фильмов;
- получение фильма по идентификатору;
- получение отзывов выбранного фильма;
- добавление отзыва;
- создание билета;
- расчёт топа фильмов по выручке;
- подсчёт проданных билетов и средней стоимости заказа.
- вывод всех доступных фильмов;
- вывод рейтинга фильмов по продажам;
- отображение выручки и количества проданных билетов;
- поиск фильма по части названия;
- получение и вывод отзывов через REST API;
- экранирование пользовательских данных перед выводом.
- главная страница;
- адаптированная галерея;
- каталог фильмов в виде сетки;
- получение данных из общего API;
- навигация между экранами через React Navigation.
- Node.js
- Express 4
- MongoDB
- Mongoose 8
- CORS
- REST API
- React 18
- React Router
- JavaScript
- Create React App
- CSS Modules
- Fetch API
- PHP
- HTML и CSS
- HTTP-запросы к REST API
- обработка JSON
- React Native 0.76
- Expo 52
- React Navigation
- Stack Navigator
- Expo Font
Express-приложение предоставляет API и взаимодействует с MongoDB через Mongoose.
Основные модели:
Movie— информация о фильме;Review— отзыв, связанный с фильмом;Ticket— данные бронирования и итоговая стоимость.
Для формирования рейтинга фильмов используется aggregation pipeline MongoDB:
- билеты объединяются с фильмами через
$lookup; - данные группируются по фильму;
- вычисляются общая выручка, число билетов и средняя стоимость;
- результат сортируется по выручке.
Базовый адрес локального API:
http://localhost:3000/api
| Метод | Endpoint | Назначение |
|---|---|---|
GET |
/api/movies |
Получить все фильмы |
GET |
/api/movies/top-grossing |
Получить рейтинг по выручке |
GET |
/api/movies/:id |
Получить фильм |
GET |
/api/movies/:id/reviews |
Получить отзывы фильма |
GET |
/api/reviews |
Получить все отзывы |
POST |
/api/reviews |
Добавить отзыв |
POST |
/api/tickets |
Забронировать билеты |
API возвращает данные в формате JSON и проверяет наличие обязательных полей при создании отзыва или билета.
FilmsAreaProject/
├── backend/
│ ├── models/
│ │ ├── movie.js # Модель фильма
│ │ ├── review.js # Модель отзыва
│ │ └── ticket.js # Модель билета
│ ├── db.js # Подключение к MongoDB
│ └── server.js # Express API
├── frontend/
│ └── src/
│ ├── components/ # Страницы, формы и UI-компоненты
│ └── index.js # Маршрутизация React-приложения
├── php-service/
│ ├── index.php # PHP-клиент API
│ └── style.css
└── MobileApp/
├── components/ # Мобильные компоненты
├── screens/ # Экраны приложения
└── App.js # Навигация React Native
- Node.js 18 или новее;
- npm;
- доступный экземпляр MongoDB;
- PHP 8 — для запуска PHP-сервиса;
- Expo Go или эмулятор — для мобильного приложения.
git clone https://github.com/Gonerr/FilmsAreaProject.git
cd FilmsAreaProjectНастройте строку подключения к MongoDB в backend/db.js, затем выполните:
cd backend
npm install
node server.jsAPI запустится на http://localhost:3000.
Откройте второй терминал:
cd frontend
npm install
npm startПоскольку порт 3000 занят API, Create React App предложит запустить интерфейс на другом порту, обычно 3001.
php -S localhost:8080 -t php-serviceПосле запуска откройте http://localhost:8080.
cd MobileApp
npm install
npx expo startДля запуска на физическом устройстве необходимо заменить локальный IP-адрес API в мобильном клиенте на адрес компьютера в той же сети.
- единый REST API для разных типов клиентов;
- моделирование данных через Mongoose;
- связь отзывов и билетов с фильмами;
- агрегация статистики продаж средствами MongoDB;
- маршрутизация React-приложения;
- клиентский поиск и сортировка;
- динамический расчёт стоимости бронирования;
- создание и валидация данных через API;
- серверный PHP-клиент для обработки JSON;
- адаптация интерфейса для мобильной платформы;
- навигация между экранами React Native.
В учебной версии строка подключения к MongoDB сохранена непосредственно в исходном коде. Перед дальнейшим использованием проекта необходимо:
- заменить и отозвать опубликованные учётные данные;
- вынести MongoDB URI в переменную окружения;
- добавить
.env.exampleбез секретов; - ограничить CORS списком разрешённых адресов;
- не хранить рабочие ключи и пароли в Git.
Основное React-приложение и API реализуют ключевые сценарии каталога, отзывов и бронирования. PHP-клиент демонстрирует повторное использование API. Мобильная часть остаётся прототипом: в ней готовы главная страница и каталог, но экран подробной информации о фильме ещё не подключён к навигации.
Возможные направления развития:
- завершить экран фильма и бронирование в мобильном приложении;
- добавить регистрацию и личный кабинет;
- реализовать выбор конкретного сеанса и мест в зале;
- вынести адрес API в общую конфигурацию клиентов;
- добавить обработку ошибок и состояния загрузки;
- добавить DTO и более строгую серверную валидацию;
- подготовить демонстрационные данные и скрипт их импорта;
- добавить автоматические тесты;
- контейнеризировать API и MongoDB через Docker Compose.
Анастасия Лихачева
Проект разработан в качестве учебной работы для практики full-stack-разработки, проектирования REST API и создания интерфейсов для нескольких платформ.