L'Aura Natur'elle - V.1

Illustration du projet Illustration du projet
Publié le

Version

  1. 1.0 (11/2023)

Statut

Archivé

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

Capture d'écran du projet
Page d'accueil
Capture d'écran du projet
Page des prestations en liste
Capture d'écran du projet
Page des prestations en grille
Capture d'écran du projet
Page de contact
Capture d'écran du projet
Dashboard - Page de l'ensemble des prestations
Capture d'écran du projet
Dashboard - Page d'ajout d'une prestation
Capture d'écran du projet
Dashboard - Page d'ajout d'une promotion

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

Modèle physique de données
Modèle physique 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