1. Постановка задачи
Цель проекта:
Разработать веб-систему для учета и бронирования авиабилетов, позволяющую пользователям просматривать доступные рейсы, выбирать места, оформлять бронирования и управлять своими заказами. Система должна быть надежной, масштабируемой и обеспечивать корректную работу с расписанием, наличием мест и финансовыми операциями.
Целевая аудитория:
- Пассажиры (конечные пользователи)
- Администраторы авиакомпании или call-центр (операторы)
Ключевые бизнес-процессы:
- Поиск рейсов по направлению и дате
- Выбор и бронирование мест
- Оформление заказа и резервация
- Управление бронью (просмотр, отмена, изменение)
- Администрирование: управление рейсами, самолетами, аэропортами
2. Техническое задание (ТЗ)
Система должна предоставлять следующие возможности:
- Регистрация и аутентификация пользователей
- Поиск рейсов по параметрам: аэропорт вылета/прилета, дата вылета
- Отображение списка доступных рейсов с ценами и свободными местами
- Выбор 1 или нескольких мест на рейсе
- Создание заказа (бронирования) с указанием пассажиров
- Отмена бронирования в течение определенного времени
- Админка: создание/редактирование рейсов, самолетов, аэропортов
- История бронирований для каждого пользователя
Технологический стек (предварительно):
- Backend: Java 11+, Spring Boot, Spring Web, Spring Data JPA, Hibernate
- БД: PostgreSQL
- Аутентификация: Spring Security + JWT или OAuth2
- API: RESTful
- Логирование: SLF4J + Logback
- Тестирование: JUnit 5, Mockito
🔹 3. Функциональные требования (FR)
ID
Требование
Описание
FR-01
Регистрация пользователя
Пользователь может зарегистрироваться с email и паролем
FR-02
Аутентификация
Пользователь может войти в систему
FR-03
Поиск рейсов
Поиск по: from, to, departureDate
FR-04
Просмотр информации о рейсе
Отображение: самолет, время вылета/прилета, свободные места, цена
FR-05
Бронирование
Выбор мест → создание заказа → фиксация брони
FR-06
Отмена брони
Пользователь может отменить бронь до вылета или в течение 24 ч
FR-07
История бронирований
Список всех броней пользователя
FR-08
Админка: управление аэропортами
CRUD аэропортов
FR-09
Админка: управление самолетами
CRUD самолетов с указанием вместимости и схемы мест
FR-10
Админка: управление рейсами
Назначение самолета, маршрута, времени, цены
4. Нефункциональные требования (NFR)
Категория
Требование
Производительность
Время ответа API ≤ 500 мс при нагрузке до 100 RPS
Доступность
99.5% uptime
Безопасность
Защита от SQL-инъекций, CSRF, XSS; пароли хэшируются; JWT с коротким TTL
Масштабируемость
Возможность горизонтального масштабирования сервисов
Надежность
Резервное копирование БД, обработка ошибок, логирование
Совместимость
API должен быть документирован (Swagger/OpenAPI)
Локализация
Поддержка хотя бы en/ru (опционально)
Транзакционность
Бронирование — атомарная операция (все или ничего)
5. System Design (High-Level Architecture)
Компоненты системы:
+------------------+ +------------------+ +------------------+
| Frontend |----->| API Gateway |----->| Auth Service |
| (Web / Mobile) | HTTP | (Spring Cloud) | JWT | (Spring Security)|
+------------------+ +------------------+ +------------------+
|
v
+------------------------------+
| Core Services |
|------------------------------|
| • Flight Search Service |
| • Booking Service |
| • User Management Service |
| • Admin Service |
+------------------------------+
|
POSTGRESQL
Подход:
- Монолит или модульный монолит (для начала — проще поддерживать на раннем этапе)
- В будущем — можно выделить микросервисы: booking-service, flight-service, user-service
- Транзакции: Spring @Transactional с уровнем READ_COMMITTED
- Конкуренция за места: оптимистичная блокировка (@Version) или резервирование на короткое время (например, 10 минут)
6. API Design (RESTful)
Основные эндпоинты:
Аутентификация
- POST /api/auth/register
- POST /api/auth/login
Поиск рейсов
- GET /api/flights?from=MOW&to=LED&date=2025-12-10
Бронирование
- POST /api/bookings — создать бронь
json12345
{
"flightId": 123,
"passengers": [{"name": "Ivan", "passport": "123456"}],
"seatNumbers": ["12A", "12B"]
}
- GET /api/bookings/{id} — получить бронь
- DELETE /api/bookings/{id} — отменить бронь
Админка
- POST /api/admin/airports
- POST /api/admin/aircrafts
- POST /api/admin/flights
Все эндпоинты защищены: /api/admin/** — только ROLE_ADMIN
7. Схема базы данных (PostgreSQL)
Таблицы:
users
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
airports
code CHAR(3) PRIMARY KEY, -- например, SVO, JFK
name VARCHAR(255) NOT NULL,
city VARCHAR(100) NOT NULL,
country VARCHAR(100) NOT NULL
aircrafts
id BIGSERIAL PRIMARY KEY,
model VARCHAR(100) NOT NULL, -- Boeing 737
total_seats INT NOT NULL -- 180
flights
id BIGSERIAL PRIMARY KEY,
flight_number VARCHAR(10) NOT NULL, -- SU1234
aircraft_id BIGINT NOT NULL REFERENCES aircrafts(id),
origin_code CHAR(3) NOT NULL REFERENCES airports(code),
destination_code CHAR(3) NOT NULL REFERENCES airports(code),
departure_time TIMESTAMP NOT NULL,
arrival_time TIMESTAMP NOT NULL,
base_price DECIMAL(10,2) NOT NULL
seats
id BIGSERIAL PRIMARY KEY,
flight_id BIGINT NOT NULL REFERENCES flights(id),
seat_number VARCHAR(5) NOT NULL, -- "12A"
is_available BOOLEAN DEFAULT true,
UNIQUE(flight_id, seat_number)
bookings
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id BIGINT NOT NULL REFERENCES users(id),
flight_id BIGINT NOT NULL REFERENCES flights(id),
status VARCHAR(20) NOT NULL CHECK (status IN ('PENDING', 'CONFIRMED', 'CANCELLED')),
created_at TIMESTAMP DEFAULT NOW(),
expires_at TIMESTAMP NOT NULL -- например, +10 минут от created_at
booking_seats
booking_id UUID REFERENCES bookings(id),
seat_id BIGINT REFERENCES seats(id),
PRIMARY KEY (booking_id, seat_id)
passengers
id BIGSERIAL PRIMARY KEY,
booking_id UUID NOT NULL REFERENCES bookings(id),
full_name VARCHAR(255) NOT NULL,
passport_number VARCHAR(50) NOT NULL
Индексы:flights(departure_time, origin_code, destination_code)
bookings(user_id, created_at)
seats(flight_id, is_available)
Примечание: Для предотвращения двойного бронирования используйте например SELECT ... FOR UPDATE при резервировании