|
Master 1 Miage 2018-2019
De $1
Introduction
Nous n'avons que trois cours et trois séances de TP cette année. C'est peu. Nous allons donc essayer de faire une introduction au technologies front-end et back end émergentes.
Séance 1: Web Services RESTFUL et single page webapps
Supports de cours
Live coding: back end RESTFUL et clients légers.
Exemples fait en cours (liste de restaurants, avec ajout et suppression):
- En pur JavaScript avec utilisation des APIs du DOM (append, createElement, removeChild, innerHTML) et de la sector API (document.querySelector...) : https://jsbin.com/pemaric/edit?html,js,output
- Le même exemple mais en utilisant des librairies pour simplifier certaines parties (ici utilisation de lodash pour la génération d'ids, de jQuery pour simplifier l'utilisation du DOM): https://jsbin.com/tiyirud/1/edit?html,js,output
- Enfin, encore le même exemple mais avec l'utilisation du framework VueJS en mode déclaratif : https://jsbin.com/jiqowib/edit?html,js,output
TP 1 : Exercices avec VueJS, Firebase et WebServices RESTFUL
Partie 1 : Faire fonctionner l'exemple VueJS vu en classe, mais avec des fichiers et une table HTML
Ceci est le dernier exemple vu en classe dans JsBin: https://jsbin.com/jiqowib/edit?html,js,output
Ici vous trouverez le fichier exo1_vueJS_table.zip qui contient le même exemple mais fonctionnant avec des fichiers. Dezippez-le et utilisez un serveur Web pour ouvrir le fichier index.html. Je vous suggère d'utiliser un serveur ultra léger comme Web Server For Chrome (extension pour Google Chrome)
Travail à faire :
- Générer la liste des restaurants non pas dans une liste mais dans un tableau à deux colonnes.
- Utiliser quelques règles CSS pour que le tableau soit plus joli
- Afficher dans le H1 le nombre de restaurants. Ce nombre devra être mis à jour automatiquement lorsqu'on ajoute ou enlève des restaurants à la liste
- Utiliser la syntaxe v-bind:style="{proprieteCSS:valeur}" pour changer le style des restaurants dynamiquement. La valeur peut être retournée par une fonction ou une expression comme par exemple: v-bind:style="{color:getColor(index)}". Essayez donc d'afficher de cette manière les lignes paires d'une certaine couleur, les lignes impaires d'une autre couleur.
- Idem, mais avec une classe CSS. Vous créerez la classe CSS "bordureRouge" dans le fichier css/styles.css, et vous n'ajoutrez cette classe CSS qu'à la 4ème ligne du tableau (qui s'affichera donc encadrée en rouge). Lisez donc la page de documentation suivante : https://vuejs.org/v2/guide/class-and-style.html
CORRECTION FAITE EN CLASSE (ne pas regarder avant d'avoir fini):
Partie 2 : utilisation d'une base de données synchronisée dans le cloud (FireBase)
ETAPE 1 : on va créer une base sur FireBase
- Allez sur https://firebase.google.com/
- Cliquez sur "accèder à la console" ou "Get Started" selon la langue...
- Cliquez sur "+" pour ajouter un projet, appelez-le "M1MiageRestaurants" par exemple. Dans les fenêtres de dioaglogue ne cochez que la dernière case dans la première fenêtre, aucune dans la seconde.
- Cliquez à gauche sur "database" et créer une "realtime database".
- Choisissez le mode "test" sans authentification.
- Cliquez sur "ignorer" pour virer le warning.
- Cliquez à gauche sur l'icône à droite de "Project Overview", et au milieu de la page sur "Ajouter Firebase à votre application Web", une fenêtre s'ouvre avec des bouts de JS. Voir cette image
- Gardez cet onglet ouvert, vous allez devoir coller la configuration à votre application.
ETAPE 2 : ajouter le support pour FireBase à votre application
Si vous aviez fait l'exercice 1 avec jsBin, voici ici une version avec des fichiers, que je vous conseille de récupérer: exo1_vueJS_table_corrige.zip
On va donc utiliser FireBase mais aussi une librairie spéciale pour utiliser FireBase avec VueJS: vue-fire (documentation sur https://github.com/vuejs/vuefire).
Pour cela vous allez ajouter ces lignes à votre page HTML (dans le <head>...</head>, avant votre script à vous (script.js) :
Mettez-les AVANT l'inclusion de votre fichier script.js !!! Ce dernier utilise des variables définies dans ces deux fichiers.
Ensuite, dans le fichier script.js, vous allez ajouter ces lignes (configuration de firebase) : pensez à mettre entre parenthèse une copie de la valeur de la BD que vous aurez créée :
window.onload = init;
// FIREBASE INIT
var firebaseApp = firebase.initializeApp(
// ICI COPIER LA VALEUR DE LA VARIABLE CONFIG DE FIREBASE (A PRENDRE SUR LE SITE DE VOTRE BD)
);
var db = firebaseApp.database();
var restaurantsRef = db.ref('restaurants');
Et enfin, voici le nouveau code de la vue :
function init() {
new Vue({
el: "#app",
data: {
nom: "",
cuisine:""
},
firebase: {
restaurants: restaurantsRef
},
methods: {
supprimerRestaurant: function (r) {
//this.restaurants.splice(index, 1);
// each elem of the array has a .key property generated by vue-fire
restaurantsRef.child(r['.key']).remove();
},
ajouterRestaurant: function () {
let nouveauRestaurant = {
nom:this.nom,
cuisine:this.cuisine,
id:_.uniqueId("restaurant_")
}
restaurantsRef.push(nouveauRestaurant);
// on remet à zéro les champs
this.nom = "";
this.cuisine = "";
}
}
});
Notez l'apparition d'une propriété "firebase" dans la l'objet passé en paramètre à la Vue. On travaillera dans le template HTML avec la propriété/modèle "restaurants" et dans le code JS sur la variable restaurantsRef qui correspond à la BD distance. Voir documentation de vue-fire pour plus de détails : https://github.com/vuejs/vuefire
ETAPE 3 : testez cette version en ouvrant :
- Dans un onglet, la page sur le site de FireBase où vous voyez votre BD,
- Dans un autre onglet votre application
- Dans un autre onglet, et même dans un autre navigateur, encore une fois votre application.
- Ajoutez / supprimez des restaurants, les vues doivent se mettre à jour en synchro.
- Utilisez l'interface FireBase pour modifier des valeurs -> les vues doivent se mettre à jour.
Partie 3 : installation de NodeJS et MongoDB
ETAPE 1 : installation de NodeJS
Allez sur le site https://nodejs.org et installez la version "recommended for most users".
Si tout se passe bien, après l'installation, ouvrez une fenêtre de terminal et tapez la commande "node -v". Ca doit afficher la version de nodeJS que vous venez d'installer.
ETAPE 2 : installer MongoDB sur votre machine
Suivez les installations propres à votre système d'exploitation situées sur cette page du site officiel. Ne choisissez pas l'installation manuelle.
Une fois installé lancez la commande "mongod" en ligne de commande. Si le daemon mongoDB ne se lance pas, regardez les erreurs.
Sur mon Mac j'ai fait:
brew update brew install mongodb mkdir -p /data/db chmod 777 /data/db (pour autoriser un user lambda à écrire dedans) mongod (pour exécuter MongoDB)
ETAPE 3 : - Créer et peupler une collection par défaut (avec un dataset issu du tutorial MongoDB officiel)
- Récupérez donc ce fichier : primer-dataset.json. Vous allez devoir récupérer le fichier primer-dataset.json (assez gros, attention, ne pas faire copier/coller), et exécuter la commande suivante, qui créer une bd "test" et ajoute dedans la collection "restaurants" :
ETAPE 4 : Installer un outil d'administration sympa
Je vous recommande fortement MongoChef, un produit commercial mais gratuit pour utilisation non commerciale. Le télécharger sur: https://studio3t.com/
ETAPE 5 : Ouvrir 3T STudio et voir la collection que l'on vient d'importer
- S'assurer que MongoDB tourne (mongod doit être lancé, ou bien vous devez avoir installé MongoDB en service)
- Lancer l'application 3T Studio, connectez-vous sur MongoDB. Les valeurs par défaut doivent être Ok, normalement.
- Ouvrir la collection "restaurants" dans la base "test"
Quelques screenshots:
ETAPE 6: test de WebServices RESTful sur les restaurants
Récuperez ce projet serveurNodeMongoRESTful.zip (le code sera expliqué lors du cours No 2), qui implémente avec NodeJS des WebServices RESTful pour gérer les restaurants situés dans la base MongoDB que nous venons de voir.
Une fois dezippé allez dans le répertoire obtenu et exécutez les commandes suivantes :
- npm install
- node serverCrudWithMongo.js
- Ouvrez http://localhost:8080 dans votre navigateur. Une page Web devrait apparaitre. Cliquez sur un des premiers liens, des données (des restaurants) devraient s'afficher au format JSON.
- Regardez le code de serverCrudWithMongo.js en particulier la définition des "URIs" des WebServices (lignes app.get, app.post, app.delete, app.put)
ETAPE 7: branchement de votre application sur ces Web Services
TRAVAIL A FAIRE POUR LA SEMAINE PROCHAINE
Je ferai passer quelques personnes au tableau pour répondre à quelques questions...
- Terminer l'installation de nodeJS, MongoDB, faire tourner les WebServices (étape 6), regarder le code source même si vous ne comprenez pas tout.
- Idem, même si vous ne comprenez pas tout, allez voir les sites Web des librairies graphiques pour VueJS sur le site https://risingstars.js.org Plus tard vous aurez à jouer avec alors c'est le moment ! :-)
- Lisez ou du moins parcourez ces lectures:
Séance 2: intro à NodeJS / Express / MongoDB / compléments VueJS
Live coding, exemples vus en cours
(ceux de la fin du TP 1 qu'on a pas fini, et qui fera partie du TP2)
- Utilisation de fetch
- Web Services REST avec Node + express + MongoDB
- Exemples VueJS avec composants customs
TP2 : on va finir la dernière partie du TP1 (afficher des restaurants à partir de Web Services REST implémentés en Node/express/MongoDB
Travail à faire :
- Remettre en route la fin du TP1
- S'assurer que Mongo est bien installé (lancez la commande "
mongod " dans un terminal) - Que nodeJS est bien installé (lancez la commande "
node -v " dans un terminal) - Que vous avez bien les données des restaurants dans mongoDB (lancez l'outil d'administration)
-
Récuperez ce projet serveurNodeMongoRESTful.zip (le code sera expliqué lors du cours No 2), qui implémente avec NodeJS des WebServices RESTful pour gérer les restaurants situés dans la base MongoDB que nous venons de voir. Une fois dezippé allez dans le répertoire obtenu et exécutez les commandes suivantes : npm install node serverCrudWithMongo.js - Ouvrez
http://localhost:8080 dans votre navigateur. Une page Web devrait apparaitre. Cliquez sur un des premiers liens, des données (des restaurants) devraient s'afficher au format JSON. - Regardez le code de
serverCrudWithMongo.js en particulier la définition des "URIs" des WebServices (lignes app.get , app.post , app.delete , app.put ) -
Créez ailleurs (pas dans le même répertoire), un dossier "client", dans lequel vous aurez une copie du premier exercice du TP1 (afficher les restaurants dans une table). Lancez ce projet avec l'extension "Web Server for Chrome" (c'est un serveur http séparé). Si vous avez perdu ce projet, ici une correction : Intranet de Michel Buffa/Master 1 Miage 2018-2019/exo1_vueJS_table_corrige.zip
Nous avons donc maintenant un "serveur" qui fournit des WebServices, et qui expose de données situées dans MongoDB, via des WebServices, et un client séparé, qui pour le moment n'utilise pas encore ces Web Services. Nous allons donc "connecter" ce client VueJS avec les WebServices.
- Ajoutez dans le code JavaScript de ce client une méthode
mounted() qui sera appelée juste avant le rendu de la Vue. A l'intérieur, ajoutez un console.log("AVANT RENDU HTML") , et vérifiez dans la console de debug que le message apaprait bien. Ici la page de doc sur le cycle de vie : https://vuejs.org/v2/guide/instance....ifecycle-Hooks - Creez une méthode
getRestaurantsFromServer() qui utilise la fetch API pour récupérer des restaurants sur http:8080/api/restaurants et qui les affiche. Profitez-en pour regarder à nouveau les paramètres possibles quand on fait un GET sur /api/restaurants. - Regardez à l'aide de la console de debug (onglet "réseau/network"), l'envoi de votre requête et sa réponse. Vous devez savoir debugger des requêtes AJAX.
- On veut afficher dans le H1 le nombre de restaurants correspondant au count de la réponse.
- Ajoutez deux boutons "Précédent" et "Suivant" sous la table, qui vont permettre de faire la pagination.
- Ajoutez un slider HTML qui va entre les valeurs 5 et 100 par pas de 5 et qui va permettre de choisir le nombre de restaurants par page. Quand on bouge ce slider, on veut que la vue se rafraichisse en temps réel.
- Ajoutez un champ de recherche dans votre interface. Quand on saisit une valeur à l'intérieur, ça fait une recherche par nom sur les restaurants. On veut que la vue se mettre à jour en temps réel.
- Utilisation de requête DELETE. Ajoutez une colonne à votre tableau avec un bouton "DELETE", quand on clique dessus cela supprime le restaurant dans la base et rafraichit la vue.
- Utilisation de requête POST pour insérer un nouveau restaurant. Regardez dans la page html qu'on reçoit du serveur (http://localhost:8080), à la fois dans le code HTML et dans le code JavaScript, 1) comment on fait un formulaire pour saisir un nouveau restaurant et 2) comment on envoie la requête de création en AJAX. Modifiez votre code en conséquence pour faire un ajout de restaurant par POST.
- Idem, mais cette fois-ci en PUT pour modifier. On rajoutera une colonne au tableau avec un bouton "Modifier'. Quand on clique dessus, cela affiche et pré-remplit un formulaire de modification. Quand on soumet le formulaire, cela envoie une requête PUT au serveur, modifie les données et rafraichit l'affichage.
Correction de ce qui a été fait en classe pendant le TP
A RENDRE (C'EST NOTE!) POUR LA SEANCE 3
Vous allez devoir terminer le TP précédent :
- Proposer une application VueJS qui permet d'insérer, supprimer, modifier et rechercher des restaurants, en utilisant les bonnes pratiques REST (toutes les requêtes AJAX devront être réalisées à l'aide de l'API fetch, avec des GET/PUT/POST/DELETE)
- Vous implémenterez la pagination (page précédente / suivante) mais aussi, première et dernière page. Vous veillerez à ce qu'on ne puisse pas aller au-delà de la dernière page ou avant la première.
- La recherche sera incrémentale, sur le nom. Un plus pour ceux qui arrivent à utiliser la fonction _.debounce de lodash pour ne lancer une requête que lorsqu'on a arrêter de taper des caractères pendant plus de 300ms.
- Bonus pour ceux qui vont regarder le site https://risingstars.js.org et réussir à utiliser une bibliothèque de composants graphiques pour VueJS (par ex: Vue Material, mais les autres sont très bien aussi).
Modalités de rendu :
- A rendre via github, à faire en binome. Vous m'envoyez par mail le lien github. Le sujet du mail sera [TP M1 MIAGE] nom1-nom2
- Vous ne me rendez pas le code serveur sauf si vous l'avez modifié.
|