Кейс 06 Приложение + железо 4 недели Проектирование и разработка

Пропуск в фитнес-клуб по QR: турникет вместо ресепшена

Приложение с регистрацией и цифровым пропуском. Турникет сканирует QR и открывается сам, если абонемент действует. Администратор на входе больше не нужен, а все посещения остаются в системе.

1–2 секпроход по QR
0ручных проверок на входе
24/7доступ без смены администратора
100%посещений в журнале

С чего начинали

До внедрения вход держался на человеке за стойкой, и это ограничивало клуб по трём фронтам.

01

Очередь в час пик

Администратор вручную искал клиента в списке, проверял срок абонемента и только потом открывал проход. В вечерний пик у стойки собирались люди.

02

Человеческий фактор

Проверка «на глаз»: знакомого пропускали, чужой абонемент проходил, заморозку и лимит посещений никто не отслеживал.

03

Нет данных

Посещаемость не фиксировалась. Нельзя было понять загрузку по часам, долю непродливших и кто вообще перестал ходить.

Как это работает

Пять шагов от установки приложения до открытого турникета. Ни одного человека в цепочке.

01

Регистрация в приложении

Клиент создаёт аккаунт по номеру телефона, заполняет профиль. Аккаунт привязывается к карточке клиента в клубе.

Клиент
02

Цифровой пропуск

В приложении появляется QR-код. Он короткоживущий и обновляется сам, поэтому скриншот, отправленный другу, быстро становится бесполезным.

Приложение
03

Сканирование на турникете

Сканер читает код и отправляет его на сервер. Сервер проверяет подпись и срок действия кода, а не только картинку.

Турникет → API
04

Проверка права прохода

Проверяются абонемент, его срок, заморозка, лимит посещений и блокировки. Решение принимает сервер, а не приложение и не сканер.

API
05

Открытие и запись

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

Турникет + БД

Архитектура

Логика проверки живёт в одном месте. Приложение и турникет — только клиенты, им нельзя доверять решение.

Приложение регистрация, профиль,
QR-пропуск, история
→
API проверка права,
выдача и подпись QR,
журнал событий
→
Турникет сканер QR,
открытие, отказ
База данных — абонементы, платежи, заморозки, посещения, устройства
Админка клуба — продление, блокировка, ручной пропуск с комментарием
Отчёты — загрузка по часам, неявки, продления, отказы в доступе

Что сделал

От схемы данных до инструкции, по которой клуб работает без меня.

  • Спроектировал схему данных: клиент, абонемент, заморозка, посещение, устройство, событие прохода
  • Сделал регистрацию и вход по номеру телефона, привязку аккаунта к карточке клиента
  • Реализовал цифровой пропуск: подписанный QR с коротким сроком жизни и автообновлением
  • Написал серверную проверку права прохода: срок, заморозка, лимит, блокировка
  • Связал сканер турникета с API: запрос на проход, ответ «открыть» или «отказ с причиной»
  • Сделал журнал: каждое сканирование пишется, включая отказы
  • Добавил идемпотентность: повторное сканирование не открывает второй проход и не дублирует запись
  • Предусмотрел работу без сети: если API недоступен, турникет работает по локальному списку и отправляет события после восстановления
  • Собрал админку: продления, заморозки, ручной пропуск с обязательным комментарием
  • Сделал отчёты по загрузке зала и отказам в доступе
  • Написал инструкцию для клуба: что делать, если клиент не проходит, где смотреть журнал

Что могло сломаться и что с этим сделано

Это половина работы. Пропускная система живёт не в идеальных условиях.

Пропуск переслали другуКод подписан и живёт ограниченное время, обновляется в приложении. Скриншот устаревает.
Истёк абонементОтказ с понятной причиной на экране и подсказкой, куда обратиться. Событие в журнале.
Пропал интернетЛокальный список действующих абонементов на турникете, события отправляются позже.
Двойное сканированиеПроверка по идентификатору события: второй проход не открывается, запись не дублируется.
Клиент забыл телефонРучной пропуск из админки с комментарием администратора. Всё видно в журнале.
Спор у стойкиЖурнал показывает время, устройство и решение сервера, а не «мне кажется, проходил».

Стек

Серверная логика на Java, клиент — веб-приложение, обмен через API.

Java Spring JDBC SQL REST API JavaScript HTML/CSS JSON Git QR вебхуки

Результат

Проход перестал быть услугой человека и стал функцией системы.

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

Отдельный эффект: клуб перестал спорить с клиентами о том, был проход или нет. Есть событие с временем и устройством — разговор заканчивается.

Что я делал в проекте

Роль целиком: от разбора процесса до запуска и инструкции.

Анализ

Разобрал, как проходит вход сейчас, где теряются данные и какие проверки обязательны. Собрал требования и схему данных.

Разработка

Серверная логика проверки права прохода, выдача и подпись QR, связка со сканером турникета, админка и отчёты.

Запуск

Настройка сценариев отказа, работа без сети, журнал и инструкция для сотрудников клуба.

Кейс 06 · фитнес-клуб · 2026 Все кейсы · mail@example.com