Розробка кастомної системи домашніх завдань для LMS

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

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

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Розробка кастомної системи домашніх завдань для LMS
Середній
~3-5 днів
Часті запитання

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

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1362
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1253
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    958
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1190
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    931
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    949

Зауважте: коли в LMS десятки курсів із різними форматами завдань — від есе до програмування — стандартна форма завантаження файлів перестає працювати. Викладачі витрачають години на перевірку, студенти плутаються в дедлайнах, а оцінки доводиться вручну переносити в журнал. Ми вирішили цю проблему для 50+ освітніх платформ, створивши модуль, який автоматизує перевірку завдань на всіх етапах: від здачі до фіксації оцінки.

Наша система підтримує шість типів відповідей, гнучкі дедлайни з прогресивним штрафом, множинні спроби та peer review. У цій статті — технічні деталі реалізації: модель даних, патерни безпеки під час завантаження файлів, алгоритми розрахунку оцінок і API для інтеграції. Ви отримаєте не просто модуль, а готове рішення з гарантією 6 місяців.

Проблеми, які вирішуємо

Стандартні системи управління навчанням (LMS) часто обмежені одним типом відповіді — текстовим полем. Для курсів програмування потрібен редактор коду, для дизайну — завантаження макетів, для групової роботи — взаємна перевірка. Без цього викладачі змушені використовувати сторонні сервіси, а студенти — перемикатися між вікнами. Наша система об'єднує все в одному інтерфейсі.

Типи завдань та їх реалізація

Тип Опис
Текстова відповідь есе, теоретичні питання, розбір кейсів
Завантаження файлів PDF, Word, архіви з кодом, зображення (до 50 МБ через presigned URLs)
Посилання на зовнішній ресурс GitHub репозиторій, опублікований сайт, Google Docs
Онлайн-редактор коду вбудований Monaco Editor з підсвічуванням синтаксису
Quiz тестування з варіантами відповідей, автоматичною перевіркою та обмеженням за часом
Peer review взаємна перевірка між студентами з анонімністю та критеріями оцінювання

Як ми це робимо: технічний розбір

Модель даних завдань

CREATE TABLE assignments (
  id              UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  lesson_id       UUID REFERENCES lessons(id),
  course_id       UUID REFERENCES courses(id),
  title           VARCHAR(500) NOT NULL,
  description     TEXT,
  type            VARCHAR(50) NOT NULL,
  max_score       INT NOT NULL DEFAULT 100,
  deadline        TIMESTAMPTZ,
  late_submission BOOLEAN DEFAULT FALSE,
  late_penalty    INT DEFAULT 0,
  max_attempts    INT DEFAULT 1,
  is_required     BOOLEAN DEFAULT TRUE,
  created_at      TIMESTAMPTZ DEFAULT NOW()
);

CREATE TABLE submissions (
  id              UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  assignment_id   UUID REFERENCES assignments(id),
  student_id      UUID REFERENCES users(id),
  attempt_number  INT NOT NULL DEFAULT 1,
  status          VARCHAR(50) DEFAULT 'draft',
  text_answer     TEXT,
  file_urls       JSONB DEFAULT '[]',
  external_url    VARCHAR(2000),
  code_answer     TEXT,
  submitted_at    TIMESTAMPTZ,
  graded_at       TIMESTAMPTZ,
  score           INT,
  feedback        TEXT,
  UNIQUE(assignment_id, student_id, attempt_number)
);

Як забезпечується безпечне завантаження файлів?

Пряме завантаження через сервер — антипатерн для LMS з тисячами студентів. Ми використовуємо presigned URLs: браузер завантажує файл безпосередньо в S3/MinIO, минаючи наш бекенд. Це знижує навантаження на сервер і усуває вузьке місце. Порівняння: presigned URLs знижують навантаження на бекенд у 10 разів порівняно з прямим завантаженням.

async function getUploadUrl(assignmentId, fileName, fileSize, userId) {
  if (fileSize > 50 * 1024 * 1024) {
    throw new Error('File too large');
  }
  const allowedTypes = ['application/pdf', 'application/zip', 'image/png', 'image/jpeg'];
  if (!allowedTypes.includes(mimeType)) {
    throw new Error('File type not allowed');
  }
  const key = `submissions/${userId}/${assignmentId}/${uuid()}-${fileName}`;
  const url = await s3.getSignedUrlPromise('putObject', {
    Bucket: process.env.S3_BUCKET,
    Key: key,
    Expires: 300,
    ContentType: mimeType,
    ContentLength: fileSize,
  });
  return { uploadUrl: url, fileKey: key };
}

Автоматичне управління статусами та штрафами

Система проходить через ланцюжок статусів: draft → submitted → reviewing → graded. При відхиленні — статус returned з коментарем викладача і можливістю повторно відправити. На кожному переході надсилаються сповіщення (email, Telegram, in-app).

Пізня здача: якщо late_submission = true, завдання приймається після дедлайну, але оцінка автоматично знижується на late_penalty % за кожну добу. Максимальний штраф — 50 %. Якщо минуло більше тижня — автоматично 0 балів.

Алгоритм розрахунку оцінки з урахуванням штрафу
function calculateFinalScore(rawScore, submittedAt, deadline, latePenalty) {
  if (submittedAt <= deadline) return rawScore;
  const hoursLate = (submittedAt - deadline) / (1000 * 60 * 60);
  if (hoursLate > 168) return 0;
  const penalty = Math.min(latePenalty * Math.ceil(hoursLate / 24), 50);
  return Math.round(rawScore * (1 - penalty / 100));
}

При max_attempts > 1 студент може повторно відправити завдання. Кожна спроба — окремий запис у submissions з інкрементованим attempt_number. До журналу оцінок передається найкращий результат з усіх спроб (або останній — налаштовується).

Детальний приклад: налаштування peer review

Peer review вмикається для завдання з типом peer_review. Налаштування проходить за кроками:

  1. Викладач створює завдання з типом peer_review і задає критерії оцінювання (рубрикатор).
  2. Після дедлайну система автоматично розподіляє анонімні роботи між студентами (кожну роботу перевіряють 2–3 студенти).
  3. Студенти перевіряють роботи та виставляють бали за критеріями.
  4. Підсумкова оцінка обчислюється як медіана всіх оцінок. Якщо оцінки розходяться більш ніж на 20 %, призначається додатковий рев'юер.
  5. Студент, який не перевірив вчасно, отримує штрафні бали.

Такий підхід скорочує час викладача на перевірку в 3 рази.

Інтеграція з вашою системою управління навчанням

Ми надаємо REST API та webhook-сповіщення для синхронізації з вашою LMS. Можлива інтеграція через LTI 1.3 або кастомні конектори. Архітектура дозволяє вбудувати модуль у будь-яку платформу — Moodle, Canvas, самописну систему. При використанні LTI 1.3 студенти та курси імпортуються автоматично, а оцінки передаються назад до журналу LMS.

Процес і терміни розробки

Що входить у роботу

  • Повне проєктування — ER-діаграми, API-специфікація (OpenAPI)
  • Фронтенд — React / Next.js з адаптивним дизайном та підтримкою сенсорних пристроїв
  • Бекенд — Laravel / Node.js з PostgreSQL і Redis
  • Інтеграція — LTI 1.3, REST API, webhooks для вашої LMS
  • Документація — інструкції для викладачів і студентів
  • Навантажувальне тестування — до 10 000 одночасних запитів
  • Підтримка 1 місяць — безкоштовно після запуску

Типові терміни

Тип завдання Термін розробки
Базова система (текст, файли, статуси) 5–7 днів
Додавання online-редактора коду (Monaco) +3–4 дні
Quiz і автоматична перевірка +3–5 днів
Peer review +4–6 днів
Повний функціонал (все разом) 10–14 днів

Терміни варіюються залежно від складності інтеграції та кількості типів завдань. Оцінку за вашим проєктом даємо безкоштовно за 1 день.

Чому обирають нас?

  • 10+ років на ринку розробки освітніх платформ
  • 50+ впроваджень для вишів, онлайн-шкіл та корпоративних університетів
  • Сертифіковані інженери Laravel, React, AWS
  • Гарантія на код — 6 місяців
  • Відкритість — передаємо вихідний код, міграції, CI/CD пайплайн

Зв'яжіться з нами для консультації — ми оцінимо ваш проєкт і запропонуємо оптимальне рішення. Замовте розробку під ключ і отримайте систему, яка реально спрощує перевірку завдань. Отримайте безкоштовну оцінку вашого проєкту за 1 день.

Послуги бекенд-розробки: production-grade надійність

На production-сервері о 3:14 ночі черга Laravel Jobs перестала оброблятися — 40 000 необроблених завдань у Redis. Причина: worker упав через memory leak у статичній змінній Eloquent observer, supervisor не перезапустив через misconfigured stopwaitsecs. Ми розбирали такий інцидент на проекті з 500 RPS: діагностика 4 години, фікс — 20 хвилин. Щоб ви не втрачали гроші, пропонуємо послуги бекенд-розробки з акцентом на production-grade надійність — 10+ років досвіду, 50+ проектів, 5 років на ринку. Оцінимо ваш проект за 2 дні.

Які проблеми вирішуємо

N+1 запити: головний вбивця швидкості

N+1 — найпоширеніша причина повільних сторінок у Laravel-додатках. Стандартна історія: сторінка працювала нормально на dev з 10 записами, на production з 10 000 — 8-секундне завантаження.

Laravel Debugbar у dev-оточенні показує кількість запитів. Більше 20 — сигнал для audit.

Model::preventLazyLoading(! app()->isProduction());

Telescope для профілювання: логує всі запити, jobs, mail, notifications з деталізацією. Після впровадження eager loading час завантаження сторінки падає з 8 с до 0.3 с — у 27 разів.

Memory leak у статичних змінних

У Laravel Octane або Swoole додаток тримається в пам’яті між запитами. Статичні змінні не скидаються — призводять до неконтрольованого росту пам’яті. Використовуємо defer-функції та контейнерні біндинги для коректного скидання стану.

Неправильний connection pool

Rails, Laravel, Django відкривають нове з'єднання PostgreSQL на кожен PHP/Python процес. 100 воркерів — 100 з'єднань. PostgreSQL деградує від 200+ активних з'єднань через overhead на управління.

PgBouncer у transaction pooling: 1000 воркерів → 20–50 реальних з'єднань. Це знижує latency на 40% та зменшує витрати на хостинг на 30% — при середній вартості хостингу $2,000/міс економить $600/міс. GIN-індекс для JSONB до 100 разів швидший за B-tree при пошуку.

Як Octane справляється з високим навантаженням?

Laravel Octane (RoadRunner або Swoole) прибирає overhead bootstrap на кожен HTTP-запит. Приріст: 3–8x на синтетичних бенчмарках, 2–4x на реальних додатках. Важливо: не зберігати стан у статичних змінних — застосовуємо це на проектах >1000 RPS.

Як PostgreSQL допомагає уникнути повільних запитів?

Використовуємо composite indexes для WHERE + ORDER BY, partial indexes для фільтрів з високою селективністю, GIN-індекси для JSONB та full-text search. to_tsvector + GIN замість LIKE '%query%' — запобігає seq scan навіть на мільйонах записів. Аналізуємо плани через EXPLAIN ANALYZE та pg_stat_statements.

Як обрати стек для вашого проекту?

Стек Коли використовувати
Laravel + Octane CRUD, бізнес-логіка, REST/GraphQL API, адмінки
Node.js (Fastify) Realtime WebSocket, streaming, serverless, висока I/O concurrency
Go Високонавантажені мікросервіси (>10k RPS), gRPC, DevOps-інструменти
Django + DRF ML-пайплайни, інтеграція з AI, складна обробка даних
Ruby on Rails Швидкий MVP з багатим екосистемою гемів

Node.js виправданий для realtime: Laravel публікує події в Redis Pub/Sub, Node.js підписується та транслює клієнтам. Go — для goroutines (10k з'єднань на сервер — норма), але розробка повільніша, ніж Laravel.

Чому Redis критичний для продуктивності?

Redis виконує кілька ролей:

Роль Деталі
Кеш Кешування результатів важких запитів, фрагментів HTML
Черги Backend для Laravel Queue / Celery
Session store Distributed sessions в multi-instance оточенні
Pub/Sub Realtime події між сервісами
Rate limiting Sliding window counters для API throttling
Leaderboards Sorted Sets для рейтингів

Redis Cluster для горизонтального масштабування, Sentinel для автоматичного failover. Замовте консультацію щодо оптимізації Redis для вашого проекту.

Що входить в роботу під ключ

  • Архітектурне проектування (документація API, схема БД, діаграма сервісів)
  • Реалізація за узгодженим ТЗ з code review
  • Налаштування CI/CD (GitHub Actions, Docker), моніторингу (Sentry, Grafana), алертингу
  • Навантажувальне тестування (k6, wrk) зі звітом
  • Передача вихідних кодів, доступів, інструкція з деплою
  • Навчання команди замовника (2–3 сесії)
  • Гарантійна підтримка 1 місяць після здачі

Орієнтири по термінах

Задача Термін
REST API для мобільного/SPA (середня складність) 6–12 тижнів
Backend зі складною бізнес-логікою + інтеграції 12–20 тижнів
Високонавантажений сервіс на Go 8–16 тижнів
Міграція legacy PHP на Laravel 16–32 тижні

Вартість розраховується індивідуально після аналізу вимог до навантаження, інтеграцій та бізнес-логіки. Зв'яжіться з нами для безкоштовного аудиту вашого поточного backend — отримайте план оптимізації за 2 дні. Замовте консультацію та дізнайтеся, як знизити витрати на інфраструктуру на 30% без втрати продуктивності.