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,QueryParamsetPagedQueryParamsstandardisez la gestion des résultats, les filtres, la pagination et le retour visuel. -
Cette intégration via un
HttpClienttypé 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.razorgé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
.resxpour 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é
-
Créez ou sélectionnez la Web App avec
lino web-app new. - 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.
-
Exécutez
lino page newet sĂ©lectionnez l'entitĂ© qui recevra l'interface. - 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.
- 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.
