Plateforme E-Learning

Plateforme e-learning full-stack Laravel + Vue 3 avec rôles admin/enseignant/étudiant, modules/leçons, quiz, certificats et suivi de progression.

RôleDéveloppeur full-stack (solo)
Année2026
Laravel 10Vue 3 (Composition API + Pinia)ViteMySQLRedisDockerSanctum (HttpOnly cookies + CSRF)PHPUnitVitestGitHub Actions
Plateforme E-Learning
3Rôles : admin, enseignant, étudiant
200 MoTaille max. d'un fichier de leçon
0–100Seuil de réussite des quiz configurable
DockerEnvironnement de dev et de déploiement reproductible

Le défi

  • Problème Les étudiants apprenaient passivement sans explications claires. Il fallait un système où ils peuvent apprendre à leur rythme, choisir des matières, être évalués et obtenir des certificats.
  • Contraintes Développement solo, apprentissage de Laravel et Docker, hébergement local instable (XAMPP), délai serré avant la présentation, budget nul.
  • Principal obstacle Séparation RBAC complexe entre admin, formateur et apprenant. XAMPP est tombé en panne le jour de la présentation.
  • Cause Modélisation des rôles complexe ; Apache/MySQL de XAMPP instable.
  • Solution immédiate Refactorisation de la logique des rôles, régénération des clés, restructuration du schéma BD et migration vers MySQL sur WAMP.

L'approche

  • RBAC Gates/Middleware Laravel (can:apprenant, can:manage-courses, can:admin) + gardes de navigation Vue Router.
  • Architecture API-first Laravel + SPA Vue 3 (Composition API + Pinia + Vite), authentification Sanctum (cookies HttpOnly + CSRF, pas de JWT dans localStorage).
  • Entités Cours, Module, Lecon, Quiz, Question, TentativeQuiz, Inscription; leçons terminées (lecons_terminees); soft deletes, is_active, role sur User.
  • Évaluation Soumission transactionnelle, scoring (insensible à casse, espaces ignorés), pourcentage vs scoreMinimal (0–100, défaut 50, seed 60–70). Stocke TentativeQuiz (score, reussi, reponses). Réponses correctes masquées via makeHidden('bonneReponse'); contrôle d'accès selon rôle/propriété/inscription.
  • Sécurité Rate-limiting (quiz 10/5min, login 5/min, register 10/h).
  • Fichiers Upload de leçons (PDF, vidéo, image) jusqu'à 200MB.
  • Performance/Qualité Eager loading pour éviter N+1, Redis stats admin, pagination, export CSV par chunks, tests PHPUnit, Vitest, Pint/ESLint, CI GitHub Actions.
  • Infra Docker (Apache+PHP-FPM, Nginx, MySQL 8, Redis 7, phpMyAdmin opt.), déployé via AlwaysData + Docker; passage de XAMPP à WAMP.
Impact

Apprécié par l'enseignant et le jury pour son adéquation aux besoins réels ; certificat délivré à la fin du parcours.

Captures d'écran

Ce que je ferais différemment

  • Le stack Apache/MySQL de XAMPP est tombé en panne le jour de la présentation. La prochaine fois, je conteneuriserais dès le premier commit — Docker a rendu l'environnement reproductible, mais je ne l'ai adopté que tard.
  • La séparation des permissions admin / enseignant / étudiant s'est emmêlée parce que je l'ai modélisée en construisant. J'écrirais désormais la matrice des rôles et les policies avant le premier contrôleur.
  • J'ai appris Laravel et Docker de zéro avec une échéance serrée. Je prévoirais une phase d'exploration pour les outils inconnus plutôt que de les apprendre pendant le développement.