|
M1 Miage 2020-2021 Technologies Web
De $1
Introduction
Vous aurez quatre séances de TP encadrées et deux séances pour travailler sur le mini-projet à rendre. Nous allons donc essayer de faire une introduction au technologies front-end et back end émergentes.
Séance 1: Single page webapps avec VueJS, bases de données synchronisées dans le cloud
Supports de cours
Partie 1 Live coding: de JavaScript aux librairies aux frameworks
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/10/edit?html,js,output et ici avec l'utilisation d'un component : https://jsbin.com/jiqowib/edit?html,js,output
- Un autre exemple mais qui utilise cette fois-ci des "components" : https://jsbin.com/guwetoy/edit?html,js,output
Partie 2 : découverte de VueJS en mode CLI (command line interface)
ETAPE 1 : installation de NodeJS (nécessaire pour développement CLI)
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.
Vérifiez que vous avez bien:
- Une version de node >= 12.0 (commande à taper : "node -v)
- Une version de npm >= 6.7 (commande à taper : "npm -v")
Etape 2 : Création d'une application simple en mode CLI, utilisant la base de données synchronisée Google Firestore
Travail à faire :
- suivre ce tutorial , choisissez npm comme outil d'installation des modules lorsque vous aurez le choix yarn/npm
- Essayez de modifier ce tutorial pour faire la création et la modification non pas "d'expenses" mais d'une liste de restaurants/cuisines, on pourra rajouter le prix moyen du menu aux propriétés des restaurants. Je vous conseille de travailler sur une nouvelle collection "restaurants" dans FireStore.
Pour ceux qui vont vite ou qui ont déjà installé MongoDB :
- Suivre ce tuto (chat multi room avec Google Firebase - moins puissante que Firecloud)
- Une fois que l'appli fonctionne, essayez de comprendre dans le détail comment elle fonctionne.
ETAPE 3 (à terminer pour la semaine prochaine) : 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:
TRAVAIL A FAIRE POUR LA SEMAINE PROCHAINE - Terminer l'installation de nodeJS, MongoDB.
- 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 ! :-)
Séance 2: intro à NodeJS / Express / MongoDB / compléments VueJS Live coding, exemples vus en cours ... 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 client vueJS des restaurants (afficher les restaurants dans une table). Lancez ce projet avec l'extension "Web Server for Chrome" (c'est un serveur http séparé) ou la commande npm http-server ou serve (npm install -g http-server oui npm install -g serve). 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.
CORRECTION FAITE EN CLASSE DU CLIENT DU GROUPE1 : Intranet de Michel Buffa/Technologies Web M1 Miage 2019-2020/groupe1.zip - 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.
TRAVAIL A FAIRE pour la prochaine séance(optionnel) : essayer d'afficher une belle table avec la librairie vue-material. Regarder dans le Getting Started comment utiliser vue-material à partir d'un CDN. OPTIONNEL de l'optionnel : refaire votre projet en mode compilé, avec des fichiers .vue. Voir comment on avait créé les projets lors du TP1 (expenses et chat). Séance 3 : corrections du TP2 et cours MongoDB Correction TP2 + plein plein d'explications en live pour ceux/celles qui sont un peu perdus ou qui n'ont pas fait beaucoup de JavaScript avant cette année. Je vous ai préparé une correction complète du TP2 (sans les travaux optionnels) en trois vidéos. Je conseille très très fortement aux élèves qui ne sont pas trop à l'aise avec JavaScript, le debugger du navigateur, l'organisation des fichiers, de l'environnement de travail, de les regarder : - Ici l'archive de la correction présentée dans les vidéos.
- Vidéo 1 (27 minutes): disponible sur YouTube, comment organiser les répertoires pour faire le TP, comment lancer mongoDB, le back-end avec NodeJS, comment installer le programme front-end exemple, comment ouvrir des terminaux dans Visual Studio Code et quoi lancer dans ces terminaux, etc.
- Vidéo 2 (31 minutes) : disponible sur YouTube, utilisation de fetch pour lancer des commandes Ajax, rappel des bases de VueJS, apprendre à utiliser le debugger pour voir les requêtes fetch envoyées, les réponses reçues, etc.
- Vidéo 3 (38 minutes) : disponible sur YouTube, disponible sur YouTube, fin du TP, utiliser fetch pour insertion/suppression, faire une recherche intelligente sur les restaurants avec utilisation de technique de "debouncing", etc.
Cours sur MongoDB et les bases de données NoSQL TP3 : finir le TP2 y compris les éléments optionnels - A l'aide des vidéos si besoin, finissez le TP2
- Essayez de le refaire en mode compilé
- Essayez d'utiliser une bibliothèque graphique comme vue-material.
- Par exemple, essayez d'afficher une belle table, de beaux boutons etc.
Mini projet à rendre pour le 1er Novembre 2020 Quelques vidéos pour vous aider
- Vidéo 4 : passer du TP2 interprété à un projet compilé, utiliser lodash dans un projet compilé.
- ERRATA : pour que l'insert marche remplacer le "event" par "$event" dans App.vue, dans la declaration html du formulaire : @submit.prevent="ajouterRestaurant($event)"
- Vidéo 5 : utiliser une bibliothèque de composants graphiques.
- Vidéo 6 : utiliser le routeur de VueJS, indispensable pour associer URLs et composants affiché, naviguer d'un écran à l'autre de l'application. A voir absolument.
Sujet du mini projet à faire seul ou en binôme Dans ce mini projet je vous demanderai d'essayer de faire les choses suivantes. Ne vous affolez pas si vous ne pouvez pas tout faire, j'attends un travail personnel qui vous apporte quelque chose, pas des fonctionnalités au kilo copiées à droite ou à gauche. Faites ce que vous pouvez honnêtement, fournissez un travail minimal et vous aurez une note correcte. Allez-y tranquillement, et je peux vous aider d'ici le 1/11/2020, mais ne me sollicitez pas au dernier moment. - Refaire l'interface graphique du TP2/3 de manière ergonomique, en utilisant des composants graphiques issus d'une des bibliothèques graphiques disponibles pour VueJS (vue-material, vuetify, elements, etc.). Je suggère par exemple de mettre un menu sur la gauche, le tableau au centre, etc.
- Afficher plus d'informations que le nom et la cuisine, par exemple la ville (Borough). Regardez avec la bibliothèque graphique choisie comment afficher un message "aucun restaurant ne correspond à votre recherche" si le nom que vous cherchez n'existe pas.
- Vous rajouterez un bouton "détails" dans chaque ligne du tableau. Quand on clique dessus, on naviguera vers /RestaurantDetail?id=xxxxxxxxx et on verra le détail du restaurant dont l'id est passé en paramètres. A vous de voir si vous allez refaire un fetch dans la BD pour récupérer à nouveau les détails du restaurant cliqué, ou si vous préférez passer les informations à afficher autrement (sous forme de props ?)
- Dans le composant RestaurantDetail vous afficherez les informations détaillées sur le restaurant. Une photo (prise au hasard sur le web), une vidéo (optionnel), une carte OpenStreetMap ou GoogleMap avec le restaurant visible dessus (à partir de sa longitude et latitude). A vous de vous débrouiller pour trouver un composant VueJS sur le web qui va vous permettre de faire cela.
- POUR LES BONS (optionnel pour les autres) : vous créerez des classe CarteDesPlats et Menu qui serviront à générer aléatoirement une carte (hord d'oeuvre, plat du jour, dessert) à partir d'une liste prédéfinie, et à générer des menus de midi et gastronomiques. Les plats auront une photo, une description et un prix. Vous afficherez pour chaque restaurant la carte et les menus à l'aide de composants CarteRestaurant et MenuRestaurant.
- POUR LES BONS encore : gestion des commandes à distance. On peut passer une commande : "je prendrai un menu standard et deux plats à la carte : la terrine de poisson et le cassoulet de Castelnaudary". On pourra voir sur la droite le récapitulatif de la commande.
- Ensuite No Limit si vous voulez vous amuser : persistence (plats dans MongoDB -> rajouter requêtes et WebServices), authentification (au programme du M2 avec tokens etc., mais si vous voulez déjà essayer simplement avec collection des utilisateurs dans MongoDB, requêtes et WebServices), faites ce que vous sentez...
Modalités de rendu - A faire seul ou en binôme.
- Pour ceux qui n'ont jamais fait de git de leur vie : vous m'envoyez le projet comme vous voulez, google drive, we transfer etc.
- Pour tous les autres : envoyez l'URL du repo GIT par mail à micbuffa@gmail.com
- Il me faut un README qui explique les points remarquables de votre projet. Si vous avez une BD custom donnez moi de quoi l'importer.
- Vous allez me préparer une petite vidéo durée 3mns maxi, qui montre un aspect remarquable de votre projet, un peu comme les vidéos que j'ai faites, mais plus concise (!). Je peux vous demander de venir dans mon bureau me re-expliquer cela en détails. Je prendrai quelques groupes au hasard pour venir dans mon bureau m'expliquer le projet, et voir si vous avez bien travaillé par vous-mêmes... La vidéo sera sur YouTube (en non répertorié si vous préférez).
|