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.

Année
BUT2, 2025–2026
Type
SAÉ
Domaine
Développement
Période
septembre 2025 – janvier 2026
Stack
Oracle PL/SQL, MySQL, PHP, Java, API REST
Page « Constitution des groupes » de l’application web : en-tête bleu nuit de l’université, menu latéral de cinq boutons grenat (Consulter promotions, Constitution groupes, Gestion étudiants, Gestion Sondages, Mes informations), puis une carte avec le sélecteur de promotion (P_B, 30 étudiants à répartir, 2 groupes estimés), deux cartes de choix « Automatique » et « Manuelle », et le formulaire de répartition automatique déplié : nombre de groupes souhaités, critères d’équilibrage (Mixité H/F cochée, Niveau scolaire), bouton « Générer les groupes ».
Constitution des groupes — mode automatique, données factices20 écransOuvrir la visite

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.

01 sur 08

Tableau 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.

Accès

  • Page de connexion : en-tête bleu nuit avec le logo de l’université et un bouton « Connexion », carte centrée « Connexion à la plateforme pédagogique » avec le champ Email (identifiant) rempli de « respfil » et le champ Mot de passe masqué, un bouton grenat « Connexion » et un lien « Mot de passe oublié ? », pied de page bleu nuit à trois colonnes., ouvrir la capture complète
    Connexion à 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

  • Tableau de bord : menu latéral de cinq boutons grenat (Consulter promotions, Constitution groupes, Gestion étudiants, Gestion Sondages, Mes informations), carte « Bienvenue » avec la mention « Espace de pilotage de la filière. », carte « Mes informations » avec un e-mail sur example.org et le rôle Responsable Filière, pied de page bleu nuit., ouvrir la capture complète
    Tableau 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

  • Page « Annuaire des Promotions » : trois cartes empilées, P_A Semestre 3 (Réalisation d’applications : conception, développement, validation), P_B Semestre 3 (Déploiement d’applications communicantes et sécurisées) et P_C Semestre 5 (Administration, gestion et exploitation des données), chacune avec l’année 2025-2026 et un lien « Voir la liste »., ouvrir la capture complète
    Annuaire 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 ».
  • Page « P_A - Semestre 3 (2025-2026) » avec le badge « Groupes publiés », une carte portant les boutons « Import / Export CSV » et « Dépublier les groupes », puis, sous « Choisir un groupe », deux cartes Groupe A (Effectif 18 / 18, ID 1) et Groupe B (Effectif 18 / 18, ID 2)., ouvrir la capture complète
    Groupes 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.
  • Page « P_A - Semestre 3 (2025-2026) — Groupe A » : tableau à dix colonnes (Numéro, Nom, Prénom, Email, Genre, Bac, Redoublant, Anglophone, Apprenti, Groupe), une ligne par étudiant avec des e-mails sur etu.example.org et des « Oui » en gras pour les anglophones et les apprentis ; la liste continue sous le bord de la fenêtre., ouvrir la capture complète
    Liste 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

  • Page « Constitution des groupes » : sélecteur de promotion, « Nombre d’étudiants à répartir : 30 », « Estimation nombre de groupes : 2 », deux cartes « Automatique » (L’algorithme répartit équitablement, bouton Choisir) et « Manuelle » (Glisser-déposer pour constituer les groupes), puis le bloc « Lancer la répartition automatique » avec le champ Nombre de groupes souhaités à 2, les cases Mixité H/F (cochée) et Niveau scolaire (si notes dispo), et le bouton « Générer les groupes »., ouvrir la capture complète
    Constitution 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.
  • Page « Répartition Manuelle », P_B Semestre 3, 30 étudiants : bouton « Retour », boutons « + Ajouter un groupe » et « Réinitialiser les groupes », puis le tableau « Liste des étudiants » (Nom, Prénom, Redoublant, Anglophone, Groupe, Action) où chaque ligne porte une liste déroulante Groupe A ou Groupe B et un bouton « Retirer »., ouvrir la capture complète
    Ré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é

  • Page « Contrôle Qualité des Groupes » : bouton « Retour à la constitution », bloc « Vue d’ensemble » avec quatre cases (Nombre de groupes 2, Total étudiants 36, Score moyen 91 %, Covoiturages 19 / 21), puis le bloc « Groupe A » (Score 93,1 %, Effectif 18 étudiants, Répartition Genre : Hommes 8 (44,4 %), Femmes 10 (55,6 %))., ouvrir la capture complète
    Contrô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

  • Page « Gestion des étudiants » : bouton vert « Ajouter un étudiant », tableau (Nom, Prénom, Email, Redoublant, Anglophone, Apprenti, Groupe, Actions) où chaque ligne porte un badge rond grenat Groupe A ou Groupe B et un bouton d’action gris sans icône., ouvrir la capture complète
    Gestion 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.
  • Page « Ajouter un étudiant » : bouton « Retour », puis un formulaire à champs pleine largeur Prénom, Nom, Email, Login (optionnel), Mot de passe *, et trois listes « — Choisir — » pour Parcours, Type bac et Mention bac., ouvrir la capture complète
    Ajout 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

  • Page « Résultats du sondage », question « Quel parcours souhaitez-vous suivre au semestre 4 ? » : tableau Statistiques (Réalisation d’applications 19, Déploiement d’applications 6, Administration et exploitation des données 5), puis tableau « Détail (étudiants ayant répondu) » avec Numéro, Nom, Prénom, Login, Rang et Réponse., ouvrir la capture complète
    Ré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

  • Texte en police à chasse fixe sur fond blanc : une ligne « GET /api/index.php?endpoint=promotions -> 200 OK application/json; charset=utf-8 », puis un objet JSON avec « success » à true et un tableau « data » de trois promotions portant id (2025-2026|3|P_A, 2025-2026|3|P_B, 2025-2026|5|P_C), annee, semestre, parcours, nomParcours, label, nbEtudiants (36, 26) et nbGroupes (2)., ouvrir la capture complète
    Ré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

  • Fenêtre Windows « SAE S301 - Constitution de Groupes - Connexion » : titre « Application de constitution de grou… » tronqué, sous-titre « Connectez-vous à votre espace », carte avec les champs Identifiant (respfil) et Mot de passe masqué, bouton bleu « Se connecter »., ouvrir la capture complète
    Client 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.
  • Fenêtre « SAE S301 - Constitution de Groupes » : bandeau bleu nuit avec le logo de l’université, « Bienvenue » suivi du nom du compte de démonstration, un bouton « Responsable filière » et un bouton blanc sans libellé lisible ; menu latéral de cinq boutons grenat ; carte « Bienvenue… ! » avec « Espace de pilotage de la filière. » ; carte « Mes informations » avec un e-mail sur example.org et le rôle Responsable Filière., ouvrir la capture complète
    Client 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.
  • Fenêtre « SAE S301 - Constitution de Groupes - Promotions » : carte-titre « Liste des Promotions », tableau à cinq colonnes (Parcours, Semestre, Année, Nb étudiants, Nb Groupes) avec trois lignes (S3, 36 étudiants, 2 groupes ; S3, 26, 2 ; S5, 32, 2), en bas un bouton gris « Retour au Menu » et un bouton bleu « Voir les étudiants »., ouvrir la capture complète
    Client 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.
  • Fenêtre au titre « Réalisation d’applications : conception, développement, validation - S3 (2025-2026) » : une ligne de statistiques (Total 36, Filles 17, un mot mal encodé pour Garçons 19, Redoublants 3, Anglophones 7, Apprentis 3), puis un tableau (Nom, Prénom, Genre, Email, Groupe, Redoublant, Anglophone, Covoiturage) avec une barre de défilement ; en bas à droite, un bouton au libellé invisible., ouvrir la capture complète
    Client 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

  • Fenêtre « SAE S301 - Constitution de Groupes - Constitution des Groupes » : carte-titre « Constitution des Groupes », « Choisissez une promotion et un mode de répartition », liste déroulante « Sélectionner une promotion » (P_A, S3, 36 étudiants), « Choisir le mode de répartition », puis deux cartes « Répartition Manuelle » (bleue, Glisser-déposer les étudiants dans les groupes) et « Répartition Automatique » (verte, Utiliser les algorithmes de répartition automatique), bouton gris « Retour au Menu »., ouvrir la capture complète
    Client 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).
  • Fenêtre « SAE S301 - Constitution de Groupes - Répartition Automatique » : à gauche le panneau « Configuration des contraintes et algorithmes » (Taille minimum 17, maximum 20, cible 18 ; Algorithme « Glouton - Redoublants équilibrés » ; quatre cases Équilibrer la mixité, Respecter les groupes de covoiturage, Regrouper les redoublants, Regrouper les anglophones ; un bouton au libellé invisible), à droite le panneau « Résultats » (Statistiques globales : 2 groupes, 36 étudiants, 17 filles (47,2 %), 19 garçons, 3 redoublants, 7 anglophones ; tableau Groupe 1 : 18, 7, 11, 2, 7 et Groupe 2 : 18, 10, 8, 1, 0) ; au centre, une boîte de dialogue « Succès » : « Répartition générée avec succès ! », bouton OK., ouvrir la capture complète
    Client 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 ! ».
  • Fenêtre « SAE S301 - Constitution de Groupes - Répartition Manuelle » : panneau « Étudiants non affectés » avec un tableau (Nom, Prénom, Groupe actuel) et une barre de défilement, panneau « Groupes » avec deux listes « Groupe A (18/18) » et « Groupe B (18/18) » suivies chacune d’un bouton à cadre bleu et d’un bouton à cadre rouge sans libellé lisible ; en bas, deux boutons au libellé invisible., ouvrir la capture complète
    Client 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.
  • Fenêtre « SAE S301 - Constitution de Groupes - Gestion des étudiants » : carte-titre avec « Promotion » et une liste déroulante, bouton vert « + Ajouter un étudiant », tableau (Nom, Prénom, Email, Groupe, Actions) dont chaque ligne porte un badge grenat Groupe A ou Groupe B et deux petits boutons jaune et rouge ; bouton gris « Retour au menu »., ouvrir la capture complète
    Client 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.

01 sur 01

Tableau de bord du responsable de filière

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.

Une seule logique métier traverse toutes les couches. données expose équilibre Base MySQLaccès par PDO Moteurd’affectationbacktracking · glouton API RESTcommunication Site PHPgère · visualise Client Java MVCclient lourd Groupes équilibrésmixité · redoublants · options
1 / 5

  1. 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).
  2. Moteur d’affectation. Le moteur combine backtracking et algorithmes gloutons multi-critères.
  3. Groupes équilibrés. Il équilibre les groupes selon la mixité, les redoublants et les options.
  4. API REST. Une API REST découple les couches ; l’ensemble communique par elle.
  5. Site PHP et client Java. Le site PHP gère et visualise les flux ; le client lourd Java, en MVC, interroge le serveur distant.
Fig. 1 — La chaîne multi-tiers : le moteur d’affectation entre la base MySQL et les interfaces servies par l’API REST. Parcours pas à pas au clavier (← →).

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é.

Vivier 20 étudiants — 12 F · 8 M · 5 redoublants · A 6 · B 6 · C 8. Cible par groupe de 5 : F 3 · red. 1–2 · A 1–2 · B 1–2 · C 2.
Groupe 1 5/5
CABCC
F/M
3/2
red.
1
A/B/C
1/1/3
Groupe 2 5/5
BCBAC
F/M
2/3
red.
2
A/B/C
1/2/2
Groupe 3 5/5
ABACC
F/M
3/2
red.
0
A/B/C
2/1/2
Groupe 4 5/5
BABCA
F/M
4/1
red.
2
A/B/C
2/2/1
Déséquilibre global effectifs hors cible, tous groupes et cinq comptes confondus — 0 = équilibré
Glouton520 placements, un seul passage
Backtracking0327 nœuds

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.

Fig. 2 — Le moteur d’affectation simplifié, sur une promotion fictive : glouton et backtracking, comparés sur un même score de déséquilibre.

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étences du référentiel BUT Informatique démontrées dans ce projet : niveau, ce que le projet montre et preuve.
CompétenceNiveauCe que le projet montre, et preuve
RéaliserRéaliser un développement d’applicationNiveau 2Dé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’informationNiveau 2Concevoir 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 informatiqueNiveau 2Travailler en équipe avec des rôles répartis.Preuve : Organisation agile par rôles (backend, frontend, base, algorithmique) et documentation UML.