Сайт для ивента SELF, который прошел 14 мая 2022 года в зданиях Лицея НИУ ВШЭ.
SELF - крупнейшее лицейское мероприятие. Оно состоит из трех частей:
-
Утренняя часть - лекции приглашенных спикеров
-
Дневная часть - посещение станций
-
Вечерняя часть - розыгрыш мерча, дискотека и показ мод
Чтобы мотивировать лицеистов и преподавателей участвовать в SELF, была придумана система баллов за активности. Посещение дневных станций или спикеров, соблюдение дресскода и помощь организаторам награждались баллами. Их можно было потратить во время вечерней части, чтобы приобрести себе лицейский мерч или получить купоны на услуги в Лицее (например, можно было купить сертификат на чай с директором).
Баллы должны были храниться неким образом у каждого участника мероприятия. Ранее во время лицейских мероприятий эквивалентом баллов служили бумажные кружочки, которые выдавались лицеистам после прохождения станции. Но эти бумажки были неэффективным решением, так как их легко потерять, сложно вырезать из бумаги и невозможно отслеживать организаторам.
Поэтому мной была предложена идея сайта, предназначенного для хранения баллов каждого лицеиста и преподавателя в электронном виде.
Сайт необходим для хранения баллов мероприятия SELF, которые могут быть использованы для приобретения лицейского мерча.
Электронные баллы должны иметь следующие свойства:
-
баллы невозможно подделать
-
баллы должны принадлежать отдельному пользователю
-
баллы можно заработать
-
баллы можно тратить на лицейские товары
-
общее количество баллов должно быть неограниченно
-
организаторы могут следить за общим числом баллов среди всех пользователей
-
организаторы могут узнать количество баллов отдельного пользователя
-
организаторы могут узнать, за какие активности отдельный посетитель получил баллы
-
только наделенные полномочиями пользователи (волонтеры Лицея) могут присуждать баллы пользователям
-
только наделенные полномочиями пользователи (главы волонтеров) могут отнимать баллы в обмен на лицейские товары
-
количество баллов, присуждаемых пользователю при выполнении одной активности (например, посещение лекции), ограничено
Сценарии работы сайта можно разделить на три категории в зависимости от пользователя.
Сайтом должны пользоваться посетители мероприятия, волонтеры и организаторы.
-
После выполнения активности ивента (посещение лекции или соблюдение дресскода) волонтер, ответственный за активность, выдает посетителю QR-код ивента
-
Просканировав QR-код, пользователь переходит на страницу ивента
-
Если пользователь не зарегистрирован, его перенаправляют на страницу регистрации
-
На странице регистрации можно создать новый аккаунт или зайти в уже созданный
-
Для создания аккаунта пользователю необходимо указать:
- Фамилию
- Имя
- Направление, на котором лицеист обучается (если аккаунт создает педагог или член администрации Лицея, он может выбрать значение "Преподаватель")
- Электронную почту
- Пароль
-
После входа в систему, пользователю будет предложено вернуться на страницу ивента, чтобы получить баллы
-
Пользователь может посмотреть количество баллов в разделе "Баллы"
-
Во время вечерней части посетитель может подойти к ответственным волонтерам, чтобы у него сняли баллы и взамен вручили лицейский мерч
Волонтеры, которые работают с сайтом, делятся на два типа:
-
Волонтеры утренней и дневной части
-
Волонтеры вечерней части
Волонтеры утренней и дневной части обладают QR-кодами (напечатанные на бумаге или хранящиеся на сайте), которые посетители должны отсканировать, чтобы получить баллы.
Волонтерам вечерней части предоставлен доступ к специальному разделу сайта, где они могут снимать баллы посетителям мероприятия. После снятия баллов волонтеры отдают только что приобретенный посетителем мерч.
- Организаторы имеют доступ к таблице со всеми пользователями и заработанными ими баллами. С помощью этой информации составляется цена лицейского мерча для продажи на вечерней части
- Организаторы могут присваивать баллы лицеистам, которые помогли в создании мероприятия
- Организаторы могут посмотреть профиль отдельного пользователя. В нем указано посещенные им активности и полученные баллы
Баллы должны быть получены только после выполнения посетителем определённых активностей. Однако есть вероятность, что часть пользователей захочет получить дополнительные баллы несанкционированно.
Мной было выявлено несколько способов неправомерного получения баллов:
- повторное сканирование QR-кода
- сканирование фото QR-кода, отправленного другими посетителями
Для того, чтобы предотвратить повторное сканирование одного и того же QR-кода, я запрограммировал сайт на запоминание посещенных страниц. Если зарегистрированный пользователь посещал страницу, в базу данных сохранялся ее url. Перед тем как присвоить посетителю балл, система проверяет, есть ли текущий url в списке посещенных. Если его нет, страница для пользователя новая, балл присуждается. В обратном случае ничего не происходит.
Каждая активность имела логический атрибут static. Если static был True, он обладал одним и тем же url независимо от того, сколько раз QR-код активности был использован. А если static имел значение False, после каждого посещения страницы url активности обновлялся, ровно как и QR-код на сайте. Если активность имела static False, то ее невозможно было "списать" у друга, ведь url постоянно менялся, а старые ссылки не приносили баллы. Так я решил вторую проблему, при этом я сохранил возможность печатать QR-коды - для этого нужно просто в БД задать атрибуту static значение True.
-
Бэкенд: Express.js
-
Фронтенд: Bootstrap 5, Webpack, Sass
-
БД: Firebase Firestore
Сайт выполнил поставленные задачи. Каждая активность SELF (их было более 40) имела свою страницу на сайте. Во время утренней и дневной части посетители сканировали QR-коды, а после потратили их во время вечерней части, где было разыграно более 30 призов.
В день мероприятия сайт посетили 418 уникальных пользователей, 352 из которых зарегистрировались в системе
В папке PROJECT находится исходный код сайта. А в папке STATS указана статистика по сайту, которая была отправлена организаторам мероприятия для анализа результатов работы утренней и дневной части SELF