13 KiB
13 KiB
📊 ÉTAPE 3 AJUSTÉE : TABLEAU NOTES + GRAPHIQUES PAR CLASSE
🎯 AJUSTEMENTS SELON SPECS NICOLAS
Graphiques
- ✅ Histogramme distribution notes PAR CLASSE (multi-barres)
- ✅ Courbe progression PAR ÉLÈVE (line chart multiple students)
- ❌ Pas de pie chart (supprimé)
Tentatives
- Normale : 1 seule tentative par élève
- Exception : Si pb connexion, plusieurs tentatives possibles
- Affichage : Dernière tentative de chaque élève
Export
- Réutiliser :
export.phpexistant (CSV/JSON) ✅ - Lien : Bouton vers
export.php?id_evaluation=X&format=csv - Pas de modifications : Minimiser changements code fonctionnel
Pagination
- Aucune : Affichage complet sans pagination
- Raisons :
- Classes fixes : Max 30 élèves
- Groupe soutien : Max 60-70 élèves
- Performance suffisante pour 100 lignes
📋 SPÉCIFICATIONS FONCTIONNELLES AJUSTÉES
Vue Tableau
Colonnes :
- Rang (calculé selon note)
- Nom Prénom
- Classe
- Note (/20)
- Pourcentage (%)
- Temps passé (HH:MM:SS)
- Statut (Terminé / En cours)
- Date soumission
Fonctionnalités :
- Tri par colonne (clic header)
- Filtrage par classe (dropdown)
- Filtrage par statut (terminé/en cours)
- Recherche élève (nom, prénom)
- Export CSV : Lien vers export.php existant
- Pas de pagination : Affichage complet
Statistiques Générales
Bloc 1 : Synthèse
- Nombre d'élèves total
- Nombre terminé / en cours
- Taux participation (%)
- Temps moyen passé
Bloc 2 : Notes
- Moyenne générale
- Médiane
- Note min / max
- Écart-type
- Taux réussite (≥10/20) en %
Bloc 3 : Par Classe
- Nombre élèves par classe
- Moyenne par classe
- Meilleure classe (moyenne max)
Bloc 4 : Questions
- Question la plus réussie (% bonnes réponses)
- Question la plus échouée (% mauvaises réponses)
Graphiques Chart.js
Graphique 1 : Histogramme Distribution Notes par Classe
- Type : Bar chart (multi-datasets)
- X : Tranches notes (0-5, 5-10, 10-15, 15-20)
- Y : Nombre élèves
- Datasets : 1 barre par classe (couleurs différentes)
- Légende : Classes affichées
- Couleurs : Palette distincte par classe
Graphique 2 : Courbe Progression par Élève
- Type : Line chart (multiple lines)
- X : Numéro question (Q1, Q2, Q3, ...)
- Y : Points cumulés (0 à note_totale)
- Lines : Top 5 élèves + moyenne classe
- Légende : Noms élèves
- Couleurs : Palette distincte par élève
- Tooltip : Détail question + points
🗂️ STRUCTURE FICHIERS
Fichier principal
resultats_evaluation.php (~30 KB estimé)
- Localisation :
/var/www/mathematiques/enseignant/ - Rôle : Interface HTML + CSS + JavaScript inline
- Chart.js : CDN
https://cdn.jsdelivr.net/npm/chart.js@4.4.0 - Paramètre :
?id_evaluation=X - Réutilise : Lien export.php existant
API Backend
resultats_ajax.php (~20 KB estimé)
- Localisation :
/var/www/mathematiques/enseignant/ - Rôle : Retourne JSON avec notes + stats + graphiques data
- Authentification :
$_SESSION['user_id']+type_libelle === 'enseignant' - Requêtes SQL optimisées
🔧 ARCHITECTURE TECHNIQUE
Colonnes tentatives_eleves (vérifiées)
id_tentative (INT)
id_eleve (INT)
id_evaluation (INT)
statut (VARCHAR) : 'en_cours', 'terminee'
reponses_json (TEXT)
note (DECIMAL) : Note obtenue
note_sur (DECIMAL) : Note maximale (20)
pourcentage (DECIMAL) : Pourcentage réussite
temps_passe (INT) : Secondes écoulées
date_debut (TIMESTAMP)
date_fin (TIMESTAMP)
derniere_sauvegarde (TIMESTAMP)
Requête SQL Principale (Dernière tentative par élève)
SELECT
te.id_tentative,
te.id_eleve,
te.note,
te.note_sur,
te.pourcentage,
te.temps_passe,
te.statut,
te.date_fin,
te.reponses_json,
u.nom,
u.prenom,
u.login,
c.nom_classe,
c.id_classe,
-- Calcul rang global
(SELECT COUNT(*) + 1
FROM tentatives_eleves te2
WHERE te2.id_evaluation = te.id_evaluation
AND te2.note > te.note
AND te2.id_tentative IN (
-- Sous-requête: dernière tentative de chaque élève
SELECT MAX(id_tentative)
FROM tentatives_eleves
WHERE id_evaluation = te.id_evaluation
GROUP BY id_eleve
)
) as rang
FROM (
-- Sous-requête: dernière tentative par élève
SELECT id_eleve, MAX(id_tentative) as max_id
FROM tentatives_eleves
WHERE id_evaluation = ?
GROUP BY id_eleve
) dernieres
JOIN tentatives_eleves te ON te.id_tentative = dernieres.max_id
JOIN utilisateurs u ON te.id_eleve = u.id_utilisateur
LEFT JOIN classes c ON u.id_classe = c.id_classe
ORDER BY te.note DESC, te.date_fin ASC
Calculs Statistiques (PHP)
// Notes array (dernières tentatives uniquement)
$notes = array_column($tentatives, 'note');
// Moyenne
$moyenne = array_sum($notes) / count($notes);
// Médiane
sort($notes);
$count = count($notes);
$mediane = ($count % 2 === 0)
? ($notes[$count/2 - 1] + $notes[$count/2]) / 2
: $notes[floor($count/2)];
// Écart-type
$variance = 0;
foreach ($notes as $note) {
$variance += pow($note - $moyenne, 2);
}
$ecart_type = sqrt($variance / count($notes));
// Taux réussite
$reussites = count(array_filter($notes, fn($n) => $n >= 10));
$taux_reussite = ($reussites / count($notes)) * 100;
// Stats par classe
$par_classe = [];
foreach ($tentatives as $t) {
$classe = $t['nom_classe'] ?? 'Sans classe';
if (!isset($par_classe[$classe])) {
$par_classe[$classe] = ['notes' => [], 'count' => 0];
}
$par_classe[$classe]['notes'][] = $t['note'];
$par_classe[$classe]['count']++;
}
foreach ($par_classe as $classe => &$data) {
$data['moyenne'] = array_sum($data['notes']) / count($data['notes']);
}
Données Graphiques
Histogramme par Classe :
{
"labels": ["0-5", "5-10", "10-15", "15-20"],
"datasets": [
{
"label": "TCV",
"data": [1, 3, 8, 12],
"backgroundColor": "rgba(59, 130, 246, 0.6)"
},
{
"label": "1A",
"data": [0, 2, 5, 8],
"backgroundColor": "rgba(34, 197, 94, 0.6)"
}
]
}
Courbe Progression :
{
"labels": ["Q1", "Q2", "Q3", "Q4", "Q5"],
"datasets": [
{
"label": "DUPONT Jean (19/20)",
"data": [4, 8, 12, 16, 19],
"borderColor": "rgb(59, 130, 246)",
"tension": 0.3
},
{
"label": "MARTIN Sophie (18/20)",
"data": [3, 7, 11, 14, 18],
"borderColor": "rgb(34, 197, 94)",
"tension": 0.3
},
{
"label": "Moyenne classe",
"data": [2.5, 5.2, 8.1, 11.3, 14.5],
"borderColor": "rgb(249, 115, 22)",
"borderDash": [5, 5],
"tension": 0.3
}
]
}
🎨 DESIGN INTERFACE
Layout 3 Zones
┌────────────────────────────────────────────────────────┐
│ 📊 Résultats Évaluation : [Titre Évaluation] │
│ [Retour Dashboard] [Export CSV] │
├────────────────────────────────────────────────────────┤
│ 📈 STATISTIQUES GÉNÉRALES │
│ ┌────────┬────────┬────────┬────────┬────────┐ │
│ │ 42 │ 38 │ 15.2 │ 8.5 │ 19.0 │ │
│ │ Élèves │ Terminé│ Moyenne│ Min │ Max │ │
│ └────────┴────────┴────────┴────────┴────────┘ │
│ ┌────────┬────────┬────────┬────────┬────────┐ │
│ │ 14.8 │ 3.2 │ 90% │ TCV │ 01:23 │ │
│ │ Médiane│ Écart-σ│ Réussite│Meilleure│ Temps │ │
│ └────────┴────────┴────────┴────────┴────────┘ │
├────────────────────────────────────────────────────────┤
│ 📊 GRAPHIQUES ANALYTIQUES │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Histogramme Distribution Notes par Classe │ │
│ │ [Chart.js Bar - Multi-datasets] │ │
│ └──────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Courbe Progression par Élève (Top 5 + Moyenne) │ │
│ │ [Chart.js Line - Multiple lines] │ │
│ └──────────────────────────────────────────────────┘ │
├────────────────────────────────────────────────────────┤
│ 📋 TABLEAU DÉTAILLÉ │
│ [Filtre Classe ▼] [Filtre Statut ▼] [Recherche 🔍] │
│ ┌────┬──────────┬────────┬──────┬────────┬──────────┐│
│ │ Rg │ Élève │ Classe │ Note │ % │ Temps ││
│ ├────┼──────────┼────────┼──────┼────────┼──────────┤│
│ │ 1 │ DUPONT │ TCV │19/20 │ 95% │ 01:23:45 ││
│ │ 2 │ MARTIN │ TCV │18/20 │ 90% │ 01:05:12 ││
│ │ 3 │ BERNARD │ 1A │17/20 │ 85% │ 00:58:30 ││
│ │ .. │ ... │ ... │ ... │ ... │ ... ││
│ └────┴──────────┴────────┴──────┴────────┴──────────┘│
│ Total : 42 élèves affichés │
└────────────────────────────────────────────────────────┘
✅ CHECKLIST DÉVELOPPEMENT
Étape 1 : Vérification Structure BDD ✅
- Colonnes tentatives_eleves vérifiées
- Format temps_passe : INT secondes
- Requête dernière tentative par élève
- Jointures users/classes
Étape 2 : Backend API
- Créer
resultats_ajax.php - Authentification
$_SESSION(pattern export.php) - Requête SQL dernières tentatives + rang
- Calculs statistiques (moyenne, médiane, écart-type)
- Stats par classe
- Analyse questions (% réussite par question)
- Progression par élève (points cumulés)
- Formatage données graphiques
- Test retour JSON valide
Étape 3 : Frontend Interface
- Créer
resultats_evaluation.php - Header + navigation
- Section statistiques (8 cards)
- Graphique histogramme par classe
- Graphique courbe progression élèves
- Tableau notes complet
- Filtres classe/statut (JavaScript)
- Recherche élève (JavaScript)
- Tri colonnes (JavaScript)
- Bouton export CSV (lien export.php)
- Responsive design
Étape 4 : Tests
- Tester avec évaluation 23 (test.tcv)
- Vérifier stats cohérentes
- Vérifier graphiques par classe
- Vérifier courbe progression
- Tester filtres/recherche/tri
- Tester export CSV
- Performance <2s chargement 70 élèves
📊 ESTIMATION DURÉE AJUSTÉE
| Tâche | Durée | Détails |
|---|---|---|
| Vérification BDD | ✅ 15 min | Complété |
| Backend API | 60 min | SQL complexe + stats + progression |
| Frontend HTML/CSS | 45 min | Layout + stats + graphiques |
| Frontend JavaScript | 45 min | Filtres + tri + recherche + charts |
| Tests validation | 20 min | Données réelles multi-classes |
| TOTAL | 3h05 | Estimation réaliste |
🚀 PROCHAINE ACTION
Démarrer Backend API : Créer resultats_ajax.php
- Requête SQL dernières tentatives
- Calculs statistiques
- Données graphiques
- Test JSON
Puis Frontend : Interface complète avec Chart.js
Prêt à développer ? 🚀