Consignes

Cet examen se déroulant sur machine, vous devrez à la fin de l'épreuve remettre votre travail sous la forme d'un fichier compressé (zip ou tar/gz) que vous déposerez dans l'espace prévu à cet effet sur le serveur moodle de l'ufr im2ag. Afin qu'il n'y ait pas de confusion et de conflits lors de la remise de votre travail vous devrez OBLIGATOIREMENT respecter les consignes qui suivent.

image contenu du répertoire TW_ExamDec2025_XXX
Contenu du répertoire TW_ExamDec2025_XXX.
  1. Téléchargez sur votre compte le fichier TW_ExamDec2025_XXX.zip et décompressez le.

    Le répertoire TW_examDec2025_XXX ainsi créé contient trois sous répertoires 01_GestionnaireTachesCLI, 02_AnimationVisages et 03_Horloges contenant le code que vous utiliserez et compléterez pour les exercices de cette épreuve sur machine (fig. 1).

  2. Renommez le répertoire TW_examDec2025_XXX en TW_examDec2025_votreNom, votreNom correspond à votre identifiant de login (sans espaces, ni accents). C'est le contenu de ce répertoire que vous devrez rendre en fin d'épreuve. Soyez très vigilants à ce que tout le travail que vous effectuez durant l'épreuve soit bien enregistré dans ce répertoire .

  3. A la fin de l'épreuve créez une archive compressée (fichier .zip ou .tar.gz) de votre travail. (voir les explications détaillées sur comment créer une archive)

  4. Déposez l'archive (fichier TW_examDec2025_votreNom.zip ou TW_examDec2025_votreNom.tar.gz) sur le serveur Moodle de l'UFR IM2AG.

    • connectez vous sur Moodle avec votre identifiant et mot de passe agalan (explications détaillées)
    • déposez le fichier archive (fichier TW_examDec2025_votreNom.zip ou TW_examDec2025_votreNom.tar.gz) précédemment créé dans l'espace de dépot prévu à cet effet dans le Moodle du cours Technologies du Web Internet (explications détaillées)

Les trois parties de l'examen sont indépendantes et peuvent être effectuées dans n'importe quel ordre.

Partie 1 : JavaScript Node.js - tableaux

Contexte

Vous devez développer une application Node.js de gestion de tâches en ligne de commande. L'application permet de créer, afficher, modifier et supprimer des tâches, avec gestion de priorités et recherche. Le code de l'application se trouve dans le fichier app.js et utilise une classe ListeDeTaches définie dans le fichier ListeDeTaches.js. Les tâches sont stockées dans un fichier JSON (taches.json) avec la structure suivante :

[
  {
    "id": 1764440896115,                          // identifiant d'une tâche voir note 1 ci-dessous
    "description": "Préparer un sujet d'examen",  // description textuelle de la tâche
    "terminee": false,                            // indique si la tâche est terminée
    "priorite": "Haute",                          // priorité de la tâche, "Haute", "Moyenne" ou "Basse"
    "dateCreation": "29/11/2025 19:28:16"         // date et heure de création de la tâche
  },
  {
    "id": 1764438775160,
    "description": "Corriger les copies",
    "terminee": true,
    "priorite": "Moyenne",
    "dateCreation": "29/11/2025 18:52:55"
  }
]

1 à la création d'une tâche son id est initialisé via l'instruction JavaScript Date.now() qui renvoie le nombre de millisecondes écoulées depuis le 1er janvier 1970, 00:00:00 UTC (l'époque Unix). Cela permet d'obtenir un timestamp qui peut être utilisé pour diverses applications, comme générer des identifiants uniques ou mesurer des intervalles de temps.

Pour exécuter l'application app.js, dans un terminal placez vous dans le répertoire 01_GestionaireTachesCLI et tapez la commande node app.js. Vous devriez obtenir l'affichage suivant

> cd 01_GestionnaireTachesCLI
> node .\app.js
✅ 5 tâche(s) chargée(s) depuis le fichier.
╔══════════════════════════════════╗
║    GESTIONNAIRE DE TÂCHES CLI    ║
╚══════════════════════════════════╝
=== MENU PRINCIPAL ===
1. Afficher toutes les tâches
2. Afficher les statistiques
3. Marquer une tâche comme terminée
4. Ajouter une tâche
5. Supprimer une tâche
6. Supprimer toutesles tâches terminées
7. Trier les tâches
8. Recherche de tâches par mot clé
9. Sauvegarder et quitter
0. Quitter sans sauvegarder
=====================

Votre choix : 

1.1 Compléter le code de la classe ListeDeTaches

Vous devez compléter la classe ListeDeTaches fournie dans le fichier ListeDeTaches.js. Le constructeur et la méthode sauvegarderTaches() sont déjà implémentés et vous sont fournis (attention à ne pas modifier ce code). Votre travail va consister à implémenter toutes les autres méthodes de la classe.

1. Méthode afficherTaches()

Ecrivez le code de la méthode afficherTaches() qui affiche de manière formatée sur la console toutes les tâches contenues dans le tableau taches attribut de la liste de tâches. Le format d'affichage attendu est :

✓ Tâche 1
   ID: 1764440896115
   Préparer un sujet d'examen
   Priorité: Haute
   Créée le: 29/11/2025 19:28:16
   Statut: Terminée

○ Tâche 2
   ID: 1764438775160
   Corriger les copies
   Priorité: Moyenne
   Créée le: 29/11/2025 18:52:55
   Statut: En cours

Indications :

  • Si le tableau est vide, afficher : "Aucune tâche à afficher."
  • Utiliser `✓` pour les tâches terminées et `○` pour les tâches en cours
  • Les tâches sont affichées dans leur ordre d'apparation dnas le tableau taches et sont numérotées à partir de 1 (alors que le tableau commence à l'indice 0).

Vérifiez que l'affichage produit correspond bien à ce qui est demandé (choix 10 du menu de l'application app.js.

2. Getters nbTaches et nbTachesTerminees et méthode nbTacheDePriorite(niveauPriorite)

Ecrivez le code des getters nbTaches et nbTachesTerminees qui renvoient respectivement le nombre total de tâches de la liste et le nombre de tâches marquées comme terminées.

Ecrivez le code de la méthode nbTacheDePriorite(niveauPriorite) qui renvoie le nombre de tâches ayant un niveau de priorité donné.

Paramètre :

  • niveauPriorite (string) : le niveau de priorité à rechercher ("Basse", "Moyenne", "Haute")

Retour : (number) le nombre de tâches correspondantes

Testez ces méthodes en appelant le choix 2 (Afficher les statistiques) de l'application app.js et en vérifiant que les valeurs fournies correspondent bien aux valeurs effectives.

3. Méthode terminer(index)

Ecrivez le code de la méthode terminer(index) qui marque une tâche comme terminée

Paramètre :

  • index (number) : le numéro de la tâche à marquer comme terminée (commence à 1)

Attention : Les tâches sont numérotées à partir de 1 pour l'utilisateur, mais le tableau commence à l'indice 0.

Testez cette méthode (choix 3 du menu de app.js) et la tâche a bien été marquée (en affichant la liste des tâches (choix 1) et les statistiques (choix 2))

4. Méthode nouvelleTache(description, priorite)

Ecrire le code de la méthode nouvelleTache(description, priorite) qui ajoute une nouvelle tâche à la fin de la liste.

Paramètres :

  • description (string) : la description de la tâche,
  • priorite (string) : la priorité de la tâche (par défaut "Basse")

Structure de la tâche à créer :

  • id : utiliser Date.now() pour générer un identifiant unique 1.
  • description : la description fournie
  • terminee : initialisé à false
  • priorite : la priorité fournie (ou "Basse" par défaut)
  • dateCreation : la date actuelle au format français (new Date().toLocaleString("fr-FR"))

Avec l'application app.js créez une nouvelle tâche (choix 4 du menu) et vérifiez ensuite qu'elle apparait correctement à la fin de liste des tâches (choix 1).

Il va de soi que dans nouvelleTache vous ne devez pas lire les valeurs au clavier, ceci est fait dans le code de app.js qui ensuite appelle cette méthode.

5. Méthode supprimer(index)

Ecrivez le code de la méthode supprimer(index) qui supprime une tâche de la liste et la renvoie.

Paramètre :

  • index (number) : le numéro de la tâche à supprimer (commence à 1 comme pour la méthode terminer)

Retour : (object) la tâche supprimée

Indication : vous pouvez essayer d'utiliser la méthode splice() des tableaux qui peut s'avérer bien utile pour de telles situations.

Utilisez l'application app.js pour tester la suppression (choix 5 du menu) et verifier que la tâche a bien été retiré de la liste (en affichant la liste des tâches (choix 1) et les statistiques (choix 2))

6. Méthode supprimerTachesTerminees()

Ecrivez le code de la méthode supprimerTachesTerminees() qui supprime de la liste toutes les tâches terminées.

indication : vous pouvez utilisez la méthode filter() des tableaux pour ne conserver que les tâches non terminées.

Utilisez l'application app.js pour tester la suppression (choix 3 du menu).

1.2. Compléter le code de app.js

La méthode trier(fonctionDeComparaison) de la classe ListeDeTaches permet de trier la liste des tâches selon le critère de comparaison fourni. Le paramètre fonctionDeComparaison (Function) est fonction de comparaison prenant deux tâches a et b et renvoyant :

  • un nombre négatif si a < b
  • 0 si a === b
  • un nombre positif si a > b

Exemple d'utilisation

// Trier par priorité (Haute > Moyenne > Basse)
listeDeTaches.trier((a, b) => {
    const priorites = { "Haute": 3, "Moyenne": 2, "Basse": 1 };
    return priorites[b.priorite] - priorites[a.priorite];
});

La méthode trier a été implémentée grâce à la méthode sort des tableaux. Par contre le code de l'application app.js n'est pas complet, il manque les appels à la méthode trier.

Question : Dans app.js, complétez le code de la fonction trierTaches afin de réaliser les différents tris selon les critères proposés.

Indication pour trier les tâches par date (de la plus ancienne ou la plus récente ou inversement) vous pouvez baser votre critère de tri sur l'attribut id des tâches.

Rappelons qu'à la création d'une tâche son id a été initialisé via l'instruction JavaScript Date.now() qui renvoie le nombre de millisecondes écoulées depuis le 1er janvier 1970, 00:00:00 UTC (l'époque Unix). Cela permet d'obtenir un timestamp qui peut être utilisé pour diverses applications, comme générer des identifiants uniques ou mesurer des intervalles de temps.

Testez les différents tris (choix 7 du menu de app.js) et vérifiez que vous obtenez bien le résultat attendu en affichant la liste des tâches.

1.3 Rechercher un tâche par mot clé

Cet question est facultative, à ne faire qu'après avoir essayé de faire les autres exercices

Question : le menu de app.js prévoit une recherche de tâches par mot clé (choix 9) : l'utilisateur rentre une chaîne de et l'interface affiche la liste de toutes les taches qui contiennent tout ou partie de cette chaîne mais cette fonctionnalité n'a pas du tout été implémentée ni dans l'application (app.js) ni dans la classe ListeDeTaches. A vous de la réaliser.

L'idée est à partir de la chaîne proposée de rechercher toutes les tâches dont la description contient la chaîne indépendamment de la casse (majuscule ou minuscules). Pensez à regarder la doc de String et en particulier les méthodes include et toLowerCase ou toUpperCase().

attention readline-sync traite mal les caractères accentués. faites attenton de ne pas en utiliser dans vos recherches.


Partie 2: JavaScript dans le Navigateur - Les Visages Episode III

Dans cet exercice nous repartons de la base de code correspondant à la correction du TP permettant l'animation de Visages Expressifs.

1. Modifier la classe VisageExpressif

Question 1 : Dans la version du code fournie, les VisagesExpressifs sont systématiquement créés avec un expression indifférente (code = 0).

  • Modifiez le code du constructeur de la classe VisageExpressif afin de pouvoir spécifier en paramètre une expression initiale, avec la valeur 0 (indifférent) comme valeur par défaut.
  • Pour tester votre code, modifiez testVisageExpressif.html afin que au chargement de la page trois VisagesExpressifs soient crées chacun avec une expression différente (0: indifférent, 1: joyeux et 2: triste) comme le montre la vidéo ci-dessous.
  • video: l'application testVisageExpressif après modification.

2. Un nouveau type de Visage Expressif les Visages Clowns

On veut définir un nouveau type de Visages, les Visages Clowns qui ont les mêmes caractéristiques que les VisagesExpressifs mais ont en plus un nez qui change de couleur à chaque changement d'expression (Fig. 10).

Visage Clown.
Les différentes expressions d'un Visage Clown.

Question 2 : définissez et testez un nouveau type d'objet VisageClown

Créez une nouvelle classe VisageClown et une page testVisageClown.html qui comme testVisagesExpressifs.html vous permettra de la tester en créant et animant trois visages clown, chacun avec une expression et une taille de nez différente.

La vidéo ci-dessous montre le résultat attendu.

video : l'application Test Visage Clown.

Question 3 : Modification de visages.html

Modifiez visages.html de manière à ce que :

  • au chargement de la page trois visages (un visage clown, un visage classique et un visage expressif) soient créés et affichés dans la zone de dessin,
  • lors de la génération aléatoire de visages, des visages des trois types soient créés (de manière équiprobable).
    • Pour les visages expressifs, l'expression initiale est elle aussi définie de manière aléatoire
    • Pour les visages clown, en plus de l'expression la taille du nez est fixée de manière aléatoire dans les limites suivantes :
      • rayon minimum du nez : 0.1 * rayon du visage
      • rayon maximum du nez : 0.3 * rayon du visage

La vidéo ci-dessous montre le résultat attendu.

video : Modification TestVisageExpressif.html pour afficher un VisageClown.

Partie 3 : HTML / CSS / Bootstrap

On souhaite créer un site web affichant des horloges donnant l'heure locale de différentes villes du monde. Un partie de ce site a été réalisée en utilisant les technologies HTML5, CSS3, JavaScript et Bootstrap 5, mais il n'est pas tout à fait achevé. Votre travail va consister à compléter le site existant. La figure ci-dessous vous montre le contenu et l'organisation du répertoire racine du site (03_Horloges).

Organisation du site Horloges.

3.1 : HTML/CSS

3.1.1 Définir des styles CSS

Question 1 : mise en forme de la page index.html

Ajoutez à horloges.css de nouvelles règles de styles CSS pour définir une couleur de fond bleu clair (composantes primaires Rouge : 208, Vert: 222 et Bleu: 252) pour toutes les pages du site et pour que les vignettes contenant l'horloge et la photographie de chacune des villes soient matérialisées de la manière suivante :

  • avec un fond de couleur lightsteelblue et dont les coins sont arrondis (rayon 15 pixels),
  • cette couleur de fond change et prend la valeur steelblue si la vignette est survollée par la souris,
  • la vignette à des marges internes et une marge externe inférieure de 10 pixels,
  • tout le contenu de la vignette (nom de la ville, horloge, image de la ville) est centré.
Liens de navigation entre les pages du site.

3.1.2 Liens hypertextes

Dans cette partie vous allez mettre en place les liens hypertextes permettant la navigation dans le site.

Question 2 : liens entre la page d'accueil et les pages de description des villes

Liens entre la page d'accueil et les pages de description des villes.
  • Modifiez le code de la page d'accueil index.html afin que
    • la vignette contenant de la ville de Vancouver supporte un lien hypertexte qui renvoie vers la page vancouver.html. Quel que soit l'endroit où l'utilisateur clique sur la vignette (le texte Vancouver, l'horloge, l'image du drapeau, la photographie réduite de la ville, le fond de la vignette) le lien est suivi.
    • pour les vignettes concernant les autres villes (Sidney, New York, Rio de Janeiro, ...) un lien hypertexte redirige vers la page underconstruction.html, page provisoire qui sera remplacée ultérieurement par des pages spécifiques à chacune des villes. Ne le faire que pour le ville de Sidney.
  • Modifiez le code de underconstruction.html pour que
    • l'item Acceuil renvoie vers la page d'accueil index.html

Question 3: liens externes vers iconarchive.com et wikimedia.org

Modifiez la page about.html, comme indiqué sur la figure qui suit afin que

  • dans les crédits pour l'auteur des images des drapeaux, on ait un lien vers la page de téléchargement des images sur le site iconarchive.com (l'url de cette page est https://www.iconarchive.com/show/flags-icons-by-icondrawer.html),

  • dans les crédits pour les photographies des villes, on ait un lien vers la page d'accueil (https://commons.wikimedia.org) du site Wikimedia Commons d'où ces images sont issues.

Faites en sorte que ces pages s'ouvrent dans un nouvel onglet du navigateur.

liens vers sites externes
Liens vers des sites externes

Question 4: liens internes à la page vancouver.html

Pour le moment, nous ne nous intéresserons pas aux liens de navigation vers les autres pages depuis la page vancouver.html, cela sera mis en oeuvre lorsque vous utiliserez Bootstrap 5 pour sa présentation. Par contre vous pouvez dès à present mettre en place les liens de navigation internes à celle-ci à savoir :

  1. le lien permettant d'aller directement aux informations climatiques depuis la présentation générale
  2. le lien permettant d'aller directement aux informations générales depuis les informations climatiques
Liens internes à la page vancouver.html.

3.1.3 Tableaux HTML

La page vancouver.html contient un tableau présentant les moyennnes mensuelles de températures et des hauteurs de précipitations pour la ville de Vancouver sur la période 1991-2020 (fig 7).

Le tableau des informations climatiques.

Question 5: modification du tableau des informations climatiques

Modifiez ce tableau de façon à ce que les informations de températures et de précipitations soient regroupées comme indiqué sur la figure ci-dessous.

Modification du tableau des informations climatiques.

3.2 : Utilisation de Bootstrap

Dans cette partie il s'agit de mettre en forme la page vancouver.html en utilisant le framework Bootstrap 5 (version 5.3.3 au 30/11/2024) comme dans les pages index.html et underconstruction.html.

Il existe différentes versions de Bootstrap : la dernière version est Bootstrap 5, c'est celle que vous devez utiliser. Prenez garde si vous consultez des documentations, tutoriaux ou forums en ligne de bien vous référer à la version 5 de Bootstrap qui est celle utilisée ici (et celle vue en cour et en TP).

3.2.1 Mise en forme et grille Bootsrap

Question 6: mise en forme de la page vancouver.html avec Bootstrap 5

En utilisant Bootstrap 5, modifiez la page vancouver.html afin d’obtenir un affichage conforme à celui présenté sur la figure ci-dessous.

Mise en forme de la page vancouver.html avec Bootstrap 5.

Les points qui sont demandés (et que vous pouvez réaliser dans n'importe ordre) sont :

  • mise en place d'une barre de navigation similaire à celles des autres pages du site (index.html, about.html ou underconstruction.html). Cette barre devra avoir les propriétés suivantes :
    • position fixe en haut de la fenêtre, elle reste toujours visible même lorsque l'on scrolle dans la page,
    • la barre se transforme en bouton avec menu déroulant (burger menu image du burgerButton ) lorsque la fenêtre n'est plus assez large pour afficher tous les items de navigation,
    • les items Accueil et A propos correspondent à des liens hypertexte qui conduisent respectivement aux pages index.html et about.html.
  • La présentation générale de la ville de Vancouver est faite avec la disposition (layout) suivant :
    • le contenu de la page occupe toute la largeur de la fenêtre du navigateur,
    • les trois premiers articles de la section Informations générales sont affichés sur deux colonnes :
      • la premier article avec l'image de la ville de Vancouver est dans une première colonne qui occupe les 3/4 de la largeur de la fenêtre du navigateur,
      • le deuxième article (avec le portrait de Georges Vancouver) et le troisième article sont dans une deuxième colonne qui occupe 1/4 de la largeur de la fenêtre du navigateur,
      • la taille (largeur) des colonnes et des images s'adapte automatiquement à la largeur de la fenêtre du navigateur. Par contre si cette dernière est inférieure à 576 pixels, la disposition en colonnes est abandonnée au profit d'une disposition en blocs les uns au dessous des autres
    • tous les autres éléments (titres, sections, articles, tableau) occupent toute la largeur de la fenêtre du navigateur.
  • Les deux images ont un effet de vignette (bordure blanche) et de plus un découpage circulaire est appliqué à l'image du portrait de Georges Vancouver. La taille des images s'adapte automatiquement à la largeur de la colonne où elles se situent.
  • Le tableau est mis en forme avec une bordure autour de chacune des cellules, avec les noms de colonnes en blanc sur fond noir et ensuite la couleur du fond des lignes du tableau varie entre deux nuances de gris une ligne sur deux afin de produire un effet de bandes (stripped).
    De plus si la fenêtre du navigateur n'est pas assez large pour afficher le tableau dans son entier, le tableau devient automatiquement scrollable et on peut parcourir son contenu à l'aide d'un ascenseur horizontal.
    Table scrollable.

3.2.2 Barre de navigation Boostrap

Question 7: modification de la barre de navigation

Dans la page vancouver.html rajouter entre les items Accueil et A propos un nouvel item Ville permettant à l'aide d'un menu déroulant (dropdown menu) d'accéder aux pages de description des différentes villes pour lesquelles il y a une horloge sur la page d'accueil. La figure ci-dessous présente le fonctionnement attendu pour ce menu.

Mise en forme de la page vancouver.html avec Bootstrap 5.

3.3 : Un peu de JavaScript pour finir

Question 8: ajouter une horloge dans la page vancouver.html

Dans le titre de niveau 1 (élément h1) de la page de description de la ville de Vancouver rajoutez une horloge qui affiche l'heure locale de cette ville comme indiqué sur la figure ci-dessous. Le décalage horaire entre Vancouver et la France est de -9 heures.

Fig.12 - ajout d'une horloge pour Vancouver.