From 8f322b51da42235fb5a96ac835e47b8311b07faa Mon Sep 17 00:00:00 2001 From: huanghong Date: Tue, 14 Apr 2026 12:55:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/AdminHouseAuditController.java | 76 ++++++++ .../admin/AdminHouseController.java | 68 +++++++ .../admin/AdminHouseOfflineController.java | 69 ++++++++ .../admin/AdminHouseOnlineController.java | 69 ++++++++ .../admin/AdminOrderController.java | 61 +++++++ .../admin/AdminStatisticsController.java | 74 ++++++++ .../controller/admin/AdminUserController.java | 94 ++++++++++ .../admin/AdminUserDeleteController.java | 77 ++++++++ .../admin/AdminUserStatusController.java | 74 ++++++++ .../landlord/HouseAddController.java | 152 ++++++++++++++++ .../landlord/HouseDeleteController.java | 111 ++++++++++++ .../landlord/HouseEditController.java | 138 +++++++++++++++ .../landlord/HouseListController.java | 63 +++++++ .../landlord/OrderConfirmController.java | 79 +++++++++ .../landlord/OrderManageController.java | 61 +++++++ .../landlord/ReservationHandleController.java | 76 ++++++++ .../landlord/ReservationManageController.java | 63 +++++++ .../user/CollectionAddController.java | 89 ++++++++++ .../user/CollectionDeleteController.java | 127 ++++++++++++++ .../user/CollectionListController.java | 65 +++++++ .../user/HouseDetailController.java | 73 ++++++++ .../controller/user/HouseListController.java | 74 ++++++++ .../hrs/controller/user/LoginController.java | 120 +++++++++++++ .../hrs/controller/user/LogoutController.java | 50 ++++++ .../user/OrderCancelController.java | 84 +++++++++ .../user/OrderCreateController.java | 166 ++++++++++++++++++ .../controller/user/OrderListController.java | 61 +++++++ .../controller/user/OrderPayController.java | 78 ++++++++ .../controller/user/RegisterController.java | 84 +++++++++ .../user/ReservationAddController.java | 150 ++++++++++++++++ .../user/ReservationCancelController.java | 70 ++++++++ .../user/ReservationListController.java | 63 +++++++ 32 files changed, 2759 insertions(+) create mode 100644 HRS/src/com/hrs/controller/admin/AdminHouseAuditController.java create mode 100644 HRS/src/com/hrs/controller/admin/AdminHouseController.java create mode 100644 HRS/src/com/hrs/controller/admin/AdminHouseOfflineController.java create mode 100644 HRS/src/com/hrs/controller/admin/AdminHouseOnlineController.java create mode 100644 HRS/src/com/hrs/controller/admin/AdminOrderController.java create mode 100644 HRS/src/com/hrs/controller/admin/AdminStatisticsController.java create mode 100644 HRS/src/com/hrs/controller/admin/AdminUserController.java create mode 100644 HRS/src/com/hrs/controller/admin/AdminUserDeleteController.java create mode 100644 HRS/src/com/hrs/controller/admin/AdminUserStatusController.java create mode 100644 HRS/src/com/hrs/controller/landlord/HouseAddController.java create mode 100644 HRS/src/com/hrs/controller/landlord/HouseDeleteController.java create mode 100644 HRS/src/com/hrs/controller/landlord/HouseEditController.java create mode 100644 HRS/src/com/hrs/controller/landlord/HouseListController.java create mode 100644 HRS/src/com/hrs/controller/landlord/OrderConfirmController.java create mode 100644 HRS/src/com/hrs/controller/landlord/OrderManageController.java create mode 100644 HRS/src/com/hrs/controller/landlord/ReservationHandleController.java create mode 100644 HRS/src/com/hrs/controller/landlord/ReservationManageController.java create mode 100644 HRS/src/com/hrs/controller/user/CollectionAddController.java create mode 100644 HRS/src/com/hrs/controller/user/CollectionDeleteController.java create mode 100644 HRS/src/com/hrs/controller/user/CollectionListController.java create mode 100644 HRS/src/com/hrs/controller/user/HouseDetailController.java create mode 100644 HRS/src/com/hrs/controller/user/HouseListController.java create mode 100644 HRS/src/com/hrs/controller/user/LoginController.java create mode 100644 HRS/src/com/hrs/controller/user/LogoutController.java create mode 100644 HRS/src/com/hrs/controller/user/OrderCancelController.java create mode 100644 HRS/src/com/hrs/controller/user/OrderCreateController.java create mode 100644 HRS/src/com/hrs/controller/user/OrderListController.java create mode 100644 HRS/src/com/hrs/controller/user/OrderPayController.java create mode 100644 HRS/src/com/hrs/controller/user/RegisterController.java create mode 100644 HRS/src/com/hrs/controller/user/ReservationAddController.java create mode 100644 HRS/src/com/hrs/controller/user/ReservationCancelController.java create mode 100644 HRS/src/com/hrs/controller/user/ReservationListController.java diff --git a/HRS/src/com/hrs/controller/admin/AdminHouseAuditController.java b/HRS/src/com/hrs/controller/admin/AdminHouseAuditController.java new file mode 100644 index 0000000..b67eb4a --- /dev/null +++ b/HRS/src/com/hrs/controller/admin/AdminHouseAuditController.java @@ -0,0 +1,76 @@ +package com.hrs.controller.admin; + +import com.hrs.dao.HouseDao; +import com.hrs.dao.impl.HouseDaoImpl; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.net.URLEncoder; + + + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: AdminHouseAuditController.java +* @Description: 管理员房源审核操作控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午8:48:49 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ + +@WebServlet("/admin/house/audit") +public class AdminHouseAuditController extends HttpServlet { + + private HouseDao houseDao = new HouseDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"2".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + String houseIdStr = request.getParameter("id"); + String action = request.getParameter("action"); + + if (houseIdStr == null || action == null) { + response.sendRedirect(request.getContextPath() + "/admin/house/list"); + return; + } + Long houseId = Long.parseLong(houseIdStr); + String status = "approve".equals(action) ? "1" : "3"; // 1-已上架,3-违规/拒绝 + + boolean success = houseDao.updateStatus(houseId, status); + + if (success) { + String msg = "approve".equals(action) ? "房源审核通过,已上架" : "房源审核拒绝"; + String encodedMsg = URLEncoder.encode(msg, "UTF-8"); + response.sendRedirect(request.getContextPath() + "/admin/house/list?msg=" + encodedMsg); + } else { + String encodedError = URLEncoder.encode("操作失败", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/admin/house/list?error=" + encodedError); + } + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/admin/AdminHouseController.java b/HRS/src/com/hrs/controller/admin/AdminHouseController.java new file mode 100644 index 0000000..bdd3960 --- /dev/null +++ b/HRS/src/com/hrs/controller/admin/AdminHouseController.java @@ -0,0 +1,68 @@ +package com.hrs.controller.admin; + +import com.hrs.dao.HouseDao; +import com.hrs.dao.impl.HouseDaoImpl; +import com.hrs.model.entity.House; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: AdminHouseController.java +* @Description: 管理员房源审核控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午8:51:26 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/admin/house/list") +public class AdminHouseController extends HttpServlet { + + private HouseDao houseDao = new HouseDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"2".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + // 获取不同状态的房源 + List pendingList = houseDao.findPendingHouses(); + List publishedList = houseDao.findPublishedHousesForAdmin(); + List offlineList = houseDao.findOfflineHouses(); + + request.setAttribute("pendingList", pendingList); + request.setAttribute("publishedList", publishedList); + request.setAttribute("offlineList", offlineList); + request.setAttribute("pendingCount", pendingList.size()); + request.setAttribute("publishedCount", publishedList.size()); + request.setAttribute("offlineCount", offlineList.size()); + request.setAttribute("loginUser", loginUser); + + request.getRequestDispatcher("/jsp/admin/house_list.jsp").forward(request, response); + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/admin/AdminHouseOfflineController.java b/HRS/src/com/hrs/controller/admin/AdminHouseOfflineController.java new file mode 100644 index 0000000..9d6ec9b --- /dev/null +++ b/HRS/src/com/hrs/controller/admin/AdminHouseOfflineController.java @@ -0,0 +1,69 @@ +package com.hrs.controller.admin; + +import com.hrs.dao.HouseDao; +import com.hrs.dao.impl.HouseDaoImpl; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.net.URLEncoder; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: AdminHouseOfflineController.java +* @Description: 管理员下架房源控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午8:52:08 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/admin/house/offline") +public class AdminHouseOfflineController extends HttpServlet { + + private HouseDao houseDao = new HouseDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"2".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + String houseIdStr = request.getParameter("id"); + if (houseIdStr == null) { + response.sendRedirect(request.getContextPath() + "/admin/house/list"); + return; + } + + Long houseId = Long.parseLong(houseIdStr); + boolean success = houseDao.updateStatus(houseId, "2"); // 2-已下架 + + if (success) { + String encodedMsg = URLEncoder.encode("房源已下架", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/admin/house/list?msg=" + encodedMsg); + } else { + String encodedError = URLEncoder.encode("操作失败", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/admin/house/list?error=" + encodedError); + } + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/admin/AdminHouseOnlineController.java b/HRS/src/com/hrs/controller/admin/AdminHouseOnlineController.java new file mode 100644 index 0000000..bd1278b --- /dev/null +++ b/HRS/src/com/hrs/controller/admin/AdminHouseOnlineController.java @@ -0,0 +1,69 @@ +package com.hrs.controller.admin; + +import com.hrs.dao.HouseDao; +import com.hrs.dao.impl.HouseDaoImpl; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.net.URLEncoder; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: AdminHouseOnlineController.java +* @Description: 管理员重新上架房源控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午8:53:08 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/admin/house/online") +public class AdminHouseOnlineController extends HttpServlet { + + private HouseDao houseDao = new HouseDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"2".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + String houseIdStr = request.getParameter("id"); + if (houseIdStr == null) { + response.sendRedirect(request.getContextPath() + "/admin/house/list"); + return; + } + + Long houseId = Long.parseLong(houseIdStr); + boolean success = houseDao.updateStatus(houseId, "1"); // 1-已上架 + + if (success) { + String encodedMsg = URLEncoder.encode("房源已重新上架", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/admin/house/list?msg=" + encodedMsg); + } else { + String encodedError = URLEncoder.encode("操作失败", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/admin/house/list?error=" + encodedError); + } + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/admin/AdminOrderController.java b/HRS/src/com/hrs/controller/admin/AdminOrderController.java new file mode 100644 index 0000000..a4ed878 --- /dev/null +++ b/HRS/src/com/hrs/controller/admin/AdminOrderController.java @@ -0,0 +1,61 @@ +package com.hrs.controller.admin; + +import com.hrs.dao.OrderDao; +import com.hrs.dao.impl.OrderDaoImpl; +import com.hrs.model.entity.Order; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: AdminOrderController.java +* @Description: 管理员订单管理控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午8:53:35 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/admin/order/list") +public class AdminOrderController extends HttpServlet { + + private OrderDao orderDao = new OrderDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"2".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + List orderList = orderDao.findAll(); + + request.setAttribute("orderList", orderList); + request.setAttribute("totalCount", orderList.size()); + request.setAttribute("loginUser", loginUser); + + request.getRequestDispatcher("/jsp/admin/order_list.jsp").forward(request, response); + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/admin/AdminStatisticsController.java b/HRS/src/com/hrs/controller/admin/AdminStatisticsController.java new file mode 100644 index 0000000..1a376ab --- /dev/null +++ b/HRS/src/com/hrs/controller/admin/AdminStatisticsController.java @@ -0,0 +1,74 @@ +package com.hrs.controller.admin; + +import com.hrs.dao.HouseDao; +import com.hrs.dao.impl.HouseDaoImpl; +import com.hrs.dao.OrderDao; +import com.hrs.dao.impl.OrderDaoImpl; +import com.hrs.dao.UserDao; +import com.hrs.dao.impl.UserDaoImpl; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.io.PrintWriter; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: AdminStatisticsController.java +* @Description: 管理员统计数据AP +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午8:53:55 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/admin/statistics") +public class AdminStatisticsController extends HttpServlet { + + private UserDao userDao = new UserDaoImpl(); + private HouseDao houseDao = new HouseDaoImpl(); + private OrderDao orderDao = new OrderDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + HttpSession session = request.getSession(false); + if (session == null) { + response.setStatus(401); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"2".equals(loginUser.getRoleType())) { + response.setStatus(403); + return; + } + + // 获取统计数据 + int userCount = userDao.count(); + int houseCount = houseDao.countAll(); + int orderCount = orderDao.countAll(); + int pendingCount = houseDao.findPendingHouses().size(); + + // 返回JSON + response.setContentType("application/json;charset=UTF-8"); + PrintWriter out = response.getWriter(); + out.print("{"); + out.print("\"userCount\":" + userCount + ","); + out.print("\"houseCount\":" + houseCount + ","); + out.print("\"orderCount\":" + orderCount + ","); + out.print("\"pendingCount\":" + pendingCount); + out.print("}"); + } +} diff --git a/HRS/src/com/hrs/controller/admin/AdminUserController.java b/HRS/src/com/hrs/controller/admin/AdminUserController.java new file mode 100644 index 0000000..dd05655 --- /dev/null +++ b/HRS/src/com/hrs/controller/admin/AdminUserController.java @@ -0,0 +1,94 @@ +package com.hrs.controller.admin; + +import com.hrs.dao.UserDao; +import com.hrs.dao.impl.UserDaoImpl; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: AdminUserController.java +* @Description: 管理员用户管理控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午8:54:18 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/admin/user/list") +public class AdminUserController extends HttpServlet { + + private UserDao userDao = new UserDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + // 检查登录状态和管理员权限 + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"2".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + // 获取所有用户 + List allUsers = getAllUsers(); + + // 分离不同角色 + List tenants = new java.util.ArrayList<>(); + List landlords = new java.util.ArrayList<>(); + List admins = new java.util.ArrayList<>(); + + for (User user : allUsers) { + if ("0".equals(user.getRoleType())) { + tenants.add(user); + } else if ("1".equals(user.getRoleType())) { + landlords.add(user); + } else if ("2".equals(user.getRoleType())) { + admins.add(user); + } + } + + request.setAttribute("tenants", tenants); + request.setAttribute("landlords", landlords); + request.setAttribute("admins", admins); + request.setAttribute("totalCount", allUsers.size()); + request.setAttribute("loginUser", loginUser); + + request.getRequestDispatcher("/jsp/admin/user_list.jsp").forward(request, response); + } + + private List getAllUsers() { + // 通过DAO获取所有用户 + // 注意:UserDAO中没有findAll方法,需要添加 + // 这里先用查询所有租客和房东的方式 + List allUsers = new java.util.ArrayList<>(); + allUsers.addAll(userDao.findAllTenants()); + allUsers.addAll(userDao.findAllLandlords()); + // 手动添加管理员(管理员数量少,可以从数据库查) + User admin = userDao.findByUsername("admin"); + if (admin != null) { + allUsers.add(admin); + } + return allUsers; + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/admin/AdminUserDeleteController.java b/HRS/src/com/hrs/controller/admin/AdminUserDeleteController.java new file mode 100644 index 0000000..a7ed1ce --- /dev/null +++ b/HRS/src/com/hrs/controller/admin/AdminUserDeleteController.java @@ -0,0 +1,77 @@ +package com.hrs.controller.admin; + +import com.hrs.dao.UserDao; +import com.hrs.dao.impl.UserDaoImpl; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.net.URLEncoder; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: AdminUserDeleteController.java +* @Description: 管理员删除用户控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午8:54:34 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/admin/user/delete") +public class AdminUserDeleteController extends HttpServlet { + + private UserDao userDao = new UserDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"2".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + String userIdStr = request.getParameter("id"); + if (userIdStr == null) { + response.sendRedirect(request.getContextPath() + "/admin/user/list"); + return; + } + + Long userId = Long.parseLong(userIdStr); + + // 不能删除自己 + if (userId.equals(loginUser.getId())) { + String encodedError = URLEncoder.encode("不能删除自己", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/admin/user/list?error=" + encodedError); + return; + } + + boolean success = userDao.delete(userId); + + if (success) { + String encodedMsg = URLEncoder.encode("删除成功", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/admin/user/list?msg=" + encodedMsg); + } else { + String encodedError = URLEncoder.encode("删除失败", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/admin/user/list?error=" + encodedError); + } + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/admin/AdminUserStatusController.java b/HRS/src/com/hrs/controller/admin/AdminUserStatusController.java new file mode 100644 index 0000000..0ef6e64 --- /dev/null +++ b/HRS/src/com/hrs/controller/admin/AdminUserStatusController.java @@ -0,0 +1,74 @@ +package com.hrs.controller.admin; + +import com.hrs.dao.UserDao; +import com.hrs.dao.impl.UserDaoImpl; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.net.URLEncoder; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: AdminUserStatusController.java +* @Description: 管理员操作用户状态控制器(启用/禁用) +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午8:54:49 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/admin/user/status") +public class AdminUserStatusController extends HttpServlet { + + private UserDao userDao = new UserDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"2".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + String userIdStr = request.getParameter("id"); + String action = request.getParameter("action"); // enable 或 disable + + if (userIdStr == null || action == null) { + response.sendRedirect(request.getContextPath() + "/admin/user/list"); + return; + } + + Long userId = Long.parseLong(userIdStr); + String status = "enable".equals(action) ? "1" : "2"; + + boolean success = userDao.updateStatus(userId, status); + + if (success) { + String msg = "enable".equals(action) ? "用户已启用" : "用户已禁用"; + String encodedMsg = URLEncoder.encode(msg, "UTF-8"); + response.sendRedirect(request.getContextPath() + "/admin/user/list?msg=" + encodedMsg); + } else { + String encodedError = URLEncoder.encode("操作失败", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/admin/user/list?error=" + encodedError); + } + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/landlord/HouseAddController.java b/HRS/src/com/hrs/controller/landlord/HouseAddController.java new file mode 100644 index 0000000..c5c3ece --- /dev/null +++ b/HRS/src/com/hrs/controller/landlord/HouseAddController.java @@ -0,0 +1,152 @@ +package com.hrs.controller.landlord; + +import com.hrs.model.entity.House; +import com.hrs.model.entity.User; +import com.hrs.service.HouseService; +import com.hrs.service.impl.HouseServiceImpl; +import com.hrs.util.ImageUploadUtil; + +import javax.servlet.ServletException; +import javax.servlet.annotation.MultipartConfig; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import javax.servlet.http.Part; +import java.io.IOException; +import java.math.BigDecimal; +import java.net.URLEncoder; +import java.text.SimpleDateFormat; +import java.util.Collection; +import java.util.Date; + + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: HouseAddController.java +* @Description: 添加房源控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午8:55:45 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/landlord/house/add") +@MultipartConfig( + maxFileSize = 5 * 1024 * 1024, + maxRequestSize = 25 * 1024 * 1024 +) +public class HouseAddController extends HttpServlet { + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + // 获取登录用户 + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"1".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + request.setAttribute("loginUser", loginUser); + request.getRequestDispatcher("/jsp/landlord/house_add.jsp").forward(request, response); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + request.setCharacterEncoding("UTF-8"); + + // 获取登录用户 + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"1".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + // 获取表单参数 + String title = request.getParameter("title"); + String area = request.getParameter("area"); + String address = request.getParameter("address"); + String houseType = request.getParameter("houseType"); + String rentPriceStr = request.getParameter("rentPrice"); + String rentType = request.getParameter("rentType"); + String facility = request.getParameter("facility"); + String description = request.getParameter("description"); + + // 验证必填项 + if (title == null || title.trim().isEmpty()) { + request.setAttribute("error", "房源标题不能为空"); + doGet(request, response); + return; + } + + if (rentPriceStr == null || rentPriceStr.trim().isEmpty()) { + request.setAttribute("error", "租金不能为空"); + doGet(request, response); + return; + } + + // 处理图片上传 + Collection parts = request.getParts(); + String imgUrl = ImageUploadUtil.saveMultipleImages(parts, request); + + // 生成房源编号 + String houseNo = generateHouseNo(); + + // 创建房源对象 + House house = new House(); + house.setLandlordId(loginUser.getId()); + house.setHouseNo(houseNo); + house.setTitle(title); + house.setArea(area); + house.setAddress(address); + house.setHouseType(houseType); + house.setRentPrice(new BigDecimal(rentPriceStr)); + house.setRentType(rentType); + house.setFacility(facility); + house.setDescription(description); + house.setImgUrl(imgUrl); + house.setStatus("0"); // 默认待审核状态 + + // 使用Service层添加房源 + HouseService houseService = new HouseServiceImpl(); + HouseService.AddHouseResult result = houseService.addHouse(house); + + if (result.isSuccess()) { + String encodedMsg = URLEncoder.encode(result.getMessage(), "UTF-8"); + response.sendRedirect(request.getContextPath() + "/landlord/house/list?msg=" + encodedMsg); + } else { + request.setAttribute("error", result.getMessage()); + doGet(request, response); + } + } + + /** + * 生成房源编号 + */ + private String generateHouseNo() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); + return "H" + sdf.format(new Date()); + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/landlord/HouseDeleteController.java b/HRS/src/com/hrs/controller/landlord/HouseDeleteController.java new file mode 100644 index 0000000..c736592 --- /dev/null +++ b/HRS/src/com/hrs/controller/landlord/HouseDeleteController.java @@ -0,0 +1,111 @@ +package com.hrs.controller.landlord; + +import com.hrs.dao.HouseDao; +import com.hrs.dao.impl.HouseDaoImpl; +import com.hrs.dao.OrderDao; +import com.hrs.dao.impl.OrderDaoImpl; +import com.hrs.dao.ReservationDao; +import com.hrs.dao.impl.ReservationDaoImpl; +import com.hrs.model.entity.House; +import com.hrs.model.entity.User; +import com.hrs.util.ImageUploadUtil; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.net.URLEncoder; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: HouseDeleteController.java +* @Description: 删除房源控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午8:56:09 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/landlord/house/delete") +public class HouseDeleteController extends HttpServlet { + + private HouseDao houseDao = new HouseDaoImpl(); + private OrderDao orderDao = new OrderDaoImpl(); + private ReservationDao reservationDao = new ReservationDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + // 获取登录用户 + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"1".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + // 获取房源ID + String idStr = request.getParameter("id"); + if (idStr == null || idStr.trim().isEmpty()) { + response.sendRedirect(request.getContextPath() + "/landlord/house/list"); + return; + } + + Long houseId = Long.parseLong(idStr); + + // 先获取房源信息(为了删除图片) + House house = houseDao.findById(houseId); + + if (house == null) { + String encodedError = URLEncoder.encode("房源不存在", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/landlord/house/list?error=" + encodedError); + return; + } + + // 检查是否有关联的订单 + boolean hasOrders = orderDao.existsByHouseId(houseId); + if (hasOrders) { + String encodedError = URLEncoder.encode("该房源存在关联订单,无法删除", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/landlord/house/list?error=" + encodedError); + return; + } + + // 检查是否有关联的预约 + boolean hasReservations = reservationDao.existsByHouseId(houseId); + if (hasReservations) { + String encodedError = URLEncoder.encode("该房源存在关联预约,无法删除", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/landlord/house/list?error=" + encodedError); + return; + } + + // 删除数据库记录 + boolean success = houseDao.delete(houseId); + + if (success && house != null && house.getImgUrl() != null) { + // 删除图片文件 + ImageUploadUtil.deleteImages(house.getImgUrl(), request); + String encodedMsg = URLEncoder.encode("删除成功", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/landlord/house/list?msg=" + encodedMsg); + } else if (success) { + String encodedMsg = URLEncoder.encode("删除成功", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/landlord/house/list?msg=" + encodedMsg); + } else { + String encodedError = URLEncoder.encode("删除失败", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/landlord/house/list?error=" + encodedError); + } + } +} diff --git a/HRS/src/com/hrs/controller/landlord/HouseEditController.java b/HRS/src/com/hrs/controller/landlord/HouseEditController.java new file mode 100644 index 0000000..ae37bea --- /dev/null +++ b/HRS/src/com/hrs/controller/landlord/HouseEditController.java @@ -0,0 +1,138 @@ +package com.hrs.controller.landlord; + +import com.hrs.dao.HouseDao; +import com.hrs.dao.impl.HouseDaoImpl; +import com.hrs.model.entity.House; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.math.BigDecimal; +import java.net.URLEncoder; + + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: HouseEditController.java +* @Description: 编辑房源控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午8:56:25 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/landlord/house/edit") +public class HouseEditController extends HttpServlet { + + private HouseDao houseDao = new HouseDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + // 获取登录用户 + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"1".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + // 获取房源ID + String idStr = request.getParameter("id"); + if (idStr == null || idStr.trim().isEmpty()) { + response.sendRedirect(request.getContextPath() + "/landlord/house/list"); + return; + } + + Long houseId = Long.parseLong(idStr); + House house = houseDao.findById(houseId); + + // 验证是否是自己的房源 + if (house == null || !house.getLandlordId().equals(loginUser.getId())) { + response.sendRedirect(request.getContextPath() + "/landlord/house/list"); + return; + } + + request.setAttribute("house", house); + request.setAttribute("loginUser", loginUser); + request.getRequestDispatcher("/jsp/landlord/house_edit.jsp").forward(request, response); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + request.setCharacterEncoding("UTF-8"); + + // 获取登录用户 + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"1".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + // 获取表单参数 + String idStr = request.getParameter("id"); + String title = request.getParameter("title"); + String area = request.getParameter("area"); + String address = request.getParameter("address"); + String houseType = request.getParameter("houseType"); + String rentPriceStr = request.getParameter("rentPrice"); + String rentType = request.getParameter("rentType"); + String facility = request.getParameter("facility"); + String description = request.getParameter("description"); + String imgUrl = request.getParameter("imgUrl"); + + if (idStr == null || title == null || rentPriceStr == null) { + response.sendRedirect(request.getContextPath() + "/landlord/house/list"); + return; + } + + Long houseId = Long.parseLong(idStr); + + // 创建房源对象 + House house = new House(); + house.setId(houseId); + house.setTitle(title); + house.setArea(area); + house.setAddress(address); + house.setHouseType(houseType); + house.setRentPrice(new BigDecimal(rentPriceStr)); + house.setRentType(rentType); + house.setFacility(facility); + house.setDescription(description); + house.setImgUrl(imgUrl); + + boolean success = houseDao.update(house); + + if (success) { + String encodedMsg = URLEncoder.encode("房源修改成功", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/landlord/house/list?msg=" + encodedMsg); + } else { + request.setAttribute("error", "修改失败,请稍后重试"); + doGet(request, response); + } + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/landlord/HouseListController.java b/HRS/src/com/hrs/controller/landlord/HouseListController.java new file mode 100644 index 0000000..43dba57 --- /dev/null +++ b/HRS/src/com/hrs/controller/landlord/HouseListController.java @@ -0,0 +1,63 @@ +package com.hrs.controller.landlord; + +import com.hrs.dao.HouseDao; +import com.hrs.dao.impl.HouseDaoImpl; +import com.hrs.model.entity.House; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: HouseListController.java +* @Description: 房东房源列表控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午8:56:39 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/landlord/house/list") +public class HouseListController extends HttpServlet { + + private HouseDao houseDao = new HouseDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + // 获取登录用户 + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"1".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + // 查询房东自己的房源 + List houseList = houseDao.findByLandlordId(loginUser.getId()); + + request.setAttribute("houseList", houseList); + request.setAttribute("totalCount", houseList.size()); + request.setAttribute("loginUser", loginUser); + + request.getRequestDispatcher("/jsp/landlord/house_list.jsp").forward(request, response); + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/landlord/OrderConfirmController.java b/HRS/src/com/hrs/controller/landlord/OrderConfirmController.java new file mode 100644 index 0000000..af6babf --- /dev/null +++ b/HRS/src/com/hrs/controller/landlord/OrderConfirmController.java @@ -0,0 +1,79 @@ +package com.hrs.controller.landlord; + +import com.hrs.dao.OrderDao; +import com.hrs.dao.impl.OrderDaoImpl; +import com.hrs.model.entity.Order; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.net.URLEncoder; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: OrderConfirmController.java +* @Description: 房东确认签约控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午8:56:51 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/landlord/order/confirm") +public class OrderConfirmController extends HttpServlet { + + private OrderDao orderDao = new OrderDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"1".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + String orderIdStr = request.getParameter("id"); + if (orderIdStr == null) { + response.sendRedirect(request.getContextPath() + "/landlord/order/list"); + return; + } + + Long orderId = Long.parseLong(orderIdStr); + Order order = orderDao.findById(orderId); + + // 验证订单是否属于该房东的房源 + if (order == null) { + String encodedError = URLEncoder.encode("订单不存在", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/landlord/order/list?error=" + encodedError); + return; + } + + boolean success = orderDao.updateStatus(orderId, "1"); // 1-已签约 + + if (success) { + String encodedMsg = URLEncoder.encode("已确认签约", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/landlord/order/list?msg=" + encodedMsg); + } else { + String encodedError = URLEncoder.encode("操作失败", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/landlord/order/list?error=" + encodedError); + } + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/landlord/OrderManageController.java b/HRS/src/com/hrs/controller/landlord/OrderManageController.java new file mode 100644 index 0000000..6a1f919 --- /dev/null +++ b/HRS/src/com/hrs/controller/landlord/OrderManageController.java @@ -0,0 +1,61 @@ +package com.hrs.controller.landlord; + +import com.hrs.dao.OrderDao; +import com.hrs.dao.impl.OrderDaoImpl; +import com.hrs.model.entity.Order; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: OrderManageController.java +* @Description: 房东订单管理控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午9:01:28 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/landlord/order/list") +public class OrderManageController extends HttpServlet { + + private OrderDao orderDao = new OrderDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"1".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + List orderList = orderDao.findByLandlordId(loginUser.getId()); + + request.setAttribute("orderList", orderList); + request.setAttribute("totalCount", orderList.size()); + request.setAttribute("loginUser", loginUser); + + request.getRequestDispatcher("/jsp/landlord/order_list.jsp").forward(request, response); + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/landlord/ReservationHandleController.java b/HRS/src/com/hrs/controller/landlord/ReservationHandleController.java new file mode 100644 index 0000000..bcec474 --- /dev/null +++ b/HRS/src/com/hrs/controller/landlord/ReservationHandleController.java @@ -0,0 +1,76 @@ +package com.hrs.controller.landlord; + +import com.hrs.dao.ReservationDao; +import com.hrs.dao.impl.ReservationDaoImpl; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.net.URLEncoder; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: ReservationHandleController.java +* @Description: 房东处理预约控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午9:01:42 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/landlord/reservation/handle") +public class ReservationHandleController extends HttpServlet { + + private ReservationDao reservationDao = new ReservationDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + // 获取登录用户 + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"1".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + // 获取参数 + String idStr = request.getParameter("id"); + String action = request.getParameter("action"); // confirm 或 reject + + if (idStr == null || action == null) { + response.sendRedirect(request.getContextPath() + "/landlord/reservation/list"); + return; + } + + Long id = Long.parseLong(idStr); + String status = "confirm".equals(action) ? "1" : "2"; + + boolean success = reservationDao.updateStatus(id, status); + + if (success) { + String msg = "confirm".equals(action) ? "已确认预约" : "已拒绝预约"; + String encodedMsg = URLEncoder.encode(msg, "UTF-8"); + response.sendRedirect(request.getContextPath() + "/landlord/reservation/list?msg=" + encodedMsg); + } else { + String encodedError = URLEncoder.encode("操作失败", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/landlord/reservation/list?error=" + encodedError); + } + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/landlord/ReservationManageController.java b/HRS/src/com/hrs/controller/landlord/ReservationManageController.java new file mode 100644 index 0000000..5435470 --- /dev/null +++ b/HRS/src/com/hrs/controller/landlord/ReservationManageController.java @@ -0,0 +1,63 @@ +package com.hrs.controller.landlord; + +import com.hrs.dao.ReservationDao; +import com.hrs.dao.impl.ReservationDaoImpl; +import com.hrs.model.entity.Reservation; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: ReservationManageController.java +* @Description: 房东预约管理控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午9:02:01 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/landlord/reservation/list") +public class ReservationManageController extends HttpServlet { + + private ReservationDao reservationDao = new ReservationDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + // 获取登录用户 + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"1".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + // 查询收到的预约 + List reservationList = reservationDao.findByLandlordId(loginUser.getId()); + + request.setAttribute("reservationList", reservationList); + request.setAttribute("totalCount", reservationList.size()); + request.setAttribute("loginUser", loginUser); + + request.getRequestDispatcher("/jsp/landlord/reservation_list.jsp").forward(request, response); + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/user/CollectionAddController.java b/HRS/src/com/hrs/controller/user/CollectionAddController.java new file mode 100644 index 0000000..d72dd5f --- /dev/null +++ b/HRS/src/com/hrs/controller/user/CollectionAddController.java @@ -0,0 +1,89 @@ +package com.hrs.controller.user; + +import com.hrs.model.entity.User; +import com.hrs.service.CollectionService; +import com.hrs.service.impl.CollectionServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.io.PrintWriter; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: CollectionAddController.java +* @Description: 添加收藏控制器/AJAX请求,返回文本结果 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午9:02:40 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/user/collection/add") +public class CollectionAddController extends HttpServlet { + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + response.setContentType("text/plain;charset=UTF-8"); + PrintWriter out = response.getWriter(); + + // 1. 检查登录状态 + HttpSession session = request.getSession(false); + if (session == null) { + out.print("not_login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"0".equals(loginUser.getRoleType())) { + out.print("not_login"); + return; + } + + // 2. 获取房源ID + String houseIdStr = request.getParameter("houseId"); + if (houseIdStr == null || houseIdStr.trim().isEmpty()) { + out.print("error"); + return; + } + + Long houseId = null; + try { + houseId = Long.parseLong(houseIdStr); + } catch (NumberFormatException e) { + out.print("error"); + return; + } + + // 原来的代码 + // boolean exists = collectionDao.isCollected(loginUser.getId(), houseId); + // if (exists) { + // out.print("exists"); + // return; + // } + // boolean success = collectionDao.add(collection); + + // 修改为 + CollectionService collectionService = new CollectionServiceImpl(); + CollectionService.CollectionResult result = collectionService.addCollection(loginUser.getId(), houseId); + + if (result.isExists()) { + out.print("exists"); + } else if (result.isSuccess()) { + out.print("success"); + } else { + out.print("error"); + } + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/user/CollectionDeleteController.java b/HRS/src/com/hrs/controller/user/CollectionDeleteController.java new file mode 100644 index 0000000..19edde5 --- /dev/null +++ b/HRS/src/com/hrs/controller/user/CollectionDeleteController.java @@ -0,0 +1,127 @@ +package com.hrs.controller.user; + +import com.hrs.dao.CollectionDao; +import com.hrs.dao.impl.CollectionDaoImpl; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.io.PrintWriter; +import java.net.URLEncoder; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: CollectionDeleteController.java +* @Description: 取消收藏控制器/支持两种删除方式: +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午9:03:05 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/user/collection/delete") +public class CollectionDeleteController extends HttpServlet { + + private CollectionDao collectionDao = new CollectionDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + // 获取来源参数 + String from = request.getParameter("from"); + String idStr = request.getParameter("id"); + String houseIdStr = request.getParameter("houseId"); + + // 判断是否是AJAX请求 + String ajax = request.getParameter("ajax"); + + // 1. 获取登录用户 + HttpSession session = request.getSession(false); + if (session == null) { + if ("true".equals(ajax)) { + response.setContentType("application/json;charset=UTF-8"); + PrintWriter out = response.getWriter(); + out.print("{\"success\":false,\"msg\":\"未登录\"}"); + return; + } else { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"0".equals(loginUser.getRoleType())) { + if ("true".equals(ajax)) { + response.setContentType("application/json;charset=UTF-8"); + PrintWriter out = response.getWriter(); + out.print("{\"success\":false,\"msg\":\"未登录\"}"); + return; + } else { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + } + + boolean success = false; + + // 2. 根据ID删除(从收藏列表删除) + if (idStr != null && !idStr.trim().isEmpty()) { + Long id = Long.parseLong(idStr); + success = collectionDao.deleteById(id); + } + // 3. 根据房源ID删除(从详情页删除) + else if (houseIdStr != null && !houseIdStr.trim().isEmpty()) { + Long houseId = Long.parseLong(houseIdStr); + success = collectionDao.delete(loginUser.getId(), houseId); + } + + // 4. 处理返回结果 + if ("true".equals(ajax)) { + // AJAX请求:返回JSON + response.setContentType("application/json;charset=UTF-8"); + PrintWriter out = response.getWriter(); + if (success) { + out.print("{\"success\":true,\"msg\":\"取消收藏成功\"}"); + } else { + out.print("{\"success\":false,\"msg\":\"取消收藏失败\"}"); + } + } else { + // 普通请求:页面跳转 + if (success) { + // 根据来源参数决定跳转位置 + if ("detail".equals(from) && houseIdStr != null) { + // 从详情页删除,跳回详情页 + String encodedMsg = URLEncoder.encode("取消收藏成功", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/user/house/detail?id=" + houseIdStr + "&msg=" + encodedMsg); + } else if ("list".equals(from)) { + // 从收藏列表删除,跳回收藏列表 + String encodedMsg = URLEncoder.encode("取消收藏成功", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/user/collection/list?msg=" + encodedMsg); + } else { + // 默认跳回收藏列表 + String encodedMsg = URLEncoder.encode("取消收藏成功", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/user/collection/list?msg=" + encodedMsg); + } + } else { + if ("detail".equals(from) && houseIdStr != null) { + String encodedError = URLEncoder.encode("取消收藏失败", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/user/house/detail?id=" + houseIdStr + "&error=" + encodedError); + } else { + String encodedError = URLEncoder.encode("取消收藏失败", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/user/collection/list?error=" + encodedError); + } + } + } + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/user/CollectionListController.java b/HRS/src/com/hrs/controller/user/CollectionListController.java new file mode 100644 index 0000000..ad0390f --- /dev/null +++ b/HRS/src/com/hrs/controller/user/CollectionListController.java @@ -0,0 +1,65 @@ +package com.hrs.controller.user; + +import com.hrs.dao.CollectionDao; +import com.hrs.dao.impl.CollectionDaoImpl; +import com.hrs.model.entity.Collection; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: CollectionListController.java +* @Description: 我的收藏列表控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午9:03:32 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/user/collection/list") +public class CollectionListController extends HttpServlet { + + private CollectionDao collectionDao = new CollectionDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + // 1. 获取登录用户 + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"0".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + // 2. 查询收藏列表 + List collectionList = collectionDao.findByTenantId(loginUser.getId()); + + // 3. 存入request + request.setAttribute("collectionList", collectionList); + request.setAttribute("totalCount", collectionList.size()); + request.setAttribute("loginUser", loginUser); + + // 4. 转发到JSP + request.getRequestDispatcher("/jsp/user/collection_list.jsp").forward(request, response); + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/user/HouseDetailController.java b/HRS/src/com/hrs/controller/user/HouseDetailController.java new file mode 100644 index 0000000..727f755 --- /dev/null +++ b/HRS/src/com/hrs/controller/user/HouseDetailController.java @@ -0,0 +1,73 @@ +package com.hrs.controller.user; + +import com.hrs.dao.HouseDao; +import com.hrs.dao.impl.HouseDaoImpl; +import com.hrs.model.entity.House; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: HouseDetailController.java +* @Description: 房源详情控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午9:04:08 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/user/house/detail") +public class HouseDetailController extends HttpServlet { + + private HouseDao houseDao = new HouseDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + // 1. 获取房源ID + String idStr = request.getParameter("id"); + if (idStr == null || idStr.trim().isEmpty()) { + response.sendRedirect(request.getContextPath() + "/user/house/list"); + return; + } + + Long houseId = null; + try { + houseId = Long.parseLong(idStr); + } catch (NumberFormatException e) { + response.sendRedirect(request.getContextPath() + "/user/house/list"); + return; + } + + // 2. 查询房源详情 + House house = houseDao.findById(houseId); + if (house == null) { + response.sendRedirect(request.getContextPath() + "/user/house/list"); + return; + } + + // 3. 获取当前登录用户 + HttpSession session = request.getSession(false); + User loginUser = (User) session.getAttribute("loginUser"); + + // 4. 将数据存入request + request.setAttribute("house", house); + request.setAttribute("loginUser", loginUser); + + // 5. 转发到详情页面 + request.getRequestDispatcher("/jsp/user/house_detail.jsp").forward(request, response); + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/user/HouseListController.java b/HRS/src/com/hrs/controller/user/HouseListController.java new file mode 100644 index 0000000..110776f --- /dev/null +++ b/HRS/src/com/hrs/controller/user/HouseListController.java @@ -0,0 +1,74 @@ +package com.hrs.controller.user; + +import com.hrs.dao.HouseDao; +import com.hrs.dao.impl.HouseDaoImpl; +import com.hrs.model.entity.House; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: HouseListController.java +* @Description: 房源列表控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午9:04:41 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/user/house/list") +public class HouseListController extends HttpServlet { + + private HouseDao houseDao = new HouseDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + // 获取请求参数 + String area = request.getParameter("area"); + String minPriceStr = request.getParameter("minPrice"); + String maxPriceStr = request.getParameter("maxPrice"); + + List houseList; + + // 根据条件查询 + if (area != null && !area.trim().isEmpty()) { + houseList = houseDao.findHousesByArea(area); + request.setAttribute("searchArea", area); + } else if (minPriceStr != null && maxPriceStr != null && !minPriceStr.isEmpty() && !maxPriceStr.isEmpty()) { + int minPrice = Integer.parseInt(minPriceStr); + int maxPrice = Integer.parseInt(maxPriceStr); + houseList = houseDao.findHousesByPrice(minPrice, maxPrice); + request.setAttribute("minPrice", minPrice); + request.setAttribute("maxPrice", maxPrice); + } else { + houseList = houseDao.findPublishedHouses(); + } + + // 获取当前登录用户(用于判断是否已收藏) + HttpSession session = request.getSession(false); + User loginUser = (User) session.getAttribute("loginUser"); + + // 将数据存入request + request.setAttribute("houseList", houseList); + request.setAttribute("totalCount", houseList.size()); + request.setAttribute("loginUser", loginUser); + + // 转发到JSP页面 + request.getRequestDispatcher("/jsp/user/house_list.jsp").forward(request, response); + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/user/LoginController.java b/HRS/src/com/hrs/controller/user/LoginController.java new file mode 100644 index 0000000..01b0c47 --- /dev/null +++ b/HRS/src/com/hrs/controller/user/LoginController.java @@ -0,0 +1,120 @@ +package com.hrs.controller.user; + +import com.hrs.dao.UserDao; +import com.hrs.dao.impl.UserDaoImpl; +import com.hrs.service.UserService; +import com.hrs.service.impl.UserServiceImpl; +import com.hrs.model.entity.User; +import com.hrs.util.MD5Util; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: LoginController.java +* @Description: 登录控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午9:05:32 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/user/login") +public class LoginController extends HttpServlet { + + private UserDao userDao = new UserDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // GET请求:显示登录页面 + // 如果有消息(如注册成功),传递给页面 + String message = request.getParameter("message"); + if (message != null) { + request.setAttribute("message", message); + } + request.getRequestDispatcher("/jsp/user/login.jsp").forward(request, response); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // POST请求:处理登录表单提交 + request.setCharacterEncoding("UTF-8"); + + // 1. 获取表单参数 + String username = request.getParameter("username"); + String password = request.getParameter("password"); + String roleType = request.getParameter("roleType"); // 前端传:0-租客 1-房东 2-管理员 + + // 2. 基础验证 + if (username == null || username.trim().isEmpty() || + password == null || password.trim().isEmpty()) { + request.setAttribute("error", "用户名和密码不能为空"); + request.getRequestDispatcher("/jsp/user/login.jsp").forward(request, response); + return; + } + + // 3. 密码MD5加密(因为数据库里存的是MD5) + String encryptedPassword = MD5Util.md5(password); + + // 4. 调用Service查询用户 + UserService userService = new UserServiceImpl(); + User user = userService.login(username, password, roleType); + + // 5. 验证结果 + if (user == null) { + // 登录失败 + request.setAttribute("error", "用户名或密码错误"); + request.getRequestDispatcher("/jsp/user/login.jsp").forward(request, response); + return; + } + + // 6. 验证角色是否匹配 + if (!user.getRoleType().equals(roleType)) { + request.setAttribute("error", "角色类型不匹配"); + request.getRequestDispatcher("/jsp/user/login.jsp").forward(request, response); + return; + } + + // 7. 验证账号状态 + if ("2".equals(user.getStatus())) { + request.setAttribute("error", "账号已被禁用,请联系管理员"); + request.getRequestDispatcher("/jsp/user/login.jsp").forward(request, response); + return; + } + + // 8. 登录成功,保存用户信息到Session + HttpSession session = request.getSession(); + session.setAttribute("loginUser", user); + session.setAttribute("userRole", user.getRoleType()); + session.setMaxInactiveInterval(30 * 60); // 30分钟超时 + + // 9. 根据角色跳转到不同首页 + String redirectUrl = "/HRS/"; + switch (user.getRoleType()) { + case "0": // 租客 + redirectUrl = "/HRS/jsp/user/index.jsp"; + break; + case "1": // 房东 + redirectUrl = "/HRS/jsp/landlord/index.jsp"; + break; + case "2": // 管理员 + redirectUrl = "/HRS/jsp/admin/index.jsp"; + break; + } + + response.sendRedirect(redirectUrl); + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/user/LogoutController.java b/HRS/src/com/hrs/controller/user/LogoutController.java new file mode 100644 index 0000000..431f93d --- /dev/null +++ b/HRS/src/com/hrs/controller/user/LogoutController.java @@ -0,0 +1,50 @@ +package com.hrs.controller.user; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: LogoutController.java +* @Description: 退出登录控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午9:06:00 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/user/logout") +public class LogoutController extends HttpServlet { + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + // 1. 获取Session + HttpSession session = request.getSession(false); + + // 2. 如果Session存在,销毁它 + if (session != null) { + session.invalidate(); + } + + // 3. 跳转到登录页面 + response.sendRedirect(request.getContextPath() + "/user/login"); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + doGet(request, response); + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/user/OrderCancelController.java b/HRS/src/com/hrs/controller/user/OrderCancelController.java new file mode 100644 index 0000000..b1b8ecd --- /dev/null +++ b/HRS/src/com/hrs/controller/user/OrderCancelController.java @@ -0,0 +1,84 @@ +package com.hrs.controller.user; + +import com.hrs.dao.OrderDao; +import com.hrs.dao.impl.OrderDaoImpl; +import com.hrs.model.entity.Order; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.net.URLEncoder; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: OrderCancelController.java +* @Description: 取消订单控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午9:06:23 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/user/order/cancel") +public class OrderCancelController extends HttpServlet { + + private OrderDao orderDao = new OrderDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"0".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + String orderIdStr = request.getParameter("id"); + if (orderIdStr == null) { + response.sendRedirect(request.getContextPath() + "/user/order/list"); + return; + } + + Long orderId = Long.parseLong(orderIdStr); + Order order = orderDao.findById(orderId); + + if (order == null || !order.getTenantId().equals(loginUser.getId())) { + response.sendRedirect(request.getContextPath() + "/user/order/list"); + return; + } + + // 只有待支付的订单可以取消 + if (!"0".equals(order.getPayStatus())) { + String encodedError = URLEncoder.encode("该订单无法取消", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/user/order/list?error=" + encodedError); + return; + } + + boolean success = orderDao.updateStatus(orderId, "3"); // 3-已取消 + + if (success) { + String encodedMsg = URLEncoder.encode("订单已取消", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/user/order/list?msg=" + encodedMsg); + } else { + String encodedError = URLEncoder.encode("取消失败", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/user/order/list?error=" + encodedError); + } + } +} diff --git a/HRS/src/com/hrs/controller/user/OrderCreateController.java b/HRS/src/com/hrs/controller/user/OrderCreateController.java new file mode 100644 index 0000000..01822cb --- /dev/null +++ b/HRS/src/com/hrs/controller/user/OrderCreateController.java @@ -0,0 +1,166 @@ +package com.hrs.controller.user; + +import com.hrs.dao.HouseDao; +import com.hrs.dao.impl.HouseDaoImpl; +import com.hrs.model.entity.House; +import com.hrs.model.entity.User; +import com.hrs.service.OrderService; +import com.hrs.service.impl.OrderServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.net.URLEncoder; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.concurrent.TimeUnit; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: OrderCreateController.java +* @Description: 创建订单控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午9:06:38 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/user/order/create") +public class OrderCreateController extends HttpServlet { + + private HouseDao houseDao = new HouseDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + // 获取房源ID + String houseIdStr = request.getParameter("houseId"); + if (houseIdStr == null || houseIdStr.trim().isEmpty()) { + response.sendRedirect(request.getContextPath() + "/user/house/list"); + return; + } + + Long houseId = Long.parseLong(houseIdStr); + House house = houseDao.findById(houseId); + + if (house == null || !"1".equals(house.getStatus())) { + response.sendRedirect(request.getContextPath() + "/user/house/list"); + return; + } + + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"0".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + request.setAttribute("house", house); + request.setAttribute("loginUser", loginUser); + request.getRequestDispatcher("/jsp/user/order_create.jsp").forward(request, response); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + request.setCharacterEncoding("UTF-8"); + + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"0".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + String houseIdStr = request.getParameter("houseId"); + String startDateStr = request.getParameter("startDate"); + String endDateStr = request.getParameter("endDate"); + + if (houseIdStr == null || startDateStr == null || endDateStr == null) { + response.sendRedirect(request.getContextPath() + "/user/house/list"); + return; + } + + Long houseId = Long.parseLong(houseIdStr); + House house = houseDao.findById(houseId); + + if (house == null || !"1".equals(house.getStatus())) { + response.sendRedirect(request.getContextPath() + "/user/house/list"); + return; + } + + // 解析日期 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Date startDate, endDate; + try { + startDate = sdf.parse(startDateStr); + endDate = sdf.parse(endDateStr); + } catch (ParseException e) { + request.setAttribute("error", "日期格式错误"); + request.setAttribute("house", house); + request.getRequestDispatcher("/jsp/user/order_create.jsp").forward(request, response); + return; + } + + // 验证日期 + if (startDate.before(new Date())) { + request.setAttribute("error", "租赁开始日期不能早于今天"); + request.setAttribute("house", house); + request.getRequestDispatcher("/jsp/user/order_create.jsp").forward(request, response); + return; + } + + if (endDate.before(startDate)) { + request.setAttribute("error", "结束日期不能早于开始日期"); + request.setAttribute("house", house); + request.getRequestDispatcher("/jsp/user/order_create.jsp").forward(request, response); + return; + } + + // 修改为 + OrderService orderService = new OrderServiceImpl(); + OrderService.CreateOrderResult result = orderService.createOrder( + loginUser.getId(), houseId, startDate, endDate + ); + + if (result.isSuccess()) { + // 对中文消息进行 URL 编码 + String encodedMsg = URLEncoder.encode(result.getMessage(), "UTF-8"); + response.sendRedirect(request.getContextPath() + "/user/order/list?msg=" + encodedMsg); + } else { + request.setAttribute("error", result.getMessage()); + request.setAttribute("house", house); + request.getRequestDispatcher("/jsp/user/order_create.jsp").forward(request, response); + } + } + + /** + * 生成订单编号 + */ + private String generateOrderNo() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + return "ORD" + sdf.format(new Date()); + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/user/OrderListController.java b/HRS/src/com/hrs/controller/user/OrderListController.java new file mode 100644 index 0000000..90c2f47 --- /dev/null +++ b/HRS/src/com/hrs/controller/user/OrderListController.java @@ -0,0 +1,61 @@ +package com.hrs.controller.user; + +import com.hrs.dao.OrderDao; +import com.hrs.dao.impl.OrderDaoImpl; +import com.hrs.model.entity.Order; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: OrderListController.java +* @Description: 我的订单列表控制器(租客端) +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午9:07:07 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/user/order/list") +public class OrderListController extends HttpServlet { + + private OrderDao orderDao = new OrderDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"0".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + List orderList = orderDao.findByTenantId(loginUser.getId()); + + request.setAttribute("orderList", orderList); + request.setAttribute("totalCount", orderList.size()); + request.setAttribute("loginUser", loginUser); + + request.getRequestDispatcher("/jsp/user/order_list.jsp").forward(request, response); + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/user/OrderPayController.java b/HRS/src/com/hrs/controller/user/OrderPayController.java new file mode 100644 index 0000000..a06cf7f --- /dev/null +++ b/HRS/src/com/hrs/controller/user/OrderPayController.java @@ -0,0 +1,78 @@ +package com.hrs.controller.user; + +import com.hrs.dao.OrderDao; +import com.hrs.dao.impl.OrderDaoImpl; +import com.hrs.model.entity.Order; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.net.URLEncoder; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: OrderPayController.java +* @Description: 订单支付控制器(模拟支付) +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午9:07:43 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/user/order/pay") +public class OrderPayController extends HttpServlet { + + private OrderDao orderDao = new OrderDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"0".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + String orderIdStr = request.getParameter("id"); + if (orderIdStr == null) { + response.sendRedirect(request.getContextPath() + "/user/order/list"); + return; + } + + Long orderId = Long.parseLong(orderIdStr); + Order order = orderDao.findById(orderId); + + if (order == null || !order.getTenantId().equals(loginUser.getId())) { + response.sendRedirect(request.getContextPath() + "/user/order/list"); + return; + } + + // 模拟支付:更新支付状态为已支付 + boolean success = orderDao.updatePayStatus(orderId, "1"); + + if (success) { + String encodedMsg = URLEncoder.encode("支付成功", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/user/order/list?msg=" + encodedMsg); + } else { + String encodedError = URLEncoder.encode("支付失败", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/user/order/list?error=" + encodedError); + } + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/user/RegisterController.java b/HRS/src/com/hrs/controller/user/RegisterController.java new file mode 100644 index 0000000..0628f2d --- /dev/null +++ b/HRS/src/com/hrs/controller/user/RegisterController.java @@ -0,0 +1,84 @@ +package com.hrs.controller.user; + +import com.hrs.dao.UserDao; +import com.hrs.dao.impl.UserDaoImpl; +import com.hrs.model.entity.User; +import com.hrs.service.UserService; +import com.hrs.service.impl.UserServiceImpl; +import com.hrs.util.MD5Util; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.URLEncoder; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: RegisterController.java +* @Description: 注册控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午9:08:06 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/user/register") +public class RegisterController extends HttpServlet { + + private UserDao userDao = new UserDaoImpl(); + private UserService userService = new UserServiceImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // GET请求:显示注册页面 + request.getRequestDispatcher("/jsp/user/register.jsp").forward(request, response); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // POST请求:处理注册表单提交 + request.setCharacterEncoding("UTF-8"); + + // 1. 获取表单参数 + String username = request.getParameter("username"); + String password = request.getParameter("password"); + String confirmPassword = request.getParameter("confirmPassword"); + String realName = request.getParameter("realName"); + String phone = request.getParameter("phone"); + String idCard = request.getParameter("idCard"); + String roleType = request.getParameter("roleType"); + + // 2. 创建用户对象 + User user = new User(); + user.setUserName(username); + user.setPassword(password); // 密码将在Service层加密 + user.setRealName(realName); + user.setPhone(phone); + user.setIdCard(idCard); + user.setRoleType(roleType); // 0-租客 1-房东 + user.setStatus("0"); // 默认未认证状态 + + // 3. 调用UserService进行注册验证和保存 + UserService.RegisterResult result = userService.register(user, confirmPassword); + + if (result.isSuccess()) { + // 注册成功,跳转到登录页面(使用重定向避免表单重复提交) + String encodedMsg = URLEncoder.encode(result.getMessage(), "UTF-8"); + response.sendRedirect(request.getContextPath() + "/user/login?message=" + encodedMsg); + } else { + // 注册失败,留在注册页面显示错误 + request.setAttribute("error", result.getMessage()); + request.getRequestDispatcher("/jsp/user/register.jsp").forward(request, response); + } + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/user/ReservationAddController.java b/HRS/src/com/hrs/controller/user/ReservationAddController.java new file mode 100644 index 0000000..018cd90 --- /dev/null +++ b/HRS/src/com/hrs/controller/user/ReservationAddController.java @@ -0,0 +1,150 @@ +package com.hrs.controller.user; + +import com.hrs.dao.HouseDao; +import com.hrs.dao.impl.HouseDaoImpl; +import com.hrs.model.entity.House; +import com.hrs.model.entity.User; +import com.hrs.service.ReservationService; +import com.hrs.service.impl.ReservationServiceImpl; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.net.URLEncoder; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: ReservationAddController.java +* @Description: 添加预约控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午9:11:10 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/user/reservation/add") +public class ReservationAddController extends HttpServlet { + + private HouseDao houseDao = new HouseDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + String houseIdStr = request.getParameter("houseId"); + if (houseIdStr == null || houseIdStr.trim().isEmpty()) { + response.sendRedirect(request.getContextPath() + "/user/house/list"); + return; // ← 必须加return + } + + Long houseId = Long.parseLong(houseIdStr); + House house = houseDao.findById(houseId); + + if (house == null) { + response.sendRedirect(request.getContextPath() + "/user/house/list"); + return; // ← 必须加return + } + + HttpSession session = request.getSession(false); + User loginUser = (User) session.getAttribute("loginUser"); + + request.setAttribute("house", house); + request.setAttribute("loginUser", loginUser); + request.getRequestDispatcher("/jsp/user/reservation_add.jsp").forward(request, response); + // forward后不需要return,因为这是最后一行 + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + request.setCharacterEncoding("UTF-8"); + + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; // ← 必须加return + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"0".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; // ← 必须加return + } + + String houseIdStr = request.getParameter("houseId"); + String reserveDate = request.getParameter("reserveDate"); + String reserveTime = request.getParameter("reserveTime"); + String remark = request.getParameter("remark"); + + // 验证参数 + if (houseIdStr == null || reserveDate == null || reserveTime == null) { + // 错误时回到预约表单页 + request.setAttribute("error", "请填写完整信息"); + doGet(request, response); + return; // ← 必须加return + } + + Long houseId = Long.parseLong(houseIdStr); + House house = houseDao.findById(houseId); + + if (house == null) { + request.setAttribute("error", "房源不存在"); + doGet(request, response); + return; // ← 必须加return + } + + // 组合时间 + String datetimeStr = reserveDate + " " + reserveTime + ":00"; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date reserveDateTime; + try { + reserveDateTime = sdf.parse(datetimeStr); + } catch (Exception e) { + request.setAttribute("error", "时间格式错误"); + doGet(request, response); + return; // ← 必须加return + } + + if (reserveDateTime.before(new Date())) { + request.setAttribute("error", "预约时间不能早于当前时间"); + doGet(request, response); + return; // ← 必须加return + } + + // 原来的代码 + // Reservation reservation = new Reservation(); + // reservation.setTenantId(loginUser.getId()); + // reservation.setHouseId(houseId); + // reservation.setLandlordId(house.getLandlordId()); + // reservation.setReserveTime(reserveDateTime); + // reservation.setRemark(remark); + // boolean success = reservationDao.add(reservation); + + // 修改为 + ReservationService reservationService = new ReservationServiceImpl(); + ReservationService.ReservationResult result = reservationService.createReservation( + loginUser.getId(), houseId, reserveDateTime, remark + ); + + if (result.isSuccess()) { + // 对中文消息进行 URL 编码 + String encodedMsg = URLEncoder.encode(result.getMessage(), "UTF-8"); + response.sendRedirect(request.getContextPath() + "/user/reservation/list?msg=" + encodedMsg); + } else { + request.setAttribute("error", result.getMessage()); + doGet(request, response); + } + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/user/ReservationCancelController.java b/HRS/src/com/hrs/controller/user/ReservationCancelController.java new file mode 100644 index 0000000..dda6ce6 --- /dev/null +++ b/HRS/src/com/hrs/controller/user/ReservationCancelController.java @@ -0,0 +1,70 @@ +package com.hrs.controller.user; + +import com.hrs.dao.ReservationDao; +import com.hrs.dao.impl.ReservationDaoImpl; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.net.URLEncoder; +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: ReservationCancelController.java +* @Description: 取消预约控制器 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午9:12:10 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/user/reservation/cancel") +public class ReservationCancelController extends HttpServlet { + + private ReservationDao reservationDao = new ReservationDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; // ← 必须加return + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"0".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; // ← 必须加return + } + + String idStr = request.getParameter("id"); + if (idStr == null || idStr.trim().isEmpty()) { + response.sendRedirect(request.getContextPath() + "/user/reservation/list"); + return; // ← 必须加return + } + + Long id = Long.parseLong(idStr); + boolean success = reservationDao.cancel(id, loginUser.getId()); + + if (success) { + // ✅ 成功:重定向到预约列表,带成功消息 + String encodedMsg = URLEncoder.encode("取消预约成功", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/user/reservation/list?msg=" + encodedMsg); + } else { + // ❌ 失败:重定向到预约列表,带错误消息 + String encodedError = URLEncoder.encode("取消预约失败", "UTF-8"); + response.sendRedirect(request.getContextPath() + "/user/reservation/list?error=" + encodedError); + } + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/controller/user/ReservationListController.java b/HRS/src/com/hrs/controller/user/ReservationListController.java new file mode 100644 index 0000000..58739d8 --- /dev/null +++ b/HRS/src/com/hrs/controller/user/ReservationListController.java @@ -0,0 +1,63 @@ +package com.hrs.controller.user; + +import com.hrs.dao.ReservationDao; +import com.hrs.dao.impl.ReservationDaoImpl; +import com.hrs.model.entity.Reservation; +import com.hrs.model.entity.User; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: ReservationListController.java +* @Description: 我的预约列表控制器(租客端) +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午9:12:43 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +@WebServlet("/user/reservation/list") +public class ReservationListController extends HttpServlet { + + private ReservationDao reservationDao = new ReservationDaoImpl(); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + // 获取登录用户 + HttpSession session = request.getSession(false); + if (session == null) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null || !"0".equals(loginUser.getRoleType())) { + response.sendRedirect(request.getContextPath() + "/user/login"); + return; + } + + // 查询预约列表 + List reservationList = reservationDao.findByTenantId(loginUser.getId()); + + request.setAttribute("reservationList", reservationList); + request.setAttribute("totalCount", reservationList.size()); + request.setAttribute("loginUser", loginUser); + + request.getRequestDispatcher("/jsp/user/reservation_list.jsp").forward(request, response); + } +} \ No newline at end of file