Найти в Дзене
Записки о Java

Разработка учетной системы бронирования авиабилетов - часть 1

Рисунок: разработка учетной системы бронирования авиабилетов 1. Постановка задачи Цель проекта:
Разработать веб-систему для учета и бронирования авиабилетов, позволяющую пользователям просматривать доступные рейсы, выбирать места, оформлять бронирования и управлять своими заказами. Система должна быть надежной, масштабируемой и обеспечивать корректную работу с расписанием, наличием мест и финансовыми операциями. Целевая аудитория: Пассажиры (конечные пользователи) Администраторы авиакомпании или call-центр (операторы) Ключевые бизнес-процессы: Поиск рейсов по направлению и дате Выбор и бронирование мест Оформление заказа и резервация Управление бронью (просмотр, отмена, изменение) Администрирование: управление рейсами, самолетами, аэропортами 2. Техническое задание (ТЗ) Система должна предоставлять следующие возможности: Регистрация и аутентификация пользователей Поиск рейсов по параметрам: аэропорт вылета/прилета, дата вылета Отображение списка доступных рейсов с ценами и свободными
Оглавление
Рисунок: разработка учетной системы бронирования авиабилетов
Рисунок: разработка учетной системы бронирования авиабилетов

1. Постановка задачи

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

Целевая аудитория:

  • Пассажиры (конечные пользователи)
  • Администраторы авиакомпании или call-центр (операторы)

Ключевые бизнес-процессы:

  1. Поиск рейсов по направлению и дате
  2. Выбор и бронирование мест
  3. Оформление заказа и резервация
  4. Управление бронью (просмотр, отмена, изменение)
  5. Администрирование: управление рейсами, самолетами, аэропортами

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 при резервировании