Comment construire une application SaaS multi-locataire avec Next.js (Frontend Integration) –
Dans le Première partie de cette série d’articlesnous avons implémenté le backend avec AppWrite, installé certaines dépendances et configuré un permis pour gérer l’autorisation et le contrôle d’accès basé sur les rôles.
Voyons maintenant comment nous pouvons intégrer le frontend avec le backend pour une application EDTech entièrement fonctionnelle.
Intégration frontale: mise en œuvre de l’autorisation dans Next.js
Maintenant que vous avez une autorisation backend en place en utilisant le permis, intégrez-le dans votre frontend Next.js. Le frontend devrait:
Répondez aux autorisations des utilisateurs du backend pour contrôler ce que les utilisateurs peuvent voir et faire.
Assurez-vous que les demandes d’API respectent le contrôle d’accès basé sur les rôles (RBAC).
Masquer les éléments de l’interface utilisateur pour les utilisateurs non autorisés (par exemple, empêcher les étudiants de voir «créer un affectation»).
1. Configuration des appels API avec autorisation
Étant donné que seul le backend applique les autorisations, votre frontend ne décide jamais d’accès directement – au lieu, il:
Envoie des demandes au backend
Attend la réponse d’autorisation du backend
Affiche les données ou les éléments d’interface utilisateur en conséquence
Pour commencer, vous devrez installer Node.js sur votre ordinateur.
Ensuite, suivez ces étapes, suivez les étapes ci-dessous:
npx create-next-app@latest frontend
cd frontend
2. Initialiser Shadcn
Ce que vous observerez après la création de votre projet NextJS, c’est que Tailwind CSS V4 est installé pour vous dès la sortie de la boîte, ce qui signifie que vous n’avez rien à faire d’autre. Parce que nous utilisons une bibliothèque de composants, nous allons installer Oignon shadcn.
Pour ce faire, nous devons exécuter la commande init pour créer un fichier composants.json dans la racine du dossier:
Après initialisation, vous pouvez commencer à ajouter des composants à votre projet:
Si vous vous demandez, si vous devez utiliser Force en raison de la compatibilité de la version NextJS 15 avec Shadcn, appuyez sur Entrée pour continuer.
3. Installez les packages nécessaires
Installez les packages suivants:
npm i lucide-react zustand
npm i --save-dev axios
Maintenant que nous avons installé tout ce dont nous avons besoin pour créer notre application, nous pouvons commencer à créer nos autres composants et itinéraires.
Pour maintenir la cohérence de l’interface utilisateur tout au long de l’application, collez ce code dans votre fichier global.css (collez-le en dessous de votre importation de tailwindcss):
Ce fichier définit un composant React, addAssignmentDialog, qui rend un formulaire de dialogue pour ajouter de nouvelles affectations. Il gère l’état de formulaire à l’aide d’Usestate et soumet les données d’attribution à un composant parent via l’offre OnAddAssignment. La boîte de dialogue comprend des champs d’entrée pour le titre, la matière, l’enseignant, la classe et la date d’échéance, et se ferme lors de la soumission.
Ce fichier définit un composant React, AddStudentDialog, qui rend un formulaire de dialogue pour ajouter de nouveaux étudiants. Il gère l’état de formulaire à l’aide d’Usestate et soumet les données de l’élève à un composant parent via l’offre OnAddDstudent. La boîte de dialogue comprend des champs d’entrée pour le prénom, le nom de famille, la classe, le sexe (avec une liste déroulante) et l’âge, et gère les états de chargement pendant la soumission.
Ce fichier définit un composant React, affectationStables, qui rend une table pour afficher une liste des affectations. Il faut un éventail d’affectations en tant qu’accessoires et cartes à travers eux pour remplir les lignes de table avec des détails tels que le titre, le sujet, la classe, le professeur et la date d’échéance. Le tableau comprend une légende et des en-têtes pour une meilleure lisibilité.
Ce fichier définit un composant React, Authlayout, qui fournit une mise en page pour les pages d’authentification. Il comprend un côté gauche pour les formulaires (avec un titre et une description facultative) et un côté droit avec une image d’arrière-plan et un texte de motivation. La disposition est réactive, cachant l’image sur des écrans plus petits.
import{ Book, BarChart, MessageCircle }from"lucide-react"const features =[{ name:"Comprehensive Dashboard", description:"View student's overall academic performance, including average grades and progress over time.", icon: BarChart,},{ name:"Easy Communication", description:"Direct messaging system between school administrators and teachers for quick and efficient communication.", icon: MessageCircle,},{ name:"Academic Tracking", description:"Monitor assignments, upcoming tests, and project deadlines to help your students stay on top of their studies.", icon: Book,},]exportfunctionFeatures(){return(<div className="py-12 bg-white" id="features"><div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"><div className="lg:text-center"><h2 className="text-base text-primary font-semibold tracking-wide uppercase">Features</h2><p className="mt-2 text-3xl leading-8 font-extrabold tracking-tight text-gray-900 sm:text-4xl"> Everything you need to stay connected
</p><p className="mt-4 max-w-2xl text-xl text-gray-500 lg:mx-auto"> Our platform offers a range of features designed to enhance communication between school administrators and teachers.</p></div><div className="mt-10"><dl className="space-y-10 md:space-y-0 md:grid md:grid-cols-3 md:gap-x-8 md:gap-y-10">{features.map((feature)=>(<div key={feature.name} className="relative"><dt><div className="absolute flex items-center justify-center h-12 w-12 rounded-md bg-primary text-white"><feature.icon className="h-6 w-6" aria-hidden="true"/></div><p className="ml-16 text-lg leading-6 font-medium text-gray-900">{feature.name}</p></dt><dd className="mt-2 ml-16 text-base text-gray-500">{feature.description}</dd></div>))}</dl></div></div></div>)}
Ce fichier définit un composant React, fonctionnalités, qui présente les fonctionnalités de plate-forme clés dans une disposition visuellement attrayante. Il comprend un titre, une description et une grille de cartes de fonctionnalités, chacune avec une icône, un nom et une description détaillée. Le composant est conçu pour mettre en évidence les capacités de la plate-forme pour les administrateurs scolaires et les enseignants.
Ce fichier définit un composant React, Footer, qui affiche un pied de page simple avec des icônes de médias sociaux (Facebook et Twitter) et un avis de droit d’auteur. Le pied de page est centré et réactif, avec des liens sociaux à droite et le texte du droit d’auteur à gauche pour les écrans plus grands.
Ce fichier définit un composant React, Hero, qui crée une section de héros visuellement engageante pour un site Web. Il comprend un titre audacieux, un paragraphe descriptif et deux boutons d’appel à l’action («démarrer» et «en savoir plus»). La disposition présente un design réactif avec une forme d’arrière-plan et une image sur le côté droit pour les écrans plus grands.
Ce fichier définit un composant React, MobileMenu, qui crée un menu de navigation mobile réactif. Il bascule la visibilité avec un bouton et comprend des liens vers les fonctionnalités, les sections de contact et de contact, ainsi que les boutons de connexion et d’inscription. Le menu est conçu avec un design propre et moderne et se ferme lorsque vous cliquez sur l’icône de fermeture.
Ce fichier définit un composant React, Navbar, qui crée une barre de navigation réactive avec des liens vers des fonctionnalités, des sections de contact et de contact. Il comprend des boutons de connexion et d’inscription pour les écrans plus grands et intègre un composant MobileMenu pour les écrans plus petits. Le Navbar est stylé avec une ombre et une disposition centrée.
NotAuthorizedDialog.tsx déposer:
Ce fichier définit un composant React, NotAuthorizedDialog, qui affiche une boîte de dialogue lorsqu’un utilisateur n’est pas autorisé à effectuer une action. Il comprend un titre et une description incitant l’utilisateur à contacter un administrateur, et sa visibilité est contrôlée via les accessoires ouverts et Open enquête.
Ce fichier définit un composant React, Studentstables, qui rend un tableau pour afficher une liste d’étudiants. Il faut un éventail d’élèves comme accessoires et cartes à travers eux pour remplir les lignes de table avec des détails tels que le prénom, le nom de famille, la classe, le sexe et l’âge. Le tableau comprend une légende et des en-têtes pour une meilleure lisibilité.
Reportez-vous au code GitHub pour le code respectif des composants mentionnés ci-dessus.
Gestion des États et types
Maintenant, pour la prochaine étape, nous créerons l’état et les types que nous utiliserons tout au long de l’application. Créer le magasin et tYPES dossiers dans la racine du dossier du projet.
À l’intérieur du dossier Store, créez les fichiers suivants et collez le code correspondant:
Ce fichier définit une boutique Zustand, UseAuthstore, pour gérer l’état d’authentification. Il comprend des états d’utilisateur et de jeton, ainsi que des méthodes pour définir l’utilisateur, définir le jeton et se déconnecter. L’État est persisté dans LocalStorage en utilisant le middleware persistant.
Ce fichier définit une boutique Zustand, useProfiLestore, pour gérer les données de profil utilisateur. Il comprend un état de profil et des méthodes pour définir et effacer le profil. L’État est persisté dans LocalStorage en utilisant le middleware persistant.
Dans le dossier Types, créez le fichier suivant et collez le code suivant dans le index.ts déposer:
Ce fichier définit les interfaces TypeScript pour la mission, la mission, étudiant et étudiant. Il étend l’affectation de base et les interfaces étudiants avec des propriétés supplémentaires comme $ id pour les enregistrements de base de données, garantissant un typage cohérent à travers l’application.
Itinéraires
Maintenant, nous voyons comment les composants et le magasin que nous venons de créer sont utilisés dans l’application.
Remplacez le code dans le fichier app / page.tsx par le code ci-dessous:
Ce fichier définit le composant principal de la page d’accueil, qui structure la mise en page à l’aide des composants Navbar, Hero, Fonctionnals et Foote. Il assure une conception réactive avec une disposition flexible et une hauteur pleine page.
Créez les dossiers suivants dans le dossier de l’application et collez ce code dans leurs fichiers Page.TSX respectifs:
Créez un dossier d’inscription et collez ce code dans son fichier page.tsx:
Ce fichier définit un composant de sociétés pour l’enregistrement des utilisateurs, le traitement de la soumission du formulaire avec validation et gestion des erreurs. Il utilise Zustand pour stocker les données des utilisateurs et un jeton lors de l’inscription réussie, puis redirige vers une page de sélection de rôles. Le formulaire comprend des champs pour le prénom, le nom de famille, le courrier électronique et le mot de passe, avec un lien vers la page de connexion pour les utilisateurs existants.
Créez un dossier de sélection de rôles et collez ce code dans son fichier page.tsx:
Ce fichier définit un composant RolelelectionPage où les utilisateurs sélectionnent leur rôle (administrateur, enseignant ou étudiant) après s’être inscrit. Il gère la sélection des rôles, soumet les données pour créer un profil et redirige vers le tableau de bord lors du succès. L’interface utilisateur comprend des cartes pour chaque rôle, un bouton de confirmation et une gestion des erreurs.
Créez un dossier de connexion et collez ce code dans son fichier page.tsx:
Ce fichier définit un composant LoginPage pour l’authentification des utilisateurs, gérer la soumission du formulaire avec e-mail et mot de passe. Il utilise Zustand pour stocker les données de l’utilisateur et un jeton, récupère le profil de l’utilisateur et redirige vers la page de sélection de tableau de bord ou de rôle en fonction de l’état du profil. Le formulaire comprend la gestion des erreurs et un lien vers la page d’inscription pour les nouveaux utilisateurs.
Créez un dossier de tableau de bord et collez ce code dans son fichier page.tsx:
Ce fichier définit un composant TeacherDashboard qui affiche un tableau de bord pour les enseignants ou les administrateurs, leur permettant de gérer les élèves et les devoirs. Il comprend des onglets pour basculer entre les étudiants et les missions, les boutons pour ajouter de nouvelles entrées et gère les erreurs d’autorisation. Le composant récupère et affiche des données en fonction du rôle de l’utilisateur, avec une option de déconnexion et une gestion des erreurs.
Après avoir créé tous les fichiers et composants ci-dessus et les avoir utilisés comme je vous l’ai montré, votre application devrait fonctionner lorsque vous exécutez cette commande ci-dessous:
L’application sera disponible sur http: // localhost: 3000 /.
Testez la demande maintenant en créant une école, en vous inscrivant et en vous connectant en tant qu’administrateur, enseignant ou étudiant, et en effectuant certaines actions.
Construire une application Multi-locataire EdTech SaaS avec Next.js, AppWrite et Permis a fourni plusieurs informations sur l’autorisation, la sécurité et l’évolutivité. Voici les principaux points à retenir:
Le contrôle d’accès simplifié basé sur les rôles (RBAC): avec permis, définissant et appliquant les rôles administratifs, enseignants et étudiants était simple. Au lieu de coder en dur, je pouvais les gérer dynamiquement via l’interface utilisateur du permis.
Les politiques conscientes des locataires de permis ont assuré que les écoles (locataires) sont restées isolées les unes des autres. Cela était important pour la sécurité des données dans une application SaaS multi-locataire.
Au lieu d’écrire et de gérer la logique d’autorisation personnalisée dans des dizaines de routes API, permettez le contrôle d’accès géré de manière centralisée pour réduire la complexité et faciliter les mises à jour futures.
Étant donné que tous les contrôles d’autorisation ont été appliqués au backend, le frontend n’a affiché que des éléments d’interface utilisateur en fonction des autorisations, assurant une expérience utilisateur fluide.
La mise en œuvre de l’authentification personnalisée à partir de zéro aurait pu prendre des semaines. Mais en utilisant AppWrite pour l’authentification et le permis pour l’autorisation, j’ai pu me concentrer sur la création de fonctionnalités de base au lieu de réinventer le contrôle d’accès.
Conclusion
Le permis d’intégration avec next.js & appwrite m’a permis de simplifier l’autorisation dans mon application EDTech multi-locataire. En déchargeant la logique d’autorisation complexe à permettre, j’ai pu me concentrer sur les fonctionnalités de la construction, ne pas gérer le contrôle d’accès manuellement.
Si vous construisez une application SaaS avec des autorisations et plusieurs tenues complexes, le permis est un excellent outil à utiliser pour rationaliser votre flux de travail.
avril 10, 2025
Comment construire une application SaaS multi-locataire avec Next.js (Frontend Integration) –
Dans le Première partie de cette série d’articlesnous avons implémenté le backend avec AppWrite, installé certaines dépendances et configuré un permis pour gérer l’autorisation et le contrôle d’accès basé sur les rôles.
Voyons maintenant comment nous pouvons intégrer le frontend avec le backend pour une application EDTech entièrement fonctionnelle.
Intégration frontale: mise en œuvre de l’autorisation dans Next.js
Maintenant que vous avez une autorisation backend en place en utilisant le permis, intégrez-le dans votre frontend Next.js. Le frontend devrait:
1. Configuration des appels API avec autorisation
Étant donné que seul le backend applique les autorisations, votre frontend ne décide jamais d’accès directement – au lieu, il:
Pour commencer, vous devrez installer Node.js sur votre ordinateur.
Ensuite, suivez ces étapes, suivez les étapes ci-dessous:
2. Initialiser Shadcn
Ce que vous observerez après la création de votre projet NextJS, c’est que Tailwind CSS V4 est installé pour vous dès la sortie de la boîte, ce qui signifie que vous n’avez rien à faire d’autre. Parce que nous utilisons une bibliothèque de composants, nous allons installer Oignon shadcn.
Pour ce faire, nous devons exécuter la commande init pour créer un fichier composants.json dans la racine du dossier:
Après initialisation, vous pouvez commencer à ajouter des composants à votre projet:
Si vous vous demandez, si vous devez utiliser Force en raison de la compatibilité de la version NextJS 15 avec Shadcn, appuyez sur Entrée pour continuer.
3. Installez les packages nécessaires
Installez les packages suivants:
Maintenant que nous avons installé tout ce dont nous avons besoin pour créer notre application, nous pouvons commencer à créer nos autres composants et itinéraires.
Pour maintenir la cohérence de l’interface utilisateur tout au long de l’application, collez ce code dans votre fichier global.css (collez-le en dessous de votre importation de tailwindcss):
4. Fichiers de composants
Créez les fichiers de composants suivants et collez leur code correspondant:
Ce fichier définit un composant React, addAssignmentDialog, qui rend un formulaire de dialogue pour ajouter de nouvelles affectations. Il gère l’état de formulaire à l’aide d’Usestate et soumet les données d’attribution à un composant parent via l’offre OnAddAssignment. La boîte de dialogue comprend des champs d’entrée pour le titre, la matière, l’enseignant, la classe et la date d’échéance, et se ferme lors de la soumission.
Ce fichier définit un composant React, AddStudentDialog, qui rend un formulaire de dialogue pour ajouter de nouveaux étudiants. Il gère l’état de formulaire à l’aide d’Usestate et soumet les données de l’élève à un composant parent via l’offre OnAddDstudent. La boîte de dialogue comprend des champs d’entrée pour le prénom, le nom de famille, la classe, le sexe (avec une liste déroulante) et l’âge, et gère les états de chargement pendant la soumission.
Ce fichier définit un composant React, affectationStables, qui rend une table pour afficher une liste des affectations. Il faut un éventail d’affectations en tant qu’accessoires et cartes à travers eux pour remplir les lignes de table avec des détails tels que le titre, le sujet, la classe, le professeur et la date d’échéance. Le tableau comprend une légende et des en-têtes pour une meilleure lisibilité.
Ce fichier définit un composant React, Authlayout, qui fournit une mise en page pour les pages d’authentification. Il comprend un côté gauche pour les formulaires (avec un titre et une description facultative) et un côté droit avec une image d’arrière-plan et un texte de motivation. La disposition est réactive, cachant l’image sur des écrans plus petits.
Ce fichier définit un composant React, fonctionnalités, qui présente les fonctionnalités de plate-forme clés dans une disposition visuellement attrayante. Il comprend un titre, une description et une grille de cartes de fonctionnalités, chacune avec une icône, un nom et une description détaillée. Le composant est conçu pour mettre en évidence les capacités de la plate-forme pour les administrateurs scolaires et les enseignants.
Ce fichier définit un composant React, Footer, qui affiche un pied de page simple avec des icônes de médias sociaux (Facebook et Twitter) et un avis de droit d’auteur. Le pied de page est centré et réactif, avec des liens sociaux à droite et le texte du droit d’auteur à gauche pour les écrans plus grands.
Ce fichier définit un composant React, Hero, qui crée une section de héros visuellement engageante pour un site Web. Il comprend un titre audacieux, un paragraphe descriptif et deux boutons d’appel à l’action («démarrer» et «en savoir plus»). La disposition présente un design réactif avec une forme d’arrière-plan et une image sur le côté droit pour les écrans plus grands.
Ce fichier définit un composant React, MobileMenu, qui crée un menu de navigation mobile réactif. Il bascule la visibilité avec un bouton et comprend des liens vers les fonctionnalités, les sections de contact et de contact, ainsi que les boutons de connexion et d’inscription. Le menu est conçu avec un design propre et moderne et se ferme lorsque vous cliquez sur l’icône de fermeture.
Ce fichier définit un composant React, Navbar, qui crée une barre de navigation réactive avec des liens vers des fonctionnalités, des sections de contact et de contact. Il comprend des boutons de connexion et d’inscription pour les écrans plus grands et intègre un composant MobileMenu pour les écrans plus petits. Le Navbar est stylé avec une ombre et une disposition centrée.
Ce fichier définit un composant React, NotAuthorizedDialog, qui affiche une boîte de dialogue lorsqu’un utilisateur n’est pas autorisé à effectuer une action. Il comprend un titre et une description incitant l’utilisateur à contacter un administrateur, et sa visibilité est contrôlée via les accessoires ouverts et Open enquête.
Ce fichier définit un composant React, Studentstables, qui rend un tableau pour afficher une liste d’étudiants. Il faut un éventail d’élèves comme accessoires et cartes à travers eux pour remplir les lignes de table avec des détails tels que le prénom, le nom de famille, la classe, le sexe et l’âge. Le tableau comprend une légende et des en-têtes pour une meilleure lisibilité.
Reportez-vous au code GitHub pour le code respectif des composants mentionnés ci-dessus.
Gestion des États et types
Maintenant, pour la prochaine étape, nous créerons l’état et les types que nous utiliserons tout au long de l’application. Créer le magasin et tYPES dossiers dans la racine du dossier du projet.
Ce fichier définit une boutique Zustand, UseAuthstore, pour gérer l’état d’authentification. Il comprend des états d’utilisateur et de jeton, ainsi que des méthodes pour définir l’utilisateur, définir le jeton et se déconnecter. L’État est persisté dans LocalStorage en utilisant le middleware persistant.
Ce fichier définit une boutique Zustand, useProfiLestore, pour gérer les données de profil utilisateur. Il comprend un état de profil et des méthodes pour définir et effacer le profil. L’État est persisté dans LocalStorage en utilisant le middleware persistant.
Ce fichier définit les interfaces TypeScript pour la mission, la mission, étudiant et étudiant. Il étend l’affectation de base et les interfaces étudiants avec des propriétés supplémentaires comme $ id pour les enregistrements de base de données, garantissant un typage cohérent à travers l’application.
Itinéraires
Maintenant, nous voyons comment les composants et le magasin que nous venons de créer sont utilisés dans l’application.
Remplacez le code dans le fichier app / page.tsx par le code ci-dessous:
Ce fichier définit le composant principal de la page d’accueil, qui structure la mise en page à l’aide des composants Navbar, Hero, Fonctionnals et Foote. Il assure une conception réactive avec une disposition flexible et une hauteur pleine page.
Créez les dossiers suivants dans le dossier de l’application et collez ce code dans leurs fichiers Page.TSX respectifs:
Ce fichier définit un composant de sociétés pour l’enregistrement des utilisateurs, le traitement de la soumission du formulaire avec validation et gestion des erreurs. Il utilise Zustand pour stocker les données des utilisateurs et un jeton lors de l’inscription réussie, puis redirige vers une page de sélection de rôles. Le formulaire comprend des champs pour le prénom, le nom de famille, le courrier électronique et le mot de passe, avec un lien vers la page de connexion pour les utilisateurs existants.
Ce fichier définit un composant RolelelectionPage où les utilisateurs sélectionnent leur rôle (administrateur, enseignant ou étudiant) après s’être inscrit. Il gère la sélection des rôles, soumet les données pour créer un profil et redirige vers le tableau de bord lors du succès. L’interface utilisateur comprend des cartes pour chaque rôle, un bouton de confirmation et une gestion des erreurs.
Ce fichier définit un composant LoginPage pour l’authentification des utilisateurs, gérer la soumission du formulaire avec e-mail et mot de passe. Il utilise Zustand pour stocker les données de l’utilisateur et un jeton, récupère le profil de l’utilisateur et redirige vers la page de sélection de tableau de bord ou de rôle en fonction de l’état du profil. Le formulaire comprend la gestion des erreurs et un lien vers la page d’inscription pour les nouveaux utilisateurs.
Ce fichier définit un composant TeacherDashboard qui affiche un tableau de bord pour les enseignants ou les administrateurs, leur permettant de gérer les élèves et les devoirs. Il comprend des onglets pour basculer entre les étudiants et les missions, les boutons pour ajouter de nouvelles entrées et gère les erreurs d’autorisation. Le composant récupère et affiche des données en fonction du rôle de l’utilisateur, avec une option de déconnexion et une gestion des erreurs.
Après avoir créé tous les fichiers et composants ci-dessus et les avoir utilisés comme je vous l’ai montré, votre application devrait fonctionner lorsque vous exécutez cette commande ci-dessous:
L’application sera disponible sur http: // localhost: 3000 /.
Testez la demande maintenant en créant une école, en vous inscrivant et en vous connectant en tant qu’administrateur, enseignant ou étudiant, et en effectuant certaines actions.
Construire une application Multi-locataire EdTech SaaS avec Next.js, AppWrite et Permis a fourni plusieurs informations sur l’autorisation, la sécurité et l’évolutivité. Voici les principaux points à retenir:
Conclusion
Le permis d’intégration avec next.js & appwrite m’a permis de simplifier l’autorisation dans mon application EDTech multi-locataire. En déchargeant la logique d’autorisation complexe à permettre, j’ai pu me concentrer sur les fonctionnalités de la construction, ne pas gérer le contrôle d’accès manuellement.
Si vous construisez une application SaaS avec des autorisations et plusieurs tenues complexes, le permis est un excellent outil à utiliser pour rationaliser votre flux de travail.
Accéder au dépôt github du projet fini pour le backend ici et le frontend ici.
Source link
Partager :
Articles similaires