TP2 créer un projet et implémenter des fonctionnalités
Lien GitHub vers les fichiers de démarrage
Consignes
- L'utilisation de l'IAG pour créer partiellement ou totalement des éléments du travail entraînera automatiquement la note de zéro et un plagiat
- Vous DEVEZ faire, au moins, les migrations et les commits demandés, mais vous pouvez en faire plus sans problème, tant que vous les documentez correctement.
Création du projet
- Créez un dépôt GitHub PRIVÉ portant le nom
3W6_TP2_NOM_PRENOMet ajoutez votre enseignant comme collaborateur - Créez un nouveau projet MVC qui se nomme
NutriVie - Utilisez la version .NET 10
- Installez les packages suivants :
- Microsoft.EntityFrameworkCore 10.0.12 (Dernière version stable)
- Microsoft.EntityFrameworkCore.Design 10.0.12 (Dernière version stable)
- Microsoft.EntityFrameworkCore.SqlServer 10.0.12 (Dernière version stable)
- Microsoft.EntityFrameworkCore.tools 10.0.12 (Dernière version stable)
- Microsoft.VisualStudio.Web.CodeGeneration.Design 10.0.2 (Dernière version stable)
- NuGet.Packaging 7.9.0 (Dernière version stable)
- NuGet.Protocol 7.9.0 (Dernière version stable)
Les paquets NuGet.Packaging et NuGet.Protocol utilisés dans le paquet Microsoft.VisualStudio.Web.CodeGeneration.Design ont des vulnérabilités importantes et empêchent le bon fonctionnement de la solution. Il est donc important de mettre manuellement les deux paquets afin de pallier temporairement le problème.
Mise en place des fichiers de base du projet
Le dossier Fichiers de départ contient plusieurs éléments que vous devrez intégrer à votre projet pour le faire fonctionner correctement.
- Remplacez le contenu du fichier de Layout de votre projet
/Views/Shared/_Layout.cshtmlpar celui qui est dans le fichier_Layout.txt. - Remplacez le contenu du fichier d’index de votre projet
/Views/Home/Index.cshtmlpar celui qui est dans le fichierindex.txt. - Remplacez le contenu du fichier de style de votre projet
/wwwroot/css/site.csspar celui qui est dans le fichiersite.cssfourni. - Ajoutez le dossier images fourni dans le dossier
/wwwroot/de votre projet. - Avant de continuer, assurez-vous que votre page d’accueil soit identique à celle-ci :

- C’est le moment de faire votre commit et votre push, voir comment bien faire vos messages de commit.
Configuration de la base de données et du service SQL Server
- Faites les modifications nécessaires dans les fichiers de votre projet pour que la base de données soit fonctionnelle. Celle-ci devra se nommer
NutriVieEF. La classe pour votre DbContext devra se nommerNutriVieDbContext.cs - C’est le moment de faire votre commit et votre push.
Gestion des services
La section « Pourquoi Nutrivie ? » de la page d’accueil présente une liste de trois services (Recettes Saines, Plan Nutritionnels, Conseils d’Experts).
Pour le moment, ces éléments sont codés de façon statique. Nous allons plutôt stocker ces informations dans la base de données et ensuite les afficher.
- Dans le répertoire
/Models/, créez une classe nommée Service qui sera gérée par Entity Framework (EF) - À partir du diagramme ci-dessous, ajoutez les champs et les annotations nécessaires à votre classe Service.
Note : Puisque les services sont dans la page d’accueil (
/Views/Home/Index.cshtml), il ne sera pas nécessaire de créer un contrôleur MVC pour la classe Service. Nous utiliserons le contrôleur HomeController déjà présent (/Controllers/HomeController.cs). - Ajoutez un seed de données pour la classe Service. Utilisez les informations des trois services disponibles sur la page d’accueil pour remplir votre seed.

- Ajoutez une migration et mettez à jour votre base de données.
- Modifiez l’action
Index()du HomeController pour qu’elle retourne la liste des services à la vue index.cshtml - Modifiez la vue index.cshtml pour qu’elle utilise les données retournées par l’action
Index(). Si vous avez correctement implémenté le code, vous devriez obtenir le même résultat :
- C’est le moment de faire votre commit et votre push.
Gestion des catégories et des recettes
Nous voulons créer des recettes et associer celles-ci à des catégories, par exemple : Cuisine française.
- Créez une classe nommée Categorie et copiez le contenu du fichier
ClasseCategorie.txtdedans.
Elle est partiellement complétée, vous aurez à compléter les relations plus tard.
- Créez une classe nommée Recette et copiez le contenu du fichier
ClasseRecette.txtdedans.
Elle est partiellement complétée.
- Complétez les relations entre les classes Catégorie et Recette sachant qu’une recette appartient à une catégorie et qu’une catégorie peut contenir plusieurs recettes.
- Générez un contrôleur MVC avec vues pour la classe Catégorie.
- Générez un contrôleur MVC avec vues pour la classe Recette.
- Ajoutez le seed de données pour Catégorie et Recette qui est fourni dans le fichier
seed.txt. - Faites une migration et mettez à jour votre base de données.
- Modifiez le code pour que les onglets Catégories et Recettes des menus de navigation (
header et footer) mènent vers les pages Index respectives. - À ce point, vous devriez pouvoir faire des opérations CRUD pour les entités Catégorie et Recette.
Si vous voulez tester la suppression d'une catégorie ou d ’une recette, nous vous recommandons d'en ajouter une nouvelle plutôt que de supprimer celles déjà présentes.
- C’est le moment de faire votre commit et votre push.
Modifications dans les vues Recettes
Dans la vue Index
- Affichez le nom de la catégorie plutôt que le Id.
- Triez les recettes par catégorie et ensuite par nom.
- Affichez les images des recettes avec une largeur de 150 px si elles sont présentes (style intraligne).
- Changez la largeur du contenu de la colonne Description à 250 px (style intraligne).
- Changez les entêtes TempsPreparation et TempsCuisson du tableau par « Durée (min) » et « Cuisson (min) ».
- Résultat attendu :

Dans la vue Détails
- Affichez le nom de la catégorie plutôt que le Id.
- Affichez l'image de la recette en pleine résolution si elle est présente.
- Placez la catégorie avant l’image.
- Si ce n’est pas déjà le cas, changez les titres TempsPreparation et TempsCuisson du tableau par « Durée (min) » et « Cuisson (min) ».
- Résultat attendu :

Dans la vue Delete
- Affichez le nom de la catégorie plutôt que le Id.
- Retirez le temps de préparation, le temps de cuisson et l’image.
- Résultat attendu :
Dans les vues Edit et Create
- Dans le Select des catégories, affichez le nom de la catégorie plutôt que le Id.
- Le label de ce champ doit être « Catégorie » plutôt que « CategorieId ».
Pour la photo, on garde ça simple pour l'instant et on doit taper le nom de l'image de la recette.
- Résultat attendu :
- C’est le moment de faire votre commit et votre push.
Modification de la vue index de categorie
- Ajoutez une colonne qui affiche les recettes pour chaque catégorie.
- Les catégories doivent être classées en ordre alphabétique inverse.
- Pour chaque catégorie, les recettes doivent être ajoutées en ordre alphabétique.
- Pour chaque recette, nous aimerions afficher le temps de préparation entre parenthèses (voir l’image plus bas).
- Lorsque l’on clique sur une recette, on doit être redirigé vers la page Edit de cette recette.
- Résultat attendu :

Si l’on clique sur une recette (ex. : Couscous royal), nous serons redirigés vers la page d’édition de cette recette.
- C’est le moment de faire votre commit et votre push.
Implémentation de la logique d’affaires
- Empêchez la suppression d’une catégorie si celle-ci est associée à au moins une recette.
- Affichez un message d’erreur approprié (voir image).
- Assurez-vous que la suppression d’une catégorie qui ne contient pas de recettes fonctionne aussi.
- Résultat attendu :
- Empêchez l’ajout d’une catégorie du même nom.
- Affichez un message d’erreur approprié (voir images).
- Il faut tenir compte de la casse : Orientale et orientale déclenchent le message d’erreur.
- Résultat attendu :
- C’est le moment de faire votre commit et votre push.
Vues partielles et Fontawesome
- Créez des vues partielles pour regrouper les boutons d’action Create, Edit et Delete ainsi que le bouton Back to List.
- Pour obtenir le résultat attendu, vous devrez faire quelques modifications au niveau des classes Bootstrap (voir détails plus bas).
- Vos vues partielles devront être utilisées dans les vues suivantes :
- Categories/Create
- Categories/Edit
- Categories/Delete
- Recettes/Create
- Recettes/Edit
- Recettes/Delete
Au total, vous ne devrez pas avoir plus de trois vues partielles différentes pour cette section, car il existe 3 actions (Create, Edit et Delete). Chacune de ces vues partielles devra aussi contenir l’action Back to List.
Classes Bootstrap
Pour Categories/Create, Recettes/Create et la vue partielle associée :
- Remplacez la classe form-group du div contenant la vue partielle par la classe d-flex pour que les boutons soient côte à côte.
- Ajoutez une classe Bootstrap pour espacer les deux boutons.
- Ajoutez les classes btn et btn-secondary sur le bouton d’action Back to List.
- Résultat attendu :

Pour Categories/Delete, Recettes/Delete et la vue partielle associée :
- Ajoutez les classes btn et btn-secondary sur le bouton d’action Back to List.
- Retirez le symbole pipe (|).
- Résultat attendu :

Pour Categories/Edit, Recettes/Edit et la vue partielle associée :
- Faire les mêmes modifications que pour Create.
- Résultat attendu :

Utilisez FontAwesome pour les boutons suivants.
- Ce n’est pas grave si vous n’avez pas exactement les mêmes symboles.
- Résultats attendus :
- C’est le moment de faire votre commit et votre push.
LINQ : mise en place
- Avant de commencer cette section, ajoutez une nouvelle classe nommée Aliment.
- Utilisez le code fourni dans le fichier
Classe_Aliment.txtdu dossierFichiers_section_Linq. - Il y a une relation plusieurs à plusieurs entre Recette et Aliment. Ajoutez la propriété de navigation nécessaire dans la classe Recette.
- Ajoutez le seed pour Aliment contenu dans le fichier
Seed_Aliment.txtet le DbSet. - Mettez à jour votre BD.
- Puisqu’il s’agit d’une relation plusieurs à plusieurs, vous remarquerez qu’une table associative AlimentRecette a été ajoutée dans la BD.
- Nous allons créer cette table manuellement pour y stocker de l’information. Créez une nouvelle classe nommée AlimentRecette et utilisez le code fourni dans le fichier
Classe_AlimentRecette.txt.
Ne rajoutez pas de clé primaire à cette classe, une clé composée est déjà définie dans la création du dbContext.
- Ajoutez le seed pour AlimentRecette contenu dans le fichier
Seed_AlimentRecette.txtet le DbSet. - Puisque Recette et Aliment ne sont plus liés directement, il faut modifier les propriétés de navigation des deux classes.
- Retirez les propriétés de navigation qui liaient les deux classes et ajoutez cette nouvelle propriété de navigation dans les deux classes :
[ValidateNever]
public List<AlimentRecette> AlimentRecettes { get; set; }
- Ainsi, les classes Recette et Aliment sont maintenant liées à la classe associative AlimentRecette.
- Mettez à jour la BD.
- C’est le moment de faire votre commit et votre push.
LINQ : requêtes (faites d’abord la section « Mise en place »)
- Vous devez créer une page pour afficher des informations sur l’application. Vous devrez avoir un contrôleur et une vue index.
- Ajoutez un onglet Stats dans le menu de navigation pour accéder à cette page.
- Vous devez utiliser un ViewModel qui devra contenir les informations à afficher dans cette vue. Nommez-le StatVM.
- Vous devrez utiliser LINQ pour obtenir les informations.
- Chaque information nécessitera l'utilisation d'au moins une méthode LINQ.
Vous devez utiliser au minimum les méthodes LINQ qui sont spécifiées dans les instructions.
- Informations à afficher :
- Le nombre de recettes avec 3 aliments.
- L’aliment le plus calorique.
- Une liste des quatre recettes dont la durée totale est la plus courte (préparation et cuisson). Vous devez afficher le nom de la recette et le temps total.
- Le nombre de calories de la recette française la moins calorique en utilisant
MinetSum.
- Résultat attendu :

Vous n’êtes pas obligé de présenter l’information exactement de la même façon.
- C’est le moment de faire votre commit et votre push.
Affichage d’un menu de recettes avec un accordéon Bootstrap
-
Pour cette dernière section, nous allons afficher dans une nouvelle vue des informations sur les recettes en utilisant un accordéon Bootstrap (allez voir le laboratoire 1 de la rencontre 10). Vous devez avoir fait la section LINQ : MISE EN PLACE avant de faire cette section.
-
Voici un exemple de ce que l'on doit voir dans ce menu lorsque l'on clique sur une catégorie. Chaque catégorie contient sa liste de recettes et pour chaque recette, nous affichons certaines informations (détails plus bas).
- Pour ce menu, vous devrez utiliser une vue partielle pour afficher le tableau et vous devez également utiliser une vue partielle pour afficher le contenu de chaque rangée du tableau.

-
Vous devrez également utiliser un ViewModel qui doit se nommer RecetteCategorieVM.
-
Vous devrez également utiliser un ViewModel qui doit se nommer RecetteInfoVM. Celui-ci contiendra les informations de la recette. Le temps total représente la somme du temps de préparation et du temps de cuisson.
-
Le ViewModel RecetteCategorieVM doit, en plus de ses autres propriétés, contenir une
List<RecetteInfoVM>. -
Vous pouvez nommer vos vues comme vous le voulez, mais voici une suggestion :
- Vue principale avec l'accordéon (
AllRecettes.cshtml)- Vue partielle avec le tableau (
RecetteCategorie.cshtml)- Vue partielle avec une rangée du tableau (
RecetteInfo.cshtml)
- Vue partielle avec une rangée du tableau (
- Vue partielle avec le tableau (
- Vue principale avec l'accordéon (
-
Remarquez que, pour chaque titre de l'accordéon, on affiche le nom de la catégorie.
-
Pour le statut, il faut afficher un de ces trois messages qui dépend directement du temps total de la recette qui est affiché dans la colonne précédente :
Recette de courte durée (50 minutes ou moins)
Recette de durée moyenne (entre 51 et 90 minutes)
Recette de longue durée (plus de 90 minutes)
Utilisez une couleur différente pour chaque message. Vous pouvez utiliser les classes (text-success, text-warning, text-danger). La logique pour cette fonctionnalité doit se faire dans la vue.
- C’est le moment de faire votre commit et votre push.
Pondération
| Éléments de correction | Pondération |
|---|---|
| Création et mise en place du projet initial | 3 |
| Configuration de la base de données et du service SQL Server | 2 |
| Gestion des services | 3 |
| Gestion des catégories et des recettes | 7 |
| Modification de la vue index de catégorie | 4 |
| Logique d’affaires | 4 |
| Vues partielles et FontAwesome | 2 |
| LINQ (mise en place et requêtes) | 5 |
| Affichage du menu de recettes avec l’accordéon Bootstrap | 8 |
| Consignes Git (commits/push) | 2 |
| TOTAL | 40 |