Mini E-Learning Platform

A Laravel + Vue 3 full-stack e-learning platform with role-based access (admin, teacher, student). Features course modules/lessons, quizzes with configurable pass thresholds, certificate issuance on completion, file uploads, and progress tracking.

RoleSolo Full-Stack Developer
Year2026
Laravel 10Vue 3 (Composition API + Pinia)ViteMySQLRedisDockerSanctum (HttpOnly cookies + CSRF)PHPUnitVitestGitHub Actions
Mini E-Learning Platform
3Roles: admin, teacher, student
200 MBLesson upload limit
0–100Configurable quiz pass mark
DockerReproducible dev & deploy stack

The challenge

  • Problem Students were passively consuming content without proper explanations. Needed a platform where learners could study at their own pace, choose subjects, be graded, and earn certificates.
  • Constraints Solo work, had to learn Laravel and Docker from scratch, local hosting was unstable (XAMPP), tight presentation deadline, and zero budget.
  • Hardest blocker Complex RBAC separation between admin, teacher (formateur), and student (apprenant). XAMPP failed on presentation day.
  • Root cause Role modeling was complex; XAMPP Apache/MySQL became unstable.
  • Fix Refactored role logic, regenerated app secrets, restructured DB schema, and migrated from XAMPP to WAMP MySQL.

The approach

  • RBAC Laravel Gates/Middleware (can:apprenant, can:manage-courses, can:admin) with Vue Router navigation guards.
  • Architecture API-first Laravel + Vue 3 SPA (Composition API + Pinia + Vite), auth via Laravel Sanctum (HttpOnly cookies + CSRF, no JWT in localStorage).
  • Domain Cours, Module, Lecon, Quiz, Question, TentativeQuiz, Inscription; lecons_terminees for progress; soft deletes, is_active, role on User.
  • Quiz grading Transactional submission scoring correct answers (case-insensitive trimmed), percentage vs quiz.scoreMinimal (0–100, default 50; seeded 60–70). Stores TentativeQuiz (score, reussi, reponses). Correct answers hidden via makeHidden('bonneReponse'); access controlled by role/ownership/enrollment.
  • Integrity/Security Rate-limiting (quiz 10/5min, login 5/min, register 10/hour).
  • Files Lesson uploads (PDF, video, image) up to 200MB.
  • Performance/Quality Eager loading to avoid N+1, Redis for admin stats, pagination, chunked CSV export, PHPUnit feature tests, Vitest on Pinia stores, Pint/ESLint, GitHub Actions CI.
  • Infra Dockerized (Apache+PHP-FPM, Nginx, MySQL 8, Redis 7, optional phpMyAdmin), deployed via AlwaysData + Docker.
Impact

Recognized by teacher and jury for solving real e-learning workflow needs; certificates issued on completion.

Screenshots

What I'd do differently

  • XAMPP's Apache/MySQL install died on presentation day. Next time I'd containerise from the first commit — Docker made the environment reproducible, but I only adopted it late.
  • Splitting admin / teacher / student permissions got tangled because I modelled it as I built. I'd now write the role matrix and policies before the first controller.
  • I learned Laravel and Docker from scratch against a deadline. I'd spend a focused week on unfamiliar tooling up front instead of learning it during the build.