From 51f2d7a92c5db066e3d0d8ef9d91e61925104bb8 Mon Sep 17 00:00:00 2001 From: Adrien Fryson <adrien.fryson@outlook.com> Date: Sun, 16 Mar 2025 21:54:43 +0100 Subject: [PATCH] =?UTF-8?q?ajout=20fils=20de=20discussion=20sur=20la=20sid?= =?UTF-8?q?ebar,=20m=C3=A9t=C3=A9o=20dans=20la=20page=20d'accueil=20(aucun?= =?UTF-8?q?e=20utilit=C3=A9=20mais=20bon)=20et=20d=C3=A9but=20de=20la=20do?= =?UTF-8?q?c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- documentation.md | 183 +++++++++++++++++++++++ sae/WEB-INF/src/controleur/CreerFil.java | 4 + sae/WEB-INF/src/controleur/Like.java | 3 +- sae/WEB-INF/vue/accueil.jsp | 63 ++++---- sae/WEB-INF/vue/creerFil.jsp | 23 ++- sae/WEB-INF/vue/fil.jsp | 22 ++- sae/WEB-INF/vue/listerFil.jsp | 22 ++- sae/WEB-INF/vue/login.jsp | 9 +- sae/WEB-INF/vue/menuFil.jsp | 26 +++- sae/WEB-INF/vue/parametre.jsp | 22 ++- sae/WEB-INF/vue/register.jsp | 9 +- 11 files changed, 337 insertions(+), 49 deletions(-) create mode 100644 documentation.md diff --git a/documentation.md b/documentation.md new file mode 100644 index 0000000..9d969d6 --- /dev/null +++ b/documentation.md @@ -0,0 +1,183 @@ +# Documentation de CampusTalk + +## Description Générale + +CampusTalk est une application WEB de réseau social permettant aux utilisateurs de créer des fils de discussion, d'y poster des messages textuels, et de lire les messages des autres abonnés au même fil. L'application est développée en JEE (jakarta) avec une architecture MVC, et elle est conçue pour être responsive, fonctionnant aussi bien sur ordinateur que sur smartphone. + +## MCD + +A FAIRE + +## MLD + +Utilisateur(email, nom, motDePasse, dateInscription) + +FilDeDiscussion(id, nom, dateCreation, createurEmail, description, logo) + +Message(id, contenu, datePublication, filId, auteurEmail, fileName, likeCount) + +Abonnement(utilisateurEmail, filId, dateAbonnement) + +## Requêtes SQL Pertinentes + +Lister tous les utilisateurs +```sql +SELECT * FROM Utilisateur; +``` +Lister tous les fils de discussion avec le nom du créateur +```sql +SELECT f.id, f.nom, u.nom AS nomCreateur +FROM FilDeDiscussion f +JOIN Utilisateur u ON f.createurEmail = u.email; +``` +Lister tous les messages d'un fil de discussion spécifique avec le nom de l'auteur +```sql +SELECT m.contenu, u.nom AS nomAuteur, m.datePublication +FROM Message m +JOIN Utilisateur u ON m.auteurEmail = u.email +WHERE m.filId = 1 +ORDER BY m.datePublication; +``` +Lister tous les abonnements d'un utilisateur spécifique +```sql +SELECT f.nom AS nomFil, a.dateAbonnement +FROM Abonnement a +JOIN FilDeDiscussion f ON a.filId = f.id +WHERE a.utilisateurEmail = 'utilisateur1@exemple.com'; +``` +Lister les fils de discussion auxquels un utilisateur n'est pas abonné +```sql +SELECT f.id, f.nom +FROM FilDeDiscussion f +LEFT JOIN Abonnement a ON f.id = a.filId AND a.utilisateurEmail = 'utilisateur1@exemple.com' +WHERE a.utilisateurEmail IS NULL; +``` +Compter le nombre de messages par fil de discussion +```sql +SELECT f.nom AS nomFil, COUNT(m.id) AS nombreMessages +FROM FilDeDiscussion f +LEFT JOIN Message m ON f.id = m.filId +GROUP BY f.nom; +``` +Trouver les utilisateurs qui ont publié des messages dans un fil spécifique +```sql +SELECT DISTINCT u.nom, u.email +FROM Utilisateur u +JOIN Message m ON u.email = m.auteurEmail +WHERE m.filId = 1; +``` +Lister les 5 derniers messages publiés dans un fil de discussion +```sql +SELECT m.contenu, u.nom AS nomAuteur, m.datePublication +FROM Message m +JOIN Utilisateur u ON m.auteurEmail = u.email +WHERE m.filId = 1 +ORDER BY m.datePublication DESC +LIMIT 5; +``` +Compter le nombre d'abonnés par fil de discussion +```sql +SELECT f.nom AS nomFil, COUNT(a.utilisateurEmail) AS nombreAbonnes +FROM FilDeDiscussion f +LEFT JOIN Abonnement a ON f.id = a.filId +GROUP BY f.nom; +``` +Lister les utilisateurs qui ne sont abonnés à aucun fil de discussion +```sql +SELECT u.email, u.nom +FROM Utilisateur u +LEFT JOIN Abonnement a ON u.email = a.utilisateurEmail +WHERE a.utilisateurEmail IS NULL; +``` + +## Arborescence de l'application + +/CampusTalk +|-- /images +| |-- default.png +| |-- logo.png +| +|-- /uploads +| |-- images_utilisateurs.jpg +| +|-- /WEB-INF +| |-- /classes +| | |-- /controleur +| | | |-- Accueil.java +| | | |-- CreerFil.java +| | | |-- DeleteFil.java +| | | |-- DeleteMessage.java +| | | |-- EnvoyerMessage.java +| | | |-- Fil.java +| | | |-- GetFils.java +| | | |-- Like.java +| | | |-- ListerFil.java +| | | |-- Login.java +| | | |-- Logout.java +| | | |-- MenuFil.java +| | | |-- ModifierFil.java +| | | |-- Parametre.java +| | | |-- Registrer.java +| | | |-- SuivreFil.java +| | |-- /modele +| | | |-- Abonnement.java +| | | |-- AbonnementDAO.java +| | | |-- DS.java +| | | |-- FilDeDiscussion.java +| | | |-- FilDeDiscussionDAO.java +| | | |-- Message.java +| | | |-- MessageDAO.java +| | | |-- Utilisateur.java +| | | |-- UtilisateurDAO.java +| | |-- /vue +| | | |-- accueil.jsp +| | | |-- creerFil.jsp +| | | |-- fil.jsp +| | | |-- listerFil.jsp +| | | |-- login.jsp +| | | |-- menuFil.jsp +| | | |-- parametre.jsp +| | | |-- register.jsp +| +|-- /META-INF +| |-- context.xml + +## Liste des entrées avec leur fonctionnalité + +**A chaque fois, sauf dans login et register, si l'utilisateur n'est pas connecté (email dans la session), alors il est redirigé vers la page de login** + +Accueil : Redirige vers la page d'accueil en verifiant que l'utilisateur est log + +CreerFil : Permet de créer un fil de discussion, on peut mettre un logo au fil + +DeleteFil : Permet au créateur d'un fil de discussion de le supprimer + +DeleteMessage : Permet à l'auteur d'un message de le supprimer + +EnvoyerMessage : Permet d'envoyer un message, on peut joindre une image + +Fil : Redirige vers un fil de discussion (si l'utilisateur y est abonné) + +GetFils : Permet de récuperer la liste des fils de discussion où l'utilisateur est abonné + +Like : Permet de like/unlike un message + +ListerFil : Redirige vers la page pour lister les fils auxquels l'utilisateur n'est pas encore abonné + +Login : Dans doGet(), redirige vers la page login.jsp pour permettre à l'utilisateur de se connecter. Dans doPost(), authentifie l'utilisateur en vérifiant les informations d'identification fournies + +Logout : Deconnecte l'utilisateur actuellement authentifié et redirige vers la page de login + +MenuFil : Redirige vers la page menuFil.jsp pour modifier les informations sur un fil de discussion + +ModifierFil : Rermet de modifier les informations d'un fil de discussion + +Parametre : Permet de changer les parametres du compte de l'utilisateur + +Registrer : Dans doGet(), redirige vers la page register.jsp pour permettre à un nouvel utilisateur de s'inscrire. Dans doPost(), enregistre un nouvel utilisateur après vérification que l'email est unique + +SuivreFil : Permet de suivre un fil de discussion pour y avoir accès + +## Points techniques difficiles + +... \ No newline at end of file diff --git a/sae/WEB-INF/src/controleur/CreerFil.java b/sae/WEB-INF/src/controleur/CreerFil.java index 55a326b..45e88ce 100644 --- a/sae/WEB-INF/src/controleur/CreerFil.java +++ b/sae/WEB-INF/src/controleur/CreerFil.java @@ -37,6 +37,10 @@ public class CreerFil extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + if (req.getSession(false) == null || req.getSession().getAttribute("email") == null) { + res.sendRedirect(req.getContextPath() + "/login"); + return; + } FilDeDiscussionDAO f = new FilDeDiscussionDAO(); String nom = StringEscapeUtils.escapeHtml4(req.getParameter("nom")); String createuremail = StringEscapeUtils.escapeHtml4(req.getParameter("createuremail")); diff --git a/sae/WEB-INF/src/controleur/Like.java b/sae/WEB-INF/src/controleur/Like.java index d268a99..113c195 100644 --- a/sae/WEB-INF/src/controleur/Like.java +++ b/sae/WEB-INF/src/controleur/Like.java @@ -15,8 +15,7 @@ public class Like extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { - String userEmail = (String) req.getSession().getAttribute("email"); - if (userEmail == null) { + if (req.getSession(false) == null || req.getSession().getAttribute("email") == null) { res.sendRedirect(req.getContextPath() + "/login"); return; } diff --git a/sae/WEB-INF/vue/accueil.jsp b/sae/WEB-INF/vue/accueil.jsp index a8abe5a..2208ef8 100644 --- a/sae/WEB-INF/vue/accueil.jsp +++ b/sae/WEB-INF/vue/accueil.jsp @@ -16,6 +16,19 @@ <title>CampusTalk - Accueil</title> <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet"> <link rel="shortcut icon" href="<%= request.getContextPath() %>/images/logo.png"> + <script> + async function fetchWeather() { + const response = await fetch('https://api.open-meteo.com/v1/forecast?latitude=50.6292&longitude=3.0573¤t_weather=true'); + const data = await response.json(); + document.querySelector('#weather').innerHTML = ` + <h3 class="text-xl font-bold">Météo à Lille</h3> + <p>Température: \${data.current_weather.temperature}°C</p> + <p>Vent: \${data.current_weather.windspeed} km/h \${data.current_weather.winddirection} %</p> + `; + } + + window.onload = fetchWeather; + </script> </head> <body class="bg-gray-900 text-white flex flex-col md:flex-row"> <aside class="w-full md:w-64 bg-gray-800 text-white h-auto md:h-screen"> @@ -28,8 +41,23 @@ <a href="<%= request.getContextPath() %>/listerFil" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Autres Fils de Discussion</a> <a href="<%= request.getContextPath() %>/creerFil" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Créer un Fil</a> <a href="<%= request.getContextPath() %>/parametre" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Paramètres</a> - <a href="<%= request.getContextPath() %>/logout" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-red-700">Se déconnecter</a> + + <h3 class="mt-4 px-4 text-lg font-semibold">Vos abonnements</h3> + <% + String email = (String) session.getAttribute("email"); + AbonnementDao adao = new AbonnementDao(); + List<Abonnement> abonnements = adao.findAbonnements(email); + FilDeDiscussionDAO fddao = new FilDeDiscussionDAO(); + for (Abonnement abonnement : abonnements) { + FilDeDiscussion fil = fddao.findById(abonnement.getIdFil()); + %> + <a href="<%= request.getContextPath() %>/fil?id=<%= fil.getId() %>" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700 flex items-center"> + <img src="<%= request.getContextPath() %>/images/<%= fil.getLogo() %>" alt="Logo" class="w-8 h-8 mr-2"> + <span><%= fil.getNom() %></span> + </a> + <% } %> </nav> + <a href="<%= request.getContextPath() %>/logout" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-red-700">Se déconnecter</a> </aside> <div class="flex-1 p-6"> @@ -41,40 +69,17 @@ <% } %> <% - UtilisateurDao udao=new UtilisateurDao(); String email=(String) session.getAttribute("email"); - String username=udao.findUtilisateur(email).getNom(); AbonnementDao adao=new AbonnementDao(); - List<Abonnement> abonnements = adao.findAbonnements(email); - FilDeDiscussionDAO fdao = new FilDeDiscussionDAO(); + UtilisateurDao udao=new UtilisateurDao(); + String username=udao.findUtilisateur(email).getNom(); %> <div class="max-w-2xl mx-auto mt-12 p-6 bg-gray-800 rounded-lg shadow-md"> - <h2 class="text-2xl font-bold mb-4">Bienvenue sur CampusTalk</h2> + <h2 class="text-2xl font-bold mb-4">Bienvenue sur CampusTalk !</h2> <p class="mb-4">Bonjour, <%= username %> !</p> <p class="mb-4">Vous êtes connecté en tant que <%= email %></p> </div> - <div class="max-w-2xl mx-auto mt-8 p-6 bg-gray-800 rounded-lg shadow-md"> - <h3 class="text-xl font-bold mb-4">Vos abonnements</h3> - <% - Set<Integer> abonnementsIds = new HashSet<>(); - for (Abonnement abonnement : abonnements) { - abonnementsIds.add(abonnement.getIdFil()); - } - FilDeDiscussionDAO fddao = new FilDeDiscussionDAO(); - for (FilDeDiscussion f : fddao.findAll()) { - if (abonnementsIds.contains(f.getId())) { - %> - <div class="mb-4 p-4 bg-gray-700 rounded-lg shadow-md hover:bg-gray-600"> - <a href="<%= request.getContextPath() %>/fil?id=<%= f.getId() %>" class="block"> - <img src="<%= request.getContextPath() %>/images/<%= f.getLogo() %>" alt="Logo" class="w-16 h-16 mx-auto"> - <h4 class="font-bold text-lg"><%= f.getNom() %></h4> - <% if (f.getDescription() != null) { %> - <p class="text-gray-400"><%= f.getDescription() %></p> - <% } %> - </div> - <% - } - } - %> + <div id="weather" class="max-w-2xl mx-auto mt-12 p-6 bg-gray-800 rounded-lg shadow-md text-center"> + <h3 class="text-xl font-bold">Chargement de la météo...</h3> </div> </div> </body> diff --git a/sae/WEB-INF/vue/creerFil.jsp b/sae/WEB-INF/vue/creerFil.jsp index 7a2709e..7a6faf0 100644 --- a/sae/WEB-INF/vue/creerFil.jsp +++ b/sae/WEB-INF/vue/creerFil.jsp @@ -1,4 +1,9 @@ <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> +<%@ page import="modele.AbonnementDao" %> +<%@ page import="modele.FilDeDiscussion" %> +<%@ page import="modele.FilDeDiscussionDAO" %> +<%@ page import="modele.Abonnement" %> +<%@ page import="java.util.List" %> <!DOCTYPE html> <html lang="fr"> @@ -20,8 +25,24 @@ <a href="<%= request.getContextPath() %>/listerFil" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Autres Fils de Discussion</a> <a href="<%= request.getContextPath() %>/creerFil" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Créer un Fil</a> <a href="<%= request.getContextPath() %>/parametre" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Paramètres</a> - <a href="<%= request.getContextPath() %>/logout" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-red-700">Se déconnecter</a> + + <h3 class="mt-4 px-4 text-lg font-semibold">Vos abonnements</h3> + <% + String email = (String) session.getAttribute("email"); + AbonnementDao adao = new AbonnementDao(); + List<Abonnement> abonnements = adao.findAbonnements(email); + FilDeDiscussionDAO fddao = new FilDeDiscussionDAO(); + for (Abonnement abonnement : abonnements) { + FilDeDiscussion fil = fddao.findById(abonnement.getIdFil()); + %> + <a href="<%= request.getContextPath() %>/fil?id=<%= fil.getId() %>" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700 flex items-center"> + <img src="<%= request.getContextPath() %>/images/<%= fil.getLogo() %>" alt="Logo" class="w-8 h-8 mr-2"> + <span><%= fil.getNom() %></span> + </a> + <% } %> </nav> + + <a href="<%= request.getContextPath() %>/logout" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-red-700">Se déconnecter</a> </aside> <div class="flex-1 p-6"> diff --git a/sae/WEB-INF/vue/fil.jsp b/sae/WEB-INF/vue/fil.jsp index 9c21c56..9bd4418 100644 --- a/sae/WEB-INF/vue/fil.jsp +++ b/sae/WEB-INF/vue/fil.jsp @@ -3,6 +3,8 @@ <%@ page import="modele.FilDeDiscussionDAO" %> <%@ page import="modele.Message" %> <%@ page import="modele.MessageDao" %> +<%@ page import="modele.AbonnementDao" %> +<%@ page import="modele.Abonnement" %> <%@ page import="java.util.List" %> <%@ page import="java.time.LocalDateTime" %> <%@ page import="java.time.format.DateTimeFormatter" %> @@ -41,17 +43,31 @@ <a href="<%= request.getContextPath() %>/listerFil" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Autres Fils de Discussion</a> <a href="<%= request.getContextPath() %>/creerFil" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Créer un Fil</a> <a href="<%= request.getContextPath() %>/parametre" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Paramètres</a> - <a href="<%= request.getContextPath() %>/logout" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-red-700">Se déconnecter</a> + + <h3 class="mt-4 px-4 text-lg font-semibold">Vos abonnements</h3> + <% + String email = (String) session.getAttribute("email"); + AbonnementDao adao = new AbonnementDao(); + List<Abonnement> abonnements = adao.findAbonnements(email); + FilDeDiscussionDAO fddao = new FilDeDiscussionDAO(); + for (Abonnement abonnement : abonnements) { + FilDeDiscussion filAbonne = fddao.findById(abonnement.getIdFil()); + %> + <a href="<%= request.getContextPath() %>/fil?id=<%= filAbonne.getId() %>" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700 flex items-center"> + <img src="<%= request.getContextPath() %>/images/<%= filAbonne.getLogo() %>" alt="Logo" class="w-8 h-8 mr-2"> + <span><%= filAbonne.getNom() %></span> + </a> + <% } %> </nav> + + <a href="<%= request.getContextPath() %>/logout" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-red-700">Se déconnecter</a> </aside> <div class="flex-1 p-6 flex flex-col"> <% - String email = (String) session.getAttribute("email"); int id = Integer.parseInt(request.getParameter("id")); session.setAttribute("filId", id); - FilDeDiscussionDAO fddao = new FilDeDiscussionDAO(); FilDeDiscussion fil = fddao.findById(id); MessageDao mdao = new MessageDao(); List<Message> messages = mdao.findByFil(id); diff --git a/sae/WEB-INF/vue/listerFil.jsp b/sae/WEB-INF/vue/listerFil.jsp index cb5bb28..54445fc 100644 --- a/sae/WEB-INF/vue/listerFil.jsp +++ b/sae/WEB-INF/vue/listerFil.jsp @@ -27,8 +27,24 @@ <a href="<%= request.getContextPath() %>/listerFil" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Autres Fils de Discussion</a> <a href="<%= request.getContextPath() %>/creerFil" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Créer un Fil</a> <a href="<%= request.getContextPath() %>/parametre" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Paramètres</a> - <a href="<%= request.getContextPath() %>/logout" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-red-700">Se déconnecter</a> + + <h3 class="mt-4 px-4 text-lg font-semibold">Vos abonnements</h3> + <% + String email = (String) session.getAttribute("email"); + AbonnementDao adao = new AbonnementDao(); + List<Abonnement> abonnements = adao.findAbonnements(email); + FilDeDiscussionDAO fddao = new FilDeDiscussionDAO(); + for (Abonnement abonnement : abonnements) { + FilDeDiscussion fil = fddao.findById(abonnement.getIdFil()); + %> + <a href="<%= request.getContextPath() %>/fil?id=<%= fil.getId() %>" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700 flex items-center"> + <img src="<%= request.getContextPath() %>/images/<%= fil.getLogo() %>" alt="Logo" class="w-8 h-8 mr-2"> + <span><%= fil.getNom() %></span> + </a> + <% } %> </nav> + + <a href="<%= request.getContextPath() %>/logout" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-red-700">Se déconnecter</a> </aside> <div class="flex-1 p-6"> @@ -37,15 +53,11 @@ <h2 class="text-2xl font-bold mb-4 text-center">Fils de Discussion</h2> <p class="text-gray-400 mb-4 text-center">(auxquels vous n'êtes pas abonné)</p> <% - String email = (String) session.getAttribute("email"); - AbonnementDao adao = new AbonnementDao(); - List<Abonnement> abonnements = adao.findAbonnements(email); Set<Integer> abonnementsIds = new HashSet<>(); for (Abonnement abonnement : abonnements) { abonnementsIds.add(abonnement.getIdFil()); } - FilDeDiscussionDAO fddao = new FilDeDiscussionDAO(); for (FilDeDiscussion f : fddao.findAll()) { if (!abonnementsIds.contains(f.getId())) { %> diff --git a/sae/WEB-INF/vue/login.jsp b/sae/WEB-INF/vue/login.jsp index 02fc0e2..ab796dd 100644 --- a/sae/WEB-INF/vue/login.jsp +++ b/sae/WEB-INF/vue/login.jsp @@ -1,4 +1,9 @@ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ page import="modele.AbonnementDao" %> +<%@ page import="modele.FilDeDiscussion" %> +<%@ page import="modele.FilDeDiscussionDAO" %> +<%@ page import="modele.Abonnement" %> +<%@ page import="java.util.List" %> <!DOCTYPE html> <html lang="fr"> @@ -15,13 +20,13 @@ <img src="<%= request.getContextPath() %>/images/logo.png" alt="CampusTalk Logo" class="w-16 h-16 mx-auto"> <h1 class="text-2xl font-bold mt-4">CampusTalk</h1> </div> - <!-- <nav class="mt-4"> + <nav class="mt-4"> <a href="<%= request.getContextPath() %>/accueil" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Accueil</a> <a href="<%= request.getContextPath() %>/listerFil" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Autres Fils de Discussion</a> <a href="<%= request.getContextPath() %>/creerFil" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Créer un Fil</a> <a href="<%= request.getContextPath() %>/parametre" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Paramètres</a> <a href="<%= request.getContextPath() %>/logout" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-red-700">Se déconnecter</a> - </nav> --> + </nav> </aside> <div class="flex-1 p-6"> <div class="max-w-md mx-auto mt-12 p-6 bg-gray-800 rounded-lg shadow-md"> diff --git a/sae/WEB-INF/vue/menuFil.jsp b/sae/WEB-INF/vue/menuFil.jsp index fbb3bff..4951eab 100644 --- a/sae/WEB-INF/vue/menuFil.jsp +++ b/sae/WEB-INF/vue/menuFil.jsp @@ -1,6 +1,9 @@ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="modele.FilDeDiscussion" %> <%@ page import="modele.FilDeDiscussionDAO" %> +<%@ page import="modele.AbonnementDao" %> +<%@ page import="modele.Abonnement" %> +<%@ page import="java.util.List" %> <% int id = Integer.parseInt(session.getAttribute("filId").toString()); @@ -17,19 +20,34 @@ <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet"> <link rel="shortcut icon" href="<%= request.getContextPath() %>/images/logo.png"> </head> -<body class="bg-gray-900 text-white flex"> - <aside class="w-64 bg-gray-800 text-white h-screen flex flex-col fixed"> +<body class="bg-gray-900 text-white flex flex-col md:flex-row"> + <aside class="w-full md:w-64 bg-gray-800 text-white h-auto md:h-screen"> <div class="p-4 text-center"> <img src="<%= request.getContextPath() %>/images/logo.png" alt="CampusTalk Logo" class="w-16 h-16 mx-auto"> <h1 class="text-2xl font-bold mt-4">CampusTalk</h1> </div> - <nav class="mt-4 flex-grow"> + <nav class="mt-4"> <a href="<%= request.getContextPath() %>/accueil" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Accueil</a> <a href="<%= request.getContextPath() %>/listerFil" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Autres Fils de Discussion</a> <a href="<%= request.getContextPath() %>/creerFil" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Créer un Fil</a> <a href="<%= request.getContextPath() %>/parametre" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Paramètres</a> - <a href="<%= request.getContextPath() %>/logout" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-red-700">Se déconnecter</a> + + <h3 class="mt-4 px-4 text-lg font-semibold">Vos abonnements</h3> + <% + String email = (String) session.getAttribute("email"); + AbonnementDao adao = new AbonnementDao(); + List<Abonnement> abonnements = adao.findAbonnements(email); + for (Abonnement abonnement : abonnements) { + FilDeDiscussion filAbonne = fddao.findById(abonnement.getIdFil()); + %> + <a href="<%= request.getContextPath() %>/fil?id=<%= filAbonne.getId() %>" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700 flex items-center"> + <img src="<%= request.getContextPath() %>/images/<%= filAbonne.getLogo() %>" alt="Logo" class="w-8 h-8 mr-2"> + <span><%= filAbonne.getNom() %></span> + </a> + <% } %> </nav> + + <a href="<%= request.getContextPath() %>/logout" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-red-700">Se déconnecter</a> </aside> <div class="flex-1 p-6"> <div class="max-w-2xl mx-auto mt-8 p-6 bg-gray-800 rounded-lg shadow-lg"> diff --git a/sae/WEB-INF/vue/parametre.jsp b/sae/WEB-INF/vue/parametre.jsp index e1ee07c..1d59232 100644 --- a/sae/WEB-INF/vue/parametre.jsp +++ b/sae/WEB-INF/vue/parametre.jsp @@ -1,6 +1,11 @@ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="modele.Utilisateur" %> <%@ page import="modele.UtilisateurDao" %> +<%@ page import="modele.AbonnementDao" %> +<%@ page import="modele.FilDeDiscussion" %> +<%@ page import="modele.FilDeDiscussionDAO" %> +<%@ page import="modele.Abonnement" %> +<%@ page import="java.util.List" %> <% String email = (String) session.getAttribute("email"); @@ -28,8 +33,23 @@ <a href="<%= request.getContextPath() %>/listerFil" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Autres Fils de Discussion</a> <a href="<%= request.getContextPath() %>/creerFil" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Créer un Fil</a> <a href="<%= request.getContextPath() %>/parametre" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Paramètres</a> - <a href="<%= request.getContextPath() %>/logout" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-red-700">Se déconnecter</a> + + <h3 class="mt-4 px-4 text-lg font-semibold">Vos abonnements</h3> + <% + AbonnementDao adao = new AbonnementDao(); + List<Abonnement> abonnements = adao.findAbonnements(email); + FilDeDiscussionDAO fddao = new FilDeDiscussionDAO(); + for (Abonnement abonnement : abonnements) { + FilDeDiscussion fil = fddao.findById(abonnement.getIdFil()); + %> + <a href="<%= request.getContextPath() %>/fil?id=<%= fil.getId() %>" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700 flex items-center"> + <img src="<%= request.getContextPath() %>/images/<%= fil.getLogo() %>" alt="Logo" class="w-8 h-8 mr-2"> + <span><%= fil.getNom() %></span> + </a> + <% } %> </nav> + + <a href="<%= request.getContextPath() %>/logout" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-red-700">Se déconnecter</a> </aside> <div class="flex-1 p-6"> <div class="max-w-md mx-auto mt-12 p-6 bg-gray-800 rounded-lg shadow-md"> diff --git a/sae/WEB-INF/vue/register.jsp b/sae/WEB-INF/vue/register.jsp index cb966f5..a21a7b4 100644 --- a/sae/WEB-INF/vue/register.jsp +++ b/sae/WEB-INF/vue/register.jsp @@ -1,4 +1,9 @@ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> +<%@ page import="modele.AbonnementDao" %> +<%@ page import="modele.FilDeDiscussion" %> +<%@ page import="modele.FilDeDiscussionDAO" %> +<%@ page import="modele.Abonnement" %> +<%@ page import="java.util.List" %> <!DOCTYPE html> <html lang="fr"> @@ -15,13 +20,13 @@ <img src="<%= request.getContextPath() %>/images/logo.png" alt="CampusTalk Logo" class="w-16 h-16 mx-auto"> <h1 class="text-2xl font-bold mt-4">CampusTalk</h1> </div> - <!-- <nav class="mt-4"> + <nav class="mt-4"> <a href="<%= request.getContextPath() %>/accueil" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Accueil</a> <a href="<%= request.getContextPath() %>/listerFil" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Autres Fils de Discussion</a> <a href="<%= request.getContextPath() %>/creerFil" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Créer un Fil</a> <a href="<%= request.getContextPath() %>/parametre" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-700">Paramètres</a> <a href="<%= request.getContextPath() %>/logout" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-red-700">Se déconnecter</a> - </nav> --> + </nav> </aside> <div class="flex-1 p-6"> <div class="max-w-md mx-auto mt-12 p-6 bg-gray-800 rounded-lg shadow-md"> -- GitLab