From d3490d5400e537fddd27d28e95d1583c58c77a12 Mon Sep 17 00:00:00 2001 From: Adrien <adrien.fryson@outlook.com> Date: Sat, 15 Feb 2025 16:00:16 +0100 Subject: [PATCH] accueil, vue lister les fils de discussion et affichage d'un fil de discussion --- sae/WEB-INF/src/controleur/Accueil.java | 23 ++++++ sae/WEB-INF/src/controleur/Fil.java | 19 +++++ sae/WEB-INF/src/controleur/ListerFil.java | 19 +++++ sae/WEB-INF/src/controleur/Login.java | 1 + sae/WEB-INF/src/controleur/Logout.java | 20 +++++ sae/WEB-INF/src/modele/MessageDao.java | 19 ++++- sae/WEB-INF/vue/accueil.jsp | 45 +++++++++++ sae/WEB-INF/vue/fil.jsp | 97 +++++++++++++++++++++++ sae/WEB-INF/vue/listerFil.jsp | 55 +++++++++++++ 9 files changed, 297 insertions(+), 1 deletion(-) create mode 100644 sae/WEB-INF/src/controleur/Accueil.java create mode 100644 sae/WEB-INF/src/controleur/Fil.java create mode 100644 sae/WEB-INF/src/controleur/ListerFil.java create mode 100644 sae/WEB-INF/src/controleur/Logout.java create mode 100644 sae/WEB-INF/vue/accueil.jsp create mode 100644 sae/WEB-INF/vue/fil.jsp create mode 100644 sae/WEB-INF/vue/listerFil.jsp diff --git a/sae/WEB-INF/src/controleur/Accueil.java b/sae/WEB-INF/src/controleur/Accueil.java new file mode 100644 index 0000000..532f6c3 --- /dev/null +++ b/sae/WEB-INF/src/controleur/Accueil.java @@ -0,0 +1,23 @@ +package controleur; + +import java.io.IOException; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; + +@WebServlet("/accueil") +public class Accueil extends HttpServlet { + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + HttpSession session = request.getSession(false); + if (session != null && session.getAttribute("email") != null) { + request.getRequestDispatcher("/WEB-INF/vue/accueil.jsp").forward(request, response); + } else { + System.out.println("Accès refusé"); + response.sendRedirect(request.getContextPath() + "/login"); + } + } +} \ No newline at end of file diff --git a/sae/WEB-INF/src/controleur/Fil.java b/sae/WEB-INF/src/controleur/Fil.java new file mode 100644 index 0000000..7ae208e --- /dev/null +++ b/sae/WEB-INF/src/controleur/Fil.java @@ -0,0 +1,19 @@ +package controleur; + +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import java.io.IOException; + +@WebServlet("/fil") +public class Fil extends HttpServlet { + public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + // si la personne n'est pas abonnée à ce fil, on la redirige vers la page de liste des fils + // TODO + int id = Integer.parseInt(req.getParameter("id")); + req.setAttribute("id", id); + req.getRequestDispatcher("/WEB-INF/vue/fil.jsp").forward(req, res); + } +} diff --git a/sae/WEB-INF/src/controleur/ListerFil.java b/sae/WEB-INF/src/controleur/ListerFil.java new file mode 100644 index 0000000..e4564ba --- /dev/null +++ b/sae/WEB-INF/src/controleur/ListerFil.java @@ -0,0 +1,19 @@ +package controleur; + +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import java.io.IOException; + +@WebServlet("/listerFil") +public class ListerFil extends HttpServlet { + public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + if (req.getSession(false) == null || req.getSession().getAttribute("email") == null) { + res.sendRedirect(req.getContextPath() + "/login"); + return; + } + req.getRequestDispatcher("/WEB-INF/vue/listerFil.jsp").forward(req, res); + } +} diff --git a/sae/WEB-INF/src/controleur/Login.java b/sae/WEB-INF/src/controleur/Login.java index 9a62059..e79e718 100644 --- a/sae/WEB-INF/src/controleur/Login.java +++ b/sae/WEB-INF/src/controleur/Login.java @@ -4,6 +4,7 @@ import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; import modele.UtilisateurDao; import jakarta.servlet.ServletException; import java.io.IOException; diff --git a/sae/WEB-INF/src/controleur/Logout.java b/sae/WEB-INF/src/controleur/Logout.java new file mode 100644 index 0000000..ad2c43f --- /dev/null +++ b/sae/WEB-INF/src/controleur/Logout.java @@ -0,0 +1,20 @@ +package controleur; + +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpSession; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import java.io.IOException; + +@WebServlet("/logout") +public class Logout extends HttpServlet { + public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + HttpSession session = req.getSession(false); + if (session != null) { + session.invalidate(); + } + res.sendRedirect(req.getContextPath() + "/login"); + } +} diff --git a/sae/WEB-INF/src/modele/MessageDao.java b/sae/WEB-INF/src/modele/MessageDao.java index 8bc2f9e..97006a6 100644 --- a/sae/WEB-INF/src/modele/MessageDao.java +++ b/sae/WEB-INF/src/modele/MessageDao.java @@ -49,7 +49,7 @@ public class MessageDao { return messages; } - public List<Message> findMessages(int idFil) { + public List<Message> findByFil(int idFil) { List<Message> messages = new ArrayList<>(); try(Connection con = DS.instance.getConnection()) { PreparedStatement ps = con.prepareStatement("SELECT * FROM message WHERE filId = ?"); @@ -69,4 +69,21 @@ public class MessageDao { } return messages; } + + public String findUserName(String email) { + String userName = ""; + try(Connection con = DS.instance.getConnection()) { + PreparedStatement ps = con.prepareStatement("SELECT nom FROM utilisateur WHERE email = ?"); + ps.setString(1, email); + ResultSet rs = ps.executeQuery(); + if (rs.next()) { + userName = rs.getString("nom"); + } else { + System.out.println("Utilisateur inexistant"); + } + } catch (Exception e) { + System.out.println(e.getMessage()); + } + return userName; + } } diff --git a/sae/WEB-INF/vue/accueil.jsp b/sae/WEB-INF/vue/accueil.jsp new file mode 100644 index 0000000..e9df037 --- /dev/null +++ b/sae/WEB-INF/vue/accueil.jsp @@ -0,0 +1,45 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> + +<!DOCTYPE html> +<html lang="fr"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>CampusTalk - Accueil</title> + <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet"> + <style> + body { + background-color: #f8f9fa; + } + .welcome-container { + max-width: 800px; + margin: 50px auto; + padding: 20px; + background-color: #ffffff; + border-radius: 10px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + } + .welcome-container h2 { + margin-bottom: 20px; + font-weight: bold; + } + </style> +</head> +<body> + <div class="welcome-container"> + <h2 class="text-center">Bienvenue sur CampusTalk</h2> + <p class="text-center">Bonjour, <%= session.getAttribute("email") %> !</p> + <p class="text-center">Vous êtes connecté en tant que <%= session.getAttribute("email") %></p> + <div class="text-center mt-4"> + <a href="<%= request.getContextPath() %>/logout" class="btn btn-danger">Se déconnecter</a> + </div> + </div> + <button type="button" class="btn btn-primary mt-4 mx-auto d-block"> + <a href="<%= request.getContextPath() %>/listerFil" style="color: white; text-decoration: none;">Voir les fils de discussion</a> + </button> + + <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> + <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"></script> + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/sae/WEB-INF/vue/fil.jsp b/sae/WEB-INF/vue/fil.jsp new file mode 100644 index 0000000..e708b76 --- /dev/null +++ b/sae/WEB-INF/vue/fil.jsp @@ -0,0 +1,97 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ page import="modele.FilDeDiscussion" %> +<%@ page import="modele.FilDeDiscussionDAO" %> +<%@ page import="modele.Message" %> +<%@ page import="modele.MessageDao" %> +<%@ page import="java.util.List" %> + +<!DOCTYPE html> +<html lang="fr"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>CampusTalk - Fil de Discussion</title> + <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet"> + <style> + body { + background-color: #f8f9fa; + } + .thread-container { + max-width: 800px; + margin: 50px auto; + padding: 20px; + background-color: #ffffff; + border-radius: 10px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + } + .thread-container h2 { + margin-bottom: 20px; + font-weight: bold; + } + .message-item { + display: flex; + align-items: flex-start; + padding: 10px; + border-bottom: 1px solid #ddd; + } + .message-item:last-child { + border-bottom: none; + } + .avatar { + width: 50px; + height: 50px; + border-radius: 50%; + margin-right: 15px; + } + .message-content { + background-color: #e9ecef; + padding: 10px; + border-radius: 10px; + max-width: 600px; + } + .message-content h4 { + margin: 0; + font-size: 1.1em; + font-weight: bold; + } + .message-content p { + margin: 5px 0; + } + .message-date { + font-size: 0.8em; + color: #6c757d; + } + </style> +</head> +<body> + <div class="text-center mt-4"> + <a href="<%= request.getContextPath() %>/listerFil" class="btn btn-primary">Retour</a> + </div> + + <% + int id = Integer.parseInt(request.getParameter("id")); + FilDeDiscussionDAO fddao = new FilDeDiscussionDAO(); + FilDeDiscussion fil = fddao.findById(id); + MessageDao mdao = new MessageDao(); + List<Message> messages = mdao.findByFil(id); + %> + + <div class="thread-container"> + <h2 class="text-center"><%= fil.getNom() %></h2> + <% for (Message m : messages) { %> + <div class="message-item"> + <!-- potentiellement une pdp --> + <div class="message-content"> + <h4><%= mdao.findUserName(m.getAuteurEmail()) %></h4> + <p class="message-date"><%= m.getDatePublication() %></p> + <p><%= m.getContenu() %></p> + </div> + </div> + <% } %> + </div> + + <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> + <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"></script> + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script> +</body> +</html> \ No newline at end of file diff --git a/sae/WEB-INF/vue/listerFil.jsp b/sae/WEB-INF/vue/listerFil.jsp new file mode 100644 index 0000000..79f64af --- /dev/null +++ b/sae/WEB-INF/vue/listerFil.jsp @@ -0,0 +1,55 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ page import="modele.FilDeDiscussion" %> +<%@ page import="modele.FilDeDiscussionDAO" %> + +<!DOCTYPE html> +<html lang="fr"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>CampusTalk - Fils de Discussion</title> + <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet"> + <style> + body { + background-color: #f8f9fa; + } + .thread-container { + max-width: 800px; + margin: 50px auto; + padding: 20px; + background-color: #ffffff; + border-radius: 10px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + } + .thread-container h2 { + margin-bottom: 20px; + font-weight: bold; + } + .thread-item { + padding: 10px; + border-bottom: 1px solid #ddd; + } + .thread-item:last-child { + border-bottom: none; + } + </style> +</head> +<body> + <div class="thread-container"> + <h2 class="text-center">Fils de Discussion</h2> + <% + FilDeDiscussionDAO fddao = new FilDeDiscussionDAO(); + for (FilDeDiscussion f : fddao.findAll()) { + %> + <div class="thread-item"> + <h4><a href="<%= request.getContextPath() %>/fil?id=<%= f.getId() %>"><%= f.getNom() %></a></h4> + <!-- potentiellement mettre une description --> + </div> + <% } %> + </div> + + <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> + <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"></script> + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script> +</body> +</html> \ No newline at end of file -- GitLab