Евгений Сайты › Peppers Сбер ID
Сайты, SEO и GEO, реклама, чат-боты, ИИ и дизайн | Москва
Рейтинг
9 371
№ 111 в каталоге
Отзывы
Профессионализм
9/10
Коммуникация
9 /10
Город
Москва
Опыт работы
11 лет
На сайте с
2016 года
Юридический статус
Самозанятый
Freelance.Boutique
Премиум-сервис для лучших исполнителей

Создание сайта с онлайн-бронированием для сети теннисных кортов: Django, защита от двойной брони в PostgreSQL, оплата и листы ожидания

Используемые навыки Celery Django PostgreSQL Python Redis

Описание

Три теннисные площадки в Москве, с крытыми и открытыми кортами, теперь принимают брони через сайт: сетка по часам, тренеры, абонементы и оплата онлайн. Создание сайта выполнил Евгений Росляков. Веб-разработкой он занимается с 2016 года, работает самозанятым, заключает договор, юрлицам выдаёт закрывающие документы. Он принимает заказы в Москве и удалённо.

До сайта корты бронировали через администратора. Люди звонили или писали, администратор смотрел в таблицу и вписывал фамилию. Пока таблицей пользовался один человек, всё держалось. Вечером желающих много, на телефоне и в мессенджере сидят двое, и появлялись двойные брони: два человека приезжали на один корт в один час.

Вторая беда — «резервы». Человеку обещали корт, пока он решает, платить ли. Он мог не ответить, а лучший час всё это время простаивал. Снять бронь без звонка администратор не решался.

Нужно было, чтобы человек сам видел свободные часы на любой площадке, выбирал, платил и получал подтверждение. Двойная бронь должна быть невозможна технически, а не маловероятна. Неоплаченное место должно освобождаться само.

И ещё администратору нужен рабочий инструмент вместо таблицы: день по кортам, переносы, отметки об абонементах.

Решение

Сайт собран на Django, это фреймворк на языке Python. В нём есть готовая админка, учётные записи и работа с базой, поэтому время ушло на правила бронирования, а не на каркас.

Данные лежат в PostgreSQL. Главная защита от двойной брони стоит на уровне базы: у таблицы бронирований есть ограничение EXCLUDE по диапазонам времени, для него включено расширение btree_gist. Если интервал для того же корта пересекается, база сама отказывает. Это срабатывает, даже когда два человека нажали «оплатить» в одну секунду и приложение не успело сравнить запросы. Проверки в коде остались, но служат подсказкой пользователю, а не последней линией обороны.

Сетка по часам кешируется в Redis, чтобы страница открывалась быстро. Там же ставятся короткие блокировки: пока человек на странице оплаты, выбранный час закрыт для остальных. Блокировка живёт ограниченное время и пропадает сама.

Отложенные задачи выполняет Celery. Оплата не прошла за 15 минут — бронь снимается, час возвращается в сетку. Перед игрой клиенту уходит напоминание. Работает лист ожидания: освободился корт, первому в очереди приходит сообщение, и у него есть время ответить. Ночью строятся отчёты для администратора: загрузка кортов по дням, продажи абонементов, отмены.

В админке администратор видит день по кортам, может поставить бронь вручную, перенести игру, продлить абонемент. Тренеры привязаны к своему расписанию, поэтому клиент выбирает корт и тренера в одном действии. Оплата идёт через платёжный сервис, работающий в России.

Результат

Вечерние часы больше не превращаются в спор «я был первым». Один корт у двух людей в одно время забронировать нельзя, и обеспечивает это база, а не внимательность администратора. Неоплаченные резервы исчезают сами, лучшие часы возвращаются в продажу, а отзванивать и напоминать не нужно.

Лист ожидания оказался полезнее, чем рассчитывали. Отменённый вечер уходит следующему желающему за несколько минут, а раньше корт чаще простаивал, потому что об отмене никто не узнавал вовремя.

Администраторы работают в одном окне. Таблицу с бронями отключили. Звонки остались, но стали короткими просьбами перенести игру. Ночные отчёты показывают, какие часы и площадки загружены слабее, и руководство уже подстраивает расписание и цены абонементов.

Что пока не так. Блокировка на время оплаты может на пару минут задержать корт, если человек передумал и просто закрыл вкладку. Это сознательный компромисс: лучше потерять пару минут, чем получить спорную бронь. Групповые занятия с отдельным составом участников сайт тоже пока не умеет.

Следующий шаг — турниры и клубные матчи.

Если вам нужна онлайн-запись на корты, залы или студии с оплатой, напишите мне на freelance.ru: сколько у вас площадок и как сейчас ведётся расписание. Обсудим, какие правила брони стоит закрепить в системе.

Оценили проект:

Другие проекты

Все проекты →
Веб-разработка и IT Создание сайта на 4 языках для научной методики геологоразведки: международное SEO и продвижение, оптимизация скорости страницы по Google PageSpeed Insights, HTML5 и CSS3
Создание сайта на 4 языках для научной методики геологоразведки: международное SEO и продвижение, оптимизация скорости страницы по Google PageSpeed Insights, HTML5 и CSS3
16
Веб-разработка и IT Платформа хостинга для провайдера из Бишкека: WHMCS для биллинга, cPanel и Plesk для серверов, перенос аккаунтов с Parallels Automation
Платформа хостинга для провайдера из Бишкека: WHMCS для биллинга, cPanel и Plesk для серверов, перенос аккаунтов с Parallels Automation
14
Веб-разработка и IT Сайт шиномонтажа КРАФТ: выездной шиномонтаж погрузчиков, калькулятор стоимости на JavaScript, картография зон выезда и расчёт в PDF
Сайт шиномонтажа КРАФТ: выездной шиномонтаж погрузчиков, калькулятор стоимости на JavaScript, картография зон выезда и расчёт в PDF
57
Веб-разработка и IT Создание сайта регионального университета на Drupal: один портал вместо TYPO3, Dot Net Nuke, Liferay и Microsoft Sharepoint, перенос контента и редиректы
Создание сайта регионального университета на Drupal: один портал вместо TYPO3, Dot Net Nuke, Liferay и Microsoft Sharepoint, перенос контента и редиректы
15