Plateforme de commande de repas en ligne avec espace client (Front-Office) et espace administrateur (Back-Office).
food-marketplace/
├── config/
│ └── database.php # Connexion PDO (singleton)
├── database/
│ ├── schema.sql # Création des tables
│ └── seed.sql # Données de démonstration
├── includes/
│ ├── auth.php # Session & helpers d'authentification
│ ├── functions.php # Utilitaires partagés (JSON, upload…)
│ ├── header-front.php # Layout header Front-Office
│ ├── footer-front.php # Layout footer Front-Office
│ ├── header-admin.php # Layout header Back-Office
│ └── footer-admin.php # Layout footer Back-Office
├── api/
│ ├── auth/
│ │ ├── login.php # POST — Connexion
│ │ ├── register.php # POST — Inscription
│ │ └── logout.php # GET — Déconnexion
│ ├── restaurants/
│ │ ├── index.php # GET — Liste (search, filtre, pagination)
│ │ ├── show.php # GET — Détail + plats
│ │ ├── store.php # POST — Créer (admin)
│ │ ├── update.php # POST — Modifier (admin)
│ │ └── destroy.php # POST — Supprimer (admin)
│ ├── plats/
│ │ ├── index.php # GET — Liste filtrée
│ │ ├── store.php # POST — Créer (admin)
│ │ ├── update.php # POST — Modifier (admin)
│ │ └── destroy.php # POST — Supprimer (admin)
│ ├── commandes/
│ │ ├── index.php # GET — Liste (admin: toutes | client: les siennes)
│ │ ├── show.php # GET — Détail + items
│ │ ├── store.php # POST — Passer commande
│ │ └── update-status.php # POST — Changer statut (admin)
│ ├── users/
│ │ ├── index.php # GET — Liste clients (admin)
│ │ └── show.php # GET — Fiche utilisateur (admin)
│ └── stats/
│ └── index.php # GET — KPIs + graphiques (admin)
├── front-office/
│ ├── index.php # Accueil — liste restaurants
│ ├── restaurant.php # Détail restaurant + menu
│ ├── checkout.php # Tunnel de commande
│ ├── login.php # Page connexion
│ ├── register.php # Page inscription
│ └── orders.php # Historique commandes
├── back-office/
│ ├── index.php # Dashboard KPIs + graphiques
│ ├── restaurants.php # CRUD restaurants
│ ├── plats.php # CRUD plats
│ ├── commandes.php # Gestion commandes
│ └── utilisateurs.php # Gestion utilisateurs
├── assets/
│ ├── css/
│ │ ├── variables.css # Tokens CSS (couleurs, typographie…)
│ │ ├── main.css # Styles globaux Front-Office
│ │ ├── front/
│ │ │ ├── home.css # Accueil & navbar
│ │ │ ├── restaurant.css # Page restaurant & menu
│ │ │ ├── cart.css # Drawer panier
│ │ │ └── checkout.css # Page checkout
│ │ └── admin/
│ │ └── admin.css # Layout & composants Back-Office
│ └── js/
│ ├── main.js # Utilitaires partagés (toast, fetch…)
│ ├── front/
│ │ ├── home.js # Listing & filtres restaurants
│ │ ├── restaurant.js # Menu & ajout au panier
│ │ ├── cart.js # État panier (localStorage)
│ │ └── checkout.js # Tunnel de commande
│ └── admin/
│ ├── main.js # Utilitaires admin (toast, fetch…)
│ ├── dashboard.js # KPIs + Chart.js
│ ├── restaurants.js # CRUD restaurants
│ ├── plats.js # CRUD plats
│ ├── commandes.js # Gestion commandes
│ └── utilisateurs.js# Gestion utilisateurs
├── uploads/
│ ├── restaurants/ # Images restaurants uploadées
│ └── plats/ # Photos plats uploadées
├── .htaccess # Config Apache (sécurité, réécriture)
└── README.md # Ce fichier
- PHP ≥ 8.0 avec PDO + PDO_MySQL
- MySQL / MariaDB ≥ 10.4
- Apache avec
mod_rewriteactivé (ou Nginx équivalent)
1. Cloner / décompresser le projet
# Dans le dossier racine de votre serveur (ex: /var/www/html ou htdocs)
unzip food-marketplace.zip -d food-marketplace2. Créer la base de données
mysql -u root -p < database/schema.sql
mysql -u root -p food_marketplace < database/seed.sql3. Configurer la connexion
// config/database.php
define('DB_HOST', 'localhost');
define('DB_NAME', 'food_marketplace');
define('DB_USER', 'root'); // ← modifier
define('DB_PASS', ''); // ← modifier4. Permissions uploads
chmod -R 755 uploads/
chown -R www-data:www-data uploads/5. Activer mod_rewrite (Apache)
sudo a2enmod rewrite
sudo systemctl restart apache26. Accéder à l'application
- Front-Office :
http://localhost/food-marketplace/front-office/ - Back-Office :
http://localhost/food-marketplace/back-office/
| Rôle | Mot de passe | |
|---|---|---|
| Administrateur | admin@foodmarket.tn | admin123 |
| Client | ahmed@mail.tn | client123 |
| Client | sarra@mail.tn | client123 |
⚠️ Changer les mots de passe avant toute mise en production.
- ✅ Exploration des restaurants avec recherche et filtres par cuisine
- ✅ Page détail restaurant avec menu catégorisé (Entrées / Plats / Desserts / Boissons)
- ✅ Panier latéral (drawer) avec gestion des quantités
- ✅ Tunnel de commande : auth → livraison → paiement → confirmation
- ✅ 3 modes de paiement : carte, livraison, mobile money
- ✅ Historique des commandes avec suivi de statut
- ✅ Inscription / connexion intégrés
- ✅ Dashboard avec KPIs temps réel (ventes jour/mois/année)
- ✅ Graphiques : courbe CA, histogramme commandes, doughnut par restaurant (Chart.js)
- ✅ Top 5 / Flop 5 des plats les plus/moins vendus
- ✅ CRUD complet Restaurants (avec upload image)
- ✅ CRUD complet Plats (avec upload photo, liaison restaurant)
- ✅ Gestion des commandes avec changement de statut en temps réel
- ✅ Gestion des utilisateurs avec fiche détaillée et historique
| Couche | Technologie |
|---|---|
| Backend | PHP 8 natif, PDO, sessions |
| Base de données | MySQL / MariaDB |
| Frontend | HTML5, CSS3 (variables CSS), JavaScript ES6+ |
| Graphiques | Chart.js 4 |
| Polices | Google Fonts (Playfair Display + DM Sans) |
| Serveur | Apache + mod_rewrite |
- Mots de passe hashés avec
password_hash()(bcrypt) - Requêtes préparées PDO (protection injection SQL)
- Validation des rôles sur chaque endpoint API
- Headers de sécurité HTTP (XSS, clickjacking…)
- Exécution PHP bloquée dans
/uploads/ - Listing de répertoires désactivé
- Le panier est géré en
localStoragecôté client. - Les APIs retournent du JSON et sont consommées par
fetch(). - La pagination est gérée côté serveur (LIMIT / OFFSET).
- Les images uploadées sont stockées dans
/uploads/restaurants/et/uploads/plats/.
Projet réalisé dans le cadre du Devoir Surveillé — Technologies et programmation Web — GLSI2