Version
- 1.0 (11/2023)
Statut
Une nouvelle version du projet a été initialisé afin de le moderniser, tant sur le design que sur les technologies utilisées. Vous pouvez le consulter : ici
Contexte du projet
À la suite d’un stage réalisé pendant ma formation de Développeur Web et Web Mobile en 2023, j’ai poursuivi le travail initié pour aboutir à la création d’un site vitrine professionnel pour L’Aura Natur’elle, une entreprise individuelle d’esthétique située à Saint-Quentin (02). L’objectif de ce projet était d’améliorer la visibilité de l’entreprise sur le web, alors principalement limitée à Facebook.
Le site devait permettre de présenter les prestations de l’entreprise, les tarifs, les horaires d’ouverture, ainsi que fournir les coordonnées et un formulaire de contact. Malheureusement, le projet n’a pas pu être finalisé en raison du manque de temps et de moyens. De plus, les changements fréquents de direction de la cliente ont également ralenti et compliqué la réalisation du site.
Gallerie







Fonctionnalités
Le simple utilisateur n’a qu’une possibilité consultative des informations du site en plus de pouvoir utiliser le formulaire de contact. En revanche, l’administrateur a plusieurs leviers à sa disposition pour gérer le contenu :
- Gestion des horaires d’ouverture : Permet de définir les horaires d’ouverture de l’entreprise pour chaque jour de la semaine.
- Gestion des prestations : Permet de définir les prestations proposées par l’entreprise, avec la possibilité de les classer par catégories, de déterminer s’il s’agit d’une prestation classique, d’un forfait ou d’un évènement à durée limité.
- Gestion des tarifs : Permet de définir les durées et les tarifs des prestations.
- Gestion des réductions : Permet de définir des réductions temporaires sur les prestations.
- Gestion des annonces : Permet de diffuser des annonces temporaires sur le site.
Stack technique
Étant fraîchement diplômé de ma formation, mes compétences étaient limitées, et je n’avais pas encore la maîtrise des frameworks qui permettent d’accélérer la productivité. J’ai donc choisi de m’appuyer sur des technologies basiques pour mener à bien ce projet.
Pour la partie back-end, j’ai opté pour PHP, associé à MySQL pour la gestion de la base de données. Côté front-end, j’ai utilisé CSS et JavaScript, avec le framework Bootstrap pour faciliter la mise en page et le rendu responsive.
De plus, ayant eu recours à des dépendances externes telles que PHP Mailer, Google CAPTCHA et Stripe, j’ai dû m’intéresser à Composer pour gérer ces bibliothèques de manière efficace.
Organisation du code
L’organisation suit le modèle MVC (Modèle-Vue-Contrôleur) pour garantir une séparation claire des responsabilités et une maintenabilité optimale du code. La structure du projet est la suivante :
Nom du namespace | Responsabilité |
---|---|
Config | Centralise les configurations du site. |
Controllers | Comporte la logique du site. |
Views | Regroupe les vues du site. |
Models | Définit la classe Subject pour la gestion des sujets et la définition de la méthode d'extraction des flux RSS. |
Public | Contient les ressources statiques (images, CSS, JavaScript) dans un sous dossier Assets. |
Helpers | Contient une fonction utilitaire pour la réeécriture d'URLs. |
Vendor | Contient les dépendances du projet installées via Composer. |
Structure de la base de données

Si le projet n’avait pas été abandonné, je n’aurais pas communiquer autant d’informations afin de garder une certaine confidentialité. Cependant, je vous partage le modèle physique de données que j’avais conçu pour le site, sachant que la V.2 est bien différente et plus adaptée.
DROP DATABASE IF EXISTS `laura_naturelle`;
CREATE DATABASE IF NOT EXISTS `laura_naturelle` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE `laura_naturelle`;
---------------------------------------------------
-- Créer la table des horaires d'ouverture
---------------------------------------------------
CREATE TABLE `schedules` (
`id_schedules` INT AUTO_INCREMENT,
`week_day` VARCHAR(10) NOT NULL,
`open_day` TINYINT NOT NULL DEFAULT 0,
`open_hour` TIME NOT NULL DEFAULT '00:00:00',
`close_mid_hour` TIME NOT NULL DEFAULT '00:00:00',
`open_mid_hour` TIME NOT NULL DEFAULT '00:00:00',
`close_hour` TIME NOT NULL DEFAULT '00:00:00',
`updated_at` DATETIME,
PRIMARY KEY(`id_schedules`),
UNIQUE(`week_day`)
) ENGINE=InnoDB;
---------------------------------------------------
-- Créer la table des utilisateurs
---------------------------------------------------
CREATE TABLE `users` (
`id_user` INT AUTO_INCREMENT,
`email` VARCHAR(150) NOT NULL,
`phone` CHAR(10) NOT NULL,
`address` VARCHAR(150) NOT NULL,
`zipcode` CHAR(5) NOT NULL,
`city` VARCHAR(150) NOT NULL,
`artisan` BOOLEAN NOT NULL DEFAULT 0,
`admin` BOOLEAN NOT NULL DEFAULT 0,
`password` VARCHAR(250) NOT NULL,
`updated_at` DATETIME,
PRIMARY KEY(`id_user`),
UNIQUE(`email`),
UNIQUE(`phone`)
) ENGINE=InnoDB;
---------------------------------------------------
-- Créer la table des annonces
---------------------------------------------------
CREATE TABLE `announcements` (
`id_announcement` INT AUTO_INCREMENT,
`content` VARCHAR(500) NOT NULL,
`start_date` DATE NOT NULL,
`end_date` DATE NOT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME,
`deactivated_at` DATETIME,
PRIMARY KEY(`id_announcement`)
) ENGINE=InnoDB;
---------------------------------------------------
-- Créer la table des catégories de prestations
---------------------------------------------------
CREATE TABLE `categories` (
`id_category` INT AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
`description` VARCHAR(500),
`view` TINYINT NOT NULL,
`darkmode` BOOLEAN NOT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`published_at` DATETIME,
`updated_at` DATETIME,
`deactivated_at` DATETIME,
PRIMARY KEY(`id_category`)
) ENGINE=InnoDB;
---------------------------------------------------
-- Créer la table des réductions
---------------------------------------------------
CREATE TABLE `discounts`(
`id_discount` INT AUTO_INCREMENT,
`start_date` DATE NOT NULL,
`end_date` DATE NOT NULL,
`advantage` TINYINT NOT NULL,
`euro` BOOLEAN NOT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME,
`deactivated_at` DATETIME,
PRIMARY KEY(`id_discount`)
) ENGINE=InnoDB;
---------------------------------------------------
-- Créer la table des prestations
---------------------------------------------------
CREATE TABLE `services`(
`id_service` INT AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
`gender` TINYINT NOT NULL,
`description` VARCHAR(250) ,
`start_exclusive_date` DATE,
`end_exclusive_date` DATE,
`package` BOOLEAN NOT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`published_at` DATETIME,
`updated_at` DATETIME,
`deactivated_at` DATETIME,
`id_discount` INT,
`id_category` INT NOT NULL,
PRIMARY KEY(`id_service`),
CONSTRAINT `fk_discounts` FOREIGN KEY(`id_discount`) REFERENCES `discounts`(`id_discount`) ON DELETE SET NULL,
CONSTRAINT `fk_categories` FOREIGN KEY(`id_category`) REFERENCES `categories`(`id_category`) ON DELETE CASCADE
) ENGINE=InnoDB;
---------------------------------------------------
-- Créer la table des prix
---------------------------------------------------
CREATE TABLE `pricings`(
`id_pricing` INT AUTO_INCREMENT,
`duration` SMALLINT NOT NULL,
`price` DECIMAL(5,2) NOT NULL,
`id_service` INT NOT NULL,
PRIMARY KEY(`id_pricing`),
CONSTRAINT `fk_services` FOREIGN KEY(`id_service`) REFERENCES `services`(`id_service`) ON DELETE CASCADE
) ENGINE=InnoDB;
Développement
Pour le routage de ce projet, n’ayant pas utilisé de framework, j’ai dû configurer manuellement le fichier .htaccess
pour diriger chaque requête vers le controller adéquat. En activant la réécriture d’URL (RewriteEngine On
), j’ai défini des règles spécifiques, facilitant l’organisation des URLs en sections logiques (par exemple, /gestion/ pour les pages de gestion ou /informations/ pour les pages d’informations légales). Chaque règle utilise l’option [L], garantissant qu’une seule règle est appliquée par requête, ce qui optimise les performances du serveur.
Certaines routes dynamiques, comme prestations/([^/]+)
, capturent des paramètres dans l’URL grâce aux expressions régulières, rendant le routage plus flexible. Par ailleurs, en définissant une règle ErrorDocument 404
, j’ai pu rediriger les utilisateurs vers une page 404 personnalisée en cas de route inexistante, assurant une expérience utilisateur cohérente.
Voici un extrait du fichier .htaccess
:
RewriteEngine On
RewriteRule ^accueil$ /controllers/home_controller.php [L]
RewriteRule ^prestations/([^/]+)$ /controllers/services_controller.php [L]
RewriteRule ^informations/mentions-legales$ /controllers/informations/legal_notice_controller.php [L]
RewriteRule ^gestion/mon-compte$ /controllers/dashboard/account_controller.php [L]
RewriteRule ^gestion/(ajouter|modifier)-une-promotion$ /controllers/dashboard/discount_manager_controller.php [L]
RewriteRule ^gestion/publication$ /controllers/dashboard/publish_controller.php [L]
RewriteRule ^404$ /404.php [L]
ErrorDocument 404 /404.php