Web & CLI application for managing restaurant food deliveries in Valais, Switzerland, built with ASP.NET Core 5 MVC and an N‑Tier architecture.
VsEat lets end‑users order dishes from partner restaurants and have them delivered by BERZ couriers. The solution is organised as three layers DAL → BLL → MVC on top of a Microsoft SQL Server database. A secondary branch contains a CLI client that re‑uses the same business logic.
Layer | Technology / Tool | Version |
---|---|---|
Language | C# | 9.0 |
Framework | .NET Core MVC | 5.0 |
ORM | Entity Framework Core | 5.0 |
Database | Microsoft SQL Server | 2019 |
Front‑End | Bootstrap | 4.6 |
Architecture | N‑Tier, MVC | — |
- Design and implement a layered architecture (DAL/BLL/MVC).
- Configure EF Core migrations against SQL Server.
- Secure an ASP.NET Core application (authentication & role management).
- Build Razor views and REST‑like controllers.
- Deploy both the Web UI and the CLI client.
- User registration & login (client or staff).
- Restaurant & menu browsing with images.
- Order creation (15‑minute delivery windows, price calculated).
- Delivery assignment (maximum 5 orders per courier every 30 minutes).
- Courier dashboard to archive deliveries.
- Profile management (edit details, change location, deactivate account).
- Image storage: compressed PNG (~ 65 %) stored as
varbinary(MAX)
. - CLI client available in the
SaveConsoleApp
branch.
- ✅ Clear separation of concerns across layers.
- ✅ Dependency Injection everywhere.
Global ASP.NET Core middleware plus local try/catch
.
VsEat-Livraison-de-nourriture-BERZ/
├── DAL/ # Data Access Layer
├── BLL/ # Business Logic Layer
├── DTO/ # Data Transfer Objects
├── VSEatWebApp/ # ASP.NET Core MVC UI
└── PlatManagementTool/ # CLI Helper to upload images
- ER (Entity‑Relationship) Diagram:
MPD_VSEat.pdf
- Requirements document:
Annexes/623‑1 Project - MVC - VSEat.docx
Criterion | Status | Notes |
---|---|---|
Core functionalities working (login, order, delivery) | ✅ Done | All mandatory user stories implemented |
Deployment on school server (production) | ✅ Done | Deployed Jan 2022; link now offline |
Clean code & correct MVC / N‑Tier design | ✅ Done | Meets course guidelines but some refactoring needed |
SQL schema & commands quality | ✅ Done | Normalised schema and explicit queries |
UI/UX (CSS "look & feel") | 🟡 Partial | Functional but design could be improved |
Bug‑free operation | 🟡 Partial | Minor known issues, no blocking bugs |
Documentation (README + ER diagram + logbook) | ✅ Done | README, ER present and logbook |
ConnectionStrings.DefaultConnection
contains the IP, user id and password for the school test server.
This was acceptable for the practical assignment, but it is not good practice in production.
Secrets should be stored in dotnet user‑secrets, environment variables or a appsettings.Development.json
file ignored by Git.
Branch | Content |
---|---|
master |
MVC web application |
SaveConsoleApp |
Historical CLI client |
Accounts were seeded directly into the database and are not part of the SQL script.
Name | Password | Active | |
---|---|---|---|
Venec Le Bandit | esclaves.pascher@dies.irae | 3337 | ✅ |
Kadoc Le Caillou | la.poulette@dies.irae | 0996 | ✅ |
Aconia De la Villa | fidele.romaine@dies.irae | 3844 | ✅ |
Sven Le Viking | valhalla.awayts@dies.irae | 8765 | ✅ |
Demetra Du Château | favorite@dies.irae | 2964 | ✅ |
Loth Orcanie | traitre@dies.irae | 7754 | ❌ |
Name | Password | Active | |
---|---|---|---|
Zacharie Renna | rz@dies.irae | 1234 | ✅ |
Arthur Pendragon | sanglier.cornouaille@dies.irae | 4200 | ✅ |
Lancelot Du Lac | chevalier.errant@dies.irae | 1922 | ✅ |
Père Blaise | quinte.juste@dies.irae | 6669 | ❌ |
Dame Du Lac | invisible.aux.mortels@dies.irae | 2119 | ✅ |
Merlin Druide | coco.asticot@dies.irae | 2500 | ✅ |
Léodagan Carmélide | chevalier.sanguinaire@dies.irae | 3024 | ✅ |
Yvain Chevalier au Lion | petit.pedestre@dies.irae | 7843 | ✅ |
Perceval Le Gallois | pas.faux@dies.irae | 6597 | ✅ |
Karadoc De Vannes | semi.croustillant@dies.irae | 0874 | ✅ |
Bohort De Gaunes | mecreants@dieas.irae | 5591 | ✅ |
Elias De Kelliwich | enchanteur.du.nord@dies.irae | 6660 | ✅ |
-
Clients can:
- Access their profile to edit details, address and deactivate the account.
- Browse restaurants and create orders for a chosen date & time.
- View past orders.
- Cancel an order at least 3 hours in advance, as long as no courier has accepted it.
-
Staff can:
- Edit their profile, delivery area and deactivate the account.
- See the order history.
- Accept / validate a customer order.
A customer places an order, a courier handles it. The customer can cancel 3 hours in advance while the order is still pending. Payment happens on delivery at the customer’s address.
Given the small DB size, product & restaurant pictures are stored directly in the database as varbinary(MAX)
. The PNG files are compressed (~ 65 %) beforehand to keep performance acceptable.
A helper project called PlatManagementTool makes it easy to upload or change images.
Queries in the DAL are written explicitly (SELECT column1, column2 …
) rather than SELECT *
, to improve performance.
Project by Zacharie Renna and Elias Borrajo. Tested with care by Céline Vialard.
Ce projet est fait dans le cadre de notre 3ème semestre d'études en tempa spartiel à la HES-So - Informatique de gestion pour le module de Software Development - SI - Implémentation du système d'information.
Au cours du semestre, nous aprennons à développer une application en utilisant plusieurs couches. On implemente une couche de données (DAL), une couche métier (BLL) et enfin on apprend à utiliser ASP.NET MVC (model View Controller) comme interface utilisateur. L'idée du projet est de modifier le DAL et le BLL créés pendant les leçons et de créer une nouvelle interface utilisateur développée comme une application MVC.
Les technologies utilisées durant le projet sont :
-
C# : Car c'est un langage proche du Java que nous conaissons déja. Environ 70% de l'application.
-
Framework .NET Core 5.0 : Le framework CORE permet lancer l'application sur differents OS. Les differentes couches (DAL/ BLL / DTO / ConsoleApp / MVC) utilisent ce framework
- De plus, l'installation depuis "NuGet" des extensions suivantes ont été nécessaires, c'est un gestionnaire de package pour la solution.
- Les extensions de "NuGet" s'installent depuis :
- Barre d'outils --> Outils --> gestionnaire de package NuGet --> Gerer les packets.
- Puis installer :
- Microsoft.Extensions.Configuration
- Microsoft.Extensions.Configuration.Abstractions
- Microsoft.Extensions.Configuration.FileExtensions
- Microsoft.Extensions.Configuration.Json
- System.Data.SqlClient
- Les extensions de "NuGet" s'installent depuis :
- De plus, l'installation depuis "NuGet" des extensions suivantes ont été nécessaires, c'est un gestionnaire de package pour la solution.
-
BootStrap 4 : Nous permet de créer des vues grâce à des templates déja existant et d'avoir une web-app esthetique et agréable à l'utisation. C'est un gain de temps énorme sur la partie front end du projet. Bootstrap a l'avantage d'avoir du razorcode qui interprêtera du code C# et le traduira en adequation. L'autre avantage de bootstrap qui peut sembler pareil que le razorcode, c'est les ASP commands qui seront aussi utilisées lors du projet.
- HTML / CSS / SCSS / JavaScript Les professeurs sont nos clients lors de la remise du projet, il ne faut donc pas que le projet plante durant son utilisation.
La base de données stocke des données à gérer :
- les plats vendus par les restaurants
- les commandes des clients
- le personnel de BERZ responsable de la livraison dans les villes
- login du personnel
- login des clients
-
Login : Un client doit créer un compte avec son adresse avant d'utiliser le site web
-
Commande : Un client connecté peut choisir des plats dans une liste donnée pour chaque restaurant disponible sur le site web pour former une commande. Il (le client) ajoutera le délai de livraison (toutes les 15 minutes) pour sa commande. A la fin de la commande, le prix que le client doit payer au coursier sera affiché.
-
Gestion des livraisons : Le système attribue la livraison d'une commande à un coursier disponible dans la même ville que le restaurant où la commande est passée. Un coursier ne peut pas avoir plus de 5 commandes à livrer toutes les 30 minutes.
-
Interface de livraison : chaque coursier peut se connecter au système pour voir ses prochaines livraisons. Lorsqu'une livraison est effectuée, le livreur l'archive en appuyant sur un bouton de l'interface de livraison.
L'adresse du site déployé sur le serveur est : WebApp - BerzEat
-
Afin de pouvoir se connecter au serveur du professeur, il faut avoir un fichier de configuration, apellé : appsettings.json placé à la racine du projet console ou MVC. Dans ce fichier, nous avons une "ConnectionStrings", il faut y donner l'adresse IP du serveur du professeur, le nom de la DBO à laquelle l'on veut se connecter, un ID & Password pour avoir accès au serveur.
1 : Voici l'exemple simplifié de l'accès avec l'application console :
``` { "ConnectionStrings": { "DefaultConnection": "Data Source=153.109.124.35;Initial Catalog=VSEAT_BERZ;Persist Security Info=True;User ID=6231db;Password=Pwd46231." } } ```
2 : Et voici ce même fichier, mais dans le MVC de la web-app :
``` { "ConnectionStrings": { "DefaultConnection": "Data Source=153.109.124.35;Initial Catalog=VSEAT_BERZ;Persist Security Info=True;User ID=6231db;Password=Pwd46231." }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*" } ```
Nom, Prénom | Mot de passe | Compte Actif | |
---|---|---|---|
Le Bandit, Venec | esclaves.pascher@dies.irae | 3337 | Oui |
Le Caillou, Kadoc | la.poulette@dies.irae | 0996 | Oui |
De la Villa, Aconia | fidele.romaine@dies.irae | 3844 | Oui |
Le Viking, Sven | valhalla.awayts@dies.irae | 8765 | Oui |
Du Château, Demetra | favorite@dies.irae | 2964 | Oui |
Orcanie, Loth | traitre@dies.irae | 7754 | Non |
Nom, Prénom | Mot de passe | Compte Actif | |
---|---|---|---|
Renna, Zacharie | rz@dies.irae | 1234 | Oui |
Pendragon, Arthur | sanglier.cornouaille@dies.irae | 4200 | Oui |
Du Lac, Lancelot | chevalier.errant@dies.irae | 1922 | Oui |
Blaise, Père | quinte.juste@dies.irae | 6669 | Non |
Du Lac, Dame | invisible.aux.mortels@dies.irae | 2119 | Oui |
Druide, Merlin | coco.asticot@dies.irae | 2500 | Oui |
Carmélide, Léodagan | chevalier.sanguinaire@dies.irae | 3024 | Oui |
Chevalier au Lion, Yvain | petit.pedestre@dies.irae | 7843 | Oui |
Le Gallois, Perceval | pas.faux@dies.irae | 6597 | Oui |
De Vannes, Karadoc | semi.croustillant@dies.irae | 874 | Oui |
De Gaunes, Bohort | mecreants@dieas.irae | 5591 | Oui |
De Kelliwich, Elias | enchanteur.du.nord@dies.irae | 6660 | Oui |
-
Les clients peuvent donc se connecter puis :
- Accéder à leur profil afin de modifier leurs informations, leur localité & désactiver leur compte.
- Voir les restaurants existants, et créer une nouvelle commande pour une date & heure voulue.
- Voir la l'historique des commandes.
- Annuler une commande en cours au moins 3h à l'avance & qui n'a pas encore été validé par le livreur.
-
Les staffs peuvent donc se connecter puis :
- Accéder à leur profil afin de modifier leurs informations, leur localité de livraisons & désactiver leur compte.
- Voir la l'historique des commandes.
- Valider une commande passée par un client.
Un client va donc passer une commande, et un staff s'occupera de celle-ci. Le client peut annuler sa commande 3h à l'avance et tant qu'aucun staff ne la valide. Le client paie sa commande au staff lorsque le staff arrive au lieu de livraison. On part du principe que le client veut se faire livrer à son domicile, donc à son adresse.
Etant donné que nous possédons une petite DB, et que le projet reste relativement petit, nous avons décidé de stocker les images directement dans la DB sous forme de "VarBinary". Ce sera donc un tabelau de bytes stocké que nous convertissons lors de la récuperation de l'enregistrement. Ce tableau de bytes sera converti en StringBase64 pour l'affichage. Ces images sont en format .png afin d'être moins lourd que du .jpeg. Et par souci d'optimisation, les images ont été compressés d'environ 65% avant d'entre ajoutées à la DB. Ainsi, nous n'avons pas de pertes de performances.Un projet a été crée s'apellant : PlatManagementTool. C'est un outil permettant de visualiser quel restaurant et quels plats possèdent des images, et de pouvoir aller chercher des images sur le disque du PC de l'utilisateur facilement, et de les upload dans la DB.
Les requêtes SQL écrites dans la DAL ont aussi été optimisées. Nous ne faisons pas un " SELECT * " qui prendrait toutes les données de la table, mais un " SELECT name .... " avec chaque élément voulu. C'est plus efficace parce que la requête sait directement quelle colonne récuperér. A cause de la durée du projet qui est limtié, nous n'avons pas pu implementér toutes les fonctionnalitées voulues.- Ajouter un horaire aux restaurants, pour éviter les commandes hors horaires.
- Ajouter des catégories pours les plats : Viande / Poisson / Burger / Boissons / Vegan.
- Ajouter une taxe à chaque commande pour le revenu des dev de la plateforme.
- Dans la gestion des exceptions, si une erreur survient et nous ramène sur une autre page, afficher l'erreur dans une pop-up de l'app.
- Améliorer le design des pages.