12 KiB
12 KiB
Контекст проекта InviteMe
Назначение
InviteMe — веб-приложение для организации регистрации гостей на корпоративные мероприятия. Является упрощённым аналогом Timepad: загрузка списка участников, генерация персональных QR-кодов, рассылка приглашений, контроль входа на мероприятии и административная аналитика.
Бизнес-процесс
1. Подготовка до мероприятия
- Администратор создаёт учётные записи организаторов и сотрудников на входе.
- Организатор создаёт новое мероприятие в админ-панели.
- Организатор формирует Excel-файл со столбцами:
ОтделФИОДолжностьe-mailназвание фото
- Собирает фотографии гостей. Название каждого файла должно совпадать со значением в столбце
название фото. - В админ-панели выбирает созданное мероприятие и загружает Excel. Система создаёт записи гостей в рамках этого мероприятия и генерирует для каждого уникальный QR-код.
- Загружает фото (по одному или ZIP-архивом) — они сохраняются в закрытой папке мероприятия
instance/uploads/photos/event_<id>/. - При необходимости вручную добавляет, редактирует или блокирует гостей.
- Запускает массовую рассылку приглашений. Каждый гость получает письмо с QR-кодом.
2. Вход на мероприятие
- Сотрудники на входе открывают страницу
/check-inна телефоне/планшете. - Авторизуются под учётной записью
staff. - Проверяют гостей одним из способов:
- Сканирование QR-кода с экрана телефона или распечатки.
- Поиск по ФИО (вводят фамилию, выбирают из выпадающего списка).
- На экране отображается крупное фото гостя, отдел, должность, email и кнопка «Отметить вход».
- Сотрудник сверяет фото с гостем и нажимает кнопку.
- Если гость уже был отмечен, система показывает предупреждение и время входа.
3. Аналитика во время и после мероприятия
- Организатор в админ-панели видит:
- Общее количество гостей.
- Количество пришедших.
- Процент посещаемости.
- Список последних входов.
- Может быстро проверить по ФИО, пришёл ли конкретный человек.
- Может выгрузить отчёт в Excel с отметкой о посещении и временем входа для каждого участника.
Роли пользователей
| Роль | Возможности |
|---|---|
| Администратор | Полный доступ: управление пользователями, всеми мероприятиями, гостями, рассылка, аналитика, отчёты |
| Организатор | Создание и управление своими мероприятиями, гостями, рассылка, аналитика, отчёты |
| Сотрудник на входе | Страница /check-in: доступ только к назначенным мероприятиям, сканирование QR, поиск, отметка входа |
Пользователи создаются и управляются через веб-интерфейс администратора. При первом запуске открывается страница создания первого администратора.
Архитектура
┌─────────────┐ ┌─────────────┐ ┌─────────────────┐
│ Браузер │──────│ Flask │──────│ PostgreSQL │
│ (Admin/ │ │ (Python) │ │ (inviteme.db) │
│ Organizer/ │ │ │ └─────────────────┘
│ Staff) │ └──────┬──────┘
└─────────────┘ │
┌────────────────┼────────────────┐
│ │ │
┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐
│ QR-сервис │ │ Email │ │ Excel │
│ (qrcode) │ │ (SMTP) │ │ (openpyxl)│
└────────────┘ └───────────┘ └───────────┘
- Flask обрабатывает HTTP-запросы и рендерит HTML-шаблоны.
- PostgreSQL хранит пользователей, мероприятия, гостей, RSVP и историю входов. SQLite используется только локально.
- RQ worker + Redis выполняют массовую рассылку в фоне и сохраняют прогресс независимо от браузера.
- Локальная файловая система хранит фото и QR-коды.
- SMTP используется для отправки приглашений.
Поток данных
Импорт гостей
Создание мероприятия в админ-панели
↓
Excel-файл
↓
excel_service.read_guests_from_excel()
↓
Создание/обновление записей Guest в базе данных (с привязкой к мероприятию)
↓
qr_service.generate_qr_for_guest() для каждого нового гостя
↓
Готовность к рассылке
Рассылка приглашений
Гость с invitation_sent = false
↓
email_service.send_invitation()
↓
HTML-шаблон + QR-код как вложение
↓
Отправка через SMTP
↓
invitation_sent = true
Проверка входа
QR-код → URL /check-in?token=<uuid>
↓
Загрузка карточки гостя
↓
POST /api/check-in/<token>
↓
Проверка: уже отмечен?
↓
Создание записи CheckIn или возврат ошибки 409
Формат Excel
Обязательные столбцы (имена должны совпадать точно):
| Столбец | Описание | Пример |
|---|---|---|
Отдел |
Название отдела | IT |
ФИО |
Полное имя | Иванов Иван Иванович |
Должность |
Должность гостя | Разработчик |
e-mail |
Email для рассылки | ivanov@company.com |
название фото |
Имя файла фото | ivanov.jpg |
Важно: значение в столбце
название фотодолжно точно совпадать с именем загруженного файла, включая расширение.
Хранение файлов
instance/uploads/
├── photos/ # Фото гостей
├── qrcodes/ # Сгенерированные QR-коды
├── reports/ # Выгруженные отчёты
└── temp/ # Временные файлы при загрузке
Эти папки создаются автоматически при старте приложения.
Ограничения и предположения
- Production-конфигурация использует PostgreSQL и рассчитана на мероприятия с сотнями или тысячами гостей при одном экземпляре приложения.
- Все фото и QR-коды хранятся локально на диске. Перед переносом на другой сервер их нужно копировать отдельно (они не хранятся в git).
- Массовая рассылка писем выполняется фоновым worker-процессом; результат и ошибка сохраняются для каждого гостя.
- QR-код содержит прямую ссылку на страницу входа. При переносе на другой хост необходимо указать корректный
BASE_URLв.envили при загрузке Excel.
Чеклист перед мероприятием
- Созданы учётные записи организаторов и сотрудников на входе.
- Создано мероприятие в админ-панели.
- Подготовлен Excel со списком гостей.
- Собраны и загружены фото всех гостей.
- Загружен Excel в админ-панель в рамках нужного мероприятия.
- Проверено, что QR-коды сгенерированы.
- Настроен SMTP и отправлено тестовое письмо.
- Разосланы приглашения.
- Протестирована страница
/check-inна телефоне/планшете. - Проверена работа камеры и сканирования QR.
- Проверен поиск по ФИО.
- Настроено резервное копирование базы и загруженных файлов.
Распространённые проблемы
Гость не находится по QR
- Проверьте, что гость не заблокирован (
is_active = true). - Проверьте, что QR-код не был перегенерирован, а старый распечатан.
Фото не отображается на странице входа
- Проверьте точное совпадение имени файла в Excel и в папке
uploads/photos/. - Проверьте, что файл действительно загружен.
Письма не отправляются
- Проверьте настройки SMTP в
.env. - Для Yandex/Google используйте пароль приложения, а не основной пароль.
- Проверьте логи консоли Flask.
QR-код ведёт на localhost
- Укажите
BASE_URLв.env. - Или введите базовый URL при загрузке Excel в админ-панели.
История изменений
- 2026-08-28 — Первая рабочая версия (MVP). Реализованы импорт Excel, QR-коды, рассылка, check-in, аналитика.
- 2026-08-28 — Добавлены пользователи, роли и поддержка нескольких мероприятий.