Intégrer Supabase avec Vue.Js

Par oregistresainvilus, 16 février, 2024
Supabase - Logo

Les framework JavaScript

Plusieurs frameworks peuvent être utilisés avec Supabase, notamment React, Flutter, Vue.js, Angular et bien d'autres. Dans ce chapitre, Vue.js sera utilisé, car c’est le framework de JavaScript utilisé dans le projet Progression développé par Patrick Lafrance. Cela me donnera l'opportunité d'approfondir ma connaissance de cet outil, en complément de Supabase.

Image retirée.

 

Explication du projet

Dans le cadre de ce projet, il sera question de créer une application web dynamique développée en utilisant Vue.js et Supabase. Son objectif principal est de fournir une plateforme interactive pour répondre à une variété de quiz. Grâce à son intégration avec Supabase, SupaQuiz offre une expérience utilisateur fluide et sécurisée. Les utilisateurs peuvent parcourir différents quiz, sélectionner ceux qui les intéressent et répondre aux questions associées pour obtenir des points.

Installation de Supabase et Vue.JS

Commençant par accomplir la tâche la plus basique en mettant en place Supabase. Pour intégrer Supabase dans Vue.js, il suffit d’installer la plus récente version de Node.js « npm init vue@latest my-app » et installer les librairies de Supabase en lançant cette commande : « cd my-app && npm install @supabase/supabase-js ». 

Créer la table Utilisateur dans Supabase

Une fois les deux technologies installées, il faut créer la table Utilisateur qui servira plus tard à afficher tous les utilisateurs depuis Supabase dans une application créée avec Vue.js.

  -- Create the table

  create table

  Utilisateur (

    id bigint primary key generated always as identity,

    nom text,

    prenom text,

    email text,

    avatar text,

    mdp text,

    creation timestamp with time zone,

    points bigint

  );

  -- Insert some sample data into the table

  INSERT INTO public."Utilisateur" (nom, prenom, email, mdp, avatar, creation) 

VALUES 

  ('Fring', 'Gus', 'gus@example.com', 'password123', 'avatar_gus.jpg', CURRENT_TIMESTAMP),

  ('White', 'Walter', 'walter@example.com', 'password123', 'avatar_walter.jpg', CURRENT_TIMESTAMP),

  ('Pinkman', 'Jesse', 'jesse@example.com', 'password123', 'avatar_jesse.jpg', CURRENT_TIMESTAMP),

  ('Ehrmantraut', 'Mike', 'mike@example.com', 'password123', 'avatar_mike.jpg', CURRENT_TIMESTAMP),

  ('Goodman', 'Saul', 'saul@example.com', 'password123', 'avatar_saul.jpg', CURRENT_TIMESTAMP),

  ('White', 'Skyler', 'skyler@example.com', 'password123', 'avatar_skyler.jpg', CURRENT_TIMESTAMP),

  ('White', 'Walter Jr.', 'walterjr@example.com', 'password123', 'avatar_walterjr.jpg', CURRENT_TIMESTAMP);

Créer le fichier client

Il est nécessaire de créer un fichier client JavaScripts «supabaseClient » qui contient l'URL du projet de Supabase et son Anon Key. Grâce à ces deux éléments, il sera possible d’établir une connexion avec la base de données SupaQuiz qui a été développée sur le net.

  import { createClient } from '@supabase/supabase-js'

  export const supabase = createClient('https://<project>.supabase.co', '<your-anon-key>')

Afficher les données

Utilisation des filtres de Supabase

Pour récupérer des données à l’aide de Supabase dans une application JavaScript. Supabase suis le même principe que les languages SQL typique. Par exemple, dans MySQl pour récupérer la liste des utilisateurs c’est : « SELECT * FROM Utilisateur; ». C’est la même chose pour Supabase sous forme de fonction : const { data, error } = await supabase.from('countries').select(). 

Schéma des tables

Image retirée.

La page Utilisateur

  1. Template (Modèle) :
  • La section <template> contient la structure HTML de la page. Dans ce cas, il y a une barre de recherche avec un champ texte et un bouton Search, ainsi qu'un tableau pour afficher les utilisateurs.
  • Le tableau affiche les détails des utilisateurs comme leur avatar, pseudo, nom, prénom et points, grâce à la directive de v-for de Vue.js.
  1. Script setup (Configuration du script) :
    • Dans la section <script setup>, le code est écrit de manière compacte à l'aide du système de script setup de Vue 3. Il importe ref et onMounted de Vue, ainsi que Supabase et router (le routeur de l'application).
    • Il initialise deux variables réactives (utilisateurs et loading) à l'aide de ref(). Loading est utilisé pour afficher une animation de chargement lorsque les données sont récupérées.
    • Il définit une fonction goToUtilisateurQuizs(utilisateurId) qui est utilisée pour naviguer vers une page contenant les quizs d'un utilisateur spécifique.
    • Il définit également une fonction asynchrone getUtilisateurs() pour récupérer les utilisateurs depuis la base de données Supabase avec la commande : supabase.from('Utilisateur').select() . En cas d'erreur lors de la récupération des données, un message d'erreur est affiché dans la console.
  2. Code :

<template>

  <div class="">

    <div class="container d-flex justify-content-center">

      <div class="input-group my-3 w-50">

        <input type="text" class="form-control" placeholder="Search Utilisateur" aria-label="Rechercher un utilisateur"

          aria-describedby="basic-addon2">

        <div class="input-group-append">

          <button class="btn btn-dark" type="button">Search</button>

        </div>

      </div>

    </div>

    <table class="table table-dark">

      <thead>

        <tr>

          <th scope="col">#</th>

          <th scope="col">Avatar</th>

          <th scope="col">Pseudo</th>

          <th scope="col">Nom</th>

          <th scope="col">Prénom</th>

          <th scope="col">Point</th>

        </tr>

      </thead>

      <div class="d-flex justify-content-center align-items-center" v-if="loading">

        <div class="spinner-border text-dark" role="status">

        </div>

      </div>

      <tbody v-else>

        <tr class="utilisateurs" v-for="utilisateur in utilisateurs" :key="utilisateur.id" @click="goToUtilisateurQuizs(utilisateur.id)">

            <th scope="row">{{ utilisateur.id }}</th>

            <td><img class="rounded-circle utilisateurs-img" :alt="'Image de ' + utilisateur.nom" :src="utilisateur.avatar" /></td>

            <td>{{ utilisateur.pseudo }}</td>

            <td>{{ utilisateur.nom }}</td>

            <td>{{ utilisateur.prenom }}</td>

            <td>{{ utilisateur.points }}</td>

        </tr>

      </tbody>

    </table>

  </div>

</template>

 

<script setup>

import { ref, onMounted } from 'vue'

import { supabase } from '../../lib/supabaseClient.js'

import router from "@/router";

 

const utilisateurs = ref([])

const loading = ref(true)

 

// Fonction qui permet d'aller dans une page qui contient les quizs

const goToUtilisateurQuizs = (utilisateurId) => {

  router.push({ name: 'utilisateurQuizsDetails', params: { utilisateurId } })

}

 

//Obtenir les utilisateurs

async function getUtilisateurs() {

  try {

    const { data } = await supabase.from('Utilisateur').select()

    utilisateurs.value = data

  } catch (error) {

    console.error('Error fetching data:', error.message)

  } finally {

    loading.value = false

  }

}

 

onMounted(() => {

  getUtilisateurs()

})

</script>

 

<style src="./utilisateur.css"></style>

Image retirée.

 

La page Quiz

Le code de la page Quiz est similaire à celui de la page utilisateur. La particularité réside dans le fait que lorsque l'on clique sur un quiz, on affiche les questions qui sont associées à ce quiz.

Image retirée.

La page Question

La page Question suis exactement le même principe que la page Utilisateur et Quiz pour afficher les données, mais la particularité de cette page est l’utilisation du jsonb (Données JSON binaire, décomposé) qui permet d’ajouter des réponses dans un fichier JSON. Cela permet de réduire considérablement le nombre de tables, car cela ne vaut pas la peine de créer une table spécifiquement pour les réponses.

Image retirée.

Source

Use Supabase with Vue

Supabase Doc

Stackoverflow (How to make the whole row clickable?)

Supabase - Using filters.

Étiquettes

Commentaires