From 635a4f7b790fc10262a01266001fdcccee0eefe4 Mon Sep 17 00:00:00 2001 From: Suzune <124695777+Suzune705@users.noreply.github.com> Date: Wed, 12 Nov 2025 01:33:40 +0700 Subject: [PATCH 1/3] refactor: improve extend return book --- .../borrowing/ExtendBookController.java | 27 +- src/java/com/library/dao/BorrowingDao.java | 4 + .../com/library/dao/BorrowingDaoImpl.java | 42 +- .../com/library/factory/ServiceFactory.java | 12 + .../com/library/service/BorrowingService.java | 25 +- .../library/service/ExtendBookService.java | 36 + web/WEB-INF/views/borrowing/borrowedbooks.jsp | 676 +++++++++--------- 7 files changed, 472 insertions(+), 350 deletions(-) create mode 100644 src/java/com/library/service/ExtendBookService.java diff --git a/src/java/com/library/controller/borrowing/ExtendBookController.java b/src/java/com/library/controller/borrowing/ExtendBookController.java index 5d2b942..d907292 100644 --- a/src/java/com/library/controller/borrowing/ExtendBookController.java +++ b/src/java/com/library/controller/borrowing/ExtendBookController.java @@ -6,7 +6,10 @@ import com.library.dao.BorrowingDao; import com.library.dao.BorrowingDaoImpl; +import com.library.factory.ServiceFactory; import com.library.model.dto.BorrowedBookDTO; +import com.library.service.BorrowingService; +import com.library.service.ExtendBookService; import java.io.IOException; import java.io.PrintWriter; import jakarta.servlet.ServletException; @@ -26,7 +29,8 @@ @WebServlet(name = "ExtendBook", urlPatterns = {"/borrowing/extend"}) public class ExtendBookController extends HttpServlet { - BorrowingDao borrowDao = new BorrowingDaoImpl(); + BorrowingService borrowService = ServiceFactory.getBorrowService(); + ExtendBookService extendBookService = ServiceFactory.getExtendBookService(); @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) @@ -46,21 +50,28 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) String account = (String) session.getAttribute("account"); int bookID = Integer.valueOf(request.getParameter("bookID")); - LocalDate borrowDate = borrowDao.getBorrowDate(bookID); + LocalDate borrowDate = borrowService.getBorrowDate(bookID); String dueDate = request.getParameter("newDueDate"); LocalDate newDueDate = LocalDate.parse(dueDate); + List borrowedBooks = borrowService.borrowedBooksList(account); + request.setAttribute("borrowedBooks", borrowedBooks); long day = ChronoUnit.DAYS.between(borrowDate, newDueDate); //take day + if (borrowService.getExtendCount(bookID, account) > 4) { + session.setAttribute("error", "You’re out of renewals"); + session.setAttribute("targetBookID", bookID); // show popup when update book is failed + request.getRequestDispatcher("/WEB-INF/views/borrowing/borrowedbooks.jsp").forward(request, response); + return; + } if (day > 60) { - request.setAttribute("error", "you must not extend the due date by more than 2 months "); - // load list - List borrowedBooks = borrowDao.borrowedBooksList(account); - request.setAttribute("borrowedBooks", borrowedBooks); - request.setAttribute("targetBookID", bookID); // show popup when update book is failed + session.setAttribute("error", "you must not extend the due date by more than 2 months "); + // load list + session.setAttribute("targetBookID", bookID); // show popup when update book is failed request.getRequestDispatcher("/WEB-INF/views/borrowing/borrowedbooks.jsp").forward(request, response); return; } - boolean commitExtraDate = borrowDao.extendDueDay(bookID, newDueDate, account); + boolean commitExtraDate = extendBookService.extendDueDay(bookID, newDueDate, account); if (commitExtraDate) { + borrowService.incrementExtendCount(bookID, account); session.setAttribute("extendSuccess", " Due date updated successfully!"); response.sendRedirect(request.getContextPath() + "/borrowing/borrowed?bookID=" + bookID); } diff --git a/src/java/com/library/dao/BorrowingDao.java b/src/java/com/library/dao/BorrowingDao.java index 45c6267..006b183 100644 --- a/src/java/com/library/dao/BorrowingDao.java +++ b/src/java/com/library/dao/BorrowingDao.java @@ -46,4 +46,8 @@ public interface BorrowingDao { int numberOfBorrowBookOnPerUser(); void approveBorrowing(Connection conn, int borrowId, int adminId); + + int getExtendCount(int bookId, String account); + + boolean incrementExtendCount(int bookId, String account); } diff --git a/src/java/com/library/dao/BorrowingDaoImpl.java b/src/java/com/library/dao/BorrowingDaoImpl.java index 96d4ba1..21e0990 100644 --- a/src/java/com/library/dao/BorrowingDaoImpl.java +++ b/src/java/com/library/dao/BorrowingDaoImpl.java @@ -218,11 +218,11 @@ public boolean hasUserBorrowedBook(int bookID, int userID) { ps.setString(3, "borrowing"); ResultSet rs = ps.executeQuery(); if (rs.next()) { - return false; + return true; } } catch (Exception e) { } - return true; + return false; } @Override @@ -304,4 +304,42 @@ public void approveBorrowing(Connection conn, int borrowId, int adminId) { } + @Override + public int getExtendCount(int bookId, String account) { + String sql = "SELECT b.extend_count\n" + + " FROM borrowings b\n" + + " JOIN users u ON b.user_id = u.user_id \n" + + " WHERE b.book_id = ? AND u.account = ?"; + + try (Connection conn = DBConnection.getInstance().getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { + ps.setInt(1, bookId); + ps.setString(2, account); + try (ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + return rs.getInt("extend_count"); + } + } + } catch (SQLException e) { + e.printStackTrace(); + } + return 0; + } + + @Override + public boolean incrementExtendCount(int bookId, String account) { + String sql = "UPDATE b\n" + + "SET b.extend_count = b.extend_count + 1\n" + + "FROM borrowings b\n" + + "JOIN users u ON b.user_id = u.user_id \n" + + "WHERE b.book_id = ? AND u.account = ?"; + try (Connection conn = DBConnection.getInstance().getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { + ps.setInt(1, bookId); + ps.setString(2, account); + return ps.executeUpdate() > 0; + } catch (SQLException e) { + e.printStackTrace(); + } + return false; + } + } diff --git a/src/java/com/library/factory/ServiceFactory.java b/src/java/com/library/factory/ServiceFactory.java index 2c6b261..114f0f4 100644 --- a/src/java/com/library/factory/ServiceFactory.java +++ b/src/java/com/library/factory/ServiceFactory.java @@ -7,6 +7,7 @@ import com.library.service.ActivityService; import com.library.service.BookService; import com.library.service.BorrowingService; +import com.library.service.ExtendBookService; import com.library.service.FavoriteService; import com.library.service.RemoveBookService; import com.library.service.RemoveUserService; @@ -29,6 +30,7 @@ public final class ServiceFactory { private static TrackingUserService trackService; private static UserService userService; private static RemoveUserService removeUserService; + private static ExtendBookService extendBookSerivce ; private ServiceFactory() { @@ -132,4 +134,14 @@ public static RemoveUserService getRemoveUserService() { } return removeUserService; } + + public static ExtendBookService getExtendBookService(){ + if(extendBookSerivce == null){ + extendBookSerivce = new ExtendBookService( + DaoFactory.getBookDao(), + DaoFactory.getBorrowingDao() + ); + } + return extendBookSerivce; + } } diff --git a/src/java/com/library/service/BorrowingService.java b/src/java/com/library/service/BorrowingService.java index 602fe2d..dd3cee0 100644 --- a/src/java/com/library/service/BorrowingService.java +++ b/src/java/com/library/service/BorrowingService.java @@ -10,9 +10,12 @@ import com.library.dao.BorrowingDaoImpl; import com.library.dao.UserDao; import com.library.dao.UserDaoImpl; +import com.library.model.dto.BorrowedBookDTO; import com.library.util.DBConnection; import java.sql.Connection; import java.sql.SQLException; +import java.time.LocalDate; +import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,7 +46,7 @@ public int getUserIDByAccount(String account) { } public boolean canBorrowBook(int bookID, int userID) { - if (this.borrowDao.hasUserBorrowedBook(bookID, userID) && this.borrowDao.numberOfBorrowBookOnPerUser() < 10) { + if (!this.borrowDao.hasUserBorrowedBook(bookID, userID) && this.borrowDao.numberOfBorrowBookOnPerUser() < 10) { return true; } return false; @@ -54,7 +57,7 @@ public void borrowBook(String slug, int bookID, int userID) { conn.setAutoCommit(false); try { if (this.bookDao.getCurrentQuantity(conn, bookID) > 0) { - this.borrowDao.insertBook(conn, bookID, userID); + this.borrowDao.insertBook(conn, bookID, userID); conn.commit(); } } catch (SQLException s) { @@ -69,7 +72,7 @@ public void approveBorrowRequest(int borrowId, int adminId, int bookID) { try (Connection conn = DBConnection.getInstance().getConnection()) { conn.setAutoCommit(false); try { - this.borrowDao.approveBorrowing(conn, borrowId, adminId); + this.borrowDao.approveBorrowing(conn, borrowId, adminId); this.bookDao.decreaseQuantity(conn, bookID); conn.commit(); logger.info("Borrow request {} approved by admin {}", borrowId, adminId); @@ -82,4 +85,20 @@ public void approveBorrowRequest(int borrowId, int adminId, int bookID) { } } + public LocalDate getBorrowDate(int bookID) { + return this.borrowDao.getBorrowDate(bookID); + } + + public int getExtendCount(int bookID, String account) { + return this.borrowDao.getExtendCount(bookID, account); + } + + public List borrowedBooksList(String account) { + return this.borrowDao.borrowedBooksList(account); + } + + public void incrementExtendCount(int bookId, String account) { + this.borrowDao.incrementExtendCount(bookId, account); + } + } diff --git a/src/java/com/library/service/ExtendBookService.java b/src/java/com/library/service/ExtendBookService.java new file mode 100644 index 0000000..76c8195 --- /dev/null +++ b/src/java/com/library/service/ExtendBookService.java @@ -0,0 +1,36 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.library.service; + +import com.library.dao.BookDao; +import com.library.dao.BorrowingDao; +import com.library.factory.DaoFactory; +import java.time.LocalDate; + +/** + * + * @author hieuchu + */ +public class ExtendBookService { + + private final BookDao bookDao; + private final BorrowingDao borrowDao ; + + public ExtendBookService(BookDao bookDao, BorrowingDao borrowDao) { + this.bookDao = bookDao; + this.borrowDao = borrowDao; + } + + public int limitExtend(int bookID, String account) { + int extendCount = borrowDao.getExtendCount(bookID, account); + return extendCount; + } + + public boolean extendDueDay(int bookID, LocalDate newDueDate, String account){ + return this.borrowDao.extendDueDay(bookID, newDueDate, account) ; + } + + +} diff --git a/web/WEB-INF/views/borrowing/borrowedbooks.jsp b/web/WEB-INF/views/borrowing/borrowedbooks.jsp index e23fd3e..a1c55b7 100644 --- a/web/WEB-INF/views/borrowing/borrowedbooks.jsp +++ b/web/WEB-INF/views/borrowing/borrowedbooks.jsp @@ -2,348 +2,350 @@ <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> - - - Borrowed Books - Library Management - - - - - - -
-
-

Borrowed Books

-
- - ← Back to Dashboard - -
- - - - - -
- ✅ ${sessionScope.returnSuccess} -
- - -
- + + + + +
+ ✅ ${sessionScope.returnSuccess} +
+ + +
+ From 3dc2594db946704799a0e6460c18db4ad9c8798d Mon Sep 17 00:00:00 2001 From: Suzune <124695777+Suzune705@users.noreply.github.com> Date: Wed, 12 Nov 2025 14:34:12 +0700 Subject: [PATCH 2/3] feat(user): extend duedate borrow book and add extend request UI --- .../admin/ConfirmExtendController.java | 75 +++ .../BorrowedBooksListController.java | 5 +- .../borrowing/ExtendBookController.java | 19 +- .../filter/AutholizationURLController.java | 6 +- .../filter/AutholizationUserController.java | 34 +- .../controller/user/ForgotPassword.java | 6 +- src/java/com/library/dao/BorrowingDao.java | 2 + .../com/library/dao/BorrowingDaoImpl.java | 24 +- .../com/library/dao/ExtendRequestDao.java | 16 + .../com/library/dao/ExtendRequestDaoImpl.java | 36 ++ src/java/com/library/enums/RequestStatus.java | 35 ++ src/java/com/library/factory/DaoFactory.java | 6 + .../com/library/factory/ServiceFactory.java | 3 +- .../library/model/dto/BorrowedBookDTO.java | 14 +- .../library/model/dto/ExtendRequestDTO.java | 65 +++ .../library/model/entity/ExtendRequest.java | 79 +++ .../com/library/service/BorrowingService.java | 5 +- .../library/service/ExtendBookService.java | 36 +- .../MailTransfer.java} | 4 +- web/WEB-INF/views/borrowing/borrowedbooks.jsp | 7 +- .../views/user/request_extend_book.jsp | 519 ++++++++++++++++++ 21 files changed, 947 insertions(+), 49 deletions(-) create mode 100644 src/java/com/library/controller/admin/ConfirmExtendController.java create mode 100644 src/java/com/library/dao/ExtendRequestDao.java create mode 100644 src/java/com/library/dao/ExtendRequestDaoImpl.java create mode 100644 src/java/com/library/enums/RequestStatus.java create mode 100644 src/java/com/library/model/dto/ExtendRequestDTO.java create mode 100644 src/java/com/library/model/entity/ExtendRequest.java rename src/java/com/library/{service/MailService.java => util/MailTransfer.java} (97%) create mode 100644 web/WEB-INF/views/user/request_extend_book.jsp diff --git a/src/java/com/library/controller/admin/ConfirmExtendController.java b/src/java/com/library/controller/admin/ConfirmExtendController.java new file mode 100644 index 0000000..dabfd5c --- /dev/null +++ b/src/java/com/library/controller/admin/ConfirmExtendController.java @@ -0,0 +1,75 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/JSP_Servlet/Servlet.java to edit this template + */ +package com.library.controller.admin; + +import com.library.enums.RequestStatus; +import com.library.factory.ServiceFactory; +import com.library.model.dto.BorrowedBookDTO; +import com.library.model.dto.ExtendRequestDTO; +import com.library.model.entity.Borrowing; +import com.library.model.entity.ExtendRequest; +import com.library.model.entity.User; +import com.library.service.BorrowingService; +import com.library.service.ExtendBookService; +import com.library.service.UserService; +import com.library.util.MailTransfer; +import java.io.IOException; +import java.io.PrintWriter; +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; +import java.time.LocalDateTime; + +/** + * + * @author hieuchu + */ +@WebServlet(name = "ConfirmExtendController", urlPatterns = {"/user/request-extend-book"}) +public class ConfirmExtendController extends HttpServlet { + + private final ExtendBookService extendSerivce = ServiceFactory.getExtendBookService(); + private final BorrowingService borrowService = ServiceFactory.getBorrowService(); + private final UserService userSerivce = ServiceFactory.getUserService(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + HttpSession session = request.getSession(false); + BorrowedBookDTO dto = (BorrowedBookDTO) session.getAttribute("bookExtend"); + request.setAttribute("dto", dto); + request.getRequestDispatcher("/WEB-INF/views/user/request_extend_book.jsp").forward(request, response); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + HttpSession session = request.getSession(false); + BorrowedBookDTO dto = (BorrowedBookDTO) session.getAttribute("bookExtend"); + int extensionDays = Integer.parseInt(request.getParameter("extensionDays")); + String account = request.getParameter("account"); + String fullName = request.getParameter("fullName"); + int borrowingID = borrowService.getBorrowingID(dto.getBookID(), account); + Borrowing borrow = new Borrowing(); + borrow.setBorrowingID(borrowingID); + int userID = userSerivce.getUserIDByAccount(account); + User u = new User(); + u.setUserID(userID); + ExtendRequestDTO e = new ExtendRequestDTO(); + e.setBorrowing(borrow); + e.setUser(u); + if (extendSerivce.limitExtend(dto.getBookID(), account) > 4) { + extendSerivce.insertData(e); + session.removeAttribute("bookExtend"); + session.removeAttribute("targetBookID"); + response.sendRedirect(request.getContextPath() + "/user/dashboard"); + } + + } + +} diff --git a/src/java/com/library/controller/borrowing/BorrowedBooksListController.java b/src/java/com/library/controller/borrowing/BorrowedBooksListController.java index ae9a4bd..9aaaf42 100644 --- a/src/java/com/library/controller/borrowing/BorrowedBooksListController.java +++ b/src/java/com/library/controller/borrowing/BorrowedBooksListController.java @@ -31,10 +31,7 @@ public class BorrowedBooksListController extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(false); - if (session == null || session.getAttribute("account") == null) { - response.sendRedirect(request.getContextPath() + "/Login"); - return ; - } + String account = (String) session.getAttribute("account"); List borrowedBooks = borrowDao.borrowedBooksList(account); diff --git a/src/java/com/library/controller/borrowing/ExtendBookController.java b/src/java/com/library/controller/borrowing/ExtendBookController.java index d907292..0534c22 100644 --- a/src/java/com/library/controller/borrowing/ExtendBookController.java +++ b/src/java/com/library/controller/borrowing/ExtendBookController.java @@ -43,21 +43,26 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(false); - if (session == null || session.getAttribute("account") == null) { - response.sendRedirect(request.getContextPath() + "/Login"); - return; - } + String account = (String) session.getAttribute("account"); int bookID = Integer.valueOf(request.getParameter("bookID")); LocalDate borrowDate = borrowService.getBorrowDate(bookID); String dueDate = request.getParameter("newDueDate"); LocalDate newDueDate = LocalDate.parse(dueDate); - List borrowedBooks = borrowService.borrowedBooksList(account); - request.setAttribute("borrowedBooks", borrowedBooks); + + List borrowedBooks = borrowService.borrowedBooksList(account); + + BorrowedBookDTO dto = extendBookService.getBorrowdBookFromList(borrowedBooks); + + request.setAttribute("borrowedBooks", borrowedBooks); + + String title = "Extend DueDate - Library System"; + long day = ChronoUnit.DAYS.between(borrowDate, newDueDate); //take day if (borrowService.getExtendCount(bookID, account) > 4) { - session.setAttribute("error", "You’re out of renewals"); + session.setAttribute("bookExtend", dto); + session.setAttribute("error", "You’re out of renewal"); session.setAttribute("targetBookID", bookID); // show popup when update book is failed request.getRequestDispatcher("/WEB-INF/views/borrowing/borrowedbooks.jsp").forward(request, response); return; diff --git a/src/java/com/library/controller/filter/AutholizationURLController.java b/src/java/com/library/controller/filter/AutholizationURLController.java index d471e7e..e4a97a1 100644 --- a/src/java/com/library/controller/filter/AutholizationURLController.java +++ b/src/java/com/library/controller/filter/AutholizationURLController.java @@ -18,14 +18,12 @@ public static final String[] pageForUser() { "/borrowing/returned", "/borrowing/return", "/borrowing/extend", + "/user/request-extend-book", // Favorites "/favorite/add-book", "/favorite/books", // Books - "/book/list", - "/book/detail", - "/book/search", - "/book/category", + // User info "/user/dashboard", "/user/setting", diff --git a/src/java/com/library/controller/filter/AutholizationUserController.java b/src/java/com/library/controller/filter/AutholizationUserController.java index ce902ec..e9e00cd 100644 --- a/src/java/com/library/controller/filter/AutholizationUserController.java +++ b/src/java/com/library/controller/filter/AutholizationUserController.java @@ -44,7 +44,11 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo String[] publicPaths = { "/login", "/register", "/book/list", - "/resource/", "/images/", ".css", ".js", ".png", ".jpg", "/user/forgot-password" + "/resource/", "/images/", ".css", ".js", ".png", ".jpg", "/user/forgot-password", + "/book/list", + "/book/detail", + "/book/search", + "/book/category", }; for (String p : publicPaths) { if (path.contains(p)) { @@ -52,29 +56,29 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo return; } } - + if (user == null) { response.sendRedirect(request.getContextPath() + "/user/login"); return; } - if (user.getRole().equals("user")) { + if (user.getRole().equals("user")) { for (String url : AutholizationURLController.pageForUser()) { - if(path.contains(url)){ - chain.doFilter(servletRequest, servletResponse); - return ; - } + if (path.contains(url)) { + chain.doFilter(servletRequest, servletResponse); + return; + } } } - - if (user.getRole().equals("admin")) { + + if (user.getRole().equals("admin")) { for (String url : AutholizationURLController.pageForAdmin()) { - if(path.contains(url)){ - chain.doFilter(servletRequest, servletResponse); - return ; - } + if (path.contains(url)) { + chain.doFilter(servletRequest, servletResponse); + return; + } } - } - + } + } } diff --git a/src/java/com/library/controller/user/ForgotPassword.java b/src/java/com/library/controller/user/ForgotPassword.java index f9892ea..91bd437 100644 --- a/src/java/com/library/controller/user/ForgotPassword.java +++ b/src/java/com/library/controller/user/ForgotPassword.java @@ -8,7 +8,7 @@ import com.library.exception.AccountNotExistException; import com.library.exception.ValidationException; import com.library.factory.ServiceFactory; -import com.library.service.MailService; +import com.library.util.MailTransfer; import com.library.service.TrackingUserService; import com.library.service.UserService; import com.library.util.HashPassword; @@ -52,9 +52,9 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) userService.isAccountExist(account); String tmp = RandomPassword.generatePassword(); String title = "Password Recovery - Library System"; - String message = "

Your New Pass : " + tmp + "

"; + String newPassword= "

Your New Pass : " + tmp + "

"; userService.updatePassword(account, HashPassword.hash(tmp)); - MailService.send(account, title, message); + MailTransfer.send(account, title, newPassword); session.setAttribute("message", "we have sent your password via email"); response.sendRedirect(request.getContextPath() + "/user/forgot-password"); } catch (ValidationException e) { diff --git a/src/java/com/library/dao/BorrowingDao.java b/src/java/com/library/dao/BorrowingDao.java index 006b183..7e27c71 100644 --- a/src/java/com/library/dao/BorrowingDao.java +++ b/src/java/com/library/dao/BorrowingDao.java @@ -50,4 +50,6 @@ public interface BorrowingDao { int getExtendCount(int bookId, String account); boolean incrementExtendCount(int bookId, String account); + + int getBorrowingIdByBookId(int bookId, String account); } diff --git a/src/java/com/library/dao/BorrowingDaoImpl.java b/src/java/com/library/dao/BorrowingDaoImpl.java index 21e0990..8d70d33 100644 --- a/src/java/com/library/dao/BorrowingDaoImpl.java +++ b/src/java/com/library/dao/BorrowingDaoImpl.java @@ -72,7 +72,7 @@ public int totalReturnedBooks(String account) { @Override public List borrowedBooksList(String account) { List list = new ArrayList<>(); - String sql = "SELECT bk.cover_image, b.borrow_date, b.due_date, bk.slug , bk.book_id " + String sql = "SELECT bk.cover_image, b.borrow_date, b.due_date, bk.slug , bk.book_id , bk.title " + "FROM borrowings b " + "JOIN users u ON u.user_id = b.user_id " + "JOIN books bk ON bk.book_id = b.book_id " @@ -88,6 +88,7 @@ public List borrowedBooksList(String account) { dto.setBorrowDate(rs.getDate("borrow_date").toLocalDate()); dto.setDueDate(rs.getDate("due_date").toLocalDate()); dto.setCoverImage(rs.getString("cover_image")); + dto.setName(rs.getString("title")); list.add(dto); } } catch (SQLException s) { @@ -341,5 +342,26 @@ public boolean incrementExtendCount(int bookId, String account) { } return false; } + + @Override + public int getBorrowingIdByBookId(int bookId, String account) { + String sql = "SELECT b.borrowing_id " + + "FROM borrowings b " + + "JOIN users u ON b.user_id = u.user_id " + + "WHERE b.book_id = ? AND u.account = ? AND b.status = 'borrowing'"; + + try (Connection conn = DBConnection.getInstance().getConnection(); + PreparedStatement ps = conn.prepareStatement(sql)) { + ps.setInt(1, bookId); + ps.setString(2, account); + ResultSet rs = ps.executeQuery(); + if (rs.next()) { + return rs.getInt("borrowing_id"); + } + } catch (SQLException e) { + e.printStackTrace(); + } + return -1; +} } diff --git a/src/java/com/library/dao/ExtendRequestDao.java b/src/java/com/library/dao/ExtendRequestDao.java new file mode 100644 index 0000000..4daf4f2 --- /dev/null +++ b/src/java/com/library/dao/ExtendRequestDao.java @@ -0,0 +1,16 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.library.dao; + +import com.library.model.dto.ExtendRequestDTO; +import com.library.model.entity.ExtendRequest; + +/** + * + * @author hieuchu + */ +public interface ExtendRequestDao { + boolean insertExtendRequest(ExtendRequestDTO request) ; +} diff --git a/src/java/com/library/dao/ExtendRequestDaoImpl.java b/src/java/com/library/dao/ExtendRequestDaoImpl.java new file mode 100644 index 0000000..cf2ee9e --- /dev/null +++ b/src/java/com/library/dao/ExtendRequestDaoImpl.java @@ -0,0 +1,36 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.library.dao; + +import com.library.model.dto.ExtendRequestDTO; +import com.library.model.entity.ExtendRequest; +import com.library.util.DBConnection; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +/** + * + * @author hieuchu + */ +public class ExtendRequestDaoImpl implements ExtendRequestDao { + + @Override + public boolean insertExtendRequest(ExtendRequestDTO dto) { + String sql = "INSERT INTO extend_requests (borrowing_id, user_id, status) VALUES (?, ?, ?)"; + try ( + Connection conn = DBConnection.getInstance().getConnection(); + PreparedStatement ps = conn.prepareStatement(sql)) { + ps.setInt(1, dto.getBorrowing().getBorrowingID()); + ps.setInt(2, dto.getUser().getUserID()); + ps.setString(3, dto.getStatus().PENDING.getValue()); + return ps.executeUpdate() > 0; + } catch (SQLException e) { + e.printStackTrace(); + return false; + } + } + +} diff --git a/src/java/com/library/enums/RequestStatus.java b/src/java/com/library/enums/RequestStatus.java new file mode 100644 index 0000000..e5d3a15 --- /dev/null +++ b/src/java/com/library/enums/RequestStatus.java @@ -0,0 +1,35 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.library.enums; + +/** + * + * @author hieuchu + */ +public enum RequestStatus { + PENDING("pending"), + APPROVED("approved"), + REJECTED("rejected"); + + private final String value; + + RequestStatus(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + public static RequestStatus fromString(String status) { + for (RequestStatus rs : RequestStatus.values()) { + if (rs.value.equalsIgnoreCase(status)) { + return rs; + } + } + return null; + } + +} diff --git a/src/java/com/library/factory/DaoFactory.java b/src/java/com/library/factory/DaoFactory.java index f2f17c6..dea3953 100644 --- a/src/java/com/library/factory/DaoFactory.java +++ b/src/java/com/library/factory/DaoFactory.java @@ -16,6 +16,8 @@ import com.library.dao.BorrowingDaoImpl; import com.library.dao.CategoryDao; import com.library.dao.CategoryDaoImpl; +import com.library.dao.ExtendRequestDao; +import com.library.dao.ExtendRequestDaoImpl; import com.library.dao.FavoriteDao; import com.library.dao.FavoriteDaoImpl; import com.library.dao.UserDao; @@ -41,6 +43,7 @@ private DaoFactory() { private static final AdminDao adminDao = new AdminDaoImpl(); private static final FavoriteDao favoriteDao = new FavoriteDaoImpl(); private static final UserSessionDao userSessionDao = new UserSessionDaoImpl(); + private static final ExtendRequestDao extendDao = new ExtendRequestDaoImpl(); public static UserDao getUserDao() { return userDao; @@ -77,4 +80,7 @@ public static FavoriteDao getFavoriteDao() { public static UserSessionDao getUserSessionDao() { return userSessionDao; } + public static ExtendRequestDao getExtendRequestDao(){ + return extendDao; + } } diff --git a/src/java/com/library/factory/ServiceFactory.java b/src/java/com/library/factory/ServiceFactory.java index 114f0f4..4dafdd1 100644 --- a/src/java/com/library/factory/ServiceFactory.java +++ b/src/java/com/library/factory/ServiceFactory.java @@ -139,7 +139,8 @@ public static ExtendBookService getExtendBookService(){ if(extendBookSerivce == null){ extendBookSerivce = new ExtendBookService( DaoFactory.getBookDao(), - DaoFactory.getBorrowingDao() + DaoFactory.getBorrowingDao(), + DaoFactory.getExtendRequestDao() ); } return extendBookSerivce; diff --git a/src/java/com/library/model/dto/BorrowedBookDTO.java b/src/java/com/library/model/dto/BorrowedBookDTO.java index 9b7fbb3..07e0614 100644 --- a/src/java/com/library/model/dto/BorrowedBookDTO.java +++ b/src/java/com/library/model/dto/BorrowedBookDTO.java @@ -13,6 +13,7 @@ public class BorrowedBookDTO { private int bookID ; private String coverImage ; + private String name ; private String slug ; private LocalDate borrowDate ; private LocalDate dueDate ; @@ -20,14 +21,25 @@ public class BorrowedBookDTO { public BorrowedBookDTO() { } - public BorrowedBookDTO(int bookID, String coverImage, String slug, LocalDate borrowDate, LocalDate dueDate) { + public BorrowedBookDTO(int bookID, String coverImage, String name, String slug, LocalDate borrowDate, LocalDate dueDate) { this.bookID = bookID; this.coverImage = coverImage; + this.name = name; this.slug = slug; this.borrowDate = borrowDate; this.dueDate = dueDate; } + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + public int getBookID() { return bookID; } diff --git a/src/java/com/library/model/dto/ExtendRequestDTO.java b/src/java/com/library/model/dto/ExtendRequestDTO.java new file mode 100644 index 0000000..75b739e --- /dev/null +++ b/src/java/com/library/model/dto/ExtendRequestDTO.java @@ -0,0 +1,65 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.library.model.dto; + +import com.library.enums.RequestStatus; +import com.library.model.entity.Borrowing; +import com.library.model.entity.User; +import java.time.LocalDateTime; + +/** + * + * @author hieuchu + */ +public class ExtendRequestDTO { + + private Borrowing borrowing; + private User user; + private LocalDateTime requestDate; + private RequestStatus status; + + public ExtendRequestDTO() { + } + + public ExtendRequestDTO(Borrowing borrowing, User user, LocalDateTime requestDate, RequestStatus status) { + this.borrowing = borrowing; + this.user = user; + this.requestDate = requestDate; + this.status = status; + } + + public Borrowing getBorrowing() { + return borrowing; + } + + public void setBorrowing(Borrowing borrowing) { + this.borrowing = borrowing; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public LocalDateTime getRequestDate() { + return requestDate; + } + + public void setRequestDate(LocalDateTime requestDate) { + this.requestDate = requestDate; + } + + public RequestStatus getStatus() { + return status; + } + + public void setStatus(RequestStatus status) { + this.status = status; + } + +} diff --git a/src/java/com/library/model/entity/ExtendRequest.java b/src/java/com/library/model/entity/ExtendRequest.java new file mode 100644 index 0000000..f8d6e9b --- /dev/null +++ b/src/java/com/library/model/entity/ExtendRequest.java @@ -0,0 +1,79 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.library.model.entity; + +import com.library.enums.RequestStatus; +import java.sql.Timestamp; +import java.time.LocalDateTime; + +/** + * + * @author hieuchu + */ +public class ExtendRequest { + private int requestId; + private Borrowing borrowing; + private User user ; + private LocalDateTime requestDate; + private RequestStatus status ; + + + public ExtendRequest() { + } + + public ExtendRequest(int requestId, Borrowing borrowing, User user, LocalDateTime requestDate, RequestStatus status) { + this.requestId = requestId; + this.borrowing = borrowing; + this.user = user; + this.requestDate = requestDate; + this.status = status; + } + + public int getRequestId() { + return requestId; + } + + public void setRequestId(int requestId) { + this.requestId = requestId; + } + + public Borrowing getBorrowing() { + return borrowing; + } + + public void setBorrowing(Borrowing borrowing) { + this.borrowing = borrowing; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public LocalDateTime getRequestDate() { + return requestDate; + } + + public void setRequestDate(LocalDateTime requestDate) { + this.requestDate = requestDate; + } + + public RequestStatus getStatus() { + return status; + } + + public void setStatus(RequestStatus status) { + this.status = status; + } + + + + + + +} diff --git a/src/java/com/library/service/BorrowingService.java b/src/java/com/library/service/BorrowingService.java index dd3cee0..12be00c 100644 --- a/src/java/com/library/service/BorrowingService.java +++ b/src/java/com/library/service/BorrowingService.java @@ -100,5 +100,8 @@ public List borrowedBooksList(String account) { public void incrementExtendCount(int bookId, String account) { this.borrowDao.incrementExtendCount(bookId, account); } - + + public int getBorrowingID(int bookID, String account){ + return this.borrowDao.getBorrowingIdByBookId(bookID, account); + } } diff --git a/src/java/com/library/service/ExtendBookService.java b/src/java/com/library/service/ExtendBookService.java index 76c8195..77021fd 100644 --- a/src/java/com/library/service/ExtendBookService.java +++ b/src/java/com/library/service/ExtendBookService.java @@ -6,8 +6,12 @@ import com.library.dao.BookDao; import com.library.dao.BorrowingDao; +import com.library.dao.ExtendRequestDao; import com.library.factory.DaoFactory; +import com.library.model.dto.BorrowedBookDTO; +import com.library.model.dto.ExtendRequestDTO; import java.time.LocalDate; +import java.util.List; /** * @@ -16,11 +20,13 @@ public class ExtendBookService { private final BookDao bookDao; - private final BorrowingDao borrowDao ; + private final BorrowingDao borrowDao; + private final ExtendRequestDao extendDao ; - public ExtendBookService(BookDao bookDao, BorrowingDao borrowDao) { + public ExtendBookService(BookDao bookDao, BorrowingDao borrowDao ,ExtendRequestDao extendDao) { this.bookDao = bookDao; this.borrowDao = borrowDao; + this.extendDao = extendDao; } public int limitExtend(int bookID, String account) { @@ -28,9 +34,25 @@ public int limitExtend(int bookID, String account) { return extendCount; } - public boolean extendDueDay(int bookID, LocalDate newDueDate, String account){ - return this.borrowDao.extendDueDay(bookID, newDueDate, account) ; - } - - + public boolean extendDueDay(int bookID, LocalDate newDueDate, String account) { + return this.borrowDao.extendDueDay(bookID, newDueDate, account); + } + + public BorrowedBookDTO getBorrowdBookFromList(List list) { + BorrowedBookDTO dto = new BorrowedBookDTO(); + for (BorrowedBookDTO b : list) { + dto.setBookID(b.getBookID()); + dto.setCoverImage(b.getCoverImage()); + dto.setDueDate(b.getDueDate()); + dto.setSlug(b.getSlug()); + dto.setName(b.getName()); + } + return dto; + } + + public void insertData(ExtendRequestDTO e){ + this.extendDao.insertExtendRequest(e); + } + + } diff --git a/src/java/com/library/service/MailService.java b/src/java/com/library/util/MailTransfer.java similarity index 97% rename from src/java/com/library/service/MailService.java rename to src/java/com/library/util/MailTransfer.java index 1e5f953..b39b8e7 100644 --- a/src/java/com/library/service/MailService.java +++ b/src/java/com/library/util/MailTransfer.java @@ -2,7 +2,7 @@ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ -package com.library.service; +package com.library.util; @@ -19,7 +19,7 @@ * * @author hieuchu */ -public class MailService { +public class MailTransfer { private static final String USERNAME = "hieuminh9873@gmail.com"; private static final String PASSWORD = "qifs buxh anin erpa"; diff --git a/web/WEB-INF/views/borrowing/borrowedbooks.jsp b/web/WEB-INF/views/borrowing/borrowedbooks.jsp index a1c55b7..266f70a 100644 --- a/web/WEB-INF/views/borrowing/borrowedbooks.jsp +++ b/web/WEB-INF/views/borrowing/borrowedbooks.jsp @@ -305,10 +305,11 @@

⚠ ${error} -

- + Gia hạn sách +

+
- +

diff --git a/web/WEB-INF/views/user/request_extend_book.jsp b/web/WEB-INF/views/user/request_extend_book.jsp new file mode 100644 index 0000000..b568bd3 --- /dev/null +++ b/web/WEB-INF/views/user/request_extend_book.jsp @@ -0,0 +1,519 @@ +<%@page contentType="text/html" pageEncoding="UTF-8"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + Book Extension Request - Library Management + + + + + + + + + + + + + + +
Renewal has been sent
+ + +
+
+ + Back to Borrowed Books + + +
+

Book Extension Request

+

Request to extend your book borrowing period

+
+ + + +
+ + ${successMessage} +
+
+ + +
+ + ${errorMessage} +
+
+ + +
+

Lưu ý:

+

• Mỗi cuốn sách có thể được gia hạn tối đa 2 lần

+

• Thời gian gia hạn tối đa là 30 ngày mỗi lần

+

• Không thể gia hạn sách đã quá hạn trả

+
+ + + + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + + +
+ +
+ + +
+ +
+ + +
+ + +
+ + +
+ +
+
+ + + + + \ No newline at end of file From 7bed2d6de3e8f630ac616bbae4d0a4342cdbffb1 Mon Sep 17 00:00:00 2001 From: Suzune <124695777+Suzune705@users.noreply.github.com> Date: Wed, 12 Nov 2025 15:23:01 +0700 Subject: [PATCH 3/3] feat(admin): load data to extend view --- .../admin/ExtendRequestManagerController.java | 43 + .../filter/AutholizationURLController.java | 3 +- .../com/library/dao/ExtendRequestDao.java | 3 + .../com/library/dao/ExtendRequestDaoImpl.java | 35 +- .../model/dto/ExtendRequestViewDTO.java | 82 ++ .../library/service/ExtendBookService.java | 6 +- web/WEB-INF/views/admin/dashboard.jsp | 23 +- .../views/admin/extend_request_manager.jsp | 845 ++++++++++++++++++ 8 files changed, 1028 insertions(+), 12 deletions(-) create mode 100644 src/java/com/library/controller/admin/ExtendRequestManagerController.java create mode 100644 src/java/com/library/model/dto/ExtendRequestViewDTO.java create mode 100644 web/WEB-INF/views/admin/extend_request_manager.jsp diff --git a/src/java/com/library/controller/admin/ExtendRequestManagerController.java b/src/java/com/library/controller/admin/ExtendRequestManagerController.java new file mode 100644 index 0000000..caa488b --- /dev/null +++ b/src/java/com/library/controller/admin/ExtendRequestManagerController.java @@ -0,0 +1,43 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/JSP_Servlet/Servlet.java to edit this template + */ +package com.library.controller.admin; + +import com.library.factory.ServiceFactory; +import com.library.model.dto.ExtendRequestViewDTO; +import com.library.service.ExtendBookService; +import java.io.IOException; +import java.io.PrintWriter; +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 java.util.List; + +/** + * + * @author hieuchu + */ +@WebServlet(name = "CExtendRequestManagerController", urlPatterns = {"/admin/extend-request-manger"}) +public class ExtendRequestManagerController extends HttpServlet { + + private final ExtendBookService extendSerivce = ServiceFactory.getExtendBookService(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + List list = extendSerivce.getAllExtendRequests(); + request.setAttribute("list", list); + request.getRequestDispatcher("/WEB-INF/views/admin/extend_request_manager.jsp").forward(request, response); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + } + +} diff --git a/src/java/com/library/controller/filter/AutholizationURLController.java b/src/java/com/library/controller/filter/AutholizationURLController.java index e4a97a1..8d859b2 100644 --- a/src/java/com/library/controller/filter/AutholizationURLController.java +++ b/src/java/com/library/controller/filter/AutholizationURLController.java @@ -52,7 +52,8 @@ public static final String[] pageForAdmin() { "/admin/user-borrowing-record", "/admin/user/delete", "/admin/user/logout", - "/admin/users/logout-all" + "/admin/users/logout-all", + "/admin/extend-request-manger" }; return tmp ; } diff --git a/src/java/com/library/dao/ExtendRequestDao.java b/src/java/com/library/dao/ExtendRequestDao.java index 4daf4f2..b5c3e4a 100644 --- a/src/java/com/library/dao/ExtendRequestDao.java +++ b/src/java/com/library/dao/ExtendRequestDao.java @@ -5,7 +5,9 @@ package com.library.dao; import com.library.model.dto.ExtendRequestDTO; +import com.library.model.dto.ExtendRequestViewDTO; import com.library.model.entity.ExtendRequest; +import java.util.List; /** * @@ -13,4 +15,5 @@ */ public interface ExtendRequestDao { boolean insertExtendRequest(ExtendRequestDTO request) ; + List getAllExtendRequests(); } diff --git a/src/java/com/library/dao/ExtendRequestDaoImpl.java b/src/java/com/library/dao/ExtendRequestDaoImpl.java index cf2ee9e..8e05350 100644 --- a/src/java/com/library/dao/ExtendRequestDaoImpl.java +++ b/src/java/com/library/dao/ExtendRequestDaoImpl.java @@ -5,11 +5,15 @@ package com.library.dao; import com.library.model.dto.ExtendRequestDTO; +import com.library.model.dto.ExtendRequestViewDTO; import com.library.model.entity.ExtendRequest; import com.library.util.DBConnection; import java.sql.Connection; import java.sql.PreparedStatement; +import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; /** * @@ -21,8 +25,7 @@ public class ExtendRequestDaoImpl implements ExtendRequestDao { public boolean insertExtendRequest(ExtendRequestDTO dto) { String sql = "INSERT INTO extend_requests (borrowing_id, user_id, status) VALUES (?, ?, ?)"; try ( - Connection conn = DBConnection.getInstance().getConnection(); - PreparedStatement ps = conn.prepareStatement(sql)) { + Connection conn = DBConnection.getInstance().getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { ps.setInt(1, dto.getBorrowing().getBorrowingID()); ps.setInt(2, dto.getUser().getUserID()); ps.setString(3, dto.getStatus().PENDING.getValue()); @@ -33,4 +36,32 @@ public boolean insertExtendRequest(ExtendRequestDTO dto) { } } + @Override + public List getAllExtendRequests() { + List list = new ArrayList<>(); + String sql = " SELECT users.account, users.avatar, books.title, books.cover_image,\n" + + " extend_requests.request_date, extend_requests.status\n" + + " FROM extend_requests\n" + + " JOIN users ON users.user_id = extend_requests.user_id\n" + + " JOIN borrowings ON borrowings.borrowing_id = extend_requests.borrowing_id\n" + + " JOIN books ON books.book_id = borrowings.book_id"; + + try ( + Connection conn = DBConnection.getInstance().getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery()) { + while (rs.next()) { + ExtendRequestViewDTO dto = new ExtendRequestViewDTO(); + dto.setAccount(rs.getString("account")); + dto.setAvatar(rs.getString("avatar")); + dto.setTitle(rs.getString("title")); + dto.setCoverImage(rs.getString("cover_image")); + dto.setRequestDate(rs.getTimestamp("request_date").toLocalDateTime()); + dto.setStatus(rs.getString("status")); + list.add(dto); + } + } catch (SQLException e) { + e.printStackTrace(); + } + return list; + } + } diff --git a/src/java/com/library/model/dto/ExtendRequestViewDTO.java b/src/java/com/library/model/dto/ExtendRequestViewDTO.java new file mode 100644 index 0000000..14f246f --- /dev/null +++ b/src/java/com/library/model/dto/ExtendRequestViewDTO.java @@ -0,0 +1,82 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.library.model.dto; + +import java.time.LocalDateTime; + +/** + * + * @author hieuchu + */ +public class ExtendRequestViewDTO { + private String account; + private String avatar; + private String title; + private String coverImage; + private LocalDateTime requestDate; + private String status; + + public ExtendRequestViewDTO() { + } + + public ExtendRequestViewDTO(String account, String avatar, String title, String coverImage, LocalDateTime requestDate, String status) { + this.account = account; + this.avatar = avatar; + this.title = title; + this.coverImage = coverImage; + this.requestDate = requestDate; + this.status = status; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getCoverImage() { + return coverImage; + } + + public void setCoverImage(String coverImage) { + this.coverImage = coverImage; + } + + public LocalDateTime getRequestDate() { + return requestDate; + } + + public void setRequestDate(LocalDateTime requestDate) { + this.requestDate = requestDate; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + +} diff --git a/src/java/com/library/service/ExtendBookService.java b/src/java/com/library/service/ExtendBookService.java index 77021fd..835d70e 100644 --- a/src/java/com/library/service/ExtendBookService.java +++ b/src/java/com/library/service/ExtendBookService.java @@ -10,6 +10,7 @@ import com.library.factory.DaoFactory; import com.library.model.dto.BorrowedBookDTO; import com.library.model.dto.ExtendRequestDTO; +import com.library.model.dto.ExtendRequestViewDTO; import java.time.LocalDate; import java.util.List; @@ -54,5 +55,8 @@ public void insertData(ExtendRequestDTO e){ this.extendDao.insertExtendRequest(e); } - + public List getAllExtendRequests(){ + return this.extendDao.getAllExtendRequests(); + } + } diff --git a/web/WEB-INF/views/admin/dashboard.jsp b/web/WEB-INF/views/admin/dashboard.jsp index 1f6e06b..5b0a0ca 100644 --- a/web/WEB-INF/views/admin/dashboard.jsp +++ b/web/WEB-INF/views/admin/dashboard.jsp @@ -407,16 +407,23 @@

${dto.totalOnlineUser}

Online Users

-
-
-

Active Borrowings

-
+ + +
+
+
+

+

Active Borrowings

+
+
+

Overdue Books

+
@@ -476,18 +483,18 @@ }, x: { ticks: { - color: '#4f46e5', + color: '#4f46e5', font: {size: 14, weight: '600', family: 'Segoe UI'}, }, - grid: {display: false} + grid: {display: false} } }, plugins: { - legend: {display: false}, + legend: {display: false}, title: { display: true, text: 'Borrowed Books by Category', - padding: { bottom: 30 }, + padding: {bottom: 30}, font: {size: 18, weight: 'bold'}, color: '#1f2937' } diff --git a/web/WEB-INF/views/admin/extend_request_manager.jsp b/web/WEB-INF/views/admin/extend_request_manager.jsp new file mode 100644 index 0000000..1769e11 --- /dev/null +++ b/web/WEB-INF/views/admin/extend_request_manager.jsp @@ -0,0 +1,845 @@ +<%@page contentType="text/html" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + + + + + Manage Online Users - Library Management System + + + + + + +
+
+ Logo +

Library Management System

+
+ +
+ Admin Avatar + +
+
+ + +
+
+

Manage Extend Requests

+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AvatarAccountBook TitleCoverRequest DateStatusActions
No extend requests found.
+ avatar + ${r.account}${r.title} + cover + + + + + Pending + + + + + Approved + + + + + Rejected + + + + +
+ + +
+
+
+
+ + + + + + + + \ No newline at end of file