Préambule

L’objectif de ce sujet est de réaliser une application web “moderne” dans un contexte full-stack, c’est-à-dire en implémentant aussi bien la partie interface graphique utilisateur (= front) au sein d’un navigateur, que la partie serveur (= back) sous la forme d’une API REST couplé avec un serveur de BdD. Le côté front prend la forme d’une application dite SPA (Single Page Application) implémentée en vuejs, et l’API REST est faite en nodejs avec le module express (entre autres). Le rôle du serveur n’est pas de fournir des pages HTML comme dans une application basée sur php, mais juste des données que le navigateur va utiliser pour modifier le visuel de la fenêtre.

Ce sujet offre également l’occasion de se familiariser avec un processus de développement qui part d’une étape de conception relativement poussée, afin de pouvoir implémenter ensuite un maximum de chose en parallèle.

1. Contexte

Le cadre global du sujet de type 1 est une application Web permettant de gérer une manifestation (au travers d’un navigateur), comme par exemple un forum étudiant, un salon thématique, un festival de musique, etc. Les possibilités d’interaction sont définies par rapport aux droits de l’utilisateur, à savoir public, prestataire ou ou organisateur, les deux derniers nécessitant une authentification.

Globalement :

  • Un utilisateur public a accès Ă  la page principale de l’évĂ©nement qui prĂ©sente une description textuelle/image, le plan interactif (de la manifestation), ainsi que la liste des prestataires (par ex. des groupes de musique, buvette, …). L’utilisateur peut ainsi accĂ©der Ă  l’espace “personnel” de chaque prestataire et, s’ils existent, utiliser les “services” proposĂ©s par ceux-ci.
  • La notion de service doit se comprendre comme “un service rendu au travers de l’application web” et pas comme “un service assurĂ© lors de la manifestation”. Par exemple, pour un prestataire qui fait de la restauration, le fait de vendre de la nourriture ne peut pas ĂŞtre considĂ©rĂ© comme un service de l’application web. En revanche, le fait de pouvoir rĂ©server un repas grâce Ă  l’application web peut ĂŞtre considĂ©rĂ© comme un service valide pour celle-ci.
  • Autres exemples :
    • dans un festival de musique, un prestataire de type groupe de musique propose des services du type : planning avec horaires de passage, livre d’or, vente de disque/goodies, etc.
    • dans un forum emploi, un prestataire de type entreprise propose des services du type : rĂ©servation d’une plage horaire pour entretien, remplir un formulaire de contact/CV, planning de prĂ©sentation de l’entreprise, etc.
  • un utilisateur prestataire peut gĂ©rer son espace personnel et crĂ©ant/modifiant sa page de prĂ©sentation et en crĂ©ant/paramĂ©trant des services (parmi ceux proposĂ©s par l’application).
  • un utilisateur organisateur peut crĂ©er/modifier la prĂ©sentation de l’évĂ©nement, le plan interactif, les prestataires.

Cette application doit être réalisée selon des principes de conception actuels du Web, à savoir avec une partie visuelle côté navigateur (front-end) écrite en Javascript grâce au framework vuejs, une partie base de données implémentée grâce à un serveur de type MySQL, une partie serveur (back-end) écrite en nodejs, qui fait l’interface entre le navigateur et la BdD, sous la forme d’une API REST et qui sert également à envoyer le code javascript créé en vuejs au navigateur (=comme un serveur web).

Cette organisation permet au navigateur, au travers des interactions de l’utilisateur avec l’interface graphique de l’application, d’envoyer des requêtes au serveur API. En fonction du type de requête et des données associées (en principe des objets JSON) le serveur API va exécuter certaines instructions permettant de mettre à jour la BdD, et/ou d’en extraire des informations pour produire de nouvelles données envoyées au navigateur. Ce dernier les utilise pour mettre à jour l’interface graphique.

La structure de l’interface graphique et de la BdD ainsi que les requêtes possibles à l’API sont à déduire du cahier des charges donné en section 2.

IMPORTANT !

Les attendus en fin de semestre 3 ne sont pas de fournir l’implémentation complète de toutes les fonctionnalités. C’est pourquoi, le développement s’étalera également sur le semestre 4  (qui est relativement court)

Pour les fonctionnalités communes à toutes les applications, la section 2.3 précise quel est le minimum attendu en fin de S3 et S4.

2. Cahier des charges

2.1 Droits d’accès et informations utilisateur

  • L’application est basĂ©e sur trois types minimaux d’utilisateurs : public, prestataire, organisateur. Il est cependant possible d’ajouter d’autres rĂ´les, notamment celui d’utilisateur enregistrĂ©, ce qui permet de gĂ©rer des cas oĂą il faut conserver des informations personnelles sur le public (par ex, achat d’un billet d’entrĂ©e nominatif)
  • Seuls prestataires et organisateur nĂ©cessitent forcĂ©ment une authentification, ce qui suppose d’avoir des informations en BdD pour chaque utilisateur prestataire et organisateur. NB : cela n’empĂŞche pas certains services de demander des informations aux utilisateurs publics de l’application, qui elles seront stockĂ©es en BdD.
  • Ces informations utilisateur prestataire/organisateur doivent au minimum contenir :
    • un login,
    • un mot de passe,
    • un mail de contact,
    • le droits d’accès.
  • Les autres informations nĂ©cessaires sont dĂ©pendantes du type de manifestation, notamment pour les prestataires. Par exemple, le public doit pouvoir faire une recherche multi-critères pour chercher des prestataires (cf. section 2.2.1), ce qui suppose des informations diverses pour catĂ©goriser les prestataires. Autre exemple, les prestataires peuvent avoir des besoins logistiques (près d’un point d’eau, prises Ă©lectriques, tables, …) qu’ils doivent renseigner afin que l’organisateur puissent les placer.

2.2 Structuration de l’application

2.2.1 Page principale

  • La page d’accueil de l’application doit afficher :
    • un texte+images prĂ©sentant la manifestation,
    • une image “interactive” donnant le plan de la manifestation,
    • la liste des prestataires avec un formulaire de recherche pour chercher/trier selon diffĂ©rents critères,
    • un moyen de s’authentifier/se dĂ©connecter
  • L’image interactive doit clairement faire apparaĂ®tre l’emplacement “gĂ©ographique” de chaque prestataire de la manifestation et quand le curseur de souris survole cet emplacement, une info-bulle doit afficher les informations principales concernant le prestataire, dont un lien pour aller vers l’espace personnel du prestataire.
  • La liste des prestataires doit Ă©galement permettre d’aller vers leur espace personnel.

2.2.2 Page prestataire

  • L’apparence de cette page dĂ©pend du type d’utilisateur.
  • Pour public, la page doit afficher :
    • un texte+image prĂ©sentant le prestataire,
    • la liste des services proposĂ©s par le prestataire, permettant d’aller vers la page dĂ©diĂ©e Ă  ce service.
  • Pour le prestataire, la page doit afficher un menu ainsi qu’une partie dont le contenu changera selon l’item choisi dans le menu, avec au minimum :
    • la modification du texte+images prĂ©sentant le prestataire, grâce Ă  un Ă©diteur wysiwyg incorporable dans une appli. web (par exemple tinyMCE ou JCE),
    • l’activation/dĂ©sactivation/suppression de services, en prĂ©cisant s’ils sont accessibles au public ou juste au prestataire.
    • la configuration des services.
    • la modification des informations utilisateur (cf. section 2.1)
  • D’autres fonctionnalitĂ©s peuvent ĂŞtre ajoutĂ©es librement selon les besoins induits par le type de manifestation.
  • NB : un organisateur authentifiĂ© ne peut pas aboutir Ă  cette page prestataire.

Remarques sur les services :

  • La liste des services qu’un prestataire peut activer est laissĂ©e libre. En pratique, la longueur de cette liste dĂ©pendra surtout de l’état d’avancement du dĂ©veloppement de l’application. Se reporter Ă  la section Conseils pour des idĂ©es possibles de service.
  • Comme indiquĂ© ci-dessus, certains services ne sont pas forcĂ©ment accessibles au public. Par exemple, si un prestataire active un service de type comptage du public, il est Ă©vident que c’est le prestataire lui-mĂŞme qui doit utiliser ce service et non pas les visiteurs. En revanche, pour un livre d’or, l’accès peut ĂŞtre public.
  • Configurer un service signifie crĂ©er/modifier toutes les donnĂ©es associĂ©es Ă  un service. Cela peut ĂŞtre très simple ou très compliquĂ©. Par exemple, pour un service du type livre d’or, cela consiste simplement Ă  pouvoir changer l’entĂŞte du livre, alors que pour un service de type vente de goodies, cela implique tout un système de saisie des informations sur les articles vendus (image, description, prix, stock etc). 

2.2.3 Page organisateur

  • Cette page est affichĂ©e dès lors qu’un utilisateur de type organisateur est authentifiĂ©.
  • La page doit afficher un menu ainsi qu’une partie dont le contenu changera selon l’item choisi dans le menu, avec au minimum :
    • la modification du texte+images prĂ©sentant la manifestation, grâce Ă  un Ă©diteur wysiwyg,
    • dĂ©finir la carte interactive avec notamment l’association d’un emplacement Ă  chaque prestataire de façon plus ou moins automatique (cf. section 2.3.2),
    • la crĂ©ation/modification des prestataires, c.a.d. les informations des utilisateurs prestataires,
    • choisir un prestataire pour accĂ©der Ă  son espace personnel avec comme possibilitĂ©s :
      • la modification du texte+images prĂ©sentant le prestataire, grâce Ă  un Ă©diteur wysiwyg,
      • l’activation/dĂ©sactivation/suppression de services.
    • la visualisation, Ă  priori sous forme graphique, de statistiques, créées Ă  partir des donnĂ©es rĂ©coltĂ©es grâce aux services que les prestataires ont publiĂ©s (cf. section 2.3.3)

2.3 Fonctionnalités communes

2.3.1 Authentification
  • L’authentification doit se faire sur la base d’un couple login/mot de passe qui est saisi via un formulaire dans le front-end.

  • Comme en S3, il n’y a pas de connexion Ă  l’API demandĂ©e, la vĂ©rification de l’existence de ce couple doit se faire via la source de donnĂ©es locale.

  • Si le couple est correct, cette vĂ©rification doit renvoyer les informations utilisateur (notamment son rĂ´le) plus un identifiant “de session” (tirĂ© alĂ©atoirement), le tout Ă©tant sont stockĂ© dans la mĂ©moire locale du navigateur (soit dans un local storage, soit en mĂ©moire applicative)

  • Du cĂ´tĂ© API, une route doit permettre de recevoir un couple, de faire la mĂŞme vĂ©rification et de renvoyer les informations utilisateur s’il existe.

  • Pour le S4, le principe reste le mĂŞme exceptĂ© que le front-end envoie rĂ©ellement une requĂŞte Ă  l’API et que celle-ci renvoie d’autres informations permettant de sĂ©curiser les requĂŞtes futures (jwt, id de session, …)

2.3.2 Sécurisation des accès à l’API

  • Les bases d’une sĂ©curisation des accès Ă  une API reposent sur l’envoi Ă  chaque requĂŞte vers l’API d’une information permettant Ă  cette dernière de vĂ©rifier si l’utilisateur front-end est authentifiĂ© ou non, et selon le cas d’autoriser ou non le traitement de la requĂŞte.

  • Cette information peut ĂŞtre envoyĂ©e via l’URL, le corps de la requĂŞte, les headers, des cookies, etc.

  • Pour le S3, un principe de sĂ©curisation “à moitiĂ© fonctionnel” est le minimum demandĂ©, sachant qu’il doit tenir compte de la contrainte du front-end et de l’API non connectĂ©s, mais qu’il soit facilement remplaçable par une sĂ©curisation forte. Par exemple :

    • CĂ´tĂ© front-end :
      • chaque fonction qui mime l’envoi d’une requĂŞte Ă  l’API en allant chercher les donnĂ©es dans la source locale doit commencer par vĂ©rifier si l’utilisateur est authentifiĂ© et quels sont ces droits.
      • cette vĂ©rification se base sur les informations reçues lors de l’authentification et stockĂ©es localement.
      • si les droits sont adĂ©quats, la fonction renvoie les donnĂ©es demandĂ©es, sinon une erreur.
    • CĂ´tĂ© API :
      • on suppose que le front-end envoie l’identifiant de session obtenu lors de l’authentification, via la partie query de l’URL, par exemple : https://monapi.org/presta/1234?session=12abc45-953-cfb12
      • on  crĂ©e un middleware qui doit ĂŞtre appelĂ© avant chaque fonction de contrĂ´le qui nĂ©cessite des droits pour ĂŞtre exĂ©cutĂ©e.
      • ce middleware se contente de vĂ©rifier si la variable session existe dans l’URL et dans ce cas, permet d’appeler le contrĂ´leur. Sinon, il renvoie une erreur.
  • Pour le S4, il est demandĂ© d’implĂ©menter une mĂ©thode sĂ©curisĂ©e (session, jwt, …) comme vu en cours, ce qui nĂ©cessite des ajustements mineurs sur le front-end mais bien plus de travail cĂ´tĂ© API et BdD pour mettre en place le stockage des jwt/session et les contrĂ´leurs qui vont les utiliser pour vĂ©rifier la validitĂ© d’un accès.

2.3.3 Carte interactive

  • Cette fonctionnalitĂ© est sans doute le plus gros challenge Ă  relever et la façon de la construire dĂ©pend Ă©galement du type de manifestation.

  • La mĂ©thode pour crĂ©er le visuel de la carte n’est pas imposĂ©e. Cependant, il est très fortement conseillĂ© de crĂ©er une image vectorielle svg qui peut ĂŞtre intĂ©grĂ©e dans une page et manipulĂ©e très facilement via du javascript.

  • Pour gĂ©rer la carte interactive, il y a 2 sous-fonctionnalitĂ©s Ă  implĂ©menter :

    1. afficher l’image et quand la souris survole un emplacement, une info-bulle apparaît. Si les informations de l’emplacement sont vides, alors l’info-bulle contient seulement un bouton permettant de déclencher la saisie des informations (nom de l’emplacement, “moyens logistiques” disponibles par ex, surface /volume disponible, nombre de prises, accès à l’eau, etc). Si les informations ont été saisies, l’info-bulle contient le nom de l’emplacement + le prestataire associé (si l’étape 2 a été faite) et un bouton pour activer la modification des informations.
    2. modifier les associations emplacement-prestataire (par ex, par échange, par réaffectation sur un emplacement libre, …)
  • Pour le S3, le point n°1 est le minimum demandĂ© mais en tenant compte du fait qu’il faudra faire le point n°2. Il faut donc que les informations liĂ©es au placement ne soient pas statiques mais en BdD.

  • Le point n°2 doit ĂŞtre fonctionnel au minimum en fin de S4.

  • Il est bien entendu possible d’ajouter des fonctionnalitĂ©s comme par exemple la gestion de plusieurs cartes pour des manifestation multi-sites, ou bien la visualisation d’itinĂ©raires en sur-impression de la carte, etc.

2.3.4 Statistiques

  • La mise en place de cette fonctionnalitĂ© dĂ©pend totalement des services qui vont ĂŞtre publiĂ©s et des donnĂ©es rĂ©coltĂ©es par ces services.

  • Il est donc indispensable de prĂ©voir des services oĂą il y ait des donnĂ©es intĂ©ressantes Ă  analyser. Quelques exemples classiques :

    • service comptage des visiteurs ⇒ statistiques sur l’affluence selon le type de prestataire, l’heure, …
    • service vente de goodies ⇒ statistiques sur le type d’article en fonction de diffĂ©rents critères (âge de l’acheteur, type de prestataire, …)
    • service formulaire de recensement/satisfaction ⇒ statistiques sur ce qui plait au public en fonction de diffĂ©rent critères.
  • Pour le S3, il est demandĂ© de fournir au minimum un graphique statistique, basĂ© sur les donnĂ©es d’un service.

  • Pour le S4, il est demandĂ© un deuxième graphique.

  • Il est cependant possible de fournir plus, comme un graphique paramĂ©trable dynamique (par ex. avec un filtre sur les donnĂ©es), des graphiques concernant diffĂ©rents services, voire des croisements entre les donnĂ©es des services.

2.3.5 Interface de documentation et test de l’API

  • Comme dit prĂ©cĂ©demment, les fonctionnalitĂ©s de l’application sont accessibles grâce Ă  l’interface graphique web cĂ´tĂ© navigateur, qui va envoyer des requĂŞtes Ă  l’API pour obtenir des donnĂ©es susceptibles de mettre Ă  jour l’interface graphique.

  • Chaque fonctionnalitĂ© va donc correspondre Ă  un ensemble de requĂŞtes possibles Ă  l’API.

  • Dans le cas d’un API REST, chaque requĂŞte est identifiĂ©e par le type de requĂŞte HTTP sous-jacent (GET, PUT, POST, …), une route (c’est Ă  dire un chemin d’accès Ă  des donnĂ©es, par ex, /users/getbyid/123), et Ă©ventuellement, des donnĂ©es transmises conjointement (souvent sous la forme d’un objet JSON)

  • Une fois que toutes les fonctionnalitĂ©s de l’application sont clairement dĂ©finies, il est possible de dĂ©finir toutes les requĂŞtes et donc les routes associĂ©es.

  • Conjointement Ă  l’application, il est demandĂ© d’utiliser Swagger, qui permet de gĂ©nĂ©rer une interface graphique de documentation et de test de l’API,

  • Cela permet de tester facilement si une route est fonctionnelle dans l’API, si elle traite correctement les donnĂ©es entrantes et renvoie un rĂ©sultat correct.

Remarque : chaque route correspondant en gros à une fonction javascript qui va traiter une requête, il n’y a pas besoin que cette fonction soit pleinement opérationnelle pour être testée via l’interface de test. Cette fonction peut très bien dans un premier temps simplement renvoyer des données fixes mais au format attendu, et quand la BdD est opérationnelle, modifier son code pour accéder à la BdD.

  • Pour le S3, il est demandĂ© que toutes les routes dĂ©jĂ  implĂ©mentĂ©es dans l’API soient documentĂ©es via swagger.
  • Pour le S4, il suffira d’ajouter les routes nouvellement implĂ©mentĂ©es.

2.3.6 Langue de l’application

  • les pages publiques ainsi que celles des prestataires doivent ĂŞtre Ă©crites en français ET en anglais, avec un moyen simple de changer entre les deux.

3. Conseils

  • Afin que l’application ait un intĂ©rĂŞt rĂ©el, il est conseillĂ© de partir sur 4 ou 5 services que les prestataires peuvent activer (ou non). Il est Ă©galement conseillĂ© de choisir des services qui offrent plus ou moins de difficultĂ© Ă  ĂŞtre implĂ©mentĂ©s, aussi bien au niveau code que modèle de BdD.

  • La liste ci-dessous donne quelques exemples possibles avec un degrĂ© de difficultĂ© approximatif.

    • livre d’or (=facile)
    • formulaire de recensement ou satisfaction (comme on fait pour les JPO) (=facile)
    • comptage de visiteurs (=facile)
    • demande de renseignements via un formulaire mail (=facile)
    • visualisation graphique de l’affluence (=moyen)
    • planning de dĂ©monstration, concert, confĂ©rence, … (=moyen)
    • rĂ©servation d’une place pour la dĂ©mo/concert/confĂ©rence, … (=moyen)
    • vente d’articles/goodies (=difficile)
    • crĂ©ation automatique d’un planning pour la journĂ©e en fonction des activitĂ©s que l’utilisateur veut faire (=difficile)
  • Cette liste n’est pas restrictive et c’est en fonction du type de manifestation qu’il faut trouver les services possibles.

  • Pour crĂ©er des svg correctement intĂ©grables dans une page web, il existe beaucoup de tutoriels sur le Net.

  • Pour faire cette intĂ©gration, il existe diffĂ©rentes solutions qui sont donnĂ©es ici : https://developer.mozilla.org/fr/docs/Learn/HTML/Multimedia_and_embedding/Adding_vector_graphics_to_the_Web

  • Si vous optez pour la version “basique” de la carte interactive, le plus simple est de copier/coller le svg directement dans le HTML. Sinon, il faudra passer par des modules permettant de manipuler les svg en vuejs, comme par exemple vue-svg-loader.

  • Pour les statistiques, il existe de nombreuses bibliothèques permettant de crĂ©er des graphiques en javascript, compatibles avec vuejs. Il suffit de chercher sur le web et de suivre les exemples.