Académique Documents
Professionnel Documents
Culture Documents
Partie I: Théorie
b. Une période fixe pendant laquelle les fonctionnalités du produit sont développées et livrées
a. 1 semaine
b. 1 mois
c. 3 mois
5. Quel est l'objectif principal de la rétrospective à la fin de chaque sprint dans Scrum?
(le point à la fin indique que le Dockerfile est présent dans le répertoire actuel).
La commande pour supprimer une image Docker est `docker image rm nom_image` en remplaçant
"nom_image" par le nom ou l'ID de l'image que vous souhaitez supprimer.
La commande pour exécuter un fichier docker-compose est `docker-compose up` dans le répertoire
où se trouve le fichier docker-compose.yml.
5. Créer une connexion, un canal et une file d'attente RabbitMQ en utilisant le module amqplib :
setupRabbitMQ();
const messageObj = {
message: message,
utilisateur: utilisateur,
};
channel.sendToQueue(queueName, Buffer.from(JSON.stringify(messageObj)), {
persistent: true });
sendMessageToQueue(req.body.message, req.body.email);
Assurez-vous d'avoir importé le module amqplib et d'avoir une connexion et un canal déjà établis
avant d'appeler cette fonction.
const
queueName = 'ma_file_attente';
// Traiter le message...
channel.ack(message);
}
});
consumeMessageFromQueue();
Assurez-vous d'avoir importé le module amqplib et d'avoir une connexion et un canal déjà établis
avant d'appeler cette fonction.
Le but de cet exercice est de créer un système permettant d'ajouter, de modifier et de supprimer des
livres, ainsi que de les organiser par catégories.
De plus, vous devrez mettre en place des fonctionnalités de validation des données pour assurer
la cohérence des informations saisies par les utilisateurs. Vous aurez également l'opportunité
d'explorer l'utilisation des middlewares pour sécuriser l'accès aux fonctionnalités de gestion des
livres.
Table "Livre":
- id (clé primaire)
- titre (varchar)
- pages (decimal)
- description (texte)
- image (varchar)
Table "Catégorie":
- id (clé primaire)
- nom (varchar)
- description (texte)
1. Créez une fonction appelée "calculerTotalLivresParCategorie" qui prend en paramètre l'ID d'une
catégorie et renvoie le nombre total de livres dans cette catégorie.
l'image et l'ID de la catégorie du livre. La procédure doit également mettre à jour le nombre
UPDATE Categorie
SET totalLivres = calculerTotalLivresParCategorie(p_categorie_id)
WHERE id = p_categorie_id;
END;
3. Créez un déclencheur (trigger) qui se déclenche après l'insertion d'un nouveau livre dans la
table "Livre". Le déclencheur doit mettre à jour le nombre total de livres dans la
4. Écrivez une requête MongoDB pour insérer un document représentant une catégorie dans la
db.Categories.insertOne({
nom: "Nom de la catégorie",
description: "Description de la catégorie"
});
5. Écrivez une requête MongoDB pour insérer plusieurs documents représentant des livres dans
la collection "Livres". Assurez-vous d'inclure les champs "titre", "pages", "description", "image"
et "categorie_id".
db.Livres.insertMany([
{
titre: "Titre du livre 1",
pages: 300,
description: "Description du livre 1",
image: "image1.jpg",
categorie_id: 1
},
{
titre: "Titre du livre 2",
pages: 250,
description: "Description du livre 2",
image: "image2.jpg",
categorie_id: 2
},
{
titre: "Titre du livre 3",
pages: 400,
description: "Description du livre 3",
image: "image3.jpg",
categorie_id: 1
}
]);
6. Écrivez une requête MongoDB pour récupérer tous les livres avec leurs catégories
7. Écrivez une requête MongoDB pour récupérer tous les livres dont le nombre de pages est
supérieur à 200.
8. Écrivez une requête MongoDB pour mettre à jour le titre d'un livre spécifique en utilisant son
ID.
db.Livres.updateOne(
{ _id: ObjectId("ID_DU_LIVRE") },
{ $set: { titre: "Nouveau titre du livre" } }
);
9. Écrivez une requête MongoDB pour supprimer un livre spécifique en utilisant son ID.
10. Écrivez une requête MongoDB pour supprimer tous les livres d'une catégorie spécifique en
Travail à faire:
2. Donnez les lignes de code à ajouter au modèle "Livre" afin que tous les attributs puissent être
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
- "edit" qui renvoie la vue "edit" avec les informations du formulaire pour éditer un livre spécifique.
- "store" pour sauvegarder les informations d'un nouveau livre à la table "Livre".
- "create" qui renvoie la vue "create" avec le formulaire pour ajouter un livre.
<?php
namespace App\Http\Controllers;
use App\Livre;
use Illuminate\Http\Request;
}
}
6. Créer les routes pour toutes les méthodes ci-dessus du contrôleur "LivreController".
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\LivreController;
- D'afficher tous les livres dans un tableau dans la section blade : "content".
@extends('layouts.app')
@section('content')
<table>
<thead>
<tr>
<th>Num</th> <!-- Ajout de la colonne "Num" pour les numéros
de questions -->
<th>Titre</th>
<th>Description</th>
<th>Catégorie</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
@foreach($livres as $livre)
<tr>
<td>{{ $loop->index + 1 }}</td> <!-- Affichage du numéro
de la question -->
<td>{{ $livre->titre }}</td>
<td>{{ $livre->description }}</td>
<td>{{ $livre->catégorie->nom }}</td>
<td>
<!-- Ajoutez ici les boutons d'édition et de
suppression -->
</td>
</tr>
@endforeach
</tbody>
</table>
@endsection
<td>
<a href="{{ route('livres.edit', $livre->id) }}">Éditer</a>
<form action="{{ route('livres.destroy', $livre->id) }}" method="POST">
@csrf
@method('DELETE')
<button type="submit">Supprimer</button>
</form>
</td>
- Le champ "titre" doit être requis et avoir une longueur maximale de 255 caractères.
composant devrait avoir un état initial vide pour stocker les données des livres.
render() {
// Affichage du tableau de livres ici
return (
<div>
// Contenu du tableau
</div>
);
}
}
2. Créez un autre composant de classe appelé "BookRow" qui représente une ligne du tableau pour
un livre spécifique. Ce composant devrait recevoir les données du livre en tant que propriétés (props)
et les afficher dans des cellules de tableau.
3. Dans le composant "BookTable", utilisez le cycle de vie componentDidMount pour effectuer une
requête AJAX (par exemple, à l'aide de la méthode fetch) pour récupérer les données des livres
depuis votre API backend.
componentDidMount() {
fetch('url_de_votre_api')
.then(response => response.json())
.then(data => {
this.setState({ books: data });
})
.catch(error => {
console.error('Erreur lors de la récupération des données des livres',
error);
});
}
// ...
}
4. Une fois que vous avez récupéré les données des livres, mettez à jour l'état du composant
"BookTable" avec ces données.
componentDidMount() {
fetch('url_de_votre_api')
.then(response => response.json())
.then(data => {
this.setState({ books: data });
// ...
}
5. Utilisez la méthode map sur les données des livres pour générer dynamiquement des composants
"BookRow" pour chaque livre et affichez-les dans le tableau.
render() {
const { books } = this.state;
return (
<div>
<table>
<thead>
// En-tête du tableau
</thead>
<tbody>
{books.map(book => (
<BookRow key={book.id} book={book} />
))}
</tbody>
</table>
</div>
);
}
}
function App() {
return (
<div>
// Autres composants et contenu de l'application
<BookTable />
</div>
);
}
7. Stylez le tableau et les lignes du tableau à l'aide de CSS pour les rendre esthétiquement agréables.
.table {
width: 100%;
border-collapse: collapse;
}
.table th {
background-color: #f2f2f2;
font-weight: bold;
}
.table tr:nth-child(even) {
background-color: #f9f9f9;
}
.table tr:hover {
background-color: #e6e6e6;
}