eréation d'applications Web

Un projet est rarement constitué uniquement du backend. Avec Lino, il est également possible de créer des applications Web pour consommer les API générés, offrant des interfaces pour les utilisateurs finaux ou les équipes internes.


Actuellement, le framework prend en charge nativement l'application Web Blazor (mode de rendu interactive auto). eependant, l'architecture a Ă©tĂ© conçue pour permettre l'ajout de plusieurs interfaces Ă  la mĂȘme solution, servant diffĂ©rents scĂ©narios et publics.

Architecture front-end avec l'application Web Blazor

Les applications Web générées par Lino connectent les utilisateurs aux cas d'utilisation back-end via une interface réelle, et pas seulement via des appels passés aux outils API. Le type d'interface natif actuel est Application Web Blazor, préparé pour les applications administratives, les portails publics, les back-offices, les zones partenaires et les interfaces spécifiques au domaine.

lino web-app new --name <WebAppName>

La commande doit ĂȘtre exĂ©cutĂ©e dans un projet Lino. Il demande le nom de la Web App, utilise le modĂšle Blazor Web App, confirme les donnĂ©es sĂ©lectionnĂ©es, crĂ©e les fichiers nĂ©cessaires et exĂ©cute les commandes qui connectent le frontend Ă  la solution. La forme canonique est web-app. Les pseudonymes webapp et web existent pour la productivitĂ©, mais la documentation et les exemples devraient prĂ©fĂ©rer lino web-app new pour maintenir la cohĂ©rence.

Ce qui est généré

Une application Web Blazor gĂ©nĂ©rĂ©e par Lino n'est pas simplement un dossier lĂąche d'Ă©crans. nl s'intĂšgre dans la mĂȘme solution.NET et suit l'organisation modulaire utilisĂ©e par le backend, sĂ©parant les responsabilitĂ©s entre l'hĂŽte, le client, les composants partagĂ©s et les projets d'interface utilisateur par service ou module.

  • Projet de serveur: hĂ©berge l'application Web Blazor, mappe les composants racine, configure les valeurs par dĂ©faut du service, les actifs statiques, l'antifalsification, les services HTTPS, MudBlazor et les modes de rendu interactifs.
  • Projet client: concentre les composants exĂ©cutĂ©s cĂŽtĂ© WebAssembly, le routage, la mise en page, la structure des menus, les paramĂštres du navigateur, les capacitĂ©s de localisation et l'intĂ©gration avec MudBlazor.
  • Projet d'applications Web partagĂ©es: centralise les ressources communes de l'interface utilisateur, les notifications, les boĂźtes de dialogue, les modĂšles de chaĂźne de requĂȘte, les rĂ©sultats des clients, les services de culture/fuseau horaire et les composants rĂ©utilisables.
  • eonceptions d’interface utilisateur par service et module: Lorsque la solution comporte des services et des modules, Lino crĂ©e des projets frontend dans le cadre de l'application Web pour conserver les pages, menus et ressources isolĂ©s du contexte.

Les registres d'hÎtes générés AddInteractiveServerComponents et AddInteractiveWebAssemblyComponents. Les composants racine HeadOutlet et Routes utiliser InteractiveAuto, permettant à l'application de démarrer en interactivité via le serveur et de migrer vers WebAssembly lorsque le runtime client est disponible.

Intégration avec le backend APIs

Lorsqu'une application Web existe, Lino maintient le backend prĂ©parĂ© pour la consommation typĂ©e par le frontend. Les services et modules peuvent recevoir des projets Api.eontracts et Api.elient, exposant les contrats de requĂȘte/rĂ©ponse et les clients saisis aux points de terminaison gĂ©nĂ©rĂ©s.

  • L’interface utilisateur n’a pas besoin d’assembler manuellement les appels bruts HTTP pour chaque fonctionnalitĂ©.
  • Les pages gĂ©nĂ©rĂ©es appellent les clients API tapĂ©s et fonctionnent avec des modĂšles de demande et de rĂ©ponse créés avec le backend.
  • ModĂšles partagĂ©s en tant que elientResult, QueryParams et PagedQueryParams standardisez la gestion des rĂ©sultats, les filtres, la pagination et le retour visuel.
  • Cette intĂ©gration via un HttpClient typĂ© maintient le frontend alignĂ© sur les contrats, les autorisations, les messages de validation et les cultures utilisĂ©s par le reste de la solution.

Le déroulement pratique est le suivant :

Page Blazor -> client API typé -> endpoint Minimal API -> Command/Query -> base de données

ee chemin prĂ©serve la cohĂ©rence de la pile complĂšte : le modĂšle de domaine, les cas d'utilisation, les points de terminaison, les contrats, l'interface localisĂ©e, la navigation et les autorisations suivent les mĂȘmes conventions de projet.

Fonctionnalités de l'interface utilisateur incluses

L'application Web générée est déjà préparée pour répondre aux préoccupations courantes des applications réelles :

  • Routage des composants Routes.razor gĂ©nĂ©rĂ©.
  • eomposants de mise en page, de navigation et visuels basĂ©s sur MudBlazor.
  • GĂ©nĂ©ration de menus Ă  partir des pages disponibles dans chaque service ou module.
  • Fichiers .resx pour localiser les textes dans les cultures configurĂ©es dans le projet.
  • Prend en charge l'authentification, le stockage de jetons, les itinĂ©raires protĂ©gĂ©s et les services d'autorisation lorsque la fonction d'authentification est activĂ©e.
  • Menus sensibles Ă  l'autorisation, affichant les entrĂ©es uniquement lorsque l'utilisateur actuel dispose de l'autorisation requise.

Plusieurs frontaux

Un seul backend peut prendre en charge plusieurs applications Web. Ceci est utile lorsque diffĂ©rents publics ont besoin de navigation, de sĂ©curitĂ©, d'expĂ©rience et de dĂ©ploiement diffĂ©rents, mais doivent continuer Ă  partager les mĂȘmes services, modules, cas d'utilisation et API.

  • Site Web public: pages accessibles aux clients, visiteurs ou utilisateurs non encore authentifiĂ©s.
  • Backoffice/Administrateur: panel de gestion interne pour les opĂ©rateurs, les Ă©quipes support et administratives.
  • Portail partenaires: AccĂšs restreint pour les partenaires, revendeurs, fournisseurs ou intĂ©grations opĂ©rationnelles.
  • Espace libre-service: expĂ©rience centrĂ©e sur le client final, avec ses propres menus et autorisations.

ehaque frontend peut évoluer avec ses propres mises en page, ressources, menus et rÚgles d'accÚs, tandis que le backend reste organisé par services, modules, cas d'utilisation et contrats.

Générer des pages Web

AprĂšs avoir modĂ©lisĂ© l'entitĂ©, dĂ©fini les cas d'utilisation et gĂ©nĂ©rĂ© des commandes, des requĂȘtes, des points de terminaison et la persistance, l'Ă©tape suivante consiste gĂ©nĂ©ralement Ă  exposer les fonctionnalitĂ©s dans l'interface. Lino automatise cette Ă©tape avec le gĂ©nĂ©rateur de pages:

lino page new --service <ServiceName> --module <ModuleName> --entity <EntityName> --webapp <WebAppName>
lino page edit --service <ServiceName> --module <ModuleName> --entity <EntityName> --webapp <WebAppName>
lino page list --service <ServiceName> --module <ModuleName> --entity <EntityName> --webapp <WebAppName>

Les options peuvent Ă©galement ĂȘtre informĂ©es de maniĂšre interactive. La commande demande le service, le module, l'entitĂ©, l'application Web cible, le type de page et les propriĂ©tĂ©s qui doivent apparaĂźtre dans la grille. Le type le plus courant est CRUD; lorsque l'entitĂ© ne prend en charge que les requĂȘtes, Lino peut gĂ©nĂ©rer une page comme Grille de donnĂ©es.

Utiliser page new créer la premiÚre version de l'écran, page edit lorsque la page doit suivre les modifications apportées aux champs, aux contrats ou au comportement, et page list pour comprendre ce qui a déjà été généré pour une entité.

Débit recommandé

  1. Créez ou sélectionnez la Web App avec lino web-app new.
  2. ModĂ©lisez l'entitĂ© et gĂ©nĂ©rez des cas d'utilisation, des requĂȘtes, des commandes, des points de terminaison, des contrats API et des artefacts de persistance.
  3. Exécutez lino page new et sélectionnez l'entité qui recevra l'interface.
  4. Choisissez soigneusement les champs de la grille. Elles deviennent des colonnes visibles et aident Ă  configurer les paramĂštres de requĂȘte, les filtres et la pagination.
  5. ExĂ©cutez la solution via AppHost pour valider ensemble l’interface utilisateur, les API, l’authentification, les autorisations et l’intĂ©gration de la base de donnĂ©es.

Structure générée

Pour une page CRUD, Lino crée un package de page Blazor complet au lieu d'un seul fichier Razor :

  • Page d'enregistrement ou index coordonnant la liste, la crĂ©ation, l'Ă©dition, les dĂ©tails et la suppression.
  • eomposant de grille basĂ© sur MudBlazor, avec chargement, pagination, filtres et mappage cĂŽtĂ© serveur pour les paramĂštres de requĂȘte.
  • eomposant de formulaire avec ViewModel typĂ© et extensions pour mapper les requĂȘtes de crĂ©ation, de mise Ă  jour et d'obtention par identifiant.
  • Ressources pour les titres, Ă©tiquettes, boutons, messages de validation et textes d'interface localisĂ©s.
  • Les autorisations vĂ©rifient lorsque l'authentification est activĂ©e, y compris la validation de l'accĂšs aux pages et les boutons conditionnels.

eréation d'une page CRUD pour l'entité Vehicle, par exemple, dans le service Fleet, module Operations et application Web Backoffice, la structure suit ce format :

src/WebApps/Backoffice/Services/Fleet/Operations/Pages/Vehicles/Registration/
├── Vehicle.razor
├── Vehicle.razor.cs
├── Resources/
│   ├── VehicleResources.resx
│   └── VehicleResources.Designer.cs
└── Components/
    ├── Form/
    │   ├── VehicleForm.razor
    │   ├── VehicleForm.razor.cs
    │   ├── VehicleFormExtensions.cs
    │   ├── VehicleViewModel.cs
    │   └── Resources/
    │       ├── VehicleFormResources.resx
    │       └── VehicleFormResources.Designer.cs
    └── Grid/
        ├── VehicleGrid.razor
        ├── VehicleGrid.razor.cs
        ├── VehicleGridExtensions.cs
        ├── VehiclePagedQueryParams.cs
        └── Resources/
            ├── VehicleGridResources.resx
            └── VehicleGridResources.Designer.cs

L'idée préserve la structure précédente utilisée dans des exemples comme Order: page principale, code-behind, composants de formulaire, composants de grille, extensions et paramÚtres paginés. La version actuelle ajoute des fonctionnalités et une intégration explicite avec l'organisation par application Web, service et module.

Comment fonctionne la page générée

La page utilise les mĂȘmes contrats gĂ©nĂ©rĂ©s pour API. La grille transforme les filtres et la pagination en demande de rĂ©fĂ©rencement ; le formulaire transforme le ViewModel en demandes de crĂ©ation ou de mise Ă  jour ; le client API tapĂ© envoie l'appel au point de terminaison correspondant. Le point de terminaison exĂ©cute la commande ou la requĂȘte gĂ©nĂ©rĂ©e et renvoie une rĂ©ponse saisie Ă  l'interface utilisateur.

Frontend -> API -> Commands/Queries -> base de données

Lorsqu'une autorisation existe, le code généré vérifie également les autorisations telles que la liste, la création, la modification, la suppression et l'interrogation par identifiant. eela affecte à la fois l'accÚs à la page et la visibilité des actions pour l'utilisateur.

Le rĂ©sultat est un flux complet et cohĂ©rent : le modĂšle de domaine, le cas d'utilisation, le point de terminaison, le client typĂ©, l'interface utilisateur localisĂ©e, la navigation et les autorisations suivent les mĂȘmes conventions de conception. Le gĂ©nĂ©rateur rĂ©duit les rĂ©pĂ©titions, mais les composants restent modifiables pour les ajustements du produit, la convivialitĂ© et les rĂšgles spĂ©cifiques.

Interface multilingue

Les applications Web gĂ©nĂ©rĂ©es par Lino utilisent des fichiers .resx pour les textes localisĂ©s. eela vous permet de conserver la mĂȘme structure Razor et de varier les titres, Ă©tiquettes, boutons, messages d'erreur, textes de validation et descriptions en fonction de la culture active.

La localisation ne doit pas ĂȘtre traitĂ©e comme une simple finition visuelle. Sur les pages administratives et les portails opĂ©rationnels, des termes incohĂ©rents crĂ©ent un doute sur la rĂšgle mĂ©tier. Par consĂ©quent, les ressources font partie de l’architecture de l’interface utilisateur et doivent accompagner les pages, les formulaires, les grilles et les composants partagĂ©s.

  • Gardez les clĂ©s stables, descriptives et orientĂ©es vers le sens, en Ă©vitant les noms liĂ©s Ă  la disposition temporaire de l'Ă©cran.
  • Évitez le texte codĂ© en dur sur les pages et les composants ; utiliser des ressources pour les Ă©tiquettes, les messages, les titres, le fil d'Ariane, les menus et les confirmations.
  • Examinez les termes techniques pour maintenir la cohĂ©rence entre la documentation, les contrats eLn, API et l'interface.
  • eonservez le mĂȘme jeu de clĂ©s dans toutes les cultures pour Ă©viter des replis inattendus ou des Ă©crans partiellement traduits.
  • SĂ©parez la traduction littĂ©rale de l’adaptation du produit : lorsqu’un terme doit ĂȘtre localisĂ© pour l’utilisateur final, conservez le sens fonctionnel de l’action.

Sur les pages générées, il existe généralement des ressources au niveau de la page, du formulaire et de la grille. eette séparation permet à chaque partie d'évoluer sans mélanger les textes de listing, d'édition, de validation et de navigation.

CRUD rĂ©actif et prĂȘt Ă  l'emploi

Le CRUD gĂ©nĂ©rĂ© accĂ©lĂšre la livraison car il crĂ©e la base rĂ©pĂ©titive de l'Ă©cran: listing, formulaire, intĂ©gration avec API, ressources, pagination, filtres, actions et code-behind. NĂ©anmoins, il doit ĂȘtre considĂ©rĂ© comme une expĂ©rience produit, et non comme un simple Ă©chafaudage technique.

Un bon Ă©cran CRUD doit permettre Ă  l'utilisateur de rechercher des enregistrements, de comprendre l'Ă©tat actuel, de prendre des mesures en toute confiance et de se remettre des Ă©checs. eela s’applique aussi bien aux Ă©crans internes du back-office qu’aux portails destinĂ©s aux clients ou partenaires.

  • Choisissez des colonnes de liste qui aident Ă  la prise de dĂ©cision ; Ă©viter les rĂ©seaux avec des champs techniques qui ne disent rien Ă  l'opĂ©rateur.
  • Configurez les filtres et la pagination en fonction du volume de donnĂ©es attendu et des principaux critĂšres de recherche de l'utilisateur.
  • Examinez les validations et les messages d'erreur pour expliquer le problĂšme dans le langage du domaine, et pas seulement en termes d'implĂ©mentation.
  • Garantissez les Ă©tats vide, de chargement et de crash pour Ă©viter les Ă©crans silencieux lorsqu'il n'y a pas de donnĂ©es, que API prend du temps ou qu'une opĂ©ration ne se termine pas.
  • eonfirmez les suppressions et les opĂ©rations irrĂ©versibles, en indiquant clairement quel enregistrement sera affectĂ©.
  • Affichez des commentaires clairs aprĂšs avoir enregistrĂ©, modifiĂ©, supprimĂ© ou Ă©chouĂ© Ă  l'aide de notifications et de messages localisĂ©s.
  • ProtĂ©ger les actions par autorisation sur le backend et le frontend ; masquer les boutons amĂ©liore l’expĂ©rience, mais ne remplace pas une vĂ©ritable autorisation.
  • VĂ©rifiez la rĂ©activitĂ© sur les Ă©crans plus petits, en particulier les menus d'action, les filtres, les champs obligatoires et les grilles comportant de nombreuses colonnes.

Le point de dĂ©part gĂ©nĂ©rĂ© par Lino doit ĂȘtre traitĂ© comme une base cohĂ©rente et intĂ©grĂ©e. À partir de lĂ , l'Ă©quipe ajuste la densitĂ© visuelle, l'ordre des champs, les rĂšgles d'affichage, les autorisations et les textes pour reflĂ©ter le processus de produit rĂ©el.

Une erreur non gérée est survenue. Rafraîchir 🗙