diff --git a/.idea/alica.iml b/.idea/alica.iml old mode 100755 new mode 100644 index 9a8e33d..816484e --- a/.idea/alica.iml +++ b/.idea/alica.iml @@ -2,9 +2,7 @@ - - - + diff --git a/php/public/assets/logo.png b/php/public/assets/logo.png new file mode 100644 index 0000000..d272825 Binary files /dev/null and b/php/public/assets/logo.png differ diff --git a/php/public/css/inscription_success.css b/php/public/css/inscription_success.css new file mode 100644 index 0000000..86fa52c --- /dev/null +++ b/php/public/css/inscription_success.css @@ -0,0 +1,102 @@ +.three-body { + --uib-size: 500px; + --uib-speed: 0.8s; + --uib-color: #00DBFF; + position: relative; + display: inline-block; + height: var(--uib-size); + width: var(--uib-size); + animation: spin78236 calc(var(--uib-speed) * 2.5) infinite linear; +} + +.three-body__dot { + position: absolute; + height: 100%; + width: 30%; +} + +.three-body__dot:after { + content: ''; + position: absolute; + height: 0; + width: 100%; + padding-bottom: 100%; + background-color: var(--uib-color); + border-radius: 50%; +} + +.three-body__dot:nth-child(1) { + bottom: 5%; + left: 0; + transform: rotate(60deg); + transform-origin: 50% 85%; +} + +.three-body__dot:nth-child(1)::after { + bottom: 0; + left: 0; + animation: wobble1 var(--uib-speed) infinite ease-in-out; + animation-delay: calc(var(--uib-speed) * -0.3); +} + +.three-body__dot:nth-child(2) { + bottom: 5%; + right: 0; + transform: rotate(-60deg); + transform-origin: 50% 85%; +} + +.three-body__dot:nth-child(2)::after { + bottom: 0; + left: 0; + animation: wobble1 var(--uib-speed) infinite + calc(var(--uib-speed) * -0.15) ease-in-out; +} + +.three-body__dot:nth-child(3) { + bottom: -5%; + left: 0; + transform: translateX(116.666%); +} + +.three-body__dot:nth-child(3)::after { + top: 0; + left: 0; + animation: wobble2 var(--uib-speed) infinite ease-in-out; +} + +@keyframes spin78236 { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + +@keyframes wobble1 { + 0%, + 100% { + transform: translateY(0%) scale(1); + opacity: 1; + } + + 50% { + transform: translateY(-66%) scale(0.65); + opacity: 0.8; + } +} + +@keyframes wobble2 { + 0%, + 100% { + transform: translateY(0%) scale(1); + opacity: 1; + } + + 50% { + transform: translateY(66%) scale(0.65); + opacity: 0.8; + } +} diff --git a/php/public/css/menu.css b/php/public/css/menu.css new file mode 100644 index 0000000..6ab9e3d --- /dev/null +++ b/php/public/css/menu.css @@ -0,0 +1,145 @@ +a { + text-decoration: none; +} + +.navbar-container { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 2rem; + width: 100%; + height: 70px; + background: #fff; + color: #212121; + position: sticky; + top: 0; + left: 0; + z-index: 100; +} + +.navbar-container .logo-container a { + font-size: 1.5rem; + font-weight: 500; + font-family: 'Kanit', sans-serif; + text-transform: uppercase; + cursor: pointer; + color: #212121; + max-height: 70px; +} + +.navbar-container .nav-items { + display: flex; + align-items: center; + gap: 3rem; + list-style: none; +} + +.navbar-container .nav-items .nav-link a { + color: #212121; + padding: 10px; + text-transform: uppercase; + transition: 0.2s; +} + +.navbar-container .nav-items .nav-link:after { + content: ''; + display: block; + border-top: 3px solid #00DBFF; + transform: scaleX(0); + transition: transform 250ms ease-in-out; +} + +.navbar-container .nav-items .nav-link:hover:after { + transform: scaleX(0.8); +} + +.navbar-container .nav-items .login-register { + display: flex; + flex-direction: row; + gap: 1rem; +} + +.navbar-container .nav-items .login-register .button { + color: #00DBFF; + padding: 5px 20px; + text-transform: uppercase; + border-radius: 15px; + border: #fff 2px solid; +} + +.navbar-container .nav-items .login-register .button2{ + background: #00DBFF; + color: #fff; + border-radius: 15px; +} + +.navbar-container .nav-items .login-register .button:hover { + border: #00DBFF 2px solid; +} + +.navbar-container .nav-items .login-register .button2:hover { + border: #00A4FF 2px solid; +} + +@media(max-width: 1030px) { + .navbar-container { + padding: 0 1rem; + } + + .navbar-container .nav-items { + gap: 0.1rem; + } + + .navbar-container .nav-items .nav-link a, + .navbar-container .nav-items .login-register .button { + font-size: 0.9rem; + } +} + +@media(max-width: 915px) { + .navbar-container .nav-items { + flex-direction: column; + position: fixed; + top: 70px; + right: -100%; + width: 100vw; + height: 100vh; + padding: 1rem 0; + z-index: 99; + background: #fff; + transition: 0.2s ease-in; + } + + .bars { + width: 22px; + height: auto; + cursor: pointer; + } + + .bars .bar { + width: 100%; + height: 2px; + background: #212121; + margin: 5px; + } + + .navbar-container .nav-items { + gap: 3rem; + } + + .navbar-container .nav-items .login-register { + width: 50%; + text-align: center; + flex-direction: column; + gap: 2rem; + } + + .navbar-container .nav-items .login-register .button { + padding: 1rem 0; + } + +} + +.navbar-container .nav-items.active { + right: 0; +} \ No newline at end of file diff --git a/php/public/index.php b/php/public/index.php index 8a015ce..d0ad525 100755 --- a/php/public/index.php +++ b/php/public/index.php @@ -1,4 +1,4 @@ - false, 'debug' => true ]); - -$cont = new \App\controleur\FrontControleur(); \ No newline at end of file +$twig->addExtension(new \Twig\Extension\DebugExtension()); +$cont = new \App\controleur\FrontControleur(); +//end session \ No newline at end of file diff --git a/php/src/config/config.php b/php/src/config/config.php index 0a66244..dcb711b 100755 --- a/php/src/config/config.php +++ b/php/src/config/config.php @@ -7,6 +7,6 @@ $rep = __DIR__ . '/php/'; $dConfig['includes']= array('controleur/Validation.php'); //BD -$base = 'mysql:host=localhost;dbname=dbAlica'; -$login = 'root'; -$mdp = ''; +define('DB_HOST', 'mysql:host=localhost;dbname=dbAlica'); +define('DB_USER', 'Dev'); +define('DB_PASS', 'Dev'); \ No newline at end of file diff --git a/php/src/controleur/FrontControleur.php b/php/src/controleur/FrontControleur.php index 0fe94ad..58b83e8 100755 --- a/php/src/controleur/FrontControleur.php +++ b/php/src/controleur/FrontControleur.php @@ -16,10 +16,10 @@ class FrontControleur //TODO ], "Membre" => [ - "deconnexion","proposerOffre","consulterProfil","modifierProfil","signaler" + "deconnexion","proposerOffre","consulterProfil","modifierProfil","signaler", ], "Utilisateur" => [ - "connection", "inscription", "accueil","consulterProfilLimite" + "connexion", "inscription", "accueil","consulterProfilLimite" ] ); @@ -41,7 +41,7 @@ class FrontControleur } } else if(in_array($action,$actions['Membre'])) { - if (!isset($_SESSION["login"])) { + if (!isset($_SESSION["utilisateur"])) { $dVueErreur[] = 'Veuillez vous connecter'; echo $twig->render('erreur.html', ['dVueErreur' => $dVueErreur]); } else{ diff --git a/php/src/controleur/MembreControleur.php b/php/src/controleur/MembreControleur.php index c0b83ff..151c410 100755 --- a/php/src/controleur/MembreControleur.php +++ b/php/src/controleur/MembreControleur.php @@ -34,7 +34,9 @@ class MembreControleur extends UtilisateurControleur protected function deconnexion() { - //TODO + session_destroy(); + header('Location: index.php?action=accueil'); + exit(); } protected function proposerOffre() diff --git a/php/src/controleur/UtilisateurControleur.php b/php/src/controleur/UtilisateurControleur.php index 7ac47ec..fceb133 100755 --- a/php/src/controleur/UtilisateurControleur.php +++ b/php/src/controleur/UtilisateurControleur.php @@ -17,17 +17,21 @@ class UtilisateurControleur case "accueil": $this->accueil(); break; + case "inscription_success": + $this->inscription_success(); + break; case "connection": $this->connection(); break; case "inscription": $this->inscription(); + break; case "consulterProfilLimite": $this->consulterProfilLimite(); break; default: - $dVueErreur[] ="Action inconnue ou non autorisée"; + $dVueErreur[] ="Action non autorisée"; echo $twig->render("erreur.html",['dVueErreur' => $dVueErreur]); } @@ -36,49 +40,79 @@ class UtilisateurControleur protected function connection() { global $twig; - echo $twig->render('connexion.html', []); + $dVueErreur = []; // Tableau pour stocker les erreurs, le cas échéant + $userModel = new \App\modele\UtilisateurModele(); + + if (isset($_POST['email'], $_POST['password'])) { + $email = \App\config\Validation::nettoyerString($_POST['email']); + $motDePasse = \App\config\Validation::nettoyerString($_POST['password']); + $utilisateur = $userModel->connection($email, $motDePasse); + if ($utilisateur instanceof \App\metier\Alumni) { + $_SESSION['utilisateur'] = $utilisateur; + header('Location: index.php?action=accueil'); + exit(); + } else { + $dVueErreur[] = "L'adresse email ou le mot de passe est incorrect."; + } + } + echo $twig->render('connection.html', ['dVueErreur' => $dVueErreur]); } protected function inscription() { global $twig; $dVueErreur = []; // Tableau pour stocker les erreurs, le cas échéant + $userModel = new \App\modele\UtilisateurModele(); - if (isset($_POST['email'], $_POST['username'], $_POST['password'])) { + if (isset($_POST['firstname'],$_POST['name'], $_POST['email'], $_POST['password'])) { + $nom = \App\config\Validation::nettoyerString($_POST['name']); + $prenom = \App\config\Validation::nettoyerString($_POST['firstname']); $email = \App\config\Validation::nettoyerString($_POST['email']); $motDePasse = \App\config\Validation::nettoyerString($_POST['password']); + $hash = password_hash($motDePasse, PASSWORD_DEFAULT); + // verification que l'email est valide et unique : + if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { + $dVueErreur[] = "L'adresse email n'est pas valide ou est déjà utilisée."; + } else { + $utilisateur = $userModel->getUtilisateurByEmail($email); + if ($utilisateur instanceof \App\metier\Alumni) { + $dVueErreur[] = "L'adresse email est déjà utilisée."; + } + } + $nouvelUtilisateur = $userModel->inscription($prenom,$nom,$email, $hash); - // Validez les données d'inscription, par exemple, vérifiez si l'email est unique - // Vous pouvez également effectuer d'autres validations nécessaires - - $userModel = new \App\modele\UtilisateurModele(); - $nouvelUtilisateur = $userModel->inscription($email, $motDePasse); - - // Si l'inscription a réussi, redirigez l'utilisateur vers une page de confirmation - // Vous pouvez également gérer les erreurs ici en cas d'échec de l'inscription - - if ($nouvelUtilisateur instanceof \App\modele\Alumni) { - // L'inscription a réussi, redirigez l'utilisateur vers une page de confirmation - // par exemple : + if ($nouvelUtilisateur instanceof \App\metier\Alumni) { header('Location: index.php?action=inscription_success'); exit(); } else { - // L'inscription a échoué, ajoutez un message d'erreur $dVueErreur[] = "L'inscription a échoué, veuillez réessayer."; } } - - // Affichez le formulaire d'inscription ou les erreurs le cas échéant echo $twig->render('inscription.html', ['dVueErreur' => $dVueErreur]); } protected function accueil() { global $twig; - echo $twig->render('accueil.html', []); + // Ajout d'un var_dump pour déboguer + if (isset($_SESSION['utilisateur']) && $_SESSION['utilisateur'] instanceof \App\metier\Alumni) { + $prenom = $_SESSION['utilisateur']->getPrenom(); + $nom = $_SESSION['utilisateur']->getNom(); + } + else{ + $prenom = null; + $nom = null; + } + //aller sur la page d'accueil avec le nom et prenom de l'utilisateur + echo $twig->render('accueil.html', ['prenom' => $prenom, 'nom' => $nom]); } + protected function inscription_success() + { + global $twig; + echo $twig->render('inscription_success.html'); + } protected function consulterProfilLimite() { //TODO diff --git a/php/src/gateway/AlumniGateway.php b/php/src/gateway/AlumniGateway.php index 1a00ff4..dbc4dee 100644 --- a/php/src/gateway/AlumniGateway.php +++ b/php/src/gateway/AlumniGateway.php @@ -64,14 +64,21 @@ class AlumniGateway } public function findByEmail(string $email){ - $query='SELECT * FROM Alumni WHERE email=:e'; + $query = 'SELECT Alumni.mail, Alumni.mdp, Alumni.role, Profil.nom, Profil.prenom + FROM Alumni + LEFT JOIN Profil ON Alumni.id = Profil.alumni + WHERE Alumni.mail = :e'; $this->con->executeQuery($query, array( ':e' => array($email, PDO::PARAM_STR), )); - $res=$this->con->getResults(); - return new Alumni($res[0]['mail'],$res[0]['id'],$res[0]['mdp'],$res[0]['role']); + $res = $this->con->getResults(); + if (count($res) == 0) { + return null; + } + return new \App\metier\Alumni($res[0]['mail'], $res[0]['mdp'], $res[0]['role'], $res[0]['nom'], $res[0]['prenom']); } + public function getAll(){ $query='SELECT * FROM Alumni'; $this->con->executeQuery($query); @@ -82,4 +89,14 @@ class AlumniGateway } return $array; } + + public function getID(string $email) + { + $query = 'SELECT id FROM Alumni WHERE mail=:e'; + $this->con->executeQuery($query, array( + ':e' => array($email, PDO::PARAM_STR), + )); + $res = $this->con->getResults(); + return $res[0]['id']; + } } \ No newline at end of file diff --git a/php/src/gateway/ProfilGateway.php b/php/src/gateway/ProfilGateway.php new file mode 100644 index 0000000..abee520 --- /dev/null +++ b/php/src/gateway/ProfilGateway.php @@ -0,0 +1,26 @@ +con = $con; + } + + public function insert(int $alumni,string $nom, string $prenom, string $email) + { + $query = 'INSERT INTO Profil (alumni,nom, prenom,email) VALUES (:alumni,:nom, :prenom,:email)'; + return $this->con->executeQuery($query, array( + ':alumni' => array($alumni, PDO::PARAM_INT), + ':nom' => array($nom, PDO::PARAM_STR), + ':prenom' => array($prenom, PDO::PARAM_STR), + ':email' => array($email, PDO::PARAM_STR) + )); + } +} \ No newline at end of file diff --git a/php/src/modele/Alumni.php b/php/src/metier/Alumni.php similarity index 60% rename from php/src/modele/Alumni.php rename to php/src/metier/Alumni.php index 7084fba..3f25d43 100644 --- a/php/src/modele/Alumni.php +++ b/php/src/metier/Alumni.php @@ -1,6 +1,6 @@ email = $email; $this->motDePasse = $motDePasse; $this->role = $role; + $this->profil = new Profil($nom, $prenom, $email, "","", "", ""); } /** @@ -38,6 +42,10 @@ class Alumni{ return $this->email; } + public function getProfil() : Profil + { + return $this->profil; + } /** * @return string */ @@ -50,4 +58,19 @@ class Alumni{ { return $this->role; } + + public function getPassword(): string + { + return $this->motDePasse; + } + + public function getPrenom() + { + return $this->profil->getPrenom(); + } + + public function getNom() + { + return $this->profil->getNom(); + } } \ No newline at end of file diff --git a/php/src/modele/Article.php b/php/src/metier/Article.php similarity index 97% rename from php/src/modele/Article.php rename to php/src/metier/Article.php index db20f77..1c4ca95 100644 --- a/php/src/modele/Article.php +++ b/php/src/metier/Article.php @@ -1,5 +1,5 @@ id = $id; - $this->alumni = $alumni; - $this->cv = $cv; + $this->nom = $nom; $this->prenom = $prenom; + $this->email = $email; + $this->cv = $cv; $this->linkedinUrl = $linkedinUrl; $this->githubUrl = $githubUrl; $this->portfolioUrl = $portfolioUrl; } - public function getId(): int - { - return $this->id; - } - - public function getAlumni(): Alumni - { - return $this->alumni; - } public function getCv(): string { @@ -100,6 +86,10 @@ class Profil return $this->githubUrl; } + public function getEmail(): string + { + return $this->email; + } public function getPortfolioUrl(): string { return $this->portfolioUrl; diff --git a/php/src/modele/Role.php b/php/src/metier/Role.php similarity index 77% rename from php/src/modele/Role.php rename to php/src/metier/Role.php index a4c8368..56e4de0 100644 --- a/php/src/modele/Role.php +++ b/php/src/metier/Role.php @@ -1,5 +1,5 @@ findByEmail($email); + if ($utilisateur instanceof \App\metier\Alumni) { + // L'utilisateur existe, vérifiez le mot de passe + if (password_verify($mdp, $utilisateur->getPassword())) { + // Le mot de passe est correct, retournez l'utilisateur + session_start(); + return $utilisateur; + } else { + // Le mot de passe est incorrect, renvoyez null + return null; + } + } else { + // L'utilisateur n'existe pas, renvoyez null + return null; + } } /** @@ -31,23 +51,47 @@ class UtilisateurModele * @param string $pseudo * @return \Alumni chargé */ - public function inscription(string $email, string $hashpassword): \App\modele\Alumni + public function inscription(string $prenom, string $nom,string $email, string $hashpassword):? \App\metier\Alumni { $dsn = "mysql:host=localhost;dbname=dbAlica"; $username = "Dev"; $password = "Dev"; - $role = "Utilisateur"; + $role = "Membre"; $con = new \App\gateway\Connection($dsn, $username, $password); $gate = new \App\gateway\AlumniGateway($con); + $profilGate = new \App\gateway\ProfilGateway($con); // Insérez le nouvel utilisateur dans la base de données en utilisant AlumniGateway if ($gate->insert($email, $hashpassword, $role)) { - // L'insertion a réussi, retournez le nouvel utilisateur - $nouvelUtilisateur = new \App\modele\Alumni($email, $hashpassword, $role); - return $nouvelUtilisateur; + $alumni = $gate->getID($email); + if($profilGate->insert($alumni,$nom, $prenom,$email)){ + // L'insertion a réussi, retournez le nouvel utilisateur + $nouvelUtilisateur = new \App\metier\Alumni($email, $hashpassword, $role,$nom,$prenom); + return $nouvelUtilisateur; + } + return null; } else { // L'insertion a échoué, renvoyez un utilisateur vide pour indiquer l'échec - return new \App\modele\Alumni(null, null, null); + return null; + } + } + + public function getUtilisateurByEmail(string $email) + { + $dsn = "mysql:host=localhost;dbname=dbAlica"; + $username = "Dev"; + $password = "Dev"; + + $con = new \App\gateway\Connection($dsn, $username, $password); + $gate = new \App\gateway\AlumniGateway($con); + // Récupérez l'utilisateur avec l'email donné en utilisant AlumniGateway + $utilisateur = $gate->findByEmail($email); + if ($utilisateur instanceof \App\metier\Alumni) { + // L'utilisateur existe, retournez-le + return $utilisateur; + } else { + // L'utilisateur n'existe pas, renvoyez null + return null; } } } diff --git a/php/templates/accueil.html b/php/templates/accueil.html index 1438392..6994331 100755 --- a/php/templates/accueil.html +++ b/php/templates/accueil.html @@ -9,16 +9,33 @@ +
+ {% include 'menu.html' %} +

Accueil

+ +

{% if prenom and nom %} + Bienvenue, {{ prenom }} {{ nom }}! + {% else %} + Bienvenue, invité! + {% endif %}

Vous êtes sur la page d'accueil

-

Vous pouvez vous connecter ou vous inscrire

-

Vous pouvez aussi consulter les articles

-

Vous pouvez aussi consulter les annonces

-

Connexion :

-
- -
+ {% if dVueErreur is not empty %} +
+
+
+
    + {% for erreur in dVueErreur %} +
  • {{ erreur }}
  • + {% endfor %} +
+
+
+
+ {% endif %} + + diff --git a/php/templates/connexion.html b/php/templates/connection.html similarity index 79% rename from php/templates/connexion.html rename to php/templates/connection.html index 2dd061a..20bc8d3 100755 --- a/php/templates/connexion.html +++ b/php/templates/connection.html @@ -16,7 +16,7 @@
- +
@@ -35,6 +35,7 @@
+
@@ -42,6 +43,19 @@
+ {% if dVueErreur is not empty %} +
+
+
+
    + {% for erreur in dVueErreur %} +
  • {{ erreur }}
  • + {% endfor %} +
+
+
+
+ {% endif %} diff --git a/php/templates/inscription.html b/php/templates/inscription.html index b86bcea..a22ee4b 100755 --- a/php/templates/inscription.html +++ b/php/templates/inscription.html @@ -11,12 +11,25 @@

S'inscrire

- Identifiant + Prénom :
- + +
+
+
+ Nom : +
+
+ +
+
@@ -25,7 +38,9 @@
- +
@@ -34,7 +49,9 @@
- +
@@ -50,6 +67,19 @@
+ {% if dVueErreur is not empty %} +
+
+
+
    + {% for erreur in dVueErreur %} +
  • {{ erreur }}
  • + {% endfor %} +
+
+
+
+ {% endif %} diff --git a/php/templates/inscription_success.html b/php/templates/inscription_success.html new file mode 100644 index 0000000..3e1f2b3 --- /dev/null +++ b/php/templates/inscription_success.html @@ -0,0 +1,24 @@ + + + + + Success + + + +

Inscription effectuée avec succès, vous pouvez désormais vous connecter

+

Vous allez être redirigé vers la page de connexion dans 5 secondes

+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/php/templates/menu.html b/php/templates/menu.html new file mode 100644 index 0000000..9788900 --- /dev/null +++ b/php/templates/menu.html @@ -0,0 +1,37 @@ + + + + + + + + \ No newline at end of file