Plateforme d’affectation des étudiants en groupes
Site PHP sur MySQL, API REST et client Java MVC autour d’un moteur d’affectation, avec un rendu base de données en Oracle PL/SQL.

En bref
- Problème
- Affecter automatiquement des étudiants sous de nombreuses contraintes, du stockage à l’affichage.
- Ce que j’ai réalisé
- Un site PHP sur MySQL, une API REST, un client lourd Java en MVC, un moteur d’affectation par backtracking et glouton, et un rendu base de données en Oracle PL/SQL.
- Résultat
- Les groupes sont équilibrés selon la mixité, les redoublants et les options ; l’ensemble communique par l’API.
- Rôle
- Développeur du site PHP, en entier.
- Équipe
- 3 personnes
- Statut
- Terminé
La plateforme, écran par écran
Démonstration locale sur un jeu de données entièrement factice : étudiants, enseignants, e-mails (example.org) et notes inventés, comptes de rôle de démonstration ; aucune personne réelle. Rendu non retouché : capture hors ligne, donc sans les icônes chargées depuis un CDN ; sous Windows, plusieurs boutons du client Java s’affichent blancs sur blanc.
Accès
, ouvrir la capture complèteConnexion à la plateforme Identifiant et mot de passe ; le compte de démonstration est celui d’un responsable de filière, dont dépend le menu affiché ensuite.
Tableau de bord
, ouvrir la capture complèteTableau de bord du responsable de filière Après connexion, le menu latéral n’affiche que les actions du rôle : promotions, constitution des groupes, étudiants, sondages, informations du compte.
Promotions et groupes
, ouvrir la capture complèteAnnuaire des promotions Trois promotions dérivées de la table GROUPE, chacune avec son parcours, son semestre, son année et un lien « Voir la liste ».
, ouvrir la capture complèteGroupes d’une promotion La promotion P_A a ses groupes publiés : import et export CSV, dépublication, puis les cartes Groupe A et Groupe B, 18 étudiants chacun.
, ouvrir la capture complèteListe pédagogique d’un groupe Pour chaque étudiant du groupe A : numéro, nom, prénom, e-mail, genre, bac, redoublant, anglophone et apprenti ; noms et adresses sont inventés.
Constitution et répartition
, ouvrir la capture complèteConstitution des groupes — mode automatique Pour la promotion P_B (30 étudiants, 2 groupes estimés), le choix entre répartition automatique et manuelle, puis le formulaire automatique : nombre de groupes et critères d’équilibrage.
, ouvrir la capture complèteRépartition manuelle Ajout ou réinitialisation des groupes, puis chaque étudiant de la promotion avec un sélecteur de groupe et un bouton Retirer.
Contrôle qualité
, ouvrir la capture complèteContrôle qualité des groupes Vue d’ensemble de la promotion P_A (2 groupes, 36 étudiants, score moyen 91 %, covoiturages 19 sur 21), puis le détail par groupe : score, effectif, répartition par genre.
Étudiants
, ouvrir la capture complèteGestion des étudiants Tableau de tous les étudiants de la filière : redoublant, anglophone, apprenti, badge du groupe et actions ; un bouton pour en ajouter un.
, ouvrir la capture complèteAjout d’un étudiant Prénom, nom, e-mail, login facultatif, mot de passe, puis parcours, type et mention de bac en listes déroulantes.
Sondage
, ouvrir la capture complèteRésultats d’un sondage Le sondage « Choix du parcours en S4 » : nombre de réponses par parcours (19, 6, 5), puis le détail des répondants avec leur rang de choix.
API
, ouvrir la capture complèteRéponse JSON de l’API REST GET /api/index.php?endpoint=promotions, 200 OK : les trois promotions avec identifiant, année, semestre, parcours, effectif et nombre de groupes, telles que le client Java les lit (JSON indenté et ligne de titre ajoutés pour la capture).
Client Java — accès et promotions
, ouvrir la capture complèteClient Java — connexion Le client lourd Swing s’ouvre sur sa propre fenêtre de connexion ; il dialogue ensuite avec le serveur par l’API REST.
, ouvrir la capture complèteClient Java — tableau de bord La même structure que le site : en-tête de l’université, menu latéral grenat, bienvenue et informations du compte ; le bouton de déconnexion, en haut à droite, s’affiche blanc sur blanc.
, ouvrir la capture complèteClient Java — liste des promotions Un tableau Swing (parcours, semestre, année, effectif, nombre de groupes) rempli par GET ?endpoint=promotions ; une ligne sélectionnée ouvre ses étudiants.
, ouvrir la capture complèteClient Java — détail d’une promotion Statistiques de la promotion P_A (36 étudiants, 17 filles, 19 garçons, 3 redoublants, 7 anglophones, 3 apprentis) et le tableau des étudiants chargé par ?endpoint=etudiants ; le mot « Garçons » arrive mal encodé depuis le code source.
Client Java — constitution et étudiants
, ouvrir la capture complèteClient Java — choix du mode de répartition Sélection de la promotion, puis deux grandes cartes : répartition manuelle (glisser-déposer) ou automatique (algorithmes).
, ouvrir la capture complèteClient Java — répartition automatique Tailles minimale, maximale et cible, algorithme « Glouton - Redoublants équilibrés », contraintes optionnelles ; à droite, le résultat : deux groupes de 18 avec filles, garçons, redoublants et anglophones par groupe, et la boîte « Répartition générée avec succès ! ».
, ouvrir la capture complèteClient Java — répartition manuelle À gauche, tous les étudiants de la promotion avec leur groupe actuel ; à droite, les listes Groupe A (18/18) et Groupe B (18/18), chacune suivie de deux boutons dont le libellé ne se lit pas.
, ouvrir la capture complèteClient Java — gestion des étudiants Sélecteur de promotion, bouton d’ajout, puis le tableau nom, prénom, e-mail, badge du groupe et deux boutons d’action par ligne.
Sommaire7 sections
Contexte
Projet transverse du semestre 3, en équipe agile. Il fallait gérer automatiquement l’affectation d’étudiants sous un ensemble de contraintes, de la base de données jusqu’à l’interface. J’ai réalisé tout le site PHP.
Le problème
Une seule logique métier (équilibrer des groupes) devait traverser plusieurs couches : stockage, service web, application de bureau et moteur de calcul. L’équipe devait concevoir l’architecture de la chaîne et l’algorithme d’affectation.
Démarche et décisions
Un site PHP, sur une base MySQL interrogée par PDO, gère et visualise les flux de données. Pour le rendu « base de données » de la SAÉ, une base Oracle a été scriptée en PL/SQL, avec des vues, des triggers d’audit et des procédures stockées. Une API REST assure la communication entre le site et un client lourd Java, construit en MVC et interrogeant le serveur distant. Au cœur du système, un moteur d’affectation combine backtracking et algorithmes gloutons multi-critères pour équilibrer les groupes selon la mixité, les redoublants et les options. L’équipe s’est répartie en rôles (backend, frontend, base de données, algorithmique), avec une conception UML et une documentation technique.
- Base MySQL. La base MySQL conserve les données du site PHP, qui y accède par PDO. Le rendu base de données de la SAÉ est scripté à part, en Oracle PL/SQL (vues, triggers d’audit, procédures stockées).
- Moteur d’affectation. Le moteur combine backtracking et algorithmes gloutons multi-critères.
- Groupes équilibrés. Il équilibre les groupes selon la mixité, les redoublants et les options.
- API REST. Une API REST découple les couches ; l’ensemble communique par elle.
- Site PHP et client Java. Le site PHP gère et visualise les flux ; le client lourd Java, en MVC, interroge le serveur distant.
Résultat
L’équipe a testé le moteur sur des jeux de données. Selon ses mesures, l’affectation s’y exécute en un temps quasi linéaire.
Pour cette page, le moteur a été réécrit sous une forme simplifiée (figure 2). Cette réécriture répartit une promotion fictive de 16 à 24 étudiants (F ou M, redoublant ou non, option A, B ou C) en quatre groupes de même taille. Son glouton place chaque étudiant, dans l’ordre d’arrivée, dans le groupe non plein qui creuse le moins l’écart. Son backtracking part de cette solution et traite d’abord les attributs les plus rares. Il élague par borne inférieure et s’arrête au premier déséquilibre nul ou après 20 000 nœuds. Le score de la figure compte les effectifs hors de la fourchette cible, tous groupes et cinq comptes confondus : 0 signifie équilibré.
- F/M
- 3/2
- red.
- 1
- A/B/C
- 1/1/3
- F/M
- 2/3
- red.
- 2
- A/B/C
- 1/2/2
- F/M
- 3/2
- red.
- 0
- A/B/C
- 2/1/2
- F/M
- 4/1
- red.
- 2
- A/B/C
- 2/2/1
F · M · redoublant (bord doublé) · lettre : option A, B ou C · chiffre : hors cible.
Prêt. Choisissez une stratégie ; les placements se déposent un à un.
Sans JavaScript, l’exemple ci-dessus est figé (graine 25, plateau du glouton) ; avec JavaScript, deux boutons lancent chaque stratégie, « Mélanger » tire une autre promotion et « Réinitialiser » vide les groupes.
Ce que j’ai appris
J’ai suivi une même donnée à travers toutes les couches : stockage dans MySQL, affectation par le moteur, affichage dans le site PHP et le client Java. Avec l’API REST, j’ai compris l’intérêt de découpler un client lourd d’un serveur. J’ai pratiqué le travail agile, avec des rôles répartis dans l’équipe.
Limites et suite
L’équilibrage n’est garanti que sous les contraintes testées. À plus grande échelle, il faudrait mesurer les temps réels et vérifier que le moteur tient avec des effectifs et des contraintes plus nombreux.
Compétences BUT mobilisées
| Compétence | Niveau | Ce que le projet montre, et preuve |
|---|---|---|
| RéaliserRéaliser un développement d’application | Niveau 2 | Développer une application répartie multi-tiers.Preuve : Client lourd Java en MVC, site PHP et communication par API REST. |
| GérerGérer des données de l’information | Niveau 2 | Concevoir et exploiter une base de données.Preuve : Rendu base de données en Oracle PL/SQL (vues, triggers d’audit, procédures stockées) et base MySQL du site PHP. |
| CollaborerTravailler dans une équipe informatique | Niveau 2 | Travailler en équipe avec des rôles répartis.Preuve : Organisation agile par rôles (backend, frontend, base, algorithmique) et documentation UML. |


