Imprimer
Catégorie : R3.01 - dev. Web côté client (vuejs)
Affichages : 481

Préambule

L'objectif principal de ce TP est d'implémenter une pseudo application bancaire et de compléter l'application générale DrMad, afin de mettre en oeuvre le principe des slots. Il y a donc un scénario à deux niveaux.

Le scénario principal est le suivant :

 

Le scénario pour utiliser la banque est le suivant :

 

 

 

 

0°/ Mise en place

La structuration générale reste la même que pour les TPs précédents. De plus, certains composants vont être réutilisés. La mise en place initiale la plus simple consiste donc à :

 

1°/ Modification des services

Les fonctionnalités impliquées par les scénarios donnés ci-dessus nécessitent d'implémenter et/ou modifier des fonctions de services par rapport aux TPs précédents. En l'occurrence, les fonctions liées à la banque ont été placées dans services/bankaccount.service.js.  et elles récupèrent des données dans la source local, grâce aux fonctions se trouvant dans datasource/controller.js. Ce sont ces 2 fichiers qu'il faut modifier, en partant d'hypothèses sur les requêtes possibles et le format de leur réponse.

Comme pour les services de la boutique, on doit ajouter à controller.js des fonctions qui retournent un résultat avec une structure qui doit être identique à celle retournée par l'API. Pour rappel, cette structure est du type {error: num_erreur, status: ..., data: ...}. S'il y a une erreur, data contient le message d'erreur. Sinon, data contient un objet dont la structure dépend du type de requête.

Voici la liste des fonctions à définir dans controller.js pour gérer la banque à partir de la source de données locale, avec le descriptif de ce qu'elles retournent :

 

Pour modifier bankaccount.service.js, il suffit de reproduire le principe des premiers TPs, en ajoutant une paire de fonctions pour chaque requête :

Remarque : il est conseillé d'utiliser les règles de nommage des fonctions principales et secondaires déjà utilisées lors des TPs précédents.

Exemple pour récupérer les informations d'un compte : la fonction principale getAccount(number) appelle la fonction secondaire getAccountFromLocalSource(number), qui elle-même appelle la fonction getAccount(number) de controller.js.

 

2°/ Modification du store

Dans le TP 3, le store a déjà été modularisé avec un fichier bank.js qui représente le module concernant la banque. Cependant, ce qui a été mis en place dans les TPs précédents n'est pas totalement adapté au sujet présent. Il faut donc modifier ce module afin de prendre en compte  les fonctionnalités demandées.

A noter que les actions de ce module doivent, comme pour la boutique, faire appel à des fonctions de services, en l'occurrence celles définies dans bankaccount.service.js. et décrites dans la section précédente.

 

3°/ La barre de navigation

 L'objectif est de modifier NavBar.vue pour en faire un composant utilisant les props et les scoped-slot pour le rendre facilement paramétrable par le composant parent. De plus, NavBar n'envoie plus un signal au parent pour signaler qu'un des boutons a été cliqué : il suit directement une route de vue-router donnée via une props.

On obtient quelque chose du genre :

<button v-for="(link, index) in links" :key="index" ... >
  <slot name="nav-button" :label="link.label" >{{link.label}}</slot>
</button>

 

  • Il faut ensuite ajouter la gestion des clics sur les boutons :
    • en cas de clic, on appelle une fonction goTo(dest), définie dans methods, avec comme paramètre dest la valeur de link.to.
    • la fonction goTo() suit la route donnée en paramètre.

 

Pour mettre en place la barre de navigation principale, il faut modifier App.vue pour indiquer à NavBar.vue le contenu du slot pour chaque bouton :

  • passer comme valeur de la props links le tableau [ { label: "boutique", to: "/shop"}, { label: "banque", to: "/bank"} ],
  • pour le premier bouton, donner comme contenu au slot le mot "boutique" écrit en gras
  • pour le deuxième bouton, donner comme contenu au slot une icône ressemblant à une banque.

Remarques :

  • dans une application vue, les ressources de type icônes se trouvent généralement dans le sous-répertoire assets.
  • une fois placées dans ce répertoire, on peut facilement y faire référence via un chemin d'accès

Exemple :

<template>
  <div>
    <img src="/@/assets/myicon.png">
    ...
  </div>
</template>

 

4°/ Un menu vertical

 

5°/ Le composant racine de la banque

[ {type: "title", label: "Opérations"}, {type: "button", label: "Solde", to: "/bank/amount"}, {type: "button", label: "Débit/Virement", to: "/bank/operation"}, {type: "title", label: "États"} , {type: "button", label: "Historique", to: "/bank/history"}  ]

 

 

6°/ L'accueil de la banque

 

7°/ Afficher le solde

 

8°/ Débit & virements

 

9°/ Un tableau dynamique avec case à cocher

 L'objectif est de faire un composant DataTable.vue, utilisant les props et les scoped-slot pour le rendre facilement paramétrable par le composant parent. Ce composant permet d'afficher :

Pour qu'un composant parent fournisse des données à DataTable, il doit respecter une structure stricte concernant les props headers et items :

Par ailleurs, les clics sur :

 

Exemple d'utilisation dans un composant parent qui veut afficher une table avec 4 colonnes (1 pour les cases à cocher, 2 pour les champs de chaque item, 1 pour les boutons), ainsi qu'un bouton après la table. Il y a 4 lignes (1 pour l'entête, 3 pour les données). A noter que dans cet exemple, on ne capture aucun des événements :

<template>
  ...
  <DataTable :headers="headers" :items="items" itemCheck itemButton tableButton></DataTable>
  ...
</template>
<script>
  ...
  data: () => ({
    headers : [ {label: "nom", name: "virus"}, { label: "prix", name: "price} ],
    items: [
      { virus: "grippe", price: 1000 },
      { virus: "covid", price: 150 },
      { virus: "cholera", price: 6666 },
    ]
  })
  ...
</script>

 

10°/ L'historique des transactions

  • Dans le répertoire views, créer un composant BankHistory.vue.
  • Ce composant affiche :
    • un titre, qui est par défaut "Opérations passées", mais qui peut être changé via un slot
    • une case à cocher avec comme label "Filtrer par période", suivie de deux champs de saisie qui n'apparaissent que si la case est cochée, avec comme labels respectifs "Du", "Au".
    • un composant DataTable, contenant des transactions associées au compte courant. Par défaut, elles sont toutes affichées sauf si le filtrage est actif.

 

  • Le comportement du filtrage est le suivant :
    • si seul le premier champ est rempli, on sélectionne toutes les transactions à partir de cette date,
    • si seul le deuxième champ est rempli, on sélectionne toutes les transactions jusqu'à cette date,
    • si les deux champs sont remplis, on sélectionne les transactions entre les deux dates.
    • si le premier champ est déjà rempli, et que l'on tape une date antérieure dans le second champ, ce dernier est vidé puisque invalide.
    • si le deuxième champ est déjà rempli, et que l'on tape une date postérieure dans le premier champ, ce dernier est vidé puisque invalide.
    • dès que l'on valide la saisie d'un des champs, le filtrage doit se faire et donc impacter l'affichage de la table.

 

  • La table doit afficher :
    • 1 colonne avec des cases à cocher,
    • 1 colonne avec le montant des transactions,
    • 1 colonne  avec la date des transactions,
    • 1 colonne avec une lettre, qui doit être S si le compte courant est la source de la transaction et D si elle est la destination.
    • 1 colonne avec des boutons, dont le label est "Voir"
    • 1 bouton après la table avec comme intitulé "Voir".

 

  • Quand une des boutons d'item est cliqué, une boite de dialogue s'ouvre avec dedans l'uuid de la transactions.
  • Quand le bouton d'après table est cliqué, une boite de dialogue s'ouvre avec dedans l'uuid de toutes les transactions dont la case est cochée.