Vue. js 3 & Firebase pour débutants | Chris Dixon | Skillshare

Vitesse de lecture


1.0x


  • 0.5x
  • 0.75x
  • 1 x (normale)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Vue. js 3 & Firebase pour débutants

teacher avatar Chris Dixon, Web Developer & Online Teacher

Regardez ce cours et des milliers d'autres

Bénéficiez d'un accès illimité à tous les cours
Suivez des cours enseignés par des leaders de l'industrie et des professionnels
Explorez divers sujets comme l'illustration, le graphisme, la photographie et bien d'autres

Regardez ce cours et des milliers d'autres

Bénéficiez d'un accès illimité à tous les cours
Suivez des cours enseignés par des leaders de l'industrie et des professionnels
Explorez divers sujets comme l'illustration, le graphisme, la photographie et bien d'autres

Leçons de ce cours

    • 1.

      Bienvenue au cours !

      1:31

    • 2.

      Ce dont vous aurez besoin

      1:38

    • 3.

      Configurer l'outil avec Vite

      5:42

    • 4.

      Images de projet

      2:16

    • 5.

      Vues Ou Composants ?

      1:39

    • 6.

      Vues et itinéraires

      6:29

    • 7.

      RouterLink et routerView

      6:16

    • 8.

      Routes nommées

      2:15

    • 9.

      Routes imbriquées

      4:23

    • 10.

      Le compte et les composantes enfant

      9:10

    • 11.

      Vues nommées

      6:20

    • 12.

      UI-

      0:25

    • 13.

      L'interface utilisateur

      4:14

    • 14.

      L'interface utilisateur

      3:03

    • 15.

      Polices et styles de base

      7:31

    • 16.

      Menu et panier

      5:37

    • 17.

      Stylage d'en-tête

      4:34

    • 18.

      Admin : ajouter un nouveau formulaire

      5:54

    • 19.

      Admin : Composante pizzas

      3:36

    • 20.

      Admin : volet ordres d'inscription

      4:25

    • 21.

      Vue à domicile

      7:33

    • 22.

      Stylage de forme et de table

      10:26

    • 23.

      Options Ou Composition ?

      3:37

    • 24.

      L'objet et le liage de données NewPizza

      5:46

    • 25.

      Ref’s & Ajout au panier

      7:33

    • 26.

      Boucler les pizzas

      5:30

    • 27.

      Vérifier les articles de panier

      4:30

    • 28.

      Éliminer et changer la quantité

      4:18

    • 29.

      Propriétés calculées

      3:34

    • 30.

      Fichiers composables

      5:12

    • 31.

      Qu'est-ce que la base de feu ?

      1:48

    • 32.

      Configuration de la base de feu

      7:30

    • 33.

      Ajouter des pizzas à la base de données

      7:30

    • 34.

      Obtenir des pizzas

      9:17

    • 35.

      Listing & Suppression pizzas dans Admin

      11:01

    • 36.

      Créer des ordres

      8:15

    • 37.

      Recherche des ordres

      7:57

    • 38.

      Passer les commandes

      4:24

    • 39.

      Suppression des commandes

      4:43

    • 40.

      Afficher et masquer les blocs d'administration

      5:07

    • 41.

      La fonction d'inscription

      7:27

    • 42.

      Créer le formulaire d'inscription

      8:57

    • 43.

      Stylage modal

      8:41

    • 44.

      Basculer modal

      4:16

    • 45.

      Se connecter et sortir

      9:34

    • 46.

      Détection des changements auth

      5:07

    • 47.

      Styler l'aperçu

      5:18

    • 48.

      Terminer l'aperçu administrateur

      4:55

    • 49.

      Restriction de nouvelles pizzas

      2:14

    • 50.

      Ajouter l'utilisateur aux commandes

      6:45

    • 51.

      Filtres et propriétés mondiales

      8:52

    • 52.

      Mises à jour en temps réel

      4:53

    • 53.

      Mises à jour en temps réel

      2:30

    • 54.

      Se désabonner des mises à jour

      2:49

    • 55.

      Ajout de nouveaux utilisateurs

      7:37

    • 56.

      Récupérer les utilisateurs d'administrateur

      5:37

    • 57.

      Mettre à jour les utilisateurs réguliers

      10:48

    • 58.

      Mettre à jour les utilisateurs réguliers

      6:42

    • 59.

      Règles de Firebase

      17:10

  • --
  • Niveau débutant
  • Niveau intermédiaire
  • Niveau avancé
  • Tous niveaux

Généré par la communauté

Le niveau est déterminé par l'opinion majoritaire des apprenants qui ont évalué ce cours. La recommandation de l'enseignant est affichée jusqu'à ce qu'au moins 5 réponses d'apprenants soient collectées.

222

apprenants

4

projets

À propos de ce cours

Vue 3 est un cadre étonnant pour créer des applications Web ! Apprenez-en tout à ce sujet dans ce cours sur la version 3. Ce cours est entièrement basé sur les projets et, ensemble, nous créons une application de pizza !

Découvrez tout ce que vous devez savoir, de la structuration d'une application en utilisant les pages et les composants aux dernières fonctionnalités telles que l'API de composition et la configuration de script. Vous découvrirez la réactivité de la vue 3 et comment utiliser les nouvelles fonctionnalités et les fonctionnalités existantes, y compris les crochets du cycle de vie, les horlogers et les propriétés calculées.

Vous trouverez les images de projet ici.

Si vous vous enfermez, vous pouvez comparer votre code au projet final à différents stades en suivant le lien suivant :

https://github.com/chrisdixon161/vue3-firebase-pour-débutants-project-stages

Le cours est conçu pour être convivial pour les développeurs nouveaux à Vue.js ou Firebase. Cependant, les connaissances générales en développement Web sont nécessaires pour tirer le meilleur parti de ce cours. Vous devriez avoir une expérience avec JavaScript, JavaScript régulière, ou expérimenter avec un autre cadre comme React ou Vue 2.

Nous couvrerons le routage pour basculer entre les pages, comment activer les itinéraires enfants et utiliser de multiples composantes de vue nommés.

Nous utilisons aussi Firebase comme service back-end pour notre projet. Nous avons créé une base de données pour stocker nos commandes, nos rubriques de menu et nos données utilisateur en utilisant la dernière version Web 9 (modulaire). Cette base de données sera également en temps réel, ce qui signifie que notre projet est tenu à jour avec les changements à la base de données au fur et à mesure qu'ils se produisent. Vous découvrirez de nombreuses méthodes pour créer, lire, mettre à jour et supprimer les données.

L'authentification Firebase sera également mise en place pour gérer nos utilisateurs. Nous allons permettre les comptes utilisateurs et les niveaux d'accès multiples. Cela permettra aux utilisateurs réguliers de passer les ordres et les utilisateurs d'administration pour gérer les éléments de menu, les ordres et d'autres utilisateurs.

Rencontrez votre enseignant·e

Teacher Profile Image

Chris Dixon

Web Developer & Online Teacher

Enseignant·e

Hello, My name is Chris and I am a Web Developer from the UK. I am an experienced trainer leading web development bootcamps and also teaching online courses.

My main areas of interest are Vue.js, Nuxt.js, Shopify, JavaScript, eCommerce, and business. I am passionate about what I do and about teaching others.

Whatever your reason for learning to build websites you have made an excellent career choice.

My personal motivation was to become my own boss and have more freedom and flexibility in my life. I also enjoy the technical challenge it provides and the way it constantly evolves. I built my first website back in 1999 and I have watched the web evolve into what it is today.

I try to make my courses enjoyable and try to remember what it was like when I was lea... Voir le profil complet

Level: Intermediate

Notes attribuées au cours

Les attentes sont-elles satisfaites ?
    Dépassées !
  • 0%
  • Oui
  • 0%
  • En partie
  • 0%
  • Pas vraiment
  • 0%

Pourquoi s'inscrire à Skillshare ?

Suivez des cours Skillshare Original primés

Chaque cours comprend de courtes leçons et des travaux pratiques

Votre abonnement soutient les enseignants Skillshare

Apprenez, où que vous soyez

Suivez des cours où que vous soyez avec l'application Skillshare. Suivez-les en streaming ou téléchargez-les pour les regarder dans l'avion, dans le métro ou tout autre endroit où vous aimez apprendre.

Transcription

1. Bienvenue au cours !: [MUSIQUE] Vue.js est un framework frontal incroyable et facile à utiliser pour créer des applications Web. Dans ce cours, nous allons l'utiliser pour créer une application de pizzeria pleine de fonctionnalités. Nous allons découvrir toutes les nouvelles fonctionnalités de Vue Version 3 lors de la construction de ce projet. De plus, nous associerons notre projet à Firebase, afin d'appliquer un backend à notre application. Cela nous donne une base de données en temps réel pour stocker nos utilisateurs, nos commandes et les pizzas du menu. Il sera également utilisé pour fournir des comptes utilisateurs et des authentifications, y compris les administrateurs et les utilisateurs réguliers. Le projet comporte de nombreuses fonctionnalités telles qu'un menu et un panier, ajout d'articles et la possibilité de passer des commandes. Nous avons une zone d'administration où les utilisateurs autorisés peuvent ajouter et supprimer des pizzas du menu. Vos commandes peuvent être affichées et supprimées, tout comme la possibilité de définir d'autres éléments comme le font les administrateurs. Toutes ces données proviennent de notre base de données. Bonjour. Je m'appelle Chris et je suis un développeur Web expérimenté. J'ai également enseigné à plus de 100 000 étudiants, à la fois en ligne et en personne. Si vous souhaitez créer de superbes applications frontales avec la version 3 de Vue et utiliser la base de données et l'authentification Firebase, ce cours est fait pour vous. J'ai hâte de vous voir lors de la première leçon. 2. Ce dont vous aurez besoin: Pour ce cluster, vous n'aurez aucun achat supplémentaire à effectuer. Tous les logiciels que nous allons utiliser seront gratuits et open source. Alors il n'y a en fait que peu choses dont nous aurons besoin. Mais avant de le faire, examinons maintenant exigences afin de ne pas être trop débordés. Comme il s'agit d'un cours de développement Web, vous devez au moins connaître les bases et on supposera que vous connaissez assez bien le HTML et le CSS et que à l'aise avec JavaScript. Vous n'avez pas besoin d'être un expert, mais vous devez au moins connaître les bases. J'ai des cours disponibles sur chacun d'entre eux si vous devez d'abord vous rafraîchir. De plus, si vous avez de l'expérience d'autres frameworks ou bibliothèques JavaScript tels que Angular ou React, ou même la version 1 ou 2 de Vue, ce sera un avantage considérable, mais pas essentiel. De plus, nous n' utiliserons que peu le terminal, mais si vous ne l'avez pas utilisé par le passé, ne vous en mais si vous ne l'avez pas utilisé par le passé, ne vous en faites pas. Nous n' utiliserons que quelques commandes simples. Visual Studio Code, ce sera l'éditeur de texte que je vais utiliser tout au long de ce cours. Il est actuellement très populaire dans le monde du développement Web, mais vous pouvez utiliser n'importe quel autre éditeur de votre choix. Si vous en avez besoin, le lien de téléchargement est disponible ci-dessous, et il est également totalement gratuit. Un autre avantage est qu'il est livré avec un terminal intégré, que nous utiliserons pour configurer notre projet et installer les packages dont vous pourriez avoir besoin. Mais aussi, si vous êtes à l'aise avec le terminal et que vous avez peut-être vos propres terminaux externes, tels que Item, vous pouvez également l'utiliser. Dans cet esprit, passons à la vidéo suivante où nous verrons comment configurer notre projet à l'aide de Vite. 3. Créez un outil avec du vite: Pour commencer notre projet, nous allons commencer par une configuration locale. Nous pouvons exécuter Vue.js sur notre propre ordinateur. Pour cela, nous utiliserons un outil de construction appelé Vite. Vite a en fait été créé par Evan You qui a également créé Vue.js. Cet outil de création nous permettra d'utiliser les composants d'un seul fichier, c' est-à-dire d'écrire une partie de notre site Web appelée les composants dans un seul fichier. Cela nous permettra de garder les choses bien organisées lors de la création de notre projet. Mais cela signifie également que nous aurons besoin d'un outil de création pour rassembler tous ces composants distincts et les regrouper pour créer notre application. Vites nous offre également de nombreux autres avantages, tels qu'un serveur de développement, le remplacement du module actif, qui mettra instantanément à jour le projet dans le navigateur sans avoir à actualiser la page, nous apporterons une modification. Il existe également de nombreux autres avantages. Vous devrez installer Node.js si ce n'est pas déjà fait. Vous pouvez le faire depuis nodejs.org. Allez-y et téléchargez la dernière version pour votre système d'exploitation. J'utilise un livre Mac si vous utilisez Windows, il devrait également le détecter automatiquement. Si ce n'est pas le cas, cliquez simplement sur l'autre téléchargement. Ce téléchargement inclura également npm, que nous utiliserons pour configurer notre projet et également ajouter des packages selon nos besoins. Ensuite, passez au terminal, que vous pouvez utiliser en tant que terminal autonome si vous préférez. Vous pouvez également utiliser celui intégré à Visual Studio Code. La simplicité, c'est celle que je vais utiliser. Accédez au code Visual Studio, aux options, au terminal, puis au nouveau terminal. Nous allons maintenant avoir ce terminal en bas, que nous pouvons utiliser pour écrire des commandes. Si vous utilisez le terminal pour la première fois, ne vous inquiétez pas, nous avons juste besoin quelques commandes simples. Vous pouvez utiliser un terminal pour parcourir les fichiers et les dossiers de votre ordinateur, comme vous pouvez le faire avec la souris en cliquant à l'intérieur d'une fenêtre. Ici, cependant, nous utilisons des commandes, mais nous devrons naviguer jusqu'à l'endroit où nous voulons ajouter notre projet. Je veux rester simple et l'ajouter au bureau pour un accès facile. Je suis actuellement dans le répertoire personnel de mon utilisateur. Nous pouvons utiliser la commande LS pour répertorier tous les fichiers et dossiers de ce répertoire. Ensuite, nous pouvons utiliser la commande cd pour accéder à l'un de ces répertoires que vous souhaitez. Pour moi, cela va vers le bureau, que nous pouvons voir dans la liste ici. cd pour le changer sur le bureau. Cela distingue également les majuscules des minuscules. Appuyez sur « Enter ». Nous pouvons maintenant voir que nous sommes dans le répertoire Desktop. Mais si vous le souhaitez, vous pouvez accéder à n'importe quel autre répertoire de votre choix. Mais juste avant de créer le projet, nous devons vérifier que les nœuds et npm sont correctement installés. Pour ce faire, nous allons taper node dash v, qui signifie version. Le numéro de version installé sera renvoyé . Ma version actuelle est la numéro 18. Vous aurez besoin d'au moins la version 15 du nœud pour continuer. De toute évidence, pour tout numéro de version supérieur à 15, vous serez prêt à partir. Mais si vous voyez un message d'erreur ou un avertissement, vous devrez revenir en arrière et vous assurer que nœud est correctement installé. Ensuite, nous pouvons vérifier npm, donc npm dash v. Nous ne voyons aucun problème ici. Pour créer un projet View JS à l'aide de Vite, nous devons exécuter cette commande. C'est du npm dedans. Afficher. Au plus tard. C'est une entrée. Il nous demande d'installer les packages suivants, savoir Create View. C'est très bien. Appuyez sur « Y » ou appuyez sur « Entrée ». Nous avons ensuite posé une série de questions. Tout d'abord, le nom du projet, le mien sera Pizza Planet. Vous pouvez le modifier si nous le souhaitons. Nous n'allons pas utiliser TypeScript. Nous allons appuyer sur Non, nous n'avons pas besoin du support JSX, donc nous allons opter pour « Non ». Voulez-vous ajouter le routeur de visualisation ? Oui, nous le faisons. Nous y jetterons un coup d'œil bientôt. Si vous voulez une gestion d'état, nous allons sélectionner Non car nous utilisons une gestion d'état dans des fichiers composables. Nous verrons également comment procéder tout au long du cours. Nous ne couvrirons pas l'intestin, alors nous allons appuyer sur Non et Non. Oui Longueur. Cela peut être oui. C'est à vous de décider. Plus jolie ? Oui Bien, et nous avons maintenant terminé. N'oubliez pas qu'auparavant, nous utilisions la commande cd pour accéder au répertoire du bureau. Maintenant, nous avons créé un nouveau répertoire appelé pizza planet, se trouve maintenant dans notre bureau. Ce que nous devons faire, comme indiqué ici, c'est maintenant passer au répertoire Pizza Planet, donc cd, pizza dash planet ou le nom du projet de votre choix. Nous devons ensuite exécuter npm install, qui installera tous les packages dont nous avons besoin pour nos projets Vue. Bien, les packages sont maintenant tous installés. Pour démarrer notre serveur de développement, nous devons exécuter npm, exécuter dev. C'est Enter. Cela nous donnera ensuite une adresse Web à ouvrir dans le navigateur. Nous pouvons le copier ou cliquer sur Commande ou Contrôle, ce qui l'ouvrira dans le navigateur. C'est le point de départ de notre projet, ce qui signifie que tout fonctionne correctement. Depuis que nous avons configuré le routeur de visualisation, nous en reparlerons un peu plus tard. Nous verrons également un lien Accueil et un lien À propos pour passer de l'un à l'autre. 4. Images de projet: Tout au long de ce projet, nous utiliserons certaines images du projet. Vous pouvez télécharger le vôtre si vous préférez, ou vous pouvez utiliser exactement les mêmes que ceux que j'utilise. Si vous voulez suivre et utiliser les mêmes, dans GitHub, j'ai ce référentiel qui est disponible sur github.com/, mon nom d'utilisateur, qui est chrisdixon161/pizza-planet-v3-images avec un tiret entre chaque mot. Il s'agit d'un référentiel simple. Tout ce que nous avons à l'intérieur est ce dossier d'images avec les six images que nous allons ajouter à notre projet. Si vous souhaitez les utiliser, cliquez simplement sur le bouton Code. Téléchargez le fichier zip. Une fois que c'est terminé, vous pouvez cliquer dessus pour l'ouvrir. Ensuite, nous devons l'ajouter à notre projet. Tout d'abord, accédez à Visual Studio Code ou à votre éditeur de texte. Ce que nous devons faire, c'est ouvrir notre projet à l'intérieur d'ici. Faites glisser le pointeur sur le dossier du projet que nous avons créé dans la vidéo précédente. Le mien est stocké sur le bureau. Faites-le glisser dans Visual Studio Code. Nous voyons maintenant tous les fichiers et dossiers de notre projet V dans la barre latérale. Il se peut également que nous devions rouvrir le terminal. Le terminal, puis accédez à Nouveau. Nous participons actuellement à un projet pizza-planet. Nous pouvons exécuter npm, exécuter dev, qui l'ouvrira à nouveau avec ce lien. Clic de commande ou de contrôle. Bien. Tout va bien. Ensuite, si nous allons dans nos images, puis dans notre dossier de projet, que nous venons d' ouvrir dans Visual Studio, allons dans le dossier source, dans les ressources, puis nous pouvons faire glisser le dossier des images à l'intérieur. Maintenez ça enfoncé. Nous pouvons également les voir dans une barre latérale si nous ouvrons la source, dans les ressources, et voici nos images que nous allons utiliser pour ce projet. Encore une fois, si vous souhaitez utiliser vos propres images, vous pouvez les ajouter à un dossier d' images à l'intérieur et les utiliser au fur et à mesure de l' avancement du projet. Mais maintenant que nous pouvons les utiliser, nous allons passer à la section de routage, où nous verrons comment passer d'une page à l'autre. 5. Vues Ou Composants ?: Dans cette section, nous allons examiner quelques routage de base qui nous permettront de basculer entre les différentes pages de notre application. Mais juste avant de le faire, je voudrais jeter un coup d'œil à deux fichiers différents que nous allons utiliser. Il s'agit de vues et de composants. Voyons quelle est la différence entre les deux. Tout d'abord, nous avons la notion de points de vue. Il s'agit de fichiers qui contiennent le contenu de chaque page affichée. Une application ou un site Web classique utilise des liens tels que Accueil, À propos de nous et Contactez-nous, et chacun de ces liens renvoie vers une nouvelle page. C'est ainsi que nous utiliserons les points de vue. Ensuite, les composants sont généralement des éléments plus petits de notre application, qui peuvent être soit un élément autonome, soit réutilisés sur les composants sont généralement des éléments plus petits de notre application, qui peuvent être soit un élément autonome, soit plusieurs pages de vues. Un composant peut être n'importe quel bloc de contenu tel qu'une carte de localisation, un produit sur une boutique ou même un simple bloc de texte. Les composants peuvent également être réutilisés soit en répétant le contenu sur plusieurs pages, soit en transmettant les données dynamiques d'un composant. Les fichiers de composants et les fichiers de vue sont identiques. Ils ont également le même contenu et structure puisqu'ils sont tous deux des composants de vue. Mais les avoir dans des dossiers différents permet de mieux organiser les choses. En résumé, une vue est une page nous pouvons utiliser pour passer d'une page à l'autre sur notre application. En général, un composant est une partie plus petite souvent plus réutilisable de notre page. Nous les stockons généralement dans leurs propres dossiers appelés vues et composants afin de les rendre plus organisés. C'est ce que nous allons examiner ensuite. 6. Vues et itinéraires: Dans le navigateur, notre projet est ouvert. Nous avons brièvement examiné cette page d'accueil et les liens À propos qui y sont fournis. Nous passons d' une page à l'autre ou ces deux vues que nous venons de découvrir. Nous pouvons voir ces deux fichiers de vue dans l'éditeur. Accédez au code de Visual Studio avec le projet ouvert dans le dossier source où nous écrirons tout notre code. Nous avons ce dossier appelé views. Il y a le About et le HomeView entre lesquels nous passons simplement de l'un à l'autre dans le projet. L'intérieur de ces fichiers vous semblera assez familier si vous avez déjà utilisé Vue.js par le passé. Ce ne sont que des fichiers de composants dans lesquels se trouve la section script, dans laquelle nous écrivons tout notre code JavaScript et importons tous les fichiers dont vous pourriez avoir besoin. Puis aussi une zone de modèles juste ici. C'est dans cette zone que nous écrivons notre code HTML. Nous pouvons également avoir une section de style que nous pouvons voir si nous accédons à AboutView. Au-dessus, dans le dossier source, nous avons ce dossier du routeur avec une page index.js. Nous l'avons puisque nous avons choisi d'installer le package de routeur Vue lors de la première configuration de ce projet. La clé se trouve en haut du fichier dans lequel nous importons n'importe laquelle de nos vues. Ici, nous pouvons voir que nous importons le HomeView depuis le dossier Views. Ensuite, en dessous, à l'intérieur de CreateRouter se trouve ce tableau de routes. Chacun de ces itinéraires est un objet, comme nous le voyons ici. Nous voyons le chemin du fichier, qui est une barre oblique. Il s'agit du répertoire personnel. Nous pouvons donner le nom de ce routeur, auquel nous ferons référence au cours de notre projet. Liez ensuite ceci à un composant de vue particulier que nous venons d'importer. Ensuite, nous avons également la section À propos. Vous vous demandez peut-être pourquoi nous n'avons pas importé le AboutView en haut à côté du HomeView. Eh bien, nous faisions souvent cela et l'AboutView était également important, tout comme nous l'avons fait avec les composants Home. Mais au lieu de cela, cela démontre une approche légèrement différente où nous utilisons ce que l'on appelle le chargement différé. Nous chargeons la page en différé pour ne télécharger le contenu de la page que lorsque l' utilisateur en a réellement besoin. Cet aperçu de la page du routeur, nous allons maintenant créer les vues dont nous avons besoin pour notre projet , puis nous pouvons revenir et les ajouter à notre tableau. Dans la source, dans le dossier Views, nous pouvons toujours utiliser HomeView et AboutView pour nos projets. Effacons simplement le contenu qui se trouve à l'intérieur pour ne pas avoir besoin des composants de bienvenue. Comme nous l'avons supprimé , nous pouvons également supprimer la référence à celui-ci ici. Au lieu de placer un titre de niveau 3, envoyez peut-être un SMS à une maison. Nous reviendrons et ajouterons du contenu à ces vues, mais pour l'instant, nous pouvons utiliser le titre de niveau 3 pour voir à quelle page nous passons. The AboutView, supprimez le style. Nous n'avons pas de section de script. Nous avons l'emballage, H3, et le texte d'environ. Dans les vues, nous avons besoin de deux fichiers supplémentaires. Cliquez sur l'icône « Fichier » située à peu près en haut. Nous avons également besoin de l'AdminView, qui utilise l'extension .vue. Créez un modèle, un titre. C'est pour l'administrateur. Nous archivons la vue finale que nous allons utiliser est le MenuView. Celui-ci sera utilisé pour afficher toutes les pizzas que nous avons dans notre base de données ainsi qu'un panier d'achats. Un autre modèle, l'en-tête du menu. Ensuite, nous pouvons les fermer et les importer dans notre routeur, donc l'index du routeur. Ils se trouvent tous dans le même répertoire qu'un HomeView. Copions et collons ceci trois fois de plus. Le Menu et le MenuView. Le suivant est l'administrateur de l'AdminView et le dernier est celui de About. Comme nous les avons importés en haut de notre fichier, nous pouvons essentiellement dupliquer la section Accueil. Juste en dessous, créez un nouvel objet, séparez-le par une virgule. Le chemin que nous voulons utiliser est une chaîne et ce sera un menu à barres obliques. Cela signifie que si nous entrons dans notre projet et qu'à la toute fin, en tapant le menu à barres obliques, nous verrons le menu dans le navigateur. Ensuite, le nom, qui est le lien du menu. Nous l'utiliserons bientôt dans notre projet. Le composant que nous voulons afficher est le menu que nous avons importé juste au-dessus. Ensuite, nous avons l'administrateur, écrit un nouvel objet et le sépare par une virgule. Celui-ci veut accéder à l'intérieur du navigateur avec la barre oblique admin, le nom du lien d'administration et les composants d'administration. Bien. Le dernier dont nous avons besoin est About. La voie à suivre et l'ordre dans lequel nous les plaçons ne font aucune différence pour notre projet. Le nom de ce lien, le lien À propos et enfin les composants. Bien. Tout cela est fait. Assurez-vous d'avoir une virgule entre chacun de ces itinéraires. Faites une sauvegarde. Si nous passons maintenant au navigateur, actualisons. le menu à barres obliques, nous avons les textes du menu de nos composants. Nous avons également Admin. Vous voyez le texte de l'administrateur, À propos, puis la barre oblique correspondant au répertoire de base. Actuellement, nous voyons toujours le contenu de nos quatre vues côté du contenu existant sur la gauche. Comment notre application sait-elle où nous voulons que ces vues s'affichent ? Eh bien, la réponse se trouve dans le RouterView, que nous allons examiner ensuite en ajoutant ces nouvelles vues à nos liens de navigation. 7. RouterLink et RouterView: Dans notre dossier source du projet, ouvrez le fichier App.vue. À l'intérieur de ce fichier, il y a deux choses principales à noter. L'un d'eux est que nous avons cette zone de navigation, qui contient deux liens de routeur. Il contient le texte de la page d'accueil et aussi celui de about, et voici les deux liens que nous voyons à l'intérieur de notre projet. La première chose à faire est ces liens ne sont pas les huit éléments habituels , comme nous le verrons dans le code HTML normal. Au lieu de cela, ils sont entourés à l'intérieur de cette liaison de routeur. C'est ainsi que le routeur de visualisation gère les liens vers d'autres pages ou composants. Il les utilise à la place des éléments a afin que le routeur puisse modifier les URL de la page sans recharger la page. Nous pouvons également contrôler l' URL à laquelle nous associons pour inclure des itinéraires dynamiques, qui peuvent inclure des variables, plutôt que de simplement avoir les textes en clair comme ici, nous pouvons également insérer des variables. De plus, vous verrez ce routeur afficher le composant en bas. C'est le point de vente qui affiche le contenu de notre page, que nous avons à l'intérieur des vues. C'est là que le contenu de notre page est affiché, qui nous donne un contrôle total plutôt que de simplement remplacer le contenu complet de la page. Nous voyons ici que ce composant d'affichage du routeur est placé à côté de l'en-tête. C'est pourquoi nous les voyons côte à côte dans le navigateur. Vous remarquerez également que si vous remontez en haut du fichier, le lien du routeur et la vue du routeur sont importés à partir du package view router. Avec ces connaissances, nous pouvons supprimer le code standard d'ici et créer nos propres liens à l'intérieur des composants d'en-tête. Nettoyons cette App.vue. Nous allons supprimer le lien de notre routeur, nous n'en avons plus besoin. Supprimez également ce contenu d'en-tête. Nous n'avons pas besoin de cet exemple HelloWorld dans notre projet, mais nous pouvons réutiliser ce fichier et le convertir en composant d'en-tête. Nous appellerons cela l'en-tête de l'application, renommerons le fichier AppHeader.vue. Ensuite, dans le modèle, nous pouvons placer cet AppHeader exactement là où nous voulons qu'il soit. Étant donné que ce fichier App.vue est le composant principal de notre projet, nous pouvons l'utiliser pour lui donner une certaine structure. Dans nos projets, nous voulons toujours que cette vue du routeur affiche la page. Mais juste au-dessus de cela, nous pouvons également placer dans l'AppHeader. Cela signifie que sur chaque page de notre projet, l'en-tête sera en haut, suivi du contenu de la page. Ensuite, n'oubliez pas que nous avons changé ce nom de fichier pour qu'il soit AppHeader.vue. Cela se trouve dans le dossier des composants. Saute à l'intérieur d'ici. Renommez ensuite l'exemple HelloWorld en AppHeader. Nous pouvons également supprimer ces icônes. [inaudible] a créé le projet. Nous n'en avons pas besoin pour notre projet. Passons à ce fichier AppHeader.vue. Nous effaçons tout le contenu. Nous n'avons pas besoin de script pour le moment. Nous allons le supprimer. Supprimez tous les styles par défaut. Tout le contenu se trouve entre les modèles. Je vais le remplacer par un en-tête HTML. En-tête de ligne, placez-le à l'intérieur d'un élément de niveau 1 avec le titre de soulignement de classe. Plutôt que de simplement ajouter le texte de pizza planet pour le titre de notre site, nous pouvons également le placer dans le lien du routeur. Il possède une étiquette d'ouverture et de fermeture. Puis, à l'intérieur des icônes Tilder, le texte de Pizza Planet. Vous pouvez voir que nous avons cette donnée sous-jacente qui est une erreur avec ce composant. C'est parce que nous devons ajouter les deux accessoires en tant qu'attribut. Comme il s'agit du titre du site, il s' agit simplement d'un lien vers la page d'accueil, qui est une barre oblique. Ensuite, une section de navigation avec nos liens de navigation. Ces liens de navigation renverront à nos points de vue. Nous nous dirigeons juste en dessous de notre niveau 1 . Les éléments de navigation. Il s'agit d'une série de liens relatifs. La classe de lien que nous associerons très bientôt à notre CSS. Les deux attributs. Ce sera le lien d'accueil, afin que nous puissions créer un lien vers la barre oblique et le texte d'affichage de la page d'accueil. Dupliquez cela trois fois de plus. La suivante concerne le menu, qui renvoie vers /menu. La dernière consiste à créer un lien vers l'administrateur sous la navigation et à placer le titre de niveau 2 avec le texte de la pizza numéro 1 . Sauvegardons-le et vérifions-le. Tout fonctionne. Nous avons maintenant l'en-tête de l'application en haut , puis nous devrions voir le contenu de l'affichage du routeur juste en dessous. Rafraîchir. Voici notre rubrique de niveau 1. Nous avons nos liens, nous avons le titre de niveau 2, mais nous avons toujours le contenu de cette page à côté. Le contenu dans lequel nous voulons qu'il s'affiche, mais nous n'avons pas le style requis. Cela se produit en raison du style qui est configuré par défaut dans notre projet VP. Nous pourrions le supprimer et utiliser le nôtre. Dans la barre latérale. Accédez au dossier des ressources, contient différentes feuilles de style. Supprimons le fichier base.css. Nous pouvons également supprimer le logo, mais nous ne pouvons pas utiliser ce fichier CSS principal, mais nous allons effacer le contenu et ajouter le nôtre. Sélectionnez tout le contenu et supprimez ce fichier. Il est enregistré dans le navigateur. Il s'agit de notre section d'en-tête. Maintenant au sommet. Maintenant, j'ai le contenu de la page juste en dessous ou nous pouvons également basculer entre le contenu de cette page avec ces liens d'en-tête. 8. Itinéraires nommés: Comme nous venons de le découvrir à l'intérieur du lien du routeur, nous avons créé des liens vers différentes pages présentant ces deux attributs. Puis à l'intérieur, placé dans une URL codée en dur vers laquelle créer un lien. Cela fonctionne très bien, mais nous avons également quelque chose appelé routes nominatives. itinéraire du nom peut être un avantage si nous utilisons le même lien plusieurs fois. Imaginez que notre projet contienne de nombreux liens vers cette page de menu, mais qu' nombreux liens vers cette page de menu, à l'avenir, si nous voulions changer cette URL du menu à barres obliques pour en faire pizza avec barre oblique directe, nous devrons modifier tous ces liens manuellement. Nous pouvons également créer un lien vers le nom que nous lui avons donné dans le fichier du routeur, accédant ainsi au routeur dans le fichier index.js. N'oubliez pas que chacun de ces liens porte un nom spécifique. Nous pouvons le transmettre sous forme d'objet, au lieu de la barre oblique, en plaçant les accolades pour créer un objet. Le nom de propriété, qui est égal à domicile. Comme pour tout autre attribut View Js, si nous y insérons des données dynamiques, telles que notre nom, nous devons également les placer entre les deux points, qui sont une liaison en v pour les rendre dynamiques. Cela indique à un routeur de visualisation qu'il ne doit pas être lu comme une chaîne de texte, mais qu'il doit plutôt rechercher nom que nous avons dans notre fichier de routeur. Nous pouvons également le faire avec le reste des liens. Copiez-le et nous pourrons le placer en haut de notre titre. Le second. C'était pour notre MenuLink, qui correspond au nom contenu dans le fichier de notre routeur. Le numéro trois. C' était le AboutLink. Enfin, le AdminLink. Enregistrez-le et accédez à notre projet. Il devrait être automatiquement mis à jour puisque nous utilisons Vite pour notre serveur de développement. Cliquez sur tous les liens et tout fonctionne toujours comme avant, mais maintenant, nous utilisons ces noms de routes. 9. Routes imbriquées: Notre configuration actuelle permet une structure de routeur comme celle-ci. Nous avons nos RouterLinks dans l'en-tête, puis nous avons remplacé le contenu de ces vues là où nous le voulions en utilisant le RouterView. Cela conduit à une structure d'URL assez simple. Nous aurions notre URL principale et chaque vue ajouterait à la fin le nom de admin, menu ou about, par exemple. Mais parfois, notre structure peut avoir besoin d'aller encore plus loin. L'une de ces vues peut également nécessiter des liens et un emplacement pour afficher le contenu. page « À propos de nous » de nos projets en est un exemple. Sur la gauche se trouve la vue À propos de nous, que nous pouvons placer dans le contenu de notre choix. De plus, nous pouvons également fournir des liens supplémentaires, comme nous le voyons ici, avec l'historique, livraison et les emplacements. Sur la droite, nous avons la structure souhaitée, qui serait la vue À propos de nous, puis les liens imbriqués relatifs à l'historique, livraison et aux emplacements suivants. Pour structurer cela, nous devons à nouveau utiliser le routeur de vue à l'aide des RouterLinks et du RouterView pour placer le contenu sur la page À propos de nous exactement là où nous le souhaitons. Passons au projet et nous pouvons commencer à mettre les choses en place. Ces sections d'historique, de localisation et de livraison que nous venons de voir seront toutes des composants entre lesquels nous pourrons basculer. Configurons-les dans le dossier des composants. Nous avons déjà cette configuration, alors créez un nouveau fichier, et celui-ci sera Delivery.vue. La prochaine, ce sera History.vue. Ensuite, le suivant concerne les emplacements, tous avec l'extension .vue, et nous pouvons également supprimer les composants dont vous n'avez pas besoin, savoir TheWelcome.vue, déplacer celui-ci et WelcomeItem. Bien. Passons maintenant à nos trois nouveaux composants, et nous pouvons ajouter une structure de base. Nous avons besoin du modèle et chacun de ces trois composants sera assez simple. Nous allons simplement créer un emballage. Nous ajouterons un titre en haut, une image et un peu de texte aléatoire. Le div, regardez la classe C de info_block. Cela sera ajouté à ces trois nouveaux composants, h3. Je vais utiliser les icônes de tilde et voici Delivery Info. Ensuite, une source d'image. Passons au dossier des ressources où se trouvera notre dossier d'images , puis à l'image que vous voulez se trouve le fichier box.jpg. Encore une fois, vous pouvez utiliser vos propres images si vous le souhaitez. Remplacez simplement l'un d' entre eux que vous souhaitez. Le texte alternatif, pizza dans la boîte. Puis aussi une classe de info_img. Juste après l'image, nous ajouterons du texte dans les éléments p, et vous pourrez le remplacer par le texte de votre choix. Mais pour simplifier, je vais juste ajouter du texte aléatoire de lorem ipsum. Si vous utilisez Visual Studio, vous pouvez simplement taper le mot lorem, puis appuyer sur « Entrée ». Cela nous donnera un texte factice que nous pourrons placer dans notre projet. Pour que les choses restent cohérentes, copions tous ces contenus, puis entrons dans l'historique. Collez-le et tout ce que nous avons à faire ici est de changer le titre de livraison en historique. L'image, celle-ci, c'est le chef image.jpg. Le texte alternatif du chef préparant une pizza. Faites une sauvegarde. La question suivante portait sur les locations. Collez à nouveau le contenu et modifiez le titre. L'image de celui-ci est constituée de tableaux. Modifiez également le texte alternatif. Voici les tables d'extérieur. Bien. Ce sont les trois composants que nous utiliserons pour passer l'autre dans la vue à propos et c'est ce que nous allons examiner ensuite. 10. Les composantes de vue et d'enfant: Passons maintenant à la page À propos où nous pouvons désormais utiliser un routeur pour basculer entre nos trois nouveaux composants. Nous avons également besoin d'une structure et d'un contenu sur cette page, ainsi que des liens du routeur et de la vue du routeur. Supprimons le titre du niveau 3 et placez-le dans un div avec la classe about. Ce sera l'emballage de ces composants, puis nous les placerons dans différentes sections. La partie supérieure, si nous allons à peu près, sera placée en deux zones. Si nous passons à la vue « à propos », elle sera divisée en deux sections. La section supérieure sera une introduction propos de cette page où nous trouverons quelques textes sur la pizza, l'histoire, que nous placerons dans une image, puis en dessous, nous ajouterons une deuxième section qui contiendra nos liens de routage pour basculer entre nos composants Freedom. la première section, avec la classe d'intro, et imbriquée à l'intérieur, nous aurons deux choses. Tout d'abord, il y a un div, et ensuite, l'image. Le div va contenir le texte, puis nous ajouterons l'image juste en dessous, puis nous ajouterons une nouvelle section en bas, et celle-ci contiendra nos liens. Commençons par ce premier div en lui donnant une classe de texte d' information (le trait de soulignement entre chaque mot). Rubrique de niveau 3 avec le titre de pizza de qualité depuis 30 ans. Allons voir ça. Il y a notre titre, puis en dessous de notre titre de niveau 3, placez en p des éléments avec le texte uniquement des ingrédients de la meilleure qualité dans une atmosphère conviviale. voilà, placés dans une classe afin pouvoir ajouter du CSS plus tard à du texte d'information. Ensuite, l'image. Tout d'abord, une nouvelle classe pour le style de info_image ou img. La source se trouve dans le dossier des ressources où se trouve notre dossier d' images, et celle-ci est dirigée vers le fichier calzone.jpg. L'ancienne image en gros plan du texte Calzone. Nous y voilà. Il s'agit de la section supérieure maintenant terminée. Bien sûr, nous allons bientôt l' améliorer un peu avec un peu de style, mais pour l'instant, passons à notre deuxième section, qui sera consacrée à nos liens. Cela nécessite une classe d'emballage plus d'informations, un titre de niveau 3, et cela signifie que vous devez cliquer sur les liens ci-dessous pour plus d'informations. Ensuite, nous pouvons commencer à construire nos liens dans les éléments de navigation HTML, liste non ordonnée. Chacune de ces liaisons sera placée à l'intérieur de la liaison du routeur. Chacun aura la classe de lien, mais notre style. Nous utilisons les deux points parce que nous allons dynamiser les deux attributs en les plaçant dans un objet, et cet objet va pointer vers le nom, que nous allons supposer attribuer à chacun de ces composants. Ce premier sera le lien vers l'historique et le texte d'affichage de notre histoire. Dupliquons cela deux fois de plus. Le second sera pour le lien de livraison. Un texte de livraison. Le numéro 3 sera le lien de localisation. N'importe quel texte de lieux. Bien. C'est tout ce dont nous avons besoin, maintenant nous avons nos liens gratuits dessous de toutes nos informations en haut . Allons voir ça. Accédez à la page À propos. Le contenu disparaît, peut-être simplement parce que nos noms ne correspondent pas, parce que nous ne l'avons pas encore créé. Passons simplement à la console et nous pourrons vérifier cela. Notre nom ne correspond pas, alors passons au routeur et faisons-le maintenant. Le routeur index.js. Nous devons d'abord importer nos trois composants, à savoir l' historique, les emplacements et la livraison. En haut, importez la livraison, cette fois dans le dossier des composants, le composant est delivery.vue. Dupliquez ceci deux fois de plus. La prochaine concerne l'histoire. Le dernier concerne les emplacements. Comme pour tous nos autres itinéraires, nous devons ajouter ces trois composants à un chemin. Mais n'oubliez pas que le chemin de ceux-ci sera imbriqué dans le lien À propos, donc c'est ce que nous voulons. En fait, nous pouvons simplement supprimer le second environ. Nous avons le nom du composant, c'est à peu près pour pouvoir simplement supprimer celui qui a été placé par défaut. Nous avons ce lien À propos et ce que nous voulons, c'est le chemin à suivre, puis la barre oblique, nous voulons les lieux, livraison et aussi l'historique. Comment s'y prendre ? Eh bien, actuellement, la barre oblique concernant le lien ne pointe que vers un seul composant. Nous pouvons également imbriquer plusieurs composants en ajoutant la propriété réservée aux enfants. Pour la propriété children, étant donné que nous liens vers plusieurs composants, doit être placée à l'intérieur d'un tableau. Chaque tableau contient un objet qui est structuré exactement comme chacun de ces itinéraires. Nous allons donc insérer le chemin, le nom et les composants. Pour que le premier soit lié à l'histoire, nous plaçons le nom du composant dans le chemin de l' histoire. Ce nom de composant doit correspondre exactement à celui que nous avons placé dans les liens de notre routeur. J'ai un lien vers l'historique, un lien de livraison et un lien vers les emplacements. Celui-ci est pour le lien vers l'historique. Ensuite, les composants historiques. Séparez-les par une virgule. Fermez ça. Séparez-les par une virgule et placez-les sur leur propre ligne séparée. Dupliquons ceci, copiez-collez ceci deux fois de plus. Le second concerne la livraison, lien vers le lien de livraison sur le composant de livraison. Ensuite, les emplacements. Essayons ça. Nous devons accéder à la page À propos de nous et ensuite vérifier exactement à quoi cela ressemblera. Actuellement, nous sommes sur une barre oblique, essayons nos liens en bas, nous avons l'historique. Nous parlons maintenant de l'historique des barres obliques, de la livraison, cela est ajouté à la fin et il en va de même pour les sites. Une chose que vous pensez peut-être, c'est que nous avons actuellement une barre oblique que nous avons placée à l'intérieur de ce chemin ici, puis nous avons également des emplacements de la barre oblique vers l'avant. Tout d'abord, lorsque nous avons configuré les itinéraires pour les enfants, nous n'avons pas ajouté de barre oblique avant chacun de ces chemins. Eh bien, si nous le faisions, il sera traité comme un chemin racine. Voyons exactement ce que nous entendons par là. Si nous ajoutons la barre oblique à chacune d' entre elles puis que nous accédons à la section À propos. Désormais, au lieu d'avoir une barre oblique, si nous cliquons sur l'un de nos liens, l'URL complète sera remplacée par ce lien vers l'historique de livraison ou les localisations. Mais comme nous voulons les ajouter à la fin du lien À propos, nous pouvons simplement les utiliser sans la barre oblique. Enfin, pour voir le contenu ci-dessous de chacun de ces composants, nous devons ajouter une vue du routeur. Accédez à la vue À propos, puis juste en dessous de la navigation et placez la vue du routeur. Ceci et vérifions-le. Nous avons la section supérieure , puis la zone des emplacements en bas, l'historique et aussi la livraison. 11. Vues nommées: Cette page À propos de nous comporte trois éléments entre lesquels nous pouvons basculer. Comme nous le savons, nous pouvons cliquer sur l'historique, les emplacements et également les composants de livraison. Comme nous l'avons déjà vu, nous pouvons utiliser des composants et les réutiliser dans n'importe quel fichier de votre choix. Par exemple, dans app.vue, nous pouvons suivre la méthode traditionnelle en important un composant, puis le rendant dans le modèle. Une autre méthode de rendu d'un composant consiste à utiliser le routeur Vue. Jusqu'à présent, nous avons utilisé les RouterViews pour afficher une page telle que celle-ci juste ici. Il en va de même dans la vue ci-dessus, que nous venons d'ajouter dans la vidéo précédente, nous avons utilisé le RouterView. Cela peut afficher la page de niveau supérieur ou n'importe quel composant secondaire, comme nous le faisons ici avec la page à propos. Nous pouvons également insérer autant de RouterViews que nous le souhaitons et chaque RouterViews supplémentaire agira comme prise avec différents composants. Si vous deviez insérer d'autres RouterViews, nous devons également leur donner des noms afin que le routeur sache quels composants afficher dans chacun d'eux. Supposons que nous souhaitions afficher des informations supplémentaires en bas de la page d'accueil, telles que les composants de livraison et d'historique. Nous avons ici un développeur. La clé ici est que nous avons deux RouterViews supplémentaires. Chacun d'entre eux possède un nom attributs qui seront importants dans un instant. Notez que le RouterView en haut n'a pas de nom. Il s'agit d'un emplacement par défaut. Cette valeur par défaut, ainsi que les deux noms sont définis dans la page d'index du routeur. La gauche montre ce que nous avons actuellement configuré pour la page d'accueil à l'aide d' un seul composant. Cependant, lorsque nous avons plusieurs RouterViews avec des noms, nous devons le modifier pour utiliser un objet de composants, comme nous le voyons sur la droite. premier est l'emplacement par défaut, qui est le RouterView sans nom. Ensuite, les deux noms suivants correspondront aux deux noms que nous avons donnés aux RouterViews. Accédez au projet et nous pourrons le configurer. Passez au composant principal de niveau supérieur, qui est le fichier app.vue, puis juste en dessous du RouterView, nous placerons dans un div. Ce div, le style et la mise en page auront la classe de wrapper de blocs d'informations. Ensuite, à l'intérieur, nous pouvons placer un RouterViews supplémentaire pour afficher n'importe lequel de nos composants. Pour cet exemple, je vais afficher la livraison ainsi que les composants de l'historique dans cette page principale. Placer un RouterView, les attributs du nom, qui seront égaux à la livraison. Copiez et collez ceci. Le second sera consacré à l'histoire. Nous souhaitons uniquement que ces deux composants s'affichent sur la page d'accueil. Pour cela, passons à la page d'index des routeurs et passons à la section d'accueil. Actuellement, le routeur domestique n'affiche qu' un seul composant de la vue d'accueil. Mais pour afficher plusieurs composants, nous pouvons modifier le composant pour qu'il ait un s à la fin. Supprimez-le, transmettez un objet. Comme nous l'avons vu avec les diapositives, nous devons ajouter la vue par défaut, qui est celle qui est affichée dans la vue du routeur sans nom. Celui-ci est la vue d'accueil, le nom de la livraison. Cela affichera les composants de livraison et le suivant sera destiné à l'historique. Juste pour récapituler, nous avons le composant par défaut, qui est la vue d'accueil à l'intérieur de l'application. Cela s'affichera dans la vue du routeur, qui n'a pas de nom. Ensuite, nous avons les composants de livraison et d'historique, qui correspondront au nom de nos deux vues de routeur supplémentaires. Maintenant, View Router sait quels composants afficher à chaque emplacement. ces deux composantes de la livraison ont déjà histoire, ces deux composantes de la livraison ont déjà été importées en haut de la page, donc tout devrait maintenant être prêt à partir. Enregistrez ce fichier, accédez à la page d'accueil. Du haut, nous avons cette entrée de niveau 3, que nous pouvons voir de l'intérieur de notre champ de vision. Ce que nous avons ici est ce titre, puis ci-dessous, nous avons nos composants de livraison et l'historique. Juste pour confirmer qu'ils ne s' affichent que sur la page d'accueil, nous pouvons accéder aux liens supplémentaires et nous ne devrions pas voir ces composants s'afficher. Pour terminer, revenons à notre application app.vue et ajoutons un petit style pour les faire apparaître côte à côte sur la vue plus grande , puis empilées verticalement sur le plus petit écran. App.vue. Nous avons cette classe de wrapper de blocs d'informations. Copions ceci dans la section style. Type d'affichage de Flex. Nous allons commencer par la vue sur petit écran, ce qui signifie que nous devons modifier la direction de flexion pour qu'elle soit en colonne. Cela permettra de garder notre contenu empilé verticalement sur le plus petit écran. Pour que cette modification soit côte à côte, nous devons modifier la direction de flexion pour qu'elle soit alignée sur un écran plus grand. Nous pouvons le faire en ajoutant une requête multimédia. En fait, nous pouvons également supprimer tout le reste du style. Je n'ai pas besoin de tout ça. Configurez toutes les requêtes multimédia avec nos médias. Nous voulons que cela cible les écrans d'une largeur minimale de 900 pixels. Prenons notre emballage de blocs d'informations. Nous allons modifier la direction de flexion pour qu'elle soit égale à la ligne. Sur les écrans plus grands (900), vous les placez dans une rangée , puis cela descend sur le plus petit écran. Il s'agit d'une autre méthode d' utilisation des composants plutôt que la méthode traditionnelle d'importation d'un composant dans un autre fichier à afficher. Nous pouvons également autoriser le routeur Vue à les placer dans une vue du routeur. 12. Projet UI- Section Intro: Cette nouvelle section est consacrée à l'introduction contenu dans notre application. Nous allons créer toute la structure dont nous avons besoin en créant différentes pages et composants. Plus tard, dans les prochaines sections, nous les dynamiserons en insérant diverses informations provenant d'une base de données, telles que nos commandes, nos utilisateurs et nos pizzas. Mais ensuite, nous allons commencer par créer les composants du menu. 13. L'interface utilisateur du menu: La page d'affichage du menu, que nous allons maintenant créer, sera divisée en deux sections. Sur la gauche, nous allons inclure le menu, qui inclura toutes les pizzas dans une liste. Ensuite, dans la section suivante, nous créerons la section panier sur la droite, qui listera tout le contenu que l'utilisateur ajoute au panier. Passons aux composants de notre vue de menu et commençons à travailler dessus Dans les vues dans la vue du menu. Nous allons déplacer le titre du niveau 3 pour le moment, puis créer un div, qui servira de wrapper à nos deux sections. Il s'agit de la classe de wrapper de soulignement de menu. Ensuite, deux autres divs, qui seront imbriqués à l'intérieur. La première concernera le contenu sur le côté gauche, qui sera notre menu. Je vais lui donner la classe de menu, puis créer un deuxième div, qui sera destiné à notre panier. Donne-nous la classe de basket. Passez ensuite à la section du menu et placez-la dans un titre de niveau 3. Utilisez les utilitaires pour tous les textes d'authentiques pizzas faites à la main. Pour notre deuxième division, qui est le panier. Encore une fois, un niveau 3 en tête des utilitaires. Celui-ci est pour le panier. Comme mentionné précédemment, pour l'instant, nous allons simplement travailler dans cette section de menu, qui sera un tableau HTML. Cette table ne contiendra qu' une seule pizza pour le moment. Mais nous y reviendrons lorsque nous commencerons à travailler avec la base de données Firebase afin de pouvoir parcourir en boucle toutes les pizzas stockées, puis les afficher dans ce tableau. Pour l'instant, nous allons configurer notre modèle indiquant à quoi cela ressemblera à l'intérieur du corps du tableau. Ensuite, à l'élément TR pour la première ligne de notre tableau. Tout le contenu de notre pizza sera placé dans cette seule rangée du tableau. Les cellules saisissent certaines données du tableau. Ce sera pour le nom de la pizza. Le nom de la pizza sera placé à l'intérieur des étiquettes robustes et figurera dans n'importe quel nom de pizza, tel que Margarita. dessous de cette première ligne du tableau, En dessous de cette première ligne du tableau, nous allons ajouter une deuxième ligne. Celui-ci contiendra la description dans les données du tableau. Les petites étiquettes et la description d'une délicieuse pizza à la pâte de tomates garnie de mozzarella. Faites défiler l'écran vers le bas et juste cette ligne du tableau pour ajouter une troisième ligne. Celui-ci concernera les options disponibles. Pour chaque pizza, nous allons créer deux tailles différentes , une de neuf pouces et une de 12 pouces. Plus tard, au cours de ce cours, nous aborderons cette question en boucle et le ferons à la fois pour les pizzas de 12 et de 9 pouces, mais pour l'instant, comme nous ne faisons que créer notre structure et ajouter quelques exemples de données, je vais simplement les placer dans une seule taille, qui sera pour la pizza de 9 pouces. Cela sera suivi par le prix. Ensuite, la troisième section sera un bouton qui sera utilisé pour ajouter la pizza au panier. Placez-le dans un bouton HTML à l'intérieur. Type de bouton. Ensuite, pour sortir, le symbole plus utilisera une entité HTML, qui est le code des esperluettes, le hachage 43 et un point-virgule. Le navigateur nous permet de voir à quoi cela ressemble. Nous avons notre première ligne, qui est le titre, la deuxième ligne, qui est une description et la troisième section sera notre option. Comme mentionné précédemment, nous passerons en revue cette troisième section, qui nous présentera nos différentes options. Voici notre table pour notre pizza, maintenant prête . Ensuite, dans la vidéo à venir , nous passerons à la section suivante, qui est le panier. 14. L'interface utilisateur du panier: la continuité de la vidéo précédente, où nous avons ajouté la section de menu sur la gauche, nous allons maintenant passer à la zone des paniers. Ce panier sera également un tableau présentant les pizzas que l'utilisateur sélectionnera en cliquant sur le bouton Ajouter juste ici. Suivi d'une commande, d'une section complète et d'un bouton pour passer la commande. À l'avenir, ce bouton de commande sera lié à notre code JavaScript pour ensuite transférer cette commande dans notre base de données. Pour le tableau, les sections contiendront une seule ligne. Cette ligne comportera la quantité et un bouton chaque côté pour augmenter ou diminuer la quantité. Vous aurez le nom de la pizza sélectionnée ainsi que le prix. Sous notre rubrique de niveau 3 pour les paniers, créez un div. Ce div contiendra la structure de tous les paniers, qui sera un tableau tout en haut, puis le texte, qui sera le total de la commande. Mais maintenant, entrez la valeur que vous souhaitez. Cela sera mis à jour et calculé avec JavaScript. Ensuite, un bouton qui sera chargé ultérieurement de passer la commande. Un peu de texte convient pour le moment. Voyons à quoi cela ressemble. Voici l'un de nos contenus. Nous pouvons maintenant passer à la section du tableau. Le tableau contiendra une seule ligne de tableau. Dans la première cellule de données du tableau, il y aura deux boutons et également la quantité. Nous aurons la quantité au milieu, puis un bouton de diminution sur la gauche et un bouton d'augmentation sur la droite. Le premier bouton avec la classe quantity_button, le type, qui est également bouton, puis l'entité HTML, qui correspond aux esperluettes, le hachage 8722 suivi du point-virgule. Cela nous donnera le symbole négatif, puis nous ajouterons la quantité, puis à droite un bouton avec le symbole plus. Pour la quantité qui se trouvera au milieu, placez-la dans n'importe quelle quantité pour le moment. Copiez notre bouton et collez-le en bas et remplacez simplement le numéro de code par 43. Les dates figurant sur ces boutons seront utilisées pour augmenter et diminuer cette valeur. Avant de l'ajouter au panier, nous mettrons également à jour le total de la commande au fur et à mesure que nous modifierons les choses. Il s'agit de notre première donnée tabulaire. Le second portera sur le nom de la pizza et aussi sur la taille de l'option et le troisième. C'est le prix de la pizza. Enregistrez et transférez dans le navigateur. Ce sont toutes les informations dont nous avons besoin pour le panier. Maintenant que tout ce contenu est en place, nous allons maintenant envisager d'ajouter un petit style pour le rendre un peu plus beau et améliorer la mise en page. 15. Polices et styles de base: À l'intérieur de notre projet, nous avons ce fichier main.js. Il s'agit du fichier qui est responsable de la création de notre application. Nous l'importons depuis la bibliothèque Vue. Nous importons également les principaux composants de l'application, dont celui-ci se trouve ici. Il s'agit du composant d'entrée principal et tout le reste sera imbriqué à l'intérieur. Nous transmettons ce fichier pour créer une application, puis nous montons l'application dans le DOM avec l'identifiant de l'application. plus, il inclut également une importation haut avec un fichier main.css, qui se trouve à l'intérieur de ce dossier d'actifs. La façon dont nous structurons notre style dépend entièrement de nous lorsqu' il s'agit d'une application Vue. Mais je vais l'utiliser comme une sorte de fichier de style général contenant des fichier de style général contenant styles de base tels que des polices et des réinitialisations. Nous pouvons toujours ajouter des composants spécifiques ou un style de page dans des composants individuels des fichiers Vue. Mais tout d'abord, nous devons choisir les polices que nous allons utiliser pour le projet. Pour cela, je vais utiliser les polices de Google. Rendez-vous donc sur fonts.google.com. Je vais utiliser deux polices distinctes. L'un d'eux sera destiné à nos titres et à notre titre, et l'autre au texte général. Cliquez donc sur Rechercher. Le premier s'appelle Marck script et celui-ci s'appelle M-A-R-C-K, et c'est celui pour nos en-têtes et notre titre. Sélectionnez donc ceci. Faites défiler vers le bas. Celui-ci ne contient que les textes habituels, ce qui est bien. Cliquez sur l' icône plus pour l'ajouter à nos familles sélectionnées, ainsi que celle-ci. Cherchons notre deuxième. Revenons à la recherche. Pour le texte général, je vais utiliser Roboto. C'est celui dont nous avons besoin ici. Passons à une sélection de polices. Donc 300, qui est un texte léger, le 400, qui est un poids normal, et aussi un 500. Ajoutez les trois à la famille. Cliquez sur ces familles sélectionnées et nous aurons les informations dont nous avons besoin pour importer dans notre projet. Nous avons donc un lien que nous pouvons utiliser ou nous pouvons utiliser la syntaxe d'importation. Pour l'importer, allons le dossier Assets et dans le fichier main.css. Ce champ est actuellement vide. Nous pouvons ajouter cette règle d'importation. Copiez donc tout ce qui se trouve à l'intérieur des balises de style. Collez ceci dedans. Comme nous l'avons déjà vu dans le fichier principal dot js, nous avons l'identifiant de l'application, que nous pouvons sélectionner comme wrapper principal pour notre projet. Sélectionnez donc ceci avec le hachage. À l'intérieur, nous pouvons définir la famille de polices comme Roboto en copiant cette deuxième ligne ici. Ce serait notre texte général et nous le remplacerons par le script Marck lorsque nous en aurons besoin. Entrez dans le corps. Nous ajoutons simplement des styles généraux à l'intérieur, vous vous souvenez ? Nous allons donc ajouter une marge pour centrer notre projet, en la réglant sur zéro en haut et en bas, ainsi que sur la gauche et la droite. Le texte de la ligne de couleur RGB, avec une valeur de 76 pour le rouge, le vert et le bleu. Juste après le corps, nous ciblerons les rubriques h1, h2, h3, h4, h5 et h6. N'oubliez pas que la famille de polices nous allons utiliser pour celle-ci est l'autre que nous obtenons des polices de Google. Copiez donc cette section, collez-la. Supprimez toute marge par défaut appliquée à l'un de nos titres avec le navigateur. Je place la couleur, qui est une valeur RGB de 76 76,76. Cela nous donne notre style de titre général, mais nous utiliserons le titre de niveau 3 à plusieurs endroits. Nous allons donc l'utiliser avec les en-têtes de page et de composants. Nous allons donc définir la taille de police pour qu'elle soit plus grande, soit 2,2 rems. Placez également une marge en haut et en bas d'un rem et zéro à gauche et à droite. Ensuite, la liste non ordonnée, les éléments UL. Réinitialisez tout espace appliqué par le navigateur, afin que la marge par défaut puisse être supprimée à zéro et que le rembourrage soit également remis à zéro. Les éléments de la liste, et en fait, les liens contenant les éléments a hériteront de la couleur. Cela supprimera cette couleur de lien violette, que nous avons par défaut dans le navigateur. Réinitialisez également la décoration de texte pour qu'elle soit nulle, ainsi que le style de liste. Cela garantira qu'aucun de nos liens ou éléments de notre liste ne soit souligné, et qu'aucun des points situés sur le côté du lien ne soit également souligné. Pour ce qui est des styles plus généraux, nous allons passer à nos éléments d' image et nous assurer que la largeur maximale de chaque image ne dépasse pas 100 %. Passons maintenant à nos cours sur nos liens routeurs Si vous vous en souvenez très tôt, nous avons ces liens nous avons ces liens tout en haut et vous pouvez déjà commencer à voir notre style prendre forme. Nous avons ces liens de menu en haut, que vous pouvez voir si nous accédons aux composants , puis à l'en-tête de l'application. Chacune de ces liaisons de routeur possède cette classe de liaison. Prenons ceci, un point puisqu'il s'agit d'une classe, une marge d'un rem pour lui donner un peu d'espacement, et nous allons également nous assurer que chacun d'entre eux change de couleur lorsque nous les survolons. Pour ce faire, nous allons à nouveau cibler notre lien. Nous allons utiliser le sélecteur de survol modifier la couleur du texte pour qu'elle prenne une valeur RGB de 161. Donc le rouge, le vert du 132 et le 132 aussi pour le bleu. Enfin, pour tous les boutons présents sur notre site, nous définirons également le style par défaut pour chacun d'entre eux. Le bouton supprimera donc l'arrière-plan, la couleur par défaut, en la réglant sur aucune. Une bordure très fine de 0,5 pixel, une ligne continue, et la couleur de cette ligne sera une valeur RGB de 202 pour chacune d'entre elles. rayon de bordure de 0,3 rems, un peu de rembourrage pour agrandir un peu le bouton. Donc un demi-rem en haut et en bas et un rem à gauche et à droite. Je dois indiquer à l'utilisateur qu'il peut cliquer sur ces boutons pour transformer le curseur en pointeur. Donc, si nous examinons notre projet, nous pouvons constater que certains d'entre eux ont pris effet. Mais n'oubliez pas qu'il ne s'agit que de styles généraux pour notre projet, et nous ajouterons des styles plus spécifiques à chacune de nos pages et composants individuels. 16. Menu et panier Styling: Ensuite, nous allons accéder au fichier d'affichage du menu et ajouter un style spécifique aux composants de cette vue . Ouvre ça. Ensuite, juste en dessous des modèles, nous ajouterons le style et ajouterons ces attributs étendus. Si vous n'avez jamais utilisé l'attribut scoped auparavant, cela signifie que tous les styles ne s'appliqueront qu'à ces composants, c'est-à-dire aux modèles que nous avons créés ci-dessus. Pour les voir en action, nous allons passer à la section du menu. Rends-le un peu plus petit. En haut, nous avons un titre de niveau 3, qui est celui-ci juste ici. Prenons ceci et définissons l'alignement du texte pour qu'il soit au centre. Cela vaut également pour notre panier. Cette section supérieure et cette section inférieure seront bientôt appliquées à gauche et à droite sur la vue d'ensemble. Mais nous allons d'abord commencer par la mise en page mobile, qui est le petit écran. Passons juste en dessous de notre h3 et disons la mise en page mobile. Pour passer d'une mise en page à l'autre, nous allons utiliser la flexbox. Si nous allons tout en haut, vous pouvez voir que ce div a la classe de wrapper de menu. Ce sera lui qui sera chargé de contrôler l'orientation de notre menu et également de notre panier. Ces deux divs sont les éléments enfants de l'enveloppe de menus. Si nous descendons et que nous sélectionnons cette option, nous pouvons utiliser la flexbox. Emballage de menus. L'écran sera le Flex. Vous pouvez voir la direction de flexion par défaut lorsque vous utilisez les zones flexibles dans une rangée. Ils seront placés côte à côte sur la page. Il s'agit de la disposition que vous souhaitez voir sur la vue plus large. Mais pour une vue plus petite, nous devons remplacer cette valeur par la direction de flexion de la colonne. Et aussi, la couleur. La couleur de police sera une valeur RGB de 80, 96 et 112. Ensuite, nous avons les deux sections qui se trouvaient à l'intérieur et que nous venons de regarder, à savoir la section menu en haut, puis la section panier. Chacune d'entre elles possède sa propre classe correspondante. Nous avons .menu et aussi .basket. Nous avons défini une couleur hexadécimale pour chacune de ces sections. Celui que je vais choisir est faf1e2. Rayon de bordure pour chacune de ces sections, petite valeur de trois pixels. La hauteur, au cas où nous n'aurions pas beaucoup de contenu, nous nous assurerons que chacune de ces sections représente au moins 100 % de la hauteur de la fenêtre d'affichage. Ensuite, un peu de rembourrage à l' intérieur de ces éléments pour vous laisser un peu d'espace par rapport au bord de l'écran. C'est la direction que nous avons pour la vue mobile. Si nous l'étendons un peu plus loin, nous voulons l' inverser pour que la direction de flexion soit une rangée. Nous pouvons le faire dans une requête multimédia, où je souhaite que l'écran ait une largeur minimale de 900 pixels. Prenez effet, s'il vous plaît. Maintenant, ce que nous allons faire, c'est récupérer la section d'emballage du menu, copier, la coller dedans. Nous avons déjà défini le type d'affichage sur Flex. Nous allons le supprimer. J'ai déjà défini la couleur. Nous allons le supprimer. Tout ce que nous avons à faire ici est de définir la direction de flexion pour qu'elle soit alignée. Ajoutez de l'espace entre les deux en justifiant le contenu. Ensuite, nous devons décider de l'espace chacune de ces sections va occuper. La section pizza aura probablement besoin d'un peu plus d'espace. Nous pouvons utiliser la direction de flexion pour nous donner plus d'espace que le panier. Pour une vue plus large, prenons la section du menu définissons la valeur de flexion sur deux. Ensuite, pour notre panier, nous définirons la valeur de flexibilité à un. Cela signifie que cela essaiera d'occuper deux fois plus d'espace disponible que la section du panier. Vous pouvez voir que cela se reflète dans le navigateur. Nous pouvons faire la différence entre ces deux sections. Nous allons ajouter une bordure à droite de ce menu pour ajouter une ligne verticale au centre. Dans le menu, définissez la bordure à droite d'un pixel, une ligne continue et la couleur RGB 202 pour chaque valeur. Nous y voilà. Nous avons presque terminé cette section, mais ce que je vais faire pour ces deux boutons , c'est supprimer la bordure, les réduire un peu. Si nous montons dans la section, nous voyons que chacun de ces boutons a la classe quantity_button. Nous pouvons le faire dans la section générale, juste au-dessus de la requête multimédia. Quantité_ btn. Supprimez la bordure. Réglons le rembourrage sur une valeur de 0,4 rems. Cela réduit désormais le rembourrage de ces deux boutons de quantité. Ensuite, nous allons continuer avec le thème du style. Nous allons ajouter du style à notre section d'en-tête. 17. Styling d'entête: Nous allons sûrement passer à l' ajout de nouveaux composants et de nouveaux éléments à notre site. Mais rapidement, juste avant de le faire, nous allons appliquer un style à cette section d'en-tête. Ouvrons la barre latérale, passons à nos composants, puis à l'AppHeader. L'AppHeader a besoin de la section de style en bas, et la section de style sera limitée à ces composants particuliers. Jetons un coup d' œil à ce que nous avons. Nous avons la classe de titre du site tout en haut. Commençons par ceci. Titre_site. Commencez par la taille de police du titre de notre site et nous opterons pour 3,6 rems. Faites-le assez grand. La couleur bleue d'Alice. Nous ne pouvons pas trop le voir pour le moment , mais très bientôt, nous allons ajouter une couleur de fond à cette section d'en-tête pour la faire ressortir encore plus. Nous allons ajouter une transformation pour faire pivoter cette valeur à une certaine valeur en ajoutant la fonction de rotation. Indiquez le nombre de degrés selon lequel vous souhaitez le faire pivoter, et il peut s'agir d'un nombre positif ou négatif. Huit degrés. Vous pouvez voir que cette valeur est désormais inclinée et vous pouvez augmenter ou diminuer cette valeur. Pour lui donner un peu d'espace par rapport au contenu ci-dessous, ajoutez une marge au bas des éléments. Allons-y pour deux Rems. Ensuite, nous pouvons récupérer notre en-tête qui est l'enveloppe de cette section complète. L'en-tête va utiliser la CSS Flexbox pour mettre en page les choses. Pour les affichages d'écran plus petits et plus grands, ces contenus seront placés verticalement dans le sens flexible de la colonne. Définissez le type d'affichage. N'oubliez pas que la direction de flexion par défaut est ligne qui se trouve de gauche à droite sur la page. Nous pouvons inverser cela pour utiliser la colonne. Pour placer le contenu au centre, utilisez la propriété flex de align-items. Nous pouvons voir que le contenu se trouve à peu près en haut et en bas de l'en-tête. Nous allons ajouter de l'espace avec une valeur de remplissage d' un rem en haut et en bas et de zéro à gauche et à droite. Pour les liens du menu, nous allons faire correspondre la couleur bleue d'Alice , puis les placer dans l'image d'arrière-plan. Car l' image d'arrière-plan pointera vers une URL qui est stockée dans notre projet. Entrons dans le dossier des ressources, dans le dossier Images, puis à l'intérieur, nous avons une image appelée main-bg. Il s'agit d'une barre oblique à points, accédez au dossier des ressources, des images, de l'arrière-plan principal. Nous souhaitons également que cela ne se reproduise pas. Comme nous avons ajouté un arrière-plan, nous souhaitons également ajouter à la propriété de hauteur et la définir comme une valeur fixe de 650 pixels. La taille de l'arrière-plan, nous allons la régler pour la couvrir. Ensuite, si nous regardons cette image dans le dossier des images, le main-bg, nous pouvons voir que cette image n'est pas centrée, elle est coupée sur le côté droit. Corrigons ce problème et revenons à notre CSS. Utilisez la propriété appelée Background Position. Mets-le au centre. Cette image sera désormais toujours centrée sur différentes tailles d'écran. Ensuite, une petite ombre technique à chacun de ces caractères d'un pixel, un pixel, de trois pixels, et la couleur à appliquer à cette ombre technique sera une valeur RGB de 20, 20, 20. La prochaine chose à faire est de passer au niveau du titre, qui est le texte du restaurant numéro 1 pour les pizzas. Nous pouvons le récupérer avec le sélecteur h2 et ajouter un peu d'espacement. Propriété de marge de deux rems en haut et en bas et de zéro à gauche et à droite. Une couleur de texte blanc antique et la taille de police de deux rems. Bien. Voici notre style maintenant terminé pour l'en-tête. Notre site est un peu plus beau. Ensuite, nous allons passer à la page d'administration et créer un nouveau formulaire de pizza. 18. Admin : ajouter un nouveau formulaire de pizza: Dans notre vue d'administration, très bientôt, cela sera divisé en plusieurs zones. Il est judicieux d' organiser toutes ces zones en différents composants et de placer ces composants dans un dossier d'administration. Passons à la barre latérale. Dans les composants, et à l'intérieur d'ici. Créez un nouveau dossier avec cette nouvelle icône de dossier appelée admin, et nous regrouperons tous les composants liés à l'administration. À l'intérieur, créez un nouveau fichier. Celui-ci sera le premier élément pour notre administrateur, qui sera un formulaire pour créer une nouvelle pizza. Nous l'appellerons NewPizza.vue. Créez le modèle dont nous avons besoin pour cette section et le wrapper de section. Cela aura la classe admin_section. Elle sera divisée pour avoir une section d'en-tête avec un titre et également le formulaire pour ajouter notre nouvelle pizza. L'en-tête de cette section, la classe de admin_section_header, h3. Texte de l'ajout d'une nouvelle pizza. Avant d'aller plus loin avec tout autre contenu, voyons à quoi cela ressemble dans le navigateur, mais nous devons d'abord l'importer dans notre interface administrateur. Accédez aux vues et à la vue d'administration. Tout en haut, placez-le dans notre script pour importer notre fichier. Ce que nous allons faire ici, c'est ajouter un attribut appelé setup. Nous reviendrons sur cette configuration très bientôt dans ce cours, mais pour l'instant, nous allons importer le composant que nous avons créé, qui s' appellera new pizza. Je vais l'importer depuis le répertoire @ pour accéder à l'itinéraire, au dossier des composants, à l'administrateur et au nom de fichier de la nouvelle pizza. Nous avons atteint le niveau 3. Pour l'instant, nous pouvons importer nos composants et le placer ci-dessous. Instantanément, dès que nous aurons enregistré, nous verrons que cela est ajouté à la section d'administration Accédez donc au lien d'administration et voici le titre que nous avons ajouté aux nouveaux composants de la pizza. En continuant sur le titre et en dessous, créez notre formulaire. Nous supprimerons l'action car elle est alimentée en gérant tous les JavaScript nécessaires. Chacune de nos sections, comme le nom de la pizza, la description et les différentes options, était entourée d'un style div. Ce div aura la classe form_group. Ensuite, il y aura une étiquette et une entrée. L'étiquette, le texte du nom, l'entrée. Le premier nom de la pizza aura le type de texte et l'identifiant du nom qui correspondront à notre étiquette. Copions cette section div. Nous allons le dupliquer et le coller ci-dessous. Le second sera pour la description. Pour celui-ci, nous n'avons pas besoin de saisie, nous allons utiliser une zone de texte, nous pouvons donc avoir plusieurs lignes de texte ou une longue description. Nous allons déplacer tout son contenu à l'intérieur d'ici. Nettoyons cela et ajouterons les lignes dont nous avons besoin. Réglons la valeur par défaut sur cinq ainsi qu'un identifiant de description, qui correspondra à l' étiquette juste au-dessus. Enregistrez ceci, et nous pouvons voir que nos entrées apparaissent maintenant à l'écran. Ensuite, nous allons créer deux nouvelles sections , destinées à nos première et deuxième options de pizza. Cela va nous donner deux options différentes pour la taille de la pizza. Le texte à l'intérieur des éléments P les transformera en éléments forts pour les rendre plus gras. Option 1. Ensuite, nous pouvons continuer avec nos éléments de formulaire. Nous allons copier le groupe de polices d'avant, le plus haut, l'écrire dedans, et celui-ci sera pour la taille. Ce sera en pouces. L'étiquette de la taille 1. Le type de texte est tout à fait correct, et nous allons également faire correspondre son identifiant à l'étiquette. dessous, nous devons également créer un nouveau groupe de formulaires, et celui-ci est toujours lié à l'option 1, et c'est le prix de cette taille particulière. Le texte du prix, l'étiquette du prix 1, l'identifiant correspondant. Ensuite, nous dupliquerons soigneusement cette section en ce qui concerne le prix , la taille et le texte. Copiez ceci. Collez-le ci-dessous pour créer une deuxième section. Celui-ci est pour l'option 2. Modifions les noms de propriété de chacun de ces attributs pour qu'ils soient de taille 2. Pareil pour le prix. Enregistrez ceci et passez au navigateur. Nous avons maintenant deux sections pour remplir les tailles. La dernière section sera consacrée à un bouton permettant de soumettre ce formulaire. Encore une fois, placez-le dans un div avec la classe du groupe de formulaires. Cela permettra de maintenir la cohérence du style. Ajoutez un bouton avec le texte d'ajout. Vous allez maintenant ajouter un nouveau formulaire de pizza maintenant rempli. Nous y reviendrons plus tard pour améliorer le style. Mais ensuite, nous allons passer à un autre composant d'administration, qui consiste à afficher les pizzas. 19. Admin : Composant de pizzas: Nous avons donc ajouté de nouveaux composants à pizza dans l'interface administrateur. Le prochain composant d'administration que nous allons créer est un composant pizzas, qui affichera toutes les pizzas disponibles dans le menu. Je vais accéder à la barre latérale et créer à nouveau un nouveau fichier Vue.js dans l' administrateur pour que tout reste organisé. Ce sera simplement Pizzas.vue. Comme toujours, fermez la barre latérale et créez un modèle pour stocker notre code HTML. Une section, qui aura la classe admin_section. Jetez également un œil au nouveau composant pizza que nous avons créé précédemment. Cela correspond également à cette même section. Nous pouvons donc appliquer le même style CSS. Cela comportera également un en-tête. Encore une fois, faites correspondre dans cet en-tête juste ici le même nom de classe. La classe était donc admin_section_header. Cela nous donnera un style cohérent pour tous nos blocs d'administration, titre de niveau 3 avec le texte du menu. C'est donc tout ce dont nous avons besoin pour la section d'en-tête. Passons en dessous de l'en-tête et créons notre tableau, qui listera toutes les pizzas disponibles dans le menu. La section du fil, ou l'en-tête du tableau, placée dans une rangée, puis le septième élément pour créer vos deux en-têtes. Nous allons donc faire en sorte que cela reste assez simple. Tout ce que nous faisons est d'ajouter un nom de pizza sur la gauche, puis sur la droite de la table, nous ajouterons un bouton pour supprimer cette pizza du menu. Ainsi, le titre de la pizza et le second seront le texte de suppression du menu. Je vais configurer une fonction plus tard pour ce faire. Sous le fil, créez la section du corps. La première rangée, qui se trouvera en dessous de nos rubriques. La première chose qui se trouve ici est le nom de la pizza dans les éléments de données du tableau, et nous allons simplement ajouter un exemple de texte à l'intérieur pour nom de notre pizza et nous le lierons à notre base de données plus tard. Ensuite, la cellule suivante à l'intérieur des données du tableau est un bouton qui va supprimer la pizza du menu. Le bouton possède le type de bouton et également une classe pour notre style de btn_remove. Ensuite, à l'intérieur d'une entité HTML, qui sera la croix. Il s'agit de l'esperluette, le mot des temps, suivi d'un point-virgule. C'est tout le contenu dont nous avons besoin pour le moment et plus tard, nous créerons une boucle pour parcourir toutes les pizzas disponibles et dupliquer chacune de ces lignes. De plus, comme pour les nouveaux composants de pizza, nous devons les importer dans la vue d'administration, ici. Dupliquez ceci et celui-ci sera pour toutes les pizzas. Il se trouve dans le même dossier d'administration. Nous changeons donc le nom, et je vais le mettre en bas du fichier dans le navigateur. Voici notre table avec notre seule rangée et notre pizza unique. Ensuite, nous allons créer les derniers composants d'administration pour répertorier toutes les commandes des clients. 20. Admin : composant des ordres de liste: Les derniers composants d'administration dont nous avons besoin seront utilisés pour répertorier les commandes en cours. Encore une fois, j'ai juste ces composants dans le dossier d'administration pour que tout reste organisé. Créez un nouveau fichier et celui-ci sera le orders.vue. Cela suivra également un modèle similaire aux précédents : nous créons un modèle, nous créons une section avec la section de classe d'administrateur, nous créons un en-tête, puis un tableau pour répertorier toutes les commandes. Commençons par le modèle et la section tout en haut. C'est notre emballage. La section doit également avoir une classe d'en-tête de section d'administration. Encore une fois, cela correspond aux composants d'administration précédents que nous avons créés, tout comme l'en-tête en haut, la classe, et si je pouvais simplement utiliser le mauvais composant en haut. Copions ceci. Celle-ci doit être l'en-tête de la section d'administration et la section doit être la classe de la section d'administration. Bien. Nous sommes maintenant de retour sur la bonne voie et nous pouvons créer à l'intérieur de l'en-tête notre rubrique de niveau 3 avec le texte des commandes en cours. De plus, tout comme les composants de la pizza que nous venons de créer, plus tard, lorsque nous l' associerons à Firebase, toutes nos informations seront extraites de notre base de données. Cela signifie que ce sera dynamique. Pour l'instant, nous allons simplement saisir quelques données fictives et ajouter cinq commandes en cours augmenteront et diminueront en fonction nombre de commandes que nous avons réellement dans notre base de données. Ensuite, la section du tableau, la ligne du tableau, les balises du titre. Les commandes indiqueront l'article, qui sera le nom de la pizza. N'oubliez pas que chaque pizza a deux tailles différentes, nous devons donc également la répertorier. Nous devons connaître la quantité et le prix. Nous ajouterons entre parenthèses le mot «  total » , car il s' agira de la valeur totale, qui sera le nombre de pizzas multiplié par le prix. Ensuite, en dessous de la première ligne de notre tableau, ajoutez la deuxième ligne et, pour l'instant, nous allons passer un exemple de commande. La première cellule à l'intérieur de l' élément de données du tableau sera réservée au numéro de commande. Cette cellule contiendra également deux informations. premier est le numéro de commande réel, augmentera en fonction du nombre de commandes que nous avons, et nous ajouterons également un bouton pour supprimer cette commande de la base de données, qui sera utile une fois la commande terminée. À l'intérieur des balises fortes, nous ajouterons le numéro de commande. Passons au numéro 1 pour le moment. Le bouton, l'entité HTML, qui sera l'esperluette et les heures, suivie d'un point-virgule, et ce sera une petite croix pour supprimer de notre base de données, la classe pour le style btn_remove, ainsi que le type de bouton. Ce numéro de commande et ce bouton Supprimer figureront sur ligne indépendante, puis la troisième ligne, que nous ajouterons juste en dessous, comportera toutes les valeurs situées sous nos en-têtes. Par conséquent, la première donnée du tableau dont nous avons besoin est l'élément. Ce sera le nom de la pizza, suivi de la taille, de la quantité. Toutes les valeurs sont correctes pour le moment à l'intérieur d'ici. La dernière chose dont nous avons besoin est le prix. Pour voir cela, accédez à notre vue d'administration. Nous pouvons maintenant l'importer en haut de notre fichier. Celui-ci, ce sont les ordres. Je vais le placer en bas du modèle. Faites défiler vers le bas. Bien. Nous avons une grande partie de l'interface utilisateur, donc la section d'administration est maintenant en place, et tout est maintenant configuré pour ajouter des données dynamiques à partir de notre base de données. Mais ensuite, nous allons passer à une autre de nos vues, à une autre de nos vues, la vue d'accueil, et commencer à ajouter notre contenu. 21. Vue d'accueil: Ensuite, nous allons travailler sur cette vue d'accueil, qui sera composée de nouveaux composants, et qui sera remplacée par le routeur de visualisation. N'oubliez pas que nous avons cette section d'en-tête en haut. Ensuite, en bas, nous avons déjà deux prises distinctes placées via le RouterView. Nous avons les sections relatives à la livraison et à l'historique, qui figureront toujours au bas de notre modèle. N'oubliez pas que juste au-dessus, nous aurons notre RouterView, qui affichera tous les composants de notre dossier de vues. Notre vue d'accueil est déjà configurée. Nous avons un modèle simple avec le texte de la page d'accueil. Nous pouvons le voir juste ici. N'oubliez pas que nos deux composants bas, qui sont placés dans le RouterView, ne s'afficheront que sur cette page d'accueil, car si nous accédons au routeur et à la page d'index, nous les avons configurés en tant que composants de livraison et historique et en tant que composants par défaut, qui sera la vue d'accueil. Ce sera cette section en haut. Passons maintenant à la vue d' accueil. Ensuite, nous pouvons nous mettre au travail en ajoutant du contenu pour notre style. Nous pouvons configurer la classe hot, puis juste en dessous, créer une nouvelle section div, qui aura la classe hot_text. Déplacez-vous vers le haut, un cap de niveau 3. Cela affichera le texte «  chaud sorti du four ». Nous y voilà. Une section de cette page d'accueil contiendra également du texte et comportera également une hot_pizza végétarienne, ainsi qu'une image que nous avons dans le dossier des images, qui se trouve à l'intérieur des ressources. Nous avons besoin de ce fichier fire.jpg. d'abord le texte sous le titre du niveau 3, puis ajoutez un élément p à votre texte. Celui-ci aura la classe hot_pizza_name. Le nom de la pizza est végétarienne chaude. Petit texte. Celui-ci aura la classe hot_pizza_description. Ensuite, le texte de notre plat végétarien emblématique, mais avec une touche d'originalité. Ensuite, en dessous de ce texte, nous pouvons placer un lien vers un routeur, qui redirigera vers notre menu. Le composant RouterLink, le texte de Let's Order. Ensuite, comme toujours, avec notre RouterLink, nous devons transmettre les deux attributs avec les deux points, puisque ceux-ci contiendront des données dynamiques, transmettre nos objets dynamiques où nous créerons un transmettre nos objets dynamiques où nous créerons lien vers le nom de MenuLink. Ce MenuLink est le même que celui que nous avons configuré dans le fichier du routeur, que nous pouvons voir dans le routeur, puis dans le fichier index.js. Ce sont les noms uniques que nous avons ajoutés à chacun de ces chemins. On y est presque. Nous avons maintenant cette section div, puis juste en dessous, nous la placerons dans notre image. Je vais vous montrer l'image que nous venons de regarder, qui se trouvait dans le dossier des ressources. Nous utiliserons../pour monter un niveau dans notre répertoire vers les ressources, images et le fichier fire.jpg. Le style de classe peut être hot_img, puis également le texte alternatif. Tout notre contenu est en place. Vérifions simplement que ce lien fonctionne. Cela permet d'accéder à notre section de menu, ce qui est bien. Nous pouvons descendre en dessous notre modèle et ajouter la section de style. Cela doit être sculpté sur ce composant. Nous allons commencer par la section principale avec la classe de hot, et voici le wrapper de cette section complète. Cela sera chargé de modifier la mise en page sur le petit et le grand écran. Pour ce faire, nous allons utiliser le type d'affichage Flex. Comme nous allons commencer par la première vue sur mobile, nous pouvons réduire la taille du navigateur, puis modifier la direction des colonnes sur un écran plus petit. La direction flexible est égale à la colonne. Cela placera notre contenu verticalement. Ensuite, dans une requête multimédia sur un écran plus grand, nous allons inverser cette option pour utiliser la ligne. Nous allons maintenant le faire avec @media, où nous ciblerons une largeur d'écran minimale de 900 pixels. Encore une fois, nous allons saisir la classe de chaleur et modifier la direction de flexion pour qu'elle soit égale à la ligne. Le petit écran, agrandissez-le, et maintenant deux éléments apparaissent côte à côte. Le premier élément était ce div, et le second est notre image. Placez-le au centre en alignant les éléments. En fait, cela veut simplement entrer dans la première section mobile, donc des fournitures pour le petit écran. En dehors de la requête multimédia, nous utiliserons le hot_image, ainsi que le hot_text. C'est une classe, ils la placeront entre les points. Nous avons la classe hot_text ainsi que notre image, qui constitue nos deux sections principales. Cela ciblera nos deux zones de contenu, et nous leur donnerons la même taille en définissant le flex comme une valeur de deux rems. Ensuite, l'alignement du texte par rapport au centre. Ensuite, nous avons le titre, qui n'a pas de classe Nous pouvons donc cibler un titre de niveau 3, qui est un enfant du hot_text. Le wrapper de hot_text sélectionnera le h3, qui est imbriqué à l'intérieur, et définira la couleur comme une valeur hexadécimale bb2118. qui nous donne cette jolie couleur rouge, que nous pouvons voir ici. Ensuite, le hot_pizza_name, qui est la hot_pizza végétarienne. Agrandissez-le un peu en réglant la taille de la police. Essayons 2.2 rems. Un peu plus petit aussi. 1,8. Ensuite, pour le texte suivant, il s'agit de la classe hot_pizza_description. Copiez ceci. Placez-le dedans. Le style de police doit être en italique, le poids de police doit être un peu plus léger, optons pour 300. Vérifions-le également sur l' écran plus grand. C'est très bien. Pour l'instant, nous pouvons procéder quelques ajustements selon vos goûts si vous le souhaitez. Mais ensuite, je vais continuer avec le style de ce projet. Nous allons notamment ajouter du style à nos tableaux, ainsi qu'à nos entrées de formulaire. 22. Forme et tableau Styling: Pour terminer cette section, passons maintenant au fichier main.CSS, où nous pouvons commencer à appliquer des styles partagés entre nos formulaires et nos tableaux, ainsi que des styles CSS généraux. À partir de là, en particulier au sein de l'administration, nous avons certaines zones qui incluent des classes partagées. Par exemple, si nous allons dans les composants et dans le dossier admin, nous avons cette nouvelle pizza. Il y a le wrapper de section de la section admin, puis nous avons cette section d'en-tête cohérente avec la même classe dans ces trois composants. Nous l'avons ici en haut des commandes et également en haut des pizzas. Nous avons également un formulaire auquel nous allons ajouter du style. Nous avons différents tableaux pour le menu et les commandes en cours, et nous avons également un tableau dans la vue du menu. Nous avons différents styles qui sont partagés entre plusieurs composants. Plutôt que de les placer dans des composants individuels, nous allons entrer dans le fichier main.CSS et y ajouter le code partagé. En plus des principaux wrappers formulaires et des tableaux, nous avons également quelques petits détails, tels que le bouton de suppression qui se trouve dans le menu, ainsi que dans les commandes en cours. Nous lui avons donné la classe btn_remove. Nous allons maintenant les ajouter à notre feuille de style. Entrez dans la source, dans les ressources, et nous aurons ce fichier CSS principal. Nous avons déjà ajouté du contenu à l'intérieur, donc allons tout en bas, en dessous du bouton, et nous allons continuer à partir de ce bouton et aller juste dessous et ajouter la classe btn_remove, que nous venons de rechercher auparavant. Puisque nous allons supprimer quelque chose avec cela, nous voudrions probablement ajouter une couleur rouge. La teinte que je vais choisir est une valeur RGB de 180 lignes, 67 et 67. Vous pouvez le voir instantanément dès que vous enregistrez ces deux boutons en bas et que vous changez de couleur. Nous pouvons également supprimer cette bordure en la définissant sur aucune, et la rendre un peu plus visible en augmentant la taille de la police à 1,2 rems. Cette section de menu ainsi que les commandes en cours sont contenues dans un tableau HTML. Pour l'élément principal du tableau, ajoutons un style. Nous pouvons placer dans un rayon de bordure, juste un rayon de bordure subtil de 0,3 rems. Nous le verrons plus clairement lorsque nous ajouterons des couleurs différentes. Nous pouvons également régler l' alignement du texte pour qu'il soit sur la gauche. Cela poussera tout le texte vers la gauche de chacune des cellules individuelles. Une largeur de 100 % affiche la largeur totale disponible. Ensuite, nous passerons aux cellules individuelles qui se trouvent à l'intérieur du th, pour l' en-tête de notre tableau et également td pour les données de notre tableau. À l'espacement, nous ajouterons un peu de rembourrage ou un espacement à l'intérieur de l' élément de 0,6 rems. Ensuite, nous travaillerons sur ce formulaire pour la section Ajouter une nouvelle pizza. Prenez l'emballage du formulaire principal, un espace vide en haut et en bas et un rem à gauche et à droite. Nous allons également faire correspondre le rayon de bordure du tableau en l'ajoutant également au formulaire. Encore une fois, nous verrons cela plus clairement plus tard. Dans la nouvelle pizza, nous verrons que chacun de ces éléments de formulaire, tels que le nom et la description, est intégré dans ce div avec la classe du groupe de formulaires. Cela est cohérent pour chacune de ces sections. Prends ça. Il s' agit donc de form_group. peu d'espace de remplissage pour chacun de ces groupes et nous ajouterons un rem verticalement en haut et en bas et zéro à gauche et à droite. Utilisez la Flex Box avec l'écran Flex. Nous allons aligner les objets au centre. Aligner les éléments au centre comme vous pouvez le voir donnera cet alignement vertical afin que le texte reste au milieu de chacune de ces sections. Si nous ne l'avons pas, vous pouvez voir que le texte est aligné tout en haut de cet élément. Nous ajouterons une bordure tout en bas de 0,5 rems pour l'épaisseur, une ligne continue et la couleur de la ligne aura une valeur RGB de 202 pour chacune des couleurs. Oups, c'est un peu trop épais. Cela veut juste être de 0,5 pixel. Ensuite, nous supprimerons le soulignement de la partie inférieure. Encore une fois, saisissez notre form_group, sélectionnez le dernier type qui est la toute dernière occurrence, qui est notre bouton, puis nous supprimerons la bordure inférieure en réglant sur none. Ensuite, nous allons donner à ces étiquettes et à nos entrées une taille constante à l'aide de la boîte flexible. L'étiquette leur donnera une valeur de flexion constante de 1 afin qu'ils restent tous identiques. Ensuite, comme nous voulons que l'entrée soit un peu plus grande, nous pouvons cibler toutes les entrées ainsi que la zone de texte et leur attribuer une valeur flexible de 3. Cela signifie que toutes nos entrées sur la zone de texte essaieront d'occuper trois fois plus d' espace disponible que nos étiquettes. Travaillons maintenant avec les bordures pour chacune de nos entrées. Juste en dessous de la valeur de flexion de 3, définissez la bordure. Cela prendra la même valeur que notre bordure inférieure. Nous pouvons le copier, le coller. Cela nous donne simplement une bordure plus claire et plus subtile pour chacune de nos entrées. rayon de bordure de 0,3 rems, un peu de rembourrage pour les agrandir légèrement de 0,6 rems. Par défaut, les entrées de formulaire HTML et les zones de texte n'héritent pas de la police et de la couleur par défaut. Nous devons donc les définir manuellement en configurant la famille de polices pour qu'elle hérite du parent et en faisant de même pour la couleur. Comme nous l'avons déjà vu, chacun de ces composants d'administration, comme la nouvelle pizza, possède cette classe de section d'administration, puis cet en-tête de section d'administration. Passons à notre style et nous pourrons les cibler. Tout d'abord, le wrapper principal qui est la section d'administration. Marge de 1 rem pour espacer tous nos composants. La couleur d'arrière-plan, qui est une valeur hexadécimale de faf1e2, et enfin, pour cette section un rayon de bordure de 0,3 rems. Ensuite, la section d'en-tête de chacun de ces composants et mémorisez-les contient la classe admin_section_header. Définissez le type d'affichage sur Flex. Faites une sauvegarde. Celle-ci a l'air bien et, tout comme celle-ci, nous aurons un petit problème, mais ajoutez une nouvelle pizza. Cela ne devrait pas être côte à côte. Nous avons de nouvelles pizzas, nous avons l'emballage, l'en-tête, le formulaire. Et en fait, nous devons juste nous assurer que cet en-tête est fermé. Découpez donc la balise de fermeture de l'en-tête et collez-la juste après notre h3. Cela semble maintenant meilleur et cela nous permet de rester plus cohérents avec le reste de ces sections. Revenons au style. Et vous vous demandez peut-être pourquoi exactement nous avons configuré la boîte flexible alors que nous n'avons qu'un seul élément à l'intérieur. Eh bien, c'est parce que plus tard, nous allons également ajouter une petite icône sur la droite pour fermer chacune de ces sections si nous n'en avons pas besoin. Par conséquent, comme nous aurons plusieurs sections, nous pouvons ajouter du contenu de justification pour ajouter de l'espace entre chacune d'entre elles. De plus, pour maintenir ces éléments alignés verticalement, alignez les éléments au centre. Enfin, un rembourrage d'un rem qui jouera sur tous les côtés de ce titre. Nous arrivons maintenant à quelque chose en ce qui concerne le style. Cela devrait également s'appliquer à notre section de menu. Ensuite, la dernière section à laquelle nous ajouterons du style dans cette vidéo, à l'intérieur de la section d'accueil, est composée de chacun de ces blocs d'informations situés en bas. Ils ont la classe info_block, que vous pouvez voir si nous entrons dans les composants principaux , à savoir l'App.vue. Cela rend notre livraison et nos composants historiques , alors passez à la livraison. Cela a la classe de bloc d'informations , tout comme le composant historique. Revenons à notre info_block de style. Le type d'affichage du flex, la direction de flexion de la colonne, l' alignement des éléments au centre, ajout d'un peu de rembourrage à chacun des rem, ainsi qu'une couleur d' arrière-plan différente pour chacun de nos blocs et la valeur hexadécimale de faf1e2. Sauvegardons ceci et voyons à quoi cela ressemble. Dans le navigateur, nous pouvons voir sur la plus petite vue ils sont empilés verticalement les uns sur les autres. Nous allons les étendre plus largement. Les deux composants sont côte à côte et nous avons cette direction de flexion de la colonne pour chacun d'eux. Le contenu est aligné au centre, un peu de rembourrage et la couleur d'arrière-plan. Il existe encore d'autres styles à appliquer à des composants individuels, mais nous les ajouterons au fur et à mesure du cours. Mais maintenant, nous avons beaucoup de contenu en place. Dans la section suivante, nous ajouterons du code JavaScript et verrons comment utiliser l' API de composition VueJS. 23. Options Ou Composition ?: L'API Options est quelque chose que vous connaissez peut-être si vous avez créé avec Vue.js dans le passé, dans Vue version 1 ou Vue version 2. La bonne nouvelle, c'est que dans la version 3 de Vue, l'API Options est toujours là pour rester. Mais nous avons une approche différente que nous pouvons également utiliser, appelée API de composition. L'API Options est quelque chose que vous connaissez peut-être si vous avez déjà créé avec Vue version 1 ou 2. Il s'agit d'une méthode traditionnelle de création d'applications Vue.js. La bonne nouvelle, c'est que Vue 3 n'est partie nulle part. L'API Options ressemble à ceci. À l'intérieur du script et de l'exportation par défaut, nous avions différentes sections, telles qu'une section de données. Cela contenait toutes les données ou états des composants, que vous pouvez considérer comme des variables. Il existe également des méthodes. C'est ici que nous pouvons ajouter nos fonctions JavaScript et les appeler selon nos besoins. Parmi les sections qui ne sont pas présentées ici citons les crochets, les montres et les accessoires à cycle de vie calculés . Encore une fois, tous sont toujours valables pour être utilisés dans Vue 3. Cependant, pour ce projet, je vais utiliser l'API de composition Vue 3. L'API Composition nous permet d'écrire du code qui ressemble davantage à du JavaScript normal. Cela ressemble à une variable JavaScript normale, un délai d'attente et à une fonction. Cela peut désormais être écrit dans les applications Vue.js, remplacez-le comme l'API Options dans une valeur d' exportation par défaut, puis dans une fonction de configuration, qui est mise en évidence ici. Les éléments contenus ici, tels que les variables et les fonctions, peuvent être mis à la disposition du modèle en les renvoyant en bas de la page. Il convient également de noter que nous pouvons utiliser la fonction de configuration parallèlement à l'API Options existante. Ici, la section des données sera transmise, mais toute autre section de l'API Options peut également être ajoutée. est aussi beaucoup plus que cela, car nous pouvons organiser le code dans des fichiers séparés et réutiliser le chemin si nécessaire, et bien d'autres choses que nous utiliserons selon nos besoins. Outre le JavaScript classique, nous pouvons également utiliser la réactivité de Vue. Ici, nous importons une référence à partir du package Vue et y incorporons la valeur de toutes les variables. Une référence est utilisée pour transformer le contenu en objet réactif. Cela signifie que toutes les parties de notre application qui en dépendent changeront si les données qu'elle contient changent. Cela signifie essentiellement qu'aucun composant n'est tenu à jour en cas de modification des données. Nous y reviendrons également très bientôt. En plus de ref, nous pouvons également importer à partir du package Vue des éléments tels que les propriétés de l' ordinateur et des montres, qui sont disponibles avec l'API Options. Enfin, nous avons également une méthode plus courte écrire du code de composition , à savoir la configuration du script. Sur la gauche se trouve l' exemple similaire au précédent, où nous avons une section de configuration et renvoyons toute Vue que nous voulons utiliser dans le modèle ou le code HTML. Ensuite, sur la droite, c'est exactement la même chose en utilisant la configuration des scripts. Il ajoute un attribut de configuration à nos balises de script pour raccourcir le code. Notez également que nous n'avons pas besoin la section des retours car toutes les données que nous souhaitons utiliser dans le modèle sont automatiquement mises à disposition. La configuration du script sera l'approche que nous utiliserons dans ce projet de classe, car elle est plus propre, plus courte et offre également de meilleures performances en interne. 24. L'objet et la liaison de données NewPizza: Passons maintenant au nouveau fichier Pizza.view. Nous pouvons commencer à ajouter des scripts JavaScript en utilisant la configuration des scripts que nous venons de voir. Nous pouvons ajouter des objets NewPizza, qui constitueront la structure de toutes nos pizzas dans notre application. Juste au-dessus du modèle, ajoutez les balises de script à placer dans les attributs de configuration. Ensuite, comme nous venons de le voir, nous devons importer notre référence, et nous l'importons depuis le package de vue, qui se trouve dans les modules de nœud. Ensuite, nous pouvons créer nos objets NewPizza, qui sont inclus dans cette référence. Cette référence va créer un objet réactif que nous pouvons utiliser dans toute notre application et dont utiliser dans toute notre application l'état sera mis à jour. Commençons par une constante ou une variable appelée NewPizza, configurons notre référence comme wrapper. Ensuite, nous pouvons y transmettre n'importe quel type de données. Cela peut être une chaîne, un tableau. Mais pour notre cas d'utilisation, nous devons créer un objet possédant toutes les propriétés de Pizza. Ces propriétés comprennent le nom de Pizza, on peut dire Margherita. Mais juste pour cela, je vais ajouter Eg. La raison en est que ce sera l' état initial de notre forme. Je vais entrer dans notre interface administrateur, jetons un coup d'œil et nous verrons ce nom. Cela va être lié à notre objet. La propriété de nom ici utilisant modèle V sera liée à notre nom. Nous lierons également la description à la propriété suivante. Lorsque nous enregistrons ce formulaire pour la première fois, le texte qu'il contient reflétera ce que nous voyons ici. Cela permet simplement à l'utilisateur de savoir exactement ce qu'il doit écrire pour créer notre nouvelle pizza. Ensuite, une description. Encore une fois, nous allons donner l'exemple d' une délicieuse pizza à base de tomates garnie de mozzarella. Séparés par des virgules, nous pouvons ensuite ajouter nos options, qui seront un tableau. Les placer dans un tableau nous permettra de créer différentes options, telles que notre taille. Chacun d'entre eux sera un objet. Nous allons avoir deux objets, juste comme celui-ci côte à côte. Chacune d'entre elles aura une propriété de taille, disons neuf pouces pour la toute première, et aussi un prix. même pour notre deuxième objet, va de même pour notre deuxième objet, mais celui-ci coûtera une pizza de 12 pouces et aussi un prix. N'oubliez pas que toutes ces valeurs ne sont que des valeurs de départ. Toutes ces valeurs d'objet peuvent être remplacées par les valeurs de ce nouveau formulaire à pizza. Ils seront mis à jour avant de les ajouter à la base de données. Pour lier les entrées de notre formulaire aux propriétés de nos objets, nous allons utiliser le modèle. Le modèle nous permet de créer on appelle une liaison de données bidirectionnelle, ce qui, comme indiqué, signifie que les valeurs de notre objet apparaîtront dans les entrées du formulaire. Dans toutes les entrées de formulaire que nous saisissons, nous pouvons ensuite les mettre à jour pour remplacer ces entrées de formulaire. Cela se reflétera à l'intérieur de notre objet. Pour ce faire, commençons par le nom. Accédez à nos entrées de formulaire, où nous saisissons le nom. Nous pouvons utiliser v-model en transmettant en tant qu'attribut. Nous voulons lier cela à notre objet, qui s'appelle NewPizza, et nous pouvons accéder à la propriété name, donc NewPizza.name. Copions ceci. Descendez dans la zone de texte, et nous pouvons la lier à la description. Après la description, nous avons ensuite des options, et nous devons les lier à chacune de ces valeurs de tableau. N'oubliez pas que les tableaux commencent à la position zéro du numéro d' index. Celui-ci sera zéro, et celui-ci sera le numéro d'index 1. Allons-y et nous pouvons ajouter ces options. Nous avons la taille numéro 1, collez-la dedans, NewPizza.options. Sélectionnez la première valeur dont le numéro d'index zéro dans la propriété appelée taille. Copions ceci, collons-le dans celui avec l'identifiant du prix numéro 1, les changements étant le prix. ensuite à notre option 2 dans la taille, il s'agit de l'indice numéro 1. Encore une fois, indiquez le prix numéro 1 et modifiez également la propriété de l'objet pour qu'elle soit le prix 2. Maintenant, si nous l' enregistrons dans notre formulaire, nous pouvons voir toutes les données initiales à l'intérieur de chacune d' elles et vous pouvez voir que l' option est également correctement définie. Nous avons le 9 pouces et aussi le 12 pouces. Consultez également la liaison de données bidirectionnelle et vérifiez que l'objet est mis à jour à partir de ce formulaire. Nous pouvons maintenant accéder à nos modèles. N'importe où à l'intérieur d'ici, nous pouvons afficher la valeur de NewPizza. Nous pouvons le voir en haut. Supprimons tout ce qui se trouve dans ces entrées. Ceci est maintenant mis à jour. Pareil pour la description, cela fonctionne. Essayons de mettre à jour le prix. Notre deuxième option est également liée à. Nous pouvons maintenant le supprimer en toute sécurité et passer à la vidéo suivante. Nous examinerons les références plus en détail et verrons comment ajouter des articles au panier. 25. Ref’s & Ajout au panier: Précédemment, dans ce nouveau composant pour pizza, nous avons brièvement examiné ce que l'on appelle une référence. Une référence est un wrapper pour une valeur. Dans notre cas, la valeur est la pizza. Dans la prochaine vidéo, nous utiliserons également une référence comme emballage ou panier, lequel l'utilisateur pourra ajouter des pizzas avant de les acheter. Pour ce faire, il convertit la valeur en objet réactif. L'avantage est que chaque fois que cet objet réactif est mis à jour, tous les composants qui s'appuient sur ces données seront également mis à jour. Passons à la vue du menu pour commencer à les utiliser et examinons les références plus en détail. Dans la vue du menu en dehors du modèle, créez notre script avec l'attribut setup. Créez notre importation, comme nous l'avons vu précédemment, où nous importerons la référence à partir du package Vue.js. Nous devons également créer une constante ou une variable pour notre panier. Enroulez-le dans un radeau pour rendre le contenu réactif et définissez la valeur initiale d'un tableau vide. Nous devons également créer une fonction qui va mettre à jour le panier. Appelons cela AddToBasket. Comme nous l'avons mentionné précédemment, lorsque nous utilisons la configuration de scripts, cela nous permet d'accéder directement à l'une de ces variables ou fonctions à l'intérieur de notre modèle. Passons à notre modèle et localisons notre bouton Ajouter, en nous assurant que nous sommes dans le menu. Nous pouvons maintenant répertorier les clics en utilisant @click et le configurer pour déclencher notre fonction appelée AddToBasket. Vérifiez que cela fonctionne. Nous le publierons dans un journal de console. N'importe quelle chaîne de texte convient. Saute dans la console. Cliquez sur le bouton et notre texte est maintenant mis à jour. Juste avant d'ajouter du code à notre fonction, je souhaite rapidement revenir à notre référence et voir comment cela fonctionne plus en détail. Pour cela, je vais créer un objet simple appelé user avec la propriété name et également une propriété likes. Vous vous demandez peut-être pourquoi je viens de saisir un objet utilisateur sans rapport à l'intérieur. Eh bien, le contenu de cet objet n'est pas important. La chose importante à noter ici est les objets JavaScript ont des propriétés. Dans notre cas, nous avons la propriété appelée name et la propriété appelée likes. Souvenez-vous plus tôt lorsque j'ai dit que lorsque nous utilisons une référence, Vue.js transforme en coulisses le contenu contient en un objet réactif. Comme nous venons de le voir, tout type d' objet possède ces propriétés. Comme notre panier est transformé en un objet en arrière-plan, valeur lui est également attribuée. Cette propriété de valeur nous permet de mettre à jour ou de lire le contenu qu' il Cette propriété de valeur nous permet contient. Tapons rapidement ceci et je vais vous montrer exactement ce que nous voulons dire. Pour l'instant, nous allons simplement commenter notre panier. Nous allons créer un panier connu, qui n' utilisera pas de référence. Ce ne sera qu'un objet simple. Encore une fois, juste pour renforcer cela, dans les coulisses, notre panier est transformé en un objet similaire à celui-ci puis une propriété de valeur lui Ainsi, lorsqu'il s'agit de mettre à jour une référence, tout comme notre panier, non seulement nous la mettons à jour en du nom de variable, tel que basket, mais nous devons également mettre à jour la valeur imbriquée à l'intérieur. Par exemple, lorsque nous appelons notre fonction AddToBasket, nous accédons d'abord au nom de notre variable ou de notre constante, puis à la valeur qu'elle contient. Ou nous pouvons utiliser quelque chose comme la méthode push pour pousser un nouvel objet. Le nom, n'importe quel contenu convient, le prix. Tout cela n'est qu'un exemple de code, peu importe la taille de 12. Comme il s'agit d'un panier, nous devons également connaître la quantité. Pour vérifier que cela fonctionne, vérifiez que nous mettons à jour la valeur qu'il contient, nous pouvons accéder à notre modèle et afficher la valeur de notre panier. Sauvegardons ça. Passons au menu. Nous pouvons voir que nous avons la propriété value qui est vide. Cliquez sur « Plus » et nous ne voyons pas que cela soit mis à jour. Cependant, si nous le mettons à jour pour utiliser une référence , décommentez-le. Cliquez sur le bouton. Nous pouvons voir que cet objet est désormais réactif et que toute mise à jour notre panier est désormais transmise à notre modèle. Un point clé à noter ici est que lorsque nous utilisons le panier contenu dans le modèle, tout comme ici, nous n'avons pas besoin d'accéder à basket.value. Cela se fait automatiquement pour nous. Cependant, comme nous pouvons le voir dans notre script, lorsque nous accédons ou mettons à jour l'une de nos références, nous devons utiliser la propriété value pour mettre à jour ou lire les données imbriquées à l'intérieur. Bien sûr, nous ne voulons pas sortir le panier de cette façon. Ce que nous voulons faire, c'est accéder à la section de notre panier et afficher le contenu dans notre tableau sans notre ligne de tableau. Nous pouvons l'ajouter à l'intérieur du corps de la table, remettre à l'intérieur, puis nous pouvons le placer en boucle sur notre panier avec une boucle Vue.js V4. Entre crochets, nous pouvons accéder au nom de la variable de l'élément ainsi qu'au numéro d'index de chaque boucle. C'est dans le panier, puis Vue.js, lors de la mise en boucle, a également besoin d'une clé unique. Maintenant, nous n'avons plus de clé unique unique que nous puissions utiliser. Mais à titre de mesure temporaire, nous pouvons transmettre le numéro d'indice. Plus tard, lorsque la pizza stockée dans la base de données, nous mettrons à jour cette clé pour utiliser l' identifiant unique pour chaque valeur. Désormais, chaque pizza contenue dans le panier est stockée dans la variable item. Nous pouvons mettre à jour la quantité, donc item.quantity, le nom de la pizza, c'est item.name, la taille, item.size, et aussi le prix vers le bas. Si nous le voulions, nous pourrions simplement ajouter item.price. Mais comme nous pouvons commander plusieurs pizzas, nous allons multiplier ce prix par la quantité d'articles pour afficher un total pour chaque ligne. Enregistrer. Faites un peu plus d'espace. Désormais, chaque fois que nous ajoutons une nouvelle pizza, le panier est mis à jour et affiché dans notre tableau. Ensuite, nous allons améliorer cela en passant en boucle les pizzas et en ajoutant le nom exact de la pizza au panier, plutôt que les exemples de données dont nous disposons actuellement. 26. Boucle de pizzas: heure actuelle, comme nous le savons, notre base de données n'est pas encore configurée pour stocker nos pizzas. Pour l'instant, à titre de mesure temporaire, nous allons créer une référence laquelle nous pourrons envoyer nos pizzas. Cela nous permettra ensuite de parcourir ces pizzas en boucle et de les exposer sur une table. Pour cela, allez dans le fichier MenuView, puis en haut, nous allons créer une nouvelle constante appelée AllPizzas. AllPizzas sera entouré d'un récif. Eh bien, la valeur initiale sera un tableau vide. Passons ensuite aux nouveaux composants pizza.view, qui se trouvent dans l'interface d'administration. Cela permet de gagner un peu de temps. Ce que nous allons faire ici, c'est sélectionner l'objet pizza complet. Il s'agit de l'objet de démonstration juste ici à l'intérieur de la référence. Copiez tout, y compris les bretelles frisées. Nous le copions parce que cela nous donnera la structure cohérente dont nous avons besoin pour ajouter de nouvelles pizzas à la base de données. Retournez dans la vue du menu et à l'intérieur de l' ancienne gamme de pizzas, collez-la deux fois. Veillez à ce que chacun soit séparé par une virgule. Changeons un peu les choses. Nous allons supprimer l'Eg. Margherita. Le second, Pepperoni, retirez l'Eg. On dirait garni de mozzarella et de pepperoni. Augmentez simplement le prix pour le rendre un peu différent. Maintenant, cela peut être parcouru en boucle dans le tableau des menus. Ils exposent chacune des pizzas. Passons maintenant au modèle. Insérez ce menu puis le tableau dans le corps du tableau. Nous ferons exactement la même chose que pour le panier créant une boucle v-for et les données là où nous en avons besoin. Revenez au corps du tableau de la section du menu v-for. Entre parenthèses, nous pouvons sélectionner la pizza ainsi que le numéro d'index. Cela fait partie de notre ancienne gamme de pizzas. Ensuite, insérez une clé, qui sera le numéro d' index pour le moment. Comme nous l'avons dit pour le panier, nous y reviendrons plus tard et utiliserons la clé unique que la base de données fournira. Génial. Nous avons désormais accès à toutes les pizzas et, au lieu d'afficher le nom codé en dur de la pizza, ouvrez les doubles crochets et nous pouvons accéder à nos objets, à savoir pizza.name. La description, la pizza, la description. Disons ceci et passons au menu. Voici nos deux pizzas. Nous avons notre Margherita et le pepperoni, qui correspondent à notre référence dans la section des scripts. Mais nous n'en avons pas encore fini avec celui-ci, car nous devons également ajouter les options de pizza. Nous devons adapter la taille et le prix des pizzas à la plupart des options qui s'offriront à chacune de ces pizzas. Pour cela, nous devons à nouveau descendre à notre table. Nous avons ici cette ligne de tableau, qui correspond à chacune de nos options. Nous devons créer une boucle supplémentaire à l'intérieur de celui-ci pour parcourir nos deux options, donc v-for. La valeur variable de l'option et nous la prendrons également dans l'index. Nous devons faire une boucle sur notre objet à pizza, qui est celui de la boucle initiale. Nous devrons accéder à nos options. La clé de cette option de transfert unique. Ensuite, entre crochets, nous pouvons sélectionner la première ou la deuxième valeur avec le numéro d'index. Pour la première boucle, cela sélectionnera la première option, et la deuxième boucle sélectionnera la deuxième option. Pour la taille de l'option, les accolades doubles, l'option et la propriété de taille même dans le symbole monétaire, l'option.price. Testons cela dans le navigateur. Nous avons maintenant notre boucle qui crée nos deux options, et chacune a une taille et un prix uniques. Bien. Nous faisons de bons progrès, mais maintenant, lorsque nous voulons ajouter chacune de ces pizzas au panier, nous devons également transmettre ces informations à la fonction. Ce bouton que vous avez ici ne nous permet pas seulement d' appeler AddToBasket, mais nous devons également ajouter les crochets et transmettre la pizza, ainsi que l' option jusqu'à la fonction, où nous pouvons recevoir ces valeurs, donc l'article et l'option. Maintenant, au lieu d'avoir le nom sous forme de chaîne, nous pouvons le transmettre dans le nom de la variable item.name. Le prix, qui est stocké dans l'option, est option.price. La taille, option.size. Essayons ça. Essayons la Margherita de neuf pouces. Ça a l'air bien. Un pepperoni de 12 pouces, tout cela semble parfaitement fonctionner. Ensuite, nous nous occuperons de la mise à jour de la quantité contenue dans ce panier si la même pizza est sélectionnée plusieurs fois. 27. Vérifier les articles de panier en double: Pour le moment, nous ajouterons une nouvelle pizza à notre panier. Tout fonctionne bien mais nous commençons à avoir un problème si nous ajoutons la même valeur plusieurs fois. Par exemple, si nous essayons d'ajouter la pizza de neuf pouces plus d'une fois, nous l'avons déjà tout en haut Au lieu d'augmenter la quantité à deux, nous obtenons un nouvel élément en bas. Il en va de même pour toutes nos pizzas. Plutôt que d'ajouter un nouvel article, nous voulons plutôt augmenter la quantité à chaque fois. Pour cela, avant de mettre notre nouvelle pizza dans le panier, nous devons d'abord vérifier si la nouvelle pizza existe déjà dans ce panier. Pour ce faire, tout en haut de notre fonction, nous pouvons accéder à notre panier, la valeur puisqu'il s'agit d'une référence, et utiliser la méthode de recherche JavaScript. La méthode find exécutera une fonction pour chaque valeur de notre panier. S'il y a des pizzas dans le panier, nous les stockerons dans une variable appelée pizza, puis nous pourrons travailler avec chaque pizza individuellement. Ce que nous voulons faire ici, c'est vérifier si le nom de la pizza et la taille de la pizza correspondent. N'oubliez pas que si nous ajoutons à notre menu, comme le Margherita, nous pouvons ajouter deux tailles différentes. Nous pouvons avoir deux noms de pizza distincts, mais ils ne correspondent pas. Nous devons également vérifier le nom de la pizza ainsi que la valeur de l'option. La méthode JavaScript find renverra la toute première valeur, dans notre cas, la pizza, qui correspond à une certaine condition. Nous voulons revenir à vrai si une certaine condition est remplie. Dans notre cas, nous voulons vérifier si le pizza.name est égal au item.name. agit de vérifier si la pizza qui se trouve actuellement dans le panier a un nom égal au nom de la pizza que nous essayons d'ajouter. Il devrait y avoir un triple égal et, en utilisant la double esperluette, nous devons également effectuer une deuxième vérification. La deuxième vérification consiste à savoir si la pizza est de la taille, il s'agit bien de la pizza qui est rangée dans le panier. Nous voulons savoir si cela est égal à l'option.size. Encore une fois, il s'agit de la taille de l' option de la pizza que nous essayons d'ajouter. Si les deux correspondent, cette affirmation est vraie et cette méthode de recherche renverra alors la pizza que nous trouvons dans le panier. Nous pouvons le stocker dans une constante ou une pizza existe et avant d'aller plus loin, nous allons vérifier en nous connectant à la console. Enregistrez la valeur de notre pizza constante, sauvegardez et transférez dans le navigateur. Sautez dans la console pour ne pas avoir de copains de pizzas à l'intérieur, en plus, ce n'est pas défini, les différentes valeurs ne le sont pas non plus. Mais si nous essayons de cliquer une seconde fois sur une pizza, nous retrouvons la pizza, qui correspond au panier. Nous voyons que c'est une pizza de neuf pouces, essayons-la avec les 12, celle-ci fonctionne aussi. Essayons simplement le pepperoni. La toute première fois n'est pas définie et si nous l'avons déjà dans le panier, il retournera la pizza qu'il a trouvée. Avec ces informations, nous pouvons maintenant placer une instruction if et vérifier si notre pizza se trouve avec cette constante. S'il souhaite accéder à la pizza, sélectionnez la propriété de quantité et augmentez-la de la valeur 1. De plus, si cela est vrai, nous voulons revenir en arrière, modifier cette fonction car nous ne voulons pas ajouter pizza supplémentaire à notre panier. Essayons maintenant ceci. Rechargez ça. Notre première Margherita, notre deuxième Margherita augmente maintenant la quantité. Essayons le pepperoni. Deux nouvelles lignes et un doublon et chaque fois que je clique sur un doublon, la quantité est augmentée de la valeur d'un. Ensuite, nous allons également revenir à notre panier et nous en tenir à la question de la quantité en connectant nos boutons d'augmentation et de diminution, ainsi qu'une fonction permettant de retirer une pizza du panier. 28. Éliminer et changer la quantité de panier: Comme nous l'avons découvert dans la vidéo précédente, lorsque nous ajoutons l'une de nos pizzas au panier, toutes nos pizzas sont désormais affichées sur la droite. Nous voyons également la quantité qui est la valeur par défaut d'un. Nous avons également ces boutons pour augmenter et diminuer la quantité. C'est avec cela que nous allons travailler maintenant. Accédez à la vue du menu, accédez à la section des modèles et faites défiler l'écran jusqu'à la zone du panier. À l'intérieur des paniers, nous avons notre corps de table, qui crée notre boucle pour toutes les pizzas. Ici, à l'intérieur de la boucle, nous avons accès à l'article dont vous souhaitez modifier la quantité. Ensuite, nous avons ici nos boutons pour augmenter et diminuer les valeurs. Pour la première, qui correspond à la diminution, nous pouvons ajouter un écouteur de clics, qui déclenchera ensuite une fonction. Nous allons transmettre cet article à la fonction, puis modifier la quantité. À l'intérieur du bouton d'ouverture, @click, et nous appellerons cette fonction quantité réduite. Passez l'élément pour que nous sachions quel élément réduire , puis passez au deuxième bouton, qui consiste à augmenter. Nous appellerons cela IncreaseQuantity. Encore une fois, cela nécessite également l'accès à l'élément que nous voulons modifier. Nous allons commencer par cette fonction IncreaseQuantity. Je vais faire défiler la page vers le haut. N'oubliez pas que si nous examinons cette méthode de poussée ici, nous pouvons voir la structure de nos paniers. Tout ce que nous devons faire est d'augmenter la propriété de quantité sur l'objet. Créez une fonction, IncreaseQuantity, récupérez l'élément qui lui est transmis, sélectionnez-le. Nous voulons uniquement travailler avec le champ de quantité, et nous allons l'incrémenter de la valeur un. Ensuite, la fonction permettant de diminuer la quantité. Prend également en compte l' article, item.quantity. Je vais le déduire de la valeur de un. C'est la première chose que nous devons faire pour la fonction de diminution. La deuxième chose est de vérifier si la quantité est nulle. Si c'est le cas, nous ne voulons pas qu' un article apparaisse dans le panier avec la quantité zéro. Nous souhaitons plutôt le supprimer du panier. Nous pouvons le placer dans une section F pour vérifier si la valeur item.quantity est égale à zéro. Si c'est le cas, nous souhaitons le supprimer du panier. Si nous le voulions, nous pourrions insérer le code à l' intérieur pour le faire. Mais au lieu de cela, je vais sous-traiter cela à une fonction autonome qui s' appellera RemoveFromBasket. Nous devrons également récupérer l'article que nous voulons supprimer, puis le créer en bas, la fonction RemoveFromBasket, transmettre l'article que vous souhaitez supprimer. abord, nous devons accéder à nos paniers complets et, comme il s'agit d'une référence, nous accédons à la propriété value. Ensuite, nous pouvons utiliser la méthode d'épissage JavaScript. Splice va supprimer un élément de notre tableau à la première personne à la position de départ. Nous devons donc récupérer le numéro d' index de cet article. Pour ce faire, accédez au basket.value. Voici le panier complet. Ensuite, nous pouvons récupérer le numéro d'index avec indexof. Nous avons besoin de connaître le numéro d'index de notre article. C'est juste du JavaScript normal. Cela n'a rien à voir avec Vue js. Nous trouvons la position d'index de notre élément particulier à l'intérieur de ce tableau, séparée par une virgule. Nous ne voulons supprimer qu' un seul élément. Maintenant, sauvegardons cela et vérifions que cela fonctionne. Cliquez sur n'importe quelle pizza. Si nous continuons à l'augmenter la valeur augmentera également. Essayons plus. Cela fonctionne bien. Négatif, cela va baisser. Ensuite, une fois que nous aurons atteint zéro, cet élément devrait être supprimé. Il s'agit d'une bonne fonctionnalité qui a été créée avec des fonctions assez petites. Ensuite, nous allons rester dans ce panier et commencer à mettre à jour le total de la commande à l'aide de propriétés calculées. 29. Propriétés calculées: Si vous avez déjà utilisé View Dress et utilisé des propriétés informatiques, la bonne nouvelle, c'est qu'elles sont là pour durer. Ils sont toujours entièrement pris en charge dans View Free, fois lors de l'utilisation de l'API de composition et de l'API d'options. Ils constitueront un cas d'utilisation idéal pour calculer le coût de toutes les pizzas contenues dans les paniers. Au bas du panier, nous avons actuellement cette valeur codée en dur, qui est disponible dans la vue du menu. Faisons défiler la page vers le bas et trouvons ceci. Ceci se trouve en bas de notre modèle. Nous pourrions utiliser des fonctions ordinaires pour calculer le coût à l'intérieur de ce panier, mais le problème avec une fonction est qu'elle ne s' exécute qu'une seule fois à chaque fois que nous l'appelons. Si nous écrivons plutôt ce calcul dans une propriété calculée, chaque fois que les données qu'il contient changent, dans notre cas, les paniers, dans notre cas, les paniers, sa valeur sera recalculée pour nous. Pour ce faire, rendez-vous en haut du fichier. Nous devons importer des données calculées à partir du package View. Computed agit comme un wrapper. Si nous décomposons les choses, nous pouvons d'abord créer une fonction anonyme pour calculer le niveau de nos paniers. En bas de notre script. Nous allons d'abord créer une fonction qui n'a pas besoin de nom à ce stade. Ce que nous allons faire, c'est créer une variable appelée coût total qui sera initialement nulle, puis nous pouvons parcourir tous les paniers et appuyer sur le champ de quantité de chacune de nos pizzas. C'est le coût total. Paniers, encore une fois, c'est un let Nous utilisons donc la boucle de valeur pour chacun d'entre eux. Pour chacune d'entre elles, nous exécuterons une fonction pour chaque valeur contenue dans les paniers et stockerons chacune d'elles dans l'article. Ensuite, nous pouvons récupérer notre variable vide appelée coût total. Utilisez l'opérateur plus égal pour ajouter une nouvelle valeur à notre coût total sur chaque boucle. Nous ne voulons pas simplement saisir le prix de l'article et le porter au total, car nous pouvons parfois avoir plusieurs pizzas. Pour cela, nous devons multiplier l'article.quantité par le prix. Nous pouvons accéder à ce coût total en dehors de la fonction. Nous devons le rendre. Ensuite, l'extérieur de la fonction crée une variable ou constante pour stocker notre valeur calculée. Nous appellerons celui-ci le total. Comme mentionné, computed agira comme un wrapper, nous devons donc le placer dans notre fonction. Découpez-le, collez-le dans l'ordinateur. Maintenant que nous avons calculé en tant que wrapper, chaque fois que le panier ou toute autre donnée qu'il contient est mis à jour, cette fonction sera réexécutée et la variable totale sera mise à jour. Ce total peut désormais être utilisé dans notre modèle. Saute vers le bas. Vous ajoutez le coût total, ajoutez un article autant que le prix puisque nous n'en avons qu'un. Augmentez la quantité. Ce chiffre est également doublé puisque dans notre valeur calculée, nous multiplions la quantité de l'article par le prix. Tout cela semble maintenant fonctionner correctement. Plus tard, nous améliorerons cela en créant un filtre de devises réutilisable pour assurer que les chiffres sont arrondis correctement. 30. Fichiers composables: Dans la section script de notre MenuView sur laquelle nous avons travaillé récemment, si nous y jetons un coup d'œil de haut en bas, cette section commence à devenir assez grande. Pour vous aider, nous pouvons déplacer le contenu dans des fichiers séparés, nous pouvons utiliser autant de ces fichiers que nous le souhaitons, ce qui permettra de garder les choses vraiment organisées. Ces fichiers sont appelés fichiers composables. Pour les garder organisés, nous allons créer un nouveau dossier appelé composables dans lequel les conserver. Ils vivront directement à l'intérieur de la source et accompagneront des éléments tels que nos actifs et nos composants. Cliquez sur la source, un nouveau dossier, le nom des composants, et si vous le souhaitez, nous pouvons modifier le nom de ce dossier, il n'est pas nécessaire qu'il s' agisse de composables, s'agit simplement d'une convention de dénomination. Une autre convention de dénomination concerne les fichiers qui se trouvent à l'intérieur. Ils ont tendance à avoir le préfixe « use », mais encore une fois, cela est totalement facultatif. Pour ceux qui n'ont aucun lien avec notre contenu, nous aurions des fichiers tels que UseBasket, UsePizza et UseOrders, qui sont tous des fichiers JavaScript ordinaires. Commençons par un fichier appelé UseBasket. Placez-le dans le fichier des composables, UseBasket, et celui-ci porte l'extension JavaScript. Ce fichier va exporter une fonction, donc exporter par défaut, une fonction appelée UseBasket. Le contenu de cette fonction sera l'ensemble des fonctionnalités liées au panier de notre MenuView ou de tout autre fichier d'ailleurs. Revenons au MenuView, examinons toutes les fonctionnalités liées au panier. Nous avons besoin du panier, découpons-le, collons-le dans notre nouveau fichier. Nous n'avons pas besoin des pizzas, elles seront placées dans un autre fichier, fonction AddToBasket, nous pouvons les prendre. Nous avons également besoin de IncreaseQuantity, de la diminution , de RemoveFromBasket, ainsi que du total , c' est-à-dire sa valeur calculée Supprimez tout cela et nous devrions simplement partir avec nos pizzas, coller dans notre fichier composable, assurant que tout est du panier, c' est-à-dire sa valeur calculée. Supprimez tout cela et nous devrions simplement partir avec nos pizzas, les coller dans notre fichier composable, en nous assurant que tout est intégré à cette fonction. Comme nous n' utilisons pas notre référence et la section calculée qu'elle contient, nous pouvons également importer les importations ou les copier. Nous pouvons voir que nous utilisons toujours notre référence dans ce fichier, mais nous n'avons pas pu supprimer Computed. Ensuite, importez-les en haut de notre fichier, juste à l'extérieur de la fonction. Maintenant, pour utiliser n'importe quelle fonction ou de ces variables dans différents fichiers, nous devons d'abord renvoyer cette fonction vers le bas. Toujours dans la balise de fermeture de notre fonction, créez notre section de retours doit renvoyer l'une de nos fonctions ou variables qui doit renvoyer l'une de nos fonctions ou variables que nous souhaitons utiliser dans d'autres fichiers. Nous avons effectivement besoin de tout à partir de là, nous avons besoin du panier, de la fonction appelée AddToBasket, nous avons besoin des deux fonctions pour augmenter et diminuer les valeurs, nous avons besoin du total. Mais une chose dont nous n'avons pas réellement besoin à ce stade est RemoveFromBasket. Cela est dû au fait que le seul endroit où cela est appelé se trouve dans cette fonction DecreaseQuantity Nous n'avons donc pas besoin de l'appeler depuis aucun fichier. Cela regroupe désormais toutes les fonctions et variables associées. N'oubliez pas que nous avons exporté ici une fonction appelée UseBasket. Pour accéder au contenu qu'il contient, nous pouvons accéder à notre MenuView et l'importer dans notre fichier. Importez, utilisez Basket. À l'aide du symbole d'ajout, nous pouvons accéder au niveau supérieur de notre source, puis accéder au dossier composable , puis au nom de fichier appelé UseBasket. Ensuite, en utilisant la déstructuration JavaScript, nous pouvons stocker toutes les valeurs renvoyées par ces fonctions dans des variables. Le panier, les fonctions de IncreaseQuantity, DecreaseQuantity, nous avons besoin de AddToBasket, ainsi que le total. Je les sélectionnais à partir de notre fonction UseBasket, que nous avons importée juste au-dessus. Toutes ces constantes peuvent désormais être utilisées dans notre modèle. Il ne reste plus qu'à enregistrer ceci, à revenir à notre projet et à vérifier que tout fonctionne toujours correctement. En fait, juste avant de faire cela, nous devons appeler cette fonction pour qu'elle soit disponible. au projet, ajoutez-les à nos paniers, les fonctions d'augmentation et de diminution fonctionnent. Nous pouvons les supprimer, et notre total fonctionne également. 31. Qu'est-ce que la base de feu ?: Alors, qu'est-ce que Firebase exactement et comment pouvons-nous l'utiliser ? Eh bien, Firebase est un service fourni par Google pour les sites Web, les applications et les jeux. Nombre d'entre eux ont besoin de services tels que l'authentification, stockage, l'hébergement et également une base de données. Firebase fournit toutes ces fonctionnalités dans une seule application. Je vais utiliser certains d'entre eux dans le cadre de notre projet. Nous utiliserons certains d'entre eux, notamment le Cloud Firestore, qui sera notre base de données, qui stockera nos pizzas et nos commandes. Le cloud Firestore est une base de données en temps réel, ce qui signifie que chaque fois que l'une de nos données stockées change, l'application est informée. Cela pourrait être un cas d'utilisation si l'administrateur devait supprimer une pizza, puis le menu serait également mis à jour. De plus, si vous avez plusieurs applications, exemple votre site Web et votre application mobile, la base de données peut être partagée et synchronisée. Nous pouvons également définir des règles et des rôles à des fins de sécurité. Mais plus d'informations à ce sujet plus tard. Il fournira également notre système d'authentification, fournissant un flux de connexion, de connexion, de déconnexion, de mot de passe oublié, ainsi que de multiples manières pour les utilisateurs de se connecter. Nous utiliserons un e-mail et un mot de passe pour vous connecter. Car d'autres services sont disponibles, tels que la connexion à Google, Twitter ou Facebook. En outre, de nombreux autres services Firebase seront ajoutés, tels que des analyses, fonctions cloud et du stockage. Alors, allez-y et créez un compte si vous ne l'avez pas encore fait. Le compte gratuit est tout ce dont nous avons besoin pour tester et créer notre projet La prochaine fois, nous le configurerons et créerons un lien vers notre projet. 32. Configuration de la base de feu: Une fois que vous avez créé un compte et que vous vous êtes connecté à Firebase, rendez-vous dans la zone de la console et vous verrez quelque chose qui ressemble à ceci. À partir de là, nous pouvons créer notre nouveau projet. Nous devons donner à ce projet le nom, eh bien, ce sera Pizza Planets. Vous pouvez appeler le vôtre Pizza Planet si vous le souhaitez, mais il s'agit de la troisième version de ce cours, donc je vais appeler la mienne V3. Cliquez sur la case à cocher, puis continuez. Google Analytics, je vais dire non à ce projet. Donnez-lui ensuite quelques instants pour terminer. Mon projet est maintenant configuré. Continuons, puis cela nous emmènera dans notre projet. À partir de là, nous pouvons obtenir les instructions pour ajouter Firebase à notre application pour iOS ou Android. Mais dans notre cas, nous cliquerons sur le lien Web. Si les choses semblent un peu différentes à ce stade, ne vous inquiétez pas, ces sites Web ont l'habitude de changer, mais le processus de configuration devrait être similaire. Nous devons maintenant enregistrer notre application en lui donnant un surnom. Je vais juste le garder de la même manière que Pizza Planets Version 3. Je ne vais pas configurer d'hébergement Firebase pour le moment. S'inscrire. Ensuite, une fois que cela sera terminé, il nous donnera quelques instructions pour le configurer. La première chose à faire est d'utiliser npm pour l' installer en tant que package de modules de nœuds. Copions ce lien, qui est npm install Firebase. Fermons le serveur. Collez ceci dedans. Nous avons maintenant quelques raisons pour lesquelles cela a été très lent aujourd'hui. Nous pouvons simplement le fermer et redémarrer le serveur avec npm run dev. Nous pouvons confirmer que cela a été installé en accédant au package.json. Ils auront Firebase comme dépendance. Retour au site Web de Firebase. La prochaine étape après l'installation consiste à copier certaines instructions. Je vais simplement le recopier et nous verrons ce que chaque étape fait dans un instant. Cela nous permettra de rester organisés en le plaçant dans un nouveau dossier JavaScript, qui se trouve directement dans le dossier source, en créant un nouveau fichier. Le fichier Firebase.js. Collez ceci dedans. La première chose à faire est d'importer et d' initialiser les fonctions de l'application, fournies par Firebase. Nous avons ensuite l'objet de configuration Firebase, qui est facilement renseigné avec toutes les informations relatives à notre application. Ensuite, tout en bas, nous utilisons les fonctions d' initialisation de l'application juste ici. Transmettez-lui ensuite les détails de configuration, qui nous donneront ensuite une référence à notre application. Nous avons maintenant la référence de l'application. Nous avons également besoin d'une référence à notre base de données Firestore afin de pouvoir ajouter et supprimer des enregistrements. À partir de là, nous devons également importer quelque chose depuis la bibliothèque Firebase. Tout en haut, nous allons créer un deuxième élément important dans lequel nous allons importer quelque chose depuis le package, à savoir Firebase. Mais cette fois, plutôt que de l'application Forward Slash, nous devons l'importer depuis la section Firestore. La fonction que vous souhaitez importer depuis cette section s'appelle GetFireStore. GetFireStore peut désormais être utilisé pour obtenir une référence à notre base de données. Pour ce faire, nous transmettons notre variable d'application. Juste celui-ci. Ceci est à l'intérieur d'une constante appelée Db , abréviation de base de données, appelée GetFireStore. Passez dans notre application. Lorsque vous travaillez avec Fire Store, il regroupe nos données dans des collections. Dans notre cas, nous aurons une collection pour les pizzas, une collection pour les commandes, et nous pouvons également en avoir une pour les utilisateurs. Pour travailler avec les collections, vous devrez également importer depuis le package Firestore. Revenez en haut de la page, obtenez package Firestore, importez la collection. Nous pouvons l'utiliser pour référencer nos collections en y ajoutant deux éléments. le premier cas, nous devons transmettre la référence de base de données que vous avez stockée juste au-dessus dans cette constante. Ensuite, ce sera le nom de notre collection, que nous n'avons pas encore créée pour le moment. Celle-ci s' appellera Pizzas. Cela nous donne maintenant une référence à une collection unique que nous pouvons utiliser pour lire des documents et ajouter de nouveaux besoins. Pour le rendre disponible dans d'autres composants, nous allons l'exporter sous forme de constante. Le nom de la constante sera DPPizzas&Ref. Copions et collons ceci. Cette deuxième référence concernera nos commandes. DBorder&Ref. Cela utilisera la même base de données, mais le nom de la collection des commandes. Cela nous permettra d'importer ces références dans d'autres fichiers de composants. Nous pourrions faire des choses comme lire le contenu ou ajouter de nouvelles données. Nous examinerons cela ensuite. La dernière étape de cette vidéo consiste à indiquer à Firebase que nous souhaitons utiliser le cloud Firestore ainsi que l'authentification. Passons à la section de présentation du projet dans le navigateur. Nous pouvons continuer sur la console. Nous n'avons pas besoin de données supplémentaires de ce point de vue. Cela nous donne la possibilité d'ajouter divers produits à Firestore. Nous pouvons faire des choses comme suivre les performances. Nous pouvons ajouter des analyses pour notre cas d'utilisation pour le moment, tout ce dont nous avons besoin est l'authentification et la base de données cloud Firestore. Commençons par l' authentification. Lancez-vous. Cela nous permettra de nous connecter à différents fournisseurs tels que Google et Facebook. Mais je vais créer un système de courrier électronique et de mot de passe. Cliquez dessus pour activer l' e-mail et le mot de passe. Maintenant, je ne vais pas activer le lien e-mail, nous allons simplement le conserver sous forme d' e-mail et de mot de passe. C'est tout ce que nous devons faire pour le moment. Ceci est actuellement activé. Revenons à l'aperçu de notre projet. Vous pouvez voir que nous avons maintenant le raccourci vers l'authentification. Ensuite, nous ajouterons le Cloud Firestore, qui apparaît également dans la barre latérale. Créez notre base de données. Nous allons commencer en mode test et nous examinerons les règles de sécurité plus tard. Mais pour l'instant, cela nous donnera un accès complet à notre base de données pour lire et écrire. Cette fonctionnalité ne devrait être autorisée qu'à des fins de test, et nous verrons comment nous pouvons l'améliorer ultérieurement. Cliquez sur Suivant. Choisissez un emplacement si vous le souhaitez et activez la base de données. Plus tard, nous activerons certaines règles de sécurité pour renforcer la sécurité de notre base de données. Bien. Nous avons maintenant configuré un mode d'authentification et nous avons également une base de données vide. fois cela en place, nous verrons ensuite Une fois cela en place, nous verrons ensuite comment ajouter de nouvelles pizzas à cette base de données vide. 33. Ajouter des pizzas à la base de données: Maintenant que la configuration est terminée, nous pouvons utiliser le DBPizzasRef que vous avez précédemment configuré ainsi que notre référence de commande pour travailler avec notre base de données. Nous allons commencer par ajouter les nouvelles pizzas à la base de données dans les nouveaux composants de pizza. Pour cela, nous devons importer deux choses. Passons donc au nouveau composant pizza, qui se trouve dans le dossier Components et dans le dossier Admin. En haut, créez nos instructions d'importation dans lesquelles nous importerons quelque chose appelé AddDoc, qui provient du nom du package, qui est Firebase/Firestore, qui est logique car il s' agit d'une fonction liée à la base de données. Le second que nous devons importer est notre DBPizzasRef. Le chemin du fichier a été facilement renseigné pour nous. Les deux seront utilisés dans une nouvelle fonction pour ajouter notre pizza. Revenons au bas de nos scripts. Cela va être asynchrone, créez une fonction appelée Ajouter. Comme nous travaillons avec une base de données et que les choses peuvent mal tourner, nous devons placer cela dans une section «  Essayer et récupérer ». Catch prend en compte l'erreur , que nous pouvons stocker dans la variable e. Pour l'instant, nous allons travailler dans la section d'essai. De là, nous pouvons appeler notre fonction, que nous venons d'importer, appelée AddDoc. À l'intérieur d'ici, nous devons passer deux choses. La première est la collection à laquelle vous souhaitez ajouter, qui est stockée dans notre DBPizzasRef. N'oubliez pas que cela fera référence à une collection appelée pizzas. L'article que vous souhaitez ajouter à la base de données sera notre NewPizza, qui est cet objet juste au-dessus. Comme cela est stocké dans une référence, nous devons accéder à la valeur. Nous pouvons désormais appeler cette fonction d'ajout lorsque nous cliquons sur le bouton Ajouter. N'oubliez pas qu'à l'intérieur de l'application et de la section d'administration, nous avons ce bouton Ajouter. Accédez au modèle. Nous y sommes. Nous allons écouter maintenant pendant un clic. Le nom de la fonction add empêchera le comportement par défaut, qui empêchera la page de se recharger et de perdre toutes les données ou le formulaire. De plus, comme nous ne savons pas combien de temps cela va prendre, puisque nous transférons certaines données vers un serveur externe, nous allons ajouter await car nous pouvons attendre que les données reviennent avant de passer à l'étape suivante. Et nous pouvons l'utiliser puisque nous avons marqué notre fonction comme asynchrone. Juste avant de le tester et de nous assurer que cela place notre NewPizza dans la base de données, nous allons ajouter un système de gestion des erreurs ainsi qu'un message à afficher dans le navigateur. Ce message peut être stocké dans une constante. Juste au-dessus de notre message NewPizza, const, stockez-le dans une référence, car nous allons le mettre à jour. Initialisez-le sous la forme d'une chaîne vide et revenez à notre fonction d'ajout où nous mettrons à jour la valeur de ce message. Puisque nous utilisons l'async, attendez, tout code exécuté ci-dessous ne se produira qu' une fois que nous aurons récupéré les informations de notre base de données. Sur la ligne suivante, nous saurons si cela a été un succès ou s'il y a eu un échec. Comme nous l'avons intégré dans une section d'essai, nous saurons que ce code ne s' exécutera qu' en cas de succès. Nous ajouterons le code d'échec à l'intérieur de la zone de capture. Ci-dessous, accédez à notre message.value, qui sera un succès. Ouvrez les backticks et nous dirons Pizza, placez-le dans un nom de variable. Nous allons placer une variable afin de pouvoir accéder à notre nouvelle pizza et le nom NewPizza.value.Name a été ajouté. Ensuite, s'il y a une erreur, passez dans la zone de saisie, nous accèderons à notre message.value et définirons cette chaîne sur laquelle il y a eu une erreur, ajouterons la pizza. Nous devons ensuite afficher ce message dans notre modèle. Je vais le faire tout en bas, juste en dessous de ce bouton, à l'intérieur d'une travée. Je vais mettre notre message et la dernière chose à faire est de le tester dans le navigateur. N'oubliez pas que notre base de données est actuellement vide. Dans Admin, nous allons ajouter une Margherita. Nous allons déplacer l'exemple de code. Cliquez sur le bouton Ajouter pour activer notre fonction. Ça y est, les choses commencent à aller bien. Nous avons Pizza Margherita qui a été ajoutée à la base de données et actualisée. Cela semble prometteur. Nous avons notre collection de pizzas, que nous avons créée dans notre configuration Firebase, qui se trouve ici. Nous avons ensuite utilisé dans NewPizza une méthode appelée AddDoc, et cette méthode AddDoc a ensuite référencé notre collection, qui est Pizzas, et la valeur est NewPizza.value. Dans la base de données, cette collection Pizzas contient un identifiant de document unique, puis tout le contenu de notre nouvelle pizza. Essayons-en un autre, Pepperoni. Ajoutez ceci. Nous y voilà. Nous savons comment documenter références et si nous cliquons sur celle-ci, celle-ci est désormais le Pepperoni. Pourquoi pas ? Nous en ajouterons une autre à notre nouveau formulaire de pizza. Végétarien Dites mozzarella, poivrons, oignons, champignons. Cela n'a pas vraiment d' importance à ce stade. Nous mettrons à jour le prix, disons 8 et 14. Ajoutez ceci. Nous avons également atteint notre objectif pour cette vidéo, qui est d'ajouter une nouvelle pizza à notre base de données. Mais si nous jetons un coup d'œil ce texte juste ici, nous avons également besoin d'un peu d'espace à gauche du message. Dans le fichier NewPizza, descendez vers le bas. Ajoutez une section de style. Nous allons lui donner une classe ou un span, une classe de message, y accéder et définir une marge sur la gauche, 1rem devrait convenir. Nous devons ajouter une nouvelle pizza pour pouvoir voir cela. Nous irons manger un festin de viande. Modifiez la description, pepperoni, salami, bœuf et jambon. Changez le prix. Nous y voilà. Nous verrons ensuite comment récupérer ces pizzas de la base de données et les afficher dans notre menu. 34. Obtenir des pizzas: Pour récupérer des pizzas depuis notre base de données Firestore, Firebase fournit une fonction appelée GetDocs. De plus, comme nous souhaitons utiliser ces pizzas à la fois dans le menu et dans la section d'administration, nous pouvons créer un fichier composable partagé pour ce faire. Créons un nouveau fichier dans la barre latérale. Dans les composables, nous allons créer un nouveau fichier appelé usePizzas.js. Cela suivra un modèle similaire à l'autre composable que nous avons créé. Nous allons exporter une fonction que nous pouvons importer dans n'importe quel autre fichier. Exportez la fonction par défaut appelée UsePizzas et créez le corps de la fonction qui contiendra tout le code que vous souhaitez rendre disponible. À l'extérieur, nous pouvons ajouter nos importations en haut du fichier. Nous devons importer la référence depuis Vue. La raison pour laquelle nous en avons besoin est que nous avons besoin d'une constante qui contiendra toutes les pizzas locales. Const AllPizzas est égal à une référence et il s'agira d'un éventail de toutes les pizzas. Maintenant, pour obtenir les pizzas, nous devons importer certains objets depuis Firebase. Le premier package dont nous avons besoin est celui que nous avons déjà mentionné , à savoir GetDocs. Celui-ci provient de Firebase/Firestore. Ensuite, nous devons également importer la référence que nous avons créée dans le fichier Firebase pour avoir accès à cette collection de pizzas. Nous devons donc importer le DBPizzasRef à partir de ce fichier Firebase. Importez le fichier DBPizzaRef à partir de ce chemin de fichier. Ensuite, juste en dessous, là où toutes les pizzas sont constantes, nous allons créer une fonction qui sera chargée récupérer nos pizzas de la base de données. Cette fonction sera marquée comme asynchrone car nous devons attendre le retour des données sur les pizzas avant de pouvoir utiliser cette fonction appelée GetPizzas. Ensuite, nous pouvons appeler notre méthode ci-dessus que nous venons d'importer appelée GetDocs, transmettre dans notre référence de collection, qui est DBPizzasRef. Nous allons stocker la valeur de retour dans une constante appelée docs et nous attendrons également que ces données nous reviennent. Exécutez ensuite cette fonction et obtenez la pizza de la base de données. Nous avons deux options différentes. Nous pouvons le déclencher manuellement en appelant GetPizzas ou nous pouvons déclencher lorsqu' un composant est monté à l'aide du hook de cycle de vie OnMounted . À partir du package vue, nous allons le faire avec OnMounted. Ensuite, dès que ce code ou ce composant sera monté sur le DOM, OnMounted sera appelé, qui appellera alors notre fonction appelée GetPizzas. Cela évite d'avoir à appeler cette fonction manuellement et cela signifie qu'elle le fera automatiquement en arrière-plan dès que le composant sera chargé. Si nous passons au projet et que nous accédons à la console, nous pouvons le tester en créant un journal de console pour la valeur renvoyée dans la documentation. Actualisez et nous ne voyons toujours rien dans la console car ce code n'est actuellement pas importé dans les composants. Le hook OnMounted Lifecycle n'est pas appelé. Alors allons-y, mais d'abord, nous allons renvoyer les valeurs que nous devons importer. Tout ce dont nous avons besoin actuellement, c'est de cette référence à AllPizzas. Nous allons commencer par l'importer dans notre MenuView qui se trouve dans la section Affichage. Ensuite, comme nous l'avons fait avec le composable UseBasket, nous devons d'abord l'importer Nous allons donc importer UsePizzas à partir de notre fichier composable, puis en utilisant cette structuration, nous importerons notre référence AllPizzas à partir de cette fonction. Const AllPizzas est égal à la valeur renvoyée par UsePizzas. Nous avons maintenant constaté une erreur puisque nous doublons cette référence AllPizzas, nous l'importons depuis notre composable. Nous avons également cet exemple de code ici. Nous n'avons plus besoin de tout cela. Nous pouvons supprimer cette section. Comme c'est le seul code qui utilise ref, nous pouvons également le supprimer du script. Si nous rechargeons, rien n' est encore connecté à la console. effet, pour que cela soit réellement monté et que notre fonction puisse être appelée, nous devons accéder au composant menu. Sélectionnez cette option, nous verrons alors un journal dans la console. Ouvrez cet objet et de nombreuses informations sont renvoyées par la base de données. Nous n'avons pas besoin d'une grande partie de ces informations à ce stade, mais une chose qui nous intéresse, c'est cette propriété documentaire. Ouvrez-le, et à l'intérieur se trouve un tableau contenant chaque document de pizza que nous avons créé. Jetons un coup d'œil à l'intérieur. Encore une fois, il y a beaucoup d'informations ici. Nous pouvons voir l'identifiant du document. Nous pouvons examiner les documents et les données et explorer les valeurs des données, y compris le nom, les options et la description. Ce que nous pouvons faire maintenant, c'est parcourir en boucle toutes les valeurs contenues dans les documents. Malheureusement, nous n'avons pas besoin d' approfondir tous ces niveaux de notre objet. Au lieu de cela, nous pouvons appeler des documents en tant que fonction. Cela permettra d'extraire tous les champs dont nous avons besoin et de les rendre accessibles à l'intérieur de notre script. Revenez dans notre composable. Nous pouvons déplacer le journal, accéder à nos documents renvoyés et l'appeler pour chaque boucle. Pour chacune, nous allons exécuter une fonction pour chacune de nos valeurs. Dans mon cas, j' ai actuellement quatre pizzas en stock. Ensuite, pour filtrer toutes ces données inutiles, je vais créer un nouvel objet avec une structure plus simple, donc const pizza. À l'intérieur, nous pouvons structurer ce nouvel objet avec uniquement les données dont nous avons besoin. Comme nous l'avons vu, chacun d'entre eux possède un identifiant unique. Nous pouvons le voir si nous fermons cet identifiant, donc nous le définissons. Pour accéder aux informations sur les pizzas sur chaque boucle, nous devons également transmettre une variable à notre fonction. Dans la première boucle, doc sera égal à notre première pizza. la deuxième boucle, ce sera notre deuxième pizza, et ainsi de suite. Nous y accédons et sélectionnons la propriété ID. Ensuite, nous devons transmettre les données que nous aurions vues, qui sont stockées dans les documents, .data.value. Nous devons maintenant accéder à tous ces champs. Comme nous l'avons mentionné, nous n'avons pas besoin d'approfondir tous ces champs Nous pouvons accéder à nos documents et appeler la fonction de données. À l'aide de l'opérateur de diffusion JavaScript, nous pouvons également extraire les valeurs dont nous avons besoin à certains endroits directement à l'intérieur de notre objet pizza, à côté de notre identifiant. Enfin, à chaque boucle, nous voulons attribuer la valeur de cette pizza à notre référence AllPizzas. Il suffit de supprimer cet objet, d'accéder à AllPizzas.value, puis d'utiliser la méthode JavaScript push pour envoyer chacune de nos pizzas. C'est tout ce dont nous avons besoin aujourd'hui. Revenons à notre fichier de menu. N'oubliez pas que nous avons importé toutes les pizzas de notre composable. De plus, le nom de cette variable est également le même que celui que nous utilisions précédemment. Maintenant, si nous l'enregistrons et le rechargeons, la table est maintenant remplie avec les pizzas de notre base de données. Une autre chose que nous pouvons maintenant faire puisque nous avons accès à un identifiant unique pour chacune de nos pizzas est de modifier la clé unique pour chaque valeur de cette boucle. Plutôt que d' utiliser l'index, nous pouvons accéder à notre pizza.id. Nous n'avons plus besoin de cet index, nous pouvons donc simplement référencer notre pizza. Il en va de même pour les options. Les options doivent comprendre deux éléments. Le premier, encore une fois, est pizza.id et comme la pizza a deux options, nous l'ajouterons également à notre option.size. Encore une fois, nous pouvons déplacer l' index et le tour est joué, tout est maintenant terminé. Ensuite, nous allons continuer avec un thème similaire en utilisant également ces pizzas dans la section d'administration et nous découvrirons également comment supprimer ces pizzas de notre base de données. 35. Liste et suppression de pizzas dans Admin: Comme nous l'avons découvert dans la vidéo précédente, si nous accédons à ce lien d'administration, nous avons également les composants de ce menu que nous avons créés précédemment. Comme nous l'avons également fait avec le menu de la vidéo précédente, nous devons maintenant extraire nos pizzas de la base de données et les afficher dans l'interface d'administration. Nous veillerons également à ce que cette croix rouge, que nous avons répertoriée à côté de chacune de nos pizzas, supprime également cet article de la base de données. Passons à notre utilisation du fichier pizzas.js. Il s'agit du composable que nous avons configuré dans la vidéo précédente. Nous devons importer deux éléments supplémentaires depuis Firebase, en particulier le package firestore. Ce dont nous avons besoin, c'est de quelque chose appelé delete doc, qui, comme supprimera un élément d'une collection ainsi que le document. Nous allons utiliser doc pour faire référence à tout document particulier que vous souhaitez sélectionner. Ensuite, cela est transmis à Delete Doc pour le supprimer réellement. Nous allons créer une nouvelle fonction à l'intérieur de cet objet juste en dessous de onmounted Elle sera asynchrone appelée delete pizza. sera également transmis à cette fonction de suppression de pizza ID sera également transmis à cette fonction de suppression de pizza lors de son appel. Parce que, bien sûr, nous devons savoir quelle pizza nous voulons supprimer pour pouvoir accéder à ce document que nous venons d'importer depuis Firestore. Doc va prendre en compte deux choses. La première est la référence de la collection de base de données, que nous avons toujours stockée dans DB pizzas ref , puis elle doit prendre en compte l'idée de la pizza réelle que nous voulons supprimer. Ce n'est pas réellement responsable la suppression d'une pizza, tout ce que nous faisons ici est d'obtenir une référence à un document en particulier. Nous réduisons cette ville par collection , puis par carte d'identité. Nous pouvons ensuite utiliser cette référence pour transmettre, supprimer le document. En ce qui concerne les passes, nous pouvons les stocker dans une constante, disons une pizza, puis les transmettre à Delete Doc. Nous allons attendre ça. Nous attendrons la fin de cette opération. Ensuite, nous appellerons notre méthode ci-dessus : appelez Get Pizzas. Si nous voulons appeler get pizzas une fois cela terminé, c'est parce que nous devons mettre à jour notre application. Nous supprimons un article, puis nous appelons get pizzas, qui se trouve juste ici. Cela va alors demander toutes les pizzas que vous avez stockées dans la base de données, moins une que nous avons supprimée. Cela mettra ensuite à jour toutes les pizzas, ce qui est notre référence ici en haut. Toutes les pizzas sont ensuite renvoyées, document est composable, ce qui mettra à jour notre menu, que nous avons créé sur la gauche ici, et le menu dans l'interface administrateur sera également mis à jour . Pour utiliser cette fonction, nous devons également la renvoyer depuis notre pizza de suppression composable, puis ouvrons la barre latérale, passons aux composants, la section d'administration, et à l'intérieur, nous avons ce pizzas.vue, responsable de cette section. Pizzas.vue doit importer les sections dont nous avons besoin. Il faut donc placer une balise de script lors de la configuration et importer notre composable, qui utilisait des pizzas. Use pizzas a renvoyé ces deux valeurs, que nous pouvons déstructurer et stocker dans des constantes afin d'avoir besoin de toutes les pizzas. Supprimez la pizza, que nous pouvons récupérer en appelant la fonction UsePizzas. Passons à notre section de tableaux où nous avons quelques données factices. Notre margarita est en place et nous pouvons maintenant utiliser le corps de la table pour recouvrir toutes nos pizzas. V pour pizza dans toutes les pizzas, entrez une clé et nous avons maintenant l'identifiant unique de pizza provenant de la base de données afin que nous puissions y accéder. La margarita peut être remplacée par le nom dynamique de la pizza, donc pizza.name. Comme il s'agit de la section administrative, nous n'avons pas besoin de toutes les informations supplémentaires telles que la description et les prix, il nous suffit de voir une référence à chaque pizza. Nous pouvons maintenant le voir sur la gauche. Chacune de ces croix permettant de supprimer la pizza de la base de données est stockée à l'intérieur de ce bouton afin que nous puissions ajouter un écouteur de clics , puis référencer notre fonction qui consiste à supprimer la pizza. Cela doit également transmettre l'identifiant de pizza que nous voulons supprimer. Nous pouvons maintenant y accéder avec pizza.id. Essayons-le. Nous allons supprimer le festin de viande. Dès que nous faisons cela, nous constatons un petit problème. Si nous examinons les quatre pizzas d'origine que nous avions, c'est très bien. Il agit des quatre pizzas originales de notre base de mais si nous passons à notre composable, nous l'avons supprimée de la base de données, mais nous avons appelé à nouveau get pizza, ce mais nous avons appelé à nouveau get pizza, qui consiste à récupérer nos pizzas existantes gratuites de la base de données et à les ajouter à toutes les pizzas. En gros, au lieu de remplacer toutes les pizzas, nous conservons les pizzas existantes et ajoutons les trois articles supplémentaires. En fait, ce n' est pas une mauvaise chose le moment, car nous pouvons constater que les trois articles supplémentaires n'incluent pas le festin de viande, que nous avons supprimé. Tout cela semble bien fonctionner. Pour résoudre ce problème, c'est assez simple, tout ce que nous devons faire juste avant de recevoir nos nouvelles pizzas est de récupérer notre référence de toutes les pizzas, leur valeur et de la réinitialiser un tableau vide avant de recevoir nos nouveaux documents. Essayons ça. Rafraîchissez la page. Voici nos trois pizzas, enlevez l'une d'entre elles, et tout fonctionne désormais correctement. dernière amélioration que nous pouvons apporter est d'ajouter un message d'erreur en cas d'erreur ou de problème, supprimer des pizzas ou même de récupérer les pizzas de la base de données. Pour cela, nous pouvons créer une nouvelle référence de message dans le fichier all pizzas. Juste en dessous de toutes les pizzas créez une nouvelle constante pour stocker notre message. Ce sera une référence et, par défaut, une chaîne vide. Ensuite, dans les pizzas à emporter, nous pouvons ajouter une zone de gestion des erreurs avec une zone d'essai et de capture. Mettons-le tout en haut de la section Essayer et attrapons. Catch enregistrera une erreur. Ensuite, nous devons déplacer tout notre code dans la section d'essai. Si vous trouvez la fin de cette fonction, saisissez tout jusqu'à all pizzas.value. Découpez-le en ne laissant que la zone d'essai et la zone de capture à l'intérieur, puis dans la section d'essai, collez-le à nouveau et voici dans la section d'essai, collez-le à nouveau et voici le code que vous voulez exécuter et essayer de réussir. Mais s'il y a une erreur, nous pouvons alors accéder à la zone de capture et mettre à jour notre message. Le message.value est égal à une chaîne et nous dirons qu' une erreur s' est produite lors de la récupération des pizzas. Veuillez recharger la page. Tout comme nous l'avons fait pour les pizzas, nous pouvons également mettre à jour le message et le réinitialiser pour qu'il s'agisse d'une chaîne vide à chaque fois que nous l'exécutons. Le message.value est renvoyé à une chaîne vide. Il en va de même pour notre deuxième fonction qui est de supprimer une pizza. Le bloc d'essai, le bloc de capture, qui prend en compte l'erreur, recadre le code existant, coupe et le remplace, placez-le dans le bloc d'essai. Réinitialisez le message, il s'agit d'une chaîne vide, puis mettez à jour le message dans le bloc de saisie. C'est une chaîne b, alors si vous le souhaitez, vous pouvez également inclure le message d'erreur, que nous recevrons. Mais pour plus de simplicité, je vais simplement créer une chaîne indiquant qu'une erreur s'est produite lors de la suppression de la pizza. Alors, veuillez réessayer. Ensuite, pour utiliser ce message dans nos composants, nous pouvons le renvoyer, revenir dans les composants pizzas.view, l' importer, puis, juste en dessous de la section d'en-tête, créer un nouvel élément p pour afficher notre message entre les deux accolades. Ajoutez une classe pour le style de l'erreur. Ce qui servira également de mesure temporaire, c'est d' ajouter du texte à l'intérieur. N'importe quel texte convient, c'est juste pour que nous puissions ajouter du style et voir à quoi cela ressemble sans avoir de véritable message d'erreur. Jusqu'à la section style, où nous pouvons ajouter du style à cette classe d'erreur. Tout d'abord, une couleur qui aura la valeur RGB de un à zéro pour le rouge, 67 et 67, qui nous donnera cette couleur rouge. Une bordure d'un pixel, une ligne continue arrondit les coins avec un certain rayon de bordure, puis un espacement intérieur et extérieur avec un rembourrage et une marge. Rembourrage de 1 rem et aussi d'1 rem de marge à l'extérieur, enregistrez, testez. C'est ainsi que notre message d'erreur sera affiché à l'intérieur des composants, mais si nous devions supprimer le texte et le laisser ensuite en tant qu' élément p vide, je peux le voir ici. suppression de ce texte d'erreur affichera toujours la bordure rouge car l'élément p est toujours présent, qu' il contienne des messages ou non. Pour supprimer cela, nous pouvons ajouter une instruction v If pour n'afficher ces éléments que si le message existe. Si nous avons un message et que ses éléments seront affichés, sinon, il sera supprimé du dom et nous ne verrons plus cette bordure rouge. 36. Créer des ordres: Pour créer une commande, suivez le même schéma que pour créer une nouvelle pizza. Passons au panier usagé composable, qui se trouve à l'intérieur d'un dossier composable. Ouvrez ceci et nous devons d'abord importer deux choses. Tout d'abord, nous devons importer AddDoc depuis le package Firestore, donc celui-ci provient de Firebase/Firestore. Ensuite, la référence à la collection de commandes réelle, vers laquelle vous souhaitez l'envoyer. Importons-le depuis notre fichier Firebase. Ce que nous devons faire est d' importer cette base de données de commandes (réf. contenu du panier se trouve déjà dans le tableau des paniers et il est affiché lorsque nous ajoutons quelque chose depuis la section du menu. Sur la droite, voici le panier. Nous devons maintenant créer une nouvelle fonction pour ajouter la collection la plus ancienne à la base de données. Juste en dessous de cette fonction, revenons à cette flèche en bas, cela n'a pas vraiment d'importance. Ce sera asynchrone, le nom de la fonction « add new order », puis, ce que nous devons faire à l'intérieur, c'est l'encapsuler dans un bloc try and catch afin qu'il puisse gérer les erreurs et transmettre l'erreur. La première chose à prendre en compte est que ce panier situé en haut est actuellement stocké sous forme de tableau. Mais Firebase nécessite un objet, nous pouvons donc utiliser l'opérateur de propagation pour fusionner les éléments actuels dans un objet. Passons à la section Essayer et nous allons restructurer notre ordre en créant un nouvel objet. La première propriété à ajouter s' appellera CreatedAt permettra de suivre l'ordre dans lequel nos commandes sont passées et, par conséquent, nous pourrons les traiter ou les afficher dans le bon ordre dans l'administration. Mais cela créera simplement une nouvelle date JavaScript, installez-la dans la base de données. Ensuite, comme mentionné précédemment, pour récupérer le contenu de notre tableau, intégrez-le à notre commande afin de créer la propriété d'une pizza, qui sera elle-même un objet dans lequel nous allons fusionner les propriétés de notre panier . Comme il s'agit d'une référence, nous devons accéder à la valeur juste après la commande. C'est ici que nous allons utiliser la méthode AddDoc de Firestore pour transférer vers une collection particulière. Une collection est notre référence de commandes que nous venons d'importer. Appelez la méthode AddDoc, qui prend en compte le premier paramètre de référence d'audit de base de données, qui est une référence à notre plus ancienne collection, puis nous appliquerons cet ordre particulier à cette collection. Une fois que cela aura été fait avec succès, nous attendrons la fin de cette opération, puis nous pourrons réinitialiser la valeur de notre panier pour qu'elle soit un tableau vide. Cela effacera toutes les pizzas du panier, afin que l'utilisateur puisse recommencer. C'est tout ce dont nous avons besoin maintenant pour la section d'essai et pour tenir l'utilisateur au courant Nous allons créer une nouvelle variable pour contenir un message. Le message par défaut sera quelque chose comme si votre panier est vide, donc nous pouvons le voir ou s'il n'y a pas pizza sur le côté droit. Donc, composez le texte du panier, placez-le dans une référence, le texte de votre panier étant vide. Ce sera la valeur par défaut et nous pouvons la mettre à jour selon que la commande a été ajoutée avec succès ou non , en descendant vers la fonction. Passons à la section Essayer et, tout en bas, nous accèderons au panier text.value, et le mettrons à jour pour qu'il s'agisse de nouvelles chaînes, du type « Merci, votre commande a été passée ». l'autre section, et comme nous l'avons vu précédemment, vous pouvez également intégrer le message d'erreur si vous le souhaitez, mais pour plus de simplicité, je vais simplement mettre à jour le texte du panier pour qu'il s'agisse d'une nouvelle chaîne, qui sera égale à une erreur lors de votre commande. Je vais dire, s' il vous plaît, essayez à nouveau. Nous pouvons l'appeler à partir de nos composants. Nous devons renvoyer notre appel de fonction et nous devons également renvoyer le texte du panier afin de pouvoir l'afficher dans les composants. Au fur et à mesure que vous commandez, le texte du panier s'affiche dans la vue du menu . Rendez-vous ici, et nous pouvons maintenant les importer depuis notre composable. Ici, nous avons déjà une référence à notre panier d'utilisation composable Nous pouvons donc passer entre crochets et importer le texte du panier en même temps que ajouter une nouvelle commande. Commençons par ajouter une nouvelle commande, que nous pouvons déclencher à partir de notre bouton. Descendez dans la division du panier, et en bas, vous trouverez ce bouton de commande, maintenant en un clic, qui déclenchera notre fonction. La dernière étape consiste maintenant à ajouter le texte du panier et se souvenir que, par défaut, il indique que votre panier est vide Nous ne voulons donc pas l' afficher s'il s'agit déjà de nos articles dans le panier. Pour cela, le rendu conditionnel sera utile. Passons en haut de la section du panier, juste en dessous du titre. Créons des sections div contenant cela et à l'intérieur, nous utiliserons v-if, pour ajouter notre rendu conditionnel où nous voulons vérifier si la longueur du panier est supérieure à zéro, c'est-à-dire nous avons des articles dans le panier. Si c'est vrai, nous allons couper la section div de fermeture, puis descendre jusqu'à la fin, juste en dessous de nos boutons placer la commande, fermer celle-ci. Vous pouvez maintenant voir si vous allez dans la section panier, nous n'avons aucun de ces boutons ou le total de la commande. Mais tout cela créera un nouveau div, qui est la section v-else et cette section ne sera affichée dans le navigateur que s' n' y a aucun article dans le panier, ce qui est l'état actuel. Mais cela se placera à l'intérieur des doubles bretelles bouclées. En fait, nous allons y mettre un élément p pour commencer. Je vais mettre le texte du panier et nous voyons des erreurs. Voyons de quoi il s'agit. Nous n'avons pas de v-if adjacent, il s' agit donc de la section v-l et cela devrait être le v-if. Nous avons juste cette section div supplémentaire que nous pouvons supprimer, assurez-vous que c'est correct. Nous avons ce div, la balise d'ouverture, tout le contenu, la section de fermeture, v-else. Nous devons également déplacer ce div de fermeture avant tout ne soit correct. Maintenant, nous devons simplement assurer qu'après la section v-l, nous avons deux divs de fermeture supplémentaires, donc libres d'affilée. Puis, en haut du h3, du div, puis du tableau. Nous devrions maintenant voir dans le navigateur que le texte par défaut de votre panier est vide, cliquez sur n'importe quel article et la longueur du panier est maintenant supérieure à zéro. Nous pouvons donc afficher notre tableau. Ajoutons maintenant quelques articles supplémentaires à nos paniers et nous pouvons tester en cliquant sur le bouton « Passer la commande » , cela semble bon. Nous avons un message génial, passez à la console Firebase. Il s'agit de Console.firebase.google.com. My Pizza Planet V3 dans la base de données. Nous avons maintenant la plus ancienne collection, nous avons un numéro de commande, ça a l'air bien. Nous avons une Margherita de 9 pouces et deux de 12 pouces. Essayons un autre pepperoni de 12 pouces et Margherita, passez votre commande. Bien, tout fonctionne correctement et ensuite, nous allons récupérer ces commandes dans la base de données et les afficher dans l'interface d'administration. 37. Recherche de commandes: Nous pouvons maintenant passer des commandes avec succès et les ajouter à notre base de données. Nous avons maintenant pour tâche de récupérer ces commandes dans la base de données afin de pouvoir les utiliser dans notre projet, et en particulier dans la section d'administration. Plus tôt, nous avons créé une section des commandes en cours en bas de page. Nous allons les récupérer dans la base de données, les parcourir en boucle et les placer dans cette table. Pour garder les choses organisées, créez un nouveau composable dans le dossier des composables. Celui-ci s' appellera UseOrders. Comme toujours, nous devons exporter une fonction par défaut, UseOrders et y placer le code. Pour commencer, nous avons besoin d'une constante pour stocker toutes nos commandes. Nous appellerons cela AllOrders. Nous utiliserons également la référence qui va entourer notre tableau. Nous allons l'initialiser sous la forme d'un tableau vide , puis nous devons importer cette référence depuis le package de vue. Nous avons également besoin d'une fonction qui récupérera ces éléments de la base de données et les enverra à notre référence AllOrders. Nous allons créer une nouvelle fonction asynchrone, All GetOrders. Nous pourrions faire quelque chose de similaire à celui que nous avons utilisé par le passé. Si nous y jetons un coup d'œil, notre composable, qui était UsePizzas. À l'intérieur, ce que nous avons fait par le passé, c'est récupérer nos documents avec GetDocs. Nous avons cette fonction appelée GetPizzas. Celle-ci est un peu plus simple car tout ce que nous faisons doit appeler notre méthode GetDocs et transmettre une référence à toutes les collections de pizzas. Si nous le voulions, nous pourrions faire exactement la même chose en faisant référence à nos commandes. Mais pour ce cas d'utilisation, n'oubliez pas que dans la vidéo précédente, nous avons également introduit un nouvel ordre dans la base de données, qui incluait une propriété appelée CreatedAt. Quand on nous présente les pizzas de la collection AllPizzas qui n'étaient pas dans un ordre particulier. C'est là que cela fonctionne un peu différemment d'AllPizzas. Nous voulons nous assurer que nous extrayons les commandes dans un ordre particulier fonction des données dans lesquelles elles ont été créées. Retour à UseOrders. Pour ce faire, nous devons utiliser ce que l'on appelle une requête. Nous devons l'importer . Requête d'importation. Cela provient du package firebase slash firestore. À partir de notre fichier firebase.js, vous devrez également importer cette référence dans AllOrders. Revenons maintenant à notre fonction GetOrders, nous allons utiliser cette requête que nous venons d' importer. Requête. Ce que nous devons faire ici, c'est l'adopter en trois volets. La première est une référence à notre collection, qui s'appelle DBordersRef. Ensuite, nous pouvons également transmettre des paramètres de recherche supplémentaires. Dans notre cas, ce sera OrderBy. Orderby. Il s'agit également d'une méthode Firebase qui va ordonner le contenu que nous extrayons de notre base de données en fonction d'un champ particulier. Si tout ce que nous pouvons utiliser, nous devons également l'importer. Ensuite, nous transmettons le nom du champ par lequel vous souhaitez le classer. Dans notre cas, comme nous pouvons le constater lorsque nous avons créé une nouvelle commande, cette propriété s'appelle CreatedAt. Récupérez-la, collez-la, puis stockons cette référence dans puis stockons cette référence une constante appelée QueryData. À partir de maintenant, ce que nous faisons est assez similaire à ce que nous faisions lorsque nous avons récupéré les pizzas. Nous devons utiliser GetDocs. Nous devons ensuite parcourir ces documents, puis les intégrer à nos constantes. Dans cet esprit, nous allons copier l'intégralité de cette section. Juste au-dessus du bloc de saisie, vous pouvez copier les crochets. Ce sont les crochets pour chaque boucle jusqu'à nos documents. Copiez-le, collez-le juste en dessous de nos données de requête. Encore une fois, nous pouvons utiliser une grande partie de ces données. Nous pouvons conserver ce nom constant. Nous pouvons rechercher nos GetDocs. Tout ce que nous avons à faire au lieu de rechercher directement AllPizzas ou AllOrdersRef, nous allons transmettre notre QueryData filtrée, puis nous allons parcourir chacun de ces documents en boucle au lieu de créer une pizza et structurer une nouvelle commande. L'identifiant est accessible exactement de la même manière puisque chacun de ces documents revient de Firebase avec la même structure. Nous pouvons également fusionner les données du document, c' est-à-dire tous les champs d'AllOrder, tels que AllPizzas, et nos dates CreatedAt. La dernière différence réside dans cette ligne : au lieu de pousser vers AllPizzas, nous avons poussé vers AllOrders. Nous allons mettre AllOrder au lieu de la pizza. Nous allons le tester avant de le placer dans nos composants, juste en dessous de nos crochets pour boucle, place dans un journal de console ou allOrders, aucune valeur. Mais pour que ce journal de console fonctionne réellement, nous devons importer ce composable dans les composants requis. Il s'agira de la vue par points AllOrders, qui se trouve à l'intérieur des composants. Ensuite, dans le dossier d'administration, ouvrez AllOrders. Nous n'avons pas de script pour le moment . Créez un script, configurez, importez notre composable, qui est UseOrders. Ensuite, en utilisant la structuration, nous pouvons importer nos AllOrders, que je ne suis pas sûr d'avoir réellement renvoyés Nous allons donc y jeter un œil dans une seconde. Appelez notre fonction UseOrders. Revenez simplement en arrière. Nous devons renvoyer toutes les commandes pour utiliser ce bouton dans notre fonction. Retournez toutes les commandes. Ils devraient maintenant exécuter notre journal de console. Accédez à la section d'administration. Ouvrez la console. Nous ne voyons actuellement rien à l'intérieur car nous n'avons pas appelé notre fonction getOrders. Ce que nous allons faire, c'est simplement supprimer notre fonction, c'est de l'importer ou de la monter également. Nous exécuterons notre fonction appelée GetOrders dès que ce composant sera monté. Cela doit également être importé en haut. Nous devons également importer GetDocs depuis Firestore. Essayons encore une fois. Ouvrez le journal de la console dans la cible où nous pouvons voir que nous avons un tableau contenant deux commandes distinctes. Ils sont structurés exactement comme nous les avons créés. Dans cette commande, nous avons l'identifiant. Ensuite, nous avons fusionné le reste des données du document , à savoir l' objet pizzas et CreatedAt. Nous avons presque terminé cette vidéo. La prochaine chose que nous allons faire, La prochaine chose que nous allons faire juste pour terminer, est d'intégrer notre code dans un bloc try and catch. Accédez à la fonction GetOrders. Récupérez le contenu complet du journal de la console contenant le total des données de requête. Placez-le dedans, essayez et attrapez. Catch prend une erreur. Collez ensuite le contenu dans la section d'essai. Nous savons que cela fonctionne. Nous pouvons donc également supprimer ce journal de console. Nous allons laisser celui-ci là. Dans la vidéo suivante, nous passerons à nos commandes, les passerons en boucle et les placerons dans la vue d'administration. 38. Boucle de commandes: Nous savons maintenant que nous pouvons récupérer avec succès les commandes depuis Firebase et les stocker dans notre variable AllOrders. Nous les avons importés dans le fichier orders.view, et nous pouvons les utiliser pour les parcourir et les afficher dans le tableau. Il s'agit du tableau que vous voyez dans la vue d'administration en bas. Comme nous l'avons fait pour les pizzas ci-dessus, nous pouvons parcourir toutes ces données et afficher les valeurs correctes. La première chose à faire dans les commandes actuelles, que nous devons modifier cette valeur codée en dur de cinq. Nous pouvons obtenir la valeur réelle avec AllOrders.length. Nous savons actuellement que nous avons reçu deux commandes, donc cela semble correct. Ensuite, il y a les en-têtes du tableau. Nous n'avons pas besoin de mettre cette section en boucle car nous ne voulons pas d'en-têtes dupliqués, mais nous devons créer une boucle pour les deux lignes supplémentaires suivantes. La première rangée avec le numéro de commande et la deuxième rangée avec les détails de la pizza. Pour ce faire, nous allons créer un wrapper supplémentaire appelé template. Découpez ces deux rangées du tableau. Nous pouvons transmettre un élément appelé modèle, coller à nouveau, et nous pouvons maintenant utiliser ce modèle pour ajouter la boucle deux. Le modèle ajoutera un wrapper à cette section, mais il n'ajoutera aucun code HTML supplémentaire Il s'agit donc en fait d'un wrapper invisible. Placer dans une boucle avec v-for, commander dans AllOrders. Nous avons besoin d'une clé. Nous savons que nous avons une clé unique pour chaque commande enregistrée dans la pièce d'identité. Il s'agit de order.id. Nous pouvons également utiliser ce order.id au lieu de ce numéro de commande. Ensuite, nous pouvons accéder aux informations sur nos pizzas qui sont stockées dans cette ligne. N' oubliez pas que pour chaque commande, nous n'avons pas qu'une seule pizza Nous devons donc créer une boucle supplémentaire pour parcourir chacune des pizzas de notre commande. Par exemple, nous sommes actuellement en train de passer revue cette première commande ici. Nous devons ensuite parcourir orders.pizzas en boucle pour accéder à toutes les valeurs qu'il contient et les afficher sous forme de données de tableau. v-for, et nous dirons «  commandez l'article dans l'ordre ». commande est l'OrderItem complet, que vous avez depuis la première boucle, mais nous voulons accéder aux pizzas. Nous pouvons voir si nous nous dirigeons vers la console et que nous sautons dans les pizzas, nous n'avons pas enregistré l'identifiant de pizza pour chacune d'entre elles. Mais le nom et la taille de chaque pizza sont également uniques, nous pouvons donc créer une clé à partir de ceux-ci. Nous dirons OrderItem.name. Nous verrons OderItem.size. Nous pouvons accéder à l'OrderItem sur les propriétés de la pizza telles que le nom, la taille, la quantité et le prix. Le premier est le nom, le second est la taille, donc OrderItem.size, la quantité. C'est à vous de décider comment vous souhaitez gérer ce prix à afficher dans le tableau d'administration. Si vous le souhaitez, vous pouvez tout d'abord essayer de générer le OrderItem.price. Si nous allons dans l'administrateur puis actualisons, nous pouvons voir notre structure. Nous avons le numéro de commande, le nom de la pizza, la taille , la quantité et le prix sera affiché sous forme de prix unique pour une pizza. Si vous le souhaitez, comme nous l'avons décrit ici où nous avons dit que c'est le total. Je vais multiplier le prix par la quantité. Multiplions avec l'étoile par OrderItem.quantity. Il s'agit maintenant du total pour chacune de ces lignes. Ensuite, nous allons revenir à ces commandes, et nous verrons comment supprimer des articles notre base de données à l'aide de cette croix rouge. 39. Suppression de commandes: Nous allons maintenant nous concentrer sur la manière de supprimer les commandes. Si nous passons au fichier composable UsePizzas, celui-ci utilise le même processus que utilisé auparavant lorsque nous avons supprimé les pizzas. Nous avions cette fonction appelée delete pizza, qui prenait un identifiant, nous effasions tous les messages d'erreur existants, puis nous stockions une référence de document en accédant à notre collection, ainsi que l'identifiant. Nous avons appelé une méthode appelée DeleteDoc qui a intégré la pizza que nous venons de référencer, puis finalement nous avons appelé GetPizzas, qui a extrait toutes les autres pizzas qui étaient toujours disponibles. Donc, pour que les choses restent simples et agréables, nous allons copier l'ensemble de cette fonction, puis entrer dans le fichier le plus ancien utilisé et le coller dedans. Bien entendu, nous devons apporter quelques petites modifications que nous appellerons cet ordre de suppression. Encore une fois, cela nécessitera toujours la transmission d'un numéro de commande. Nous effacerons également tout message existant. Ce sera un ordre constant, ce sera le DBordersRef, et nous supprimerons cet ordre. getOrders et dans l'appel de fonction celui-ci doit correspondre celui que vous avez juste au-dessus. Nous pouvons ensuite modifier le message, une erreur s'est produite lors de la suppression de la commande. Ensuite, cela nécessitera également une importation supplémentaire, nous devons extraire notre document. Nous devons intégrer DeleteDoc, et nous devrons également créer ce message Passons donc à nos importations. Depuis Firestore, nous devons référencer notre document et supprimer le document. Puisque nous traitons nos commandes, nous avons déjà reçu l'impulsion des commandes juste ici, donc c'est très bien. Nous avons donc le message. Nous devons ensuite le créer en tant que ref, message const est égal à une ref, que nous définirons initialement comme une chaîne vide. Nous l'avons déjà importé, donc c'est bon. Nous devons ensuite renvoyer certaines valeurs de ce composable vers la section de retour. Nous y reviendrons, je supprimerais toute la méthode ainsi que le message à afficher à l'intérieur des composants. Nous allons ensuite passer à nos composants dans le dossier admin et dans les commandes, le orders.view, où nous pouvons ensuite créer des importations. Nous sommes déjà en train d'importer notre fichier de commandes d'utilisation, afin de pouvoir ensuite déstructurer, supprimer la commande et également notre message. Tout d'abord, nous appellerons ordre de suppression si nous examinons la section d' administration, puis si nous descendons. Nous nous souvenons donc tous que chacun de ces numéros de commande comporte une petite croix, qui est un bouton, et cela va appeler notre méthode, à laquelle nous pouvons transmettre le numéro de commande. C'est le bouton qui se trouve juste ici. La classe de btn remove. Nous écoutons maintenant un clic, que nous appellerons ordre de suppression, et l'ordre de suppression prendra en compte le numéro de commande, que nous allons transmettre à cette fonction. Je vais devoir le récupérer dans notre boucle afin que nous puissions commander l'identifiant que vous avez déjà utilisé. Nous pouvons simplement le mettre entre crochets, et cela sera transmis à notre fonction. Essayons ça. Dans le projet. Nous n'avons que deux commandes à l'intérieur pour le moment. Nous allons essayer de supprimer celui-ci. Nous constatons que cela passe à trois commandes maintenant, mais nous devons actuellement actualiser pour voir les mises à jour. Mais c'est bien pour le moment, nous y reviendrons dans le futur et nous améliorerons cela en ajoutant nos fonctionnalités en temps réel à partir de notre base de données. Cela signifie que dès que modifications seront apportées à la base de données, notre application sera mise à jour avec les nouvelles valeurs. Enfin, n'oubliez pas que nous avons également importé ce message en haut. Ce que nous pouvons faire, c'est l' afficher juste en dessous notre en-tête dans l'élément P. Non seulement nous devons afficher le message à l'intérieur, mais nous devons également ajouter un rendu conditionnel. Nous ne voulons pas que ce message soit toujours affiché ou qu'il occupe l'espace qu'il occupe actuellement. Si nous y jetons un coup d'œil, que nous la supprimons et que nous l'enregistrons, vous pouvez voir si nous la commentons et appuyons sur « Enregistrer ». Cette section occupera de la place, qu'il y ait Cette section occupera de la place un message ou non. Nous allons donc faire pour ne l'afficher que s'il y a un message, en plaçant la section v if pour n'afficher que s'il y a un message en place, et pour le style, nous allons également ajouter la classe d'erreur. 40. Afficher et masquer les blocs d'administration: La vue d'administration peut sembler correcte pour le moment, mais imaginez si notre application était beaucoup plus grande et que nous avions beaucoup plus de pizzas dans le menu ou de nombreuses commandes. Cette page peut être très longue. Pour y remédier, nous allons maintenant afficher et masquer chacune de ces sections. Cela rend la page beaucoup plus petite et nous n'avons pas besoin de lire toutes ces informations. Pour cela, nous allons créer une variable locale dans chacun de ces composants d'administration gratuits, qui sera ensuite alternée avec le texte de show and hide. Pour commencer, sautez dans la barre latérale. Les composants, l' administration et la nouvelle pizza. Eh bien, nous allons créer une nouvelle constante locale appelée show NewPizza. Définissez cette valeur sur ref et configurez notre ref, qui sera égale à la valeur true. Nous l'afficherons par défaut. Cela sera visible dans l' administrateur, puis une fois qu'un utilisateur aura cliqué dessus, cela deviendra faux. Nous allons le faire dans nos modèles et dans la section d'en-tête juste en dessous de notre titre, à l'intérieur des petits éléments. À l'intérieur, nous voulons vous montrer le texte de l'option Afficher ou masquer. Nous pouvons également afficher cette section de manière conditionnelle à l'intérieur des doubles bretelles bouclées. Ce que nous pouvons faire, c'est dire que si show NewPizza est égal à deux, nous affichons le texte de hide. Si ce n'est pas le cas, nous dirons show. Actuellement, cela est défini sur true, nous verrons donc le texte de masquer en haut. Nous pouvons ajouter la classe ToggleBtn. Écoute un clic quand je clique. Tout ce que nous voulons faire ici est de rechercher votre NewPizza soit égale à que votre NewPizza soit égale à l'opposé de la valeur actuelle . Essayons ça. Cliquez sur Masquer. Cela va maintenant basculer et nous pouvons ensuite utiliser notre variable show NewPizza pour afficher et masquer cette section complète. La section que nous voulons afficher et masquer est le formulaire. Nous pouvons toujours garder la tête en place, qui comporte le bouton et aussi le titre. Dans le formulaire, ajoutez v-show qui n'affichera ce contenu que si la valeur de show NewPizza est égale à deux. Il n'est pas en train de revenir en arrière pour le moment. Essayons de rafraîchir. Cela semble bien fonctionner. Je ne suis pas certain de ce qui s'est passé là-bas. Nous pouvons désormais reproduire cette section dans les commandes ainsi que dans le menu. Passons aux commandes. Importez notre vue de référence. Créez une variable locale. Celui-ci peut être des commandes à montrer. La valeur initiale de true. En fait, ce que nous allons simplement faire ici, c'est copier la section NewPizza que nous avons créée, donc la petite section complète. Apportez-le pour que ce soit cohérent. Placez-le juste en dessous de nos commandes en cours, rubrique Niveau 3, dans la même classe. Cette fois, tout ce que je veux faire est de changer cela pour afficher les commandes. Modifiez cela dans toutes les autres sections. Nous voulons ensuite montrer et masquer. Notre tableau serait affiché de la même manière que les commandes. Essayons ça. Elle peut se cacher. Cela a disparu. Ensuite, l'affichage révèle cette section. Enfin, la section menu, qui se trouve dans les pizzas ou Vue. Nous devons également importer ref vue. Notre variable locale appelée ShowMenu, la valeur initiale est true, puis, comme avant, dessous de notre titre de niveau 3, nous devons à nouveau copier cette petite section, coller dedans, puis remplacer toutes nos variables par ShowMenu. Enfin, ajoutez v-show à notre tableau. Essayons ça. Le menu, le masquage et l'affichage. Juste comme touche finale rapide. Si nous survolons ce bouton, nous pouvons le transformer en pointeur. Nous avons une classe de ToggleBtn pour chacune de ces sections. Comme nous l'utilisons dans plusieurs composants, accédez à nos actifs et à la classe main.css de ToggleBtn. Nous allons définir le curseur comme un pointeur. Nous y voilà. Cela fonctionne désormais pour nos trois sections. 41. La fonction d'inscription: Ce projet va utiliser l'authentification Firebase pour gérer les comptes utilisateurs et leur permettre de s'inscrire et de se connecter. Si nous accédons à la console Firebase et à la section Présentation du projet, vous devriez voir juste en dessous que nous avons notre authentification et notre configuration des raccourcis de la base de données Firestore. En effet, dans les premières vidéos, nous les avons déjà activées dans notre projet. Mais si vous n' avez pas encore configuré l'authentification, il vous suffit de vous rendre dans la section Tous les produits et de l' ajouter à l' aide de ce lien d'authentification. Comme le mien est déjà activé, je vais retourner au projet pour le configurer. Faisons en sorte que les choses restent organisées. Créons un nouveau composable dans le dossier des composables, un nouveau fichier. Celui-ci va être useAuth.js. Ensuite, comme pour tous les autres composables, nous exporterons une fonction par défaut. Celui-ci est UseAuth. Ensuite, nous ajouterons un relevé de retour en bas avant d'oublier. Comme nous n'avons actuellement aucun utilisateur dans notre projet, il serait logique que la première fonction que nous ajoutions soit de créer un nouvel utilisateur. Pour cela, nous devons importer certaines fonctions du package d'authentification Firestore Firebase. Au-delà de notre fonction, nous allons maintenant effectuer ces importations. Ce dont nous avons besoin pour importer est quelque chose appelé GetAuth. De plus, pour créer un nouvel utilisateur, nous devons importer une méthode appelée créer utilisateur avec e-mail et mot de passe. C'est un étui entièrement en forme de chameau. Après le premier mot , assurez-vous que chaque mot suivant commence par une majuscule. Nous allons l'importer depuis Firebase/Auth. Ensuite, nous allons utiliser cette importation GetAuth, qui va initialiser l'authentification Firebase. Ensuite, nous allons commencer à le référencer à l'intérieur d'une variable. Participez à notre fonction. Appelez cette authentification, qui est égale à getAuth. Comme il s'agit de notre méthode, nous devons l'appeler entre crochets, la fonction d'authentification suivante, qui va créer un nouvel utilisateur. Cela va être asynchrone appelé inscription. Lorsque nous nous inscrivons, étant donné que nous créons un utilisateur avec un e-mail et un mot de passe, nous avons également besoin de passer à cette fonction lorsque nous l'appelons. Nous verrons bientôt comment procéder dans corps de la fonction ou dans la gestion des erreurs. Créez une zone d'essai et de capture, en transmettant l'erreur. Ensuite, dans la section d'essai nous allons appeler la fonction de création d'un utilisateur avec e-mail et mot de passe, que nous venons d'importer. Attendons la valeur de retour. Créez un utilisateur avec e-mail et mot de passe. Cela va prendre en compte trois éléments distincts. La première est une référence à l'instance actuelle, qui est celle que nous avons configurée en haut. Il doit également contenir l' e-mail et le mot de passe. Nous y sommes. De plus, pour stocker les messages d'erreur, nous pouvons créer une nouvelle variable réactive. Pour cela, nous devons d'abord importer la référence depuis vue et créer notre constante juste en dessous dans la fonction appelée ErrorMessage. Configurez ensuite notre référence, qui sera initialement une chaîne vide. Nous y sommes. Si cette section est maintenant réussie, si la zone d'essai fonctionne correctement, nous pouvons alors effacer tous les messages existants. Nous allons réinitialiser le ErrorMessage.value pour qu'il revienne à une chaîne vide. Ensuite, dans la section d'erreur, nous pouvons également mettre à jour ce message d'erreur. Si nous procédons par exemple à l'inscription d'un utilisateur, nous ne voulons pas simplement renvoyer un message d'erreur générique, tel que « une erreur s'est produite, un problème s'est produit lors de la connexion  » ou quoi que ce soit d'autre. Il serait logique d' être un peu plus descriptif quant à la nature de l'erreur. se peut qu'ils ne saisissent pas un mot de passe suffisamment long, qu'il ne contienne pas les caractères corrects ou que l'e-mail soit déjà utilisé. Pour cela, nous devons accéder à notre erreur, qui est transmise à la zone de capture. Nous avons une propriété appelée code. Ce code est une chaîne de texte qui équivaut à un message d'erreur, et les deux plus courants fournis par Firebase sont une chaîne appelée auth/email déjà utilisée. Ça ressemble à ça. C'est auth/email déjà utilisé, avec des tirets entre chacun de ces mots. Auth/Weak-Password est également un autre outil utile. Ces messages seront utiles à transmettre à l'utilisateur. Mais d'abord, nous devons nous assurer de pouvoir détecter lequel d'entre eux est généré à l'intérieur de notre erreur. Nous pouvons le placer dans une instruction if-else, nous pouvons le placer dans une instruction switch, selon votre préférence. Je vais opter pour l'interrupteur. Nous pouvons y ajouter plus tard si nous voulons accéder à l'erreur, qui est transmise à notre objet catch , nous pouvons accéder au code. Ensuite, nous pourrons commencer à élaborer nos dossiers individuels. le premier cas, nous allons vérifier la présence de cette chaîne juste ici. Collez ceci dedans. Si cela est vrai, s'il y a une correspondance, nous voulons définir la valeur ErrorMessage.value. Pour être un peu plus descriptif, disons qu'un utilisateur avec cette adresse e-mail existe déjà, veuillez vous connecter. Si cela est vrai, nous pouvons alors sortir de ces instructions de commutation. Nous n'avons pas besoin d'aller plus loin dans un autre code. Le second cas est égal à notre deuxième corde, que nous avions en bas de l' écran. Déplaçons ça. Collez-le comme dans notre étui. Si l'utilisateur saisit un mot de passe faible, il s' agira d'un ErrorMessage.value. Nous allons mettre à jour cette variable pour indiquer que le mot de passe doit comporter au moins six caractères. Nous en sortons ensuite si celle-ci est vraie. Enfin, avec l'instruction switch, nous devons également ajouter un message par défaut en bas de page. Ceci est utile si l'un des cas ci-dessus ne correspond pas, revenez à la section par défaut, qui mettra à nouveau à jour le ErrorMessage.value. Celui-ci peut être un peu plus générique. Nous allons dire que nous sommes désolés, une erreur inattendue s'est produite. C'est tout ce dont nous avons besoin dans notre fonction d'inscription pour le moment. La dernière chose à faire est de renvoyer notre fonction d'inscription ainsi que notre message d'erreur. Les deux seront désormais disponibles pour les appels depuis nos composants. C'est ce que nous ferons ensuite lorsque nous créerons le formulaire de connexion. 42. Créer le formulaire de connexion: Grâce à notre fonctionnalité d'inscription qui fonctionne désormais, nous avons également besoin d'un formulaire pour saisir les informations de l'utilisateur. Pour cela, ce formulaire sera à double usage. Cela permettra à l' utilisateur de se connecter et de s'inscrire pour créer un nouvel utilisateur. Pour cela, passons à notre barre latérale et nous pouvons créer nos nouveaux composants. Passez aux composants, et celui-ci s'appelle Signin.vue. Tout d'abord, nous allons créer la section de script qui utilisera la configuration. En haut, nous allons importer notre utilisation de composable, que nous avons créée dans la vidéo précédente et la définir comme étant @, qui est la racine de notre source, composable UseAuth. Récupérez nos variables que nous avons exportées lors de la première inscription. Nous avons également besoin de notre message d'erreur. Récupérez-les à partir de la fonction UseAuth ci-dessus. Ça doit juste venir , on y va. Également une variable de données de formulaire pour stocker l'e-mail et le mot de passe saisis par l'utilisateur. Nous allons le lier à notre formulaire à l'aide de v-bind. C'est ce que l'on appelle les données utilisateur. Nous devrons également importer la référence depuis le package vue. Configurez-le comme un objet, qui contiendra simplement l'e-mail et le mot de passe. Par défaut, les deux champs seront vides car l'utilisateur n'a saisi aucune valeur. Importez ensuite notre référence depuis Vue. Accédez à la zone du modèle pour créer le formulaire. Comme celui-ci sera un modal contextuel afin que nous puissions l'afficher et le masquer à l'aide de CSS, nous devons créer quelques wrappers pour l'activer. Le premier sera un div avec la classe de modal, qui est le wrapper principal. Ensuite, imbriqué à l'intérieur, un deuxième div avec la classe modal_content sera créé . Ce modal sera activé à l' intérieur de l'en-tête. Ce que nous allons bientôt faire, c'est créer dans l'en-tête un lien vers le haut, qui fera ensuite apparaître notre modal de tous ces contenus. Ensuite, dans le modal, nous voulons également créer une petite croix dans le coin, qui fermera ensuite ce modèle. La fermeture sera une période et la classe pour notre style de close_modal. La fermeture sera une entité HTML, qui est l' esperluette, le hachage. Puis 10060 et un point-virgule. Un élément p ci-dessous, celui-ci sera pour le texte, veuillez donc vous connecter pour continuer. Ajoutez une classe pour notre style de modal_text. Ensuite, en dessous, nous allons créer un formulaire permettant à l'utilisateur de se connecter. Nous n'avons pas besoin d'action, nous nous en occuperons avec le futur oui. Tout ce dont nous avons besoin ici, c'est d'une entrée pour notre e-mail, d' une entrée pour le mot de passe. Nous allons également créer deux boutons. Commençons par notre section e-mail, qui sera un div en tant que classe wrapper de form_group. Le libellé de l'adresse e-mail du formulaire. La saisie pour celui-ci, puisqu'il s'agit d'un e-mail, nous allons lui donner le type d'e-mail, l'identifiant de l'e-mail, le texte de remplacement de l'e-mail saisi. Ensuite, nous pouvons également utiliser le modèle v pour lier la valeur de cette entrée à nos données utilisateur juste au-dessus. Nous devons accéder à UserData.email. Nous y sommes. Cette entrée contient également l'identifiant du courrier électronique. Nous pouvons le lier à notre étiquette, puis copier notre section div. Celui-ci est pour le mot de passe. Collez-le juste en dessous. L'étiquette pour le mot de passe et pour la saisie, le type de celui-ci est également mot de passe, l'identifiant est le même. L'espace réservé à la saisie du mot de passe. Cela doit le lier à UserData.password. Ensuite, nos deux boutons en bas, juste en dessous de notre div. La première est la connexion. Placez dans un bouton le type de bouton, le texte de connexion. Dupliquez-le ou copiez-collez. Maintenant, ce que nous devons faire, c'est modifier ce texte pour nous inscrire. Plus tard, cela donnera à l'utilisateur la possibilité de se connecter ou de s'inscrire en utilisant le même formulaire modal. Nous y sommes. Nous avons créé de nouveaux composants modaux de connexion. Pour le voir, nous devons l'importer exactement là où nous le voulons dans notre projet. Comme mentionné précédemment, ce sera à l'intérieur de l'en-tête afin que nous puissions voir le texte tout en haut. Passons à l'en-tête jusqu'à la section du script. En fait, nous n'avons pas de script, alors créons-le maintenant. Configuration du script. Nous allons importer nos composants, c' est-à-dire la connexion. Le chemin du fichier, puisque nous sommes à l'intérieur des composants, est simple. /Connectez-vous dans .vue. Placez ensuite les composants en haut de la section d'en-tête. Vous vous demandez peut-être pourquoi nous ajoutons un formulaire de connexion dans cette zone d'en-tête, mais cela deviendra plus clair très bientôt. Mais en le plaçant dans l'en-tête pour le moment, nous conserverons ce groupe avec les boutons de connexion et d'inscription, qui s'afficheront très bientôt en haut de l'en-tête. Nous cliquerons sur un bouton, le formulaire apparaîtra et nous pourrons le fermer avec cette croix en haut. De plus, cela semble un peu compliqué pour le moment, mais nous corrigerons cela plus tard avec notre style. Pour l'instant, concentrons-nous sur le formulaire et sur l' inscription d'un utilisateur. Revenons aux composants de connexion que nous venons de créer. Puisque nous avons créé la fonction d'inscription dans notre composable, nous allons travailler avec ce bouton d'inscription situé en bas, et nous le lierons à la fonction à l' aide d'un écouteur de clics. Nous pouvons empêcher le comportement par défaut, qui consiste à actualiser la page, appeler notre fonction d'inscription, à appeler notre fonction d'inscription, qui prendra en compte l'e-mail et le mot de passe lors de la configuration dans notre composable. Les deux sont disponibles dans le script. Nous avons les données utilisateur, l'e-mail et le mot de passe. Transmettons ces deux valeurs. Il y a d'abord le UserData.Email, puis le UserData.Password. Cela devrait être tout ce dont nous avons besoin pour la fonction d'inscription. N'oubliez pas que nous avons également importé le message d'erreur. Affichons-le juste en dessous nos éléments p avec le texte «  Veuillez vous connecter pour continuer ». Placez-le dans une plage avec la classe error_message. À l'intérieur des doubles bretelles bouclées , notre message d'erreur s'affiche. Nous y avons fait pas mal de choses. J'espère que tout cela fonctionne. Passons au projet, ça nous permet de faire une sauvegarde. Nous allons créer un nouvel utilisateur pour continuer. C'est un peu difficile à voir, mais nous corrigerons ce problème dans le CSS très bientôt. Entrez une adresse e-mail et un mot de passe. Il suffit de voir ceci. Si je passe la souris dessus, clique sur le bouton « S'inscrire ». Pour le moment, nous ne recevons aucun commentaire. Nous n'avons donc pas de message d'erreur, Nous n'avons donc pas ce qui est bon signe. Nous fermerons également ce formulaire automatiquement après la connexion et l'inscription. Mais pour l'instant, revenez à la console dans la section d'authentification, mais nous devrions voir l'utilisateur, qui vient de s'inscrire. 43. Style modal: [CONTEXTE] Nous avons actuellement ce modal pas très beau qui contient les composants de connexion. Dans le sign-in.view, nous pouvons commencer à ajouter du style en ciblant toutes ces classes. Le div principal qui entoure tous les modaux possède cette classe de modal. Nous avons alors le contenu modal qui est contenu à l'intérieur. Ils peuvent désormais être utilisés pour styliser notre modal et faire apparaître au-dessus du reste du contenu. Nous descendons tout en bas pour créer la section de style, qui sera étendue à ce composant. Comme nous l'avons vu, le wrapper principal qui entoure tout ce div a la classe modal. Ce que nous allons faire ici, c'est cibler ce modal, qui est le wrapper complet. Nous allons étirer cette enveloppe sur toute la largeur et la hauteur de la page. Nous pouvons ensuite définir une couleur d'arrière-plan plus foncée afin de ne pas voir le contenu sous-jacent autant. Ensuite, sur le div suivant, qui est imbriqué à l'intérieur, qui est le contenu modal. Ce sera un peu plus petit. Il aura également une couleur de fond blanc pour le faire ressortir de tout le contenu sous-jacent. Tout d'abord, la section modale. Le modal aura une position fixe et il se distinguera du reste du contenu par un indice [inaudible] correspondant à un nombre élevé, tel que 999. Cela garantira que cet arrière-plan complet apparaît sur l'ensemble du contenu existant. Pour que ce modal se démarque, nous devons également définir la largeur à 100 vw. Toute la largeur du belvédère. La hauteur, 100 vh, soit 100 % de la hauteur du belvédère. L'arrière-plan, ce serait une couleur RGBA. Ce que nous allons faire pour le rouge, le vert et le bleu, c'est de définir ce paramètre sur zéro, qui est la couleur noir foncé. Nous allons définir l'opacité à 0,9. Il est légèrement transparent. C'est l'effet que nous recherchons. C'est la couleur de fond la plus foncée qui est légèrement transparente. Nous pouvons également le placer dans le coin supérieur gauche, afin de ne pas avoir cet espace en haut. Nous pouvons également utiliser la flexbox pour centrer tout le contenu. Tout d'abord, le sommet est nul. Nous ferons de même pour la gauche. Assurez-vous qu'il n'y a pas de trous sur le bord. Type d'affichage de Flex. Ensuite, nous nous assurerons que tout le contenu est aligné verticalement et horizontalement en plaçant la propriété justify-content au centre. Il en va de même pour aligner les éléments. Cela devrait être tout ce dont nous avons besoin à présent. Nous avons maintenant ce modal au centre. Tout son contenu au centre sera placé sur un fond blanc pour être plus visible. Cela a une classe si nous sauvegardons le contenu modal. Sélectionnez cette option, l'arrière-plan peut être de la couleur de votre choix. Je vais utiliser de la fumée blanche. Il a également besoin d'un peu d'espacement, de rembourrage. Nous en définirons la largeur, le rayon de bordure et centrerons également tout le contenu à l'aide de la flexbox. Nous allons définir la propriété de largeur à 80vw. N'oubliez pas d'utiliser un rembourrage sur tous les côtés pour donner un peu d'espace à l'intérieur , un petit rayon de bordure. Disons trois pixels. Nous allons également définir le type d'affichage pour qu'il soit flexible. La raison pour laquelle nous allons le faire est que nous allons définir, si nous remontons au sommet, nous allons utiliser cette zone flexible, en particulier à cause de ce bouton modal fermé. Nous voulons que cela soit terminé sur la droite, ainsi que le texte qui se trouve juste en dessous. Mais nous y reviendrons dans un instant. Mais maintenant, nous avons besoin que la direction de flexion se trouve dans une colonne, ce qui réinitialisera le contenu à la verticale. Couleur et valeur RGB de 76, 76, 76. Vous pouvez également voir dans ce texte que nous avons hérité de cette ombre technologique. Nous pouvons remplacer cette méthode par la propriété text-shadow en la définissant sur non. Passons maintenant à nos boutons. Nous pouvons sélectionner le contenu modal. À l'intérieur, nous avons nos deux boutons. Nous pouvons ajouter un cluster individuel, chacun d'entre eux si vous le souhaitez, ou à la place, nous pouvons utiliser du CSS pour sélectionner le contenu modal et le bouton qui suit, qui est le premier du type. Cela va sélectionner le tout premier bouton à l'intérieur de notre contenu modal, qui est notre connexion. Nous pouvons utiliser ces deux espaces avec une marge sur la droite. Nous allons également lui donner un aspect légèrement différent en réglant la couleur d'arrière-plan une valeur RGB de 163, 204, 163. Comme vous pouvez le constater, cela a sélectionné la toute première occurrence de ce bouton. Nous avons défini la couleur d'arrière-plan et y avons également ajouté de l' espace sur le côté droit. Ensuite, pour l' état de survol, vous ajouterez une petite transformation à cela. Encore une fois, nous allons récupérer le contenu modal, sélectionner tous les boutons qu'il contient. Ne l'appliquez que lorsque vous passez la souris dessus. Transformez. Agrandissez-le légèrement. Nous pouvons utiliser l'échelle. La valeur d'échelle de 1 est exactement ce qu'elle est actuellement. Pour l'agrandir légèrement, nous pouvons le régler sur 1.03, ce qui nous donne une belle transformation lorsque vous passez la souris sur chacun de ces boutons. Ensuite, remontons vers le haut où nous avons cette section modale fermée. C'est la durée dont nous venons de parler. N'oubliez pas que nous avons défini le contenu modal pour utiliser la flexbox. Par conséquent, étant donné que le modal fermé en est un élément secondaire, nous pouvons alors utiliser certaines propriétés de flexion. Pour ce faire, sautez vers le bas saisissez tous les modaux proches. La propriété de flexion de align-self et la valeur de flex-end. Ce que cela va faire, cela ne s'appliquera qu' à cet élément actuel. Sur la gauche, ce sera le Flex Start. Sur la droite se trouve l'extrémité flexible. Nous n'avons été qu'un bouton et nous pouvons définir le curseur comme un pointeur. C'est désormais chose faite. Que reste-t-il ? Nous avons le texte. Juste ici, nous pouvons le placer au centre. Celui-ci, si nous y jetons un coup d'œil, contient la classe du texte de soulignement modal, saisissez-le, définissez align-self comme étant égal au centre. Il place désormais nos textes au centre de la page. Réduisons simplement cela. La largeur de cette section convient à la vue mobile. Mais si nous étendons cela à la vue plus large que nous avons vue, nous voulons probablement que ce modal soit un peu plus étroit. Passons à une requête multimédia Nous pouvons le faire @media et nous ne l'appliquerons que lorsque la taille de l'écran est de 900 pixels ou plus. Sélectionnez le contenu modal. Je vais y aller, régler ça sur 40vw. Essayons cela en dessous de 900 pixels. Ensuite, plus de 900 pixels réduiraient la taille. Presque là, la dernière chose à laquelle nous devons nous occuper est cette période avec la classe de message d'erreur. Pour cela, je vais simplement ajouter un exemple de texte. Nous pouvons le voir. Définissez la couleur rouge et un espace en dehors de la requête multimédia. Récupérez notre error_message. La couleur 255, 104, 104. C'est la couleur rouge et elle a également besoin d'un peu d' espacement sur la gauche. Ajoutons une marge sur la gauche uniquement. Ça a l'air plutôt bien. Maintenant, nous pouvons simplement revenir au message d'erreur. Je supprime l'exemple de contenu d'ici. Nous y sommes. C'est maintenant notre style terminé pour le modal. À venir, nous verrons comment fermer ce modal lorsque nous cliquons sur ce X. 44. Basculer modal: Ce modal a maintenant une bien meilleure apparence. Nous aurons également besoin d'un moyen de l'ouvrir et de le fermer. Pour cela, passons à notre composable, qui est useAuth.js. Ensuite, à l'intérieur, nous allons créer une nouvelle variable qui contiendra l'état ouvert actuel. Il s'agira d'une valeur booléenne, que nous définirons comme une valeur initiale fausse. Cela s' appellera SignInModalOpen, sera intégré à une référence et à la valeur initiale false, puis créera ci-dessous une nouvelle fonction qui false, puis créera ci-dessous une nouvelle fonction qui fera passer cela en vrai ou en faux. Fonction ToggleModal. Tout ce que nous avons à faire ici est de récupérer le nom de notre variable, qui est SignInModalOpen, définir la valeur comme étant égale à l'opposé avec le point d'exclamation, donc SignInModalOpen.value. Si c'est faux, cela rendra vrai et si c'est vrai, cela définira alors le contraire, ce qui est faux. Renvoie les deux à partir de ce fichier afin que SignInModalOpen, ToggleModal, puis saute dans un composant qui se connecte. Je dois importer les deux depuis UseAuth ToggleModal et SignInModalOpen. La constante SignInModalOpen contrôlera si l'utilisateur peut voir ce formulaire Nous devons donc l'ajouter à notre wrapper dans ce div avec la classe de modal at v if statements, qui est égale à cette valeur. Maintenant, si nous l'enregistrons, parce que la valeur initiale est fausse, elle est maintenant supprimée. Revenons ensuite à notre modèle, où nous avons cette plage, qui consiste à fermer le modal. Nous pouvons écouter un clic, ce qui déclenchera notre fonction appelée ToggleModal. Comme nous savons que cette constante SignInModalOpen est définie la valeur initiale false, donc pour voir réellement ce modal, nous devons créer un bouton, qui va le changer pour qu'il soit vrai. Le problème que nous avons actuellement est que tout ce contenu dans le modal est masqué par défaut. Par conséquent, pour voir réellement ce bouton, nous devons créer un bouton en dehors de ce div principal avec le texte de connexion. Cela doit également être attentif à un clic, qui déclenchera ToggleModal. Style de la classe sign_in_btn. Sauvegardez-le et nous pouvons maintenant l' essayer dans le navigateur. Voici notre bouton de connexion. Cliquez dessus. Cela va maintenant faire en sorte que cela soit vrai, affichant ainsi le modal. Cliquez sur la croix pour la masquer. Juste pour terminer, déplaçons ce bouton dans le coin supérieur droit et nous pouvons également supprimer cette bordure. C'est le bas de notre section de style. Prenons notre bouton de connexion, donc sign_in_btn, le tout séparé par des traits de soulignement. Supprimez la bordure dont la valeur est none. Ensuite, en utilisant la flexbox, nous pouvons utiliser une ligne self. Nous l'avons configuré pour qu'il soit flexible. Maintenant, poussez-le sur le côté droit. Pour rendre cela plus visible, nous pouvons remplacer la couleur en héritant de cette couleur plus claire de notre parent. Enfin, nous allons également accéder à notre bouton de connexion en le survolant et lui donner un petit changement de couleur. RGB 161, 132. Voyons à quoi cela ressemble. Nous y sommes. Maintenant, notre modal va basculer entre ouverture et fermeture, ce qui fonctionne très bien. Les prochaines étapes consisteront à connecter l'utilisateur et à le déconnecter également. 45. Se connecter et sortir: Notre formulaire de connexion est conçu pour être à double usage. Nous l'avons déjà utilisé pour connecter de nouveaux utilisateurs, mais nous l' utiliserons ensuite également pour connecter les utilisateurs existants garder les choses bien organisées. Nous allons intégrer cette fonction de connexion à notre utilisation de composable. Ensuite, en cas de désactivation, nous avons notre fonction d'inscription . Ajoutons-y également une fonction de connexion. Avant cela, nous pouvons également importer une méthode depuis Firebase. Avant, nous devions CreateUserWithEmailAndPassword, mais maintenant, nous avons besoin de SignInWithEmailAndPassword. Assurez-vous que tout est composé d'une virgule afin que chaque mot commence par une majuscule après le premier. Il sera chargé de connecter tous les utilisateurs existants. Créons une fonction que nous appellerons à l'intérieur de laquelle nous allons l'appeler. Une fois que l'utilisateur a cliqué sur le bouton « Connexion » à l'intérieur de ce modèle. Une grande partie du code sera similaire à la fonction d'inscription. Nous avons le bloc try-catch Nous appellerons ensuite notre méthode Firebase particulière, et nous devrons également gérer les messages d'erreur. Ce que nous allons faire, c'est copier toute cette section d'inscription, je vais m'en servir comme point de départ. Collez ceci juste en dessous. La fonction, nous l'appellerons connexion. Au lieu de créer un utilisateur, nous allons le modifier pour qu'il s'agisse d'une connexion. Connectez-vous avec votre e-mail et votre mot de passe, nous effacerons ensuite tout message d'erreur, ce qui est très bien. Une fois connecté, nous souhaitons également fermer ce modèle. Nous allons donc cliquer sur « Ouvrir ». Nous allons saisir nos coordonnées. Si le processus de connexion se déroule correctement, nous cliquerons dessus, puis cela sera fermé. Nous pouvons le faire en définissant le modal de connexion ouvert pour qu'il soit égal à false. connexion modale ouverte est quelque chose que nous avons déjà configuré tout en haut et qui contrôle la visibilité du modal. Retournons à notre réception et redescendons dans la zone de pêche. Nous n'avons pas besoin du premier e-mail déjà utilisé, car si nous nous connectons, l'utilisateur doit déjà avoir enregistré l'e-mail. Ce que nous allons faire, c'est récupérer le message du mauvais mot de passe. Comme pour la fonction de connexion, sont tous des messages renvoyés par Firebase. Pour celui-ci, nous dirons mot de passe incorrect. Le numéro 2 est un utilisateur introuvable. Nous dirons qu'aucun utilisateur n' a été trouvé avec cet e-mail. Je vais conserver le message par défaut s'il y a d'autres erreurs. Juste avant d'ouvrir la section d'essai, nous allons ajouter des déclarations conditionnelles. En fait, nous les placerons en deux et nous vérifierons s'il n'y a pas d' e-mail ou de mot de passe. Si l'un de ces éléments est manquant, nous quitterons cette fonction et renverrons un message à l'utilisateur. S'il n'y a pas d'e-mail, nous vous enverrons une déclaration indiquant un message d'erreur. Cette valeur. Cela équivaut-il à saisir un e-mail valide ? Dupliquez ceci. Le second testera si le mot de passe n'est pas présent. Entrez un mot de passe valide. Cela arrêtera simplement une méthode inutile appelée Firebase si nous ne disposons pas de toutes les informations dont nous avons besoin. Nous allons maintenant avoir la fonction pour créer un nouvel utilisateur, pour connecter également un utilisateur existant. Ensuite, nous allons nous concentrer sur la déconnexion d'un utilisateur. Pour cela, Firebase fournit une méthode appelée déconnexion. Importez ceci. Ensuite, nous allons également créer une nouvelle fonction, qui va l'appeler. Il suffit d'un bouton au-dessus de nos relevés de retour. Créez une fonction appelée déconnexion. Nous appellerons notre méthode d'inscription, qui intègre également l'objet off afin savoir quel utilisateur se déconnecter. En fait, nous allons également intégrer cela dans une zone d'essai et de capture afin de pouvoir gérer les erreurs. emplacements de la section try détecteront toutes les erreurs, puis enverront un message d'erreur à l'utilisateur dont la valeur est égale à error.message. Il accède à l'objet d'erreur transmis à la zone de capture, puis accède à la propriété du message. Ces deux nouvelles fonctions doivent également être renvoyées. La première étape consiste à se connecter, puis à se déconnecter. Ces deux éléments doivent être accessibles depuis les composants de connexion. Ajoutez à cela des composants, signin.vue. Importez-les en haut, alors connectez-vous et déconnectez-vous. La fonction de connexion, nous devons la placer dans le formulaire, nous la lierons au bouton de connexion. L'inscription est déjà en cours d'appel. Nous avons la connexion juste au-dessus. Avec celui-ci, nous écoutons dès que vous cliquez, empêchons tout comportement par défaut et nous appellerons Login. Ensuite, comme pour la fonction d'inscription, nous devons également transmettre l'e-mail et le mot de passe que nous avons stockés dans l'objet de données utilisateur tout en haut, qui se trouve juste ici. Et cela est lié à nos entrées de forme. Donc, l'e-mail, le mot de passe, nous allons cliquer sur « Se connecter ». Notre fonction sera alors appelée transmission dans l'e-mail et également dans le mot de passe. Mais qu'en est-il de la fonction de déconnexion ? D'où allons-nous l'appeler ? Eh bien, actuellement, nous n'avons aucun bouton de déconnexion dans le modal ni dans l'en-tête. Mais nous avons le bouton de connexion dans le coin. Ce serait bien de changer le texte ici et de ne dire « connexion » que lorsque l'utilisateur est réellement déconnecté. Et aussi le contraire, lorsque nous devons l' utiliser pour nous déconnecter. Nous allons donc le faire en haut du modèle, puis revenons dans les composants de connexion, et en haut du modèle, nous avons le bouton de connexion. Dupliquons cela. Je clique, disons me déconnecter, modifie le texte pour me déconnecter. Nous reviendrons très bientôt sur ces boutons et ne montrerons qu'un seul d'entre eux à la fois. Mais maintenant, nous pouvons voir nos boutons de connexion et de déconnexion en haut. Mais juste avant de procéder au test, comment savoir si nous nous sommes déjà connectés ? Eh bien, l'un des moyens consiste à nous renvoyer l'objet utilisateur après avoir appelé la fonction de connexion. Si nous revenons à notre utilisation du composant, nous pouvons y accéder dans notre fonction de connexion en stockant la valeur renvoyée par la méthode de connexion par e-mail et mot de passe. Nous avons vu que cela se trouve à l'intérieur d' une constante appelée user, puis juste en dessous, nous pouvons tester avec un journal de console. Placez-le dans l'utilisateur, le navigateur et ouvrez les outils de développement. Accédez à la console, connectez-vous, entrez l'e-mail avec lequel vous vous êtes inscrit. Cette fois, nous allons cliquer sur Se connecter. Nous voyons une erreur. Désolé, il s'agissait d'une erreur inattendue, mais il semblerait que nous soyons en train de récupérer les informations d'identification de l'utilisateur. Jetons un coup d'œil. Nous avons l'utilisateur, nous avons l'e-mail, le jeton d'accès. Tout semble aller bien, mais nous recevons toujours un message d'erreur à l'intérieur. Alors jetons-y un coup d'œil. C'est le message contenu dans les instructions du switch. Faisons un petit débogage dans la section par défaut du journal de la console. Et ici, nous allons afficher l'objet d'erreur complet, et nous verrons si nous pouvons avoir une meilleure idée de ce qui se passe. Connectez-vous à nouveau. Ouvrez une session. Nous avons donc l'erreur, nous avons les informations d'identification de l'utilisateur et voici notre erreur. Les affectations sont constantes lors de l'utilisation de so sign in modal open. C'est là le problème. Cela doit être .value. Essayons encore une fois. Nous procédons à l'actualisation pour nous assurer que toutes les erreurs sont effacées. Connectez-vous, super, le message a été effacé. Nous avons toujours notre objet utilisateur et le modal est fermé car nous l'avons défini sur false. Supprimons les journaux de la console. Nous n'avons besoin ni de l'un ni de l'autre. retour de cet objet utilisateur fonctionne parfaitement et c'est une façon de détecter si l'utilisateur est connecté ou non. Nous pouvons également accéder aux propriétés de l'utilisateur telles que l'e-mail et l'identifiant. Mais ce n'est qu'une façon de procéder. Une autre méthode peut-être meilleure consiste à utiliser une méthode fournie par Firebase, que nous allons examiner dans la vidéo suivante, et qui tiendra compte de toute modification apportée à notre utilisateur connecté. 46. Détection des changements d'Auth: Comme mentionné dans la vidéo précédente, lorsque nous appelons cette méthode qui consiste à se connecter avec e-mail et mot de passe, une valeur est renvoyée. En cas de succès, cette valeur correspondra au contenu de l'objet utilisateur, qui contient toutes les informations dont nous avons besoin, telles que l'identifiant utilisateur et l'adresse e-mail de l'utilisateur. C'est bien, mais Firebase fournit également un observateur, ce qui est un moyen recommandé non seulement pour obtenir l'utilisateur, mais également pour nous informer en cas changement, tel qu' une déconnexion d'un utilisateur. Cet observateur va être importé dans notre fichier d'utilisation. Passez donc en haut et à l' intérieur de l'importation, nous allons également importer l'état activé/désactivé modifié. Pour appeler cela, nous allons descendre en bas de notre fichier, juste au-dessus du relevé de retour et nous l'appellerons en bas. Dans cette méthode de peinture, nous devons également placer entre crochets. Nous devons également transmettre deux paramètres. premier est l'occurrence de l'instance, nous y avons accès. Nos constantes désactivées seraient séparées par des virgules. Le paramètre suivant sera une fonction à appeler si un changement dans les utilisateurs de State a été détecté, c'est-à-dire cette fonction sera appelée si l'utilisateur se connecte ou se déconnecte. La transmission d'une fonction comme deuxième paramètre et de sa fonction impliquera également l'utilisateur actuel. Ouvre ça. Maintenant que nous avons accès à l'utilisateur actuellement connecté, nous voulons connaître notre place dans les déclarations conditionnelles. Nous pouvons vérifier si l'utilisateur existe. Si c'est le cas, nous définirons alors l'utilisateur. S'il n'existe pas, nous allons alors définir l' utilisateur comme étant égal à null et là où nous allons le définir, eh bien, créons une référence tout en haut de notre fichier. Juste en dessous du reste, nous disons const. Les données utilisateur sont égales à une référence. Par défaut, nous allons définir ce paramètre comme étant égal à null. Pour en revenir à notre observateur, nous pouvons insérer des déclarations conditionnelles et vérifier si l'utilisateur existe. Il s'agit d'un utilisateur qui sera transféré à notre fonction. S'ils sont connectés, nous définirons la valeur des données utilisateur pour qu'elle soit égale à cet utilisateur. Sinon, l'utilisateur n'est pas connecté. Par conséquent, nous pouvons renvoyer les données de l'utilisateur comme étant égales à null. Retournons ensuite ces données utilisateur à partir de notre composable. Cela va être utilisé dans divers composants. L'un d'eux peut être les composants de connexion pour nous assurer que nous n'affichons que le bouton correspondant en haut. Accédez à la connexion, importez-le en haut, puis descendez jusqu'à nos deux premiers boutons que nous voyons ici. Nous voulons uniquement afficher le bouton de connexion si aucune donnée utilisateur n'est présente. transmission de la VF indiquera s' il n'y a pas de données utilisateur. Si nous n'avons pas d'utilisateur, nous lui offrirons la possibilité de se connecter, à moins de transmettre des VL sur lesquelles l'utilisateur est actuellement connecté et où il a la possibilité de se déconnecter. Cela nous donnera maintenant l' occasion de le tester correctement. Mais juste avant de procéder au test, nous avons maintenant un conflit sans deux noms de variables. Je vais juste changer celui-ci pour qu'il s'agisse de données de formulaire. Copions ceci et utilisons-le dans notre formulaire. Les données du formulaire sont le point e-mail, il en va de même pour le mot de passe et également des modifications dans nos fonctions de connexion et d'inscription. Je pense que c'est partout. Vérifions simplement ces données utilisateur et nous ne les avons que sur nos deux sites. Bien, nous pouvons maintenant tester cela en plaçant l' utilisateur en haut du modèle, entre accolades. Nous disons « données utilisateur », « e-mail », mais souvenez-vous que parfois nous n'aurons pas accès à cet e-mail car les données utilisateur seront égales à nulles. Faire face au point d'interrogation pour que cela échoue silencieusement si nous avons des erreurs. Si ce point d'interrogation ne vous est pas familier , il s'agit d'un chaînage facultatif en JavaScript. Cela empêchera l'apparition d'une erreur si aucun e-mail n'est présent, ce qui sera le cas si l'utilisateur est déconnecté. Disons que cela passe au navigateur. Nous voyons que nous sommes actuellement connectés, l'e-mail se trouve tout en haut de la page, cliquez sur Déconnexion. Ce n est supprimé. Essayons donc de nous connecter une fois de plus. Notre e-mail est maintenant retourné. Donc, pour supprimer cette sortie du modèle , tout semble maintenant fonctionner correctement. C'est maintenant la fin de la section d'authentification. Félicitations pour avoir atteint ce stade. Nous n'avons pas encore terminé, mais nous avons encore beaucoup de fonctionnalités à ajouter à notre projet, qui seront ajoutées dans les prochaines sections. 47. Styler l'aperçu: Nous allons bientôt apporter la touche finale à notre projet. Nous allons commencer par quelques styles CSS pour cette vue d'ensemble. Pour le moment, cela ne semble pas très beau en dessous de l'en-tête. Passons à cette section, qui se trouve dans les vues, propos, sélectionnons la vue ci-dessus, puis nous pouvons créer une section de style en bas. Jetons un coup d'œil aux cours que nous avons. C'est tout ce que nous avons, ce wrapper qui enveloppe tout notre contenu avec la classe environ. Ensuite, passez à la section d'introduction, et cette section inclut notre titre et notre image. Il s'agit essentiellement de tout ce qui se trouve au-dessus de cette zone de liens. Commençons par ce cours d'environ. Nous allons commencer par définir le type d'affichage comme étant flexible, et nous nous assurerons que c' est dans le sens vertical en définissant le sens de flexion sur une colonne. L'utilisation de la flexbox et de cette direction verticale nous permettra ensuite d'aligner les éléments au centre. Alignez les éléments au centre, ce qui poussera ensuite le contenu au milieu de la page. Il s'agit de l'emballage de la page complète. Ensuite, nous avons la section d'introduction. Comme nous venons de le découvrir, la section d'introduction se résume à cette image, qui est l'image et les deux lignes de texte ci-dessus Nous allons donc également définir la direction flexible comme colonne sur celle-ci. La direction de l'affichage ou de la flexion de la colonne. Actuellement, vous ne verrez aucune différence si nous passons au navigateur. Cela est dû au fait que nous allons très bientôt utiliser une requête multimédia et la faire apparaître d' affilée sur un écran plus grand. Actuellement, cela s'applique au petit écran, puis sur l'écran plus grand, nous allons le configurer pour qu'il s'agisse d'une direction de ligne flexible. À l'intérieur de la règle des médias artistiques nous ciblerons une largeur minimale de 900 pixels, puis nous pouvons annuler notre section d'introduction en définissant la direction de flexion sur une ligne. Elles apparaissent dans une rangée. Ensuite, en dessous de 900 pixels, cela reviendra à la direction de la colonne. Revenons maintenant à la section d'introduction. Si nous faisons défiler la section jusqu'à la section complète à l'intérieur, nous avons ce div avec la classe de wrapper de texte d'information à côté de l'image. En fait, nous n'avons que deux sections avec lesquelles nous devons travailler. Nous pouvons à nouveau utiliser la flexbox pour définir la même taille à gauche et à droite. Nous devons également ajouter de l' espacement et de l'alignement, et nous le ferons juste en dehors de notre requête multimédia. abord, l'image était une image soulignement d'information qui récupérera également notre wrapper de texte d'information, notre IMG d'information et également notre wrapper de texte d'information. Comme les parents de l'intro ont le type d'affichage Flex, les éléments enfants peuvent utiliser Flex, et nous allons les configurer tous les deux pour essayer d' adopter exactement la même valeur. peu de rembourrage pour donner les deux à espacement d'une RAM. Alignez le texte en alignant le texte au centre, puis définissez l'alignement vertical. Nous pouvons également utiliser Align Self. Alignez-vous au centre. Encore une fois, cela fonctionne parce que les parents de introduction ont ce type d' affichage flexible, et align self fonctionnera parce qu'il s' agit d'un élément enfant de la flexbox. Cela prend en charge cette section. Faisons défiler la page vers le haut. Le suivant est le wrapper pour plus d'informations. C'est la section contenant tous nos liens et ce titre juste ici. Ciblons à nouveau cette section en dehors de la requête multimédia. Plus d'informations sur l'emballage à l'écran. Encore une fois, nous utiliserons la flexbox. Nous allons définir la direction de flexion de manière à ce qu'elle se situe dans une ligne de texte de colonne située au centre. Nous pouvons le faire ressortir en ajoutant de la couleur de fond. Rendez-la légèrement différente de la couleur blanche actuelle. Optez pour le double F, le double E, le D2. Actuellement, cet arrière-plan entoure uniquement le contenu Pour obtenir la largeur totale de la page, nous pouvons modifier la largeur pour qu'elle soit de 100 VW. Nous y voilà. Pour donner un peu d'espace à cela, ajoutez simplement un peu de rembourrage d'une RAM. Nous pouvons également trop modifier l'arrière-plan de cette section, alors copions ceci. Si nous revenons à la source, aux actifs, au fichier main.css. En fait, nous pouvons simplement supprimer l'arrière-plan du bloc d'informations et celui-ci correspondra désormais au reste du contenu. Essayons les sections et la page d'accueil, et assurons-nous que vous n' aurez aucun problème. En fait, ici, nous devons ajouter l'arrière-plan. Collez ceci dedans. Nous y voilà. Cela fonctionne désormais pour nos deux points de vue. 48. Terminer l'aperçu d'administrateur: Continuons avec les touches finales dans la section d'administration. À l'intérieur, nous allons utiliser la boîte flexible et placer de nouvelles pizzas côte à côte sur les composants du menu sur une vue plus large. Passons à la vue d'administration, qui se trouve dans le dossier des vues. Pour le moment, nous n' avons pas beaucoup de contenu, nous affichons simplement le titre du niveau 3 et les trois composants Il s'agit donc de la section de notre nouvelle pizza et de la composante pizzas. Découpez-le, enroulez-le dans un div, collez-le à nouveau dedans et donnez à ce div la classe de ligne. En bas, créez la section de style. Nous allons également étendre cela à nos composants. Sélectionnez la ligne. Dans la section initiale, nous allons définir le type d'affichage comme étant flexible, une nouvelle direction flexible étant une colonne. Cela fonctionnera sur le petit écran. Je réduirais cela et nous pouvons les voir dans le sens de la colonne. Configurez ensuite une requête multimédia à l'aide de la règle des médias artistiques, dans laquelle nous appliquerons tous les styles contenus ici sur 900 pixels. Sélectionnez notre ligne, ou vous pouvez remplacer la direction flexible par une ligne. Les écrans plus petits comporteront une colonne. L'étirement doit être supérieur à 900 pixels. Ils sont désormais côte à côte. Nous avons également besoin que ces deux composants soient un peu plus larges, afin qu'ils couvrent toute la taille de la page. Nous pouvons accéder à la nouvelle pizza ainsi qu'aux pizzas à l'intérieur des composants sous Administration. Celui-ci contient la section classe d'administrateur. Si nous mangeons des pizzas, nous pouvons voir que celle-ci le fait aussi. Entrons dans le dossier assets, dans main.css. Faites une recherche et nous avons déjà référence de la section d'administration juste ici. Définissez la valeur de flexion pour qu'elle soit égale à un. Toutes ces sections essaieront d' occuper le même espace disponible. Comme il s'agit d'une zone d'administration, nous souhaitons également introduire certaines mesures pour nous assurer que seules les bonnes personnes peuvent consulter cette page. Pour l'instant, nous allons nous assurer qu'ils sont connectés en important d'abord l'utilisateur. Revenez à la vue d'administration, dans le script. Nous devons importer notre utilisation du composable dans lequel nous pouvons extraire et stocker dans une constante les données de nos utilisateurs. N'oubliez pas que les données utilisateur sont soit égales à notre objet qui contient toutes les informations utilisateur, soit égales à nulles. Nous utilisons Auth pour appeler notre fonction. Par conséquent, les données utilisateur peuvent être utilisées avec un rendu conditionnel pour afficher et masquer le contenu de la page. Reprenons tout ce qui se trouve dans notre modèle, le plaçons dans un div comme wrapper, y rajoutons le contenu, puis utilisons le rendu conditionnel avec v-if, où nous pouvons vérifier si les données utilisateur sont présentes. Si nous sommes connectés, nous devrions pouvoir voir toute la section d'administration. Sinon, créez un élément p, qui sera destiné à la section v-else, avec le message indiquant que vous devez être administrateur pour voir cette zone. Voilà notre message. Avant de nous connecter, nous allons simplement ajouter du style à cette section en ajoutant une classe warning_msg. Nous allons le personnaliser dans une seconde. Mais avant cela, nous pouvons également ajouter un message de bienvenue si l'utilisateur est connecté. Juste au-dessus du titre de niveau 3, ajoutez du texte avec la classe user_email. Les textes sont les bienvenus. Ensuite, à l'intérieur des doubles accolades, nous pouvons accéder à nos données d'utilisateur. Email. N'oubliez pas que les données utilisateur ne seront pas toujours un objet, elles peuvent parfois être nulles. Par conséquent, nous pouvons utiliser chaînage facultatif JavaScript avec un point d'interrogation pour n'afficher cet e-mail que s'il est défini. Enfin, le style de notre e-mail utilisateur et du message d'avertissement ne font pas partie de la requête multimédia, donc user_email et warning_msg. Marge d'un rebord, il suffit de le pousser hors du coin. Essayons de nous connecter. Tout le monde, le contenu est maintenant visible et nous pouvons également voir un message de bienvenue en haut. De plus, juste pour dépasser le niveau 3, nous pouvons également appliquer le même montant de marge. Ajoutez le H3. Bien, ça a l'air beaucoup mieux maintenant. Passons à notre bouton d'inscription et cliquez dessus. Cela prend maintenant effet et supprime notre section d'administration de l'affichage. 49. Restriction de nouvelles pizzas: Une autre vérification que nous pouvons effectuer est de voir si notre utilisateur est connecté avant de pouvoir ajouter une nouvelle pizza à la base de données. Actuellement, nous n'avons aucun moyen de vérifier si l'utilisateur est un utilisateur régulier ou un administrateur. Mais nous y reviendrons plus tard, et nous allons le faire une fois de plus pour importer nos données utilisateur dans nos nouveaux composants de pizza. Composants, administration, nouvelle pizza. Placez une importation en haut à partir de notre composable. Importez, utilisez Auth depuis notre fichier composable. Ensuite, nous pouvons extraire les données de l'utilisateur. Si nous faisons défiler la page vers le bas, nous pouvons voir que nous avons cette fonction Ajouter les fonctions de notre nouvelle pizza à la base de données. Avant de l'ajouter, nous pouvons vérifier si l'utilisateur est connecté. Nous dirons s'il n' y a pas de données utilisateur, et puisque nous sommes dans le script, nous devons également accéder à la valeur. Si c'est faux, c'est-à-dire cela sera égal à null si l'utilisateur n'est pas connecté. Nous pouvons maintenant quitter cette fonction avant d' ajouter notre pizza à la base de données. Dans les circonstances actuelles, il va être assez difficile de tester cela. Parce que si nous étions déconnectés, nous ne pouvons actuellement pas voir le composant Ajouter une nouvelle pizza pour essayer. Ce que nous pouvons faire à titre temporaire est de désactiver le rendu conditionnel dans l'administrateur. Passez à la vue d'administration. Ensuite, dans les modèles, nous allons commenter les instructions if, le div de clôture, et nous devrons également créer la zone v-else. Cela nous donne désormais accès à la section d'administration lorsque nous ne sommes pas connectés actuellement. Ajoutons, et maintenant, chaque fois que nous essayons d'ajouter une nouvelle pizza, nous ne voyons pas le message indiquant que cela a été ajouté, et nous ne voyons pas non plus cela ajouté dans la section du menu. Bien. Tout cela fonctionnant, nous pouvons maintenant rétablir le rendu conditionnel dans la vue d'administration. Nous ne sommes pas connectés, donc tout le contenu devrait disparaître. Ensuite, nous nous en tiendrons à ce sujet de l'objet utilisateur en l' ajoutant à nos commandes. 50. Ajouter l'utilisateur aux commandes: Les prochaines étapes sont toutes liées à toutes les commandes. Ce que nous allons faire, c'est nous assurer que l'objet utilisateur figure sur notre commande avant de le transférer vers la base de données. Nous nous assurerons également que l'utilisateur est connecté avant de créer une nouvelle commande, et pour ce faire, nous passerons au panier d'utilisation composable et intégré à un utilisateur. Composables, UseBaskets, et ce fichier contient la fonction AddNewOrder. Mais avant de pouvoir réellement tester si l'utilisateur est connecté, nous devons également importer les données utilisateur depuis notre composable externe. Ainsi, n'importe quel composable peut être importé à l'intérieur d' un autre composable, ce qui rend ces fichiers vraiment flexibles. Comme nous le faisons pour n'importe quel composant, nous pouvons importer notre composable. C'est UseAuth, et c'est le cas. /, UseAuthf puisqu'elles se trouvent dans le même répertoire, puis dans notre fonction, nous pouvons extraire nos données utilisateur de notre fonction UseAuth. L'identifiant ici est que nous allons vérifier s' il y a un utilisateur connecté. Si c'est le cas, nous les ajouterons à la commande, sinon, nous ajouterons un message utilisateur pour se connecter. Et nous devons stocker ce message dans une variable ou une constante. Donc, const, SignInMessage est égal à une référence avec une chaîne vide comme valeur initiale jusqu'à la fonction AddNewOrder et nous pouvons abord vérifier si l' utilisateur est connecté. Dans la section d'essai, nous indiquerons si, UserData.value, ouvre les accolades. Si c'est vrai, nous voulons exécuter du code à l'intérieur Si ce n'est pas le cas, nous créerons une section L. La section L mettra à jour le SignInMessage, qui renverra à l'utilisateur un message lui demandant de se connecter pour passer une commande. Ensuite, dans notre section if, nous pouvons copier ou découper la section de commande jusqu'au texte de notre panier, sans le contenu d'origine. Placez-le ensuite dans la section if, afin qu'il ne s'exécute que si l'utilisateur est connecté. C'est tout ce que nous devons faire pour le moment dans la fonction, nous pouvons ensuite renvoyer notre SignInMessage, qui peut ensuite être importé dans notre vue de menu. En haut, nous avons déjà accès au panier d'utilisation , nous pouvons donc simplement saisir la fin de notre message de connexion. Ensuite, affichez ce message dans notre modèle, faites défiler la page jusqu'au bouton de commande, qui se trouve dans la section panier, recherchez ce bouton avec le texte du bouton de placement, puis juste au-dessus, ajoutez un nouvel élément P, sorties, notre SignInMessage. Nous pouvons maintenant tester cela lorsque nous sommes connectés et déconnectés. Comme on nous a demandé de nous connecter, nous ne sommes pas connectés actuellement. Nous pouvons le confirmer auprès de l'administrateur. Essayons de passer une commande, cliquez sur certains articles. Nous y voilà. Veuillez vous connecter pour passer une commande, cliquez sur notre modèle et nous pourrons nous connecter. Connectez-vous, cliquez à nouveau sur « Passer la commande » et tout est prêt. Toutefois, si cela fonctionne, déconnectez-vous et effacez la page, puis ajoutez de nouvelles pizzas à la commande. Encore une fois, si nous avons essayé de passer une commande, nous verrons toujours notre message juste ici. Vous avez peut-être déjà remarqué que dès que nous nous connecterons via le modal, ce message restera intact. Démontrons-le simplement. Si nous nous reconnectons, cliquez sur « Se connecter ». Le fait de conserver ce message intact peut semer la confusion chez l'utilisateur. Ils peuvent penser qu'ils ont encore besoin de se connecter. Tout cela signifie une erreur dans le processus de connexion. Pour y remédier, view fournit une méthode de surveillance qui déclenchera une fonction de rappel cas de modification d' un état réactif tel que notre utilisateur. En pratique, cela signifie que si nous revenons à notre panier d'utilisation composable en haut de la page, nous pouvons alors surveiller nos données utilisateur et, dès que des modifications se produiront, nous pouvons exécuter une fonction de rappel. L'observateur a été automatiquement importé depuis le package de visualisation. Si le vôtre ne s'est pas produit automatiquement, assurez-vous de l'ajouter. Ensuite, chaque fois qu'une modification se produit dans d'autres données utilisateur, la fonction s'exécute et nous pouvons effacer notre SignInMessage.value en la définissant comme une chaîne vide. Revenons à notre menu et rafraîchissons. Nous pouvons constater que tout cela prend effet sur toutes les nouvelles pizzas. Passez une commande. Cela fonctionne, car nous sommes connectés, déconnectons, nous passons une commande lorsque nous sommes déconnectés et nous voyons notre message d'erreur. Maintenant, si nous essayons de nous connecter une fois de plus, connectez-vous. Dès que cela se produit, nous supprimons le message d'erreur afin que l'utilisateur soit désormais libre de passer sa commande. Bien, il ne nous reste qu'à ajouter l'utilisateur à la commande. Revenons au panier d'utilisation composable puis à la fonction AddNewOrder. Juste dans la section if, oubliez pas que les données utilisateur, que nous récupérons depuis Firebase, contiennent de nombreuses informations et de nombreuses propriétés dont nous n'avons pas besoin. Pour simplifier, je vais créer un nouvel objet utilisateur et ne placer que l'identifiant et l' adresse e-mail de l'utilisateur, la propriété ID, nous pouvons récupérer à partir de UserData.value.UID et de l'e-mail de l'utilisateur. Celui-ci provient du UserData.Value.Email. Ensuite, ci-dessous, lorsque nous créons notre commande, nous pouvons également transmettre l' utilisateur. Maintenant, sauvegardons ceci. Essayons de passer une nouvelle commande. Passez votre commande, accédez à la console, à notre base de données Firestore et consultez les commandes. Si nous faisons défiler la page vers le bas, nous pouvons voir que notre objet utilisateur est également joint à la dernière commande que nous venons de passer. 51. Filtres et propriétés mondiales: Vous remarquerez que si nous entrons dans la section menu, commençons à ajouter des pizzas à notre panier. Si nous commençons à augmenter la quantité, augmentons cette quantité à six et voyons que nous avons un formatage incohérent. La première est réduite à une décimale, la seconde à deux décimales et le total de la commande est foiré. Si vous avez déjà utilisé la version 2 de Vue vous avez peut-être utilisé ce que l'on appelle un filtre. Un filtre était disponible pour fournir une mise en forme simple du texte et était idéal pour créer des éléments tels que des filtres de devises. Cependant, dans la version 3 de Vue, les filtres ne sont plus disponibles. Ils peuvent être remplacés par quelque chose comme une méthode ou une propriété calculée à l'intérieur d'un composant. Cependant, si vous souhaitez que cela soit disponible dans le monde entier afin que nous puissions le réutiliser, nous pouvons également utiliser un filtre comme celui configuré dans Vue 3 en accédant à ce que l'on appelle les propriétés globales. Les propriétés globales sont un objet que nous pouvons ajouter qui est disponible dans tous nos composants pour que nous puissions le réutiliser. Veillez cependant à ne pas exagérer et tout rendre accessible dans le monde entier. Mais un filtre de devises dont nous pouvons utiliser plusieurs composants est un bon cas d'utilisation. Passons au fichier main.js et configurons cela. Donc, juste en dessous de l'endroit où nous créons notre application, méthode consiste à appeler app.config.global.properties, puis nous pouvons donner cette propriété un nom tel que Dark.mode et nous le définirons comme vrai. Nous pouvons maintenant accéder à la propriété DarkMode à l'intérieur de n'importe lequel de nos modèles , qui agit comme une variable. Passons à la vue du menu et n'importe où dans ce modèle convient. Nous l'insérons à l'intérieur des doubles bretelles bouclées, maintenant nous le voyons en haut. C'est un très bon cas d'utilisation pour des chaînes simples ou des booléens comme celui-ci et nous pouvons y accéder dans n'importe quel composant. Nous pouvions également en configurer autant que nous le voulions, nous pouvions simplement les dupliquer et créer différentes variables. Ou nous pouvons également ajouter plusieurs propriétés à l'intérieur d'un objet. Conservons donc cette section mais supprimons la variable, et nous allons créer un objet appelé filtres, puis à l'intérieur des accolades, nous pouvons ajouter autant de filtres que nous le souhaitons. Pour notre cas d'utilisation, nous allons créer une fonction appelée FormatMoney. FormatMoney doit prendre en compte la valeur que vous souhaitez formater, puis nous pouvons renvoyer la nouvelle valeur formatée. Un moyen simple de le faire est d'appeler Value.toFixed et cela corrigera ce problème à deux décimales. l'avons également mentionné, puisqu' il s'agit d'un objet, nous pouvons également y ajouter plusieurs propriétés . Mais même si FormatMoney est tout ce dont nous avons besoin, revenons à notre menu et nous pouvons remplacer la tarification par notre filtre. Si vous le souhaitez, vous pouvez l'ajouter à la section du menu, mais actuellement, nos numéros sont déjà ajoutés à la base de données, donc cela devrait toujours s' afficher correctement. Le problème se produit lorsque nous ajoutons plusieurs pizzas et commençons à multiplier les nombres. Ce que nous pouvons faire, c'est aller dans la section panier, nous avons le total de la commande, nous avons ce prix juste ici, donc au lieu cela, nous voulons supprimer cette multiplication , accéder à nos filtres.FormatMoney. FormatMoney était une fonction qui prend une valeur à formater. Nous devons donc également transmettre cette valeur dans laquelle se trouve la multiplication que nous venons de supprimer. Ce sont les totaux des lignes et nous devons également effectuer le total de la commande. Supprimez donc cela, puis nous accèderons à Filters.ForfMatMoney, recollez-le dedans. Essayons ça. Augmentez la quantité et vous pourrez voir quand nous dépasserons six, ce qui était le problème auparavant, toutes correctement formatées à deux décimales. Comme notre filtre est un objet global, nous pouvons également l'utiliser dans d'autres composants où nous affichons des valeurs monétaires. Passons maintenant aux composants, l'administration et au orders.view. Accédez à notre tableau, tout comme dans le panier, nous multiplions également le prix par la quantité. Nous pouvons donc faire de même ici, nous pouvons dire Filters.FormatMoney. Transmettez-le, essayons-le dans la section d'administration. Cela semble également correct si nous examinons tous les totaux sur la droite. Il s'agit d'un moyen très simple mais utile de répéter des tâches simples dans notre application. formatage de sa devise est cependant un peu basique et nous pouvons l' améliorer en utilisant l'objet JavaScript Intl. Il s'agit de l'API d' internationalisation JavaScript qui fournit, entre autres fonctionnalités , un formatage des nombres, de l' heure et de la date basé sur la langue . Améliorons cela en revenant à notre fichier main.js. Nous pouvons remplacer notre exemple actuel juste après l'instruction return et nous déclarerons que nous voulons un nouveau Intl.NumberFormat. NumberFormat est l'une des nombreuses méthodes disponibles sur les objets Intl et ce NumberFormat permet un formatage numérique sensible à la langue , ce qui est idéal pour les devises. Ensuite, à la fin de la chaîne la méthode de formatage qui prend en compte la valeur que vous souhaitez formater. Dans notre cas, nous utilisons toujours cette valeur qui est transmise à la fonction plus, la méthode de format numérique prendra également en compte certains arguments pour spécifier les paramètres régionaux que nous utilisons , ainsi prendra également en certains arguments pour spécifier que certaines options. abord, les paramètres régionaux de l'utilisateur final qui définissent le style de formatage de la devise. La raison pour laquelle nous voulons le faire est que les devises sont affichées et formatées différemment selon les régions du monde. Par exemple, certains pays utilisent des décimales ou des virgules comme séparateurs. Disons que 10 000 peuvent ressembler à ceci ou cela et que certains pays utilisent également des symboles spéciaux. Si nous l' enregistrons actuellement et que nous passons au navigateur, actualisons. Nous pouvons voir sans ajouter d' options différentes à l'intérieur. Par défaut ma devise est à deux décimales et utilise la virgule entre les deux décimales. Mais si nous ajoutons, par exemple, une locale allemande qui est une valeur de chaîne de tiret au-dessus de case DE, dès que vous l'enregistrez , elle est mise à jour et séparée par une virgule à la place. mon cas d'utilisation, je vais le remplacer par l'anglais, dash GB, ce qui devrait revenir à la décimale. Ensuite, séparés par une virgule, nous pouvons également ajouter un objet d'options. À l'intérieur de cet objet, nous pouvons transmettre diverses informations telles que le style et les options monétaires. Le style sera égal à la chaîne de devise, puis nous devons également transmettre la devise que vous souhaitez formater. Cela peut être n'importe quelle devise telle que l'euro, l'euro, nous pouvons le voir ici Supprimez également ce symbole $ en un instant, cela peut être le $, je pense que l'USD. Retrouvez-nous juste ici, mais le mien sera en livres. En plus de la monnaie, elle peut également être utilisée pour d'autres choses. Nous pouvons inclure des unités de mesure et des pourcentages, mais ces options sont idéales pour notre cas d'utilisation et n'hésitez pas à les configurer avec la devise de votre choix. Juste pour terminer , revenons à la vue par points des commandes. Nous allons déplacer le symbole monétaire que nous avons codé en dur le menu Nous devons également faire de même ici et ici. La vue du menu, supprimez-la. Presque là, nous n' avons plus que la section du menu qui se trouve juste au-dessus. C'est l'option sans prix, nous pouvons déplacer le symbole monétaire, le publier, accéder à nos filtres, nous avons FormatMoney , le recoller dedans. Notre mise en forme des nombres a maintenant pris effet. 52. Mises à jour en temps réel: Lorsque nous mettons à jour notre site, certaines choses sont mises à jour immédiatement et d'autres non. Par exemple, si nous allons voir notre administrateur et que nous essayons d' ajouter une nouvelle pizza, nous n'aurons plus notre administrateur et que nous essayons d' ajouter une nouvelle pizza, que toutes les informations fictives pour le moment. Cliquez sur « Ajouter ». Ensuite, cette nouvelle pizza n' est pas automatiquement mise à jour dans le menu tant que nous n'avons pas cliqué sur « Actualiser ». Mais si nous supprimons une pizza en cliquant sur ce X, l'article est supprimé de l'administrateur. Pourquoi pensez-vous que cela se produit ? Eh bien, pour voir cela, nous devons examiner certains fichiers plus en détail. abord, si nous accédons à la section d'administration des composants, puis que nous ouvrons NewPizza.vue, nous avons cette fonction pour ajouter une nouvelle pizza à notre base de données. Tout ce que nous faisons ici, c'est effectuer quelques vérifications, puis nous ajoutons notre document à notre base de données, nous mettons à jour le message. Alors, si cela réussit, tout va bien. La pizza est stockée dans la base de données, mais notre application n'est informée par Firebase d'aucun ajout. Cependant, si nous passons à ce que nous utilisons des pizzas composables et que nous examinons notre fonction GetPizzas. Actuellement, après avoir ajouté notre pizza, nous devons actualiser la page, car cela appellera à nouveau notre fonction GetPizzas, mettant ainsi à jour le menu de droite. Cela semble logique, mais souvenez-vous que lorsque nous avons supprimé une pizza, l'application a été mise à jour avec les modifications. La différence entre ces deux situations est que si nous accédons à notre composable UsePizzas et que nous recherchons DeletePizza, la principale différence est que dès que nous avons supprimé la pizza, nous appelons à nouveau notre fonction GetPizzas qui transmettra les informations correctes aux composants de notre menu. Si nous le voulions, lorsque nous ajoutions une nouvelle pizza, nous pourrions également appeler à nouveau notre fonction GetPizzas. Mais il existe également une meilleure façon de faire les choses et c' est d'utiliser une fonctionnalité en temps réel de Firebase. Cela signifie que dès que nous apportons des modifications à notre base de données, l'application est informée de ces modifications. Par exemple, lorsque nous passons à l'administrateur et que nous ajoutons une nouvelle pizza, nous cliquons sur le bouton Ajouter et celle-ci est ensuite envoyée dans notre base de données. Dès que cela sera réussi, Firebase communiquera personnellement à notre application les informations mises à jour. Ensuite, notre menu sera mis à jour automatiquement. Pour ce faire, nous utilisons une méthode appelée snapshot. Passons à tout ce que UsePizza est composable. Nous pouvons l'importer depuis notre fistore, donc sur Snapshot, je vais le faire dans GetPizzas. Nous allons maintenant commenter tout le code existant que nous utilisons pour récupérer nos pizzas dans la base de données et le remplacer par la méthode OnSnapshot. transmission de snapshots et d' OnSnapshot prend également en compte la référence de la collection de pizzas qui est stockée dans DBPizzasRef. Ceci est suivi d'une fonction que nous allons exécuter chaque fois qu'il y a un changement dans la base de données. La fonction va récupérer les documents qui nous sont renvoyés. Comme le nom des documents correspond ici à celui des documents que nous avons parcourus en boucle auparavant, nous pouvons maintenant décommenter cette section, publier, puis la coller dans notre fonction. Cela revient à faire exactement la même action que précédemment. Nous allons récupérer les documents. Nous les parcourons en boucle, nous créons de nouveaux objets à pizza. Puis en dessous pour AllPizzas ref. Dès que cette mise à jour est effectuée, toutes les vues ou tous les composants qui s'appuient sur ces données sont mis à jour. Essayons-le donc dans l'administration. Nous allons donc passer à Ajouter une nouvelle pizza, cliquer sur « Ajouter », et dès que nous le ferons, notre application est mise à jour, mais nous constatons un petit problème. Non seulement nous recevons les pizzas gratuites qui sont renvoyées à partir de la base de données, mais celles-ci sont également ajoutées aux deux pizzas existantes que nous avons déjà. Un moyen simple de le faire est de vider notre tableau AllPizzas avant de récupérer les informations. Si nous allons dans la section d'essai, nous pouvons voir que nous avons déjà effacé la valeur existante et qu'il s'agit certainement d'un tableau vide. Tout ce que nous avons à faire est de déplacer cela dans notre instantané. Sauvegardons-la et rafraîchissons-la en tant que pizzas existantes gratuites. Ajoutons-en un de plus. Cliquez sur « Ajouter » et notre application est désormais informée de tout changement. Dans cet esprit, nous pouvons également revenir à notre fonction DeletePizza où nous pourrions supprimer l'appel manuel GetPizzas. Je vais jeter un œil à notre fonction DeletePizza. Nous n'avons plus besoin d'appeler GetPizzas manuellement, c'est fait pour nous. Maintenant, si nous supprimons également pizza et que notre administrateur est toujours mis à jour lorsque nous supprimons une pizza , la prochaine étape répétera également ce processus pour nos commandes en cours. 53. Mises à jour de commande en temps réel: Pour mettre à jour les commandes en temps réel, suivez le même schéma que pour les pizzas. Tout d'abord, nous allons utiliser orders.js dans le Composable. Tout en haut, nous devons importer notre propre méthode de capture instantanée. Ensuite, nous pouvons remplacer la méthode get docs existante que nous utilisions sur Snapshot. Nous irons chercher des commandes, qui se trouvent juste ici. Nous avons toujours besoin de ce QueryData, qui se trouve au sommet. Mais nous commenterons tout par la suite, de l'obtention la documentation au bas de notre section d'essai. Nous appellerons OnSnapshot, qui va prendre en compte nos données QueryData. Ensuite, une fonction à exécuter après chaque modification. Encore une fois, pour assurer la cohérence et réutiliser nos données, nous appellerons les données disponibles dans les documents. Ensuite, notre code existant, nous pouvons le décommenter, le mettre hors de propos, le placer dans notre fonction. Nous n'avons plus besoin de ces documents. Nous pouvons les supprimer car nous les transmettons automatiquement à notre fonction. Ensuite, pour éviter le même problème que nous avons rencontré avec nos pizzas, si vous vous souvenez du fichier « Utiliser des pizzas », nous faisons défiler la page vers le bas pour surutiliser la fonction pizza. À l'intérieur, nous avons dû réinitialiser la valeur de toutes les pizzas pour qu'elle soit vide, puisque nous avions les pizzas existantes. Ensuite, après chaque mise à jour, l'ensemble complet de pizzas a été ajouté à nos valeurs existantes, plutôt que de le remplacer. Faites de même pour les commandes d'utilisation, accédez à OnSnapshot où nous pouvons accéder à allorders.value. Cela équivaut à un tableau vide. Pour tester cela, nous devons ouvrir notre projet dans deux onglets distincts. Nous les placerons côte à côte. La raison pour laquelle nous faisons cela est que nos commandes sont passées dans les composants du menu, mais nous les visualisons dans les composants d'administration. Si nous devions simplement ajouter une nouvelle commande, puis cliquer sur « Admin », les commandes en cours seraient automatiquement affichées. Nous ne verrions pas la fonctionnalité en temps réel, mais nous pouvons le voir si nous accédons au menu et créons une nouvelle commande. Nous avons cinq commandes, cliquez sur « Valider ». Vous pouvez voir tout de suite que cela fait grimper à six nouvelles commandes. Essayons-en une autre. Cela passe à sept, et notre dernière commande est maintenant en bas de la liste. 54. Se désabonner des mises à jour: Lorsque vous utilisez OnSnapshot, le processus d'écoute de nos mises à jour est continu. Cependant, il se peut que nous n'ayons plus besoin de mises à jour. Nous avons besoin d'un moyen de détacher cet auditeur pour libérer toutes les ressources. Cela est relativement simple. Lorsque nous utilisons OnSnapshot, une méthode de désabonnement est renvoyée, que nous pouvons ensuite appeler dans notre application. L'un des cas d'utilisation pourrait se situer dans l'interface administrateur. Par exemple, si nous descendons vers le bas, nous sommes actuellement à l' écoute de toutes nos commandes en cours. Mais dès que nous quittons cette page et que nous en visitons une nouvelle, nous n'avons plus besoin d'écouter les nouvelles commandes. Nous pouvons détacher cet écouteur et libérer toutes les ressources du navigateur. Pour ce faire, utilisez le fichier orders.js, lequel nous pouvons stocker la fonction de désabonnement dans une variable. Comme mentionné, onsnapshot renverra une fonction de désabonnement, que nous pouvons stocker dans une variable ou une constante. Actuellement, le problème est que cette constante désabonnée est définie dans cette fonction. Nous avons besoin d'un moyen d' y accéder à l'extérieur. Une façon de le faire est de créer une nouvelle référence juste à l'extérieur d'ici. Nous dirons const, désabonnez-vous des commandes. Par défaut, il s'agira d'une référence vide. Nous pouvons le mettre à jour avec la valeur de désabonnement. Passons à la réception des commandes. en bas de la section du plateau, juste au-dessus du bloc de saisie, nous pouvons récupérer notre référence, qui est désabonnée de toutes les autres, et définir la valeur comme étant égale à unsubscribe. Nous avons maintenant une fonction de désinscription de la plus ancienne, que nous pouvons appeler lorsque nous n'avons plus besoin d'écouter les commandes. Nous pouvons le faire à l'intérieur d'un hook de cycle appelé unmounted. Nous devons l'importer depuis la bibliothèque Vue. Nous avons déjà OnMounted, qui s'exécute dès que le composant est monté sur le DOM, puis OnUnmounted dès que nous partons. Nous allons placer cela dans OnUnmounted. Cela va exécuter une fonction. Nous pouvons le tester à l' aide d'un journal de console qui permet simplement d'intégrer les connaissances et, disons, de les démonter. Accédez ensuite à notre référence, qui est désabonnée de la valeur du point des commandes. Nous appellerons cela une fonction. Passez à l'administrateur et nous ouvrirons les outils de développement dans la console. Ensuite, si nous démontons ce composant en passant à une autre page, nous voyons le journal de notre console. Cela devrait également faire appel à notre fonction de désabonnement. 55. Ajout de nouveaux utilisateurs: Notre application permet actuellement d' inscrire de nouveaux utilisateurs. Mais tout nouvel utilisateur qui s'inscrit peut accéder à l'intégralité de notre site. Cela inclut n'importe laquelle de nos pages et, plus important encore, la section d'administration. Nous avons besoin d'un moyen de configurer nos utilisateurs pour n' autoriser que les administrateurs autorisés à accéder à cette section. Firebase dispose d'une solution pour contrôler l' accès des utilisateurs à l'aide de revendications personnalisées. Si vous utilisez une application de production, c'est une excellente solution et vous pouvez trouver plus d'informations en cliquant sur ce lien ici. Les demandes personnalisées doivent être configurées côté serveur pour des raisons de sécurité. Nous pouvons les configurer à l'aide de Firebase Cloud Functions. Malheureusement, les fonctions Cloud nécessitent une mise à niveau vers un plan payant. C'est pourquoi nous allons utiliser une approche différente. Cela impliquera de créer à l'intérieur de notre base de données une collection d'utilisateurs. Chacun de ces documents sera lié à un utilisateur dans notre section d'authentification Nous utiliserons ce nom d'utilisateur comme identifiant du document, comme c'est le cas ici pour nos commandes. Mais cela signifie également que nous pouvons créer un nouvel enregistrement utilisateur qui contiendra des informations supplémentaires. L'une de ces informations sera le rôle de l'utilisateur. Dans le passé, nous avons créé nos pizzas et nos commandes dans le fichier firebase.js. Nous avons créé une référence à chacune de ces collections. Nous les avons ensuite utilisés pour créer nos nouveaux documents. Par exemple, utilisez des paniers et nous avons créé une nouvelle commande avec la fonction AddNewOrder. Nous avons utilisé la méthode AddDoc. Ceci est renvoyé à cette référence, à une nouvelle commande. Mais l'essentiel à noter ici lorsque vous utilisez AddDoc est que nous n'imposons pas de nouvel identifiant pour les documents. Chacun de ces documents possède un identifiant généré de manière unique. Mais au lieu de cela, nous voulons que la collection de notre utilisateur ait l'identifiant du document qui correspond à notre utilisateur qui correspond à notre utilisateur dans la section d'authentification, qui se trouve ici. Au lieu d'utiliser la méthode AddDoc, nous allons utiliser quelque chose appelé SetDoc. Cela nous permettra de transférer de nouvelles données vers une collection et de définir notre propre identifiant que nous souhaitons utiliser. Pour ce faire, nous exportons notre base de données dans notre fichier firebase.js , que nous pouvons désormais utiliser dans le fichier use of.js. Sautez dans ce composable. Nous pouvons maintenant importer les articles dont nous avons besoin. La première, nous devons importer le Doc depuis Firebase. De plus, la méthode dont nous venons de parler était SetDoc. Ceci est disponible auprès de Firebase/Firestore. Nous devons également importer cette référence dans notre base de données. Importez une base de données à partir de notre fichier Firebase personnalisé. Ce sera la méthode que nous utiliserons pour créer nos nouveaux documents. Mais nous avons également besoin d'un moyen d'accéder à l'identifiant actuel de l'utilisateur connecté. Passons à la fonction d'inscription, qui se trouve juste ici. Lorsque nous créons un nouvel utilisateur avec cette méthode ici, elle renvoie un objet. Nous pouvons déstructurer la propriété de l'utilisateur pour accéder aux données dont nous avons besoin. Nous pouvons ensuite utiliser ces données juste en dessous pour créer un nouvel objet utilisateur. Const, UseObject. Nous pouvons ajouter des informations supplémentaires à notre utilisateur, qui seront stockées dans la base de données. abord, une propriété appelée CreatedAt, qui est égale à de nouvelles données JavaScript. Nous n'avons pas vraiment besoin de cette date pour notre projet, mais il est toujours utile de l'ajouter au cas où nous en aurions besoin à l'avenir. Nous pouvons également stocker l'e-mail de l'utilisateur, auquel nous pouvons accéder à notre fichier userobject.email. Ensuite, l'élément clé est une nouvelle propriété appelée IsAdmin. Pour commencer, nous allons configurer tous les nouveaux utilisateurs pour que la propriété IsAdmin soit égale à false. Toujours dans cette section d'essai, dès que l'utilisateur s'est inscrit et que cela a été réussi, nous fermerons également le modal en définissant la valeur ouverte du modal de connexion sur false. Traitement. Accédez à la valeur et définissez-la sur false. Juste en dessous de notre objet utilisateur, nous pouvons ensuite créer une nouvelle constante appelée NewDoc. Ce sera le nouveau document que nous allons diffuser dans Firebase en utilisant la méthode doc. La méthode Doc doit l'intégrer dans une référence à notre base de données, que nous venons d'importer. Ensuite, séparé par une virgule, le nom de la collection des utilisateurs. La troisième valeur sera l'ID utilisateur que vous souhaitez utiliser lors de la création de ces documents. Ceci est accessible depuis notre utilisateur. Accédez à la propriété UID. Ensuite, pour transmettre cela à Firebase, nous pouvons attendre SetDoc. Les documents, c'est une référence que nous avons créée juste ici. Transmettez-la comme première valeur. Ensuite, la deuxième valeur correspond aux données de notre enregistrement, qui sont stockées dans l'objet utilisateur. Juste pour clarifier ce que nous faisons ici, lorsqu'un nouvel utilisateur s'inscrit, ce nouvel utilisateur sera d'abord créé dans cette section d'authentification. Nous allons ensuite créer un nouvel objet utilisateur à l'aide de cet ID. Installez ces informations supplémentaires dans la base de données. Mais juste avant de tester cela, étant donné que certains utilisateurs se sont déjà inscrits dans la section d'authentification, qui n'est pas liée à notre base de données, nous devons d'abord effacer ces utilisateurs. Laissons ce compte. Celui-là aussi. Supprimez tous les utilisateurs existants. Cela ne devrait pas être tout ce dont nous avons besoin. Nous avons le nouvel objet utilisateur. Nos documents ont été placés dans le document. Nous devrions avoir toute notre base de données d'importations. Nous devons également nous assurer que cela est également exploité. Revenons à notre projet. Créez un nouvel utilisateur , cliquez sur S'inscrire. Passons à Firebase et à la section d'authentification, nous avons notre nouvel utilisateur. Notez l'ID utilisateur, qui commence par 08. Le vôtre sera différent, bien sûr. Accédez à la base de données en tant que collection de l'utilisateur, qui commence par la même référence de document. Cela va être utile car lorsque nous authentifierons notre utilisateur pour la première fois, nous pouvons avoir accès à son identifiant. Ensuite, nous pouvons également accéder à la propriété IsAdmin. Pour commencer, nous allons cliquer sur le champ IsAdmin. Les changements sont synonymes d'être vrais. Nous avons au moins un utilisateur administrateur. Nous allons ensuite créer un deuxième utilisateur avec la valeur IsAdmin définie sur false. Reconnectez-vous, créez un nouveau compte. Inscrivez celui-ci, voici notre deuxième compte avec IsAdmin défini comme faux. Nous avons maintenant deux utilisateurs avec des niveaux d'accès différents. Nous l'utiliserons dans notre application pour autoriser uniquement les utilisateurs administrateurs à accéder à notre section d'administration. 56. Récupérer les utilisateurs d'administrateur: La première étape pour n'autoriser qu' un accès administrateur à notre application consiste à récupérer l'utilisateur actuel de notre base de données et vérifier si la propriété IsAdmin est définie sur true. Comme nous allons récupérer les utilisateurs, nous pouvons créer une référence à la collection de bases de données dans notre fichier Firebase. Tout comme nous l'avons fait pour les pizzas et les commandes, nous allons créer DBUsersRef, qui redirigera vers la collection de nos utilisateurs. Dites ceci, puis dans le fichier useAuth.js. Cette astuce est à importer, et nous l'utiliserons très bientôt. Ensuite, dans notre fonction, nous allons créer une nouvelle référence appelée UserIsAdmin, qui sera initialement définie sur la valeur false. Cette valeur par défaut, false, sera mise à jour après la création de notre fonction. Cette fonction va récupérer nos données utilisateur, récupérer l'identifiant de l'utilisateur connecté, récupérer l'enregistrement de notre base de et vérifier si la propriété IsAdmin est définie sur true. Créons une fonction, qui sera asynchrone, appelée CheckAdminRole. Créez d'abord une instruction is dans laquelle nous pouvons vérifier si nos données utilisateur, qui sont celles-ci ici, .value, nous pouvons vérifier si elles contiennent l'uid. Nous ajouterons également le point d' interrogation car cette valeur peut parfois être nulle. Ensuite, à l'intérieur, nous pouvons récupérer les détails actuels de l'utilisateur dans la base de données. Nous pouvons le faire en créant un document avec la fonction doc à laquelle nous voulons accéder. Tout d'abord, nous allons accéder au DBUsersRef, qui est notre collection, puis nous pouvons accéder à un enregistrement particulier à l'aide de l'identifiant. Cet identifiant est récupérable à partir de notre fichier UserData.value.UID. Copiez, collez ceci. Il se trouve à l'intérieur d'une constante appelée DocRef. Ensuite, pour réellement demander ces informations, nous pouvons attendre une fonction appelée GetDoc. Nous transmettrons cette référence dans notre document à l'intérieur d'une constante appelée user. Ensuite, nous devons effectuer deux vérifications à l'intérieur d'une instruction is. Tout d'abord, accédez à notre méthode user.exists, cette méthode existe est disponible pour l'utilisateur, et vérifiez si un document est trouvé, puis à l'aide de la double esperluette, nous effectuerons également une deuxième vérification, afin de vérifier si le champ IsAdmin est défini sur vrai. Nous pouvons également le faire sur l'objet utilisateur, qui possède une méthode appelée data, qui nous donnera accès à l'une de ces propriétés, donc Data.IsAdmin. Si ces deux conditions sont vraies, nous pouvons alors mettre à jour notre UserIsAdmin.value pour qu'elle soit égale à true. Si ce n'est pas le cas, dans une instruction else, nous allons définir UserIsAdmin pour qu'il soit égal à false, alors collez-le dedans. Réglez ce paramètre sur false. Nous devrons également importer la méthode GetDoc depuis Firestore. Notre valeur UserIsAdmin sera utilisée dans d'autres fichiers et composants pour vérifier si l'accès est autorisé. Nous n'avons pas besoin de le remettre en bas de page. N'oubliez pas que tout ce que nous avons fait ici est de créer une nouvelle fonction. Nous ne l'avons pas encore appelé pour exécuter le code qu'il contient. L'endroit où exécuter ce code sera à l'intérieur de l'AuthObserver. Faites défiler l'écran jusqu'à OnAuthStateChanged et le code qu'il contient s' exécutera chaque fois qu'un changement d'utilisateur est détecté. Si j'ai accès à un utilisateur, si quelqu'un est connecté, nous vérifierons le rôle d'administrateur. Cependant, si l'utilisateur se déconnecte, nous souhaitons mettre à jour UserIsAdmin.value pour qu'il soit égal à false. Maintenant que tout est en place, passons à la vue d'administration. Nous pouvons accéder à UserIsAdmin, et n'oubliez pas que cette vérification actuelle pour notre section d'administration ne vérifie que si l' utilisateur est connecté. Il ne s'agit pas réellement de vérifier s'ils ont accès à cette page. Nous pouvons améliorer cela en le remplaçant par UserIsAdmin . Essayons ça. Dans la section d'administration, connectons-nous. Tout d'abord, il s'agit de l' e-mail saisi, qui n'est pas un administrateur. Ajoutez l'e-mail et le mot de passe, connectez-vous. Bien. Cela ne nous donne pas accès à la section d'administration. Déconnectez-vous et connectez-vous avec l'utilisateur administrateur. Connectez-vous et dès que cela se produit, nous vérifierons le rôle d'administrateur, ce qui est actuellement vrai. Cela mettra ensuite à jour la valeur de notre variable UserIsAdmin, qui nous donne accès. Nous pouvons cliquer sur Se déconnecter. Dès que cela se produit, la fonction AuthStateChanged s'exécute Définissez UserIsAdmin sur false, masquant ainsi notre section d'administration. 57. Mettre à jour les utilisateurs réguliers: Lorsque ce projet est terminé, nous le remettons au client. La dernière chose que nous voulons faire est de demander au client accéder à notre base de données et de mettre à jour cette propriété d'administration chaque fois que vous ajoutez un nouvel utilisateur ou de supprimer l' accès administrateur si un employé quitte l'entreprise. Ce que nous allons faire pour améliorer cela est de créer une nouvelle section dans l'administration, qui permettra à un utilisateur administrateur existant de la mettre à jour. Ce processus impliquera la création d'un nouveau composant d'administration, lequel l'utilisateur administrateur pourra saisir adresse e-mail de l'utilisateur que nous souhaitons mettre à jour. Comme cela sera également placé dans cette section d'administration, cela signifie également que seuls les utilisateurs administrateurs peuvent effectuer cette mise à jour. Une fois que nous aurons recherché l'utilisateur par e-mail, un message s'affichera pour indiquer si l'utilisateur est actuellement administrateur ou non. Enfin, nous aurons un bouton qui fera passer ce rôle d' administrateur sur vrai ou faux. Tout d'abord, créons notre nouveau composant dans le répertoire des composants et dans le nouveau fichier admin. Nous l'appellerons ToggleAdmin.vue. Ensuite, nous allons créer notre structure de base. Notre structure de base sera similaire à celle des autres composants d' administration. Nous pouvons accéder à l'une de ces autres sections d'administration et accéder au modèle. Copions les sections de ce modèle, donnez-nous la même structure. Collez-le dans notre Toggle.Admin. Simplifions les choses. Nous pouvons déplacer le formulaire, donc tout recadrer, du formulaire de fermeture à la balise du formulaire d'ouverture. Nous conserverons ces mêmes classes pour le style, mais uniquement le titre de niveau 3 sera Toggle Admin Privileges. Nous devons également mettre à jour le nom de cette variable. Nous ne l'avons pas encore créé, mais celui-ci s'appellera ShowToggleAdmin. Fabriquez cet étui en forme de chameau. Nous l'utiliserons également dans les autres emplacements et le créerons dans l'indice de la section de script. Cela utilisera également la configuration du script. Vous devez importer la référence depuis vue et créer notre constante qui est ShowToggleAdmin. Enveloppez ceci dans une référence avec la valeur par défaut true. Cela signifie que, par défaut, nous pourrons voir la section à l'intérieur de l'interface d'administration, puis nous pouvons cliquer sur le bouton Masquer lorsque nous n'avons pas besoin de voir cette section. Accédez aux vues et à la vue d'administration pour l'importer. Dupliquons celui-ci. Il s'agit de ToggleAdmin. Il s'agit également de ToggleAdmin. Placez-le juste en dessous de nos commandes. Accédez à la page d'administration, en bas, où nous pouvons voir d'autres composants. Revenons à ce ToggleAdmin.vue. Ce que nous allons faire, c'est créer deux nouvelles sections. Le premier sera un formulaire dans lequel nous pourrons trouver un utilisateur en saisissant son e-mail. Nous avons besoin d'une constante pour conserver cet e-mail. Cela peut être ref, donc const email, et la valeur initiale sera une chaîne. Nous voulons uniquement afficher ce contenu que nous allons maintenant placer si ShowToggleAdmin est égal à true. Sous l'en-tête, créez un nouveau div. Nous pouvons utiliser le rendu conditionnel avec le if. Nous n'afficherons cette section si showToggleAdmin est égal à true. Placez maintenant le formulaire. Ce formulaire sera assez simple. Nous allons créer un div, la classe de form_group. Ensuite, à l'intérieur, nous ajouterons une étiquette et également une entrée d'e-mail afin que l' utilisateur puisse effectuer une recherche par e-mail. Tout d'abord, l'étiquette ou e-mail avec un texte permettant de trouver l'utilisateur par e-mail. L'entrée. Il aura le type d'identifiant e-mail. Envoyez également par e-mail une valeur de texte d'espace réservé pour saisir l'e-mail. Ensuite, nous pouvons utiliser le modèle V, qui liera la valeur à notre e-mail en haut. Ensuite, juste en dessous de cette section div, nous placerons également un bouton qui permettra de soumettre ce formulaire. Le type de bouton déclenchera alors une fonction permettant de trouver notre utilisateur. Nous n'avons pas encore créé cette fonction, mais nous allons l'ajouter pour le moment. clic [inaudible] empêchera le comportement par défaut et déclenchera la fonction de désactivation, qui créera bientôt l'appel FindUser. FindUser doit également saisir cette adresse e-mail que nous avons enregistrée ici. Entrez le texte de la recherche d'un utilisateur. Ensuite, toutes les fonctionnalités nécessaires seront terminées et j'utiliserai off composable. En haut, la première chose à faire est de créer deux constantes supplémentaires. Le premier sera pour un message. Nous appellerons cela le ToggleAdminMessage, qui utilisera ref et une chaîne vide pour commencer, et une deuxième constante appelée SelectedUser. Il s'agira d'un conteneur destiné à héberger un utilisateur que nous recherchons. Nous allons définir cette valeur comme égale à ref et à la valeur initiale nulle. Ce ToggleAdminMessage contiendra la valeur, qui indiquera si l' utilisateur est administrateur ou non, ou s'il est introuvable avec l'e-mail fourni. Créons notre fonction, donc asynchrone appelée FindUser. Utilisons au-delà de l'adresse e-mail de l'utilisateur que nous voulons rechercher. Placer une section d'essai et un catch en tant qu'erreur. Ensuite, nous pouvons nous mettre au travail dans la section d'essai. La première chose que nous allons faire ici est d' effacer tous les messages que nous aurions pu avoir auparavant. Ceci est stocké dans ToggleAdminMessage.value. Définissez cette valeur sur une chaîne vide. Ensuite, nous créerons également une déclaration conditionnelle qui vérifiera si l'utilisateur est administrateur. N'oubliez pas que cette propriété est actuellement définie ici. Si cela est égal à false, l'utilisateur n'est pas autorisé à mettre à jour la propriété admin Nous allons donc quitter cette fonction. N'oubliez pas les éléments que nous appelons à ce sujet depuis la section d'administration. Cette section devrait déjà être protégée de toute façon, mais il ne s'agit que d'une vérification supplémentaire au cas où. Ensuite, nous utiliserons la méthode de requête Firebase. Cela nous permettra de rechercher un enregistrement particulier si de l'utilisateur est collection de l'utilisateur est stockée dans DBUsersRef. Ensuite, nous filtrerons cela en utilisant la méthode where. Nous voulons vérifier la propriété de l'e-mail et vérifier si elle correspond à une adresse e-mail particulière. adresse e-mail que nous voulons vérifier L'adresse e-mail que nous voulons vérifier est celle qui est transmise à toutes les fonctions à cette fin, ce qui permettra à tous nos utilisateurs de vérifier par rapport la propriété e-mail et de vérifier si c' est bien celle qui a été transmise depuis notre formulaire. Ce qu'il y a à l'intérieur d'une constante appelée données de requête. Ensuite, nous pouvons faire une demande à ce sujet depuis Firebase en attendant GetDocs. Analyser les données de la requête, puis les stocker dans une constante appelée user. Cet utilisateur sera la valeur renvoyée par Firebase. À l'aide de cet objet utilisateur, nous pouvons ensuite construire un nouvel objet utilisateur contenant uniquement les propriétés dont nous avons besoin. N'oubliez pas que lorsque nous avons examiné ces objets, que nous avons obtenus de Firebase par le passé, nous avons obtenu de nombreuses informations, la plupart ne nous sont pas nécessaires. Nous créons un nouvel objet utilisateur, plaçons dans l'identifiant, que nous pouvons récupérer auprès de notre utilisateur, les documents, et GetDocs va renvoyer plusieurs documents, mais nous ne devrions avoir qu' un seul utilisateur avec un e-mail unique. Pour cette raison, nous pouvons sélectionner le premier document avec le numéro d'index 0. Sélectionnez l'identifiant, puis dupliquons-le deux fois. La deuxième propriété est l'e-mail. Modifiez-les tous les deux. La troisième propriété dont nous avons besoin sera IsAdmin. Même en tant qu'objet utilisateur plus simple qui ne contient que les propriétés dont nous avons besoin. Nous pouvons ensuite définir l'utilisateur sélectionné pour qu'il soit égal à cet objet. N'oubliez pas la valeur. C'est le cas si tout est couronné de succès. Sinon, nous pouvons mettre à jour la SelectedUser.value pour qu'elle soit égale à null. Ensuite, mettez également à jour notre valeur ToggleAdminMessage pour qu'elle soit égale à une chaîne. Vous pouvez placer le message de votre choix ici, mais je dois dire qu'aucun utilisateur n'a été trouvé avec cet e-mail. Nous devons également importer ces méthodes depuis Firebase, que nous allons simplement utiliser. Nous avons la requête, nous avons où, nous avons GetDocs. En fait, juste avant cela, nous devons également appeler la méthode des données avant l'e-mail. La même chose avant IsAdmin. Cette fonction extraira les propriétés dont nous avons besoin de chaque document. Ainsi, sur ces importations situées en haut de notre Firestore, nous avons GetDocs, la requête et aussi où. Enfin, en bas de l' instruction return, nous pouvons renvoyer notre fonction qui était FindUser, la valeur SelectedUser et également le message qui était ToggleAdminMessage. Nous y sommes. Enregistrez ce fichier et nous venons de terminer. Ensuite, nous allons les importer et les réutiliser dans ToggleAdminComponents. 58. Mettre à jour les utilisateurs réguliers: Auparavant, nous avions créé une fonction permettant de rechercher un utilisateur par son e-mail, puis nous stockons cette valeur dans cette constante utilisateur sélectionnée. Nous allons maintenant nous diriger vers le composant ToggleAdmin.vue pour les importer tout en haut. Nous allons importer UseAuth, à partir du chemin du fichier @/composable/UseAuth. Nous allons ensuite extraire et stocker ces valeurs de retour dans une constante. Nous avons donc besoin de find, nous avons besoin du SelectedUser, et ToggleAdminMessage est également égal à UseAuth, appelez cette fonction, puis faites défiler la page vers le bas. Juste en dessous de cette section du formulaire, nous allons créer une deuxième section qui affichera l'utilisateur s'il en trouve un. Il comportera également un message indiquant si un utilisateur est actuellement administrateur ou non, puis un bouton pour déclencher une fonction permettant de changer la propriété d'administrateur. Créez donc div pour cette section. Nous voulons utiliser le if pour n'afficher cette section que si le SelectedUser est égal à une classe de selected_user. Vers l'élément p où je peux afficher le message de l'administrateur. Il s'agissait de ToggleAdminMessage , puis d'un deuxième élément p juste en dessous. Celui-ci aura une chaîne de texte où la valeur de l' utilisateur est actuellement définie en tant qu'administrateur ou non administrateur. Nous allons dire utilisateur, puis le transmettre à l' SelectedUser.L'e-mail est actuellement défini comme, puis nous voulons définir dynamiquement s'il est ou faux. La façon dont nous pouvons le faire est de sélectionner notre SelectedUser.IsAdmin. À l'aide de l'opérateur ternaire JavaScript, nous pouvons afficher le texte de admin si cela est vrai. Si ce n'est pas le cas, un texte indiquant que vous n'êtes pas administrateur. Le dernier élément à entrer dans cette section est un bouton. Vous pouvez maintenant cliquer sur ce bouton, évitez la valeur par défaut. Cela déclenchera une fonction que nous n'avons pas encore créée appelée ToggleAdmin. Nous reviendrons sur cette fonction dans un instant, mais pour l'instant, le texte de cliquez ici pour changer les paramètres d'administration. Enregistrez ceci et nous pourrons ensuite revenir à notre utilisation de composable, où nous pouvons créer cette fonction ToggleAdmin. Async, ToggleAdmin, créez les blocs try et catch. Comme nous l'avons fait précédemment, nous allons commencer par une instruction if pour vérifier si l'utilisateur est la valeur admin. Si ce n'est pas le cas, nous abandonnerons cette fonction car ils ne sont pas autorisés. Cela se trouve à partir de UserIsAdmin.Value. C'est faux, nous allons renvoyer cette fonction avant d' apporter des modifications. Nous devons maintenant créer une référence à un document particulier que nous voulons mettre à jour la stocker dans une constante appelée DocRef. Ensuite, nous pouvons le construire avec cette méthode documentaire Firebase. En faisant référence à notre base de données, nous voulons faire référence à la collection de l'utilisateur. Enfin, nous voulons trouver un document à l'aide de l'identifiant. Nous pouvons le faire en saisissant notre SelectedUser et en accédant à la propriété ID. Donc SelectedUser.value.id. N'oubliez pas que ce que nous voulons faire avec ce document est de mettre à jour la propriété IsAdmin pour qu'elle soit à l'opposé de ce qu' elle est actuellement. Pour cela, nous pouvons écrire une méthode Firebase appelée UpdateDoc. Nous transmettrons la référence du document ci-dessus. Ensuite, en tant qu'objet, nous pouvons définir exactement propriétés que nous voulons mettre à jour. Nous voulons simplement mettre à jour la propriété IsAdmin pour qu'elle soit à l'opposé de ce qu'elle est actuellement. Nous pourrions le faire en accédant à notre propriété SelectedUser.value.IsAdmin et définissant comme étant le contraire de ce qu'elle est actuellement. Une fois que nous aurons mis à jour notre document Firebase, nous appellerons à nouveau FindUser, qui récupérera et définira nos données utilisateur et mettra à jour tous les composants. Nous devons également transmettre cet e-mail de l'utilisateur, qui se trouvera dans SelectedUser.value.email. Nous allons simplement le placer dans un simple journal de console dans la section des erreurs. De plus, comme nous avons utilisé la méthode UpdateDoc de Firebase, nous devons l'importer en haut , puis renvoyer la fonction ToggleAdmin en bas. Revenons au ToggleAdmin.view où nous appelons cette fonction à partir de notre bouton, qui se trouve juste ici, mais nous devons encore importer depuis notre composable. Tout devrait être maintenant en place. Passons à l'administrateur. adresse e-mail est actuellement celle de l'administrateur, mais l'autre est définie comme fausse. Allons-y maintenant. Cliquez sur « Rechercher un utilisateur ». Cet utilisateur n'a pas été récupéré. Nous pouvons voir que la propriété de IsAdmin est définie sur false. Cliquez sur « Toggle ». Il est ensuite mis à jour pour devenir un utilisateur administrateur, ce que vous pouvez également voir dans la console. Cela n'est pas vrai. Nous rétablirons ensuite cette valeur comme fausse, ce que nous pouvons également voir mis à jour dans la base de données. 59. Règles de Firebase: Ce sera maintenant la partie où nous augmenterons la sécurité de notre application du côté de la base de données. Ce que nous ferons dans la console Firebase si vous accédez à la base de données Firestore, puis nous avons cette option appelée règles. Cela nous permettra d'ajouter des règles de sécurité à notre base de données afin de déterminer qui peut faire quoi. Nous pouvons définir qui souhaite créer, lire, mettre à jour et supprimer des données de notre base de données, et nous pouvons être plus précis quant documents ou aux collections auxquels ces règles s'appliqueront. À l'heure actuelle, les règles de notre base de données ne sont pas sécurisées. Si nous y jetons un coup d'œil, nous avons ici tout ce qui correspond une certaine collection de documents dans notre base de données. Pour le moment, cela pointe vers le point d'entrée externe de notre base de données. Ensuite, imbriqués à l'intérieur, nous pouvons ajouter correspondances supplémentaires pour être plus précis sur les documents ou les collections auxquels les règles s'appliqueront. Ce paramètre actuel de document égal à étoile correspondra tous les documents de l'ensemble de notre base de données. Notre base de données n'est pas sécurisée car elle permet un accès complet en lecture et en écriture tant que nous sommes dans le mois suivant la création de la base de données. Cette règle d'un mois seulement est une fonctionnalité de sécurité, alors n'oubliez pas de désactiver l'accès complet. Cela protégera à nouveau notre base de données si nous oublions de revenir et d'ajuster ces règles. Pour ajouter nos propres règles, nous allons supprimer cette correspondance interne et commencer à écrire nos propres règles. Je vais le supprimer et laisser la correspondance extérieure, qui pointe à nouveau vers notre base de données complète. Ensuite, nous pouvons créer un match imbriqué. Nous allons commencer par notre collection de pizzas, donc /slash pizzas, puis nous aurons également les commandes et les utilisateurs. Nous pouvons également ajouter ces règles. N'oubliez pas que chacun de ces documents relatifs à la pizza est stocké dans un identifiant de document unique. Nous pouvons placer une variable et lui donner un nom de doc Id. Cela nous permettra d'accéder à l'identifiant du document dans cette section. Pour les pizzas, nous commencerons par dire « autoriser la lecture ». Nous autorisons la lecture parce que nous sommes d'accord avec le fait que quiconque lise les éléments du menu. Cependant, lorsqu' il s'agit de créer, de mettre à jour ou de supprimer des pizzas, celles-ci doivent être contrôlées. Nous pouvons également regrouper ces opérations. Nous pouvons dire autoriser, créer, mettre à jour et également supprimer. Tant que certaines conditions sont remplies, nous ne voulons autoriser ces trois opérations si une certaine condition est vraie. Cette condition est qu'il s' agit d'un utilisateur administrateur. La première chose à faire est de vérifier si l'utilisateur est réellement authentifié. Nous pouvons transmettre une instruction if où nous pouvons accéder à l'objet de la requête où nous pouvons accéder à la propriété off et vérifier si cela n'est pas égal à null. Cela signifie que l'utilisateur qui demande ces documents particuliers à l'intérieur de nos pizzas est actuellement authentifié. Il s'agit de la première étape. Nous avons un utilisateur authentifié, ou nous devons également accéder à propriété d' un utilisateur ou à son administrateur dans la base de données. Nous pouvons le faire en utilisant une double esperluette, la chaîne lors d'un contrôle supplémentaire. Nous pouvons accéder à une fonction get fournie par Firebase, qui nous permettra d' ajouter un chemin de fichier vers un document particulier. À l'intérieur, nous devons commencer par le chemin racine. La correspondance la plus complète, qui pointe vers notre base de données. Nous pouvons copier cette section et la coller dedans. Ensuite, comme nous l'avons fait ici, nous pouvons ajouter le nom de notre collection. Nous voulons pointer vers /users, puis vers un identifiant utilisateur particulier. Nous pouvons accéder à l'identifiant utilisateur actuel à partir de cet objet request.auth. Juste après /users, nous pouvons insérer une variable avec le symbole dollar, ouvrir les crochets, demander personnellement .auth, puis accéder à l'uid. Cela nous amène au document auquel vous souhaitez accéder. Ensuite, juste après ces crochets, nous accédons aux données, puis à la propriété qui est IsAdmin, en majuscule A. Une fois que nous aurons accédé à cette propriété IsAdmin, nous voudrons également vérifier si cela est égal à vrai. Juste pour clarifier, nous allons procéder à deux vérifications. Nous vérifions tout d'abord si l'utilisateur est réellement authentifié, est-à-dire s'il s'est connecté avec succès. La deuxième vérification consiste à accéder à la collection de l'utilisateur, puis à vérifier si la propriété IsAdmin est également définie sur true. Avant d'aller plus loin, testons ces règles dans le terrain de jeu des règles. Nous pouvons étendre cela et créer différents types de simulation pour obtenir nos données, créer de nouvelles données, les mettre à jour et les supprimer également. L'emplacement. C'est le chemin que nous sommes en train de vérifier. C'est /pizzas /DocID. Nous voulons tester cela auprès d'un utilisateur authentifié. Notre fournisseur d'authentification est le mot de passe, puis l'UID Firebase. Il s'agit de l'identifiant utilisateur à l'origine de la demande. Je vais prendre ça. Sans quitter cette page, je vais cliquer avec le bouton droit de la souris et ouvrir l'authentification dans un nouvel onglet. Copions. En fait, nous allons entrer dans la base de données, dans les utilisateurs. Il s'agit d'un identifiant unique. Copions ceci et cet utilisateur est l'administrateur. Je vais coller ça dedans. Cliquez sur Exécuter et nous ferons une demande d'obtention. Ici, nous pouvons voir que cela est mis en évidence sur la collection de pizzas. N'importe qui peut lire ces données. Nous nous attendrions à ce que tout se passe bien. Mais les restrictions concernent la création, la mise à jour et la suppression de données. Pour créer des données, Optimist nous a fait une erreur. Jetons un œil à cela. Cela indique que notre base de données correspond. La base de données est une base de données, des documents et je pense qu'elle a juste besoin d'un symbole dollar puisqu'il s'agit d'une variable. Rejeter. Nous avons également juste besoin des crochets réguliers qui correspondent à celui-ci ici pour insérer la variable. Nous allons essayer cela encore une fois. Exécutez cette largeur lors de la création. C'est très bien. Mise à jour. C'est très bien. N'oubliez pas que nous sommes un utilisateur d'ISAdmin. De plus, la suppression fonctionne bien. Remplaçons cela pour qu'il s'agisse l'utilisateur qui n'est pas authentifié IsAdmin est donc égal à false. Copiez ceci, collez-le. Nous sommes en train de lancer une demande de suppression. Cela est refusé car nous ne sommes pas administrateurs, mais nous devrions tout de même pouvoir obtenir nos données puisque tout le monde est autorisé à lire nos pizzas. Créez, il devrait y avoir un échec. Enfin, la mise à jour 2. Bien, maintenant nous savons que cela fonctionne. Nous pouvons le répéter pour d'autres collections. Mais pour ce qui est des commandes, nous voulons que n'importe qui puisse créer une commande. Mais chacune des trois autres opérations ne doit être effectuée que par un utilisateur administrateur. Copions ce match. Ensuite, collez-le juste en dessous. Celui-ci est pour nos commandes. Vous pouvez également renommer cette variable si vous le souhaitez. Ici, nous allons permettre à n'importe qui de créer une commande. Nous souhaitons ajouter certaines restrictions lors de la lecture, mise à jour ou de la suppression. Les mêmes règles s'appliquent. Nous voulons vérifier si l'utilisateur est connecté et authentifié. Nous obtiendrons également la propriété IsAdmin à partir de la collection de l'utilisateur. Tout cela peut rester le même. Testez-le. Ce sont des ordres. C'est bien. Nous allons passer à Créer. N'oubliez pas que tout le monde peut créer une nouvelle commande et que nous sommes toujours avec l'utilisateur, qui n'est pas un administrateur. Ça devrait aller. Nous pouvons maintenant tester les trois autres opérations. Écoutez, c'est un échec, comme prévu. Mise à jour. Supprimer. Ensuite, juste pour confirmer, nous allons accéder à la collection de nos utilisateurs et récupérer l'identifiant de l'utilisateur, qui est un administrateur. Nous en choisissons un. Je vais passer à l'utilisateur qui est administrateur, qui peut effectuer une suppression, une mise à jour, une création et aussi une lecture. La dernière chose que nous devons faire est de faire correspondre la collection de nos utilisateurs. Ils devraient permettre à tout le monde créer un compte pour commencer. Nous allons créer une correspondance ou /users, transmettre la variable de DocID. Ensuite, nous voulons permettre à tout le monde de créer un nouveau compte, et nous voulons également que les utilisateurs puissent lire leurs propres données. Nous allons autoriser la lecture. Mais nous allons également restreindre cela. Nous vérifierons également si l'utilisateur est authentifié. Collez ceci dedans. De plus, pour permettre à l'utilisateur d'accéder uniquement à ses propres données, nous allons vérifier si l'utilisateur, qui est disponible sur l'objet de la demande est égal au même identifiant utilisateur, qui est transmis à cette variable. La double esperluette constitue un second chèque. Demande d'accès pour authentifier l'UID. Il s'agit de l'identifiant de la personne qui fait réellement la demande. Nous voulons vérifier si cela correspond à l'identifiant du document. Par conséquent, si les deux conditions correspondent, l'utilisateur lit ses propres données, mais en plus des utilisateurs qui lisent leurs propres données, nous souhaitons également permettre à un utilisateur lire les données de n'importe quel utilisateur en plus. En plus de cela, nous voulons également placer cela entre crochets, puis effectuer une deuxième vérification. Autorisez également que cela soit vrai si l'utilisateur est un administrateur. Nous savons déjà comment obtenir ces informations, et c'est avec cette fonction d' obtention juste au-dessus. Copiez tout, du début à la fin , en vérifiant si l'administrateur est égal à vrai, puis veillez à le coller entre crochets. Cela permet désormais de toujours vérifier si l'utilisateur est authentifié, puis de vérifier s'il est administrateur ou s'il accède à ses propres données. En fait, il doit s'agir de l'opérateur JavaScript OR plutôt que de l'opérateur AND, ce qui signifie que l'un ou l'autre de ces côtés peut être vrai. La dernière chose à vérifier est d'autoriser la mise à jour et de supprimer des fonctions s'il s'agit d'un utilisateur administrateur. Nous allons autoriser. Combinez-les pour mettre à jour et supprimer des sections. Nous ajouterons les mêmes conditions que n'importe laquelle des conditions ci-dessus. Nous vérifierons si l' utilisateur est connecté et s'il est également administrateur. Copiez cette ligne, collez-la, et toutes les règles sont maintenant en place. Cela pourrait également être étendu pour permettre aux utilisateurs de mettre à jour leurs propres informations , mais c'est bien pour le moment. Mais il inclut également de nombreux doublons de code permettant de vérifier si l'utilisateur est un administrateur avec la fonction get. Nous pouvons améliorer cela en créant des fonctions réutilisables. Nous allons créer deux fonctions. L'une serait de vérifier si l'utilisateur est administrateur, puis de vérifier s'il accède à ses propres informations. Nous allons tout mettre dans l' allumette extérieure. Mets un peu d'espace. Ensuite, nous allons créer une fonction comme nous le ferons en JavaScript, donc IsAdmin, puis une deuxième fonction appelée IsAccountOwner. IsAdmin, c'est celui que nous utilisons plusieurs fois maintenant. Nous voulons copier que l' authentification de la demande n'est pas égale à null. jusqu'à la fin de Copiez ceci jusqu'à la fin de la fonction get. Accédez à la fonction IsAdmin, puis nous voulons renvoyer cette valeur, alors collez-la. Cela signifie que notre fonction renverra une valeur vraie ou fausse. Donc, IsAccountOwner, cela doit également vérifier si l' utilisateur est authentifié, nous allons donc renvoyer des demandes dont l'authentification n'est pas égale à null. Ensuite, comme nous l'avons fait en bas pour les utilisateurs, nous voulons également vérifier si l'identifiant de la personne qui fait la demande est égal à l'identifiant du document, alors copiez-le. Enchaînez-le avec les deux esperluettes, collez-le dedans. Mais n'oubliez pas que nous accédons ici à l'identifiant du document. L'identifiant de ce document n'est disponible que dans cette section . Nous devons donc transmettre la fonction, l'identifiant, puis nous remplacerons celui-ci. Nous ajouterons l' identifiant de ce document lorsque nous appellerons cette fonction. Nous y sommes presque maintenant. Ce que nous devons faire, c'est supprimer tout ce code de cabine et le remplacer par nos deux fonctions. Le premier est IsAdmin. Cela permet de vérifier que l' utilisateur est authentifié, et aussi s'il est administrateur, afin que nous puissions supprimer tout le code du match de nos pizzas. Juste après ces instructions, supprimez toute cette ligne, remplacez-la par notre fonction exactement la même pour nos commandes. Nous vérifions la même chose. Découpez tout cela à sa place. Insérez la fonction. La dernière étape concerne nos utilisateurs, qui utiliseront ces deux fonctions. Pour la lecture, nous allons supprimer tout ce qui se trouve après l'instruction if. Cela va utiliser les deux fonctions. Si IsAccountOwner, l'identifiant sera l'identifiant du document ci-dessus. Tout est administratif. Cela effectuera les deux mêmes vérifications qu'auparavant, et pour la demande de suppression, nous allons tout déplacer après les instructions if et simplement transmettre la fonction IsAdmin. Cela semble maintenant beaucoup plus propre et beaucoup plus facile à lire. La dernière étape consiste à tester nos conditions d'utilisation sur le terrain de jeu. Tout d'abord, l'emplacement où nous testons le parcours de l'utilisateur. Nous allons commencer par copier le nom d'utilisateur de l'utilisateur administrateur. IsAdmin est égal à vrai, collez-le. Celui-ci devrait être autorisé puisque nous sommes l'utilisateur administrateur. Nous effectuerons également la deuxième vérification pour voir si le propriétaire du compte fait cette demande. Même si nous ne sommes pas l'administrateur, copions l'utilisateur non administrateur. Collez-le dedans, dans le code. Cette simulation est désormais refusée. La raison pour laquelle cela est refusé est bien que nous soyons propriétaires d'un compte, nous n'accédons pas à nos propres documents. Nous accédons simplement à tous les documents génériques de la collection de l'utilisateur. Pour tester l'accès à nos propres documents, nous allons déplacer la variable et y coller le même nom d'utilisateur que celui indiqué ci-dessous. Exécutez ceci. Cela fonctionne désormais puisque nous sommes le propriétaire du compte des documents que nous sommes en train de vérifier. Créez. Essayons ça. Cela fonctionne. Nous pouvons également remplacer la variable. Cela devrait fonctionner pour tous les documents. Nous allons en essayer une autre. Nous allons essayer de le supprimer. Exécutez-le en tant qu'utilisateur non administrateur, et cela devrait échouer. Éteins. Copiez l'utilisateur administrateur. Collez-le, et celui-ci est autorisé puisque nous sommes un utilisateur administrateur. Nous y voilà. Il semble que tout fonctionne correctement avec nos règles de sécurité, et vous pouvez également les mettre à jour ou les modifier si vous le souhaitez. Mais pour l'instant, notre application est beaucoup plus sécurisée et nous publierons ces modifications.