Розробка системи прогресу навчання для LMS
Progress Tracking в LMS—це більше ніж "завершено X з Y уроків". Повнофункціональна система відстежує активність на рівні секунд, аналізує паттерни навчання та виявляє студентів, які рискують кинути курс.
Що та як відстежувати
Рівень уроку:
- Час відкриття та закриття
- Рівень завершення відео (не просто "відкрив", а "переглянув 85%")
- Прокрутка текстового контенту
- Клики по інтерактивних елементах
Рівень курсу:
- % завершених уроків
- % завершених завдань
- Остання дата активності
- Streak (днів поспіль)
Рівень платформи:
- Середнє час сесії
- Пристрої та час піку активності
- Cohort retention (% студентів активних через 7/14/30 днів)
Модель даних
CREATE TABLE lesson_progress (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
student_id UUID REFERENCES users(id),
lesson_id UUID REFERENCES lessons(id),
course_id UUID REFERENCES courses(id),
status VARCHAR(30) DEFAULT 'not_started', -- not_started, in_progress, completed
started_at TIMESTAMPTZ,
completed_at TIMESTAMPTZ,
video_progress JSONB, -- { "duration_ms": 3600000, "watched_ms": 3060000 }
time_spent_secs INTEGER,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_lesson_progress_student ON lesson_progress(student_id, created_at);
Відстеження подій (клієнт)
// Відстежуйте прогрес відео кожні 30 секунд
video.addEventListener('timeupdate', debounce(() => {
fetch('/api/lessons/track/video-progress', {
method: 'POST',
body: JSON.stringify({
lessonId,
currentTime: video.currentTime,
duration: video.duration,
}),
});
}, 30000));
// Відстежуйте завершення уроку
async function completeLesson(lessonId) {
await fetch(`/api/lessons/${lessonId}/complete`, {
method: 'POST',
body: JSON.stringify({ completedAt: new Date() }),
});
}
Виявлення ризику
-- Студенти в групі ризику відсіву
SELECT u.id, u.email, c.name, datediff(day, lp.started_at, NOW()) AS days_inactive
FROM lesson_progress lp
JOIN users u ON u.id = lp.student_id
JOIN courses c ON c.id = lp.course_id
WHERE lp.status = 'in_progress'
AND datediff(day, lp.started_at, NOW()) > 14
AND u.email NOT IN (SELECT email FROM support_tickets WHERE status != 'closed')
ORDER BY days_inactive DESC;
Часова шкала
Базове відстеження прогресу—3–5 днів. Виявлення ризику з сповіщеннями—1–2 тижні.







