From 99e27f1f6a7ce614f3b1f8c53c282a88be5ff899 Mon Sep 17 00:00:00 2001 From: Adrien <adrien.fryson@outlook.com> Date: Thu, 27 Feb 2025 21:21:28 +0100 Subject: [PATCH] bootstrap -> tailwind --- .../src/controleur/EnvoyerMessage.java | 7 +- sae/WEB-INF/vue/accueil.jsp | 91 ++++--- sae/WEB-INF/vue/creerFil.jsp | 111 ++++----- sae/WEB-INF/vue/fil.jsp | 224 ++++++------------ sae/WEB-INF/vue/listerFil.jsp | 134 +++++------ sae/WEB-INF/vue/login.jsp | 54 ++--- sae/WEB-INF/vue/register.jsp | 84 +++---- 7 files changed, 282 insertions(+), 423 deletions(-) diff --git a/sae/WEB-INF/src/controleur/EnvoyerMessage.java b/sae/WEB-INF/src/controleur/EnvoyerMessage.java index 5832057..b9c7916 100644 --- a/sae/WEB-INF/src/controleur/EnvoyerMessage.java +++ b/sae/WEB-INF/src/controleur/EnvoyerMessage.java @@ -14,7 +14,11 @@ import java.io.IOException; import java.time.LocalDateTime; @WebServlet("/envoyerMessage") -@MultipartConfig +@MultipartConfig( + maxFileSize = 1024 * 1024 * 5, + maxRequestSize = 1024 * 1024 * 10, + fileSizeThreshold = 0 // comme ça tous les fichiers qui sont normalement des images sont enregistrés sur le serveur +) public class EnvoyerMessage extends HttpServlet { private static final String UPLOAD_DIR = "uploads"; @@ -38,7 +42,6 @@ public class EnvoyerMessage extends HttpServlet { return; } - // Handle file upload Part filePart = req.getPart("file"); String fileName = null; if (filePart != null && filePart.getSize() > 0) { diff --git a/sae/WEB-INF/vue/accueil.jsp b/sae/WEB-INF/vue/accueil.jsp index 7a8f0a3..a8739e7 100644 --- a/sae/WEB-INF/vue/accueil.jsp +++ b/sae/WEB-INF/vue/accueil.jsp @@ -12,40 +12,35 @@ <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"> + <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet"> <link rel="shortcut icon" href="https://www.shareicon.net/data/2016/07/10/119195_chat_512x512.png"> - <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> - <nav class="navbar navbar-expand-lg navbar-light bg-light"> - <a class="navbar-brand" href="#">CampusTalk</a> - <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" - aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> - <span class="navbar-toggler-icon"></span> - </button> - <div class="collapse navbar-collapse" id="navbarNav"> - <ul class="navbar-nav ml-auto"> - <li class="nav-item"> - <a class="nav-link btn btn-danger text-white" href="<%= request.getContextPath() %>/logout">Se - déconnecter</a> - </li> - </ul> +<body class="bg-gray-100"> + <nav class="bg-white shadow-md"> + <div class="max-w-7xl mx-auto px-2 sm:px-6 lg:px-8"> + <div class="relative flex items-center justify-between h-16"> + <div class="absolute inset-y-0 left-0 flex items-center sm:hidden"> + <button type="button" class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-white" aria-controls="mobile-menu" aria-expanded="false"> + <span class="sr-only">Open main menu</span> + <svg class="block h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> + <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16m-7 6h7" /> + </svg> + <svg class="hidden h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> + <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" /> + </svg> + </button> + </div> + <div class="flex-1 flex items-center justify-center sm:items-stretch sm:justify-start"> + <div class="flex-shrink-0"> + <a class="text-xl font-bold text-gray-800" href="#">CampusTalk</a> + </div> + <div class="hidden sm:block sm:ml-auto"> + <div class="flex space-x-4"> + <a href="<%= request.getContextPath() %>/logout" class="text-red-600 hover:bg-red-700 hover:text-white px-3 py-2 rounded-md text-sm font-medium">Se déconnecter</a> + </div> + </div> + </div> + </div> </div> </nav> <% UtilisateurDao udao=new UtilisateurDao(); String email=(String) session.getAttribute("email"); String @@ -53,29 +48,23 @@ = adao.findAbonnements(email); FilDeDiscussionDAO fdao = new FilDeDiscussionDAO(); %> - <div class="welcome-container text-center"> - <h2>Bienvenue sur CampusTalk</h2> - <p>Bonjour, <%= username %> !</p> - <p>Vous êtes connecté en tant que <%= email %> - </p> - <a href="<%= request.getContextPath() %>/listerFil" class="btn btn-primary mt-4">Voir les autres fils de - discussion</a> + <div class="max-w-2xl mx-auto mt-12 p-6 bg-white rounded-lg shadow-md"> + <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> + <a href="<%= request.getContextPath() %>/listerFil" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">Voir les autres fils de discussion</a> </div> - <div class="welcome-container mt-4"> - <h3>Vos abonnements</h3> - <ul class="list-group"> + <div class="max-w-2xl mx-auto mt-8 p-6 bg-white rounded-lg shadow-md"> + <h3 class="text-xl font-bold mb-4">Vos abonnements</h3> + <ul class="list-disc pl-5"> <% for (Abonnement abo : abonnements) { %> - <li class="list-group-item"> - <a href="<%= request.getContextPath() %>/fil?id=<%= abo.getIdFil() %>"> + <li class="mb-2"> + <a href="<%= request.getContextPath() %>/fil?id=<%= abo.getIdFil() %>" class="text-blue-500 hover:underline"> <%= fdao.findById(abo.getIdFil()).getNom() %> </a> </li> - <% } %> + <% } %> </ul> </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 +</body> +</html> diff --git a/sae/WEB-INF/vue/creerFil.jsp b/sae/WEB-INF/vue/creerFil.jsp index ff8935a..cbdb477 100644 --- a/sae/WEB-INF/vue/creerFil.jsp +++ b/sae/WEB-INF/vue/creerFil.jsp @@ -6,73 +6,64 @@ <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>CampusTalk - Créer un Fil de Discussion</title> - <!-- Bootstrap CSS --> - <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet"> + <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet"> <link rel="shortcut icon" href="https://www.shareicon.net/data/2016/07/10/119195_chat_512x512.png"> - <style> - body { - background-color: #f8f9fa; - } - .form-container { - max-width: 600px; - margin: 50px auto; - padding: 20px; - background-color: #ffffff; - border-radius: 10px; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); - } - .form-container h1 { - margin-bottom: 20px; - font-weight: bold; - } - </style> </head> -<body> - <nav class="navbar navbar-expand-lg navbar-light bg-light"> - <a class="navbar-brand" href="#">CampusTalk</a> - <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" - aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> - <span class="navbar-toggler-icon"></span> - </button> - <div class="collapse navbar-collapse" id="navbarNav"> - <ul class="navbar-nav ml-auto"> - <li class="nav-item"> - <a class="nav-link btn btn-danger text-white" href="<%= request.getContextPath() %>/logout">Se - déconnecter</a> - </li> - </ul> +<body class="bg-gray-100"> + <nav class="bg-white shadow-md"> + <div class="max-w-7xl mx-auto px-2 sm:px-6 lg:px-8"> + <div class="relative flex items-center justify-between h-16"> + <div class="absolute inset-y-0 left-0 flex items-center sm:hidden"> + <button type="button" class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-white" aria-controls="mobile-menu" aria-expanded="false"> + <span class="sr-only">Open main menu</span> + <svg class="block h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> + <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16m-7 6h7" /> + </svg> + <svg class="hidden h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> + <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" /> + </svg> + </button> + </div> + <div class="flex-1 flex items-center justify-center sm:items-stretch sm:justify-start"> + <div class="flex-shrink-0"> + <a class="text-xl font-bold text-gray-800" href="#">CampusTalk</a> + </div> + <div class="hidden sm:block sm:ml-auto"> + <div class="flex space-x-4"> + <a href="<%= request.getContextPath() %>/logout" class="text-red-600 hover:bg-red-700 hover:text-white px-3 py-2 rounded-md text-sm font-medium">Se déconnecter</a> + </div> + </div> + </div> + </div> </div> </nav> - <div class="container"> - <div class="text-center mb-4"> - <a href="<%= request.getContextPath() %>/listerFil" class="btn btn-primary">Retour aux fils de - discussion</a> + <div class="container mx-auto px-4 mt-4 text-center"> + <a href="<%= request.getContextPath() %>/listerFil" class="bg-blue-500 text-white px-4 py-2 rounded">Retour aux fils de discussion</a> + </div> + + <% if (request.getAttribute("error") != null) { %> + <div class="max-w-2xl mx-auto mt-4 p-4 bg-red-100 text-red-700 rounded-lg"> + <%= request.getAttribute("error") %> </div> + <% } %> - <% if (request.getAttribute("error") !=null) { %> - <div class="alert alert-danger" role="alert"> - <%= request.getAttribute("error") %> + <div class="max-w-2xl mx-auto mt-8 p-6 bg-white rounded-lg shadow-md"> + <h1 class="text-2xl font-bold mb-4 text-center">Créer un nouveau fil de discussion</h1> + <form action="creerFil" method="post" class="mt-4"> + <div class="mb-4"> + <label for="nom" class="block text-gray-700 font-semibold">Nom du fil:</label> + <input type="text" class="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400" id="nom" name="nom" required> </div> - <% } %> - - <div class="form-container"> - <h1 class="text-center">Créer un nouveau fil de discussion</h1> - <form action="creerFil" method="post" class="mt-4"> - <div class="form-group"> - <label for="nom">Nom du fil:</label> - <input type="text" class="form-control" id="nom" name="nom" required> - </div> - <div class="form-group"> - <label for="createuremail">Email du créateur:</label> - <input type="email" class="form-control" id="createuremail" name="createuremail" required> - </div> - <div class="form-group"> - <label for="description">Description:</label> - <textarea class="form-control" id="description" name="description" rows="3" - required></textarea> - <button type="submit" class="btn btn-primary btn-block">Créer</button> - </form> - </div> + <div class="mb-4"> + <label for="createuremail" class="block text-gray-700 font-semibold">Email du créateur:</label> + <input type="email" class="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400" id="createuremail" name="createuremail" required> + </div> + <div class="mb-4"> + <label for="description" class="block text-gray-700 font-semibold">Description:</label> + <textarea class="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400" id="description" name="description" rows="3" required></textarea> + </div> + <button type="submit" class="bg-blue-500 text-white px-4 py-2 rounded-lg shadow-md hover:bg-blue-600 transition-colors w-full">Créer</button> + </form> </div> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> diff --git a/sae/WEB-INF/vue/fil.jsp b/sae/WEB-INF/vue/fil.jsp index f5feef2..670a807 100644 --- a/sae/WEB-INF/vue/fil.jsp +++ b/sae/WEB-INF/vue/fil.jsp @@ -1,4 +1,4 @@ -<%@ page language="java" contentType="text/html; ch</div>arset=UTF-8" pageEncoding="UTF-8"%> +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="modele.FilDeDiscussion" %> <%@ page import="modele.FilDeDiscussionDAO" %> <%@ page import="modele.Message" %> @@ -13,180 +13,102 @@ <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"> + <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet"> <link rel="shortcut icon" href="https://www.shareicon.net/data/2016/07/10/119195_chat_512x512.png"> <style> - body { - background-color: #f8f9fa; - color: #212529; - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; + .message-container { + transition: background-color 0.3s ease; } - .navbar { - background-color: #ffffff; - border-bottom: 1px solid #e0e0e0; + .message-container:hover { + background-color: #f3f4f6; } - .navbar-brand, .nav-link { - color: #212529 !important; - } - .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; - color: #212529; - } - .messages-box { - max-height: 400px; - overflow-y: auto; - padding-right: 15px; - } - .message-item { - display: flex; - align-items: flex-start; - padding: 10px 0; - border-bottom: 1px solid #e0e0e0; - } - .message-item:last-child { - border-bottom: none; - } - .avatar { - width: 40px; - height: 40px; - border-radius: 50%; - margin-right: 10px; - } - .message-content { - background-color: #f1f1f1; - padding: 10px; - border-radius: 10px; - max-width: 600px; - color: #212529; - } - .message-content h4 { - margin: 0; - font-size: 1em; - font-weight: bold; - color: #212529; - } - .message-content p { - margin: 3px 0; - } - .message-date { - font-size: 0.8em; - color: #6c757d; - } - .message-form { - margin-top: 20px; - padding: 20px; - border-top: 1px solid #e0e0e0; - } - .message-form label { - color: #212529; - } - .message-form textarea { - background-color: #f1f1f1; - color: #212529; - border: 1px solid #e0e0e0; - } - .message-form button { - background-color: #007bff; - border: none; - color: #ffffff; - } - .message-form button:hover { - background-color: #0056b3; + .message-image { + max-width: 200px; + max-height: 200px; + object-fit: cover; + border-radius: 8px; } </style> </head> -<body> - <nav class="navbar navbar-expand-lg"> - <a class="navbar-brand" href="#">CampusTalk</a> - <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" - aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> - <span class="navbar-toggler-icon"></span> - </button> - <div class="collapse navbar-collapse" id="navbarNav"> - <ul class="navbar-nav ml-auto"> - <li class="nav-item"> - <a class="nav-link btn btn-danger text-white" href="<%= request.getContextPath() %>/logout">Se - déconnecter</a> - </li> - </ul> +<body class="bg-gray-100 text-gray-900 font-sans"> + <nav class="bg-white shadow-md"> + <div class="container mx-auto px-4 py-2 flex justify-between items-center"> + <a class="text-xl font-bold" href="#">CampusTalk</a> + <div> + <a class="bg-red-500 text-white px-4 py-2 rounded" href="<%= request.getContextPath() %>/logout">Se déconnecter</a> + </div> </div> </nav> - <div class="text-center mt-4"> - <a href="<%= request.getContextPath() %>/listerFil" class="btn btn-primary">Retour</a> + + <div class="container mx-auto px-4 mt-4 text-center"> + <a href="<%= request.getContextPath() %>/listerFil" class="bg-blue-500 text-white px-4 py-2 rounded">Retour</a> </div> - <% int id=Integer.parseInt(request.getParameter("id")); session.setAttribute("filId", id); FilDeDiscussionDAO - fddao=new FilDeDiscussionDAO(); FilDeDiscussion fil=fddao.findById(id); MessageDao mdao=new MessageDao(); + <% + 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); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMM yyyy 'à' HH:mm"); - %> + %> - <div class="thread-container"> - <h2 class="text-center"> - <%= fil.getNom() %> - </h2> - <div class="messages-box" id="messages-box"> - <% for (Message m : messages) { LocalDateTime datePublication=m.getDatePublication(); String - formattedDate=(datePublication !=null) ? datePublication.format(formatter) : "Date non disponible" ; - %> - <div class="message-item"> - <div class="avatar"> - <img src="https://www.gravatar.com/avatar/<%= m.getAuteurEmail().hashCode() %>?d=identicon&s=40" - alt="Avatar"> - </div> - <div class="message-content"> - <h4> - <%= mdao.findUserName(m.getAuteurEmail()) %> - </h4> - <p class="message-date"> - <%= formattedDate %> - </p> - <p> - <%= m.getContenu() %> - </p> - <% if (m.getFileName() !=null) { %> - <img src="<%= request.getContextPath() %>/uploads/<%= m.getFileName() %>" alt="Image" - class="img-fluid mt-2"> - <% } %> - </div> + <div class="container mx-auto px-4 mt-8"> + <div class="bg-white p-6 rounded-lg shadow-lg"> + <h2 class="text-2xl font-bold mb-4 text-center"><%= fil.getNom() %></h2> + <div class="overflow-y-auto max-h-96" id="messages-box"> + <% for (Message m : messages) { + LocalDateTime datePublication = m.getDatePublication(); + String formattedDate = (datePublication != null) ? datePublication.format(formatter) : "Date non disponible"; + %> + <div class="flex items-start mb-4 message-container"> + <div class="w-10 h-10 rounded-full overflow-hidden"> + <img src="https://www.gravatar.com/avatar/<%= m.getAuteurEmail().hashCode() %>?d=identicon&s=40" alt="Avatar"> + </div> + <div class="ml-4 bg-gray-200 p-4 rounded-lg"> + <h4 class="font-bold"><%= mdao.findUserName(m.getAuteurEmail()) %></h4> + <p class="text-sm text-gray-600"><%= formattedDate %></p> + <p class="mt-2"><%= m.getContenu() %></p> + <% if (m.getFileName() != null) { %> + <img src="<%= request.getContextPath() %>/uploads/<%= m.getFileName() %>" alt="Image" class="mt-2 message-image"> + <% } %> </div> - <% } %> + </div> + <% } %> </div> - - <div class="message-form"> + <div class="mt-6 bg-white p-6 rounded-lg shadow-lg"> <form action="envoyerMessage" method="post" enctype="multipart/form-data"> - <div class="form-group"> - <label for="contenu">Votre message :</label> - <textarea class="form-control" id="contenu" name="contenu" rows="3" required></textarea> + <div class="mb-4"> + <label for="contenu" class="block text-gray-700 font-semibold">Votre message :</label> + <textarea class="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400" id="contenu" name="contenu" rows="3" required></textarea> </div> - <div class="form-group"> - <label for="file">Ajouter une image :</label> - <input type="file" class="form-control-file" id="file" name="file"> + <div class="mb-4"> + <label for="file" class="block text-gray-700 font-semibold">Ajouter une image :</label> + <div class="flex items-center"> + <input type="file" class="hidden" id="file" name="file"> + <label for="file" class="cursor-pointer bg-blue-500 text-white px-4 py-2 rounded-lg shadow-md hover:bg-blue-600 transition-colors flex items-center"> + <svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4"></path> + </svg> + Télécharger + </label> + </div> </div> <input type="hidden" name="filId" value="<%= id %>"> - <button type="submit" class="btn btn-primary">Envoyer</button> + <button type="submit" class="bg-blue-500 text-white px-4 py-2 rounded-lg shadow-md hover:bg-blue-600 transition-colors">Envoyer</button> </form> </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> - <script> - window.onload = function () { - let messagesBox = document.getElementById('messages-box'); - messagesBox.scrollTop = messagesBox.scrollHeight; - }; - </script> + <script> + window.onload = function () { + let messagesBox = document.getElementById('messages-box'); + messagesBox.scrollTop = messagesBox.scrollHeight; + }; + </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 index ea6b0eb..23d9c37 100644 --- a/sae/WEB-INF/vue/listerFil.jsp +++ b/sae/WEB-INF/vue/listerFil.jsp @@ -13,89 +13,69 @@ <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"> + <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet"> <link rel="shortcut icon" href="https://www.shareicon.net/data/2016/07/10/119195_chat_512x512.png"> - <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; - } - .navbar { - margin-bottom: 20px; - } - .btn-primary, .btn-danger { - margin: 5px; - } - </style> </head> -<body> - <nav class="navbar navbar-expand-lg navbar-light bg-light"> - <a class="navbar-brand" href="#">CampusTalk</a> - <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" - aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> - <span class="navbar-toggler-icon"></span> - </button> - <div class="collapse navbar-collapse" id="navbarNav"> - <ul class="navbar-nav ml-auto"> - <li class="nav-item"> - <a class="nav-link btn btn-danger text-white" href="<%= request.getContextPath() %>/logout">Se - déconnecter</a> - </li> - </ul> +<body class="bg-gray-100"> + <nav class="bg-white shadow-md"> + <div class="max-w-7xl mx-auto px-2 sm:px-6 lg:px-8"> + <div class="relative flex items-center justify-between h-16"> + <div class="absolute inset-y-0 left-0 flex items-center sm:hidden"> + <button type="button" class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-white" aria-controls="mobile-menu" aria-expanded="false"> + <span class="sr-only">Open main menu</span> + <svg class="block h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> + <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16m-7 6h7" /> + </svg> + <svg class="hidden h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> + <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" /> + </svg> + </button> + </div> + <div class="flex-1 flex items-center justify-center sm:items-stretch sm:justify-start"> + <div class="flex-shrink-0"> + <a class="text-xl font-bold text-gray-800" href="#">CampusTalk</a> + </div> + <div class="hidden sm:block sm:ml-auto"> + <div class="flex space-x-4"> + <a href="<%= request.getContextPath() %>/logout" class="text-red-600 hover:bg-red-700 hover:text-white px-3 py-2 rounded-md text-sm font-medium">Se déconnecter</a> + </div> + </div> + </div> + </div> </div> </nav> - <div class="container"> - <div class="text-center mb-4"> - <a href="<%= request.getContextPath() %>/accueil" class="btn btn-primary">Retour à l'accueil</a> - <a href="<%= request.getContextPath() %>/creerFil" class="btn btn-primary">Créer un fil de discussion</a> - </div> - <div class="thread-container"> - <h2 class="text-center">Fils de Discussion</h2> - <% 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())) { - %> - <div class="thread-item"> - <h4 class="d-flex justify-content-between align-items-center"> - <p class="thread-name mb-0"> - <%= f.getNom() %> - </p> - <a href="<%= request.getContextPath() %>/suivreFil?id=<%= f.getId() %>" - class="btn btn-primary btn-sm">Suivre</a> - </h4> - <% if (f.getDescription() !=null) { %> - <p class="thread-description"> - <%= f.getDescription() %> - </p> - <% } %> - </div> - <% } } %> + <div class="container mx-auto px-4 mt-4 text-center"> + <a href="<%= request.getContextPath() %>/accueil" class="bg-blue-500 text-white px-4 py-2 rounded">Retour à l'accueil</a> + <a href="<%= request.getContextPath() %>/creerFil" class="bg-blue-500 text-white px-4 py-2 rounded">Créer un fil de discussion</a> + </div> + + <div class="max-w-2xl mx-auto mt-8 p-6 bg-white rounded-lg shadow-md"> + <h2 class="text-2xl font-bold mb-4 text-center">Fils de Discussion</h2> + <% + 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())) { + %> + <div class="mb-4 p-4 bg-gray-100 rounded-lg shadow-md"> + <h4 class="font-bold text-lg"><%= f.getNom() %></h4> + <% if (f.getDescription() != null) { %> + <p class="text-gray-700"><%= f.getDescription() %></p> + <% } %> + <a href="<%= request.getContextPath() %>/suivreFil?id=<%= f.getId() %>" class="bg-blue-500 text-white px-4 py-2 rounded mt-2 inline-block">Suivre</a> </div> + <% + } + } + %> </div> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> diff --git a/sae/WEB-INF/vue/login.jsp b/sae/WEB-INF/vue/login.jsp index 1cd2962..c4d29cb 100644 --- a/sae/WEB-INF/vue/login.jsp +++ b/sae/WEB-INF/vue/login.jsp @@ -6,51 +6,41 @@ <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>CampusTalk - Connexion</title> - <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet"> + <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet"> <link rel="shortcut icon" href="https://www.shareicon.net/data/2016/07/10/119195_chat_512x512.png"> <style> body { background-color: #f8f9fa; } - .login-container { - max-width: 400px; - margin: 100px auto; - padding: 20px; - background-color: #ffffff; - border-radius: 10px; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); - } - .login-container h2 { - margin-bottom: 20px; - font-weight: bold; - } </style> </head> -<body> - <nav class="navbar navbar-expand-lg navbar-light bg-light"> - <a class="navbar-brand" href="#">CampusTalk</a> - <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" - aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> - <span class="navbar-toggler-icon"></span> - </button> +<body class="bg-gray-100"> + <nav class="bg-white shadow-md"> + <div class="max-w-7xl mx-auto px-2 sm:px-6 lg:px-8"> + <div class="relative flex items-center justify-between h-16"> + <div class="flex-1 flex items-center justify-center sm:items-stretch sm:justify-start"> + <div class="flex-shrink-0"> + <a class="text-xl font-bold text-gray-800" href="#">CampusTalk</a> + </div> + </div> + </div> + </div> </nav> - <div class="login-container"> - <h2 class="text-center">Bienvenue sur CampusTalk</h2> + <div class="max-w-md mx-auto mt-12 p-6 bg-white rounded-lg shadow-md"> + <h2 class="text-2xl font-bold mb-4 text-center">Bienvenue sur CampusTalk</h2> <form action="login" method="post"> - <div class="form-group"> - <label for="email">Adresse e-mail</label> - <input type="email" class="form-control" name="email" id="email" placeholder="Entrez votre e-mail" - required> + <div class="mb-4"> + <label for="email" class="block text-gray-700 font-semibold">Adresse e-mail</label> + <input type="email" class="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400" name="email" id="email" placeholder="Entrez votre e-mail" required> </div> - <div class="form-group"> - <label for="motdepasse">Mot de passe</label> - <input type="password" class="form-control" name="motdepasse" id="motdepasse" - placeholder="Entrez votre mot de passe" required> + <div class="mb-4"> + <label for="motdepasse" class="block text-gray-700 font-semibold">Mot de passe</label> + <input type="password" class="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400" name="motdepasse" id="motdepasse" placeholder="Entrez votre mot de passe" required> </div> - <button type="submit" class="btn btn-primary btn-block">Se connecter</button> + <button type="submit" class="bg-blue-500 text-white px-4 py-2 rounded-lg shadow-md hover:bg-blue-600 transition-colors w-full">Se connecter</button> </form> <div class="text-center mt-3"> - <p>Vous n'avez pas de compte ? <a href="<%= request.getContextPath() %>/register">S'inscrire</a></p> + <p>Vous n'avez pas de compte ? <a href="<%= request.getContextPath() %>/register" class="text-blue-500 hover:underline">S'inscrire</a></p> </div> </div> diff --git a/sae/WEB-INF/vue/register.jsp b/sae/WEB-INF/vue/register.jsp index d0e671f..99411e4 100644 --- a/sae/WEB-INF/vue/register.jsp +++ b/sae/WEB-INF/vue/register.jsp @@ -6,62 +6,46 @@ <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>CampusTalk - Inscription</title> - <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet"> + <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet"> <link rel="shortcut icon" href="https://www.shareicon.net/data/2016/07/10/119195_chat_512x512.png"> - <style> - body { - background-color: #f8f9fa; - } - .register-container { - max-width: 400px; - margin: 100px auto; - padding: 20px; - background-color: #ffffff; - border-radius: 10px; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); - } - .register-container h2 { - margin-bottom: 20px; - font-weight: bold; - } - </style> </head> -<body> - <nav class="navbar navbar-expand-lg navbar-light bg-light"> - <a class="navbar-brand" href="#">CampusTalk</a> - <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" - aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> - <span class="navbar-toggler-icon"></span> - </button> +<body class="bg-gray-100"> + <nav class="bg-white shadow-md"> + <div class="max-w-7xl mx-auto px-2 sm:px-6 lg:px-8"> + <div class="relative flex items-center justify-between h-16"> + <div class="flex-1 flex items-center justify-center sm:items-stretch sm:justify-start"> + <div class="flex-shrink-0"> + <a class="text-xl font-bold text-gray-800" href="#">CampusTalk</a> + </div> + </div> + </div> + </div> </nav> - <div class="register-container"> - <h2 class="text-center">Inscription</h2> - <% if (request.getAttribute("error") !=null) { %> - <div class="alert alert-danger" role="alert"> + <div class="max-w-md mx-auto mt-12 p-6 bg-white rounded-lg shadow-md"> + <h2 class="text-2xl font-bold mb-4 text-center">Inscription</h2> + <% if (request.getAttribute("error") != null) { %> + <div class="bg-red-100 text-red-700 p-4 rounded-lg mb-4"> <%= request.getAttribute("error") %> </div> <% request.removeAttribute("error"); } %> - <form action="register" method="post"> - <div class="form-group"> - <label for="nom">Nom</label> - <input type="text" class="form-control" name="nom" id="nom" placeholder="Entrez votre nom" - required> - </div> - <div class="form-group"> - <label for="email">Adresse e-mail</label> - <input type="email" class="form-control" name="email" id="email" - placeholder="Entrez votre e-mail" required> - </div> - <div class="form-group"> - <label for="motdepasse">Mot de passe</label> - <input type="password" class="form-control" name="motdepasse" id="motdepasse" - placeholder="Choisissez un mot de passe" required> - </div> - <button type="submit" class="btn btn-primary btn-block">S'inscrire</button> - </form> - <div class="text-center mt-3"> - <p>Vous avez déjà un compte ? <a href="<%= request.getContextPath() %>/login">Se connecter</a></p> - </div> + <form action="register" method="post"> + <div class="mb-4"> + <label for="nom" class="block text-gray-700 font-semibold">Nom</label> + <input type="text" class="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400" name="nom" id="nom" placeholder="Entrez votre nom" required> + </div> + <div class="mb-4"> + <label for="email" class="block text-gray-700 font-semibold">Adresse e-mail</label> + <input type="email" class="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400" name="email" id="email" placeholder="Entrez votre e-mail" required> + </div> + <div class="mb-4"> + <label for="motdepasse" class="block text-gray-700 font-semibold">Mot de passe</label> + <input type="password" class="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400" name="motdepasse" id="motdepasse" placeholder="Choisissez un mot de passe" required> + </div> + <button type="submit" class="bg-blue-500 text-white px-4 py-2 rounded-lg shadow-md hover:bg-blue-600 transition-colors w-full">S'inscrire</button> + </form> + <div class="text-center mt-3"> + <p>Vous avez déjà un compte ? <a href="<%= request.getContextPath() %>/login" class="text-blue-500 hover:underline">Se connecter</a></p> + </div> </div> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> -- GitLab