Разработка Gamification-системы для LMS (баллы, бейджи, рейтинг)

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

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Разработка Gamification-системы для LMS (баллы, бейджи, рейтинг)
Средняя
~5 рабочих дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    874
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    851

Разработка Gamification-системы для LMS (баллы, бейджи, рейтинг)

Геймификация в LMS работает не через «игровую оболочку», а через систематическое признание прогресса. Баллы, бейджи и рейтинги дают студентам внешнюю мотивацию в моменты, когда внутренней недостаточно.

Элементы системы

Баллы опыта (XP) — накапливаются за любые действия: прохождение урока, сдача задания, участие в форуме, streak дней. Баллы никогда не тратятся — они отражают суммарную активность.

Уровни — автоматически присваиваются при накоплении порогового количества XP. Открывают новые возможности (доступ к экзаменам, bonusным материалам).

Бейджи — присваиваются за конкретные достижения. Видны в профиле студента.

Leaderboard — рейтинг студентов по XP в рамках потока или курса.

Streak — серия дней с активностью подряд. Мотивирует к регулярным занятиям.

Модель данных

CREATE TABLE xp_events (
  id            UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  student_id    UUID REFERENCES users(id),
  course_id     UUID REFERENCES courses(id),
  event_type    VARCHAR(100) NOT NULL, -- 'lesson_completed', 'assignment_graded', 'forum_post'
  entity_id     UUID,
  xp_awarded    INT NOT NULL,
  created_at    TIMESTAMPTZ DEFAULT NOW()
);

CREATE TABLE badge_definitions (
  id            UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  slug          VARCHAR(100) UNIQUE NOT NULL,
  name          VARCHAR(200),
  description   TEXT,
  icon_url      VARCHAR(2000),
  condition_type VARCHAR(100), -- 'lessons_completed', 'streak_days', 'first_submission'
  condition_value JSONB,       -- { "count": 10 } или { "days": 7 }
  xp_reward     INT DEFAULT 0
);

CREATE TABLE student_badges (
  student_id    UUID REFERENCES users(id),
  badge_id      UUID REFERENCES badge_definitions(id),
  awarded_at    TIMESTAMPTZ DEFAULT NOW(),
  course_id     UUID REFERENCES courses(id),
  PRIMARY KEY(student_id, badge_id)
);

CREATE TABLE student_xp (
  student_id    UUID REFERENCES users(id),
  course_id     UUID REFERENCES courses(id),
  total_xp      INT DEFAULT 0,
  level         INT DEFAULT 1,
  streak_days   INT DEFAULT 0,
  last_activity DATE,
  PRIMARY KEY(student_id, course_id)
);

Начисление XP и проверка бейджей

Событийно-ориентированная архитектура: при любом действии студента публикуем событие, subscriber начисляет XP и проверяет условия бейджей:

class GamificationService {
  static XP_REWARDS = {
    lesson_completed: 50,
    assignment_submitted: 30,
    assignment_graded_pass: 100,
    assignment_graded_excellent: 150, // >= 90%
    forum_post_created: 10,
    forum_post_upvoted: 5,
    streak_7_days: 200,
    streak_30_days: 1000,
    course_completed: 500,
  };

  async awardXp(studentId, courseId, eventType, entityId = null) {
    const xp = GamificationService.XP_REWARDS[eventType] ?? 0;
    if (xp === 0) return;

    await db.xpEvents.create({ studentId, courseId, eventType, entityId, xpAwarded: xp });

    const updated = await db.studentXp.increment({ studentId, courseId }, 'total_xp', xp);
    const newLevel = this.calculateLevel(updated.totalXp);

    if (newLevel > updated.level) {
      await db.studentXp.update({ studentId, courseId }, { level: newLevel });
      await this.notifyLevelUp(studentId, newLevel);
    }

    await this.checkAndAwardBadges(studentId, courseId, eventType);
  }

  calculateLevel(totalXp) {
    // Экспоненциальная кривая: уровень 1=0, 2=100, 3=300, 4=600, ...
    return Math.floor(1 + Math.sqrt(totalXp / 50));
  }

  async checkAndAwardBadges(studentId, courseId, triggerEvent) {
    const candidates = await db.badgeDefinitions.findAll({
      conditionType: { in: this.getRelevantConditions(triggerEvent) }
    });

    for (const badge of candidates) {
      const alreadyAwarded = await db.studentBadges.exists({ studentId, badgeId: badge.id });
      if (alreadyAwarded) continue;

      const earned = await this.checkCondition(studentId, courseId, badge);
      if (earned) {
        await db.studentBadges.create({ studentId, badgeId: badge.id, courseId });
        await this.awardXp(studentId, courseId, 'badge_earned');
        await this.notifyBadgeEarned(studentId, badge);
      }
    }
  }
}

Leaderboard

// Рейтинг в реальном времени с кэшированием
async function getLeaderboard(courseId: string, limit = 20): Promise<LeaderboardEntry[]> {
  const cacheKey = `leaderboard:${courseId}`;
  const cached = await redis.get(cacheKey);
  if (cached) return JSON.parse(cached);

  const data = await db.studentXp.findAll({
    where: { courseId },
    order: [['totalXp', 'DESC']],
    limit,
    include: [{ model: db.users, attributes: ['name', 'avatar'] }],
  });

  const result = data.map((row, idx) => ({
    rank: idx + 1,
    studentId: row.studentId,
    name: row.user.name,
    avatar: row.user.avatar,
    xp: row.totalXp,
    level: row.level,
    streakDays: row.streakDays,
  }));

  await redis.setex(cacheKey, 60, JSON.stringify(result)); // Кэш 1 минута
  return result;
}

UI компоненты

XP bar — прогресс до следующего уровня с анимацией заполнения. При получении новых XP — всплывающий +50 XP тост.

Badge showcase — сетка бейджей в профиле. Полученные — цветные, ещё не полученные — серые с иконкой замка и подсказкой об условии.

Streak counter — огонь-иконка с количеством дней. При ежедневном заходе — анимированное подтверждение продолжения streak.

Сроки

Базовая система XP + уровни + 10–15 бейджей + leaderboard — 7–10 дней. UI компоненты с анимациями (XP bar, тосты, badge showcase) — 3–4 дня. Редактор бейджей для администратора — 2–3 дня.