# data[].attributes.body
https://canva.link/fminrq8wd6uc2vw

https://www.canva.com/design/DAHI7GNvHlA/XUckPJ7Picwtl-fn6BDiyA/edit?ui=eyJLIjp7IkEiOiJmNzc3YzUyNi1hM2QxLTRlNzctYjI5Ni0wNWEzZDliMTI4ZDQifX0

https://canva.link/bz53r1kbw0pecgv

https://canva.link/fqs7mvgbgcu5w21

https://www.canva.com/design/DAHJSwyj0xA/iWCytHHGPKPGva0LIky9iA/edit

# data[].attributes.headline
presentation sur la protection des donnees

# data[].attributes.subject
presentation sur la protection des donnees

# data[].attributes.body
youssef belghiti alaoui

youssef ouzine

achraf bouzid

# data[].attributes.attachment_link.title
En tant qu'utilisateur, vous disposez de droits fondamentaux sur vos données personnelles. Le droit d'accès vous permet de savoir quelles informations sont collectées. Le droit de rectification vo (3)

# data[].attributes.headline
SSI (Sécurité des Systèmes d'Information) DEV'101

# data[].attributes.subject
SSI (Sécurité des Systèmes d'Information) DEV'101

# data[].attributes.body
G1 — Fondements de la sécurité informatique: https://canva.link/533w1zef3c3wfz1

G2 — Panorama des attaques informatiques:

https://canva.link/7m2m8zghs08yo5b

G3 — Attaques Web : SQL Injection et XSS:

https://canva.link/i5jlhhzxecc1sob

G4 — Sessions, frontal HTTP et mauvaises configurations:

https://canva.link/p8sgohgaeu79rah

G5 — Se prémunir d’une tentative de piratage:

https://canva.link/it8cwvfnhxvnrsb

G6 — Confidentialiser les données clients:

https://canva.link/q48o1xwqoiu3x7o

G7 — Protection des données utilisateurs:

https://canva.link/yyil5r5q0k6bpg6

G8 — Sécuriser un service et appliquer le chiffrement:

https://canva.link/nrvpk9pxctpq3gh

# data[].attributes.headline
Explication d'exercice PHP : Accès BD - Sessions - Cookies - Constantes magiques - Importation de fichiers

# data[].attributes.subject
Explication d'exercice PHP : Accès BD - Sessions - Cookies - Constantes magiques - Importation de fichiers

# data[].attributes.body
Amine Boubekraoui

# data[].attributes.headline
SWD: Forms - Accès BD - Sessions - Cookies - Constantes magiques - Importation de fichiers

# data[].attributes.subject
SWD: Forms - Accès BD - Sessions - Cookies - Constantes magiques - Importation de fichiers

# data[].attributes.body
dev101

drissi-moussaoui-attioui

# data[].attributes.headline
PHP : Solution d'exercice upload des fichiers 

# data[].attributes.subject
PHP : Solution d'exercice upload des fichiers 

# data[].attributes.body
Amine boubekraoui

# data[].attributes.headline
 EX:3=> Upload des fichiers dans le serveur web(VERTION 1.0), PHP

# data[].attributes.subject
 EX:3=> Upload des fichiers dans le serveur web(VERTION 1.0), PHP

# data[].attributes.body
DEV(101)

HIBA-MOUSSAOUI

# data[].attributes.body
Ayoub Chakiri

Exercice/Rappel Développement d'un Microservice Express js /Mongo DB

# data[].attributes.body
BOUHOUCH

# Autre methode d'enregistrement des données dans le fichier
file_put_contents("participants.txt", $ligne . "\n", FILE_APPEND);
(amine boubekraoui)

# data[].attributes.body
BOUHOUCH

# data[].attributes.body
FATIHA MOUZOUNE

# data[].attributes.headline
Solution d'exercice des interfaces en PHP POO

# data[].attributes.subject
Solution d'exercice des interfaces en PHP POO

# data[].attributes.body
Amine Boubekraoui

# data[].attributes.headline
SWD: CORRECTION Forms 'get' (TRAITEMENT PHP)

# data[].attributes.subject
SWD: CORRECTION Forms 'get' (TRAITEMENT PHP)

# data[].attributes.body
AMINE SKOUCHI

DEV'101

# data[].attributes.headline
SWD: CORRECTION Forms 'get' (FORMULAIRE HTML), PHP

# data[].attributes.subject
SWD: CORRECTION Forms 'get' (FORMULAIRE HTML), PHP

# data[].attributes.body
AMINE SKOUCHI

DEV'101

# data[].attributes.body
DEV 101

Fatima Zahrae Archida

# data[].attributes.body
DEV 102

MOHAMED AMINE BOUHOUCH

# data[].attributes.body
SKOUCHI MOHAMED AMINE

DEV'101

# data[].attributes.headline
Solution d'exercice Classe Abstraite, PHP

# data[].attributes.subject
Solution d'exercice Classe Abstraite, PHP

# data[].attributes.body
DEV101

# data[].attributes.body
Lyousfi Fatima-Zahrae

DEV101

# data[].attributes.headline
SWD: CORRECTION :  Héritage en POO PHP (2) - Override  

# data[].attributes.subject
SWD: CORRECTION :  Héritage en POO PHP (2) - Override  

# data[].attributes.body
AMINE SKOUCHI

DEV'101

# data[].attributes.body
Archida Fatima Zahrae

DEV 101

# data[].attributes.headline
solution d'exercice Final Methods POO PHP

# data[].attributes.subject
solution d'exercice Final Methods POO PHP

# data[].attributes.body
Amine Boubekraoui

# data[].attributes.headline
Solution d'exercice Heritage Override PHP

# data[].attributes.subject
Solution d'exercice Heritage Override PHP

# data[].attributes.body
Amine Boubekraoui

# data[].attributes.body
Amine boubekraoui

# data[].attributes.headline
Solution d'exercice constructeurs POO PHP

# data[].attributes.subject
Solution d'exercice constructeurs POO PHP

# data[].attributes.body
Amine Boubekraoui

# data[].attributes.body
DEV101

Lyousfi Fatima-Zahrae

# data[].attributes.headline
EX5:Gestion des Stagiaires en PHP :SOLUTION(DEV101)

# data[].attributes.subject
EX5:Gestion des Stagiaires en PHP :SOLUTION(DEV101)

# data[].attributes.body
DEV101

ABDEL-HAKIM IDRISSI

# data[].attributes.body
DEV101

ABDELHAKIM-DRISSI

1-Afficher les étudiants dont le nom dépasse 3 lettres
2-Afficher les étudiants sous format CNE-X-Y avec X qui représnete les 3 premières lettres du nom, et Y qui représente les 3 premières lettres du prénomno
3-Afficher les noms et prénoms des étudiants avec le Nom en majuscules et la première lettre des prénoms en majuscule et le reste en miniscule.

# data[].attributes.body
dev'101

MOHAMED AMINE SKOUCHI

# data[].attributes.body
ABSEL-HAKIM_DRISSI

// Il existe trois méthodes de solution, y compris celle du professeur, dans l’exercice 6.

# data[].attributes.body
HAFIDI MARWANE

# data[].attributes.headline
structures de contrôle dans PHP, Exercice 4 complément:

# data[].attributes.subject
structures de contrôle dans PHP, Exercice 4 complément:

# data[].attributes.body
ESSAFI Imane

# data[].attributes.body
Amine Boubekraoui

Travail a faire :

Analyser le script .

Modifier l'approche de creation du tableau de facon a effectuer un remplissage avec 10 objets stagiaire vides , puis initialiser les proprietes des-dits stagiaires.

# data[].attributes.headline
Cloud : projet microservices ( auth-service, produit-service, commande-service ) 

# data[].attributes.subject
Cloud : projet microservices ( auth-service, produit-service, commande-service ) 

# data[].attributes.body
bonne_architecture

DEVOWFS-202

Walid EL KHADIR

# data[].attributes.body
Lyousfi Fatima-Zahrae

DEV101

# data[].attributes.body
HAFIDI MARWANE

# data[].attributes.body
Amine boubekraoui

# data[].attributes.body
Amine Boubekraoui

# data[].attributes.attachment_link.readable_text
je vais vous prÃ©senter les concepts de base du dÃ©veloppement web et lâarchitecture des applications.

Architecture Client / Serveur

Lâarchitecture client-serveur est un modÃ¨le informatique dans lequel un client envoie une requÃªte et un serveur renvoie une rÃ©ponse.

Client

Le client est lâapplication ou lâappareil utilisÃ© par lâutilisateur pour accÃ©der Ã  un service sur Internet.

Exemple :
Par exemple un navigateur web comme Google Chrome ou Firefox.

Serveur 
Le serveur est un ordinateur puissant qui stocke les donnÃ©es et rÃ©pond aux demandes des clients.
Exemple :

Par exemple les serveurs de Google, YouTube ou Facebook.

Middleware

Le middleware est un logiciel intermÃ©diaire qui permet la communication entre diffÃ©rentes applications.

Exemple :
Par exemple un programme qui connecte un site web avec une base de donnÃ©es.

Communication RequÃªte / RÃ©ponse

La communication entre le client et le serveur se fait avec le modÃ¨le requÃªte et rÃ©ponse.

1 Le client envoie une requÃªte
2 Le serveur traite la requÃªte
3 Le serveur envoie une rÃ©ponse

Exemple :

Quand je recherche une information sur Google, mon navigateur envoie une requÃªte et le serveur de Google envoie les rÃ©sultats.

Conclusion

Pour conclure, ces concepts sont trÃ¨s importants pour comprendre comment fonctionnent les applications web modernes.

# data[].attributes.body
HAFIDI MARWANE

# data[].attributes.body
Amine Boubekraoui

# data[].attributes.headline
Synthèse de tout les concepts de base, PHP

# data[].attributes.subject
Synthèse de tout les concepts de base, PHP

# data[].attributes.body
Le développement des applications web repose sur des concepts liés aux réseaux, aux architectures logicielles et aux technologies web. Dans le modèle Client / Serveur, le client (navigateur) envoie une requête au serveur qui la traite et renvoie une réponse. L’identification des appareils se fait grâce à l’adresse IP, tandis que le DNS traduit les noms de domaine en adresses IP et les ports réseau permettent d’identifier les services.

Les applications sont organisées selon des architectures comme 1-tiers, 2-tiers, 3-tiers ou n-tiers, qui séparent généralement le système en trois couches : présentation (interface utilisateur), logique métier (traitement) et données (base de données gérée par un SGBD).

Dans le web, un serveur web héberge les sites et envoie les pages aux navigateurs via le protocole HTTP et les adresses URL. Les pages peuvent être statiques ou dynamiques, et des langages comme PHP permettent de créer des applications web dynamiques grâce à leur simplicité et leur large utilisation.

youssef belghiti alaoui

# data[].attributes.body
Youssef oulala

Mohamed jobaro

Tariq bouzekri

# data[].attributes.headline
BD : Exercice manipulation Date/Time MySQL

# data[].attributes.subject
BD : Exercice manipulation Date/Time MySQL

# data[].attributes.body
Amine Boubekraoui

# data[].attributes.attachment_link.readable_text
drop database if exists bd_automobile;
create database bd_automobile;
use bd_automobile;

CREATE TABLE Vehicule (
    id INT PRIMARY KEY AUTO_INCREMENT,
    immatriculation VARCHAR(20) NOT NULL UNIQUE,
    modele VARCHAR(100) NOT NULL,
    date_achat DATE NOT NULL
);

CREATE TABLE Location (
    id INT PRIMARY KEY AUTO_INCREMENT,
    id_vehicule INT,
    date_debut DATE NOT NULL,
    date_fin_prevue DATE NOT NULL,
    date_retour_reelle DATE,
    montant_journalier DECIMAL(10,2) NOT NULL,
    
    FOREIGN KEY (id_vehicule) 
    REFERENCES Vehicule(id)
    ON DELETE CASCADE
);

/* 1 */
set lc_time_names = 'fr_FR';
SELECT DATE_FORMAT(NOW(), '%W %d %M %Y - %H:%i');

/* 2 */
SELECT DATEDIFF(CURDATE() ,
 CONCAT(YEAR(CURDATE()), '-01-01'));

/* 3 */
SELECT immatriculation,
 TIMESTAMPDIFF(YEAR,date_achat,now())
FROM Vehicule;

/* 4 */
SELECT DISTINCT YEAR(date_achat)
FROM Vehicule
ORDER BY YEAR(date_achat) DESC;

/* 5 */
SELECT id , DATEDIFF(date_retour_reelle, date_debut)
FROM Location
WHERE date_retour_reelle IS NOT NULL;

/* 6 */
SELECT id_vehicule , SUM(DATEDIFF(date_retour_reelle, date_debut) * montant_journalier)
FROM Location
WHERE date_retour_reelle IS NOT NULL
GROUP BY id_vehicule
HAVING MIN(YEAR(date_debut)) > 2023;

/* 7 */
SELECT vehicule.* FROM vehicule
JOIN Location ON Location.id_vehicule = vehicule.id
GROUP BY vehicule.id, immatriculation, modele, date_achat
HAVING MIN(WEEKDAY(date_debut)) >= 5
   AND MAX(WEEKDAY(date_debut)) <= 6
   AND MIN(WEEKDAY(date_retour_reelle)) >= 5
   AND MAX(WEEKDAY(date_retour_reelle)) <= 6;

# data[].attributes.body
khalid azane

# data[].attributes.body
DEVOWFS 201, Badr AMRAOUI

# data[].attributes.headline
Correction de Cloud: Exercice API MySQL 

# data[].attributes.subject
Correction de Cloud: Exercice API MySQL 

# data[].attributes.body
const express = require('express');
const { MongoClient } = require('mongodb');

const app = express();
app.use(express.json());

// ===== MongoDB configuration =====
const url = 'mongodb://127.0.0.1:27017';
const dbName = 'hotelDB';

let suitesCol, reservationsCol;

MongoClient.connect(url)
  .then(client => {
    const db = client.db(dbName);
    suitesCol = db.collection('suites');
    reservationsCol = db.collection('reservations');
    console.log(' MongoDB connected');
  })
  .catch(err => console.error(err));

// =====================
// SERVICE-SUITE
// =====================

// Ajouter une suite
app.post('/suites', async (req, res) => {
  await suitesCol.insertOne(req.body);
  res.status(201).json("Suite ajoutée");
});

// Vérifier disponibilité
app.get('/suites/:id/disponibilite', async (req, res) => {
  const suite = await suitesCol.findOne({ idSuite: +req.params.id });
  if (!suite) return res.status(404).json("Suite non trouvée");
  res.json({ disponibilite: suite.disponibilite });
});

// Mettre à jour disponibilité
app.put('/suites/:id/disponibilite', async (req, res) => {
  await suitesCol.updateOne(
    { idSuite: +req.params.id },
    { $set: { disponibilite: req.body.disponibilite } }
  );
  res.json("Disponibilité mise à jour");
});

// Supprimer une suite
app.delete('/suites/:id', async (req, res) => {
  await suitesCol.deleteOne({ idSuite: +req.params.id });
  res.json("Suite supprimée");
});

# data[].attributes.body
BOUHOUCH MOHAMED AMINE

# data[].attributes.body
BOUHOUCH MOHAMED AMINE

# data[].attributes.body
DEVOWFS-202

EL KHADIR Walid

# data[].attributes.attachment_link.readable_text
const express = require("express");
const { MongoClient } = require("mongodb");
//const MongoClient = require('mongodb').MongoClient;

const app = express();
app.use(express.json());

const port = 3000;

const mongoUrl = "mongodb://127.0.0.1:27017";
const dbname = "hoteldb";
const collname = "suites";

// Connexion 
async function getCollection() {
  const client = new MongoClient(mongoUrl);
  await client.connect();
  const db = client.db(dbname);
  const collection = db.collection(collname);
  return { client, collection };
}

// Test
app.get("/test", async (req, res) => {
    const { client, collection } = await getCollection();
  res.json({ status: "service-suite Mongo OK" });
});

// POST /suites (idSuite = max + 1)
app.post("/suites", async (req, res) => {
  const { client, collection } = await getCollection();
  try {
    const { designation, etage, capacite, disponibilite } = req.body;

    // max + 1
    const last = await collection.find().sort({ idSuite: -1 }).limit(1).toArray();
    const newIdSuite = last.length ? last[0].idSuite + 1 : 1;

    const suite = {
      idSuite: newIdSuite,
      designation,
      etage: Number(etage),
      capacite: Number(capacite),
      disponibilite: disponibilite === undefined ? true : Boolean(disponibilite),
    };

    await collection.insertOne(suite);
    res.status(201).json({ message: "Suite ajout��e", idSuite: newIdSuite });
  } catch (err) {
    res.status(500).json({ message: err.message });
  } finally {
    await client.close();
  }
});

// DELETE /suites/:idSuite
app.delete("/suites/:idSuite", async (req, res) => {
  const { client, collection } = await getCollection();
  try {
    const idSuite = Number(req.params.idSuite);
    const result = 
    await collection.deleteOne({ idSuite });

    res.json({ message: "Suite supprim��e", deletedCount: result.deletedCount });
  } catch (err) {
    res.status(500).json({ message: err.message });
  } finally {
    await client.close();
  }
});

// GET /suites/:idSuite/disponibilite
app.get("/suites/:idSuite/disponibilite", async (req, res) => {
  const { client, collection } = await getCollection();
  try {
    const idSuite = Number(req.params.idSuite);
    const suite = 
    await collection.findOne({ idSuite });

    // si pas trouv��, suite = null (test only)
    res.json({ idSuite, disponibilite: suite ? Boolean(suite.disponibilite) : null });
  } catch (err) {
    res.status(500).json({ message: err.message });
  } finally {
    await client.close();
  }
});

// PUT /suites/:idSuite/disponibilite (toggle)
app.put("/suites/:idSuite/disponibilite", async (req, res) => {
  const { client, collection } = await getCollection();
  try {
    const idSuite = Number(req.params.idSuite);
    const suite = await collection.findOne({ idSuite });

    const newDisponibilite = 
    suite ? !Boolean(suite.disponibilite) : null;

    if (newDisponibilite !== null) {
      await collection.updateOne({ idSuite }, { $set: { disponibilite: newDisponibilite } });
    }
    // else {
    //   await collection.updateOne({ idSuite }, { $set: { disponibilite: false } });
    // }


    res.json({ message: "toggle", idSuite, disponibilite: newDisponibilite });
  } catch (err) {
    res.status(500).json({ message: err.message });
  } finally {
    await client.close();
  }
});

app.listen(port, () => {
  console.log(`Service-suite Mongo listening on port ${port}`);
});



// test 

# data[].attributes.body
yahyeh

DEV101

# data[].attributes.body
AMARI Abdenour

# data[].attributes.body
Amine Boubekraoui

# data[].attributes.body
DEV101

SKOUCHI AMINE

# data[].attributes.body
Postman Stagiaire

# data[].attributes.body
https://ayoubchakiri105-7818117.postman.co/workspace/45b998f9-c9fa-4c80-a934-c762b154d18a/collection/52315126-0f823384-2bcd-4186-af76-b23a67bca3bb?action=share&source=copy-link&creator=52315126

# data[].attributes.attachment_link.readable_text
const express = require('express');
const fs = require('fs');
const app = express();
const port = 3002;

app.use(express.json()); 

//  Read function
function readStagiaires() {
    const data = fs.readFileSync('stagiaires.json');
    return JSON.parse(data);
}

// Write function
function writeStagiaires(data) {
    fs.writeFileSync('stagiaires.json', JSON.stringify(data, null, 2));
}

//////////////////////////////////////////////////////

// GET
app.get('/stagiaires', (req, res) => {
    const stagiaires = readStagiaires();
    res.json(stagiaires);
});

//////////////////////////////////////////////////////

// Ajouter
app.post('/stagiaires', (req, res) => {
    const stagiaires = readStagiaires();

    const { CNE, nom, prenom, telephone, email } = req.body;

    const exist = stagiaires.find(s => s.CNE === CNE);
    if (exist) {
        return res.status(400).json({ message: "CNE already exists" });
    }

    const newStagiaire = { CNE, nom, prenom, telephone, email };

    stagiaires.push(newStagiaire);
    writeStagiaires(stagiaires);

    res.status(201).json(newStagiaire);
});

//////////////////////////////////////////////////////

// Supprimer
app.delete('/stagiaires/:CNE', (req, res) => {
    const stagiaires = readStagiaires();
    const CNE = req.params.CNE;

    const newList = stagiaires.filter(s => s.CNE !== CNE);

    if (newList.length === stagiaires.length) {
        return res.status(404).json({ message: "Stagiaire not found" });
    }

    writeStagiaires(newList);
    res.json({ message: "Stagiaire deleted successfully" });
});

//////////////////////////////////////////////////////

//  Modifier
app.put('/stagiaires/:CNE', (req, res) => {
    const stagiaires = readStagiaires();
    const CNE = req.params.CNE;

    const index = stagiaires.findIndex(s => s.CNE === CNE);

    if (index === -1) {
        return res.status(404).json({ message: "Stagiaire not found" });
    }

    stagiaires[index].telephone = req.body.telephone || stagiaires[index].telephone;
    stagiaires[index].email = req.body.email || stagiaires[index].email;

    writeStagiaires(stagiaires);
    res.json(stagiaires[index]);
});

//////////////////////////////////////////////////////

//Rechercher 
app.get('/stagiaires/search', (req, res) => {
    const stagiaires = readStagiaires();
    const { nom, prenom } = req.query;

    const results = stagiaires.filter(s =>
        (nom ? s.nom.toLowerCase().includes(nom.toLowerCase()) &&
         nom.toLocaleLowerCase().includes(s.nom.toLowerCase()) : true) &&
         
        (prenom ? s.prenom.toLowerCase().includes(prenom.toLowerCase()) &&
         prenom.toLocaleLowerCase().includes(s.prenom.toLowerCase()) : true)
    );

    res.json(results);
});

//////////////////////////////////////////////////////

app.listen(port, () => {
    console.log(`Server running on http://localhost:${port}`);
});





// npm install -g nodemon

// nodemon index.js

# data[].attributes.body
ELMANSSOURI AHMED DEV101

# data[].attributes.body
DRISSI DEV101

Version commentée:

DROP DATABASE IF EXISTS Location;

create database BD_Location;

use BD_Location;

create table Categorie (

#LIKE => spécifier le format de la chaine, en se basant sur des méta-caractère

#(_:n'importe quel caractère| [a-z]:lettre de 'a' jusquà 'z' | [A-Z]:lettre de 'A' jusquà 'Z' | [0-9]:chiffre de '0' jusquà '9'

#| %:n'importe quelle chaine; aussi [a-zA-Z]) n

Codecat varchar(5) check(Codecat LIKE '_____'),

libelle varchar(50) not null,

constraint Codecat primary key (Codecat))

engine=Innodb;

create table Engin (

idEngin int auto_increment,

Nom varchar(30),

codeCat varchar(5),

etat varchar(11) check (etat = 'Disponible' or etat = 'Maintenance' or etat = 'Lou��'), #check (etat in ('Disponible', 'Maintenance','Lou��')

constraint idEngin primary key (idEngin),

constraint codecat foreign key (codeCat)

references Categorie(Codecat)

on update cascade)

engine=Innodb;

create table Location (

idLoc int auto_increment primary key,

dateDebut date,

dateFin date check (dateFin >= dateDebut),

idEngin int,

NomClient varchar(30),

constraint fk foreign key(idEngin) references Engin(idEngin) on delete restrict

) engine=Innodb;

# Q1

INSERT INTO Categorie (Codecat, libelle)

VALUES ('LEV01', 'Example'), ('TER01', 'example');

# Q2

insert into engin (idEngin,Nom,codeCat,etat)

values ('1','Grue mobile','LEV01','Disponible'),('2','Bulldozer','TER01','Maintenance'),('3','Namex','TER01','Lou��');

select * from engin;

#Q3

insert into location (idLoc,dateDebut,dateFin,idEngin,NomClient)

values ('24','2025/02/05','2025/02/04','1','ExNom');

select * from information_schema.table_constraints where table_name='location';

# Q4

SELECT * FROM Location WHERE CURDATE() BETWEEN dateDebut AND dateFin;

# data[].attributes.body
Amine Boubekraoui

Version commentée:

DROP DATABASE IF EXISTS Location;

create database BD_Location;

use BD_Location;

create table Categorie (

#LIKE => spécifier le format de la chaine, en se basant sur des méta-caractère

#(_:n'importe quel caractère| [a-z]:lettre de 'a' jusquà 'z' | [A-Z]:lettre de 'A' jusquà 'Z' | [0-9]:chiffre de '0' jusquà '9'

#| %:n'importe quelle chaine; aussi [a-zA-Z])

Codecat varchar(5) check(Codecat LIKE '_____'),

libelle varchar(50) not null,

constraint Codecat primary key (Codecat))

engine=Innodb;

create table Engin (

idEngin int auto_increment,

Nom varchar(30),

codeCat varchar(5),

etat varchar(11) check (etat = 'Disponible' or etat = 'Maintenance' or etat = 'Lou��'), #check (etat in ('Disponible', 'Maintenance','Lou��')

constraint idEngin primary key (idEngin),

constraint codecat foreign key (codeCat)

references Categorie(Codecat)

on update cascade)

engine=Innodb;

create table Location (

idLoc int auto_increment primary key,

dateDebut date,

dateFin date check (dateFin >= dateDebut),

idEngin int,

NomClient varchar(30),

constraint fk foreign key(idEngin) references Engin(idEngin) on delete restrict

) engine=Innodb;

# Q1

INSERT INTO Categorie (Codecat, libelle)

VALUES ('LEV01', 'Example'), ('TER01', 'example');

# Q2

insert into engin (idEngin,Nom,codeCat,etat)

values ('1','Grue mobile','LEV01','Disponible'),('2','Bulldozer','TER01','Maintenance'),('3','Namex','TER01','Lou��');

select * from engin;

#Q3

insert into location (idLoc,dateDebut,dateFin,idEngin,NomClient)

values ('24','2025/02/05','2025/02/04','1','ExNom');

select * from information_schema.table_constraints where table_name='location';

# Q4

SELECT * FROM Location WHERE CURDATE() BETWEEN dateDebut AND dateFin;

# data[].attributes.headline
Cloud computing - Modéles de Déploiement Cloud

# data[].attributes.subject
Cloud computing - Modéles de Déploiement Cloud

# data[].attributes.body
Présenté par:

BALAHBIB WIDAD

BAALI CHAIMAE

TALIBI HAFSA

# data[].attributes.attachment_link.description
Check out this Presentation designed by Hafsa TALI.

# data[].attributes.body
Dev:101

ABDELHAKIM-DRISSI

MOHAMED-OUHOUJLAN

ABDELBAST- BOUGHARI

WALID ALMADAH

# data[].attributes.body
DEV102

BEN TAUAIT Hajar

ESSAFI Imane

# data[].attributes.body
GDF:https://coggle.it/diagram/aVuHYHCO_AnXvcWC/t/code_service

Dev:101

ABDELHAKIM-DRISSI

MOHAMED-OUHOUJLAN

ABDELBAST- BOUGHARI

WALID ALMADAH

# data[].attributes.body
DEV102

Roqaya BANLAFQIH

Sara MADANI

lien:

https://docs.google.com/spreadsheets/d/1O-C5fwHXUq9NTo1BYbAweC-O4RroqWBAZ7gWJvkMKWk/edit?usp=sharing

# data[].attributes.body
dev:102

Ben tauait hajar

Essafi imane

# data[].attributes.body
Dev:101 / MCD

Ahmed Elmanssouri

khalid azane

Imrane oubra

# data[].attributes.body
Dev:101 (BD)

Graphe de depondance fonctionelle (GDF)

khalid azane

ahmed elmanssouri

imrane oubra

# data[].attributes.attachment_link.title
CNEEtu, numNotation, codeClasse, numInscription, codeClasse + CNEEtu -…

# data[].attributes.attachment_link.description
CNEEtu (nomEtu, prenomEtu, telEtu, dateNaiss, emailEtu), numNotation (codModule, dateSaisie, valeurNote, session), codeClasse (niveau, intituleClasse), numInscription (anneeScolaire, dateInscription), codeClasse + CNEEtu

# data[].attributes.body
dictionnaire donnees

Dev:101

ABDELHAKIM-DRISSI

MOHAMED-OUHOUJLAN

ABDELBAST- BOUGHARI

WALID ALMADAH

# data[].attributes.headline
Pack Révision React Complet : Cours, TPs & Corrigés EFF (B DARIJA)

# data[].attributes.subject
Pack Révision React Complet : Cours, TPs & Corrigés EFF (B DARIJA)

# data[].attributes.body
Salut a tous,

J'ai préparé un dossier nommé components qui contient tout ce qu'il faut pour réviser React JS.

Tout le code est commenté pour comprendre la logique facilement. C'est idéal pour préparer les examens.

Contenu du dossier :

1. Cours (Topics 1-13) :

Bases (JSX, Props, State), Hooks (useEffect, Context) et Concepts Pro (Axios, Redux Toolkit).

2. Exercices (TPs) :

E-Commerce : Gestion panier (Ajout, total, quantité).

CRUD : Gestion complète (Ajouter, Modifier, Supprimer, Chercher).

3. Bonus : Examens Corrigés :

Correction EFF 2023, 2024 et EFF 2025 (avec Redux).

Comment installer le projet ? (Important)

Suivez ces étapes car j'ai tout mis dans le même dossier :

1. Créez votre projet React :

npx create-react-app revision-react
cd revision-react

2. Placez les fichiers :

Prenez le dossier composants que vous avez téléchargé et placez-le dans le dossier src de votre projet.

IMPORTANT : Ouvrez le dossier components, prenez le fichier App.js, et déplacez-le dans le dossier src (remplacez l'ancien App.js).

3. Installez les bibliothèques :

Le code utilise le Routing, Axios et Redux. Tapez ça dans le terminal :

npm install react-router-dom axios @reduxjs/toolkit react-redux

4. Lancez le site :

npm start

Bon courage à tous.

DEVOWFS: 202

ABDENOUR AMARI

# data[].attributes.body
DEVOWFS:202

ALI OULAHCEN

# data[].attributes.body
dev'101

mohamed amine skouchi

# data[].attributes.body
Dev:101

khalid Azane

Ahmed ELmanssouri

Imrane Oubra

# data[].attributes.body
Dev:102

Settih walid

ouzine youssef

achraf bouzid

# data[].attributes.body
Dev:101

ABDELHAKIM-DRISSI

MOHAMED-OUHOUJLAN

ABDELBAST- BOUGHARI

WALID ALMADAH

SET DES ICON(https://icons.getbootstrap.com/)

# data[].attributes.body
DEVOWFS:202

WALID EL KHADIR

# data[].attributes.headline
React: EXERCICE Gestion Stagiaire (Uncontrolled Forms)

# data[].attributes.subject
React: EXERCICE Gestion Stagiaire (Uncontrolled Forms)

# data[].attributes.body
DEVOWFS202

Mohamed Amine BAHRA

# data[].attributes.body
DEVOWFS202

HAFSA TALIBI

# data[].attributes.body
Dev101

groupe 1:

Fatima-Zahrae Archida

Hiba Moussaoui

Fatima-Zahrae Lyousfi

Sara

Question au public:

Quelle est la différence entre une police installée sur l’ordinateur (ex : Arial) et une police chargée depuis un CDN comme Google Fonts (ex : Pacifico) ?

Pourquoi utilise-t-on la balise <link> pour ajouter une police Google Fonts au lieu de l’écrire directement dans une balise <style> ?

# data[].attributes.headline
Frontend : exercice (Stagiaire) Condition 

# data[].attributes.subject
Frontend : exercice (Stagiaire) Condition 

# data[].attributes.body
DEVOWFS : 202

Walid EL KHADIR

# data[].attributes.headline
Frontend : exercice Uncontrolled forms (Ref)

# data[].attributes.subject
Frontend : exercice Uncontrolled forms (Ref)

# data[].attributes.body
DEVOWFS : 201

Badr AMRAOUI

# data[].attributes.body
Remarque : On a applique le style pour la page accueil (importee localement),la categorie arbre (CDN) et ses details (local)

--------------------------------

Dev102

Amine boubekraoui

Youssef belghiti

Amine bouhouch

# data[].attributes.body
DEVOWFS : 201

Badr AMRAOUI

# data[].attributes.headline
state Handling with function component. exercice: liste  fruits

# data[].attributes.subject
state Handling with function component. exercice: liste  fruits

# data[].attributes.body
DEVOWFS202

HAFSA TALIBI

# data[].attributes.headline
state Handling with function component. exercice: compteur

# data[].attributes.subject
state Handling with function component. exercice: compteur

# data[].attributes.body
DEVOWFS202

HAFSA TALIBI

# data[].attributes.body
DEV102:

Amine boubekraoui

Amine bouhouch

Youssef belghiti

# data[].attributes.body
DEV102

Amine boubekraoui

Amine bouhouch

Youssef belghiti

# data[].attributes.body
DEV:102

Ben tauait Hajar

Essafi Imane

# data[].attributes.body
Sara Madani

Roqaya Benlafqih

# data[].attributes.body
DEV:102

Ben tauait Hajar

Essafi Imane

# data[].attributes.body
DEV:101

ABDELHAKIM DRISSI

MOHAMED OUHOUJLAN

ABDELBAST BOUGHARI

WALID ALMADAH

# data[].attributes.headline
Frontend : exercice conditional rendering

# data[].attributes.subject
Frontend : exercice conditional rendering

# data[].attributes.body
DEVOWFS: 201

Badr AMRAOUI

# data[].attributes.headline
frontend : exercice state handling (fruits)

# data[].attributes.subject
frontend : exercice state handling (fruits)

# data[].attributes.body
DEVOWFS: 202

Mohamed Amine BAHRA

# data[].attributes.attachment_link.readable_text
import React, { Component } from 'react';
import './App.css';

class Compteur extends Component {
  constructor() {
    super();
    this.state = { listeInitiale: ["banane","pomme","orange","kiwi"] };
  }

  ajouter() {
    const fruits = ["banane", "pomme", "orange", "kiwi"];
    this.setState(state => {
      if (state.listeInitiale.length == fruits.length) return null;
      return {
        listeInitiale: [...state.listeInitiale, fruits[state.listeInitiale.length]]
      };
    });
  }

  supprimer() {
    this.setState(state => ({
      listeInitiale: state.listeInitiale.slice(0, state.listeInitiale.length - 1)
    }));
  }

  render() {
    return (
      <div>
        <ul>
          {this.state.listeInitiale.map((fruit, index) => (
            <li key={index}>{fruit}</li>
          ))}
        </ul>
        <button onClick={() => this.ajouter()}>ajouter</button>
        <button onClick={() => this.supprimer()}>supprimer</button>

      </div>
    );
  }
}

export default Compteur;

# data[].attributes.headline
Frontend : exercice State Handling with Class Component 

# data[].attributes.subject
Frontend : exercice State Handling with Class Component 

# data[].attributes.body
DEVOWFS: 202

Walid EL KAHDIR

# data[].attributes.body
DEV 102

BEN TAUAIT Hajar, MADANI Sara, ESSAFI Imane, BENLAFQIH Roqaya

# data[].attributes.headline
Frontend: exercice composants et passage de props en React

# data[].attributes.subject
Frontend: exercice composants et passage de props en React

# data[].attributes.body
DEVOWFS: 202

Hafsa TALIBI

# data[].attributes.body
Badr AMRAOUI

DEVOWFS201

# data[].attributes.body
AYOUB CHAKIRI

DEVOWFS201

# data[].attributes.body
Dev101

ELmanssouri Ahmed

Khalid Azane

Imrane Oubra

Mohamed Amine

# data[].attributes.body
DEV101

Amine boubekraoui

Walid setteh

Amine bouhouch