# 📰 Mini CMS — Projet PHP / PDO / MySQL / MinIO / Docker

##  Description

Mini CMS est un projet web de type **Forum / CMS simplifié**, développé en **PHP avec PDO**, utilisant **MySQL** pour la base de données et **MinIO** pour le stockage d’images (compatible S3).  
Il permet de **créer, modifier, supprimer et consulter des articles**, avec un espace utilisateur (photo, bio, profil) et un **panneau d’administration complet**.

Ce projet respecte les consignes du **TP : Mini-Projet de Développement Web — CMS Simplifié**.

---

## ️ Technologies utilisées

- 🐘 **PHP 8.2** (avec PDO)
- 🗄️ **MySQL 8.1**
- ☁️ **MinIO** (stockage d’images S3)
- 🐳 **Docker & Docker Compose**
- 🎨 **HTML5 / CSS3 / Poppins**
- 🔐 **Sessions / Rôles (admin & auteur)**
- 💾 **AWS SDK for PHP** (pour communiquer avec MinIO)

---

## Fonctionnalités principales

###  Utilisateurs
- Inscription et connexion sécurisées (`password_hash()` + `password_verify()`).
- Photo de profil personnalisable (.jpg / .png).
- Bio (description personnelle).
- Suppression ou mise à jour de la photo (photo 👤 par défaut si supprimée).
- Affichage des profils publics avec photo, bio, et liste des articles publiés.

###  Articles
- Création, modification et suppression d’articles (titre, contenu, image).
- Stockage d’images sur **MinIO (bucket `bucketforum`)**.
- Affichage sur la page d’accueil avec ordre chronologique.
- Mise en page : **Titre → Image → Contenu**.
- Affichage des métadonnées (photo de l’auteur, nom, date, lien profil).
- Images redimensionnées proprement, non recadrées.

###  Administration
- Tableau de bord admin avec :
    - nombre total d’articles et d’utilisateurs,
    - gestion (suppression) des utilisateurs,
    - suppression et modification d’articles,
    - bouton “Publier un article” stylisé.
- Suppression **en cascade** : lorsqu’un utilisateur est supprimé, ses articles le sont aussi.

###  Sécurité
- Connexion sécurisée à la base via **PDO**.
- Requêtes préparées pour éviter les injections SQL.
- Hashage des mots de passe.
- Vérification de rôle pour restreindre les accès admin.
- Validation et échappement des champs utilisateurs.

---

##  Installation et exécution

###  Prérequis
- **Docker** et **Docker Compose** installés.
- Le fichier `.env` déjà configuré dans le dossier `infrastructure`.

### ⚙️ Étapes

#### 1️⃣ Cloner le projet
```bash
git clone https://github.com/ton_compte/forum-project.git
cd infrastructure

### Lancer le docker
docker-compose up --build -d

2// Lancer les conteneurs
docker-compose up --build -d


Démarre :

php_app → Apache + PHP

mysql_container → MySQL

minio_container → stockage

4// Vérifier les conteneurs
docker ps

5// Vérifier MySQL
docker exec -it mysql_container mysql -umyuser -pmypassword forum_database
SHOW TABLES;

6// Vérifier MinIO

Accède à http://localhost:9001

Login : minioadmin / Password : minioadmin
Tu dois voir le bucket bucketforum.

7// Accéder au site web

http://localhost:8080

>> Comptes par défaut
Rôle	Identifiant	Mot de passe
Admin	admin	ayadmin933
Auteur  ayauteur auteur
Auteur	aya	ayabmk933
Auteur	tess	ayabmk933

 Structure du projet
infrastructure/
 ├── docker-compose.yml
 ├── .env
 [init-schema.sql
 ├── init-minio.sh
 ├── setup-mysql/
 │    └── schema.sql
forum-project/
 ├── index.php
 ├── article.php
 ├── add_article.php
 ├── edit_article.php
 ├── dashboard.php
 ├── login.php
 ├── register.php
 ├── profile.php
 ├── profile_view.php
 ├── config.php
 ├── header.php
 ├── footer.php
 ├── uploads/
 │    └── profiles/
 └── vendor/

>>Base de données
utilisateurs
Champ	Type
id	INT AUTO_INCREMENT
username	VARCHAR
password	VARCHAR
role	ENUM('admin','auteur')
profile_picture	TEXT
bio	TEXT
date_inscription	DATETIME
posts
Champ	Type
id	INT AUTO_INCREMENT
title	VARCHAR
content	TEXT
image_url	TEXT
user_id	INT (FK → utilisateurs.id)
date_creation	DATETIME

Quand un utilisateur est supprimé, tous ses articles le sont aussi.

>> Configuration MinIO (PHP)
require 'vendor/autoload.php';
use Aws\S3\S3Client;

$s3Client = new S3Client([
    'version' => 'latest',
    'region' => 'us-east-1',
    'endpoint' => 'http://minio:9000',
    'use_path_style_endpoint' => true,
    'credentials' => [
        'key' => 'minioadmin',
        'secret' => 'minioadmin'
    ]
]);
$bucketName = 'bucketforum';

>> Commandes utiles
Redémarrer le projet

docker-compose down && docker-compose up -d

Ouvrir un terminal PHP

docker exec -it php_app bash

Installer le SDK AWS

docker exec -it php_app composer require aws/aws-sdk-php

Vérifier le bucket MinIO

docker exec -it php_app php -r "require 'vendor/autoload.php'; use Aws\S3\S3Client;
\$s3=new S3Client(['version'=>'latest','region'=>'us-east-1','endpoint'=>'http://minio:9000','use_path_style_endpoint'=>true,'credentials'=>['key'=>'minioadmin','secret'=>'minioadmin']]);
print_r(\$s3->listObjects(['Bucket'=>'bucketforum']));"

>> Design

Couleurs : rose / orange / violet

Police : Poppins

Boutons : dégradés et arrondis

Icônes :
👤 Profil 🕒 Date ✍️ Auteur 📰 Article

 >< Sécurité

Requêtes PDO préparées

Hash des mots de passe (bcrypt)

Validation stricte des images

Sessions sécurisées

Contrôle des rôles (admin/auteur)

>? Améliorations futures

Chat entre utilisateurs

Recherche d’articles

Pagination

Export CSV/PDF

Mode sombre

><> Dépannage rapide
Problème	Solution
$pdo non défini	Vérifie require_once 'config.php'
Connexion MySQL impossible	Vérifie .env
Images non visibles	Vérifie $s3Client / bucket
Page blanche	Active ini_set('display_errors',1);
Conteneurs ne démarrent pas	docker-compose down && up

>> Bonnes pratiques

Toujours valider les champs

Utiliser htmlspecialchars() pour l’affichage

Limiter la taille des uploads

Nettoyer les fichiers inutiles du bucket

Sauvegarder régulièrement :

docker exec -it mysql_container mysqldump -umyuser -pmypassword forum_database > backup.sql

>>Projet réalisé dans le cadre du TP — Mini-Projet CMS Simplifié<<

Architecture claire (PHP + PDO),
CRUD complet, gestion de rôles, design moderne et cohérent.