ajoute Quiz flash (chantier vrai cockpit, étape 2) : QCM et vrai/faux, lancé en direct, indépendant d'une séance de lab
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
45f8a69e26
commit
16d1293911
24 changed files with 1249 additions and 5 deletions
|
|
@ -0,0 +1,28 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
/**
|
||||
* Chantier « vrai cockpit », étape 2 : Quiz flash. Une classe a une banque
|
||||
* de quiz réutilisables (créés par le prof), chacun lancé en direct quand
|
||||
* il le décide (table sessions_quiz).
|
||||
*/
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('quizzes', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->foreignId('classe_id')->constrained()->cascadeOnDelete();
|
||||
$table->string('titre');
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('quizzes');
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('questions_quiz', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->foreignId('quiz_id')->constrained()->cascadeOnDelete();
|
||||
$table->text('enonce');
|
||||
$table->string('type')->comment('qcm, vrai_faux');
|
||||
$table->unsignedSmallInteger('ordre')->default(0);
|
||||
// Seulement pour le type vrai_faux : les choix du QCM sont dans
|
||||
// choix_questions_quiz, chacun avec son propre est_correct.
|
||||
$table->boolean('reponse_vrai_faux')->nullable();
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('questions_quiz');
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('choix_questions_quiz', function (Blueprint $table) {
|
||||
$table->id();
|
||||
// constrained() devinerait "question_quizzes" (pluriel anglais du
|
||||
// nom de colonne) : notre table s'appelle "questions_quiz".
|
||||
$table->foreignId('question_quiz_id')->constrained('questions_quiz')->cascadeOnDelete();
|
||||
$table->string('texte');
|
||||
$table->boolean('est_correct')->default(false);
|
||||
$table->unsignedSmallInteger('ordre')->default(0);
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('choix_questions_quiz');
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
/**
|
||||
* Un lancement en direct d'un quiz (indépendant d'une séance de lab, voix
|
||||
* d'Adam le 2026-10-12) : les élèves de la classe le voient apparaître sur
|
||||
* leur tableau de bord sans rien faire — pas de code à saisir, ils sont
|
||||
* déjà des comptes réels de la classe.
|
||||
*/
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('sessions_quiz', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->foreignId('quiz_id')->constrained()->cascadeOnDelete();
|
||||
$table->string('statut')->default('en_attente')->comment('en_attente, en_cours, terminee');
|
||||
$table->foreignId('question_quiz_courante_id')->nullable()->constrained('questions_quiz')->nullOnDelete();
|
||||
$table->timestamp('demarree_a')->nullable();
|
||||
$table->timestamp('terminee_a')->nullable();
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('sessions_quiz');
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
/**
|
||||
* Une réponse d'un élève à une question, pendant une session de quiz en
|
||||
* direct. Un seul envoi compte (contrainte d'unicité) : un élève ne peut
|
||||
* pas changer d'avis après coup, ni répondre deux fois à la même question.
|
||||
*/
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('reponses_quiz', function (Blueprint $table) {
|
||||
$table->id();
|
||||
// constrained() devine le nom de la table à partir du nom de la
|
||||
// colonne (pluriel anglais) : nos tables ont un nom différent
|
||||
// (sessions_quiz, questions_quiz, choix_questions_quiz), donc
|
||||
// toujours précisé explicitement ici.
|
||||
$table->foreignId('session_quiz_id')->constrained('sessions_quiz')->cascadeOnDelete();
|
||||
$table->foreignId('question_quiz_id')->constrained('questions_quiz')->cascadeOnDelete();
|
||||
$table->foreignId('eleve_id')->constrained()->cascadeOnDelete();
|
||||
$table->foreignId('choix_question_quiz_id')->nullable()->constrained('choix_questions_quiz')->nullOnDelete();
|
||||
$table->boolean('reponse_vrai_faux')->nullable();
|
||||
$table->boolean('correcte');
|
||||
$table->timestamp('repondu_a');
|
||||
$table->timestamps();
|
||||
|
||||
$table->unique(['session_quiz_id', 'question_quiz_id', 'eleve_id']);
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('reponses_quiz');
|
||||
}
|
||||
};
|
||||
Loading…
Add table
Add a link
Reference in a new issue