You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Web-Dev-For-Beginners/translations/fr/7-bank-project/3-data
localizeflow[bot] da161c96d3
chore(i18n): sync translations with latest source changes (chunk 1/1, 464 changes)
7 months ago
..
README.md chore(i18n): sync translations with latest source changes (chunk 1/1, 464 changes) 7 months ago
assignment.md chore(i18n): sync translations with latest source changes (chunk 1/1, 464 changes) 7 months ago

README.md

Construire une application bancaire Partie 3 : Méthodes de récupération et dutilisation des données

Pensez à lordinateur de lEnterprise dans Star Trek - quand le Capitaine Picard demande létat du vaisseau, linformation apparaît instantanément sans que toute linterface ne sarrête et se reconstruise. Ce flux dinformations fluide est exactement ce que nous construisons ici avec la récupération dynamique des données.

Pour linstant, votre application bancaire est comme un journal imprimé - informative mais statique. Nous allons la transformer en quelque chose de plus proche du centre de contrôle de la NASA, où les données circulent en continu et se mettent à jour en temps réel sans interrompre le flux de travail de lutilisateur.

Vous apprendrez à communiquer avec les serveurs de manière asynchrone, gérer des données qui arrivent à différents moments, et transformer des informations brutes en quelque chose de significatif pour vos utilisateurs. Cest la différence entre un simple démonstrateur et un logiciel prêt pour la production.

Ce que vous pouvez faire dans les 5 prochaines minutes

Parcours rapide pour développeurs occupés

flowchart LR
    A[⚡ 5 minutes] --> B[Configurer le serveur API]
    B --> C[Test de récupération avec curl]
    C --> D[Créer la fonction de connexion]
    D --> E[Voir les données en action]
  • Minute 1-2 : Lancez votre serveur API (cd api && npm start) et testez la connexion
  • Minute 3 : Créez une fonction basique getAccount() utilisant fetch
  • Minute 4 : Branchez le formulaire de connexion avec action="javascript:login()"
  • Minute 5 : Testez la connexion et observez les données du compte apparaître dans la console

Commandes de test rapide :

# Vérifier que l'API fonctionne
curl http://localhost:5000/api

# Tester la récupération des données du compte
curl http://localhost:5000/api/accounts/test

Pourquoi cest important : En 5 minutes, vous verrez la magie de la récupération asynchrone des données qui alimente toutes les applications web modernes. Cest la base qui rend les applications réactives et vivantes.

🗺️ Votre parcours dapprentissage des applications web axées sur les données

journey
    title Des pages statiques aux applications dynamiques
    section Comprendre l'évolution
      Rechargements de page traditionnels: 3: You
      Découvrir les avantages d'AJAX/SPA: 5: You
      Maîtriser les modèles Fetch API: 7: You
    section Construire l'authentification
      Créer des fonctions de connexion: 4: You
      Gérer les opérations asynchrones: 6: You
      Gérer les sessions utilisateur: 8: You
    section Mises à jour dynamiques de l'interface utilisateur
      Apprendre la manipulation du DOM: 5: You
      Construire des affichages de transactions: 7: You
      Créer des tableaux de bord réactifs: 9: You
    section Modèles professionnels
      Rendu basé sur des templates: 6: You
      Stratégies de gestion des erreurs: 7: You
      Optimisation des performances: 8: You

Votre destination dapprentissage : À la fin de cette leçon, vous comprendrez comment les applications web modernes récupèrent, traitent et affichent les données de façon dynamique, créant lexpérience utilisateur fluide que nous attendons des applications professionnelles.

Quiz préalable à la leçon

Quiz préalable à la leçon

Prérequis

Avant de plonger dans la récupération des données, assurez-vous davoir ces éléments prêts :

curl http://localhost:5000/api
# Réponse attendue : "API bancaire v1.0.0"

Ce test rapide garantit que tous les éléments communiquent correctement :

  • Vérifie que Node.js fonctionne correctement sur votre machine
  • Confirme que votre serveur API est actif et répond
  • Valide que votre app peut atteindre le serveur (comme vérifier la radio avant une mission)

🧠 Aperçu de lécosystème de gestion des données

mindmap
  root((Gestion des données))
    Authentication Flow
      Login Process
        Validation du formulaire
        Vérification des identifiants
        Gestion de la session
      User State
        Objet global du compte
        Gardes de navigation
        Gestion des erreurs
    API Communication
      Fetch Patterns
        Requêtes GET
        Requêtes POST
        Réponses derreur
      Data Formats
        Traitement JSON
        Encodage URL
        Analyse des réponses
    Dynamic UI Updates
      DOM Manipulation
        Mises à jour de texte sécurisées
        Création déléments
        Clonage de modèles
      User Experience
        Mises à jour en temps réel
        Messages derreur
        États de chargement
    Security Considerations
      XSS Prevention
        Utilisation de textContent
        Assainissement des entrées
        Création de HTML sécurisé
      CORS Handling
        Requêtes cross-origin
        Configuration des entêtes
        Configuration du développement

Principe de base : Les applications web modernes sont des systèmes dorchestration des données - elles coordonnent entre interfaces utilisateur, APIs serveur, et modèles de sécurité des navigateurs pour créer des expériences fluides et réactives.


Comprendre la récupération des données dans les applications web modernes

La manière dont les applications web gèrent les données a énormément évolué au cours des deux dernières décennies. Comprendre cette évolution vous aidera à apprécier pourquoi des techniques modernes comme AJAX et lAPI Fetch sont si puissantes et pourquoi elles sont devenues des outils indispensables pour les développeurs web.

Explorons comment les sites traditionnels fonctionnaient comparé aux applications dynamiques et réactives que nous construisons aujourdhui.

Applications multi-pages traditionnelles (MPA)

Aux débuts du web, chaque clic était comme changer de chaîne sur une vieille télévision - lécran devenait blanc, puis se branchait lentement sur le nouveau contenu. Cétait la réalité des premières applications web, où chaque interaction signifiait reconstruire entièrement la page depuis zéro.

sequenceDiagram
    participant User
    participant Browser
    participant Server
    
    User->>Browser: Clique sur un lien ou soumet un formulaire
    Browser->>Server: Demande une nouvelle page HTML
    Note over Browser: La page devient blanche
    Server->>Browser: Renvoie la page HTML complète
    Browser->>User: Affiche la nouvelle page (clignotement/rechargement)

Flux de mise à jour dans une application multi-page

Pourquoi cette approche semblait lourde :

  • Chaque clic impliquait de reconstruire toute la page depuis le début
  • Les utilisateurs étaient interrompus dans leurs pensées par ces flashs de page agaçants
  • Votre connexion Internet travaillait en surchauffe en téléchargeant le même en-tête et pied de page en boucle
  • Les applications ressemblaient plus à cliquer dans un classeur quà utiliser un logiciel

Applications monpage modernes (SPA)

AJAX (Asynchronous JavaScript and XML) a complètement changé ce paradigme. À limage du design modulaire de la Station Spatiale Internationale, où les astronautes peuvent remplacer des composants individuels sans tout reconstruire, AJAX nous permet de mettre à jour des parties spécifiques dune page web sans tout recharger. Malgré le nom évoquant XML, on utilise aujourdhui surtout JSON, mais le principe reste : ne mettre à jour que ce qui doit changer.

sequenceDiagram
    participant User
    participant Browser
    participant JavaScript
    participant Server
    
    User->>Browser: Interagit avec la page
    Browser->>JavaScript: Déclenche le gestionnaire d'événements
    JavaScript->>Server: Récupère uniquement les données nécessaires
    Server->>JavaScript: Retourne les données JSON
    JavaScript->>Browser: Met à jour des éléments spécifiques de la page
    Browser->>User: Affiche le contenu mis à jour (sans rechargement)

Flux de mise à jour dans une application monpage

Pourquoi les SPA sont tellement mieux ressenties :

  • Seules les parties effectivement modifiées sont mises à jour (intelligent, non ?)
  • Plus dinterruptions brutales - vos utilisateurs restent dans leur flux
  • Moins de données sur le réseau signifie un chargement plus rapide
  • Tout est fluide et réactif, comme les apps sur votre téléphone

Lévolution vers lAPI moderne Fetch

Les navigateurs modernes proposent lAPI Fetch, qui remplace lancienne XMLHttpRequest. Comme la différence entre utiliser un télégraphe et envoyer un email, Fetch API utilise les promesses pour un code asynchrone plus propre et gère naturellement le JSON.

Fonctionnalité XMLHttpRequest Fetch API
Syntaxe Basée sur des callbacks complexes Basée sur des promesses claires
Gestion JSON Analyse manuelle requise Méthode intégrée .json()
Gestion des erreurs Informations derreur limitées Détails derreur complets
Support moderne Compatibilité legacy Promesses ES6+ et async/await

💡 Compatibilité des navigateurs : Bonne nouvelle - lAPI Fetch fonctionne dans tous les navigateurs modernes ! Si vous êtes curieux des versions spécifiques, caniuse.com présente le tableau complet de compatibilité.

En résumé :

  • Fonctionne parfaitement sur Chrome, Firefox, Safari et Edge (en gros partout où sont vos utilisateurs)
  • Seul Internet Explorer nécessite une aide supplémentaire (et honnêtement, il est temps de laisser tomber IE)
  • Vous prépare parfaitement pour les élégants patterns async/await que nous utiliserons plus tard

Implémentation de la connexion utilisateur et récupération des données

Passons maintenant à la mise en place du système de connexion qui transforme votre application bancaire dun affichage statique à une application fonctionnelle. À limage des protocoles dauthentification utilisés dans des installations militaires sécurisées, nous vérifierons les identifiants utilisateur puis fournirons laccès à leurs données spécifiques.

Nous construirons cela pas à pas, en commençant par lauthentification basique puis en ajoutant les capacités de récupération de données.

Étape 1 : Créer la base de la fonction de connexion

Ouvrez votre fichier app.js et ajoutez une nouvelle fonction login. Elle gérera le processus dauthentification utilisateur :

async function login() {
  const loginForm = document.getElementById('loginForm');
  const user = loginForm.user.value;
}

Décortiquons cela :

  • Ce mot-clé async ? Il indique à JavaScript « hé, cette fonction pourrait devoir patienter »
  • On récupère notre formulaire depuis la page (rien de compliqué, juste retrouver par son ID)
  • Puis on extrait ce que lutilisateur a tapé comme nom dutilisateur
  • Astuce sympa : vous pouvez accéder à nimporte quel champ de formulaire par son attribut name - pas besoin dappels supplémentaires getElementById !

💡 Accès aux formulaires : Chaque contrôle de formulaire peut être accédé par son nom (défini en HTML via lattribut name) en tant que propriété de lélément formulaire. Cela offre une façon claire et lisible de récupérer les données du formulaire.

Étape 2 : Créer la fonction de récupération des données de compte

Ensuite, créons une fonction dédiée pour récupérer les données du compte depuis le serveur. Cela suit le même modèle que votre fonction dinscription mais se concentre sur la récupération de données :

async function getAccount(user) {
  try {
    const response = await fetch('//localhost:5000/api/accounts/' + encodeURIComponent(user));
    return await response.json();
  } catch (error) {
    return { error: error.message || 'Unknown error' };
  }
}

Voici ce que fait ce code :

  • Utilise lAPI fetch moderne pour demander les données de manière asynchrone
  • Construit une URL de requête GET avec le paramètre du nom dutilisateur
  • Applique encodeURIComponent() pour gérer proprement les caractères spéciaux dans lURL
  • Convertit la réponse en format JSON pour faciliter la manipulation des données
  • Gère les erreurs avec élégance en renvoyant un objet erreur plutôt que de planter

⚠️ Note de sécurité : La fonction encodeURIComponent() gère les caractères spéciaux dans les URLs. À limage des systèmes de codage utilisés dans les communications navales, elle assure que votre message arrive exactement comme prévu, sans risque quun caractère comme "#" ou "&" soit mal interprété.

Pourquoi cest important :

  • Empêche les caractères spéciaux de casser les URLs
  • Protège contre des attaques de manipulation dURL
  • Assure que votre serveur reçoit bien les données prévues
  • Suit les bonnes pratiques de développement sécurisé

Comprendre les requêtes HTTP GET

Voici quelque chose qui pourrait vous surprendre : quand vous utilisez fetch sans options supplémentaires, il crée automatiquement une requête GET. Cest parfait pour ce que nous faisons - demander au serveur « hé, puis-je voir les données de compte de cet utilisateur ? »

Pensez aux requêtes GET comme des demandes polies demprunter un livre à la bibliothèque - vous demandez à voir quelque chose qui existe déjà. Les requêtes POST (que nous avons utilisées pour linscription) sont plutôt comme soumettre un nouveau livre à ajouter à la collection.

Requête GET Requête POST
But Récupérer des données existantes
Paramètres Dans le chemin/chaîne de requête de lURL
Mise en cache Peut être mise en cache par les navigateurs
Sécurité Visible dans lURL/logs
sequenceDiagram
    participant B as Navigateur
    participant S as Serveur
    
    Note over B,S: Requête GET (Récupération de données)
    B->>S: GET /api/accounts/test
    S-->>B: 200 OK + Données du compte
    
    Note over B,S: Requête POST (Soumission de données)
    B->>S: POST /api/accounts + Nouvelles données du compte
    S-->>B: 201 Créé + Confirmation
    
    Note over B,S: Gestion des erreurs
    B->>S: GET /api/accounts/nonexistent
    S-->>B: 404 Non trouvé + Message d'erreur

Étape 3 : Tout assembler

Voici la partie satisfaisante - connectons votre fonction de récupération des comptes au processus de connexion. Cest là que tout simbrique :

async function login() {
  const loginForm = document.getElementById('loginForm');
  const user = loginForm.user.value;
  const data = await getAccount(user);

  if (data.error) {
    return console.log('loginError', data.error);
  }

  account = data;
  navigate('/dashboard');
}

Cette fonction suit une séquence claire :

  • Extrait le nom dutilisateur depuis le champ du formulaire
  • Demande les données du compte utilisateur au serveur
  • Gère les erreurs qui peuvent survenir durant le processus
  • Stocke les données du compte et navigue vers le tableau de bord en cas de succès

🎯 Pattern Async/Await : Comme getAccount est une fonction asynchrone, on utilise le mot-clé await pour suspendre lexécution jusquà ce que le serveur réponde. Cela empêche le code de continuer avec des données indéfinies.

Étape 4 : Créer un emplacement pour vos données

Votre application a besoin dun endroit pour mémoriser les informations du compte une fois chargées. Pensez à cela comme la mémoire à court terme de votre app - un endroit pour garder sous la main les données de lutilisateur actuel. Ajoutez cette ligne en haut de votre fichier app.js :

// Ceci contient les données du compte de l'utilisateur actuel
let account = null;

Pourquoi cest nécessaire :

  • Garde les données du compte accessibles de partout dans votre app
  • Commencer avec null signifie « personne nest encore connecté »
  • Est mise à jour quand quelquun se connecte ou sinscrit avec succès
  • Sert de source unique de vérité - pas de confusion sur lutilisateur connecté

Étape 5 : Connecter votre formulaire

Connectons maintenant votre toute nouvelle fonction de connexion à votre formulaire HTML. Mettez à jour votre balise formulaire ainsi :

<form id="loginForm" action="javascript:login()">
  <!-- Your existing form inputs -->
</form>

Ce que ce petit changement fait :

  • Empêche le formulaire dexécuter son comportement par défaut « recharger toute la page »
  • Appelle votre fonction JavaScript personnalisée à la place
  • Garde tout fluide, comme une application monpage
  • Vous donne un contrôle total sur ce qui se passe quand les utilisateurs cliquent sur « Connexion »

Étape 6 : Améliorer votre fonction dinscription

Pour plus de cohérence, mettez à jour votre fonction register pour quelle stocke aussi les données du compte et navigue vers le tableau de bord :

// Ajoutez ces lignes à la fin de votre fonction d'enregistrement
account = result;
navigate('/dashboard');

Cet ajout fournit :

  • Transition fluide de linscription vers le tableau de bord
  • Expérience utilisateur cohérente entre le flux de connexion et dinscription
  • Accès immédiat aux données du compte après inscription réussie

Tester votre implémentation

flowchart TD
    A[Utilisateur saisit les identifiants] --> B[Fonction de connexion appelée]
    B --> C[Récupérer les données du compte depuis le serveur]
    C --> D{Données reçues avec succès ?}
    D -->|Oui| E[Stocker les données du compte globalement]
    D -->|Non| F[Afficher un message d'erreur]
    E --> G[Naviguer vers le tableau de bord]
    F --> H[L'utilisateur reste sur la page de connexion]

Il est temps de tester :

  1. Créez un nouveau compte pour vous assurer que tout fonctionne
  2. Essayez de vous connecter avec ces mêmes identifiants
  3. Jetez un œil à la console de votre navigateur (F12) si quelque chose semble bizarre
  4. Assurez-vous darriver sur le tableau de bord après une connexion réussie

Si quelque chose ne marche pas, pas de panique ! La plupart des problèmes sont des fautes de frappe ou un serveur API non lancé.

Un mot rapide sur la magie Cross-Origin

Vous vous demandez peut-être : « Comment mon app web peut-elle parler à ce serveur API alors quils tournent sur des ports différents ? » Excellente question ! Cela touche à un point que tout développeur web rencontre tôt ou tard.

🔒 Sécurité Cross-Origin : Les navigateurs appliquent une « politique de même origine » pour empêcher les communications non autorisées entre domaines différents. À limage du système de contrôle au Pentagone, ils vérifient que la communication est autorisée avant dautoriser le transfert de données.

Dans notre configuration :

  • Votre app web tourne sur localhost:3000 (serveur de dev)
  • Votre serveur API tourne sur localhost:5000 (serveur backend)
  • Le serveur API inclut des en-têtes CORS qui autorisent explicitement la communication avec votre app web

Cette configuration reflète le développement réel où les apps frontend et backend tournent généralement sur des serveurs séparés.

📚 En savoir plus : Approfondissez les APIs et la récupération de données avec ce module complet Microsoft Learn sur les APIs.

Donner vie à vos données dans le HTML

Maintenant, nous allons rendre les données récupérées visibles aux utilisateurs via la manipulation du DOM. Comme le processus de développement de photographies dans une chambre noire, nous transformons des données invisibles en quelque chose que les utilisateurs peuvent voir et manipuler. La manipulation du DOM est la technique qui transforme des pages web statiques en applications dynamiques qui mettent à jour leur contenu en fonction des interactions utilisateur et des réponses du serveur.

Choisir le bon outil pour le travail

Quand il s'agit de mettre à jour votre HTML avec JavaScript, vous avez plusieurs options. Pensez-y comme à différents outils dans une boîte à outils - chacun parfait pour des tâches spécifiques :

Méthode Ce pour quoi elle est idéale Quand l'utiliser Niveau de sécurité
textContent Affichage sécurisé des données utilisateur Chaque fois que vous affichez du texte Solide comme un roc
createElement() + append() Construction de mises en page complexes Création de nouvelles sections/listes Infaillible
innerHTML Définition du contenu HTML ⚠️ Essayez d'éviter celui-ci Risqué

La façon sûre d'afficher du texte : textContent

La propriété textContent est votre meilleur allié pour afficher les données utilisateur. C'est comme avoir un videur pour votre page web - rien de nuisible ne passe :

// La méthode sûre et fiable pour mettre à jour le texte
const balanceElement = document.getElementById('balance');
balanceElement.textContent = account.balance;

Avantages de textContent :

  • Traite tout comme du texte brut (empêche l'exécution de scripts)
  • Efface automatiquement le contenu existant
  • Efficace pour des mises à jour de texte simples
  • Offre une sécurité intégrée contre les contenus malveillants

Créer des éléments HTML dynamiques

Pour un contenu plus complexe, combinez document.createElement() avec la méthode append() :

// Méthode sûre pour créer de nouveaux éléments
const transactionItem = document.createElement('div');
transactionItem.className = 'transaction-item';
transactionItem.textContent = `${transaction.date}: ${transaction.description}`;
container.append(transactionItem);

Comprendre cette approche :

  • Crée de nouveaux éléments DOM de manière programmatique
  • Maintient un contrôle total sur les attributs et le contenu des éléments
  • Permet des structures d'éléments imbriqués complexes
  • Préserve la sécurité en séparant la structure du contenu

⚠️ Considération de sécurité : Bien que innerHTML apparaisse dans de nombreux tutoriels, il peut exécuter des scripts intégrés. Comme les protocoles de sécurité au CERN qui empêchent l'exécution non autorisée de code, l'utilisation de textContent et createElement offre des alternatives plus sûres.

Risques de innerHTML :

  • Exécute toutes les balises <script> dans les données utilisateur
  • Vulnérable aux attaques d'injection de code
  • Crée des vulnérabilités potentielles en matière de sécurité
  • Les alternatives plus sûres que nous utilisons fournissent une fonctionnalité équivalente

Rendre les erreurs plus conviviales pour l'utilisateur

Actuellement, les erreurs de connexion n'apparaissent que dans la console du navigateur, ce qui est invisible pour les utilisateurs. Comme la différence entre le diagnostic interne d'un pilote et le système d'information passager, nous devons communiquer les informations importantes par le canal approprié.

Afficher des messages d'erreur visibles offre aux utilisateurs un retour immédiat sur ce qui a mal tourné et comment procéder.

Étape 1 : Ajouter un emplacement pour les messages d'erreur

D'abord, donnons un emplacement aux messages d'erreur dans votre HTML. Ajoutez ceci juste avant votre bouton de connexion pour que les utilisateurs le voient naturellement :

<!-- This is where error messages will appear -->
<div id="loginError" role="alert"></div>
<button>Login</button>

Ce qui se passe ici :

  • Nous créons un conteneur vide qui reste invisible jusqu'à ce qu'il soit nécessaire
  • Il est positionné là où les utilisateurs regardent naturellement après avoir cliqué sur "Connexion"
  • Ce role="alert" est un joli détail pour les lecteurs d'écran - il dit à la technologie d'assistance « hé, cest important ! »
  • Lid unique offre une cible facile à notre JavaScript

Étape 2 : Créer une fonction helper pratique

Faisons une petite fonction utilitaire capable de mettre à jour le texte de n'importe quel élément. Cest une de ces fonctions "écrite une fois, utilisée partout" qui vous fera gagner du temps :

function updateElement(id, text) {
  const element = document.getElementById(id);
  element.textContent = text;
}

Avantages de la fonction :

  • Interface simple ne nécessitant quun ID délément et un contenu texte
  • Localise et met à jour les éléments DOM de façon sécurisée
  • Modèle réutilisable qui réduit la duplication du code
  • Maintient un comportement de mise à jour cohérent dans toute lapplication

Étape 3 : Afficher les erreurs là où les utilisateurs peuvent les voir

Maintenant, remplaçons ce message caché dans la console par quelque chose que les utilisateurs peuvent réellement voir. Mettez à jour votre fonction de connexion :

// Au lieu de simplement enregistrer dans la console, montrez à l'utilisateur ce qui ne va pas
if (data.error) {
  return updateElement('loginError', data.error);
}

Ce petit changement fait une grande différence :

  • Les messages d'erreur apparaissent là où les utilisateurs regardent
  • Fini les échecs silencieux et mystérieux
  • Les utilisateurs reçoivent un retour immédiat et exploitable
  • Votre application commence à paraître professionnelle et attentive

Maintenant, lorsque vous testez avec un compte invalide, vous verrez un message derreur utile directement sur la page !

Capture d'écran montrant le message d'erreur affiché lors de la connexion

Étape 4 : Être inclusif avec l'accessibilité

Voici quelque chose de cool à propos de ce role="alert" que nous avons ajouté plus tôt ce nest pas juste du décor ! Ce petit attribut crée ce quon appelle une région dynamique qui annonce immédiatement les changements aux lecteurs décran :

<div id="loginError" role="alert"></div>

Pourquoi cest important :

  • Les utilisateurs de lecteurs décran entendent le message derreur dès qu'il apparaît
  • Tout le monde reçoit la même information importante, peu importe comment il navigue
  • Cest une façon simple de rendre votre application accessible à davantage de personnes
  • Montre que vous vous souciez de créer des expériences inclusives

Les petites attentions comme celle-ci différencient les bons développeurs des excellents !

🎯 Vérification pédagogique : modèles dauthentification

Pause et réflexion : Vous venez de mettre en place un flux complet dauthentification. Cest un modèle fondamental en développement web.

Auto-évaluation rapide :

  • Pouvez-vous expliquer pourquoi nous utilisons async/await pour les appels API ?
  • Que se passerait-il si nous oubliions la fonction encodeURIComponent() ?
  • Comment notre gestion des erreurs améliore-t-elle lexpérience utilisateur ?

Lien avec le monde réel : Les modèles que vous avez appris ici (récupération asynchrone des données, gestion des erreurs, retour utilisateur) sont utilisés dans toutes les grandes applications web, des réseaux sociaux aux sites de commerce électronique. Vous développez des compétences prêtes pour la production !

Question challenge : Comment pourriez-vous modifier ce système dauthentification pour gérer plusieurs rôles utilisateur (client, administrateur, guichetier) ? Pensez à la structure des données et aux changements dinterface utilisateur nécessaires.

Étape 5 : Appliquer le même modèle à lenregistrement

Pour la cohérence, mettez en œuvre la même gestion derreurs dans votre formulaire dinscription :

  1. Ajoutez un élément daffichage derreur dans votre HTML dinscription :
<div id="registerError" role="alert"></div>
  1. Mettez à jour votre fonction denregistrement pour utiliser le même modèle daffichage derreur :
if (data.error) {
  return updateElement('registerError', data.error);
}

Avantages dune gestion derreurs cohérente :

  • Offre une expérience utilisateur uniforme dans tous les formulaires
  • Réduit la charge cognitive grâce à des modèles familiers
  • Simplifie la maintenance avec du code réutilisable
  • Garantit le respect des normes daccessibilité partout dans lapplication

Créer votre tableau de bord dynamique

Maintenant, nous allons transformer votre tableau de bord statique en une interface dynamique qui affiche les données réelles du compte. Comme la différence entre un horaire de vol imprimé et les panneaux de départ en temps réel dans les aéroports, nous passons dinformations statiques à des affichages réactifs et en direct.

En utilisant les techniques de manipulation du DOM que vous avez apprises, nous allons créer un tableau de bord qui se met à jour automatiquement avec les informations actuelles du compte.

Apprivoiser vos données

Avant de commencer à construire, jetons un coup dœil au type de données que votre serveur renvoie. Lorsquun utilisateur se connecte avec succès, voici le trésor dinformations à votre disposition :

{
  "user": "test",
  "currency": "$",
  "description": "Test account",
  "balance": 75,
  "transactions": [
    { "id": "1", "date": "2020-10-01", "object": "Pocket money", "amount": 50 },
    { "id": "2", "date": "2020-10-03", "object": "Book", "amount": -10 },
    { "id": "3", "date": "2020-10-04", "object": "Sandwich", "amount": -5 }
  ]
}

Cette structure de données fournit :

  • user : Parfait pour personnaliser lexpérience (« Bienvenue, Sarah ! »)
  • currency : Assure laffichage correct des montants monétaires
  • description : Un nom convivial pour le compte
  • balance : Le solde actuel si important
  • transactions : Lhistorique complet des transactions avec tous les détails

Tout ce dont vous avez besoin pour construire un tableau de bord bancaire professionnel !

flowchart TD
    A[Connexion Utilisateur] --> B[Récupérer les Données du Compte]
    B --> C{Données Valides ?}
    C -->|Oui| D[Enregistrer dans une Variable Globale]
    C -->|Non| E[Afficher un Message d'Erreur]
    D --> F[Naviguer vers le Tableau de Bord]
    F --> G[Mettre à Jour les Éléments UI]
    G --> H[Afficher le Solde]
    G --> I[Montrer la Description]
    G --> J[Afficher les Transactions]
    J --> K[Créer les Lignes du Tableau]
    K --> L[Formater la Monnaie]
    L --> M[L'Utilisateur Voit les Données en Direct]

💡 Astuce pro : Vous voulez voir votre tableau de bord en action immédiatement ? Utilisez le nom dutilisateur test lors de la connexion - il contient des données dexemple préchargées pour voir tout fonctionner sans avoir à créer de transactions.

Pourquoi le compte test est pratique :

  • Livré avec des données dexemple réalistes déjà chargées
  • Parfait pour voir comment les transactions saffichent
  • Idéal pour tester les fonctionnalités du tableau de bord
  • Vous évite de devoir créer manuellement des données factices

Créer les éléments daffichage du tableau de bord

Construisons votre interface de tableau de bord étape par étape, en commençant par les informations de résumé du compte, puis en avançant vers des fonctionnalités plus complexes comme les listes de transactions.

Étape 1 : Mettre à jour la structure HTML

Commencez par remplacer la section statique « Solde » par des éléments de substitution dynamiques que votre JavaScript pourra remplir :

<section>
  Balance: <span id="balance"></span><span id="currency"></span>
</section>

Ensuite, ajoutez une section pour la description du compte. Puisque cela agit comme un titre pour le contenu du tableau de bord, utilisez du HTML sémantique :

<h2 id="description"></h2>

Comprendre la structure HTML :

  • Utilise des éléments <span> séparés pour le solde et la devise afin davoir un contrôle individuel
  • Applique des IDs uniques à chaque élément pour cibler en JavaScript
  • Suit le HTML sémantique en utilisant un <h2> pour la description du compte
  • Crée une hiérarchie logique pour les lecteurs décran et le référencement

Insight accessibilité : La description du compte fonctionne comme un titre pour le contenu du tableau de bord et est marquée comme un en-tête. Apprenez-en plus sur la façon dont la structure des titres impacte laccessibilité. Pouvez-vous identifier dautres éléments sur votre page qui pourraient bénéficier de balises den-tête ?

Étape 2 : Créer la fonction de mise à jour du tableau de bord

Créez maintenant une fonction qui remplit votre tableau de bord avec des données réelles du compte :

function updateDashboard() {
  if (!account) {
    return navigate('/login');
  }

  updateElement('description', account.description);
  updateElement('balance', account.balance.toFixed(2));
  updateElement('currency', account.currency);
}

Étape par étape, voici ce que fait cette fonction :

  • Vérifie que les données du compte existent avant de continuer
  • Redirige les utilisateurs non authentifiés vers la page de connexion
  • Met à jour la description du compte en utilisant la fonction réutilisable updateElement
  • Formate le solde pour afficher toujours deux décimales
  • Affiche le symbole monétaire approprié

💰 Formatage de largent : Cette méthode toFixed(2) est une bouée de sauvetage ! Elle garantit que votre solde ressemble toujours à de largent réel - « 75.00 » au lieu de simplement « 75 ». Vos utilisateurs apprécieront ce formatage monétaire familier.

Étape 3 : Sassurer que le tableau de bord se met à jour

Pour garantir que votre tableau de bord se rafraîchit avec les données actuelles chaque fois quun utilisateur le consulte, nous devons connecter cela à votre système de navigation. Si vous avez complété lexercice de la leçon 1, cela devrait vous sembler familier. Sinon, pas dinquiétude voici ce quil vous faut :

Ajoutez ceci à la fin de votre fonction updateRoute() :

if (typeof route.init === 'function') {
  route.init();
}

Puis mettez à jour vos routes pour inclure linitialisation du tableau de bord :

const routes = {
  '/login': { templateId: 'login' },
  '/dashboard': { templateId: 'dashboard', init: updateDashboard }
};

Ce que ce montage astucieux fait :

  • Vérifie si une route a un code dinitialisation spécial
  • Exécute ce code automatiquement lorsque la route se charge
  • Garantit que votre tableau de bord affiche toujours des données fraîches et à jour
  • Garde votre logique de routage propre et organisée

Tester votre tableau de bord

Après avoir mis en œuvre ces modifications, testez votre tableau de bord :

  1. Connectez-vous avec un compte test
  2. Vérifiez que vous êtes redirigé vers le tableau de bord
  3. Contrôlez que la description du compte, le solde et la devise saffichent correctement
  4. Essayez de vous déconnecter puis reconnecter pour vous assurer que les données se rafraîchissent correctement

Votre tableau de bord devrait maintenant afficher des informations dynamiques sur le compte qui se mettent à jour en fonction de lutilisateur connecté !

Construire des listes de transactions intelligentes avec des templates

Au lieu de créer manuellement du HTML pour chaque transaction, nous allons utiliser des templates pour générer automatiquement un formatage cohérent. Comme les composants standardisés utilisés dans la fabrication spatiale, les templates garantissent que chaque ligne de transaction suit la même structure et apparence.

Cette technique évolue efficacement de quelques transactions à des milliers, tout en maintenant des performances et une présentation cohérentes.

graph LR
    A[Modèle HTML] --> B[Clone JavaScript]
    B --> C[Remplir avec des données]
    C --> D[Ajouter au fragment]
    D --> E[Insertion groupée dans le DOM]
    
    subgraph "Avantages de performance"
        F[Mise à jour unique du DOM]
        G[Formatage cohérent]
        H[Modèle réutilisable]
    end
    
    E --> F
    E --> G
    E --> H
flowchart LR
    A[Données de transaction] --> B[Modèle HTML]
    B --> C[Cloner le modèle]
    C --> D[Remplir avec les données]
    D --> E[Ajouter au DOM]
    E --> F[Répéter pour chaque transaction]

Étape 1 : Créer le template de la transaction

Commencez par ajouter un template réutilisable pour les lignes de transaction dans le <body> de votre HTML :

<template id="transaction">
  <tr>
    <td></td>
    <td></td>
    <td></td>
  </tr>
</template>

Comprendre les templates HTML :

  • Définit la structure dune seule ligne de tableau
  • Reste invisible jusquà ce quelle soit clonée et remplie par JavaScript
  • Inclut trois cellules pour la date, la description et le montant
  • Fournit un modèle réutilisable pour un formatage cohérent

Étape 2 : Préparer votre tableau pour du contenu dynamique

Ensuite, ajoutez un id à la partie corps du tableau pour que JavaScript puisse facilement le cibler :

<tbody id="transactions"></tbody>

Ce que cela accomplit :

  • Crée une cible claire pour insérer les lignes de transaction
  • Sépare la structure du tableau du contenu dynamique
  • Permet de vider facilement et de remplir à nouveau les données des transactions

Étape 3 : Construire la fonction fabrique de ligne de transaction

Créez maintenant une fonction qui transforme les données de transaction en éléments HTML :

function createTransactionRow(transaction) {
  const template = document.getElementById('transaction');
  const transactionRow = template.content.cloneNode(true);
  const tr = transactionRow.querySelector('tr');
  tr.children[0].textContent = transaction.date;
  tr.children[1].textContent = transaction.object;
  tr.children[2].textContent = transaction.amount.toFixed(2);
  return transactionRow;
}

Décomposer cette fonction fabrique :

  • Récupère lélément template par son ID
  • Clône le contenu du template pour une manipulation sécurisée
  • Sélectionne la ligne de tableau à lintérieur du contenu cloné
  • Remplit chaque cellule avec les données de la transaction
  • Formate le montant pour afficher les décimales correctes
  • Retourne la ligne complète prête à être insérée

Étape 4 : Générer efficacement plusieurs lignes de transaction

Ajoutez ce code à votre fonction updateDashboard() pour afficher toutes les transactions :

const transactionsRows = document.createDocumentFragment();
for (const transaction of account.transactions) {
  const transactionRow = createTransactionRow(transaction);
  transactionsRows.appendChild(transactionRow);
}
updateElement('transactions', transactionsRows);

Comprendre cette approche efficace :

  • Crée un fragment de document pour grouper les opérations DOM
  • Itère sur toutes les transactions dans les données du compte
  • Génère une ligne pour chaque transaction via la fonction fabrique
  • Collecte toutes les lignes dans le fragment avant de les ajouter au DOM
  • Effectue une seule mise à jour du DOM au lieu de plusieurs insertions individuelles

Optimisation des performances : document.createDocumentFragment() fonctionne comme la chaîne d'assemblage chez Boeing - les composants sont préparés hors de la ligne principale, puis installés en tant qu'unité complète. Cette approche de regroupement minimise les reflows du DOM en effectuant une seule insertion au lieu de multiples opérations individuelles.

Étape 5 : Améliorez la fonction de mise à jour pour un contenu mixte

Votre fonction updateElement() ne gère actuellement que le contenu textuel. Mettez-la à jour pour qu'elle fonctionne avec du texte et des nœuds DOM :

function updateElement(id, textOrNode) {
  const element = document.getElementById(id);
  element.textContent = ''; // Removes all children
  element.append(textOrNode);
}

Améliorations clés dans cette mise à jour :

  • Efface le contenu existant avant d'ajouter du nouveau contenu
  • Accepte soit des chaînes de texte soit des nœuds DOM en paramètres
  • Utilise la méthode append() pour plus de flexibilité
  • Maintient la compatibilité ascendante avec l'utilisation textuelle existante

Faites un essai de votre tableau de bord

C'est l'heure de la vérité ! Voyons votre tableau de bord dynamique en action :

  1. Connectez-vous avec le compte test (il contient des données exemples prêtes à l'emploi)
  2. Naviguez vers votre tableau de bord
  3. Vérifiez que les lignes de transactions s'affichent avec une mise en forme appropriée
  4. Assurez-vous que les dates, descriptions et montants sont corrects

Si tout fonctionne, vous devriez voir une liste de transactions pleinement fonctionnelle sur votre tableau de bord ! 🎉

Ce que vous avez accompli :

  • Construit un tableau de bord qui s'adapte à n'importe quelle quantité de données
  • Créé des modèles réutilisables pour une mise en forme cohérente
  • Mis en œuvre des techniques efficaces de manipulation du DOM
  • Développé une fonctionnalité comparable à des applications bancaires en production

Vous avez réussi à transformer une page web statique en une application web dynamique.

🎯 Point pédagogique : Génération de contenu dynamique

Compréhension de l'architecture : Vous avez mis en place un pipeline sophistiqué de données vers interface utilisateur qui reflète les modèles utilisés dans des frameworks comme React, Vue et Angular.

Concepts clés maîtrisés :

  • Rendu basé sur des templates : création de composants UI réutilisables
  • Fragments de document : optimisation des performances du DOM
  • Manipulation sécurisée du DOM : prévention des vulnérabilités de sécurité
  • Transformation des données : conversion des données serveur en interfaces utilisateurs

Lien avec l'industrie : Ces techniques constituent la base des frameworks frontend modernes. Le DOM virtuel de React, le système de templates de Vue et larchitecture composants dAngular sappuient tous sur ces concepts fondamentaux.

Question de réflexion : Comment étendriez-vous ce système pour gérer des mises à jour en temps réel (comme des nouvelles transactions apparaissant automatiquement) ? Pensez aux WebSockets ou aux Server-Sent Events.


📈 Votre ligne du temps de maîtrise de la gestion des données

timeline
    title Parcours de développement axé sur les données
    
    section Construction des bases
        API Setup & Testing
            : Comprendre la communication client-serveur
            : Maîtriser le cycle requête/réponse HTTP
            : Apprendre les techniques de débogage
    
    section Maîtrise de l'authentification
        Async Function Patterns
            : Écrire du code async/await propre
            : Gérer efficacement les promesses
            : Implémenter des limites d'erreur
        User Session Management
            : Créer des modèles d'état global
            : Construire des gardes de navigation
            : Concevoir des systèmes de retour utilisateur
    
    section Développement d'interface dynamique
        Safe DOM Manipulation
            : Prévenir les vulnérabilités XSS
            : Utiliser textContent plutôt que innerHTML
            : Créer des interfaces accessibles
        Template Systems
            : Construire des composants UI réutilisables
            : Optimiser les performances avec des fragments
            : Évoluer pour gérer de grands ensembles de données
    
    section Modèles professionnels
        Production-Ready Code
            : Mettre en œuvre une gestion complète des erreurs
            : Suivre les meilleures pratiques de sécurité
            : Créer des architectures maintenables
        Modern Web Standards
            : Maîtriser les modèles Fetch API
            : Comprendre les configurations CORS
            : Construire des UI réactives et accessibles

🎓 Palier de fin dapprentissage : Vous avez construit avec succès une application web complète pilotée par les données utilisant des patterns JavaScript modernes. Ces compétences se traduisent directement dans le travail avec des frameworks comme React, Vue ou Angular.

🔄 Capacités de niveau supérieur :

  • Prêt à explorer les frameworks frontend qui sappuient sur ces concepts
  • Préparé à implémenter des fonctionnalités temps réel avec WebSockets
  • Équipé pour créer des Progressive Web Apps avec capacités hors-ligne
  • Bases posées pour apprendre des patterns avancés de gestion détat

Défi GitHub Copilot Agent 🚀

Utilisez le mode Agent pour réaliser le défi suivant :

Description : Améliorez lapplication bancaire en implémentant une fonctionnalité de recherche et de filtrage des transactions permettant aux utilisateurs de trouver des transactions spécifiques par plage de dates, montant ou description.

Consigne : Créez une fonctionnalité de recherche pour lapplication bancaire comprenant : 1) Un formulaire de recherche avec champs pour plage de dates (de/à), montant minimum/maximum, et mots-clés de description de transaction, 2) Une fonction filterTransactions() qui filtre le tableau account.transactions selon les critères de recherche, 3) Mettez à jour la fonction updateDashboard() pour afficher les résultats filtrés, et 4) Ajoutez un bouton « Effacer les filtres » pour réinitialiser laffichage. Utilisez les méthodes modernes JavaScript des tableaux comme filter() et gérez les cas limites liés aux critères de recherche vides.

Découvrez-en plus sur le mode agent ici.

🚀 Défi

Prêt à faire passer votre application bancaire au niveau supérieur ? Donnons-lui un aspect et une sensation que vous aurez vraiment envie d'utiliser. Voici quelques idées pour stimuler votre créativité :

Rendez-le beau : Ajoutez du style CSS pour transformer votre tableau de bord fonctionnel en quelque chose de visuellement attrayant. Pensez à des lignes épurées, un bon espacement, et peut-être même quelques animations subtiles.

Rendez-le responsive : Essayez dutiliser les media queries pour créer un design responsive qui fonctionne parfaitement sur téléphones, tablettes et ordinateurs. Vos utilisateurs vous remercieront !

Ajoutez un peu de fantaisie : Envisagez de coder par couleur les transactions (vert pour les revenus, rouge pour les dépenses), dajouter des icônes, ou de créer des effets au survol qui rendent linterface interactive.

Voici à quoi pourrait ressembler un tableau de bord élégant :

Capture d'écran d'un exemple de résultat du tableau de bord après stylisation

Ne vous sentez pas obligé de correspondre exactement à ça utilisez-le comme source dinspiration et faites-le vôtre !

Quiz post-lecture

Quiz post-lecture

Devoir

Refactorisez et commentez votre code


Avertissement :
Ce document a été traduit à laide du service de traduction automatique Co-op Translator. Bien que nous nous efforçons dassurer lexactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue dorigine doit être considéré comme la source faisant foi. Pour les informations critiques, une traduction professionnelle réalisée par un humain est recommandée. Nous déclinons toute responsabilité en cas de malentendus ou de mauvaises interprétations résultant de lutilisation de cette traduction.