From 9d981a5fdcc5f915483ca31670bbb41b5ceeb11e Mon Sep 17 00:00:00 2001 From: 2497223777 <2497223777@qq.com> Date: Tue, 14 Apr 2026 12:30:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=AE=8C=E6=95=B4=E6=9E=B6?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HRS/.classpath | 17 + HRS/.project | 31 + HRS/.settings/.jsdtscope | 12 + HRS/.settings/org.eclipse.jdt.core.prefs | 7 + .../org.eclipse.wst.common.component | 8 + ....eclipse.wst.common.project.facet.core.xml | 10 + ...rg.eclipse.wst.jsdt.ui.superType.container | 1 + .../org.eclipse.wst.jsdt.ui.superType.name | 1 + .../admin/AdminHouseAuditController.class | Bin 0 -> 3009 bytes .../admin/AdminHouseController.class | Bin 0 -> 2920 bytes .../admin/AdminHouseOfflineController.class | Bin 0 -> 2810 bytes .../admin/AdminHouseOnlineController.class | Bin 0 -> 2819 bytes .../admin/AdminOrderController.class | Bin 0 -> 2620 bytes .../admin/AdminStatisticsController.class | Bin 0 -> 2867 bytes .../admin/AdminUserController.class | Bin 0 -> 3705 bytes .../admin/AdminUserDeleteController.class | Bin 0 -> 2919 bytes .../admin/AdminUserStatusController.class | Bin 0 -> 2974 bytes .../landlord/HouseAddController.class | Bin 0 -> 5450 bytes .../landlord/HouseDeleteController.class | Bin 0 -> 4013 bytes .../landlord/HouseEditController.class | Bin 0 -> 4759 bytes .../landlord/HouseListController.class | Bin 0 -> 2698 bytes .../landlord/OrderConfirmController.class | Bin 0 -> 3084 bytes .../landlord/OrderManageController.class | Bin 0 -> 2704 bytes .../ReservationHandleController.class | Bin 0 -> 3042 bytes .../ReservationManageController.class | Bin 0 -> 2770 bytes .../user/CollectionAddController.class | Bin 0 -> 2945 bytes .../user/CollectionDeleteController.class | Bin 0 -> 4033 bytes .../user/CollectionListController.class | Bin 0 -> 2735 bytes .../user/HouseDetailController.class | Bin 0 -> 2888 bytes .../controller/user/HouseListController.class | Bin 0 -> 2813 bytes .../hrs/controller/user/LoginController.class | Bin 0 -> 3468 bytes .../controller/user/LogoutController.class | Bin 0 -> 1608 bytes .../user/OrderCancelController.class | Bin 0 -> 3236 bytes .../user/OrderCreateController.class | Bin 0 -> 5484 bytes .../controller/user/OrderListController.class | Bin 0 -> 2680 bytes .../controller/user/OrderPayController.class | Bin 0 -> 3087 bytes .../controller/user/RegisterController.class | Bin 0 -> 3344 bytes .../user/ReservationAddController.class | Bin 0 -> 5120 bytes .../user/ReservationCancelController.class | Bin 0 -> 2934 bytes .../user/ReservationListController.class | Bin 0 -> 2746 bytes .../classes/com/hrs/dao/CollectionDao.class | Bin 0 -> 494 bytes HRS/build/classes/com/hrs/dao/HouseDao.class | Bin 0 -> 1054 bytes HRS/build/classes/com/hrs/dao/OrderDao.class | Bin 0 -> 820 bytes .../classes/com/hrs/dao/ReservationDao.class | Bin 0 -> 681 bytes HRS/build/classes/com/hrs/dao/UserDao.class | Bin 0 -> 740 bytes .../com/hrs/dao/impl/CollectionDaoImpl.class | Bin 0 -> 5982 bytes .../com/hrs/dao/impl/HouseDaoImpl.class | Bin 0 -> 12751 bytes .../com/hrs/dao/impl/OrderDaoImpl.class | Bin 0 -> 10358 bytes .../com/hrs/dao/impl/ReservationDaoImpl.class | Bin 0 -> 8823 bytes .../com/hrs/dao/impl/UserDaoImpl.class | Bin 0 -> 8877 bytes .../com/hrs/filter/EncodingFilter.class | Bin 0 -> 1652 bytes .../classes/com/hrs/filter/LoginFilter.class | Bin 0 -> 3305 bytes .../com/hrs/model/entity/Collection.class | Bin 0 -> 2075 bytes .../classes/com/hrs/model/entity/House.class | Bin 0 -> 5548 bytes .../classes/com/hrs/model/entity/Order.class | Bin 0 -> 5187 bytes .../com/hrs/model/entity/Reservation.class | Bin 0 -> 4466 bytes .../classes/com/hrs/model/entity/User.class | Bin 0 -> 4220 bytes .../CollectionService$CollectionResult.class | Bin 0 -> 1072 bytes .../com/hrs/service/CollectionService.class | Bin 0 -> 688 bytes .../service/HouseService$AddHouseResult.class | Bin 0 -> 863 bytes .../HouseService$UpdateHouseResult.class | Bin 0 -> 872 bytes .../com/hrs/service/HouseService.class | Bin 0 -> 1200 bytes .../OrderService$CreateOrderResult.class | Bin 0 -> 1581 bytes .../com/hrs/service/OrderService.class | Bin 0 -> 890 bytes ...ReservationService$ReservationResult.class | Bin 0 -> 896 bytes .../com/hrs/service/ReservationService.class | Bin 0 -> 874 bytes .../service/UserService$RegisterResult.class | Bin 0 -> 859 bytes .../classes/com/hrs/service/UserService.class | Bin 0 -> 430 bytes .../service/impl/CollectionServiceImpl.class | Bin 0 -> 4251 bytes .../hrs/service/impl/HouseServiceImpl.class | Bin 0 -> 4681 bytes .../hrs/service/impl/OrderServiceImpl.class | Bin 0 -> 6057 bytes .../service/impl/ReservationServiceImpl.class | Bin 0 -> 4605 bytes .../hrs/service/impl/UserServiceImpl.class | Bin 0 -> 2905 bytes HRS/build/classes/com/hrs/util/DBUtil.class | Bin 0 -> 2676 bytes .../com/hrs/util/ImageUploadUtil.class | Bin 0 -> 6022 bytes HRS/build/classes/com/hrs/util/MD5Util.class | Bin 0 -> 2372 bytes HRS/sql/hrs_init.sql | 170 +++ .../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 ++ HRS/src/com/hrs/dao/CollectionDao.java | 136 +++ HRS/src/com/hrs/dao/HouseDao.java | 307 ++++++ HRS/src/com/hrs/dao/OrderDao.java | 250 +++++ HRS/src/com/hrs/dao/ReservationDao.java | 193 ++++ HRS/src/com/hrs/dao/UserDao.java | 250 +++++ .../com/hrs/dao/impl/CollectionDaoImpl.java | 224 ++++ HRS/src/com/hrs/dao/impl/HouseDaoImpl.java | 548 ++++++++++ HRS/src/com/hrs/dao/impl/OrderDaoImpl.java | 435 ++++++++ .../com/hrs/dao/impl/ReservationDaoImpl.java | 338 ++++++ HRS/src/com/hrs/dao/impl/UserDaoImpl.java | 602 +++++++++++ HRS/src/com/hrs/filter/EncodingFilter.java | 49 + HRS/src/com/hrs/filter/LoginFilter.java | 104 ++ HRS/src/com/hrs/model/entity/Collection.java | 369 +++++++ HRS/src/com/hrs/model/entity/House.java | 964 ++++++++++++++++++ HRS/src/com/hrs/model/entity/Order.java | 839 +++++++++++++++ HRS/src/com/hrs/model/entity/Reservation.java | 743 ++++++++++++++ HRS/src/com/hrs/model/entity/User.java | 707 +++++++++++++ .../com/hrs/service/CollectionService.java | 71 ++ HRS/src/com/hrs/service/HouseService.java | 94 ++ HRS/src/com/hrs/service/OrderService.java | 91 ++ .../com/hrs/service/ReservationService.java | 71 ++ HRS/src/com/hrs/service/UserService.java | 51 + .../service/impl/CollectionServiceImpl.java | 156 +++ .../hrs/service/impl/HouseServiceImpl.java | 194 ++++ .../hrs/service/impl/OrderServiceImpl.java | 241 +++++ .../service/impl/ReservationServiceImpl.java | 187 ++++ .../com/hrs/service/impl/UserServiceImpl.java | 128 +++ HRS/src/com/hrs/util/DBUtil.java | 158 +++ HRS/src/com/hrs/util/ImageUploadUtil.java | 251 +++++ HRS/src/com/hrs/util/MD5Util.java | 142 +++ 139 files changed, 11909 insertions(+) create mode 100644 HRS/.classpath create mode 100644 HRS/.project create mode 100644 HRS/.settings/.jsdtscope create mode 100644 HRS/.settings/org.eclipse.jdt.core.prefs create mode 100644 HRS/.settings/org.eclipse.wst.common.component create mode 100644 HRS/.settings/org.eclipse.wst.common.project.facet.core.xml create mode 100644 HRS/.settings/org.eclipse.wst.jsdt.ui.superType.container create mode 100644 HRS/.settings/org.eclipse.wst.jsdt.ui.superType.name create mode 100644 HRS/build/classes/com/hrs/controller/admin/AdminHouseAuditController.class create mode 100644 HRS/build/classes/com/hrs/controller/admin/AdminHouseController.class create mode 100644 HRS/build/classes/com/hrs/controller/admin/AdminHouseOfflineController.class create mode 100644 HRS/build/classes/com/hrs/controller/admin/AdminHouseOnlineController.class create mode 100644 HRS/build/classes/com/hrs/controller/admin/AdminOrderController.class create mode 100644 HRS/build/classes/com/hrs/controller/admin/AdminStatisticsController.class create mode 100644 HRS/build/classes/com/hrs/controller/admin/AdminUserController.class create mode 100644 HRS/build/classes/com/hrs/controller/admin/AdminUserDeleteController.class create mode 100644 HRS/build/classes/com/hrs/controller/admin/AdminUserStatusController.class create mode 100644 HRS/build/classes/com/hrs/controller/landlord/HouseAddController.class create mode 100644 HRS/build/classes/com/hrs/controller/landlord/HouseDeleteController.class create mode 100644 HRS/build/classes/com/hrs/controller/landlord/HouseEditController.class create mode 100644 HRS/build/classes/com/hrs/controller/landlord/HouseListController.class create mode 100644 HRS/build/classes/com/hrs/controller/landlord/OrderConfirmController.class create mode 100644 HRS/build/classes/com/hrs/controller/landlord/OrderManageController.class create mode 100644 HRS/build/classes/com/hrs/controller/landlord/ReservationHandleController.class create mode 100644 HRS/build/classes/com/hrs/controller/landlord/ReservationManageController.class create mode 100644 HRS/build/classes/com/hrs/controller/user/CollectionAddController.class create mode 100644 HRS/build/classes/com/hrs/controller/user/CollectionDeleteController.class create mode 100644 HRS/build/classes/com/hrs/controller/user/CollectionListController.class create mode 100644 HRS/build/classes/com/hrs/controller/user/HouseDetailController.class create mode 100644 HRS/build/classes/com/hrs/controller/user/HouseListController.class create mode 100644 HRS/build/classes/com/hrs/controller/user/LoginController.class create mode 100644 HRS/build/classes/com/hrs/controller/user/LogoutController.class create mode 100644 HRS/build/classes/com/hrs/controller/user/OrderCancelController.class create mode 100644 HRS/build/classes/com/hrs/controller/user/OrderCreateController.class create mode 100644 HRS/build/classes/com/hrs/controller/user/OrderListController.class create mode 100644 HRS/build/classes/com/hrs/controller/user/OrderPayController.class create mode 100644 HRS/build/classes/com/hrs/controller/user/RegisterController.class create mode 100644 HRS/build/classes/com/hrs/controller/user/ReservationAddController.class create mode 100644 HRS/build/classes/com/hrs/controller/user/ReservationCancelController.class create mode 100644 HRS/build/classes/com/hrs/controller/user/ReservationListController.class create mode 100644 HRS/build/classes/com/hrs/dao/CollectionDao.class create mode 100644 HRS/build/classes/com/hrs/dao/HouseDao.class create mode 100644 HRS/build/classes/com/hrs/dao/OrderDao.class create mode 100644 HRS/build/classes/com/hrs/dao/ReservationDao.class create mode 100644 HRS/build/classes/com/hrs/dao/UserDao.class create mode 100644 HRS/build/classes/com/hrs/dao/impl/CollectionDaoImpl.class create mode 100644 HRS/build/classes/com/hrs/dao/impl/HouseDaoImpl.class create mode 100644 HRS/build/classes/com/hrs/dao/impl/OrderDaoImpl.class create mode 100644 HRS/build/classes/com/hrs/dao/impl/ReservationDaoImpl.class create mode 100644 HRS/build/classes/com/hrs/dao/impl/UserDaoImpl.class create mode 100644 HRS/build/classes/com/hrs/filter/EncodingFilter.class create mode 100644 HRS/build/classes/com/hrs/filter/LoginFilter.class create mode 100644 HRS/build/classes/com/hrs/model/entity/Collection.class create mode 100644 HRS/build/classes/com/hrs/model/entity/House.class create mode 100644 HRS/build/classes/com/hrs/model/entity/Order.class create mode 100644 HRS/build/classes/com/hrs/model/entity/Reservation.class create mode 100644 HRS/build/classes/com/hrs/model/entity/User.class create mode 100644 HRS/build/classes/com/hrs/service/CollectionService$CollectionResult.class create mode 100644 HRS/build/classes/com/hrs/service/CollectionService.class create mode 100644 HRS/build/classes/com/hrs/service/HouseService$AddHouseResult.class create mode 100644 HRS/build/classes/com/hrs/service/HouseService$UpdateHouseResult.class create mode 100644 HRS/build/classes/com/hrs/service/HouseService.class create mode 100644 HRS/build/classes/com/hrs/service/OrderService$CreateOrderResult.class create mode 100644 HRS/build/classes/com/hrs/service/OrderService.class create mode 100644 HRS/build/classes/com/hrs/service/ReservationService$ReservationResult.class create mode 100644 HRS/build/classes/com/hrs/service/ReservationService.class create mode 100644 HRS/build/classes/com/hrs/service/UserService$RegisterResult.class create mode 100644 HRS/build/classes/com/hrs/service/UserService.class create mode 100644 HRS/build/classes/com/hrs/service/impl/CollectionServiceImpl.class create mode 100644 HRS/build/classes/com/hrs/service/impl/HouseServiceImpl.class create mode 100644 HRS/build/classes/com/hrs/service/impl/OrderServiceImpl.class create mode 100644 HRS/build/classes/com/hrs/service/impl/ReservationServiceImpl.class create mode 100644 HRS/build/classes/com/hrs/service/impl/UserServiceImpl.class create mode 100644 HRS/build/classes/com/hrs/util/DBUtil.class create mode 100644 HRS/build/classes/com/hrs/util/ImageUploadUtil.class create mode 100644 HRS/build/classes/com/hrs/util/MD5Util.class create mode 100644 HRS/sql/hrs_init.sql 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 create mode 100644 HRS/src/com/hrs/dao/CollectionDao.java create mode 100644 HRS/src/com/hrs/dao/HouseDao.java create mode 100644 HRS/src/com/hrs/dao/OrderDao.java create mode 100644 HRS/src/com/hrs/dao/ReservationDao.java create mode 100644 HRS/src/com/hrs/dao/UserDao.java create mode 100644 HRS/src/com/hrs/dao/impl/CollectionDaoImpl.java create mode 100644 HRS/src/com/hrs/dao/impl/HouseDaoImpl.java create mode 100644 HRS/src/com/hrs/dao/impl/OrderDaoImpl.java create mode 100644 HRS/src/com/hrs/dao/impl/ReservationDaoImpl.java create mode 100644 HRS/src/com/hrs/dao/impl/UserDaoImpl.java create mode 100644 HRS/src/com/hrs/filter/EncodingFilter.java create mode 100644 HRS/src/com/hrs/filter/LoginFilter.java create mode 100644 HRS/src/com/hrs/model/entity/Collection.java create mode 100644 HRS/src/com/hrs/model/entity/House.java create mode 100644 HRS/src/com/hrs/model/entity/Order.java create mode 100644 HRS/src/com/hrs/model/entity/Reservation.java create mode 100644 HRS/src/com/hrs/model/entity/User.java create mode 100644 HRS/src/com/hrs/service/CollectionService.java create mode 100644 HRS/src/com/hrs/service/HouseService.java create mode 100644 HRS/src/com/hrs/service/OrderService.java create mode 100644 HRS/src/com/hrs/service/ReservationService.java create mode 100644 HRS/src/com/hrs/service/UserService.java create mode 100644 HRS/src/com/hrs/service/impl/CollectionServiceImpl.java create mode 100644 HRS/src/com/hrs/service/impl/HouseServiceImpl.java create mode 100644 HRS/src/com/hrs/service/impl/OrderServiceImpl.java create mode 100644 HRS/src/com/hrs/service/impl/ReservationServiceImpl.java create mode 100644 HRS/src/com/hrs/service/impl/UserServiceImpl.java create mode 100644 HRS/src/com/hrs/util/DBUtil.java create mode 100644 HRS/src/com/hrs/util/ImageUploadUtil.java create mode 100644 HRS/src/com/hrs/util/MD5Util.java diff --git a/HRS/.classpath b/HRS/.classpath new file mode 100644 index 0000000..cd67f69 --- /dev/null +++ b/HRS/.classpath @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/HRS/.project b/HRS/.project new file mode 100644 index 0000000..91242a4 --- /dev/null +++ b/HRS/.project @@ -0,0 +1,31 @@ + + + HRS + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.jdt.core.javanature + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/HRS/.settings/.jsdtscope b/HRS/.settings/.jsdtscope new file mode 100644 index 0000000..92e666d --- /dev/null +++ b/HRS/.settings/.jsdtscope @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/HRS/.settings/org.eclipse.jdt.core.prefs b/HRS/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..0c68a61 --- /dev/null +++ b/HRS/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/HRS/.settings/org.eclipse.wst.common.component b/HRS/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000..b729e7b --- /dev/null +++ b/HRS/.settings/org.eclipse.wst.common.component @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/HRS/.settings/org.eclipse.wst.common.project.facet.core.xml b/HRS/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..95377b2 --- /dev/null +++ b/HRS/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/HRS/.settings/org.eclipse.wst.jsdt.ui.superType.container b/HRS/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000..3bd5d0a --- /dev/null +++ b/HRS/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/HRS/.settings/org.eclipse.wst.jsdt.ui.superType.name b/HRS/.settings/org.eclipse.wst.jsdt.ui.superType.name new file mode 100644 index 0000000..05bd71b --- /dev/null +++ b/HRS/.settings/org.eclipse.wst.jsdt.ui.superType.name @@ -0,0 +1 @@ +Window \ No newline at end of file diff --git a/HRS/build/classes/com/hrs/controller/admin/AdminHouseAuditController.class b/HRS/build/classes/com/hrs/controller/admin/AdminHouseAuditController.class new file mode 100644 index 0000000000000000000000000000000000000000..36e770167e6cc44605ff0129fe095ed29db24d27 GIT binary patch literal 3009 zcma)8TXPgu5dO|)lbP%e2`twYiI5P;g)k5hV!|y6Nk|9;6B0}ib+UU*26lIrnb`;` zii(0<6u}#KDXkKDv&6z&K*cJmu=G(M`~wh?7ax2D%RaNaVPF$NRWf_dneNkHcYobI zzx{XVCjcw)i3ATrWypxC{idacjF@d2kq9?cEgaQjYOQ!~G7=WAO@wv3e(b#jFGIm@ zZ9vX!Va-sTE9tz3A!m&q)9rN(StX@i z4BmPp%zem$Ux5T!!W4#iZdE-RkBsRz)5Zq{{#-CjRgjGwhWu7N#>~=HW331q{Ux1yaF$EFklJ-0t9( zMfMqrN_t8s#_kB!NGM{M?Er{qu|BoKHuYFvT|$q9xhX&tD_DfZ40&|3AQ9hZZ`164 zh8ZQv%Tl?;BB_-d*Vqfd|dP>7WZ9>*#osTPm(SeT(=JY6R|ZVytPlOu(wQt*Uu zUAB#+EkA0oR>B&>K3P(dlu)ovz*a0m(9XlUNj}Qhz>w?U>?Fi~)M2B9`V6YLYSKxS zf(A6wU6hAfo3hlKu&F-o31T`TF0WE?m9U8+m@dXB6>3D~F5i>#gmFci%|95lZ$lvdSrAkc=WKKPN#w{>_|f1rkPrl z+uWQSa>@%C-6DG-QA;v*GE7T#Hm5VG5#6$V*o9{$JVWff%eGb{)~Db(XcXnRW?Ebv z+y^%us1|WUNHCKKGQFh5O+TSlBZG)45rs@+fXg7-v*j{&)6WV&B8W+dQYED0>h6yU z48+OzL_Dn7yu;S)1O=_wO+v?lD_3b$6hsPB!RV1IqnA$J_~y&eFNXgGkWaQUzb0VF+eS@b9-Y&l@I&yqJ;hF4ilqJ-`U>U5DQWM zO$9IEWsy&3%TVQpmVz=4xXdFNuh5XlNY47G)wfp0L5jiX=@Zv~{Pf0G7j9lWC*yU7 zIhoSjG!1ht1=~z^U53SusfmYFx;;~Ynmk!=3`r**q?BsbWXVc5%J~ypN_I(xxnr{? zqj+ef_#93)hbe4gWZflWDvo3{Y|-MW!RYHS5@v`u>SA;jO!x_~Q~;!Y(4L?c5anIErPFY&jl~SY zAx0Mw^}dj3V=vVmyf-z*#4vT*IXQh#Mm6!tfdw?#v*=@m8iE+_wDQoJJ`L!ZOS?LH z%jkD%*${kXm!WhIA@6(SUvMO+(KFA{FM=1v$VU+ZbfzSAFdZ{!=fzCSqI+l4I){Ge z;1O}R=S6y>km<(qtPwow!PbgjP`KnW3cJfku#jOGB|}&mSU!jqgIGO+Y7Z_{1lEtB z)`OqXRP7CVuVHGSIp`h4=0R*dJE?YgpnU|}J*dtu4?LAztcFD=2T+Z}G&0X&4ZfyH_$}7sDr)gN>hUKw;ucM`e`%)8LK6$pfGR{YYrtkF z%ZD&UWG|Ivv3diCMCNJrCf=e<%WNIpeuQvUu{>sxGAMeqbkB}7M6s`P(qX?&+v-io@W$@n?-!yf%Q6QnI x;11?VD5bxG+n6I^S1m2?U?Dx3SS~9kY#)%GhwOetzj=iEWBNa{6U@Td{{i9nMR@=K literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/admin/AdminHouseController.class b/HRS/build/classes/com/hrs/controller/admin/AdminHouseController.class new file mode 100644 index 0000000000000000000000000000000000000000..a20f694ed106da99383e4192fa5203793bc79f95 GIT binary patch literal 2920 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 B3$OqH literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/admin/AdminHouseOnlineController.class b/HRS/build/classes/com/hrs/controller/admin/AdminHouseOnlineController.class new file mode 100644 index 0000000000000000000000000000000000000000..7e79d260ddebc264ff0debc62bf3e6f2dbd0e450 GIT binary patch literal 2819 zcmb7GYi|@~6n@_Ac4xXfv}L)jNP$+M7s_y_b}7(8DXj~|mKG`Arn@iQf!Ud5X0{e@ zcn47wV}j8b5)zGH!9Xt%(NCKA5Bz8XjehVSpz*x37nW{IHJhDzujf4HIk)-spWAl< zY{O>~d<89E)o(HXr!+T9bH~GH80SSJFnp4`SHl{k< z9yPeDCS5nJ9;8Qqc7Z`oio5$Yi(zRjuO*>bswb1yqYQyvx~aRn8OrJ#1{wVOtOO6D z3?T&)WC;rxRu*5?Q)#1czndmOC3O!=r+QVCPtzr(K;E zBt%M>&JkQVBw+=^A^}6yEw#J1uo1#atddZ}u=YQJRInOrNc{+R`?=$geuldGp@zA! zdxxSD>KK-J01V9>QTtt6H%B@$x{=_v0I^oVI;>}?B*`L*_?UY{bCV2<>$AeuqI=OG z8qg%6k$gH+rh*MKMMnrFM~(Nk%7N*OtmDLqO6m1fA z5%&35jq1325~G4`G{s~DeiK6e#kj1WE^K$ zn5$=AIZ_SXaf3L47bHAS5&1B}VwO3g;6=Pd%%(Nl;bLJ1#5_4YLV_luahOuCzNa|k z#I>jliWasxgp){0ATf*cycHKf1v*ZVZJBgJb9uk3xfvp5ZE=u!(u#bMM?fSQ1aA7m zkJGm=-=FyY&-0h2uUx-3d2#ycxC~0%@`0lVnp=WM!we(By1U*G@c#veDomGLUW^3v1X zwk^Aj(%a4!O@{TJs=1p?zPeI=**u#r3|S){cPUqENt2VWbF1gplr3@$D+;}$B=)Hz z1ikR;P7rOPvIi3)*eKPIPn=NcA zo5GVm9B%#vwHxlB_IT42o?@6p{RB3KH;-fMICf5<)rT9+;XPAm_u(gWwfZCepHUs| zj`+v%%s38zHSg`FaNiV;`p{Y)DW6r>bH%zM<&zki#LKOL#+#^$1j6wt@G|U>mPlV> zOZap+H3_R#E=8OnDG|9y)OS$BugrP;?9AhW+%gDq2Z=hMp4`zuq&Cv8iGCZ=0u?>j zgd{doRoX_CVLQgK16QyUU!WD&sBc|I8*WiMx{E#d9eZ&P?f45FtQz}0C!Iu4ke_ps z7`=wqh2v=S2Hqq`$*cnB@D^cd!EYqtZE~1{t9S?RQm|a3YV{u8CzoD_h7WL_!sagO zaDjGZ(o}~Jz0pOoU?l<%#Aias1Jp?9s(FBB2@QWECgB8YB2^#JAs;@*C3;s9h)?MM K=?O3gm;VLsR}Xyv literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/admin/AdminOrderController.class b/HRS/build/classes/com/hrs/controller/admin/AdminOrderController.class new file mode 100644 index 0000000000000000000000000000000000000000..3196fd82c59a435830d4b350a9f1b19b9841b012 GIT binary patch literal 2620 zcma)8S##576g{8qAY+Rpn5`})Kq!#JNd%OwaT>A!Av6%0Kxm*XRcw(c$dZxd5a>ep z_OZ`A_N}}z(}udtbo$iJ^fxh`o==jEvlSk!<$k)$x%b?A{m;L@{{i4Qeozn-=qWfQ zZQk{?f@AxxV_Al)>BW+1YeVun;T8>dq<*9zA<(vNjoE9}tLlbWRH-Mx3INLL6xo3X%%82<&N8HA`iy zu0O_?6jY=)L!ebf6E+F7jGMM`xl)=n+^hPmWe8-(oq}#n>#ix^BVodyH$4HZ9@r}Z zXT(iKXVmZoCOgLeKLL}*-HPG)`Imm?l^xqN@)CdQ+)}|P`z8envTJf2rMCW&g53h! zWEh(1Xk!!ggEaPFuYxv#gRc~%ihbBm_j86nWq2O_3moXU(YbN#!AE%o2LyHn0a&^{ zr%m~;Y0nK;OpBG5K^#>?XvJ>4KZjR+#-1k#SvD&CgRlfD!BN+XYV6!bIpmlY+Xgo*(fw(2p0 zNuy}G#F)gOz~&&%Ym7LJVVqSkvW6-R?HH6w#W|d(E!JVkXO(6vK3ii&5^EW0Ko#Xx z!3BYAtq)7=QA;yy-}LWmGKeHD3W#GVjAC5HB?&rBKa&o-?S7g4+=&SlSMVP5$)?aP zHr|R_)XH}wjVWAHaFzV1d21XPDyDIrB)Dzb#UaaLYu8v*@l8t`H`#7U%rHU0=#lS| zgf~@ufDeO2HiAFAPD$5dmjt=R*6?bO_Mqb3TDabfTeZcDvDrI6Q22iH%_#% z6y{(mAm6vXAoLj9V9szQqZc?DJH{Gm8yyk`;bpZ2uN=+c0MRXrka{VUuxu3$%1o8a zbvSI!nqFD=3-g96aAF;Js~dWaT0RXIz5-Tg?@E%c`BX&(i?SGwdrx=SB7>pB7b_te zR~rn%`f0=bQ```Tz~PNYPq1%lM%iDk5n2#f9Y8}9L`sn_hV9kn+`f%Hg+oqYcYRB& z;XXG)Yef8SHEe9JiKR`=crhL6{=aOEI45X%QJ#*WQqAlfc1d;Zj%yS+5^z*NxezFm&D&Ok0w-k%OA#Aog?R z#`yq=j|2{&h4wO( zsi6+GVLRUv*nyq2yNl18cz+GAOWQ){iS+n57q8-t7%unxjrQ(mXrIYd@ut9U=y;0W z%+Y1MwTx3$^u_R`Cv&EXp&0(eXkQ|m_zSI>v20=)?=Iu=qnB!T{eqS%CI$MMa+&wD zO;y~8BbWI|K7A}5-i{<^vWe*FP8FpXa@|$jjYFbNK%(v=Zg3zb(M7a5Ub}hKa2iK& z5l1nPV=%dUe4N7Pl>W#i@`#J$XY>ad8VHd`8Db7_4@*JT9^*b9FiT1Ngir7(vwNDo zJc!Te*~dxD&|VWB(!0!ZDEWetFDYq3{JGq`!_U#CV6=^9zM?pWukj7<%~bf7zwd5B Hc=-N5_8Hl# literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/admin/AdminStatisticsController.class b/HRS/build/classes/com/hrs/controller/admin/AdminStatisticsController.class new file mode 100644 index 0000000000000000000000000000000000000000..caeaae8fc3660c36f0486fd4b8e48251cdb60613 GIT binary patch literal 2867 zcma)8+fx%)9R5xSY)DptC@5a2#fpI7s`W|~iztFcu^?Er7nfuui%T|UHx%v7-n94D z+S=A$wXc0~rsAYdJAGaOXyX58s6@)ZOH8picWeM)nT%%o+w zTGDmXS}%Wwe1d?IC2zNG3)J=(d?a*R8}`XDfl$(>j3-iemq>4(E@kXYB5&qynSnf= zG8Nm+l<9T~lr^`E2n4(Bgb_v=s#HXvDyR`yR*Jx!NLvLMeLROzjjBorEL2gB3I%ln z%V#MRK=~TAzDB(Y1tA4X@1;?I=xZ$TH5yb@A}mnVZ>Ed`*@;mjb4VYx41s9B9oMZ9 zJ!8uEJTd4dO-Ep3F+LBTCPt<_Ved6ufx+hf|4-MTaVl##ZtT8dPTEd6Moh*zyk{zI zq+OE)1*>OOM7|J;LJC?07DyPHX={B0MMeZ`(5|3OVATVGRIwHs-H#dWkl{G=FR-%t zXv^H#J)u|x>+z_94FXN~^W)!AWs__YsC4LvZIERig3Wy`BOz=d)w0LTlq}{5wjrjV zV^#!8dcs4XVmo#Ss07~Sx*2mc>oV<4er_~NPmO6qB&Wt={#|_1!05OUcj;iKKz*Sq zCs^W^W~5xxJ?)ip2wehVLl~XtR zs8pfQTq;JSM#$6XvaAT6l;THbh!;9bT05rVDLgGubHYp|4jQQh1L&C}=xE{6S=Y3* zehxBL!L!g692c1HUAf3nF)CdL9rKJ4LW0@U(`n0$bN<;WZQQX_v3OF?uo!j>AL?n} zD$D7FiZLWB4;YbMOX{o3nOLH@Gxhrd0oT4E-$Lee3%*}Mmj5KzH;o`KMl1X`b zUd0P|kvZqZ8Anb{R=d|#rNx;yMsP0^T$@yUMJm23&|X?2gQKx)3O;tg4=A=mch zLpU!muQ4e%KptcWZ%LB32#Tb4I6)gFN@lxAe2;*LU&;8>OknlgGr?P1g|SBf8N+XS zf&0(O{1Bukr!at4%sZX=5+0Xb$MS2Q{zLq&qjlgB1kr>l zti}>FV-??5kScA{BC#~`8N^D`1LT5u0;D%f&*Cp~B%WJq%5rE8;6VFtnAcV#F66K- zfNSm1%{goh;1_gu1nYypqB{CmeQ+APrqOfR6TIjPw*G(xIrIx`F6VJ^4ud>a@VGpO z!#pZJ^{7A&&+t9e7LDg%1kjd)DbP__Um2a4hFxEI6Yi1doyKc- zSmz|G;-0KGB}=&{>ut#jkyWr2eU~O>B+DQpIf7dLu4RriMs6M7)-$>r8MRIP+sy5= z1v?Sr?%0lD>|n+^IlQ_sgx+ zFFUvJAucc*A-2kVB{SW+#5B&fD literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/admin/AdminUserController.class b/HRS/build/classes/com/hrs/controller/admin/AdminUserController.class new file mode 100644 index 0000000000000000000000000000000000000000..ab09e95470f353169a6509237c8ad6d9cdf3c583 GIT binary patch literal 3705 zcma)9*>@Y&9saH?dq&d4F@iuuzy#9}+p;rB8fdUW;w4~A9EaM$A%+&l(!`!Ho>68- ziB0#GZghnfT2gmQmvp0$7Hrg<)58-z?PL2V^noXy`$C(3cV;BZOB~LD@zwp^-~N5~ z{_>Ci{pGI!4&ZGC34xxXJEzZjzFu^lz;kWe^mL;%XF2+S{66lR-cVhlASuv();Mp> z>lB=~%|M?Gg0lVyKNHc0fKs9CsNo818?9L{8LlpEal0VUa>#P5;IKebXV;`aa>y;2 zX*40DL4m4Zi@+U?n$}#|uBnf3orZ=?3Ic5!n$aS#b<}dqvC7=E>76vDZBrmS>J|-q z((o+#JKjtNvz9NgrykaaNt*FCm)v195E$AA5MHpx_>X+rj{B!xMb;DCnva6i#$l*^`566oDXH!M$M265(0qyq;vJRnn712^)O zK>-gcIKEQem8uLm3R>sDhz&P-&oI*eVSV;bGch z9|i(;X}S`S8LNs|t4Kpuaa|QWB9N=GaE=VMb<+u~U?F6pibn;+{xpU$s^PdyIzvC> zF3Gk~CY!r(Lc?SDIO|DL7&dvgsu#8PO{K}>2@NOlcw}P0wq=$)pRM7g5?HoAYLQq9 zPSwyKZVq^!u^=UBOd^xP6rNJ>B(WD_sjjEt6ZjnhtL@qQtLXE3e6 zpz{?AHK~Ro2#cgcM6X42oQ?{@RP2?3%xbV?`b|cuq~cj_?~~T&G&tbhsLUGvSZIis z;FOAU+zL#`Z~|YF$kz~{5(1&IdAm1&`Qg2c7F(YgK+8Gu%O~A z0^9YoemQS(ClFZ-XS)UQ6rL*t&1x z+X}uVaMx<8tvjmWJNPckea7`J7#=&?A30ok)Fz_0>^j$ZUD|MqD_)d`!0zi`py7*I zGfFsmW@JHNZ2%2aj+J6x4BM~W);q87DY~i!cGRD`bqwaarW$pwwM8hZGltTn>>Inh z`Xwc~y8}EfaxJeD=6ej`dR$){J8W6_1G1SJ6=tdUI0 zwA2<`8eJjOYa9zgLdkQlYj^`!VvmCh^8Rv+xiGJ&NR2OE*Cur$Gbh}NS2Q2CL^lH;CwHwmbJFrHPB;UOLq>;F1P6dMz%c4U{ggQ!!14Nu*ig@#3{h`D{7YQia!qeD-`!iC6PEHC{a@qxrO~!{_6jBe`U}`f?Rt zO(5S>#W$KDn~@Bg;a~^XU2I=Bn~>+XhhH5Bu@{eGA7-(ikJbHfIlj!Jk5_*IFW^C3 z;xzI)j-ZNu{2c@M7aRX?4B>ss{)1s5I3#2+BDQfF*o|XiAC8NDjD^iUgS2d7+-$je z5idyqaP>WWpAA>V19%y)5GV&liXMKzXkGjhKg6p9-8?;>=-UmBZVI^v+la)VqJ5wuDMv(T%_iYdH#7QAIPb5@B_3f7;eADdSny`1$QdokTJ+j z1yl9^Xy6&(8g^}ZDpcaR+%@9*#^zW74n6$-gb^k1(~wwKxst>ijIlSG?|u_otN58< z6MjW(#lL@B`z^)UKUDF@1djK-i;V2O#9;mnT8X;f&hSBBD!pyzoYaXY`0u~d?EVz1 z{#4klosrkLTPiUiyC8V36|b?*iLlO+z>#c`D_O}5#DCEr7HXJ>{=}^W{){*Ix0OfU M;{QueLikwzKX=pC5dZ)H literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/admin/AdminUserDeleteController.class b/HRS/build/classes/com/hrs/controller/admin/AdminUserDeleteController.class new file mode 100644 index 0000000000000000000000000000000000000000..cb491db2248a6a81e89fd8031a96d783cb924649 GIT binary patch literal 2919 zcma)8+iw(A82_E^wlm!wT3A3_!CG1_y-)@!LTxF~mbSDm6kA%P6?M9MXa{y@mYLaF zyele*qIkpLi;`e8KA1GYUL+cyH1QAcL0_$@55Dr$7{4>KTZUdJX*zS}obz3Ozwi6@ zxBq_l3BWE~l@MU4jhiWT*s|5QX*iadOma)r5-HtKo5Zu%=GH-;^N!l5IuUl4F)MAL^YFPZ7gRap_!_yQ8ODD3ij%T?(Ad8tElW_2)39B z9zq_%3M9x9RxoVvOX{g~GAG_a>kt%#3&F5bK|Tr?ietLLk7QDV+&ZQWCOJbSX2!K- zpJwUeJG&WlhIN}^*PL7TA3AxRpD^3G!_Zw3yLSq@`PmG&orYzv*=f_Td4tG7sC6{X z(~eFX5~2&ToK5cBB?;>pRtq;&-Bdfe<_^Mm7>`IOVc2|MPAVwHMlwIdogQx6WS^nD zqQ7!!-`z_M63Q9Yxeg>XV@U0BEZrDt&gjVmw}ca$6>Py)h9c4|7{o`Nqnb0!u%^OO zuKMH}La0Qwgern`zD@<(P(!R5(UKY7b&6q&mw!*bYw$FWI}MAfEQ2ZtwS$Q07x7%B ztjnln2&;mwYSJ9ijS$MPOTlBKGKY8I1q)8mgI8#x71hB^h0i_m4q^lXLE zfJO;>$@k?z@hG8SpKx2T$%Ag5&@GBl#sP*x*H2MNVKn2Qgq8(V@fD;Cm4a5ZkuJia z$sv>mGY-|qT}jMk#1~aIuM!S1M02&6qB>2g+;DW~oLi4FIvH4P2DHWwT7Jj~^$Q)tix83(EIDmwj) z6JmsXI}!>wh@$zFgbw0PJh`q*b!Ty}j2JwZ?j@A%!DPwK^}o`kEqTq4 zVg1|)Sx^%+DGCMcIuew1F^KN)EeiwX%)3B5^_{vYqXc-ECRzmq!mUg^PM%Sn^;4hD z9v-%drz?6KEq>;(md=j1P>-3h;=D~41F&StDZX7eL{;6Lp+ZjaKHb)7L^c_Q>1gf% zqS-Mo1KQl7dYlhthmjbGZd0Zp{djtOz($(SdGvdO%32I*S_NoL^PQfB^wmtKjNU7& zCJ?H+1?9v9ioQqjn0s>-J&RoVQUs}|7So)H(4OMSU^UjzR}gFQ0O?&v>jHW|h=+vk zz)3oxH|wa*o5F?wj@0~$vTe6ecA|O;n;0fhF@f!oo#S|P9DAlvAHY~mWd9VJ0{9v2 z^}%TH7p#nQM1$jaVjM?4Usk$0(mjP^0o3P5^B1-Cl;2h~e-izZc&@%6S|Du1$1!vb zJ0io8)00TnOAB4KNIWX}byVF%akO9xP5`^5wbC`zMqcp5<%Qxe331sc{x#IdD@$H? zt@*DDQ1T!^IfW=aD+tC)0;7uls_Ab#>Y$<%J1~r$(CJ5}O=ENvyKxnJ@EPiH9gX;o z#@Yn-;}0CbpJ>4hji!ImhTCXoQJORx(7`s-NI8U<3w9b|0b&+xv3d=!3j)yU4V)*y zW!8i@@fP`3$5xTnw+VO~zvBWf66vnv8@z){M2!h-!n?F5kxdQn;WDjmqa5$ko=i5& z-BTGKP;8};X2p+@=2?_TXfK&XjfBcsv`843r6F8RcCXOA06xS=^e!TgKBoUq2Ec55 F`ajL9Ch`CP literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/admin/AdminUserStatusController.class b/HRS/build/classes/com/hrs/controller/admin/AdminUserStatusController.class new file mode 100644 index 0000000000000000000000000000000000000000..787f01e3d05411e64284fb5296bf1cc40ee2035b GIT binary patch literal 2974 zcma)8S#uOs6#njHlJ3kj0S8$|AYxF-LTEsQn6L#1F)=JAECQl-X0A!Y%=FORgP@|~ zzV92Bk1D*R9MHLYykE|{I_xy_UAfN%LFZ{66whPXieUh9B$(B$@k zob=6M-!Gc?^Dz)E2xuklt+yP3X?+zPS<5lija=>!s99kbY=4zNRb$h3f%rNnD-)bkef>RLFsO_26Iv%)#qfa+;+>g z)x5kI_lIpyVCfjFn>U@PtFunG^ac7G`>yYTe!0ISJ-_3I$GoCb@MMSbL89wmMizaW z3mVenyj*tf*dYzG1g0t&rtO$Lo5wbin1kCj)C=5oQy>k@#T`^XB>e&DdDJg3uW?t? zwXp|>IyB4^m=OTTS%o2Uz<2G!(Atun%Su;)xXZxZm@iPrn-zoPL4S+o4-4Gd7+!8h zhD0^vkU6(ncL?1Zo4EDwC2}i}f1TjiX8=A%jpE=)wlx#W-~O zjM8AqXMSAa#EM5ER+as#;eLU1B^UF|)0`;_zU?0h@=-^xfLM}1H~I{0R7NMMr{7`9 z9V#-Xo3Poy7CcCQGAXPav+s&nRKmAQ$ACc0&MN9`Gq4>yLdaVz*UC#@x;KVgwnE2F z6}^ngB^|rTsB&2g<7|6=0(ID}^ zB2)oG*A-a-&wu#!xmQQdj(m6a-ETP7L62QtJpa{^V3FmkdfV0wt!)V$z(Ea9RH{gU zrF>g|UsoZ+7`p}z;mN=PH5F)!0x2t=0Lu6!9Z%DTR|jBq-Wyt};~5%!?t{1f{_*p( zUmXAE#FsjrV@(-%Sh}v`u4Dyp!@4RkKTve-9#kp7OhH$M86^;!a6O@NIi@DBQVQo@ zTT@sE1!j$PlX2<6rctX{*OR5sR8P80x3UxI zwVbWxuHbu0^9T~nr(x_ILEZP5d^|XL3!im?{9MFYZ6~vXrMPB(Xik&8g{mf;!c56XdJ=9)Z&x4=OmVoqCJM= zt*OPg2>;(?Rc^w|xiTT=a_*cwB7bxZ1@a8#47J_9{nGok8T zQPt_{Q+W6k2HUliOxIA~QRu0mW2jE`wCl|$FgdNI^-tQU%E8O{#ZSpIuz_(b5U$7c~pc8*F`WLVc|6;wEjxLdA?`lA| z=t55r$vm@G^0=i8`#IrZ~0!iC6I&*>)JeVJAm5 z)cP@A#~b9`FO+Pj*`SN5AOwQ@6*;rNM2OmENd^K zUPE{NCCt&##J~EBn5kh;Cx@4CC!azM7qt-E2b7E9Lwv+{9Z`SG|4(*9c=+^x`LZ($ literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/landlord/HouseAddController.class b/HRS/build/classes/com/hrs/controller/landlord/HouseAddController.class new file mode 100644 index 0000000000000000000000000000000000000000..a26c87e76305185b35d38d7bdee0180054de8e43 GIT binary patch literal 5450 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 A`2YX_ literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/landlord/HouseDeleteController.class b/HRS/build/classes/com/hrs/controller/landlord/HouseDeleteController.class new file mode 100644 index 0000000000000000000000000000000000000000..3904fdec9dc5a6c08d3401046ac65edb52d3ce2a GIT binary patch literal 4013 zcmb7G`*#)975>i6WA0;w7z}zNP>_Oo7;XS-Vge$MV1j{QLa+qeGP!q12JXFcotc{^ zeOX&=}UdPGAn)$E8TM!8Ly0V%nu(&mEBcYi&otoLmGqj;w z+h(3=%dPXw0!x=hG{-R0?#U%nw6#y!<@w?bM%r*55-6ys+$&JH)lBGN6kwr>2vh~P z3oP}+F;bc2B&HUAgi(TpAqd=|q6ozb7SAS;N9akEc@j|-3W5sm7FapM##E%9T)8K= zOhpJ`frYI`THlpTb?eq1tvjg;l(w32ExA{-4Edc~EOdGeTVVZUAii+w7@wkq`H1ca zv{$r#ehS<5C$qZkG|qd>&X{RiZxk zlN%9Kqej7f0;|3dNEK@kqxl})>CkPP_L+f-uFAQwyN4PTtQEM^1whXC#5x?yNcU{X z8cFg}f>^JzP`*MIQnRc8z2DibIlUxDg{NHBN?xupj5<81pkAP4x=s}hVDyzfEt%EZ z4hpRH;_u0~bsy5>PUEa9Yq3#Mmy9m+i+E5O^&lP=h{RZ^EL^k4NQY62Eh@HR8>>Of zWb|}Gpk_8%H#~k1a-P$XT5MPGh;%*Zn4YZ&TJWfX9mGCgQanniXqB*4n+V$VgkjOg zAa)6aT%4Um9Kmk1D|l=MReTM_O_hoc?4d5^VY9<5b!Q!x$CM!EBjWQa7gq)3W;9=s zDRzWpOiw$8GZ2#?g7~U{SQ|zsx>W3!PDf~`-DJfLWY|6G@HG`*$2S;H7KN5%@lDA^ zK7Cz5XaWHvA*mBrkpMAD$h$R5OR2FFd98z%@NwUbWn^GBP zz-@9gO19r|t7*H9HG8YOtPio zNBFT!n)@kG?>C~W(hG_sq?JKjhzSaN!}Rra~) z(T>|6B>75w+b;Jg>25Mtv+MVYl0ot+D$yj#&usT2r;AiCJvVvVo`cy@qXYGTNL@ zn~pmp(!{E1@zW+ZV~^|I9o~d0!{lDZoKL4S!XqJ8a0o2ms9b=6oCNt6kn^4UCREK1@H%SHWWq+ub`y#@o3>N_6_5S zammU~JcK{7V(V{C@5G@+U!C@Ffvk9jBW}`(TFh`JWD6YDIMbY9>^izuxRj#78 z^n0b>AHfeAf-|8HQb#oCS48oYUo+j>se}&@VvhWa^qskR*jVi-9eg%#0vw8$?l%DpKMrJB~Te=kSDSaDpscGH+ zClf3E&73COsQFDu(iK3G?j)%LtRCyjHk{#9ILb-zBc8g7NAW3#ynk|v`wWlaCfY?YIz%N$wJHu(b=W61pi4Aizv#si z!oUI1hi);5gm{Uw(QzCUAEHNmf?n}A7~scL;wF-Tn+a literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/landlord/HouseEditController.class b/HRS/build/classes/com/hrs/controller/landlord/HouseEditController.class new file mode 100644 index 0000000000000000000000000000000000000000..58e935414b43428fd10650f8760cb7fba095bcca GIT binary patch literal 4759 zcmcgvd3+S*8GgQ8GufRS45F?|KoCt>U=`G2f&$?TM!-OVpsk(k4$0tNnVE2iq80I~ z2W_z}^Z*r=Qb1{8!;1B4i>>r-ZEH{43SwJpuiwvqEba5n>?WH7@UQ-UknfxCdavhs z-*;a-`P>TtF2}zV6bVG4sYImHb~q+oI~9+cb|h{jWAT(7i_A}TJLa62<<9EeR8S&N zv&vX)tc^IPy*h5Xkxti5N9Oa-5`RHJ?UXlX8!3UaoAVN4M#_JY>kR^B)2yWBUL#Ok zTh}H~GAk7`11LsNg924Sg}}(dt5zZ%@4er|j{r0T%OOy$p%i5TRn1n?T-cpxH|?cH zd)ySzn^RFE-e%aA{LU?wxSf_Ga9OWnAJTN{TpCNwGhKm}+UC={pvCO!HXXO&jK`dG zD(RRF(gT4xYolh`wYZ=lG|0<2=k^{_aK6BBsYb*~MVc1%ZUiwBqZHH#jQdbZY8Z_R zDZayWmza)2`2u5WSJa(ackfVxg0TYUcnT0P9g!ujZ6!MzyRCT4w51Z`G+c~J1SY2jOV~NHB7)n0cEuj?=}~$6u8*;zkh#G`zkZ) zHVpaX7(^tTE)^J2c*R$hURN<$AQ&N73Hwxsl?-4EF4u4ct|UT@blObD1SSr3*K<#y z1v$%U$QVr3aFsM&byL2qAR2JBf@#$KOhNG>q2U^-w&qZS7Bgnqv{A(jfpSmJR%#qX zBW5d@H3%vNg!DqCVGicx)ice!`;|Kze%L|sdl#IqzyOPDPeNO5W)tg zvq9Gwj(c&xg8KwU^{42dqZ%H-CyAt$DSM4!(_1rqfqf-0m#j}w26}f3vcF>cb_iT@ z>cs2S+x(-1hHd&U2nWfEJP}H@GSFG+*I*66MoOJ!oJ(7w>)QU6nso2Lf7c-rxZFv=2#k0(BR-&WTW?#~Up#1Z7 z4F_DxNhT(;<^y%9s&-G|HB+XEHZmHB)Euv}!c+?mu|u6;wp3vw+W*L)k~ z@=F?CmdmUauIE6hu!3*WF6j2;RpHkxj8q<^FPw?W4T_*^RxRLCbxd7;b(HIoLfzv z>tsg!xrSfhm-J?LI%dc^HLCV>SgB(Q{}mB<{Js~DKezd<7xx|Cl0AOk=3@_R58yZW zor2%yyQCyr)z+3~4H5c=EmHA3X6)&)d5mI=1=YckX@Y#50cuAaFv%2%OEh z^kR{sBoex#QNotxb_FruD;~SfVf_g#Np;&%bFL+u-g7++^l#fINgz8zb{zHWmC>sG3RXP z`L~>3jovp?i8gKIshT|-bCDJ`S zeGcbk9M8ph@@?@xcT|qU!o^u!P=tjOU&WXShcRY(IE#w}Nmko~N&00OOv&IQS=1L{ z|3rOy7Bh?R66V#Hgi4N}T5k%KWN>W;3%8x|c35x8VrdcTOGBkcP#G%C;D!ut+&a|7 zn+wH;N)N#}gpT^M@dr>9D$8OOUr|EJ5eyG08Kk8St20@u#$VY@zKi*IA5B8A`>V#aUXWUR=jVdNFyKKvBm>9U!+3;& zQbjp7<5SdSD&F9WpJu=urtr^T3&FC7ebuA*EJK>b4OoxQ5jLNvwxgkZAb%M&et;SU z^J+doNI_lAf8<)bg033AvUMmx6hFwF;go+ctZ&QWi}c6;9~fbMyAP4Fu>P1oQ^NWa z{!9()Px`a+u>Q0^3xxHr__JVG|EfRJ!uno+RuR^p@n=Na5mbcAjzA3sh6H*)nDip9 z>M*)Uy8ZRlq3Tdo24CY)mO+LCftTf=X7D_R@(f-KRUgJH%R_-4d@F-*b1|5~cR6So ze2+s#20!FbnZZvy99L)YdJ(Q1He%RTOxEAfw;jT->-E7D`~$fV(hCUjG=_)uKk3Ij z^o|ct$l&ch(C#Kof$IscrOW}X%mHnL>@q@j1wnKpT5uE6Z0@^Y5H{`Dgec(_BPdKf zftA>c4)hS(FB95Fu?nvvj<=8yMM#QbbcqVM;%s)cBe7asgf$|JwPG^XiK}p{n8)sR zA#M|`xLw?Y4I+v=MH+XBZfq1AaJP7jZRk$iBlh85aRB#wM0m*uT`v(1_7dS>jtJG_ z$s7@8@FkxJ>qUKz2%E&E*g;B^;Sq5$>9>VM*eWi-PR>+3A#^;&SvmF!74L8spmis) zo3kKo{5OfTh2%bpKVu(f6}0zFJj+=nE#2i&tcvz-_b66PYv%CeUoedJj3v3Z&<07n zMUr+?`e^rG*r-w<6pU2BAODTyB6)b4e?ZMi?C?n{s>uI$`D_vXhW9vDGBf<0|Nn6# IgoA(n4+;zsR{#J2 literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/landlord/HouseListController.class b/HRS/build/classes/com/hrs/controller/landlord/HouseListController.class new file mode 100644 index 0000000000000000000000000000000000000000..bf27aafb0a6d34ff78a890bb4858ab8c6e6c4919 GIT binary patch literal 2698 zcma)8TXWM!6#mwBkg-J)3;xCQ$uJ1p$Vl_u{XAYA{l8N5_+L6 zy|=G@=}RB`R)(22;4;(cQ#;e&#B_RAk{#z(c(AnE-E;fSch2!Y|Nj05faCaHL5M-i z+H+dLap`Rd$2LvwXr^xEOxww6m+g|vGlnaMtA`3A3@x+zyuP5h+?hAI&85So~UPZkjtc^l6hbBr(L=+5{p||ST zYlcof*X8UHE*QqzGyf047{6cQu1LM|np?Cjm!~8Gv5N~?UK9pxC}>`TasY1il7ig~ z+oT(sVQcBp>OmZPu}?t@!=cx5QpJ88AoF=H#<}Z~eTIYWQym-o?p;bLILNTmbAT9= z*T#ioSoxunVdl6aoj9c8FxnXENwZ`SUl7-IQDE5K?kkr}tH`Bd=s;3IC*^asP8D6~ zW>DsJv&2Vd7!LdR`|_jHvpg$O>#A&pCh2s9VMncq?<%1l#ZiX1Mr0-0+j+x^p%uqf zoWMz9s9r2`E632io~#E?Z3IE&6i6#ht2iS=j|$tj6-Nr^6r3gBUzHS}5-R$o+p0?* zjPab|P>fLwFl_exyh$F%F@y^WhSyM~rXamkskn$sq>J(}C@4$QB|*ip0>la;HBkk) zD!9zhT&cu4s!~(qmN3MkCY^}l3IpqnVFVc!S7p#~vNL8=y)720qB}6E;yT_YJgF#j zlS*$zE-LApk}Aek+`vsLG*Xc!iXmn>4rkyk(*uJ>48wXLE6gW8~LJfz%EPfW*f4|57khONs5k)|@rb4OMLm1$FZ zx|a6AA%#(7*rUz5#pPb^1$Eb?sCsB$Mn+0pP&3;u)8+T83x-?NMYg~lh7;>V=o?$^ z{AQB`3=-8FD=C^6sr1@I5kZRPbX&R%4D& z7_LF1bI`Jg!rpA6v9c;+y?UtK;?qH1$abCAuZdu*Sg1)B;s8zVF#Qu@2+8qHs}QYe z^wV=QeGSnmqjzKHGsHSyK%IPs`rpv-)VsNrp7oym0Yq>R4WutYd#W#kZP-p<5$r${ z>D@`|P4wP{H>7ShLnqSWlVrGzJt17{{u`}bFVH%fEaOdv=V*V1o<#2wjxFI-8GRu< z?M|F8V=#n2G13=lj{JqjM7lY$gtwM(?Z;P2cm9e7d3&ski4gkgl8JYl>&kd9jAUY3 zuBZT>V>Z}1-y8{6b{Y3WNOqM`3PXk-fegKmf(JSYtR#ipMXPRF9l>ez;tGyZFF6JS zr>Mlv;4$6)fyU2IIEP(# F{Rbl0^JM@4 literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/landlord/OrderConfirmController.class b/HRS/build/classes/com/hrs/controller/landlord/OrderConfirmController.class new file mode 100644 index 0000000000000000000000000000000000000000..7ef7bbd05e4de4fdec46d3efc4dd31fd8bad95bb GIT binary patch literal 3084 zcma)8Nq5s$7`@LKq&Q-znQEp&QXm6CKq;g#W0(>MgeD9HIw`hD1h!-(nFcz~Bc12~ zJ#666VMBUoDI`ESU6phCA9~saDeSuG5_)={WCue+VPRQ%?|tLF-}k-W{=IM+z#<$| z5D{3IbTWF6>*-0y_FX5PHeEe!*r~MRru23TP%1EeuW`WW)jiWa zkT!k2$M>^(3m=`~f`Cc|rn|;)1SYl>jHC=FRLb>)K>1S3w*2J+B{j9%1xi;tDKm-^ zRBBM5Di|d&tyt8`WYa_Pt^9~WLuCa7#%d@-xxkn<%QiRXGF_&-)#yr_0#swq<5FeK4e13-xDVQQKPP(C6j^5fnv{8v^cu2u?fm!$Eq=p%oN%P&N-)VXt?F&@b z?5e%H@4=yjf@*wBSWJ={*{o@&1R6$?4boE_K|XQ@QiVnhkIB$g-wAD1 zB7tQJmeTioff7Duionlp^tckuSfgO|Fsc;QWB`?hwOB`8 z#9@_Bl)7?0>*Ka07BW&4RX(o@S_I;SV$85m)4FN)*AQnWi9&H*n$)GD~ zr^8{%9n7+*YtgP@3m#`aSrkT^)pr{f1^9NU=oE-pDM_7e8n$Cc=<*iBH8Q4ey7zWD zABBpYB-yQQ7BnP1ZFznayYZBQCrQd%Bx`f*ZVgZ4874PtxSlB&?(njZpAAxjAqm;V z>Z{pM%sMHSs6+~T6fnQz3pp$9eHyyK3Q+f0cB=VcE6Fvlm|TI1+M(ujTegFqoKUfs z&F*^N$-%>)U+q6Uc>3tz@$Xcm*_^g*UDwbUg^jENHs7!}*zD2UI@;FSNh0TJ*bnBh z+zdVi8jFqRV=SUTA?o2vD%b|6jFjRPrt3QHGMR@18lFQhQOspihHrNIhMyz+vxR|e}e6@XgkOzsSs=mOdZ)s$RuVeq(N$}L`?dhOC}it>vo;ZDO8`ifDG^*iAC#cFVIk zr&rmwL!QVfNT%G8M`LJH-(hxjhBpp5mxIZ`X>=zuINjwH1~Yk6DBwHts}vJ3 zk$NZby`29KVzSg7$#Ex2(_89G1~4^(%?(#jHTNQ_cGeHzVS#?soX5P_f^&G}9F`2A zDS|T%u@wVY6~Ql9-&7he{S{+lt?|-x*mw?`zq+S%eXL^uTO(*Hixp7p@v?sG z>c_K9<#lH(Bt@0Das~5aR%~BCGEM4me?97mtHp{!@mT8sawS--PEe0wVeDY2 zpkla!=cR&*A_d<{QAbSb`JBtAjz-MK1}s1i7Q*68 z_plhfSb{IO^CbuJ2`oh)R^Ugh#3ii4ALPNGoRxobnEitm+(fIG!TDB=jbbj^L_0PI zxF4bw;+e-?zP*fBBp3MhDqbV@s%XLMc!T~miU+CvO>)4)?|2JulYb}hJ>J2)WJw=R z;yt`iCSJnB_<*}Ats6Lu5BYYJT>FS?6|`O*>{j4oMp_N!hP*2^-@tSQ>!;s9gM!+d jXi>0R!6!G+Eb8gR5gv`;Gknhf(RA+%{=VD|;o<0imq=mc literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/landlord/OrderManageController.class b/HRS/build/classes/com/hrs/controller/landlord/OrderManageController.class new file mode 100644 index 0000000000000000000000000000000000000000..5f9c77592cbfd51d30ff3a08acf93386f1c7c3c7 GIT binary patch literal 2704 zcma)8+fx%~6#so8xG`A)qhe8uidDIcYfy_{`vR!KL8xX_X;8ceOY@} zn|53+YZpAnwk*TZEWMDkY$vCUIyu9+q!;wOFh(dYDe%{81k%kZ>m&ns#d z_!tia0x{|v&RN|SXwFo8Zy+MJx_KpdG=&+qL;;2JHg@TxZO#-jh zs+zM!tE!*oM;s~=8zIo7q8=Lr8Z&0WxLlf@G@PsYq-6*sGj>+DCUnP?-=Q$-O`ER3 zk!oNsojjwi&)Fk}CotBY`F{|`jC&=+^-?dq<`(UOYosIw@pJQ8qv)9wC}>%Qa|mzs zl7gKATVxoTX=~}x>OlgpVz+`;f&DKPq>4S*OZR!h8#i2+{ss26-|SdFcK=dJ!9IcQ zegI@mUK{ruvydMunHH-rgV?X)01gT?(6Z!^G4EZ`y=j51?SXO0wu)XVjt+Dw=wwA# z+Emev9sy-ew@Sw7l)!-i|3H6qa>mGdsWnZuL6d|!B(SYkB?y(M$8cC6p_NEx&9d`m zA&xd2RdEc*$x*#nGzvL^p0#v+cxp2UGiM@gIH}@wnR?8#178WG@P>i`#{QzB1e8!Q zD8p7=MlfdNOoutfa9UuaALlhjoWKyyDi~fxm713HOQqr*&eIm_aK>YmCQBaMV;P7Q zL~61MaaC|Zprz7_v+Pq#GYX#REod@`7%mEkzBopZQE^EoouHpFn;o}MWKVZsRK*p% zMLgLQy2a*OR*OpcZb}p5Dz4%h8;vH?L_WEUDH*$vPbF|2Hx#^08dZX-oh>SE;ubkH zWfpQn3z=}7Nn35TRrF1Tlqq?prDaUEYYevuus^=!wc&o9K z1k19uJloT)VY^hINdtKWO2#<1S_uSOS}u8Y0a$${UXC z2)1c+d%BkP;UUu~3hdHm+~U$a_mjF~F{@t6Wo9(ug2Qa9ELSkE&YEsf_p;N5BXDeu z3m^*J3lT(TZcyme-2^|WS$Do&7x zz`^yWm%p|uM%ki{5m*pd89+@Rg-W3>hV52H<(~CD1#?nhXLZ@EY9B6@rhqq9CQ#J8 zd~>mn!tK?&;_krOmi^_O8lb2IAv($;le$O}QX<`1e*W`CeH#w)`0B zYR(!HrfYJ2o+%VaVt+evv8>2huO4dGjmfYw^j_~zY*K6m4>id{?B({Zv_C;_vTqSb7IC7C z{sR>0lJB(Cm+@{L zx{{OfjVEOEi45%eWUoS9ckuI>^+ckg4}Gd2qPK(8-j$`0VCW!$};%Mf7o+ z9EQm~wty3ONa+t;NI!82{el4>rokZn5GDeF_wj)b-6MR6j|f!^KjUM3LWob|K2GCP zdS1YB+{R}t*F$=jPzRFFDfxnuM$|o*TYTs_S{016(#)3>NAMNC=5GTPzTw}uw;)`6 F_aE3Y^#%X{ literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/landlord/ReservationHandleController.class b/HRS/build/classes/com/hrs/controller/landlord/ReservationHandleController.class new file mode 100644 index 0000000000000000000000000000000000000000..aa2f8a72f5197910d1453a6dad860204df0df693 GIT binary patch literal 3042 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 Sm-OF62fm`;*LT2deDe<-z!BX5 literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/user/CollectionAddController.class b/HRS/build/classes/com/hrs/controller/user/CollectionAddController.class new file mode 100644 index 0000000000000000000000000000000000000000..a28e53c23df6c52d47b66da18cb3fac43960d58e GIT binary patch literal 2945 zcmb7GNpllN7=0}-Bgq38v03b9F<&8?yq0J_x0=f^RHk30B{iBD+mc_ zDLbQ0I4+--=h*4A;b=LRO}qS`@=V)m8yjmcbSfwp*m^^s(x){Jn@Ss=HsN_$?JS$Y zd_bV`m}!~b34yZuh7p1Cc6-c-q6`rg6{r+g)ni&lZ!R-xI79kq+7O8K*eN|dqC2L1 z4}#_1gy{oYvlFJTrv$o|LNx7kD$8^fbN^)EU zu|*_0Xgt1lH7H94z#pxjcbFRV_M_fhD^Uz#Wrjgh>RQFMaT3E zM_@yJgU^M;+Rw2;N3se#uuH*Cf!)i&@flUI8+GK0sRs?$C0PPH>#yXKFIheQpkx^J z1Z3IX^|U>1T2VBjSwT|?gC(d`w8$-2WF^orG|u#A4YN3_upb8$v@X)8q+tCeRUU_z z1XLnz^GMHV&LeAeOR<(`#wW6G^ac+|Qo&(?_(FwdSm|kv%$wefCP9R8R6y*D;t-N5 zj^VgK71tTCS>?VsYZvG)RVRv*Xj5=XpxQ5+l0FqLqn!oLvenZ(9nXmyU~0G$Mu&hh zVe>3^jY;Lss5pzR{3iQ#N6#3(*voA)s1}LmoQfU^znlzZWT00?ANskB>2_qY-i&|T zx$*$@FdWBrq8P%6f?<|qaTh(dHLl_!E>WtitacfAVH*oI+AT9&QE?ToaG5DRoiqAg zXCc&g2PNwBA`?)CR|OguWFYZVX3EgaOg3F&W%6J$+{I`V*AS7a=qg5$B4n!4HAW|T zP7gnK6%33k;L5cxE>N_|Ah(JMm;x(w>6!}`Dlk%7On%amO7h$1oe%~oMa`NEWM+H^fPjI69H|G!M^sBq0SQG*Wmmj{U7&w2$pr@xM&+FOX`i&0SIVWXwn(~6)T&%t4J_z>8 z-O~UEa`e26F=DzVFYq>t{;m5LB(IAX_|^-Z+C^hjZjxUST))CU-~wy&Um!&uG#(~8 zSC?fOPJ3E+sU#^b0?Ho-)Pgm@ZyO-QfBev3tMEX-es`3u>;|@@imjR- zz~>6Sm18AVF-f&QDumToBNK(zGrgQS-yB;vhYcY#&tZ!|Z&TSEYC}kr$IIstZHeuf zMZ<%5d2H_-_J!~mhY}U>iYKU!9f?=WA~A~-KNf~H#ZJ$mlanjsl~1rTUO9{IS)9Ks z2V9VOL_&#IKEmK5TuvzWp(esX$8WfH`5~?+!tt<7`&wL?!&n&-k$7YlH||1hiP=nW z9~))hrXTS9KqSb(P1~5k+n5SA=3q0oSBEh6kbp*hAT(hMnz56&>@Ms>D{s`(Y`bv) z=WrOqI6`YYO0P&DjpNLAlKD>I7TR!|_tZz|#T{M}_izC}VE{j45D#hTzjNkejNl0_ z`SfS~c0Qn=1Y??cq&)L@6K_$9Rd__4?+|AVeqsK1DN-wbptkQ(>0vl{A0JRsn;ARs zA?3Qo-)$lY6Twk@j8FLQ9vbi|K0^ebGxr%ppUE$pMg{wyVw-|Pl}`~@aI*4mt`}Ay z6zot?lOMrub}2;9@KpF28Wb1`CaWt5>IgfBP% literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/user/CollectionDeleteController.class b/HRS/build/classes/com/hrs/controller/user/CollectionDeleteController.class new file mode 100644 index 0000000000000000000000000000000000000000..8bea522f324d7fc60c00cd7db71a903255be8173 GIT binary patch literal 4033 zcmb7H?ROMs75_bxO=fp9ytur%r9epvB-w0Fon>Y= zgjV{Zs1#qQTBu;PRg2VGl_(8Kv1-+W=kyQIb9#3{%+yecDuEdtX5QFd z%=H@fPQ5p42*f(9w4UwJZBwpGn<2N~bOi1nGx5&BpzW0zYm4Cubk%j-8k8>MaM5tw z)NR?Ef|YlSltd!hHkdXFG7OH2_$1s*aE~#mm@hC(nvpcEWP9h>K^O}N>jB%!Rbvqr ztGGvC$sL)ip$4@ATA$(W&}}`(T(AX}`pzb^dcH5&?b>F(FIDe3Hf}47B?5|>31gXn z+HWzn+PSEwE&4%yP}-8v(1<2_$_u&;$DykNwRL-aZ8uFZk0}*Kl4@ML$V|Bpt5mFH z;62v^Mrq9S2bf=kUe7YdbAonv_8w%4r|S2Hv4+sk{nbLC4Cc(*3&a81DLA zJ2yA2t;T~$sc5F}x5LekpN4ffZn$frl)G0VmeLKYMKwwKclfG=k(Py*Ia-3jStRVx%STKnqyJ4 zVT+2*fxHOl(eRKova%pmtJo?qZz6;ni)J=s*fLff8n$6OeWHP$PlL<}w_jj(*~$R) zDH)a>8XiFxV?Us0i$>>x37J!lz~sz{q8&SB^{)?ubx`ehrL5Iw=H<~BH0;4%29`lH z@)?1qU|`FrPEuR)g{HORF%A2qGhx^A`DF;6(6CgW}!2iyf~T z85~f-P)^+iy%g2Z2ZAF@r^RKB^cGzT-L7;>n5Z}?5HB~q92;Ub$s97>qe*E*7+C?a zA_^0E4VHAIn)h^B>}pIiiTz;>w%lipm^r!OYA9lW!7!b+T){o+wcEW>4B|-@Tur|b z`VK4Kr{O7lk&YK+708V#a(AoL@U#r{Gfc9&t-(GZ#ZuLH4qsOBrGP(^9sv!<@fCIf zy2%c+@n}0^Ix84cPg6auHSskKC-6M8mJUn4*tqN)yYlNAzJYHtM|_>Ks{|6lW1F~^ zt>BbEB2ZVd!IaDD+Nm?whfiF8arncRPF+9o!nKpH)Eo=r+X9UNfpLWxl(_cV(1(}K zONsA#M!C9~4dXQJ4|4f>!+44Qd5tHEv-rM>bL9fg^S#~G)zOwuGbd~fFXIQY!Ffx8 zwLu?CbrA4!%F19vc|~BZUuIsTPG$^g;RZ9q68sUZS<2o*@+Zuwtm&{S&I{b-3*30@ zlk#YT&v{{jYd!#B{ER8M)Ua*Krn;XC+-K_}X6745XK*_5Nu zqNzu`&1MC7-uk?|I}yx@3ae`q*J|x6xagOXPIqHGV!TlVa>w zB^GmDtKdY+IYAC>q!iMe`uL4-wUMWSzcU*yBie8U+Mdgp{uX8od7Pi&ce*FP7$MYR z2KB|br};9Nh1pz%Fb8v~cOK~~{(csBN!_8-JgMe|Clj%|N3l@B_C)Mnk7y1hVoQCh zG7+ousj5W9C>j(rt8w)&*c4kHuNuaRvzXr)TRn=k3K~bj8MZkb563nRW7AOM6}0b3 zjN)N|5p-TgcWl=%b`RsxQ9Q0-D6YozQKS|80j3nXikY!P@$fKmRD13g7ewNbJG!7^ zbtE3Tin@4c7=>Xt=dd6i8o`kf9BYm?T*8cabQI4jSRJ{5WW4e!8se2@&PDOcahx>k ztCIa>1=+`3Z=B$IbWY?frp2SNZ_)n?Vil}}G$BPJIr2-|gN@^=Rg_MobvnE`jT$Fy*mZ*=)6#Z$!Z{;bysr4zm!-%zD`hOV= z{?RH_EK>2Hiu(fpGQh%5<-WO?zl|dCDe6?T{Tq=_@bH@DpI~!>F3UgB75tu!LAE!6 OclrO1k3u;3)BgZmT4kO9 literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/user/CollectionListController.class b/HRS/build/classes/com/hrs/controller/user/CollectionListController.class new file mode 100644 index 0000000000000000000000000000000000000000..e9223b76d50a73213968245903f6432720e1f119 GIT binary patch literal 2735 zcma)8-BS}+6#v~MxG`A)BWkG?HC6=zEP`Jp6ckj9jbZ_@YOP(8OITcXSuU)kSq#p?ixuca%BDDJqxf zG3jkE?8sHb&#NZGzU-QvylMt?(_xxn+n{D>&JaVmymUFx)QeaDHtwY@hyK+gw zK89Vw4Mj7R%y{J>j{P_wp^f3lOF1dyAP$lF0(U04ZIgY5!|k^^Huv4Vl$LOqVXy0e zt{Mep(y=t7FjCU=Jhy}sM`RquF@{FcEGmjGJJ(caj-jR9Q?3N$(lK-(C83iNx?ZP@ zE_5?Ui>hAYOP>QVGD#61e=W0nsuqjf$TM_rB7qQGb0|wQC5PBi1L7JYfv9|3 zC0t@?UE|{daaC8i;b_i^BAkfgG6U<4VGLOrS47ZpvNK^4;Z};o>kf>|xQ4e0Pa=h? z6ZdLzv6jADLdB$vDO@L_k%|lh| zp&G8bWH6DgHot00j;1T3^QEJ>LxReK`J>45~!9N-DZ79{8lJFCRV5S(qeR4b=}UMg8$91O=cZ)5H> zTT@D0wYaB&VZ8$ZLis|zEpppl>zM~Px8ya<;9RWZ5lxq7uW%}*KwEoiCm0dRpJM&% z?haPQS&ioESWgd;x*d~_n!9&JE&5twlV-`v@r#<6miw!hYrg?{L;{I!6I8d_0-x4w zjmGIY!=P$*#}!SQb+N0JL*)ja@iRmYG`KCCI>7pZR764I5RLONeXcNs#7w7Eh}QH` zK+o;;HbSS2{+m0WBG&mF^3A7c{0&V{+?zY;+33n2LIj7=MEVl6Cwns3g%)~?U^n)V z-o3QmM*pwiRiT^B(uuJ6I2A7AwGgg$|BYnVb0lx3%6OgO8QPzsCvkig{i`@##y|*9 zx)Z}?oD1Pkj15FuBY&Yek!g*r;;mI&{c%g_&R@|aZcmgk9l}6ED)DY>LmBUdkxI;n z6>;Gi=KY=F)`-6{%eWsxs;i7r7$WotMCbz)JkUvCr6}YsT6NQ^7iVxBm(fRkr5_qj z6Wa#xh{n+m7{pH)#xFSQ!ZhTC@54ku-~)W3T%g1=QZo=d|+$?KC0$Ld^A%7ig0()<$Z+r0o#C!q@cQNCMx`@7vp8Hop50 D5c~q| literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/user/HouseDetailController.class b/HRS/build/classes/com/hrs/controller/user/HouseDetailController.class new file mode 100644 index 0000000000000000000000000000000000000000..ea2e9ba2781a60cd0c1d5db8388bf2f879f17a4f GIT binary patch literal 2888 zcma)8SyS6q6#lNUkueHTXDittJ77TBo7icSuq2QYNFgE3(x$?`U=dkzq-z4*_kDY6 zCvSP{TV^uTlDL`abo$Uv+o$IDWZIr92}c1F@?crI_uR95=R4=zzyAIC7XSzFt%3+c zSJp0QdB@eVwj~_fG`XXdTzU-H^w-CQZkWB5Ed^1AEz|mpKC6+?jLC(T7ow;Q&|}PB zV2J0vv%1Z&ZfHS&PPYS{x}9ODJ!)8nc!8m&t$my!+H2={0yU^tp&+hc6~pH6QKL{a zE9VF4BLNllbzo>x5koCQy9D6gT<)G8!m%ZaqOuA zCy!$}`xF-pqisV^24Iw5FL767RuprKw&n7Sj6cyoo8?7e(1L>IB^U?LR)iF6WLPcT z&4eKTyTeBmmjKT>eiGtCLF_> z%Cvi7J+_pk|X zKH&A}!$}4G6u?TE^!cRXl=NM7$%9dzGaL#ufkC{e;50$?2+kqfno==@GYoY_-Ep~G zSSIMxQp1SE^ehpt?Q}Sg@>r%Gqd2EvjFKEKTfd9wwu#P|_O?sDGgUj1CzOff3dLyJQ-*b( z+EzVY#cK+#E-AB6EAtMj&@tgx#R)+ao+t@wD=Sq+z%2z7W%B|UkA)|4^%-ta z7umcl_JdVSEk<_9G0KYrp@2GS%j5K1BC4W<87jz0+qt1Tgw1i^;G?_+U2d8FS=p_$ zO$D=oS-&0m&HtqB6m(JPh-A_68#2T06hPzM}t;>h%*961H>bfL3$PRPY(`t16kj5~rdZvrA5vpETs;-Qd^#qT55aM1^W%v_zF%;NymC&|E%Y zS+>x<(MQv2k=uG@Q@g+?0t!f^y|zwBhv=^PbjMb@6x7fahX$d%8PHpV-sx6B&pP_* zpi~Btw_?E>Yu@Ctf8+c)?yv$T~F_| z^#3e2NZssj+KJQJgH&=;8CxP4?)n|8y5_NC9vwHat@A#*FQ&@a!*CD#@8Y>+dLBpT zalDM)2=1_SwCf%Q?qN6`{Q*1Du@&Syenew)w2YS`NXMFEf2?RARa3?V60U8oO&Fd3N1`-LSOD!5cL(8+ zqS?@iL(oWSFUjqrF|;3?E}D}#43}1Ck;Zq(;CmdyEgZ*f^b!bt_>Cn0!GMSI6)!^% z0+b0y%;9wp`3HCdZxYgV_!Dp8ZSvs=ZsHxhONgJM?)Dzur);~pO7=dWw_D`FhxmxH za~nHw1s@XwKJomGJ;ZtiJGcBtd5$Sy3R)EO(TYMdj=pZRKExgcpOUf9=|BWu;7j^% PAUD3E-`AJHTzvCCOtvRh literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/user/HouseListController.class b/HRS/build/classes/com/hrs/controller/user/HouseListController.class new file mode 100644 index 0000000000000000000000000000000000000000..cdfffdf187566df3a598544fa1162bbadad7a6d7 GIT binary patch literal 2813 zcma)8-*XdH6#j0KcGGleAy6P90@6a;(5@gq8$e21XtbrZg(4v0CfzpMCfTsNffj!& zioQGJjE}tV;FB{7L}wgloZ-PoXMA(UHy`B>&|&=U?j{Xw5oX%mbI;!M<9_G6=j7K% zKl}t>KfX{95=dsPf|j!#Eo&8B+sfw+TPr(!3|oASn2tM8`=B5q@WPyaO<&Ns7;AAl%tCB@h{~ri~cFXjY*h zs$h-4)_PO3P|DZr(_F-$qPYnIYgII$QJ{6iEE;FZg^XdJ)iZfRAUn{pi} zBW})g1bS+TJ;Sk?Z^N{8+HeIXI!FHh_!Gv}vf;R?r*3mfR?#t1^7OHxg{)C>O)3;5 zRv;VzTic{yi@{~;*eRgS8t%Am>jlF# zY=K?=VYR$ooYf{>+bqtey1auuri!A2MK74eaofxqQS6p0eZgDB(1oOeZq~_5xXzV| zJ?LS+^ji?v(7B3dX|1Vv33~+;(-|t1+(nNv7n|`i4k*}9!+M%{oF&6l9K<2UoH2{j zp3XVB*iT#p+Mj%;vTNowN%&M0M_3id(Cutann^fQDvsh9F>(yI-(}L7vP+WfUd3M> zL}QsbBkQutF}#9)1t$d7Edh}(y2h+wt2l`Pf>zRP$DmH2Z56LwX?f@&6{m2TUh0qL zK`k*%rvnt1&LRV+RlJJVh~YIoUpB^OcriPxJH3hoiKJwNQ59z}Muy1<|7PD>FaIjC=>}=^MOo7eXoKy09s^{|x5p{d1lfccZ z$V2jR%veSXR~3{5wmp9RS8P>bgY8h6vFz)*%_E)g z11?o8=sr*AYqhU+?M$)#9>~kFEYrFodc&jYl-#!s--E#N1Xdaav1Er|x=TTS5@@b= zB5LF+=tSOXt#44P7(2U2^Y~7cvfH1WvCmh5Ew$0Hf;e=y@$sRvSgH=5-esYWuI|R` zR;lCkv}V%Pv-6{RDVSWbNvmvUjZ>zaZJWJ)lATM_xmSWgUQdvtX2F;;9g}mfzgQ%5 zz2U-Xu;|t2#?g@R7WPFz|HS|0{N6%e!-bL@%*wXzST6-$k7eZfSGJcq1 zUl@0gNkkrCBGK>wqlt*Ob12c^y^kd#_i_B7l4y{xsI+fW+M*QbyC;jRh>@CydFPaImA2gE{QVFnZBD+l-Ug8J-km{g*l(Y z2h@GY9JVup@9m?SH!1nvr1UX&Z9@1F1{8GpfB#_eU&Iu)<`6#N=MZkk@>6&;J9Lmp|S1kdr3X!CzcH9H1tQ&c z!blx3980c?n?Y~bas@V&%({!eG_^WuKW=&geJ$Pp+wVT}`JCx`ZFePevv$Tc+oa>6 z-D3$e>sj1T5M317Vnjarj*&J!(-CMc_^YRk%#hyiIaX$Nk))gb%VYykuOAJdZw^z_n zu<|xQ7qPX4p<}CpEdmeR8KFg_8n)pfhW4oK95zh@+l^%z;dCKQlvnGdP5OtV6hcCYPv zDp;h|1N%E$AC}qJsbLo$V>X!S_F;l0L9Fb~BTD)zIWW-om3*_r8?b7yDHPt06BJ^Sv-Pp_Yyd-)HaUcWK>;f)Xu;3)+Msb{|3 zO0L$`pOhXDxPz}Lsq}WvNNdA0rGa>RCn43I5_sYk! z*KW?d^BUtnGm-!N)L9kJ3y5vf23Lb8mDExR;pydE6{D<=x!+!yd3}0j`s2CxKbpOA zl5YI-_Y-qhr{_*ynElPo*ctBgRh%rMT1G{(y{zE}I3=)(#nEGob!Au`)~MN)VU3I$ zDMGrXOLn^-GUNK5zJ6W8_!SMW;x$SdHr!!(4f;6lQgN2C*`nfgezvN3LtwSfQ|gjd zCTWhzE~(;8qO5etDo&|gZreMQ4% z*#g+?Gs!+PX*ulT0`+Dl;f!ZJGuc}#Z9+!Yd=csb4W&z$yMFbQRRWt(P*T&A64@do zl1OpqQ@i%dduJiB)bA9{8*mu?P`{mX5@x3*Uk57|JZv^g-&qBHIo3|vJYcyNUk$r5 z8JlR7*E28E1qzMQp?=UDly34hL=&r->l{^t%Wg9~$hS%rA6x zWBwXgws9JvjW?kknnvC4u=ESqBW0oRft7e^4J(aY*QYas~|O2`5ITzQXobd zo3I3}l&zx)TYSwM3lfW(DVtBp?Y=e5_!_=W?X_s&-@}yk4N9S(|G_GSfDd9vB`X8} z;EBcnosLDmna88FC(>T9HWu0KPvXH?O7taBCbZ&zZ94gm6_Ekn9=Gfj9e~|Wh#=xT*8xV7z3E(ReKEw@h3cmKa=Bc9Hc=36+T;Kjm`rfD@b|6-Z~_yvO)z%TJDe(P8$S2!k*K)Cqezb^^0$N&HU literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/user/LogoutController.class b/HRS/build/classes/com/hrs/controller/user/LogoutController.class new file mode 100644 index 0000000000000000000000000000000000000000..8db8c65bbd776886432096e4c4b6d9076e040752 GIT binary patch literal 1608 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 AL;wH) literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/user/OrderCreateController.class b/HRS/build/classes/com/hrs/controller/user/OrderCreateController.class new file mode 100644 index 0000000000000000000000000000000000000000..ac69603c0042100dfe663a4e014846e903d6a0c6 GIT binary patch literal 5484 zcma)Ad0-UP8UMXpv)P>-uIHelA~6XeEO_EZKPwbUV~#+v(6Eezdw10=_PTBIZX7fs>ksR@v-OH>>>rH3LG!h2*r(1XA6#bua9gh$e8JryIx@(CE@K+mEEDPoR_xzZ$`ZMY5(U_KTqSU>~Di=+!G6_-oh zRf`(5=&`s-L;YyP6$%#9Rm1LVGE$u?n$RpznvR&3E+>v)^kOMtsr2cUL|@I~+&Ic@ z4FR;^Dg~_!axQm=Xs==!h;`qJcq%rxyOFM$mg^cvL~WLrNoIsZNKe^uyW3@cgAdmT zh#7vg<2nV`3QQO}X6#}W*Gm_c5*4j>#Lid}5I3s$A|i|pDH=&I4U7ox5FXkktfDGn zU=s050lH<8ngVCnw7W* z6)7-a^)!WshonMc;%MZCbN`DIC@QN1z}FnUvSB<+>pl9+L&Vc9-x zAjp@-o89Nfb_C?d z%PL;McbS4Zbb^h9KHfVuyR@OU-G^7H&c|CfAKZD@fn9eV*t*U=Wq;p82k(A;aKpC! zuRXkfVC{h|+kEJeD+eAQd}j05HMx5g^sx~b$_R|is(4fnIenGW>q!W6#_g?orLt)Z zsMv+qX)jqR^L21U?e=p1n|NEnTLjc-*|}m>yo2vE$+)a{-Uyhv4tJ!DhN=5J?3&Tf z!{uVgpxi?zyZx&(MY?1XHp}a~*rQ-KYtPZt9lKM-4`p*w8n;?A(I~kgCGA!5Bbhs8 zk!a>zq?1kTPw-O(?+^87DYnSVTACan>!ymI;R9KJB(53!nYkVqn?k*r+(PS3`S1%? zubh19^dGa5R_CP(ekpLuFdx{M7kM za~%{cF?`rBaGcBr&CRjcqD9H1Wwo}p`Y_0Tb7{+bnHUbL_ynI)2{M!kWH>Vn12IoX zcyOzcF{ApzxV(K#a1I=OgPJDe!phu|VPlij+u~N7cau4(l))xNw*Ta)$x=OrQ*^EeG2!vvhgyHg==f&vBd0>x1g$Gm*; zvy@MB`Bw0|a!N1!QwE?e??w4eRJ_8u0vyNBa%X=v_tl~T)d+G52kFyq^Sd#w!E$%(*^o)UN0^R zhI?>H4`%mcUIAXI@57=#ED0A)c@-5}Q9r&=fN-%^yc?CltF_`DEbqY$PmL?4uCN~+ z+*zWP?8&!yMedneNwBLQD+}-z(qTnY_8u9`vDoy&&%JY2|svv3hx^^0)>!nh3$xScnR`#8G} zv#||x@FK4XeOQ3KScrqX0ephR_zYLzFq(vlW+y-`uH(G`F$8!JYh}YkyhjerRdm$ z;-W8HTo-)W!C|j z8*huM1%_Ae9B1_adMUm?T&9(2^!IC;PYY;jKi()txLhmm!4Ed#0{Q)3@X0>>I9xH7 z(myA?w2B;#(K;&XY#Qfu2vI2}i7M>#7_*lw0a}UeWyDe&lh4(hxrV&CmfX0G_tNXx z&fI{T5#d#)1NS0IT%~qyB6{(t zc!%Hb;R*2po)jNqLjj2QLToIk#8U+m@N_{fo^e?E7Wqj=46&3WkEI;BEUn~v$-_d- z7N0siETUdJ9Of4D%JTw#MGlwn?5FW-juh+>QHRYw>=SJcn@j1%3HS|u3qP$?u?fFJ zfOdW4jV4k0vz$|%Id@cz$@o3~z(3IKL)bU8t1{p3J1n|C*cl?9jJF2h|`69RL6T literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/user/OrderListController.class b/HRS/build/classes/com/hrs/controller/user/OrderListController.class new file mode 100644 index 0000000000000000000000000000000000000000..2627a2fbd4c5941a988e9a89dfa357737095d816 GIT binary patch literal 2680 zcma)8T~iZh6n@?i+?cF@QBi6|#i~GnRqIy?MFkbHQ7kA{t+h+Cz~ZtScQ*+3!?yOj zz3okJdfB@=&a`OiOs7}vOn;Np>GSSxV)&|Fu-QHDd!F<4oOAf+-{1cLa2Ve!hzVr! z&a5`=dRpGGeb=!p!_`V2A0uwTaC4^T4^|Hp#06Ss^f`TA~*FKXxb7z+gg z2}f$4)*XT7Tm`+LJ0T+FS%GzZrfvHD0(I>j;{x$Pr(h&ehm;Bh2?ZMjcGRkxvqh__ zKg^FLRHW8Jph-nN)(JG`Oxw6vnw>D*%ld?62&8jPUbn_|*OcFpFz!#Aozf>wdOFXg0)UD!?YQ-(igcpmKw>}kK=v9|BQrL2NI0$T$IEZv^c z#(dYbrv^%<#kxx;_Nv&2{Q?a{mh3U+{Y$z(EwH&g1lMZxvPpCxqo9+uT#l)t3*7?B zoNkqjkx7AlVg5t?k%<{2?`KzqY=b7LbUdx7c<| zYEdcQbqO)1;xewV(Fifj%%_(yCFj^v*%Yqgnu2#oql#0tQ$@vf+#u&BO}j9#aM`eR zJ3wlytziHZ5vJsumL>;WHi4T=Z!osxx1{hb74Jh2%21oS{k33G>Q-h>(ksu#@*Q8d z2Az^kNCQ&}$l!*6<5k-#reSgbdgeV=hSP93iQAY}U ztjiqc72Flrxs>56uBuqTJ+||tR{3OT@Hu)k>(-c})zg~cskmVr0{hpVTfwTT zfU-GVBSa8b?m$fkMM{w^y6shldv(FAXdJGSrjRpL7Esi@bX&25qK(zF z>~7!c$iceK_7iEtn6Kw=U(kyYKyu6}xq0KPDVO55;NH@;-XqJ#Rv#r%%~@mI^h_?y zQ?^a|23v^>Wm&{}^-#NNOhk2|?fPI+Gr$@KYLbE2&0Sr`|2qU?a$)l=#&<4zKG*YW zfTx1LO`VUC?0gFK+G8~QhQ>$1&5e9E1p2!X#~w5iFHM;m>R=N#^DB-mXeRDfzOUo& zHoPLS#UxLp#fO=?GG2}0V)x%@>w1c|Ynd`$6L^C5$LL8PT*T{(I95h)43E0gC(1Y# z!=D)Hjkm=ALQ{IUCBBHa7IE>%7ixF@ibi>Rw2bi>dh0XkcU$Vqc&`qb^n`pP`JZ4W zlALIXM{iCUcVftNl~JmL3_T7RdM|?q2WkSH3^~JR7oQrA;{eX%AZN%SnA}|pIEDw5 z{=g;l6Bo}f=nK-+ABG>LiHX1m_%KM_LwtmfnW_YS#(jLk6d%W3oW!TJynv&)iO*QB w2ed9z9ZEi@Ke*59+yDRo literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/user/OrderPayController.class b/HRS/build/classes/com/hrs/controller/user/OrderPayController.class new file mode 100644 index 0000000000000000000000000000000000000000..7eb4206df106f2ef8453c12a590acf5756539dcb GIT binary patch literal 3087 zcma)8S#uOs6#njHlJ3kj2@adX5+Nawy#Wzo1_T00NC+fM79_ZJW;#iSneL&xCnoN@ zh#M-(;(}CR`G%D$42e`(R#}Br{s~Jp!8umAq= zBY>^AB*4c|6*H3ZkZH*=L$^&Mkx)%JZPC(U##OUZ8QYsX7vN_o8CFJ=QJEx05~?i^ z*>+0aPfM43z#tm@;y%S-Sl*sh9#;%kA)QAU3U+9^Wrpo0>k@nAQ>mJ9na7!Uk+)C?d_AJnE?3sn|mdODkOEvgckTfJ#&g zs3It5>XcA}S_WZ6Nu{ljX^j?AgD6f$ShCWd9+E3T`QbrD+_f-cV! z#-OGLP>QV*9>F#ur;FIaV-rgKX`AX| zS`xDv@kEu$tAPCs;cO8msX!C5s@s}9CUYl5v@x(v0koi9!a*K%knBVaDz&i`6>}vz zBy{31<&%m+Nl?{I!y*e`pNK97pBCrT>5w#QcF#z;)<=(2!m$N-gry0@{ zZEwXqtLXQtj0&ji&e> zT{nn}d{z=0XXHr9y_Aor{h7JRr?)ddh|gYxQ_2|D(f30heF{o?#Ld*H9PQJb{NNuzd;*K8)9f zc1>ZA4?m%$!5{YDz~WGA*gt^-6F78X!Q0iL=oGqrXvh!e&uQy%udQ(YB>E=tOhZA{ zRTPH{rVyj6LRh$gC1GI#8aHfAz?{?YG*zyGkTr#L9=3_g#Piq^8Vfx?i5D9RXNUYc zxe+e(`0_2}(3|s$zdci&qmu`Y&H%!+RuZ07gi1B7HMGj8$0oF4GlsAQ8qItQ+c1jl z_>A71rGb43J8*^O@Xy$V-?1BiU>|Oy8Glpjyh~%T6s@eB=3gBSu){R_IO-_`Ihq;N z`O`Z%#hE})@8Uf|USw@}A0Lo!^=u_+{g4=7;WwPdN5sBM7{|x>gg9~qmvIK45)W@f zA)n5Y|96RB=SZ%QY?k3Xf5HW_x*p;k{`J&&2PFbpO75UmK;=LD=$L?E+BdRlvi&*9 W`tSw5r2iuF>MQzPJO*ar>;C}lzg5xz literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/user/RegisterController.class b/HRS/build/classes/com/hrs/controller/user/RegisterController.class new file mode 100644 index 0000000000000000000000000000000000000000..cb634f25db89cf71ca953b23d4ba0802e70feee7 GIT binary patch literal 3344 zcma)8>30)V6#u=Z?WD=Hz<^*yL1imVA#NbHvX-sdmYPBlahoQOc4{&cW+qTvaKn9H zz+K!Gw{tvduyXXP=XgBF<7fR3+tz4CN~;Or?86#brz&^v5kvpsQln`8`WBn=;N0=?kPf z`v2R*DS5CUJ-_F?WM1B}J=vq27TY$NmU-VILc^ssK~zRFm=z)omkZ2QY9uWu*|)25 z5XDk~`N;_{ALfW#%8}K?#IYP58deA_`(Fm=Scy)7d1KNqnY7jN@}{32m#)B?&<)9~ zX^$m`eb=(bdRA7MT*KBAM;BIWSS7G{rVcfvI+D18$$G$X51VdAU{kfvW8y3I;%gqf{kUIjy&FmnBN6|+k^5c$8@J8BZWqKKrC>6Vg^yCskWx({Z`W~$Lbedu7bvN)rjF5yh?2TdFr&m3>iB?;u`<)J zZ~6r<4hwf_m=IW4Hi(*5cRn3iGXk-)LS0At(sFlCNw1Lg zdtz{KP(yy&JUBm>4i{{6EtWT2NT;Pom_7OyC99z05Dv5PFoyFT%__c14=%3_LGS0@Q;bFj`e8txZZ5VW*uEoDo=%4Vdi zvi?CG4=Ih?sIeM(a+1mKkH>Hfk7{^CV0JaLj>qsgTgV|ZTaddBR8`2X(FvLMOFgT~ z;-h#{4X>Uko~BpAR+@FjEPG=v^ws(pj^bGz&*6C*Z|3vTW#SJmx=!G^H+8&)w*wk~ zv(HvNTJRaF6?L?o7OJv;IGv1X=u)faoL4Q0B~r=a+MK6r*gcuP(}(T()0XDM!hFgM zc9#U<1m@5zDhU{5RXS!}3-m zmJ=|r=-eyGtQ;oy%F*F)+)|IGAa|H_Gsh`?*=O5)dS%%$CFQl1wFt`OE2zL2YdMy{80 zU5Z&)hKmTd6QffYMeute_eNZdOL*-f!p+W+#j#Q&`r3MAsA&5uB4B zBQ=nq?5;rWr6GMuE;(@}t_tp&jjQ=SZQxyN>fP0_h$pR-bv9wFox(caWn4dn4GkDf z7+V6MyD?#G4WXulu|0&E6UNRE(h|lEArws*{UOwH27~m;Pye~B4p<`m`_a86viXyjeDmuEghTB|c|M@tK3)u^uNG$A$Qf(oZrj%kUHBpJZAl@dI`c zYNl3SqmPhAnp3!u5T`p=_1{80Pv9NA%cMPyy?77rGoMaj2|nPdjt{BHYBc;!^>htF w!*UJBH5{w=H>h#+P?rckBA0UMC*0eZQ>Xa<>3#?gpW$=jRDn30!(X7~AJ&_PAOHXW literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/user/ReservationAddController.class b/HRS/build/classes/com/hrs/controller/user/ReservationAddController.class new file mode 100644 index 0000000000000000000000000000000000000000..2e4f66daf26945b99e7f52afd2b56e86a3620084 GIT binary patch literal 5120 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 literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/controller/user/ReservationListController.class b/HRS/build/classes/com/hrs/controller/user/ReservationListController.class new file mode 100644 index 0000000000000000000000000000000000000000..a8c9e3e15832039799e04e5f87993a3c6249ca53 GIT binary patch literal 2746 zcma)8TXWM!6#mwBkYkG^m|FuhKq%zm1aZH_5Fi19sY$2z%baO&?4EY{R#>BMYG90cO z`O0*V?M+2{gbRjzckcgb$@BXa?uyJyx4C88a(PBFk+?8l;AI&GS3!FN^8w-YO$xR% zY?NkbhOK4C>I+G{j-3iR81}xBkt%j!H(g)iVw}4!-A@tdzSXm~?cS!0f;|jdJp)YL zDrw`wF|5*1#W0K9kw)xQu@7C8A%rZmiqDIyx|n9z)a`?7p>vr8dXQGoOA%d(siF`4 z49c8tR`}Qy!#%g>2hLu1kj;J__ zW0a|Sxy-F1L;q@LJ$k|(1fG*4oj9T5q;x$lZ2zt#GB~Z^6xsf=p!g}FVo;i`x@19~ z7Y&DejN>drvuEdZ5@ZrXIIm#1Ayq;m^+KiM0xl93#o?TwC{0!b$zvIbHAX^S1-vS_ z#L!+-xFBsR!Z0;i{xWggp<)s$YI0Vl^IaA1LH9xurm-sw8PM3sqD-{{iA>l+ zH;3(tMUWgN1(eM#UcT2YP%#aI3ZrX0q$p99%qDOTvkFXx4NKCK0uU+R2x2%i8GtDEp9#p?I>S}#8R8AGg_k*Ep?Mmh~ zwHheNmH6=rGQ&y(LYfK=1$U9zZmn$YTKguyW-@HAH=YJ5QG;poGpC*lG__@U7b8st zo$Sbpy{A@3&M&p+%pl>d9~XMz-W9zZz$C`)ic{bh4cRg~Lc5oL4D6R7q(YFV)HP=L zgy9<0RL@x!CA8PGsNJmaUav1|H~3@_BeI~$tK;NZLr!WkC$XEldX&Cg7$UN@(l1J1270!5=XWE9J!mDo6wRsr8EnKRdW&H* zwh-=C8n2`O*RV}uvng7UH$F~BtJo32X#d~n?0b&Ro9QavV0eb^r`Vr5xQN4xI9|m- z1W)=?XR0_C!Jilzh_%Q5LR%`^9$Unlix~a!rKfv;MXTJMuVNyCfu?loo%W_G-i;!i znv^4w!!yhTGiTak!N{)Segx^hDk@P(*JF^b50LXfFOiidm-}ecPoo1kfrGe=LsVN1 z!@zM8+(|s5-9J!c`U$7;3-udG)1dEuKob#x_wj*8-D7-+kBF)`e#Xc6geX3N2RMsQ z>E;C-!ySA^;d(?El4^hEbDH^rW?B(_A-ns~3v?(L=^&UdX*zbNagg$A3_Ji2g*c~0 z6pGa8?(Fa9em*|m-T_?UI7EZtB(V$rk{3J`mfu>fW#W`IV_`!y8TxbaD!3LV>PTa!h9YtIQtPCCiZUM8bz zO5DK)*JHcS%A}*}K^kG4hn;T1mL8>3n#Zbe5kqUHG9z4>lgVT&;d<+&H>BB1Y-!wj zEB|ynrJ-iF%oBO1G?^d$+W4hkPQXArrV9ZjTZFK5-9|wf*61ssN N;rckFoRsUA!50qOh9&?2 literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/dao/HouseDao.class b/HRS/build/classes/com/hrs/dao/HouseDao.class new file mode 100644 index 0000000000000000000000000000000000000000..095f4118063365a38a7d8f19b023bc44d2fcea5b GIT binary patch literal 1054 zcma)5+fL&!5FJytE%!ppZP{IJMM_@?LcA3rS|LQGNL1?EzM0r9My`z#2dTft10TRg zA;#`SD2*sjljF>sb7nk#|9E`^fD5P=V2(f~)P4UkihV}4f2Wg}-%wqEc><*;`a*q4 zRnNbFc;cZUQ0@xF+R1|y@grw0J0`H<)dH8B7$N;Y#HLPQp(A>Vnk3=`&ZZJBgRyL1 zGcJ9uj4*?te*Fr|OIB$p&>S=(P6<@Kp^9_VF_BQcdWLZG2Wd0q*T2fQBN1X36|dFG z&^ymKp2=Ud{LMj&5jg$oH_)!BZ-z4(O>+=X#iWjy z+FUWbh4CKj*}tjnxYbdE^@SQ$+;_WDC_b*pQHJjKz3;Z6_MbpLd1ln$9V`z&ItDij zH}7PsrHmD^^|)i))|aOWEd6Sz6J;jO3FN$5i$KvGyLJ~lI*CGlDK6u=t3nqQDdTtGAjMZ^oRIKfMZmtkdsR}rs43G8cIhmFa38F3}WvzfwMDZHJ+ eJFx3`e~;oG{Big%{Bv<14qQC65tWae>Rb>shyThR z*!)%79iODP;H|xtJ>hrT8)EloC z$Jfm+Wtu>ro4!+^Hc2prX=FEPp{ns2jZR=z=X1aE8tUfXJZuviXqvb%j4dphd}$b$ Xv10O7tbOaQYuycO>KX)FrqcEo>qFeb literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/dao/ReservationDao.class b/HRS/build/classes/com/hrs/dao/ReservationDao.class new file mode 100644 index 0000000000000000000000000000000000000000..956aabc6a3f3b22144b661cd3896ed28a98c1ff3 GIT binary patch literal 681 zcmah{O;5r=5Pgftm&k|sebku9#a_5!JP<=9X<}kMd0V?HE-AaF-4gk09{d6RDC4xn zSb>Do>`dmpnfG?SzCS(z^l(x}f#K9QQ|C2|9KntAAR`&hxK&2qa#Kc;p*7(%?gU(q zo%`pB^ew{{7lPs9(*1=_jgWyOwN-YW=jeBz7#c51i^2R+YOd{wfM=KPAE#^dxZlkR zu~mWNs>t>ks-7BaZsSlg3^xLNFr2T9%>godsJ-c%SlhgfofTYn#L!;!G%f`xV&8e literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/dao/UserDao.class b/HRS/build/classes/com/hrs/dao/UserDao.class new file mode 100644 index 0000000000000000000000000000000000000000..8f0a25e63ce086fca2661468991bb20eb727a3b5 GIT binary patch literal 740 zcmaJ0>CAl7*Hb6bJd(qgOGBj=wm2?Tc!-yAkdkyH%5IXC-nY# zCR|OR|Kdr0vxrfW&BajiF$=?Y6>tJW)BYtmI`HIVkgr(wvfW&9;Zq^Crx!`z0fF{^ zeFAiiXt6{yl^9Qz6a;E%HbQ^rf2C}N?uvzsm^$=*0$tNe2Z^-jQ`-wQTCF?YL^2%( z*oEc*R|R8UF9${O2O*i%A%1q&&1RDO_@7uRGmf@T%>pUwi9j`ax0Pas?d}j8_zX$6mmH|ZDb4i&Qu}JH!9o;7Vk;jlxoVQ z@*_=s!+SWd!mA)yxqH?|1-{Y3L`mlv3YPU$uIsYiw<_>%$mX-gMg>*j$e;puMs^M3$NWnRkTcv^aeqoy*3$dUY3TiZ{@F`f-lg;aiiLqh5m`n}lbk6h?(y82F zs+bke)=RfBnk^|ff0kkMyH7K#Qke`Fhn>}9v@_SF=Z&l}SpisUWXO-@SfS!<1xszi zCyZ>ask416zcieKa}_KY(T$EmK5xRT;LLEON8($$QQ&V+wE7TIFcMD;#QKw=cp}*s zB2&B44nd)?q32V1V^=oQ5R!1qk+oo#ksZ?;Lg}KOGIaS62@SUOY>f?s!kZdG{Fmt4 z7LHh7kpSv&zKT_}d>&ggT!7UKgYlw1o+|1C2G1NL017S&o3_i?7%+<2{77qsJJ*;S zGR}@xKfHDIJZIh8i0zd0|h1*ZHv)7pZ7cu&^AaVn)No zxI{s9j^n{pZi3;!Nb3$T{F_x=reL|_>PdELXu;(Q)RJz9qZD|;@$Sf=us*7xRT$={ zVKN%y8FAzl8a84R>DBk@=?O#MI-Vg)^2)d$ZRk+ZuAtVra$rkOY;Rg07rCaP6Mly8 zIPo)xRr-cxF_mUAEXQUISD}mdr*nl8k6UK}E`sGGt6S#{B#~VHa@;6bdD>8BHl`Vg zw0GVUY0h}b7$g5H%JU~%Bk-F@r}Yw(O&KB-G+Lx&nIqv$=`nD#L;rd8ubAMm&+ROHbljaC@tQ3r~AbHY2E` z3t67CaCbJJX`d`hQr*c1n_f!k@1bK1+vq zkKjigDM`g3yZ_2hBNUvVW_mi?2Fg~aCKR01s_gcIQtn7 zo>9>U3H|&EyG8Fbt9_Xqw_BJ?=Y-hTi5M1`bYUWIR0i)nSrPZ)8FKjz6;D(uaS5}} zDQ_iFHW`w)332+hhTq_MDg(vIEUmL}w0nqdQPyA7a0rLF_9juj`>26S!`)VUQP}{5 z@v?^B;uT&_dQXw&Fb8l&2VD+9%Lu&jj6N*So{Yxn?vU=;B(E4jpivVh4j z>SS-x8lg)c(j}|O8=e$4e5~O(KH*#1VBV!*^{EZ0Y}|yepKACs{$e81A)Ci`YVo`j z@%F!QVMU864)}+L&xHL8g#GdW(|rFxVWODUH)lm#zN{=8*6)n9qPSrtRi=u69{#yR zPtPAKK92c&fS&?oC{0&xsWS>6>#HREaLYWeA2j^ zdr*sI{APcFv&{390@sOKa!Rj~sA_f}MXGNPy6^CF z4_6fl4k1B_BNzX>TQXI}d+(G?iFmyo1}69>z|(HxU0zyomE=t2ohDPNWU5mzwGBSW z$66KqC&(h%f-hKfnMBT>mZWVVX&U$9W{0#pEYk9lw5n#0WNdHL+ZgnI4aP*msI{uY zkY@_#M!i9=U`X&2o5C67M-Bx$a!~6L-1z8YH@WfA)44g5;`}f@PjhxRqjrSZKFW?a z%beN6Y{~IQ+Zgv3$kI6X7kR>s48MrKRKI+xoSj9MAgL{d{ zebkcsxpzNzKS1>MGio1XhU{k$9;nc&9S-h0c&5k&7jwnds%;W&p;bvotHKg(5AU(H zYJ-J#g;uSzw8{$qSx}o=WzWpks@w5h8gK`lbV=8sd_hP3e11gWP1QPvyI6wmj*2ws zt@&Qm+hC=ESvefwucuPEr_fLzbRWUJQMLXRED^f2eg+S?z=&6azG*y6HKOkQ*oAFD zN*Pt{@e`j;Aym!~78Od^vS>9kLyUvfB1h!NbC^~xX1I?L=*5(X+i0g-7MAN+@_@%U ze~@n;CxAcUiYEyClO*aX7T%}PfS=1asA#lHxFgLB(M_YbM%FbfR5oO2A+gHj$ zrP78a_!;f=@pe0fo}?$Dpqo3N;(Jk&+C);d%%+(tr{YnmbKw)*<0O?Oft-|dU&FKt zczNX0guqOzorKBh3rMr6bG=@p~+3Y)4<2`l=@3RB=fMLTH1ic0qS#(|HP$P(_gIn|lbFt?C z*r9e2k~oJHvj+t literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/dao/impl/HouseDaoImpl.class b/HRS/build/classes/com/hrs/dao/impl/HouseDaoImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..8edb1a599a04eb7ba8368e7c875a6bcfa0a74fe9 GIT binary patch literal 12751 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 literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/dao/impl/UserDaoImpl.class b/HRS/build/classes/com/hrs/dao/impl/UserDaoImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..f2f80fdf0a08320b2b2001a0ebbce1a98e1e5b18 GIT binary patch literal 8877 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 literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/filter/LoginFilter.class b/HRS/build/classes/com/hrs/filter/LoginFilter.class new file mode 100644 index 0000000000000000000000000000000000000000..e2b10e2aa4e2547da5633b9b7b0d8e6a15f3d34b GIT binary patch literal 3305 zcmbtWX>%0U6+LgZ9*r7V42v0dY>d$Y9fJdjq{s*vjEn$Tg9L+c?AE9mHO%x3(>+AW z=8eSIkT{Ds;XSd9%W)NvT_st@CVXZ^%svtPXQ^*^4SyY}wv#0Rq%-k7~|arV;7G3>+-HQdjvs+?AD z*0Bq_1+;>+mvso?$L0&CoO&6N?#s-NQ4&=hkuRh&1I*t@eqLHbwPclp@3+pDEZ1wV zF;tm#3nb5~oi5{ynzlotHT+~jSUpE7glc#|;GSw1M?J4#9N?t_p&ZcAC9viDmipe* zqZ8da9>hL@B^k>r$1u>}!^+y)6R2}b!>+17nVFv3AZX|pxKm|z0r1|EogI+{c9hDfXkzZ- z`*RmQ{CfK8?Dg~Ce118GM=&V$zgs>X*O9^r`eGIemNO!-?RHAICB!mPyEJi9$D=aR zsF(NSkFho%)A2Y=3dnZ*O2b(@ErVY~XD8~B20IGT6V(}6karzzI3=*>|I<~|pv=vv z4jZRgugp!-a$Odzz};I<_(b0<@CDjYi&%46W=D0l0oN+l!$Cnq{+3Fw-KgU%iX?-0 zT^hLdp6!hr(upX}39OlW{X@SMeDnFGa>B1p z&rLq960T!R$2fk@ia%#&OV$w*Sp{B3x{c84u?N4@@hjObbe9V0w?^zD&lTD#`nAmH z7prE!)+vpm<(Cq>=wfTjmCvIgE$f^y)vR0~1~%m&(FN|US+jt6b=1wb8#Zz2f;)O&1ROzR8^CnPuU5%^d%iH;}yDPyZdqlZ(Ow$H8Y{(vaG|H>zPH*J!Z=)j1?*+ zsSZ$Wge|$4ACKZKqSPEI|9cq9}9LpzYc` zbh{iU@0sc>6xdutl3AHFj#=$qW&v9;mww}jDO6NFF&nzx6MZY7$Dg?j9K@FW6 z_Gr-miwzna4Q>Z*^E4!u)a@sHi}2pr@+FqF#D719KU_wvWeP7&ARPMWW2{ZJg|F`l z1v{@`MIyXz$Dx+iDZHvC&j-c26`^;&`%myATJSkqPd|V`EXOelc!;7siTlXLPCj=K zRmQ%NYl&Eiy;DUZxHg8@7*jy`pFnuI_zp`D(I6NA1h20H4FS6TMn(C%xm+q=N%qa# kNcI%@$SkOUx-xD6Z*yA!@8B=IH_*sm`G0o^!o_?410(EYZU6uP literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/model/entity/Collection.class b/HRS/build/classes/com/hrs/model/entity/Collection.class new file mode 100644 index 0000000000000000000000000000000000000000..5b47bdc3c6893b66f44241ea8eb65f13ea0cc116 GIT binary patch literal 2075 zcmaKs-A)rh6vxk$en7iWEFUUV0r8_P$RdItfM7%sl148eBzj@8lnpFtcTKxB;SGEV zeFilW6ED2g_zb>;K7jFmX1BZTI^||&r*qDKe&>H?`t$GCZ$z|64^tEqG*NMC`cb{1 z*PH{hs++cJxhMLDQ>~g6*K+I>#RUx>8*dD~YS@SR^ZjFN2#Q$;_`Mu%lpXtUMNqG6 z+J^0JV>fl=G#e&=Wh$QDu2nOGtfp&K^~Z*5a#p2o;_K0gpj?~gj$5~+YTDcP@)J^5 zP`<2W-{MoDnOwDO%Uu)HQz-5Uif^F6H1*K1MuT)tP_}H@=CfvP->mN%`&EGD%1*_o z?iqE9*Zz-j_sD7pno=JY8if<53vKMukLbF%*GGcJHA+#Ezb})8ea>4KKnRzX_UxY!BWU9vSxz zUomdFoY8VQ!%sQG0Xd@*IfDiBAQW&>G3Kzkjagt$l)li=M;SJPF%4Ow1&SkJ6knPb zMCa)ORxEH4BMZDhBm-qxpfqzzW2M6%t?SK$b1AuB$Xfw@&Ryi2grN` zM2u5HiNr6WsGka;D@U9}@iQIID9+3W(s@0>yI(S3|jN0y@?FO?vx^uSN< XaAY|O;sE4z7ZCoVVURWW8l&}pA?G)4 literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/model/entity/House.class b/HRS/build/classes/com/hrs/model/entity/House.class new file mode 100644 index 0000000000000000000000000000000000000000..1b65370c47ee2f1b57800899fd0029a76933c113 GIT binary patch literal 5548 zcmZ{o{dW}A8ONX5NysFbkYqqaVoQS7ge1C!h= zs8!plEfsmON?WLcFK8^bHd+kGOHkX|bNWM1PydCMmp`HH@$~fj%$?cY+}`1w*?Z^S z@4fePpZh$|o$#0cUYIAMb@X`+MKoFw&t{^N`9d_4O*rYOGgWkpk4NvzP8XaSs?w+_ zW$&}2X?rRe-8r6e;zf-jZUXJGaz`vXmF&}~4yr^tn@?;6ykX|S9G&e8ZB}&$zAz0Dutq5oW?Rn9P1XHK}hRFbT zMK>MY0s${Dol68#Q58}%*zT~+BO8L(k;&{7-WP3hr`+OzMtaBU-Pq_5>{~}VwVHG* zeMzInm^@kp@P3jqnikZ^oH%cb`f1++BliZWBP8g$uFZ z9+S*qWxrV?Gk|7iVbzdH4XiQ)KH){Id!X!i%Y*I7uE$f{XVPM76jM};xy9e4JcKt| z?@u34>@cZ`De6JNQwWI03e}jizi7}mHPY79(J1Yzp|J&VDXeJHZu%D7&Utj&PQzms z7+QpG-|7bq+6&FKV`s0=oHFPk)UO^rfI7~2v}ng4*2)_EUSe~v zn4l*y|wi^T+Xlo6cM$u!?V<>tJLcG^roqzu7`)^!({k%a>^6R+| z|9Sp}YbWOndMbE5=)FDz^W3=d+Krj#4EiCP?bS2aPrWUUaLCUe4Emf&HwC5%+6Ah3 z6ZxVPo8{!fgMVt$GP+sBSfxCO(Xu-5o?U)E;?ajqS{^JNw2P(18!yeepP6(^uu8cH zSqNtmL^kI!*8be26+CAnPNuRCPFJD!(j3cAnAF1ZrV6>A139B?b@K%ru$@Hq8>N#b zoubzfx^Cg#OpY@((j&a`O&m`*3r?H#Hoe2CDu+z2QM)Q%JXDdsN>>V!JQl&JFHv?I z#jKFl(0dx)T)w?T>)^DTPB?jkehVM)velDrqQ8#L(C;{5ujASWCVfc1ha=dzoHK=V zduJtF5M%$x=1<*c&_|fNyVbk;`rCQNb3EgDX(E3|m6?12V;_&az#}i>V(1tO7aDXK zfzjQ{mu!E#L06Eex?B0e^lsIDgFZ#>>~1Z1F(;7zVA8K?4Vp)@)A_iw)#a#GF z-c^G1;)_!ZUSN^6GRS3s%!h!mcQMFUl_2Y7kiRQIzNQ9QFN0hM$c+#Xc5eo`TM4pJ z2Khn>vPliHQ3BDLsamr_Ksde_q+ba#Ac1IiC_%oi1{sh+`T(*i1cU>eK{hKv24#>D zCCC;v$e;}30AwNrgfk3-+)G>WD?95p8RQ8i$aeaMKX`$&Zj(Wd0OV*02&Xs(xnF6K zm<)1S2{NpJC{$vnW z36hdQY$Zrq4U&>U_5tLv5D>n=86;Bz`Lll^7T|iRy>Py%_ux)MNjz0}*5K*Fvlh<= zJUw`Z@bu!@*=3EuTTf8u4E1(dd9U6!L+xEw(W@_?p_VRdpI2|3p+;-}to6jK_5E4v z=~?RsylvszD{!Sz8g`;OAO&#SHbtZdzju+)w2TldHG6a31_?tl#PHzmjmbkHBXAlV&| zL9PPiS_lY#modnTN{bwlLH?rzIij}6Aqhlpq-wn>1cW~f8RV$aA}>iG`t3@Pm(><| zNd~zaAR9wK_{)?*UQt@)m<%$k1o?&9BFAKqI6x91ApB{}Aiq?C9G5}%D?xsx201Q+ z90JJU5D@-0XOLG*ASpi;v>_Etd`>M~%+YHnsF`cl8*}tltV{2i)fiF)uEjY*f0LT^ zx2Q!wO)GT~UE=e(%@5cXsAlM0EXG%rPTERT@mCFgIY>@&6Usdo>C9g1H|OYmtk*tA zv)0);nnQg(iY7FCY+Vu!8%quIqG21WKN0m*(Ao49hRo4tWt*pV1il%71+9Dcy>H1YLyw^gp1+cLo3e literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/model/entity/Order.class b/HRS/build/classes/com/hrs/model/entity/Order.class new file mode 100644 index 0000000000000000000000000000000000000000..56e71e9f93d4646e5425563fd29d288143496b84 GIT binary patch literal 5187 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 n5cnM>fm^5y+{VBvmw)a( z1TcbILFgJ{3&oYxQmLF;Ddy~a$}Uu#%3A7d*)9dqp`mBlx?-jBR$(!9dVbknsA$lg z9F1q1A2P+l;;4pDm4c?M6GTQ&cNXK6R2D1jTBu;aU}@bnQIm6r9Sq zh7E~U2(k5?fv~jp8Hh-$-$0kN z1`HU|+Has+S_cd~C9RZ!jnX=3pa+{c-ys80Id<5Y;WqA96eEW@;SQ{f)3l5;*oPVH$1Dyai|26`W0=DP&QZj9L48Y- z)v1Y5l$Mv97RBW?rdfnV>C-I2G#8I?i37soBJ*~nS%fKyEiN>dG|eJR@oaIiBf{cx zcL|FN&Xqetbh6wjYGt|aVApr#q|;(R6YyYOS?U+?Vm)}AycxMul(|_Zxmh;|_@>CP zO?tV@?yN6c!%>XZbG3rRy&zvIL5@*<@My=9}wPj26GObSTa+LZ zYLGq;h&DhVrVj`oc?LPD1W9;7#+4wis6i55kXZuB`hf6_V~|ry5Yr2?qy%|Y4Ptsh zt`o?|J|KMI8RRu3NYV@Pg%V^^4U+VNd`%$V_<*q9Fi2VnGUx?)pagkc4KnBj`ISI^ z^8sPGV~`Aq@sol!9WlFSb9r@_$I!a{6sp;uoM>YC^9O!iiK9mD}?!ZTKfT~#!`B)AR zm>lT2PKnm>X>;fM_#c9P4`Ka2dh`d_qyLCu{UIjwpODob!PbAqGJS9U&nmckaZ~Kr GXa50_C6Y@3 literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/service/CollectionService$CollectionResult.class b/HRS/build/classes/com/hrs/service/CollectionService$CollectionResult.class new file mode 100644 index 0000000000000000000000000000000000000000..4612db1b93077d7045b0d034b6037bf16630f367 GIT binary patch literal 1072 zcmb7?-%ry}6vw}J8!IhE5ZDBV0*caMViUuY5Q0ujOa>;7@UXY8-i%ASHtFq%f0PfJ zKuCP>5AcsNp3@E%yAtEeJ@=lTAD{C*{q_6DPXIe;8Yl_8@}q%!7He0__(J*8ZAC#K z{X|7!C-ZEMJ)fi=28n@+!2G#);kkhq_T7)Yb4m~}^w9UE)&inSuK``Xz7$w!k7GMY ztit}TKvjNGI-%I=o(fg6FHm-xrvjB$^jTUc8$F_rGzz!OK;gh1WK6siK2mdWkMiqmCEt1pwIoB5WU=H!H2 zVbz9#>8!$Sbj_Iz=91G&AEuIU=7tTEdz;id^HP;gG>m=uUaddVUS*dM}B z#;w59T51DZRO_FL&^E{AvK?cCD9ZGolu=?C=vLxkQcGxL4T_)*(P`7mB`e5IZC_*d zdm1)JXEk;1VxI1H7J&O$pqIcRmgxLD`4Y9Sx#WYw zXAz^;jKwoC@d_RmKs3JPAl?>2Ji_A%h!TJh+|!CqVtZxs&~#lnJM#e=tXcc>|87B<;J|C$GXfImu{ zZ5Jc~|CSoxP&$(l`GZ6$imXiZXzB5=DbSpR zv(Q(e9{Ufk6OIcs!Z>zdf#w7OksRyLW+@5Wu1&c5>3o{7 zAfL3AcK++H``64_lco?ttgglCoUTEVY5w%~YN??>b(CajM0ZlLnyyPKCU~CDMW8;^ zn$m#^jUnS$w~u35QhIUF=OIrT;jejhp6aWJgEpGh(c5_;vu)mq=_w)8JM2&sXQnsf(IYK zhZ3thu1OT6p}MNNmanQ`UZ0);Y+~6$7h%l{8_s2<93`S_=?UjBOq3`$jpe;s&Ddu` zC4OunO&GXxuU*G?gSvBCy%JtbuvFrCLMZ}O*lMuq)&*gx^c7oDi_0m81xqDWs z@&_yfRI(t9*yu)vkW(W5d`uTB8ZTED@$ttzh2l#4M7qM14GTTZ3ZKy<#r9xRvK%In zCk~{ZZSecLH}tv)_E8XsXy13063W6NVfwEj3H?962@8yr;y>=IJVc&#yBUB146?;vieZ*NlkZWuX-O`1OdiG9d-9fH<5sIv z4=A*@J~r8-9HU{Ht+l3S(Zu7J=m0T!+X8XY5n>uMZ4he@m~4eO{RKiVk{E5)beqFG M-+H0MYhOb44VspmA^-pY literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/service/HouseService$UpdateHouseResult.class b/HRS/build/classes/com/hrs/service/HouseService$UpdateHouseResult.class new file mode 100644 index 0000000000000000000000000000000000000000..d6ecf861eb5942bbac1f15eb8ca5c5167f98ef4a GIT binary patch literal 872 zcmb7>T~8B16o%hJKbDqNz6vU>qQFJLr0WG&K)h*UFsYhYOJd<>x=hND?XKC`%D4K`81SNs&0;pG9Ah;983>7 z+-EOU$CGW#W|YRh{Gg1y`NvDInT-+Lk6|d|dLXox+QAy3@-Lm-WbCoVU}%okbpVNv&RpMMLz#5{)y80Nb&cH z#mjhhSG;4{c+^(8kJ9Mqwyj>~90M~LZ7ie35I@I@2@oq6BM^rZAu4z|2JyC!l~IVJ Yzd)Ep5~IDc(^m1CZ?jP1wXdUa3qB>FdH?_b literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/service/HouseService.class b/HRS/build/classes/com/hrs/service/HouseService.class new file mode 100644 index 0000000000000000000000000000000000000000..48ea8f552d967a55b96a105cca1d69766d4634c8 GIT binary patch literal 1200 zcma)6+iuf95ItL2np5|0T@~4GZAm zw!r$SJePhflac@JoRJ%uZru#uT{?hJ)Q+;8HWIVn0yE_5~V4HAaCP?o(R?S9#rd$TWIrQm$vGo%Jd=BB5N`NYtM%iG`AUvQ zj!L(07 z;Ps^0wZ&gIN}zc?;9-X+XeLAD_*_^ewkRNQi{A#I!T0_S78!et7O=#)f#njfFkZ!4 ziJOe?VjcN=(L%e7-($Ri`!4^nnHr1Y`Q(Y>-oCRy;IBN`hnNx zUL)LWS3GV6Tpk^Azi$UABpDV@j8j9m4X2|Yv`)AgFr@sxX>#9ZV8^uU(WlYj4B6Vb zZzJ$5r}LbyU6G^OCZ&<cSt`MI`)j9tG}{3ueoXU44bs(URaJ5 zykwXu6q^jmireNH%pj}b5*8R1YL>(6{a%ZEM@Gw*NUmwvO~bRqJ~~VWU5nuNYX4Ub z0!UkaWAJujI8KA%iiTOtF=Tum3@?*~V?mhd@ZjyBJS&CbNClz-35Dw#Qn(N*482zi zlgqG3xiYc!H&F;ApbbsX+hY{U1tpTc8?jem8H zL?%WVTf{a)zrrjMqFwZr5Ji`kY9%ebTv~bn*?EefsiJj}b~;%`cDD2bOW&m1GOcs+ zu!)9+T40Gc z3gWA{76Y;QRe?B+h1kN435eY@Y^o5ADG;K-0^%mNV<2`^h@)7D+bG0A?5GeQra*}9 z3W#ECB}ytpGZx}bd?iXM#K$QRVzdOrU6g56XF^vYKE*=Z!~H1ud?u(Jx(e}m3WS(z UMw9YDHh&)v$%eIggeOS<1q6u&GXMYp literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/service/OrderService.class b/HRS/build/classes/com/hrs/service/OrderService.class new file mode 100644 index 0000000000000000000000000000000000000000..cf454b64610d761026ab1002f01eee1a8b038913 GIT binary patch literal 890 zcmaiy%TB^T6o$`$a+j-j(S^Ez4RzrTV>A#Gk|reL%H3E_uw6C<5bKwK{P{zYh zKy4$7&dIrdGyOlm-ai1~8qU&?U{H6wiS?>{%SSbJ9klvth-$EK(y+y#Jmynw2`)!g z|7DDhW{`Ija*d{xfoj<665ErbcDx^GS6E%@3-fEgY5zxY*;#LUL_ZL^%^>r}XW{;f zjr*I=b7n3b6k$(kg!&03m)Zn;2Ir9}&BZkgrtSLkt=WM)l3WK08Qg7bxLI9m;tf$) zD7C9+ix+O+(zpsy*jx^Ur-n<80>$pdf|IbSjTnrpNO0q-B8@dGx~RD;7_?&WmwzD! zmqG3KlXbj6k`!vuF+I}Ek4uDw$wreBxq%lb2OnHPFIX`^q1IY+4KXP6q(s#b-1pH> zL!CgERB;N8YJ*|1RtqyAKDZ_t2b2a7;Ew9VhgiLiQWLwEfKh literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/service/ReservationService$ReservationResult.class b/HRS/build/classes/com/hrs/service/ReservationService$ReservationResult.class new file mode 100644 index 0000000000000000000000000000000000000000..cda3778c456a886114bf8cd1ab2562f035e569e3 GIT binary patch literal 896 zcmbV~-%lDr5XZkG$O*j`RFtZ1wU!6K#Csuq(1wRnn>3+qQW_t4Th0xxIqs6%gTKlL zO-h>h;2+RGs_E<q@N&)M2a7s_03=M(ZKA9fiv8 zof0zdl&_)&AyuiK6VlD#LgtXdQyW?22>F)s<(EOfE5q-i>&0aPS9s?lRK^}V)6u2k zhHqQ{GYDg3m2OX{nWU2iVavuUGK8F#(eyH1=@`yjPez|7gB2^)#nDWKJsTF*k_yx4 zt;%9>T(TVuLRWrNX2{aaw#N@}Y_>MmbNzBHrYI`FT=UX@9>}`%QFiC5pnOO|+bL=dE*u9y9_^=e>1zs*d9F4F$ b4{`Pn2(w6Hv{!MreH`#<7D~MKH^}}07U8Pc literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/service/ReservationService.class b/HRS/build/classes/com/hrs/service/ReservationService.class new file mode 100644 index 0000000000000000000000000000000000000000..85f3dca9feca1f7350971c6e5360ad6b041b3d49 GIT binary patch literal 874 zcmbVK!A`M(f+!#$;!!!s#a_5!JP08nX`->7xUKC3mMq((-ICy^dGG`LDC4vk zS*V7@L%TDx`)1z0eIK81?*Pz+3kz}#F1=uGPs7NLFkA=^?I%nku0^2SRmp;V29+6K za9eUUu^(P$=xGL3FGQ}<05EvHcGd@-KuvnT=dl*j9uV5xcXcQT(Q$TjY8z82jHT`| zXiQK)qvA>%yAjG{x)PQPU(S{_#(N~3tcTybY`l^MS+VrNY9Pm{)*^0#*)#|gAfw2a9E)Lcjg-3)sD z6n|cmL7BQeqVnnO`a!J78MSPq5rd)|#G!{nAxYwTu@B#<$JLh?wS0fRkqKY&G^K7c$V-nQV7>IJIiph)@AR$hYR^xO%Q)3pNCbUlSy Tim9jn2At7aq)tuxT2S}`ye|p= literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/service/UserService$RegisterResult.class b/HRS/build/classes/com/hrs/service/UserService$RegisterResult.class new file mode 100644 index 0000000000000000000000000000000000000000..5ca87934fb12b2dac35268e752eb6b0a912505e4 GIT binary patch literal 859 zcma)(OH0E*5Xb*xAF(yss;#g3);=TFW*-n=riYeP5r@`3|fT2vwgvQ1P+W YP)8YWfJWItc)24q{TunomOmYYXPDT4(f|Me literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/service/impl/CollectionServiceImpl.class b/HRS/build/classes/com/hrs/service/impl/CollectionServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..246d67191a3cdd6d211998ee18bb2a93ededc2ae GIT binary patch literal 4251 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 DxuLcr literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/service/impl/OrderServiceImpl.class b/HRS/build/classes/com/hrs/service/impl/OrderServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..7cfbf652bd7811ed9488b3e34b151dfdce019077 GIT binary patch literal 6057 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 RVw5Q0+s>H+SjA|h{~v@KJktOG literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/service/impl/ReservationServiceImpl.class b/HRS/build/classes/com/hrs/service/impl/ReservationServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..41fe4dc7172991f44c293060d2315e9be06bcb54 GIT binary patch literal 4605 zcmb7HYjhOl8GdH7o7qez1cHey7mW}wA%O@|s0rl~C=v_=6Ns8>%dk5p1Dn~n7Zh6+ zR0@a)wje?y$VEg2!gWJHpjSAjzx>r-{mCxLIX$O8`j^%|-^^ZSSyJi&W@ox6iS$UznOds5=MoyW|wLq2@_k=Y5^_ebjsaE3Eu8dETUVI z6*-d2Q|pu|oNt&$bb*9|>Y5G-?j@msuAl&=DvF`X7$aed)5-ntXk9>4FdC&rkno5K z8D1F`5+>#8rTy9(<+g@TMG+JUr7ec3uZs1o*TZYH^+8=iSxd;T1v|8`A-+?K?r66W zkuW0z=>JGOagOnabuFqp(kkK2>XvLVT0&-5pW8Vg1nWjrBaPC7wp2oAXsRTWgCR6!M{$(Tw`A$=0RC32avhVA=2d^cr?-wdhshEY?w#rJ% zYhAQg?#x;`3$!tZ1xxO@nY_C9&dsCAt^LFM4i5GAdoh+?i;>@RszEfT-k|51e(1fKjmPi<%_MLA*#ZR$}$?RgnqFOY@d_7WK z5qlO z%u&6NSEc$T-WZEKhCxQ%Tj=|+WSUsmx7e$Ki?Lo1D7Q1qg^dPU6&FV;zz z>a6e3_KS&g9}o9!89KQ&xo2-;=k8gFb9-2O8S5ofJ}~c&4p5*8a2j+KucAvrF^RiI zH#IXV$S^ja3>`w+P_aQs3z}P0Y7U5E2UYaIlu*J9wP;uw%*+{I}5#J#+6!c>X<4QooJ=cp~YUAoKIUv)3q3p zC<85OH@Zv?oG@v%?4b(tA0F+3M!~t?sp!K2X22e)*bh0+lfp9`hYwo)i zFV19Nbbl2%olbM?KP6b(SHhT$*qVl{7cG!Bcw+YHb`-iuQemu|7{h95p^q*^D^qeV%i5+^oyn zeA?ceaoeHrBYSQ7C5)>Z#5@-o3Vnr6fuGm{Wea_UaV(DG*+UNPmGwt z)0mBC_*}&Q04>2hJj*-WO0KLy175%a_^}Y(+%>TnF&?{b@CvmJ%dm@*zu`4$KU#2@ z8fUNy1H8Cg$7=kU)xV9k_>Q-WztPIy@gkDEnEV5s_!nMgO<$2@UOC2LomJ*u@`j~M zm07&KhxbM4`L>O3F6-^r*iJlRZ3lLeDn(KmK42Uk#&`uEVmAsI$y@k{ax&vFu?Ks} z%I|n%`RUUALoQCV zbO}cZ=qyAD40gyyD{U3Fb~4^{7=Wr`KaR zPTyh-#2L5f?M1{W*WHGv;B*S!2^Ut)xP?(9_Ln64*N4Pj**E+=V>MM;l3jSV0HAZyDYYlEnT;8Yu~(OLoR z%(pPQsa=9^nIDgZb_`^JcA`K#%Db5SCfMsZnS%TfYO;3sQ}Y{|KTVRH9f2fv@|`5P vft&x+TZSpWcR9*$H$t4=2Iy^Y1aJ3K(uF@UDK1W?zwlR~-%2Lp7K;80o*cVC literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/service/impl/UserServiceImpl.class b/HRS/build/classes/com/hrs/service/impl/UserServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..a0512e1b097c8190aa263f64219b6db735db1bd4 GIT binary patch literal 2905 zcma)8SyL2O7(I6wm;oBZQKG0ZniyquaE*d7am58t!4(y4W*TUm1!qxlN!)i_DoaIU zRkYNKsfuxl84!sNsgw_S$y0uSRSb})RGt#6Ow74G^e~8psj2Did%yLb?|fhPFaLHt z1~3!nZLkPTa{0Z^#z4>+)B?M7m*&*H%^v4EuBu}j%el6}Dv;Hr?oyo|)z{!$RoA4s zLN=rbjD6WY!BoH&rlZBGUm&~ORCKF;!#}r61ybheK0P#FASpL*y?}L*->sz~2^k7f zk!Hg%fpLkJ@$_geQ%gf8GEyPnP+)^yU|6~C(<;N>IxVnPt@CJ1$(XT2KG<+^Xv z8fw&o0+Zuu4RwCzne6d5=stn!-12@LszU+Y*HHR@cJktZygZ@Dsrf>BsKo%HG!0`g z&W5oAFpl|F@FvC+76$SPjLgj&97|eHP%sg16K_4Z#M>NdG2pC8!z4_$;awV<5Qam# z$62v>);iu5OhGO+z3y2A;uYt5MX+?_qtJ!|ff1(5gnB9{!c>8rdfn$<*dm$WQ@z>( zpL?|$4DR*^+yV<;5ohq3hDNIx(`}f>IA#iiAXP9!!j|5kg{u6lc}p`%H3qX3%*J~p zowhTqdRYGK#B5@$F3qd4W3GUho`zzSDwrodrP5P%NDYN)WS69t2b0tqLhCl}6x^`5k&3(+Z2ebw~7?OsYbBC}ToLWDsCfQ|) zs$+dVsjAOyl@<(pLZvn=6Ua9ae!W2&%8(%;TdAPj1Yi2EBvMjXsbCdW3#0`JW!UA? zg2d9ATa&lmjw+U-=hIu=C)=VITD#g?dyo9s)!xzbO@}mGt6&{C8>C?ct<(l0KcI4b zeVDgi#^0!5lNsOSogJH5tmvKNJy#DUy0>Gi!1%8A8{OYt>wWx5^w`aw%SYpCUF`>Z zPdt!5w<*{zecDNb)s23iW=9<>Q#)<*jH0<)x48GsJupcU%&kB}J^RqBhFp!>%M3H~ zB*Pj7Mt7e&(|x5QdcLjuYG<_bJQM4_eZA+}ce2Tv6zqUUAah_Z2{;oeYdRc)26k|2 zIpW|(+wMnie-XWMO9p9Huu}#}j|J&F8MAi8Q=@+O_qU?Q&q^4=3U4Om#yph;R$Ls7Lq9B^q%b@_%Fnb1e_r8HGe1)gKM&!+_zc{mOv6*32Q7$-JC z;Xj#wi+p+UwJg_s@9~<>)k0$pWaYO($$x~*O>M~f0mJW6X2A$vGpPZLhLz+S#`{RF z6k5{;*?5C@fl=I#`TLvNDcq|qc!G?A2y!BL>k^X1-9oMl6W8r{r^K570K*G%tPhcw zgp%Z(dLXwf)RO1wrndKDblZWx7!vsvl zWK81+$V@E3EcW+Y_G<|?<9#Fh`LPW9vS+T`pKqL~79a4*BJ;+AqP<7z&no2HL>0M<^qp%PWb*iYLgDHxq-bqNE5a ziX3Yqs4luo$%dH1hL;s;;tIr%sF;RZ%>CLY7)JYAhZ=#aU*2HI4TKr?A#@8$tT|Rj z>5J@5RH%IjKNXA`mNM(VA^IF9X!s9>ooS*kUJy^4@lQ@R!_u#q!(6KeR|&QjH38^V0r3l#^s zI*fW;L<2rYBff-=YiPoC_;4S7w4oWDoHIWmfS)-(e#LJ5M$4xh7CqRHzc?NwZI`hH zSd@6-pBV*}RDOn|M&a%F6UT6zg}=x+Cs=MPBb4E!QTV5%`6-+xeIx}oApN=gs47!N zD5D(8b4(x)V%Hb^O0n4>xM9$v%y=l~6r=hJlH`>_3x!lCch1ng1!vL9yX@35vhEyG F{{z5&8an_0 literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/util/DBUtil.class b/HRS/build/classes/com/hrs/util/DBUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..20ddba14a1cd2c5f378a7fd32e92d80dc55760ef GIT binary patch literal 2676 zcma)7YjYD-7=AXS-H?U?0oqzo3ewUGZ9py}X~EJKfhMISZ4vRpcC&4^Y_ef@Q>eEY zJ~-nr>NqN1xQNckpkI_aPALfT%@6(zXWA*B_y_89c0-z8obk(^bKdiw=Y8Jm{`vR4 z-vR8#gbbgAb*h<(q%Av=cXT7teQ1!248MdmW6HP^F_i3RdNt{5GTmDeN$29rIB zzRq}00IMbVEz_i%f&R{9^5pSEH@EGop=WjH068}{4N;}bOld)EK(&l239IMh&}AsL z9YPJBk|2+mR-clgf%?X!p=v4-xv!!t@id;1v2j7vlM}Y1WkPrsn`qt4li3FErEW(0 z8FYuC*OW{&fXxz~{p;HMb@7ShiP)nbCuc7GFmvhKxd#tsKlo(k(v8RWF9z`(>Sb(Y z!d=P>Awp=tHqy=sR3l46%h4VRph+0I{^3$XGv80n{d&_i)PhzS+a=U3icO#C95(aW zRL=!f%Q?E44WSKT#?ZBzbQJaM0MpB$t&ZtgtuLP$W>%G9gOYGel*W)^>Ec`vO1#*z zIF?JSh{|-q<4UgZu)N*PX%H*0H^fdL3BQxpZ4uyQ+Cd2{>ig!UAM5m0GBvcjez2=B3S!GnSLU<8}B*d4=Ly5fs1kzoq3AOG`0utU)bXdRO9Z(@+Htqbhm0#MmM-iw)^@6Jtr z_xS#mAkIJ&g}zPfMngzL=QLMxIW3!#&{|q#-mH(7&M1#%!9Y|%oDIQ1hU3vOy-Q~1 zNk^1$;$$*~GaML;oGBR>63&Uj;IQ>8)+lqlZkY(lU^k6FiLGm5AZ?lFz3C84nt4mr z4(no6RCxceHW46fW?WbBZ|6rX%23Xe%##lRo`WUl3Z7S$oGW==v*29LH)|0l!a5>Y z#E`gd3J0dK{^T#H4cAR!%Pp+w75hf+o2Sq`=_*z7VGC(Q_@I`c;I14yP>G!ce4esh z9P)c80YZEc=65IMpd2LZJ0YV*TyRqHE9^(O3j1Zvcd%!Y8=s3V90b-Ek*I(du#d8p zqPD0N<=#)Nb{D4E4Gs_tSA;9WmD4zIdlA+#7t7}&FiCtV%wHsupKDF?A6VOb7d;Yg zA<)-4g`+Lor*Ta9?Pq{j(T?YL*wsJ7uRiE$!?=F zKGsPG4S0dy%On7wQu;ZI?lK8~LA@{0h_C3_*VMgA?JGFIwHwzs&aX1A*IlRU+^EJ` r?KUxd=q)(i=oV;_5|NS``2V3{pA1Ll5R~Zgpp1N=j1Hf7-(C0@62F~p literal 0 HcmV?d00001 diff --git a/HRS/build/classes/com/hrs/util/ImageUploadUtil.class b/HRS/build/classes/com/hrs/util/ImageUploadUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..8ef142bd026099c5e472ef18a25123d5729003cf GIT binary patch literal 6022 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 literal 0 HcmV?d00001 diff --git a/HRS/sql/hrs_init.sql b/HRS/sql/hrs_init.sql new file mode 100644 index 0000000..0d6f4c6 --- /dev/null +++ b/HRS/sql/hrs_init.sql @@ -0,0 +1,170 @@ +/* + Navicat Premium Dump SQL + + Source Server : 本机 + Source Server Type : MySQL + Source Server Version : 90500 (9.5.0) + Source Host : localhost:3306 + Source Schema : hrs + + Target Server Type : MySQL + Target Server Version : 90500 (9.5.0) + File Encoding : 65001 + + Date: 10/03/2026 22:26:27 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for hrs_collection +-- ---------------------------- +DROP TABLE IF EXISTS `hrs_collection`; +CREATE TABLE `hrs_collection` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `tenant_id` bigint NOT NULL COMMENT '租客ID(关联hrs_user.id)', + `house_id` bigint NOT NULL COMMENT '房源ID(关联hrs_house.id)', + `collect_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '收藏时间', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_tenant_house`(`tenant_id` ASC, `house_id` ASC) USING BTREE COMMENT '避免重复收藏', + INDEX `idx_collect_tenant_id`(`tenant_id` ASC) USING BTREE COMMENT '租客ID索引', + INDEX `idx_collect_house_id`(`house_id` ASC) USING BTREE COMMENT '房源ID索引', + CONSTRAINT `fk_collect_house` FOREIGN KEY (`house_id`) REFERENCES `hrs_house` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `fk_collect_tenant` FOREIGN KEY (`tenant_id`) REFERENCES `hrs_user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '房源收藏表(外键:fk_collect_tenant关联租客、fk_collect_house关联房源)' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of hrs_collection +-- ---------------------------- + +-- ---------------------------- +-- Table structure for hrs_house +-- ---------------------------- +DROP TABLE IF EXISTS `hrs_house`; +CREATE TABLE `hrs_house` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `landlord_id` bigint NOT NULL COMMENT '房东ID(关联hrs_user.id)', + `house_no` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '房源编号', + `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '房源标题', + `area` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '房源区域(如朝阳区)', + `address` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '详细地址', + `house_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '户型(如一室一厅)', + `rent_price` decimal(10, 2) NOT NULL COMMENT '月租金(元)', + `rent_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '0' COMMENT '租赁类型:0-整租;1-合租', + `facility` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '配套设施(如空调、洗衣机)', + `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '房源描述', + `img_url` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '房源图片路径(多图逗号分隔)', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '房源状态:0-待审核;1-已上架;2-已下架;3-违规', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_house_no`(`house_no` ASC) USING BTREE COMMENT '房源编号唯一', + INDEX `idx_landlord_id`(`landlord_id` ASC) USING BTREE COMMENT '房东ID索引', + INDEX `idx_area`(`area` ASC) USING BTREE COMMENT '区域索引', + INDEX `idx_house_status`(`status` ASC) USING BTREE COMMENT '房源状态索引', + CONSTRAINT `fk_house_landlord` FOREIGN KEY (`landlord_id`) REFERENCES `hrs_user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '房源信息表(外键fk_house_landlord关联房东用户表hrs_user.id)' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of hrs_house +-- ---------------------------- +INSERT INTO `hrs_house` VALUES (1, 2, 'H20260309001', '朝阳小区一室一厅', '朝阳区', '朝阳小区1号楼1单元101', '一室一厅', 2500.00, '0', NULL, NULL, NULL, '1', NULL, '2026-03-10 15:32:31', NULL, '2026-03-10 15:32:31'); + +-- ---------------------------- +-- Table structure for hrs_order +-- ---------------------------- +DROP TABLE IF EXISTS `hrs_order`; +CREATE TABLE `hrs_order` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `tenant_id` bigint NOT NULL COMMENT '租客ID(关联hrs_user.id)', + `house_id` bigint NOT NULL COMMENT '房源ID(关联hrs_house.id)', + `order_no` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '订单编号', + `rent_start_time` datetime NOT NULL COMMENT '租赁开始时间', + `rent_end_time` datetime NOT NULL COMMENT '租赁结束时间', + `total_rent` decimal(10, 2) NOT NULL COMMENT '总租金(元)', + `pay_status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '支付状态:0-待支付;1-已支付;2-已退款', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '订单状态:0-待签约;1-已签约;2-已结束;3-已取消', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_order_no`(`order_no` ASC) USING BTREE COMMENT '订单编号唯一', + INDEX `idx_order_tenant_id`(`tenant_id` ASC) USING BTREE COMMENT '租客ID索引', + INDEX `idx_order_house_id`(`house_id` ASC) USING BTREE COMMENT '房源ID索引', + INDEX `idx_pay_status`(`pay_status` ASC) USING BTREE COMMENT '支付状态索引', + INDEX `idx_order_status`(`status` ASC) USING BTREE COMMENT '订单状态索引', + CONSTRAINT `fk_order_house` FOREIGN KEY (`house_id`) REFERENCES `hrs_house` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `fk_order_tenant` FOREIGN KEY (`tenant_id`) REFERENCES `hrs_user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '租房订单表(外键:fk_order_tenant关联租客、fk_order_house关联房源)' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of hrs_order +-- ---------------------------- + +-- ---------------------------- +-- Table structure for hrs_reservation +-- ---------------------------- +DROP TABLE IF EXISTS `hrs_reservation`; +CREATE TABLE `hrs_reservation` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `tenant_id` bigint NOT NULL COMMENT '租客ID(关联hrs_user.id)', + `house_id` bigint NOT NULL COMMENT '房源ID(关联hrs_house.id)', + `landlord_id` bigint NOT NULL COMMENT '房东ID(关联hrs_user.id)', + `reserve_time` datetime NOT NULL COMMENT '预约看房时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '租客备注', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '预约状态:0-待确认;1-已确认;2-已取消;3-已完成', + `handle_time` datetime NULL DEFAULT NULL COMMENT '房东处理时间', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_tenant_id`(`tenant_id` ASC) USING BTREE COMMENT '租客ID索引', + INDEX `idx_house_id`(`house_id` ASC) USING BTREE COMMENT '房源ID索引', + INDEX `idx_reserve_landlord_id`(`landlord_id` ASC) USING BTREE COMMENT '房东ID索引', + INDEX `idx_reserve_status`(`status` ASC) USING BTREE COMMENT '预约状态索引', + CONSTRAINT `fk_reserve_house` FOREIGN KEY (`house_id`) REFERENCES `hrs_house` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `fk_reserve_landlord` FOREIGN KEY (`landlord_id`) REFERENCES `hrs_user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `fk_reserve_tenant` FOREIGN KEY (`tenant_id`) REFERENCES `hrs_user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '预约看房记录表(外键:fk_reserve_tenant关联租客、fk_reserve_house关联房源、fk_reserve_landlord关联房东)' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of hrs_reservation +-- ---------------------------- + +-- ---------------------------- +-- Table structure for hrs_user +-- ---------------------------- +DROP TABLE IF EXISTS `hrs_user`; +CREATE TABLE `hrs_user` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户名(登录账号)', + `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '密码(加密存储)', + `real_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '真实姓名', + `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '手机号', + `id_card` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '身份证号', + `role_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '角色类型:0-租客;1-房东;2-管理员', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '账号状态:0-未认证;1-已认证;2-禁用', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_user_name`(`user_name` ASC) USING BTREE COMMENT '用户名唯一', + UNIQUE INDEX `uk_phone`(`phone` ASC) USING BTREE COMMENT '手机号唯一', + INDEX `idx_role_type`(`role_type` ASC) USING BTREE COMMENT '角色类型索引' +) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '基础用户信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of hrs_user +-- ---------------------------- +INSERT INTO `hrs_user` VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', '系统管理员', '13800138000', NULL, '2', '1', NULL, '2026-03-10 15:32:31', NULL, '2026-03-10 15:32:31'); +INSERT INTO `hrs_user` VALUES (2, 'landlord01', 'e10adc3949ba59abbe56e057f20f883e', '张三', '13800138001', NULL, '1', '1', NULL, '2026-03-10 15:32:31', NULL, '2026-03-10 15:32:31'); + +SET FOREIGN_KEY_CHECKS = 1; 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 diff --git a/HRS/src/com/hrs/dao/CollectionDao.java b/HRS/src/com/hrs/dao/CollectionDao.java new file mode 100644 index 0000000..4a4817e --- /dev/null +++ b/HRS/src/com/hrs/dao/CollectionDao.java @@ -0,0 +1,136 @@ +package com.hrs.dao; + +import com.hrs.model.entity.Collection; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: CollectionDao.java +* @Description: 收藏数据层 +* +* @version: v1.0.0 +* @author: 赵恒 +* @date: 2026年4月13日 上午9:30:25 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 赵恒 v1.0.0 新建文件 +*/ +public interface CollectionDao { + /** + * + * @Function: add + * @Description: 添加收藏 + * + * @param: collection 收藏对象 + * @return:boolean 是否成功 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:37:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + boolean add(Collection collection); + /** + * + * @Function: isCollected + * @Description: 判断是否已收藏 + * + * @param: tenantId 租客ID, houseId 房源ID + * @return:boolean 是否已收藏 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:37:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + boolean isCollected(Long tenantId, Long houseId); + /** + * + * @Function: delete + * @Description: 删除收藏(根据租客和房源) + * + * @param: tenantId 租客ID, houseId 房源ID + * @return:boolean 是否成功 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:38:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + boolean delete(Long tenantId, Long houseId); + /** + * + * @Function: deleteById + * @Description: 删除收藏(根据ID) + * + * @param: id 收藏ID + * @return:boolean 是否成功 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:38:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + boolean deleteById(Long id); + /** + * + * @Function: findByTenantId + * @Description: 根据租客ID查询收藏列表 + * + * @param: tenantId 租客ID + * @return:List 收藏列表 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:38:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + List findByTenantId(Long tenantId); + /** + * + * @Function: countByTenantId + * @Description: 统计租客的收藏数量 + * + * @param: tenantId 租客ID + * @return:int 收藏数量 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:38:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + int countByTenantId(Long tenantId); +} diff --git a/HRS/src/com/hrs/dao/HouseDao.java b/HRS/src/com/hrs/dao/HouseDao.java new file mode 100644 index 0000000..f0ee771 --- /dev/null +++ b/HRS/src/com/hrs/dao/HouseDao.java @@ -0,0 +1,307 @@ +package com.hrs.dao; + +import com.hrs.model.entity.House; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: HouseDao.java +* @Description: 房源数据层 +* +* @version: v1.0.0 +* @author: 赵恒 +* @date: 2026年4月13日 上午9:31:08 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 赵恒 v1.0.0 新建文件 +*/ +public interface HouseDao { + /** + * + * @Function: findPublishedHouses + * @Description: 查询已上架的房源 + * + * @param: 无 + * @return:List 房源列表 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:28:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + List findPublishedHouses(); + /** + * + * @Function: findHousesByArea + * @Description: 根据区域查询房源 + * + * @param: area 区域名称 + * @return:List 房源列表 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:28:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + List findHousesByArea(String area); + /** + * + * @Function: findHousesByPrice + * @Description: 根据价格范围查询房源 + * + * @param: minPrice 最低价格, maxPrice 最高价格 + * @return:List 房源列表 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:28:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + List findHousesByPrice(int minPrice, int maxPrice); + /** + * + * @Function: findById + * @Description: 根据ID查询房源 + * + * @param: id 房源ID + * @return:House 房源对象,未找到返回null + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:28:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + House findById(Long id); + /** + * + * @Function: findByLandlordId + * @Description: 根据房东ID查询房源 + * + * @param: landlordId 房东ID + * @return:List 房源列表 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:29:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + List findByLandlordId(Long landlordId); + /** + * + * @Function: findAll + * @Description: 查询所有房源 + * + * @param: 无 + * @return:List 房源列表 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:29:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + List findAll(); + /** + * + * @Function: findPendingHouses + * @Description: 查询待审核的房源 + * + * @param: 无 + * @return:List 房源列表 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:29:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + List findPendingHouses(); + /** + * + * @Function: findPublishedHousesForAdmin + * @Description: 管理员查询已上架的房源 + * + * @param: 无 + * @return:List 房源列表 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:29:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + List findPublishedHousesForAdmin(); + /** + * + * @Function: findOfflineHouses + * @Description: 查询已下架的房源 + * + * @param: 无 + * @return:List 房源列表 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:30:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + List findOfflineHouses(); + /** + * + * @Function: add + * @Description: 添加房源 + * + * @param: house 房源对象 + * @return:boolean 是否成功 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:30:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + boolean add(House house); + /** + * + * @Function: update + * @Description: 更新房源信息 + * + * @param: house 房源对象 + * @return:boolean 是否成功 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:30:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + boolean update(House house); + /** + * + * @Function: updateStatus + * @Description: 更新房源状态 + * + * @param: houseId 房源ID, status 状态 + * @return:boolean 是否成功 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:30:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + boolean updateStatus(Long houseId, String status); + /** + * + * @Function: delete + * @Description: 删除房源 + * + * @param: id 房源ID + * @return:boolean 是否成功 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:31:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + boolean delete(Long id); + /** + * + * @Function: countPublished + * @Description: 统计已上架房源数量 + * + * @param: 无 + * @return:int 已上架房源数量 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:31:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + int countPublished(); + /** + * + * @Function: countAll + * @Description: 统计所有房源数量 + * + * @param: 无 + * @return:int 房源总数 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:31:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + int countAll(); +} diff --git a/HRS/src/com/hrs/dao/OrderDao.java b/HRS/src/com/hrs/dao/OrderDao.java new file mode 100644 index 0000000..fc26846 --- /dev/null +++ b/HRS/src/com/hrs/dao/OrderDao.java @@ -0,0 +1,250 @@ +package com.hrs.dao; + +import com.hrs.model.entity.Order; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: OrderDao.java +* @Description: 订单数据层 +* +* @version: v1.0.0 +* @author: 赵恒 +* @date: 2026年4月13日 上午9:31:25 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 赵恒 v1.0.0 新建文件 +*/ +public interface OrderDao { + /** + * + * @Function: add + * @Description: 添加订单 + * + * @param: order 订单对象 + * @return:boolean 是否成功 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:32:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + boolean add(Order order); + /** + * + * @Function: findByTenantId + * @Description: 根据租客ID查询订单 + * + * @param: tenantId 租客ID + * @return:List 订单列表 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:32:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + List findByTenantId(Long tenantId); + /** + * + * @Function: findByLandlordId + * @Description: 根据房东ID查询订单 + * + * @param: landlordId 房东ID + * @return:List 订单列表 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:32:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + List findByLandlordId(Long landlordId); + /** + * + * @Function: findById + * @Description: 根据ID查询订单 + * + * @param: id 订单ID + * @return:Order 订单对象,未找到返回null + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:32:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + Order findById(Long id); + /** + * + * @Function: findByOrderNo + * @Description: 根据订单编号查询订单 + * + * @param: orderNo 订单编号 + * @return:Order 订单对象,未找到返回null + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:33:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + Order findByOrderNo(String orderNo); + /** + * + * @Function: updateStatus + * @Description: 更新订单状态 + * + * @param: orderId 订单ID, status 状态 + * @return:boolean 是否成功 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:33:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + boolean updateStatus(Long orderId, String status); + /** + * + * @Function: updatePayStatus + * @Description: 更新支付状态 + * + * @param: orderId 订单ID, payStatus 支付状态 + * @return:boolean 是否成功 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:33:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + boolean updatePayStatus(Long orderId, String payStatus); + /** + * + * @Function: countByTenantId + * @Description: 统计租客的订单数量 + * + * @param: tenantId 租客ID + * @return:int 订单数量 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:33:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + int countByTenantId(Long tenantId); + /** + * + * @Function: countByLandlordId + * @Description: 统计房东的订单数量 + * + * @param: landlordId 房东ID + * @return:int 订单数量 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:34:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + int countByLandlordId(Long landlordId); + /** + * + * @Function: existsByHouseId + * @Description: 判断房源是否存在订单 + * + * @param: houseId 房源ID + * @return:boolean 是否存在订单 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:34:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + boolean existsByHouseId(Long houseId); + /** + * + * @Function: findAll + * @Description: 查询所有订单 + * + * @param: 无 + * @return:List 订单列表 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:34:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + List findAll(); + /** + * + * @Function: countAll + * @Description: 统计所有订单数量 + * + * @param: 无 + * @return:int 订单总数 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:34:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + int countAll(); +} diff --git a/HRS/src/com/hrs/dao/ReservationDao.java b/HRS/src/com/hrs/dao/ReservationDao.java new file mode 100644 index 0000000..d9863b3 --- /dev/null +++ b/HRS/src/com/hrs/dao/ReservationDao.java @@ -0,0 +1,193 @@ +package com.hrs.dao; + +import com.hrs.model.entity.Reservation; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: ReservationDao.java +* @Description: 预约控制层 +* +* @version: v1.0.0 +* @author: 赵恒 +* @date: 2026年4月13日 上午9:32:15 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 赵恒 v1.0.0 新建文件 +*/ +public interface ReservationDao { + /** + * + * @Function: add + * @Description: 添加预约 + * + * @param: reservation 预约对象 + * @return:boolean 是否成功 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:35:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + boolean add(Reservation reservation); + /** + * + * @Function: findByTenantId + * @Description: 根据租客ID查询预约 + * + * @param: tenantId 租客ID + * @return:List 预约列表 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:35:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + List findByTenantId(Long tenantId); + /** + * + * @Function: findByLandlordId + * @Description: 根据房东ID查询预约 + * + * @param: landlordId 房东ID + * @return:List 预约列表 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:35:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + List findByLandlordId(Long landlordId); + /** + * + * @Function: findById + * @Description: 根据ID查询预约 + * + * @param: id 预约ID + * @return:Reservation 预约对象,未找到返回null + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:35:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + Reservation findById(Long id); + /** + * + * @Function: updateStatus + * @Description: 更新预约状态 + * + * @param: id 预约ID, status 状态 + * @return:boolean 是否成功 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:36:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + boolean updateStatus(Long id, String status); + /** + * + * @Function: cancel + * @Description: 取消预约 + * + * @param: id 预约ID, tenantId 租客ID + * @return:boolean 是否成功 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:36:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + boolean cancel(Long id, Long tenantId); + /** + * + * @Function: countByTenantId + * @Description: 统计租客的预约数量 + * + * @param: tenantId 租客ID + * @return:int 预约数量 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:36:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + int countByTenantId(Long tenantId); + /** + * + * @Function: countByLandlordId + * @Description: 统计房东的预约数量 + * + * @param: landlordId 房东ID + * @return:int 预约数量 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:36:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + int countByLandlordId(Long landlordId); + /** + * + * @Function: existsByHouseId + * @Description: 判断房源是否存在预约 + * + * @param: houseId 房源ID + * @return:boolean 是否存在预约 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:37:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + boolean existsByHouseId(Long houseId); +} diff --git a/HRS/src/com/hrs/dao/UserDao.java b/HRS/src/com/hrs/dao/UserDao.java new file mode 100644 index 0000000..a81da7a --- /dev/null +++ b/HRS/src/com/hrs/dao/UserDao.java @@ -0,0 +1,250 @@ +package com.hrs.dao; + +import com.hrs.model.entity.User; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: UserDao.java +* @Description: 用户数据层 +* +* @version: v1.0.0 +* @author: 赵恒 +* @date: 2026年4月13日 上午9:32:28 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 赵恒 v1.0.0 新建文件 +*/ +public interface UserDao { + /** + * + * @Function: findByUsernameAndPassword + * @Description: 根据用户名和密码查询用户 + * + * @param: username 用户名, password 密码 + * @return:User 用户对象,未找到返回null + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:25:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + User findByUsernameAndPassword(String username, String password); + /** + * + * @Function: findByUsername + * @Description: 根据用户名查询用户 + * + * @param: username 用户名 + * @return:User 用户对象,未找到返回null + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:25:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + User findByUsername(String username); + /** + * + * @Function: findByPhone + * @Description: 根据手机号查询用户 + * + * @param: phone 手机号 + * @return:User 用户对象,未找到返回null + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:25:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + User findByPhone(String phone); + /** + * + * @Function: findById + * @Description: 根据ID查询用户 + * + * @param: id 用户ID + * @return:User 用户对象,未找到返回null + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:25:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + User findById(Long id); + /** + * + * @Function: findAll + * @Description: 查询所有用户 + * + * @param: 无 + * @return:List 用户列表 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:26:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + List findAll(); + /** + * + * @Function: findAllTenants + * @Description: 查询所有租客 + * + * @param: 无 + * @return:List 租客列表 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:26:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + List findAllTenants(); + /** + * + * @Function: findAllLandlords + * @Description: 查询所有房东 + * + * @param: 无 + * @return:List 房东列表 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:26:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + List findAllLandlords(); + /** + * + * @Function: add + * @Description: 添加用户 + * + * @param: user 用户对象 + * @return:boolean 是否成功 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:26:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + boolean add(User user); + /** + * + * @Function: update + * @Description: 更新用户信息 + * + * @param: user 用户对象 + * @return:boolean 是否成功 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:27:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + boolean update(User user); + /** + * + * @Function: updateStatus + * @Description: 更新用户状态 + * + * @param: userId 用户ID, status 状态 + * @return:boolean 是否成功 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:27:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + boolean updateStatus(Long userId, String status); + /** + * + * @Function: delete + * @Description: 删除用户 + * + * @param: id 用户ID + * @return:boolean 是否成功 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:27:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + boolean delete(Long id); + /** + * + * @Function: count + * @Description: 统计用户总数 + * + * @param: 无 + * @return:int 用户总数 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:27:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + int count(); +} diff --git a/HRS/src/com/hrs/dao/impl/CollectionDaoImpl.java b/HRS/src/com/hrs/dao/impl/CollectionDaoImpl.java new file mode 100644 index 0000000..b83b394 --- /dev/null +++ b/HRS/src/com/hrs/dao/impl/CollectionDaoImpl.java @@ -0,0 +1,224 @@ +package com.hrs.dao.impl; + +import com.hrs.dao.CollectionDao; +import com.hrs.dao.HouseDao; +import com.hrs.model.entity.Collection; +import com.hrs.model.entity.House; +import com.hrs.util.DBUtil; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: CollectionDaoImpl.java +* @Description: 收藏数据访问实现类 +* +* @version: v1.0.0 +* @author: 赵恒 +* @date: 2026年4月13日 上午9:33:33 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 赵恒 v1.0.0 新建文件 +*/ +public class CollectionDaoImpl implements CollectionDao { + + private HouseDao houseDao = new HouseDaoImpl(); + + /** + * 添加收藏 + */ + @Override + public boolean add(Collection collection) { + Connection conn = null; + PreparedStatement pstmt = null; + boolean success = false; + + try { + conn = DBUtil.getConnection(); + String sql = "INSERT INTO hrs_collection (tenant_id, house_id, collect_time, create_time) " + + "VALUES (?, ?, NOW(), NOW())"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, collection.getTenantId()); + pstmt.setLong(2, collection.getHouseId()); + + int rows = pstmt.executeUpdate(); + success = rows > 0; + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(pstmt, conn); + } + + return success; + } + + /** + * 检查是否已收藏 + */ + @Override + public boolean isCollected(Long tenantId, Long houseId) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + boolean exists = false; + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT COUNT(*) FROM hrs_collection WHERE tenant_id = ? AND house_id = ?"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, tenantId); + pstmt.setLong(2, houseId); + rs = pstmt.executeQuery(); + + if (rs.next()) { + exists = rs.getInt(1) > 0; + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return exists; + } + + /** + * 取消收藏 + */ + @Override + public boolean delete(Long tenantId, Long houseId) { + Connection conn = null; + PreparedStatement pstmt = null; + boolean success = false; + + try { + conn = DBUtil.getConnection(); + String sql = "DELETE FROM hrs_collection WHERE tenant_id = ? AND house_id = ?"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, tenantId); + pstmt.setLong(2, houseId); + + int rows = pstmt.executeUpdate(); + success = rows > 0; + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(pstmt, conn); + } + + return success; + } + + /** + * 根据收藏ID删除 + */ + @Override + public boolean deleteById(Long id) { + Connection conn = null; + PreparedStatement pstmt = null; + boolean success = false; + + try { + conn = DBUtil.getConnection(); + String sql = "DELETE FROM hrs_collection WHERE id = ?"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, id); + + int rows = pstmt.executeUpdate(); + success = rows > 0; + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(pstmt, conn); + } + + return success; + } + + /** + * 查询租客的所有收藏 + */ + @Override + public List findByTenantId(Long tenantId) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + List collectionList = new ArrayList<>(); + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT * FROM hrs_collection WHERE tenant_id = ? ORDER BY collect_time DESC"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, tenantId); + rs = pstmt.executeQuery(); + + while (rs.next()) { + Collection collection = resultSetToCollection(rs); + // 查询关联的房源详情 + House house = houseDao.findById(collection.getHouseId()); + collection.setHouse(house); + collectionList.add(collection); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return collectionList; + } + + /** + * 查询租客的收藏数量 + */ + @Override + public int countByTenantId(Long tenantId) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + int count = 0; + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT COUNT(*) FROM hrs_collection WHERE tenant_id = ?"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, tenantId); + rs = pstmt.executeQuery(); + + if (rs.next()) { + count = rs.getInt(1); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return count; + } + + /** + * 将ResultSet转换为Collection对象 + */ + private Collection resultSetToCollection(ResultSet rs) throws SQLException { + Collection collection = new Collection(); + collection.setId(rs.getLong("id")); + collection.setTenantId(rs.getLong("tenant_id")); + collection.setHouseId(rs.getLong("house_id")); + collection.setCollectTime(rs.getTimestamp("collect_time")); + collection.setCreateBy(rs.getString("create_by")); + collection.setCreateTime(rs.getTimestamp("create_time")); + return collection; + } +} diff --git a/HRS/src/com/hrs/dao/impl/HouseDaoImpl.java b/HRS/src/com/hrs/dao/impl/HouseDaoImpl.java new file mode 100644 index 0000000..6b44c8c --- /dev/null +++ b/HRS/src/com/hrs/dao/impl/HouseDaoImpl.java @@ -0,0 +1,548 @@ +package com.hrs.dao.impl; + +import com.hrs.dao.HouseDao; +import com.hrs.model.entity.House; +import com.hrs.util.DBUtil; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: HouseDaoImpl.java +* @Description: 房源数据访问实现类/负责房源表的增删改查操作 +* +* @version: v1.0.0 +* @author: 赵恒 +* @date: 2026年4月13日 上午9:34:28 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 赵恒 v1.0.0 新建文件 +*/ +public class HouseDaoImpl implements HouseDao { + + /** + * 查询已上架的房源(供租客查看) + */ + @Override + public List findPublishedHouses() { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + List houseList = new ArrayList<>(); + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT h.*, u.real_name as landlord_name, u.phone as landlord_phone " + + "FROM hrs_house h " + + "LEFT JOIN hrs_user u ON h.landlord_id = u.id " + + "WHERE h.status = '1' " + + "ORDER BY h.create_time DESC"; + pstmt = conn.prepareStatement(sql); + rs = pstmt.executeQuery(); + + while (rs.next()) { + houseList.add(resultSetToHouse(rs)); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return houseList; + } + + /** + * 根据区域筛选房源 + */ + @Override + public List findHousesByArea(String area) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + List houseList = new ArrayList<>(); + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT h.*, u.real_name as landlord_name, u.phone as landlord_phone " + + "FROM hrs_house h " + + "LEFT JOIN hrs_user u ON h.landlord_id = u.id " + + "WHERE h.status = '1' AND h.area LIKE ? " + + "ORDER BY h.create_time DESC"; + pstmt = conn.prepareStatement(sql); + pstmt.setString(1, "%" + area + "%"); + rs = pstmt.executeQuery(); + + while (rs.next()) { + houseList.add(resultSetToHouse(rs)); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return houseList; + } + + /** + * 根据价格区间筛选房源 + */ + @Override + public List findHousesByPrice(int minPrice, int maxPrice) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + List houseList = new ArrayList<>(); + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT h.*, u.real_name as landlord_name, u.phone as landlord_phone " + + "FROM hrs_house h " + + "LEFT JOIN hrs_user u ON h.landlord_id = u.id " + + "WHERE h.status = '1' AND h.rent_price BETWEEN ? AND ? " + + "ORDER BY h.rent_price ASC"; + pstmt = conn.prepareStatement(sql); + pstmt.setInt(1, minPrice); + pstmt.setInt(2, maxPrice); + rs = pstmt.executeQuery(); + + while (rs.next()) { + houseList.add(resultSetToHouse(rs)); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return houseList; + } + + /** + * 根据房源ID查询详情 + */ + @Override + public House findById(Long id) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + House house = null; + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT h.*, u.real_name as landlord_name, u.phone as landlord_phone " + + "FROM hrs_house h " + + "LEFT JOIN hrs_user u ON h.landlord_id = u.id " + + "WHERE h.id = ?"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, id); + rs = pstmt.executeQuery(); + + if (rs.next()) { + house = resultSetToHouse(rs); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return house; + } + + /** + * 查询房东自己的房源 + */ + @Override + public List findByLandlordId(Long landlordId) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + List houseList = new ArrayList<>(); + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT * FROM hrs_house WHERE landlord_id = ? ORDER BY create_time DESC"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, landlordId); + rs = pstmt.executeQuery(); + + while (rs.next()) { + houseList.add(resultSetToHouse(rs)); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return houseList; + } + + /** + * 查询所有房源(管理员用) + */ + @Override + public List findAll() { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + List houseList = new ArrayList<>(); + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT h.*, u.real_name as landlord_name " + + "FROM hrs_house h " + + "LEFT JOIN hrs_user u ON h.landlord_id = u.id " + + "ORDER BY h.create_time DESC"; + pstmt = conn.prepareStatement(sql); + rs = pstmt.executeQuery(); + + while (rs.next()) { + houseList.add(resultSetToHouse(rs)); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return houseList; + } + + /** + * 查询待审核房源(管理员用) + */ + @Override + public List findPendingHouses() { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + List houseList = new ArrayList<>(); + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT h.*, u.real_name as landlord_name, u.phone as landlord_phone " + + "FROM hrs_house h " + + "LEFT JOIN hrs_user u ON h.landlord_id = u.id " + + "WHERE h.status = '0' " + + "ORDER BY h.create_time DESC"; + pstmt = conn.prepareStatement(sql); + rs = pstmt.executeQuery(); + + while (rs.next()) { + houseList.add(resultSetToHouse(rs)); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return houseList; + } + + /** + * 查询已上架房源(管理员用) + */ + @Override + public List findPublishedHousesForAdmin() { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + List houseList = new ArrayList<>(); + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT h.*, u.real_name as landlord_name, u.phone as landlord_phone " + + "FROM hrs_house h " + + "LEFT JOIN hrs_user u ON h.landlord_id = u.id " + + "WHERE h.status = '1' " + + "ORDER BY h.create_time DESC"; + pstmt = conn.prepareStatement(sql); + rs = pstmt.executeQuery(); + + while (rs.next()) { + houseList.add(resultSetToHouse(rs)); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return houseList; + } + + /** + * 查询已下架房源(管理员用) + */ + @Override + public List findOfflineHouses() { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + List houseList = new ArrayList<>(); + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT h.*, u.real_name as landlord_name, u.phone as landlord_phone " + + "FROM hrs_house h " + + "LEFT JOIN hrs_user u ON h.landlord_id = u.id " + + "WHERE h.status IN ('2', '3') " + + "ORDER BY h.create_time DESC"; + pstmt = conn.prepareStatement(sql); + rs = pstmt.executeQuery(); + + while (rs.next()) { + houseList.add(resultSetToHouse(rs)); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return houseList; + } + + /** + * 添加房源 + */ + @Override + public boolean add(House house) { + Connection conn = null; + PreparedStatement pstmt = null; + boolean success = false; + + try { + conn = DBUtil.getConnection(); + String sql = "INSERT INTO hrs_house (landlord_id, house_no, title, area, address, " + + "house_type, rent_price, rent_type, facility, description, img_url, " + + "status, create_time) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW())"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, house.getLandlordId()); + pstmt.setString(2, house.getHouseNo()); + pstmt.setString(3, house.getTitle()); + pstmt.setString(4, house.getArea()); + pstmt.setString(5, house.getAddress()); + pstmt.setString(6, house.getHouseType()); + pstmt.setBigDecimal(7, house.getRentPrice()); + pstmt.setString(8, house.getRentType()); + pstmt.setString(9, house.getFacility()); + pstmt.setString(10, house.getDescription()); + pstmt.setString(11, house.getImgUrl()); + pstmt.setString(12, house.getStatus() != null ? house.getStatus() : "0"); + + int rows = pstmt.executeUpdate(); + success = rows > 0; + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(pstmt, conn); + } + + return success; + } + + /** + * 更新房源 + */ + @Override + public boolean update(House house) { + Connection conn = null; + PreparedStatement pstmt = null; + boolean success = false; + + try { + conn = DBUtil.getConnection(); + String sql = "UPDATE hrs_house SET title=?, area=?, address=?, house_type=?, " + + "rent_price=?, rent_type=?, facility=?, description=?, img_url=?, " + + "update_time=NOW() WHERE id=?"; + pstmt = conn.prepareStatement(sql); + pstmt.setString(1, house.getTitle()); + pstmt.setString(2, house.getArea()); + pstmt.setString(3, house.getAddress()); + pstmt.setString(4, house.getHouseType()); + pstmt.setBigDecimal(5, house.getRentPrice()); + pstmt.setString(6, house.getRentType()); + pstmt.setString(7, house.getFacility()); + pstmt.setString(8, house.getDescription()); + pstmt.setString(9, house.getImgUrl()); + pstmt.setLong(10, house.getId()); + + int rows = pstmt.executeUpdate(); + success = rows > 0; + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(pstmt, conn); + } + + return success; + } + + /** + * 更新房源状态(审核/上架/下架) + */ + @Override + public boolean updateStatus(Long houseId, String status) { + Connection conn = null; + PreparedStatement pstmt = null; + boolean success = false; + + try { + conn = DBUtil.getConnection(); + String sql = "UPDATE hrs_house SET status=?, update_time=NOW() WHERE id=?"; + pstmt = conn.prepareStatement(sql); + pstmt.setString(1, status); + pstmt.setLong(2, houseId); + + int rows = pstmt.executeUpdate(); + success = rows > 0; + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(pstmt, conn); + } + + return success; + } + + /** + * 删除房源 + */ + @Override + public boolean delete(Long id) { + Connection conn = null; + PreparedStatement pstmt = null; + boolean success = false; + + try { + conn = DBUtil.getConnection(); + String sql = "DELETE FROM hrs_house WHERE id=?"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, id); + + int rows = pstmt.executeUpdate(); + success = rows > 0; + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(pstmt, conn); + } + + return success; + } + + /** + * 统计已上架房源数量 + */ + @Override + public int countPublished() { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + int count = 0; + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT COUNT(*) FROM hrs_house WHERE status = '1'"; + pstmt = conn.prepareStatement(sql); + rs = pstmt.executeQuery(); + + if (rs.next()) { + count = rs.getInt(1); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return count; + } + + /** + * 统计房源总数(管理员用) + */ + @Override + public int countAll() { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + int count = 0; + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT COUNT(*) FROM hrs_house"; + pstmt = conn.prepareStatement(sql); + rs = pstmt.executeQuery(); + + if (rs.next()) { + count = rs.getInt(1); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return count; + } + + /** + * 将ResultSet转换为House对象 + */ + private House resultSetToHouse(ResultSet rs) throws SQLException { + House house = new House(); + house.setId(rs.getLong("id")); + house.setLandlordId(rs.getLong("landlord_id")); + house.setHouseNo(rs.getString("house_no")); + house.setTitle(rs.getString("title")); + house.setArea(rs.getString("area")); + house.setAddress(rs.getString("address")); + house.setHouseType(rs.getString("house_type")); + house.setRentPrice(rs.getBigDecimal("rent_price")); + house.setRentType(rs.getString("rent_type")); + house.setFacility(rs.getString("facility")); + house.setDescription(rs.getString("description")); + house.setImgUrl(rs.getString("img_url")); + house.setStatus(rs.getString("status")); + house.setCreateBy(rs.getString("create_by")); + house.setCreateTime(rs.getTimestamp("create_time")); + house.setUpdateBy(rs.getString("update_by")); + house.setUpdateTime(rs.getTimestamp("update_time")); + + // 关联字段 + try { + house.setLandlordName(rs.getString("landlord_name")); + house.setLandlordPhone(rs.getString("landlord_phone")); + } catch (SQLException e) { + // 可能没有这些字段 + } + + return house; + } +} diff --git a/HRS/src/com/hrs/dao/impl/OrderDaoImpl.java b/HRS/src/com/hrs/dao/impl/OrderDaoImpl.java new file mode 100644 index 0000000..1d0db18 --- /dev/null +++ b/HRS/src/com/hrs/dao/impl/OrderDaoImpl.java @@ -0,0 +1,435 @@ +package com.hrs.dao.impl; + +import com.hrs.dao.HouseDao; +import com.hrs.dao.OrderDao; +import com.hrs.model.entity.House; +import com.hrs.model.entity.Order; +import com.hrs.model.entity.User; +import com.hrs.util.DBUtil; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: OrderDaoImpl.java +* @Description: 订单数据访问实现类 +* +* @version: v1.0.0 +* @author: 赵恒 +* @date: 2026年4月13日 上午9:34:55 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 赵恒 v1.0.0 新建文件 +*/ +public class OrderDaoImpl implements OrderDao { + + private HouseDao houseDao = new HouseDaoImpl(); + private UserDaoImpl userDao = new UserDaoImpl(); + + /** + * 添加订单 + */ + @Override + public boolean add(Order order) { + Connection conn = null; + PreparedStatement pstmt = null; + boolean success = false; + + try { + conn = DBUtil.getConnection(); + String sql = "INSERT INTO hrs_order (tenant_id, house_id, order_no, rent_start_time, " + + "rent_end_time, total_rent, pay_status, status, create_time) " + + "VALUES (?, ?, ?, ?, ?, ?, '0', '0', NOW())"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, order.getTenantId()); + pstmt.setLong(2, order.getHouseId()); + pstmt.setString(3, order.getOrderNo()); + pstmt.setTimestamp(4, new Timestamp(order.getRentStartTime().getTime())); + pstmt.setTimestamp(5, new Timestamp(order.getRentEndTime().getTime())); + pstmt.setBigDecimal(6, order.getTotalRent()); + + int rows = pstmt.executeUpdate(); + success = rows > 0; + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(pstmt, conn); + } + + return success; + } + + /** + * 根据租客ID查询订单列表 + */ + @Override + public List findByTenantId(Long tenantId) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + List orderList = new ArrayList<>(); + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT * FROM hrs_order WHERE tenant_id = ? ORDER BY create_time DESC"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, tenantId); + rs = pstmt.executeQuery(); + + while (rs.next()) { + Order order = resultSetToOrder(rs); + orderList.add(order); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return orderList; + } + + /** + * 根据房东ID查询订单列表 + */ + @Override + public List findByLandlordId(Long landlordId) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + List orderList = new ArrayList<>(); + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT o.* FROM hrs_order o " + + "INNER JOIN hrs_house h ON o.house_id = h.id " + + "WHERE h.landlord_id = ? " + + "ORDER BY o.create_time DESC"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, landlordId); + rs = pstmt.executeQuery(); + + while (rs.next()) { + Order order = resultSetToOrder(rs); + orderList.add(order); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return orderList; + } + + /** + * 根据订单ID查询 + */ + @Override + public Order findById(Long id) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + Order order = null; + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT * FROM hrs_order WHERE id = ?"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, id); + rs = pstmt.executeQuery(); + + if (rs.next()) { + order = resultSetToOrder(rs); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return order; + } + + /** + * 根据订单编号查询 + */ + @Override + public Order findByOrderNo(String orderNo) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + Order order = null; + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT * FROM hrs_order WHERE order_no = ?"; + pstmt = conn.prepareStatement(sql); + pstmt.setString(1, orderNo); + rs = pstmt.executeQuery(); + + if (rs.next()) { + order = resultSetToOrder(rs); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return order; + } + + /** + * 更新订单状态 + */ + @Override + public boolean updateStatus(Long orderId, String status) { + Connection conn = null; + PreparedStatement pstmt = null; + boolean success = false; + + try { + conn = DBUtil.getConnection(); + String sql = "UPDATE hrs_order SET status=?, update_time=NOW() WHERE id=?"; + pstmt = conn.prepareStatement(sql); + pstmt.setString(1, status); + pstmt.setLong(2, orderId); + + int rows = pstmt.executeUpdate(); + success = rows > 0; + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(pstmt, conn); + } + + return success; + } + + /** + * 更新支付状态 + */ + @Override + public boolean updatePayStatus(Long orderId, String payStatus) { + Connection conn = null; + PreparedStatement pstmt = null; + boolean success = false; + + try { + conn = DBUtil.getConnection(); + String sql = "UPDATE hrs_order SET pay_status=?, update_time=NOW() WHERE id=?"; + pstmt = conn.prepareStatement(sql); + pstmt.setString(1, payStatus); + pstmt.setLong(2, orderId); + + int rows = pstmt.executeUpdate(); + success = rows > 0; + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(pstmt, conn); + } + + return success; + } + + /** + * 统计租客订单数量 + */ + @Override + public int countByTenantId(Long tenantId) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + int count = 0; + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT COUNT(*) FROM hrs_order WHERE tenant_id = ?"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, tenantId); + rs = pstmt.executeQuery(); + + if (rs.next()) { + count = rs.getInt(1); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return count; + } + + /** + * 统计房东订单数量 + */ + @Override + public int countByLandlordId(Long landlordId) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + int count = 0; + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT COUNT(*) FROM hrs_order o " + + "INNER JOIN hrs_house h ON o.house_id = h.id " + + "WHERE h.landlord_id = ?"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, landlordId); + rs = pstmt.executeQuery(); + + if (rs.next()) { + count = rs.getInt(1); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return count; + } + + /** + * 检查房源是否存在关联订单 + */ + @Override + public boolean existsByHouseId(Long houseId) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT COUNT(*) FROM hrs_order WHERE house_id = ?"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, houseId); + rs = pstmt.executeQuery(); + + if (rs.next()) { + return rs.getInt(1) > 0; + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return false; + } + + /** + * 查询所有订单(管理员用) + */ + @Override + public List findAll() { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + List orderList = new ArrayList<>(); + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT o.* FROM hrs_order o " + + "ORDER BY o.create_time DESC"; + pstmt = conn.prepareStatement(sql); + rs = pstmt.executeQuery(); + + while (rs.next()) { + Order order = resultSetToOrder(rs); + orderList.add(order); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return orderList; + } + + /** + * 统计所有订单数量(管理员用) + */ + @Override + public int countAll() { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + int count = 0; + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT COUNT(*) FROM hrs_order"; + pstmt = conn.prepareStatement(sql); + rs = pstmt.executeQuery(); + + if (rs.next()) { + count = rs.getInt(1); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return count; + } + + /** + * 将ResultSet转换为Order对象 + */ + private Order resultSetToOrder(ResultSet rs) throws SQLException { + Order order = new Order(); + order.setId(rs.getLong("id")); + order.setTenantId(rs.getLong("tenant_id")); + order.setHouseId(rs.getLong("house_id")); + order.setOrderNo(rs.getString("order_no")); + order.setRentStartTime(rs.getTimestamp("rent_start_time")); + order.setRentEndTime(rs.getTimestamp("rent_end_time")); + order.setTotalRent(rs.getBigDecimal("total_rent")); + order.setPayStatus(rs.getString("pay_status")); + order.setStatus(rs.getString("status")); + order.setCreateBy(rs.getString("create_by")); + order.setCreateTime(rs.getTimestamp("create_time")); + order.setUpdateBy(rs.getString("update_by")); + order.setUpdateTime(rs.getTimestamp("update_time")); + + try { + House house = houseDao.findById(order.getHouseId()); + order.setHouse(house); + } catch (Exception e) { + // 忽略 + } + + try { + User tenant = userDao.findById(order.getTenantId()); + order.setTenant(tenant); + } catch (Exception e) { + // 忽略 + } + + return order; + } +} diff --git a/HRS/src/com/hrs/dao/impl/ReservationDaoImpl.java b/HRS/src/com/hrs/dao/impl/ReservationDaoImpl.java new file mode 100644 index 0000000..bf74530 --- /dev/null +++ b/HRS/src/com/hrs/dao/impl/ReservationDaoImpl.java @@ -0,0 +1,338 @@ +package com.hrs.dao.impl; + +import com.hrs.dao.HouseDao; +import com.hrs.dao.ReservationDao; +import com.hrs.dao.UserDao; +import com.hrs.model.entity.Reservation; +import com.hrs.model.entity.House; +import com.hrs.model.entity.User; +import com.hrs.util.DBUtil; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: ReservationDaoImpl.java +* @Description: 预约看房数据访问实现类 +* +* @version: v1.0.0 +* @author: 赵恒 +* @date: 2026年4月13日 上午9:35:10 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 赵恒 v1.0.0 新建文件 +*/ +public class ReservationDaoImpl implements ReservationDao { + + private HouseDao houseDao = new HouseDaoImpl(); + private UserDao userDao = new UserDaoImpl(); + + /** + * 添加预约 + */ + @Override + public boolean add(Reservation reservation) { + Connection conn = null; + PreparedStatement pstmt = null; + boolean success = false; + + try { + conn = DBUtil.getConnection(); + String sql = "INSERT INTO hrs_reservation (tenant_id, house_id, landlord_id, reserve_time, remark, status, create_time) " + + "VALUES (?, ?, ?, ?, ?, '0', NOW())"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, reservation.getTenantId()); + pstmt.setLong(2, reservation.getHouseId()); + pstmt.setLong(3, reservation.getLandlordId()); + pstmt.setTimestamp(4, new Timestamp(reservation.getReserveTime().getTime())); + pstmt.setString(5, reservation.getRemark()); + + int rows = pstmt.executeUpdate(); + success = rows > 0; + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(pstmt, conn); + } + + return success; + } + + /** + * 查询租客的所有预约 + */ + @Override + public List findByTenantId(Long tenantId) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + List reservationList = new ArrayList<>(); + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT * FROM hrs_reservation WHERE tenant_id = ? ORDER BY reserve_time DESC"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, tenantId); + rs = pstmt.executeQuery(); + + while (rs.next()) { + Reservation reservation = resultSetToReservation(rs); + // 关联房源详情 + House house = houseDao.findById(reservation.getHouseId()); + reservation.setHouse(house); + reservationList.add(reservation); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return reservationList; + } + + /** + * 查询房东收到的预约 + */ + @Override + public List findByLandlordId(Long landlordId) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + List reservationList = new ArrayList<>(); + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT * FROM hrs_reservation WHERE landlord_id = ? ORDER BY reserve_time DESC"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, landlordId); + rs = pstmt.executeQuery(); + + while (rs.next()) { + Reservation reservation = resultSetToReservation(rs); + // 关联房源详情 + House house = houseDao.findById(reservation.getHouseId()); + reservation.setHouse(house); + // 关联租客信息 + User tenant = userDao.findById(reservation.getTenantId()); + reservation.setTenant(tenant); + reservationList.add(reservation); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return reservationList; + } + + /** + * 根据ID查询预约 + */ + @Override + public Reservation findById(Long id) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + Reservation reservation = null; + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT * FROM hrs_reservation WHERE id = ?"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, id); + rs = pstmt.executeQuery(); + + if (rs.next()) { + reservation = resultSetToReservation(rs); + House house = houseDao.findById(reservation.getHouseId()); + reservation.setHouse(house); + User tenant = userDao.findById(reservation.getTenantId()); + reservation.setTenant(tenant); + User landlord = userDao.findById(reservation.getLandlordId()); + reservation.setLandlord(landlord); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return reservation; + } + + /** + * 更新预约状态(房东确认/取消) + */ + @Override + public boolean updateStatus(Long id, String status) { + Connection conn = null; + PreparedStatement pstmt = null; + boolean success = false; + + try { + conn = DBUtil.getConnection(); + String sql = "UPDATE hrs_reservation SET status=?, handle_time=NOW(), update_time=NOW() WHERE id=?"; + pstmt = conn.prepareStatement(sql); + pstmt.setString(1, status); + pstmt.setLong(2, id); + + int rows = pstmt.executeUpdate(); + success = rows > 0; + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(pstmt, conn); + } + + return success; + } + + /** + * 取消预约(租客取消) + */ + @Override + public boolean cancel(Long id, Long tenantId) { + Connection conn = null; + PreparedStatement pstmt = null; + boolean success = false; + + try { + conn = DBUtil.getConnection(); + String sql = "UPDATE hrs_reservation SET status='2', update_time=NOW() WHERE id=? AND tenant_id=?"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, id); + pstmt.setLong(2, tenantId); + + int rows = pstmt.executeUpdate(); + success = rows > 0; + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(pstmt, conn); + } + + return success; + } + + /** + * 统计租客的预约数量 + */ + @Override + public int countByTenantId(Long tenantId) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + int count = 0; + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT COUNT(*) FROM hrs_reservation WHERE tenant_id = ?"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, tenantId); + rs = pstmt.executeQuery(); + + if (rs.next()) { + count = rs.getInt(1); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return count; + } + + /** + * 统计房东的预约数量 + */ + @Override + public int countByLandlordId(Long landlordId) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + int count = 0; + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT COUNT(*) FROM hrs_reservation WHERE landlord_id = ?"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, landlordId); + rs = pstmt.executeQuery(); + + if (rs.next()) { + count = rs.getInt(1); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return count; + } + + /** + * 检查房源是否存在关联预约 + */ + @Override + public boolean existsByHouseId(Long houseId) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT COUNT(*) FROM hrs_reservation WHERE house_id = ?"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, houseId); + rs = pstmt.executeQuery(); + + if (rs.next()) { + return rs.getInt(1) > 0; + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return false; + } + + /** + * 将ResultSet转换为Reservation对象 + */ + private Reservation resultSetToReservation(ResultSet rs) throws SQLException { + Reservation reservation = new Reservation(); + reservation.setId(rs.getLong("id")); + reservation.setTenantId(rs.getLong("tenant_id")); + reservation.setHouseId(rs.getLong("house_id")); + reservation.setLandlordId(rs.getLong("landlord_id")); + reservation.setReserveTime(rs.getTimestamp("reserve_time")); + reservation.setRemark(rs.getString("remark")); + reservation.setStatus(rs.getString("status")); + reservation.setHandleTime(rs.getTimestamp("handle_time")); + reservation.setCreateBy(rs.getString("create_by")); + reservation.setCreateTime(rs.getTimestamp("create_time")); + reservation.setUpdateBy(rs.getString("update_by")); + reservation.setUpdateTime(rs.getTimestamp("update_time")); + return reservation; + } +} diff --git a/HRS/src/com/hrs/dao/impl/UserDaoImpl.java b/HRS/src/com/hrs/dao/impl/UserDaoImpl.java new file mode 100644 index 0000000..3a47c55 --- /dev/null +++ b/HRS/src/com/hrs/dao/impl/UserDaoImpl.java @@ -0,0 +1,602 @@ +package com.hrs.dao.impl; + +import com.hrs.dao.UserDao; +import com.hrs.model.entity.User; +import com.hrs.util.DBUtil; +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: UserDaoImpl.java +* @Description: 用户数据访问实现类/负责用户表的增删改查操作 +* +* @version: v1.0.0 +* @author: 赵恒 +* @date: 2026年4月13日 上午9:35:47 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 赵恒 v1.0.0 新建文件 +*/ +public class UserDaoImpl implements UserDao { + /** + * + * @Function: findByUsernameAndPassword + * @Description: 根据用户名和密码查询用户(登录用) + * + * @param: username 用户名, password 密码 + * @return:User 用户对象,未找到返回null + * @throws:SQLException + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:40:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + @Override + public User findByUsernameAndPassword(String username, String password) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + User user = null; + + try { + // 1. 获取连接 + conn = DBUtil.getConnection(); + + // 2. 编写SQL(注意:实际项目密码应该是加密后比较,这里简化) + String sql = "SELECT * FROM hrs_user WHERE user_name = ? AND password = ?"; + + // 3. 创建预编译语句 + pstmt = conn.prepareStatement(sql); + pstmt.setString(1, username); + pstmt.setString(2, password); // 实际应该是MD5加密后比较 + + // 4. 执行查询 + rs = pstmt.executeQuery(); + + // 5. 处理结果集 + if (rs.next()) { + user = resultSetToUser(rs); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + // 6. 释放资源 + DBUtil.close(rs, pstmt, conn); + } + + return user; + } + + /** + * + * @Function: findByUsername + * @Description: 根据用户名查询用户(检查用户名是否已存在) + * + * @param: username 用户名 + * @return:User 用户对象,未找到返回null + * @throws:SQLException + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:40:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + @Override + public User findByUsername(String username) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + User user = null; + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT * FROM hrs_user WHERE user_name = ?"; + pstmt = conn.prepareStatement(sql); + pstmt.setString(1, username); + rs = pstmt.executeQuery(); + + if (rs.next()) { + user = resultSetToUser(rs); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return user; + } + /** + * + * @Function: findByPhone + * @Description: 根据手机号查询用户(检查手机号是否已注册) + * + * @param: phone 手机号 + * @return:User 用户对象,未找到返回null + * @throws:SQLException + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:41:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + @Override + public User findByPhone(String phone) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + User user = null; + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT * FROM hrs_user WHERE phone = ?"; + pstmt = conn.prepareStatement(sql); + pstmt.setString(1, phone); + rs = pstmt.executeQuery(); + + if (rs.next()) { + user = resultSetToUser(rs); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return user; + } + /** + * + * @Function: findById + * @Description: 根据ID查询用户 + * + * @param: id 用户ID + * @return:User 用户对象,未找到返回null + * @throws:SQLException + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:41:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + @Override + public User findById(Long id) { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + User user = null; + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT * FROM hrs_user WHERE id = ?"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, id); + rs = pstmt.executeQuery(); + + if (rs.next()) { + user = resultSetToUser(rs); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return user; + } + /** + * + * @Function: findAll + * @Description: 查询所有用户(管理员用) + * + * @param: 无 + * @return:List 用户列表 + * @throws:SQLException + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:42:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + @Override + public List findAll() { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + List userList = new ArrayList<>(); + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT * FROM hrs_user ORDER BY create_time DESC"; + pstmt = conn.prepareStatement(sql); + rs = pstmt.executeQuery(); + + while (rs.next()) { + userList.add(resultSetToUser(rs)); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return userList; + } + + /** + * + * @Function: findAllTenants + * @Description: 查询所有租客 + * + * @param: 无 + * @return:List 租客列表 + * @throws:SQLException + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:42:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + @Override + public List findAllTenants() { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + List userList = new ArrayList<>(); + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT * FROM hrs_user WHERE role_type = '0' ORDER BY create_time DESC"; + pstmt = conn.prepareStatement(sql); + rs = pstmt.executeQuery(); + + while (rs.next()) { + userList.add(resultSetToUser(rs)); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return userList; + } + /** + * + * @Function: findAllLandlords + * @Description: 查询所有房东 + * + * @param: 无 + * @return:List 房东列表 + * @throws:SQLException + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:43:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + @Override + public List findAllLandlords() { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + List userList = new ArrayList<>(); + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT * FROM hrs_user WHERE role_type = '1' ORDER BY create_time DESC"; + pstmt = conn.prepareStatement(sql); + rs = pstmt.executeQuery(); + + while (rs.next()) { + userList.add(resultSetToUser(rs)); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return userList; + } + + /** + * + * @Function: add + * @Description: 添加用户(注册用) + * + * @param: user 用户对象 + * @return:boolean 是否成功 + * @throws:SQLException + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:43:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + @Override + public boolean add(User user) { + Connection conn = null; + PreparedStatement pstmt = null; + boolean success = false; + + try { + conn = DBUtil.getConnection(); + String sql = "INSERT INTO hrs_user (user_name, password, real_name, phone, id_card, role_type, status, create_time) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, NOW())"; + pstmt = conn.prepareStatement(sql); + pstmt.setString(1, user.getUserName()); + pstmt.setString(2, user.getPassword()); + pstmt.setString(3, user.getRealName()); + pstmt.setString(4, user.getPhone()); + pstmt.setString(5, user.getIdCard()); + pstmt.setString(6, user.getRoleType()); + pstmt.setString(7, user.getStatus() != null ? user.getStatus() : "0"); // 默认未认证 + + int rows = pstmt.executeUpdate(); + success = rows > 0; + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(pstmt, conn); + } + + return success; + } + + /** + * + * @Function: update + * @Description: 更新用户信息 + * + * @param: user 用户对象 + * @return:boolean 是否成功 + * @throws:SQLException + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:44:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + @Override + public boolean update(User user) { + Connection conn = null; + PreparedStatement pstmt = null; + boolean success = false; + + try { + conn = DBUtil.getConnection(); + String sql = "UPDATE hrs_user SET real_name=?, phone=?, id_card=?, status=?, update_time=NOW() WHERE id=?"; + pstmt = conn.prepareStatement(sql); + pstmt.setString(1, user.getRealName()); + pstmt.setString(2, user.getPhone()); + pstmt.setString(3, user.getIdCard()); + pstmt.setString(4, user.getStatus()); + pstmt.setLong(5, user.getId()); + + int rows = pstmt.executeUpdate(); + success = rows > 0; + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(pstmt, conn); + } + + return success; + } + /** + * + * @Function: updateStatus + * @Description: 更新用户状态(启用/禁用) + * + * @param: userId 用户ID, status 状态 + * @return:boolean 是否成功 + * @throws:SQLException + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:44:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + @Override + public boolean updateStatus(Long userId, String status) { + Connection conn = null; + PreparedStatement pstmt = null; + boolean success = false; + + try { + conn = DBUtil.getConnection(); + String sql = "UPDATE hrs_user SET status=?, update_time=NOW() WHERE id=?"; + pstmt = conn.prepareStatement(sql); + pstmt.setString(1, status); + pstmt.setLong(2, userId); + + int rows = pstmt.executeUpdate(); + success = rows > 0; + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(pstmt, conn); + } + + return success; + } + + /** + * + * @Function: delete + * @Description: 删除用户(物理删除,一般不建议) + * + * @param: id 用户ID + * @return:boolean 是否成功 + * @throws:SQLException + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:45:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + @Override + public boolean delete(Long id) { + Connection conn = null; + PreparedStatement pstmt = null; + boolean success = false; + + try { + conn = DBUtil.getConnection(); + String sql = "DELETE FROM hrs_user WHERE id=?"; + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, id); + + int rows = pstmt.executeUpdate(); + success = rows > 0; + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(pstmt, conn); + } + + return success; + } + + /** + * + * @Function: count + * @Description: 统计用户总数 + * + * @param: 无 + * @return:int 用户总数 + * @throws:SQLException + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:45:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + @Override + public int count() { + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + int count = 0; + + try { + conn = DBUtil.getConnection(); + String sql = "SELECT COUNT(*) FROM hrs_user"; + pstmt = conn.prepareStatement(sql); + rs = pstmt.executeQuery(); + + if (rs.next()) { + count = rs.getInt(1); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DBUtil.close(rs, pstmt, conn); + } + + return count; + } + + + /** + * + * @Function: resultSetToUser + * @Description: 将ResultSet转换为User对象 + * + * @param: rs 结果集 + * @return:User 用户对象 + * @throws:SQLException + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:46:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + private User resultSetToUser(ResultSet rs) throws SQLException { + User user = new User(); + user.setId(rs.getLong("id")); + user.setUserName(rs.getString("user_name")); + user.setPassword(rs.getString("password")); + user.setRealName(rs.getString("real_name")); + user.setPhone(rs.getString("phone")); + user.setIdCard(rs.getString("id_card")); + user.setRoleType(rs.getString("role_type")); + user.setStatus(rs.getString("status")); + user.setCreateBy(rs.getString("create_by")); + user.setCreateTime(rs.getTimestamp("create_time")); + user.setUpdateBy(rs.getString("update_by")); + user.setUpdateTime(rs.getTimestamp("update_time")); + return user; + } +} diff --git a/HRS/src/com/hrs/filter/EncodingFilter.java b/HRS/src/com/hrs/filter/EncodingFilter.java new file mode 100644 index 0000000..9a96f72 --- /dev/null +++ b/HRS/src/com/hrs/filter/EncodingFilter.java @@ -0,0 +1,49 @@ +package com.hrs.filter; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import java.io.IOException; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: EncodingFilter.java +* @Description: 字符编码过滤器 +* +* @version: v1.0.0 +* @author: 赵恒 +* @date: 2026年4月13日 上午9:36:34 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 赵恒 v1.0.0 新建文件 +*/ +@WebFilter("/*") +public class EncodingFilter implements Filter { + + private String encoding = "UTF-8"; + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + String param = filterConfig.getInitParameter("encoding"); + if (param != null && !param.isEmpty()) { + encoding = param; + } + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + // 设置请求编码 + request.setCharacterEncoding(encoding); + // 设置响应编码 + response.setCharacterEncoding(encoding); + // 继续执行 + chain.doFilter(request, response); + } + + @Override + public void destroy() { + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/filter/LoginFilter.java b/HRS/src/com/hrs/filter/LoginFilter.java new file mode 100644 index 0000000..536903a --- /dev/null +++ b/HRS/src/com/hrs/filter/LoginFilter.java @@ -0,0 +1,104 @@ +package com.hrs.filter; + +import com.hrs.model.entity.User; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +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: LoginFilter.java +* @Description: 登录过滤器/拦截未登录的请求 +* +* @version: v1.0.0 +* @author: 赵恒 +* @date: 2026年4月13日 上午9:36:48 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 赵恒 v1.0.0 新建文件 +*/ +@WebFilter("/*") // 拦截所有请求 +public class LoginFilter implements Filter { + + // 不需要登录就能访问的路径 + private static final String[] PUBLIC_PATHS = { + "/user/login", // 登录页面 + "/user/register", // 注册页面 ✅ 新增 + "/css/", // 静态资源 + "/js/", + "/images/", + "/jsp/common/", // 公共页面 + "/index.jsp" // 首页 + }; + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + System.out.println("登录过滤器初始化"); + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + + HttpServletRequest req = (HttpServletRequest) request; + HttpServletResponse resp = (HttpServletResponse) response; + + // 1. 获取请求路径 + String path = req.getRequestURI().substring(req.getContextPath().length()); + System.out.println("过滤器拦截路径:" + path); + + // 2. 判断是否是公开路径 + if (isPublicPath(path)) { + chain.doFilter(request, response); + return; + } + + // 3. 检查Session中是否有登录用户 + HttpSession session = req.getSession(false); + User loginUser = null; + if (session != null) { + loginUser = (User) session.getAttribute("loginUser"); + } + + // 4. 如果没登录,跳转到登录页 + if (loginUser == null) { + System.out.println("未登录,拦截请求:" + path); + resp.sendRedirect(req.getContextPath() + "/user/login"); + return; + } + + // 5. 已登录,继续请求 + chain.doFilter(request, response); + } + + /** + * 判断是否是公开路径 + */ + private boolean isPublicPath(String path) { + // 如果是根路径,放行(通常重定向到首页) + if (path == null || path.equals("/") || path.isEmpty()) { + return true; + } + + // 检查是否在公开路径列表中 + for (String publicPath : PUBLIC_PATHS) { + if (path.startsWith(publicPath)) { + return true; + } + } + + return false; + } + + @Override + public void destroy() { + System.out.println("登录过滤器销毁"); + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/model/entity/Collection.java b/HRS/src/com/hrs/model/entity/Collection.java new file mode 100644 index 0000000..73e6890 --- /dev/null +++ b/HRS/src/com/hrs/model/entity/Collection.java @@ -0,0 +1,369 @@ +package com.hrs.model.entity; + +import java.util.Date; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: Collection.java +* @Description: 收藏实体类 +* +* @version: v1.0.0 +* @author: 赵恒 +* @date: 2026年4月13日 上午9:58:59 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 赵恒 v1.0.0 新建文件 +*/ +public class Collection { + + private Long id; // 主键ID + private Long tenantId; // 租客ID + private Long houseId; // 房源ID + private Date collectTime; // 收藏时间 + private String createBy; // 创建人 + private Date createTime; // 创建时间 + + // 关联字段(不存数据库,用于显示) + private House house; // 房源详情 + + /** + * + * @Function: Collection + * @Description: 无参构造方法 + * + * @param: 无 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:20:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Collection() { + } + /** + * + * @Function: Collection + * @Description: 带参构造方法 + * + * @param: tenantId 租客ID, houseId 房源ID + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:20:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Collection(Long tenantId, Long houseId) { + this.tenantId = tenantId; + this.houseId = houseId; + } + + /** + * + * @Function: getId + * @Description: 获取主键ID + * + * @param: 无 + * @return:Long 主键ID + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:21:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Long getId() { + return id; + } + /** + * + * @Function: setId + * @Description: 设置主键ID + * + * @param: id 主键ID + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:21:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setId(Long id) { + this.id = id; + } + /** + * + * @Function: getTenantId + * @Description: 获取租客ID + * + * @param: 无 + * @return:Long 租客ID + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:21:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Long getTenantId() { + return tenantId; + } + /** + * + * @Function: setTenantId + * @Description: 设置租客ID + * + * @param: tenantId 租客ID + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:21:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + /** + * + * @Function: getHouseId + * @Description: 获取房源ID + * + * @param: 无 + * @return:Long 房源ID + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:22:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Long getHouseId() { + return houseId; + } + /** + * + * @Function: setHouseId + * @Description: 设置房源ID + * + * @param: houseId 房源ID + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:22:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setHouseId(Long houseId) { + this.houseId = houseId; + } + /** + * + * @Function: getCollectTime + * @Description: 获取收藏时间 + * + * @param: 无 + * @return:Date 收藏时间 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:22:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Date getCollectTime() { + return collectTime; + } + /** + * + * @Function: setCollectTime + * @Description: 设置收藏时间 + * + * @param: collectTime 收藏时间 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:22:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setCollectTime(Date collectTime) { + this.collectTime = collectTime; + } + /** + * + * @Function: getCreateBy + * @Description: 获取创建人 + * + * @param: 无 + * @return:String 创建人 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:23:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getCreateBy() { + return createBy; + } + /** + * + * @Function: setCreateBy + * @Description: 设置创建人 + * + * @param: createBy 创建人 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:23:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + /** + * + * @Function: getCreateTime + * @Description: 获取创建时间 + * + * @param: 无 + * @return:Date 创建时间 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:23:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Date getCreateTime() { + return createTime; + } + /** + * + * @Function: setCreateTime + * @Description: 设置创建时间 + * + * @param: createTime 创建时间 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:23:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + /** + * + * @Function: getHouse + * @Description: 获取房源详情 + * + * @param: 无 + * @return:House 房源对象 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:24:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public House getHouse() { + return house; + } + /** + * + * @Function: setHouse + * @Description: 设置房源详情 + * + * @param: house 房源对象 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:24:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setHouse(House house) { + this.house = house; + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/model/entity/House.java b/HRS/src/com/hrs/model/entity/House.java new file mode 100644 index 0000000..1032865 --- /dev/null +++ b/HRS/src/com/hrs/model/entity/House.java @@ -0,0 +1,964 @@ +package com.hrs.model.entity; + +import java.math.BigDecimal; +import java.util.Date; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: House.java +* @Description: 房源实体类 +* +* @version: v1.0.0 +* @author: 赵恒 +* @date: 2026年4月13日 上午9:59:13 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 赵恒 v1.0.0 新建文件 +*/ +public class House { + + private Long id; // 主键ID + private Long landlordId; // 房东ID + private String houseNo; // 房源编号 + private String title; // 房源标题 + private String area; // 房源区域 + private String address; // 详细地址 + private String houseType; // 户型 + private BigDecimal rentPrice; // 月租金 + private String rentType; // 租赁类型:0-整租;1-合租 + private String facility; // 配套设施 + private String description; // 房源描述 + private String imgUrl; // 房源图片路径 + private String status; // 房源状态:0-待审核;1-已上架;2-已下架;3-违规 + private String createBy; // 创建人 + private Date createTime; // 创建时间 + private String updateBy; // 更新人 + private Date updateTime; // 更新时间 + + // 关联字段(不存数据库,用于显示房东信息) + private String landlordName; // 房东姓名 + private String landlordPhone; // 房东电话 + /** + * + * @Function: House + * @Description: 无参构造方法 + * + * @param: 无 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:56:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public House() { + } + /** + * + * @Function: getId + * @Description: 获取主键ID + * + * @param: 无 + * @return:Long 主键ID + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:56:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + // Getter 和 Setter + public Long getId() { + return id; + } + /** + * + * @Function: setId + * @Description: 设置主键ID + * + * @param: id 主键ID + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:57:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setId(Long id) { + this.id = id; + } + /** + * + * @Function: getLandlordId + * @Description: 获取房东ID + * + * @param: 无 + * @return:Long 房东ID + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:57:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Long getLandlordId() { + return landlordId; + } + /** + * + * @Function: setLandlordId + * @Description: 设置房东ID + * + * @param: landlordId 房东ID + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:57:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setLandlordId(Long landlordId) { + this.landlordId = landlordId; + } + /** + * + * @Function: getHouseNo + * @Description: 获取房源编号 + * + * @param: 无 + * @return:String 房源编号 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:57:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getHouseNo() { + return houseNo; + } + /** + * + * @Function: setHouseNo + * @Description: 设置房源编号 + * + * @param: houseNo 房源编号 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:58:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setHouseNo(String houseNo) { + this.houseNo = houseNo; + } + /** + * + * @Function: getTitle + * @Description: 获取房源标题 + * + * @param: 无 + * @return:String 房源标题 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:58:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getTitle() { + return title; + } + /** + * + * @Function: setTitle + * @Description: 设置房源标题 + * + * @param: title 房源标题 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:58:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setTitle(String title) { + this.title = title; + } + /** + * + * @Function: getArea + * @Description: 获取房源区域 + * + * @param: 无 + * @return:String 房源区域 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:58:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getArea() { + return area; + } + /** + * + * @Function: setArea + * @Description: 设置房源区域 + * + * @param: area 房源区域 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:59:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setArea(String area) { + this.area = area; + } + /** + * + * @Function: getAddress + * @Description: 获取详细地址 + * + * @param: 无 + * @return:String 详细地址 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:59:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getAddress() { + return address; + } + /** + * + * @Function: setAddress + * @Description: 设置详细地址 + * + * @param: address 详细地址 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:59:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setAddress(String address) { + this.address = address; + } + /** + * + * @Function: getHouseType + * @Description: 获取户型 + * + * @param: 无 + * @return:String 户型 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:59:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getHouseType() { + return houseType; + } + /** + * + * @Function: setHouseType + * @Description: 设置户型 + * + * @param: houseType 户型 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:00:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setHouseType(String houseType) { + this.houseType = houseType; + } + /** + * + * @Function: getRentPrice + * @Description: 获取月租金 + * + * @param: 无 + * @return:BigDecimal 月租金 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:00:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public BigDecimal getRentPrice() { + return rentPrice; + } + /** + * + * @Function: setRentPrice + * @Description: 设置月租金 + * + * @param: rentPrice 月租金 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:00:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setRentPrice(BigDecimal rentPrice) { + this.rentPrice = rentPrice; + } + /** + * + * @Function: getRentType + * @Description: 获取租赁类型 + * + * @param: 无 + * @return:String 租赁类型(0-整租;1-合租) + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:00:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getRentType() { + return rentType; + } + /** + * + * @Function: setRentType + * @Description: 设置租赁类型 + * + * @param: rentType 租赁类型(0-整租;1-合租) + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:01:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setRentType(String rentType) { + this.rentType = rentType; + } + /** + * + * @Function: getRentTypeText + * @Description: 获取租赁类型文本 + * + * @param: 无 + * @return:String 租赁类型文本(整租/合租) + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:01:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getRentTypeText() { + return "0".equals(rentType) ? "整租" : "合租"; + } + /** + * + * @Function: getFacility + * @Description: 获取配套设施 + * + * @param: 无 + * @return:String 配套设施 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:01:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getFacility() { + return facility; + } + /** + * + * @Function: setFacility + * @Description: 设置配套设施 + * + * @param: facility 配套设施 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:01:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setFacility(String facility) { + this.facility = facility; + } + /** + * + * @Function: getDescription + * @Description: 获取房源描述 + * + * @param: 无 + * @return:String 房源描述 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:02:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getDescription() { + return description; + } + /** + * + * @Function: setDescription + * @Description: 设置房源描述 + * + * @param: description 房源描述 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:02:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setDescription(String description) { + this.description = description; + } + /** + * + * @Function: getImgUrl + * @Description: 获取房源图片路径 + * + * @param: 无 + * @return:String 房源图片路径 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:02:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getImgUrl() { + return imgUrl; + } + /** + * + * @Function: getImgUrl + * @Description: 获取房源图片路径 + * + * @param: 无 + * @return:String 房源图片路径 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:02:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + /** + * + * @Function: getStatus + * @Description: 获取房源状态 + * + * @param: 无 + * @return:String 房源状态(0-待审核;1-已上架;2-已下架;3-违规) + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:03:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getStatus() { + return status; + } + /** + * + * @Function: getStatus + * @Description: 获取房源状态 + * + * @param: 无 + * @return:String 房源状态(0-待审核;1-已上架;2-已下架;3-违规) + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:03:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setStatus(String status) { + this.status = status; + } + /** + * + * @Function: getStatusText + * @Description: 获取房源状态文本 + * + * @param: 无 + * @return:String 房源状态文本 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:03:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getStatusText() { + switch (status) { + case "0": return "待审核"; + case "1": return "已上架"; + case "2": return "已下架"; + case "3": return "违规"; + default: return "未知"; + } + } + /** + * + * @Function: getCreateBy + * @Description: 获取创建人 + * + * @param: 无 + * @return:String 创建人 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:03:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getCreateBy() { + return createBy; + } + /** + * + * @Function: setCreateBy + * @Description: 设置创建人 + * + * @param: createBy 创建人 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:04:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + /** + * + * @Function: getCreateTime + * @Description: 获取创建时间 + * + * @param: 无 + * @return:Date 创建时间 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:04:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Date getCreateTime() { + return createTime; + } + /** + * + * @Function: setCreateTime + * @Description: 设置创建时间 + * + * @param: createTime 创建时间 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:04:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + /** + * + * @Function: getUpdateBy + * @Description: 获取更新人 + * + * @param: 无 + * @return:String 更新人 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:04:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getUpdateBy() { + return updateBy; + } + /** + * + * @Function: setUpdateBy + * @Description: 设置更新人 + * + * @param: updateBy 更新人 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:05:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + /** + * + * @Function: getUpdateTime + * @Description: 获取更新时间 + * + * @param: 无 + * @return:Date 更新时间 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:05:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Date getUpdateTime() { + return updateTime; + } + /** + * + * @Function: setUpdateTime + * @Description: 设置更新时间 + * + * @param: updateTime 更新时间 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:05:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + /** + * + * @Function: getLandlordName + * @Description: 获取房东姓名 + * + * @param: 无 + * @return:String 房东姓名 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:05:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getLandlordName() { + return landlordName; + } + /** + * + * @Function: setLandlordName + * @Description: 设置房东姓名 + * + * @param: landlordName 房东姓名 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:06:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setLandlordName(String landlordName) { + this.landlordName = landlordName; + } + /** + * + * @Function: getLandlordPhone + * @Description: 获取房东电话 + * + * @param: 无 + * @return:String 房东电话 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:06:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getLandlordPhone() { + return landlordPhone; + } + /** + * + * @Function: setLandlordPhone + * @Description: 设置房东电话 + * + * @param: landlordPhone 房东电话 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:06:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setLandlordPhone(String landlordPhone) { + this.landlordPhone = landlordPhone; + } + /** + * + * @Function: getFirstImage + * @Description: 获取第一张图片(用于列表展示) + * + * @param: 无 + * @return:String 第一张图片路径 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:06:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getFirstImage() { + if (imgUrl != null && !imgUrl.isEmpty()) { + String[] images = imgUrl.split(","); + return images[0]; + } + return null; + } + /** + * + * @Function: toString + * @Description: 重写toString方法 + * + * @param: 无 + * @return:String 对象字符串表示 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:07:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + @Override + public String toString() { + return "House{" + + "id=" + id + + ", title='" + title + '\'' + + ", area='" + area + '\'' + + ", rentPrice=" + rentPrice + + ", status='" + status + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/model/entity/Order.java b/HRS/src/com/hrs/model/entity/Order.java new file mode 100644 index 0000000..8078b92 --- /dev/null +++ b/HRS/src/com/hrs/model/entity/Order.java @@ -0,0 +1,839 @@ +package com.hrs.model.entity; + +import java.math.BigDecimal; +import java.util.Date; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: Order.java +* @Description: 订单实体类 +* +* @version: v1.0.0 +* @author: 赵恒 +* @date: 2026年4月13日 上午9:59:27 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 赵恒 v1.0.0 新建文件 +*/ +public class Order { + + private Long id; // 主键ID + private Long tenantId; // 租客ID + private Long houseId; // 房源ID + private String orderNo; // 订单编号 + private Date rentStartTime; // 租赁开始时间 + private Date rentEndTime; // 租赁结束时间 + private BigDecimal totalRent; // 总租金 + private String payStatus; // 支付状态:0-待支付;1-已支付;2-已退款 + private String status; // 订单状态:0-待签约;1-已签约;2-已结束;3-已取消 + private String createBy; // 创建人 + private Date createTime; // 创建时间 + private String updateBy; // 更新人 + private Date updateTime; // 更新时间 + + // 关联字段(不存数据库) + private House house; // 房源详情 + private User tenant; // 租客信息 + private User landlord; // 房东信息 + /** + * + * @Function: Order + * @Description: 无参构造方法 + * + * @param: 无 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:08:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Order() { + } + /** + * + * @Function: getId + * @Description: 获取主键ID + * + * @param: 无 + * @return:Long 主键ID + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:08:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Long getId() { + return id; + } + /** + * + * @Function: setId + * @Description: 设置主键ID + * + * @param: id 主键ID + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:08:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setId(Long id) { + this.id = id; + } + /** + * + * @Function: getTenantId + * @Description: 获取租客ID + * + * @param: 无 + * @return:Long 租客ID + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:09:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public Long getTenantId() { + return tenantId; + } + /** + * + * @Function: setTenantId + * @Description: 设置租客ID + * + * @param: tenantId 租客ID + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:09:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + /** + * + * @Function: getHouseId + * @Description: 获取房源ID + * + * @param: 无 + * @return:Long 房源ID + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:09:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public Long getHouseId() { + return houseId; + } + /** + * + * @Function: setHouseId + * @Description: 设置房源ID + * + * @param: houseId 房源ID + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:09:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public void setHouseId(Long houseId) { + this.houseId = houseId; + } + /** + * + * @Function: getOrderNo + * @Description: 获取订单编号 + * + * @param: 无 + * @return:String 订单编号 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:10:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public String getOrderNo() { + return orderNo; + } + /** + * + * @Function: setOrderNo + * @Description: 设置订单编号 + * + * @param: orderNo 订单编号 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:10:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + /** + * + * @Function: getRentStartTime + * @Description: 获取租赁开始时间 + * + * @param: 无 + * @return:Date 租赁开始时间 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:10:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public Date getRentStartTime() { + return rentStartTime; + } + /** + * + * @Function: setRentStartTime + * @Description: 设置租赁开始时间 + * + * @param: rentStartTime 租赁开始时间 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:10:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public void setRentStartTime(Date rentStartTime) { + this.rentStartTime = rentStartTime; + } + /** + * + * @Function: getRentEndTime + * @Description: 获取租赁结束时间 + * + * @param: 无 + * @return:Date 租赁结束时间 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:11:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public Date getRentEndTime() { + return rentEndTime; + } + /** + * + * @Function: setRentEndTime + * @Description: 设置租赁结束时间 + * + * @param: rentEndTime 租赁结束时间 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:11:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public void setRentEndTime(Date rentEndTime) { + this.rentEndTime = rentEndTime; + } + /** + * + * @Function: getTotalRent + * @Description: 获取总租金 + * + * @param: 无 + * @return:BigDecimal 总租金 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:11:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public BigDecimal getTotalRent() { + return totalRent; + } + /** + * + * @Function: setTotalRent + * @Description: 设置总租金 + * + * @param: totalRent 总租金 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:11:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public void setTotalRent(BigDecimal totalRent) { + this.totalRent = totalRent; + } + /** + * + * @Function: getPayStatus + * @Description: 获取支付状态 + * + * @param: 无 + * @return:String 支付状态(0-待支付;1-已支付;2-已退款) + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:12:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public String getPayStatus() { + return payStatus; + } + /** + * + * @Function: setPayStatus + * @Description: 设置支付状态 + * + * @param: payStatus 支付状态(0-待支付;1-已支付;2-已退款) + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:12:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public void setPayStatus(String payStatus) { + this.payStatus = payStatus; + } + /** + * + * @Function: getPayStatusText + * @Description: 获取支付状态文本 + * + * @param: 无 + * @return:String 支付状态文本 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:09:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getPayStatusText() { + switch (payStatus) { + case "0": return "待支付"; + case "1": return "已支付"; + case "2": return "已退款"; + default: return "未知"; + } + } + /** + * + * @Function: getStatus + * @Description: 获取订单状态 + * + * @param: 无 + * @return:String 订单状态(0-待签约;1-已签约;2-已结束;3-已取消) + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:12:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public String getStatus() { + return status; + } + /** + * + * @Function: setStatus + * @Description: 设置订单状态 + * + * @param: status 订单状态(0-待签约;1-已签约;2-已结束;3-已取消) + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:13:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public void setStatus(String status) { + this.status = status; + } + /** + * + * @Function: getStatusText + * @Description: 获取订单状态文本 + * + * @param: 无 + * @return:String 订单状态文本 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:09:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getStatusText() { + switch (status) { + case "0": return "待签约"; + case "1": return "已签约"; + case "2": return "已结束"; + case "3": return "已取消"; + default: return "未知"; + } + } + /** + * + * @Function: getCreateBy + * @Description: 获取创建人 + * + * @param: 无 + * @return:String 创建人 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:13:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public String getCreateBy() { + return createBy; + } + /** + * + * @Function: setCreateBy + * @Description: 设置创建人 + * + * @param: createBy 创建人 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:13:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + /** + * + * @Function: getCreateTime + * @Description: 获取创建时间 + * + * @param: 无 + * @return:Date 创建时间 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:14:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public Date getCreateTime() { + return createTime; + } + /** + * + * @Function: setCreateTime + * @Description: 设置创建时间 + * + * @param: createTime 创建时间 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:14:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + /** + * + * @Function: getUpdateBy + * @Description: 获取更新人 + * + * @param: 无 + * @return:String 更新人 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:14:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public String getUpdateBy() { + return updateBy; + } + /** + * + * @Function: setUpdateBy + * @Description: 设置更新人 + * + * @param: updateBy 更新人 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:14:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + /** + * + * @Function: getUpdateTime + * @Description: 获取更新时间 + * + * @param: 无 + * @return:Date 更新时间 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:15:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public Date getUpdateTime() { + return updateTime; + } + /** + * + * @Function: setUpdateTime + * @Description: 设置更新时间 + * + * @param: updateTime 更新时间 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:15:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + /** + * + * @Function: getHouse + * @Description: 获取房源详情 + * + * @param: 无 + * @return:House 房源对象 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:15:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public House getHouse() { + return house; + } + /** + * + * @Function: setHouse + * @Description: 设置房源详情 + * + * @param: house 房源对象 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:15:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public void setHouse(House house) { + this.house = house; + } + /** + * + * @Function: getTenant + * @Description: 获取租客信息 + * + * @param: 无 + * @return:User 租客对象 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:16:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public User getTenant() { + return tenant; + } + /** + * + * @Function: setTenant + * @Description: 设置租客信息 + * + * @param: tenant 租客对象 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:16:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public void setTenant(User tenant) { + this.tenant = tenant; + } + /** + * + * @Function: getLandlord + * @Description: 获取房东信息 + * + * @param: 无 + * @return:User 房东对象 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:16:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public User getLandlord() { + return landlord; + } + /** + * + * @Function: setLandlord + * @Description: 设置房东信息 + * + * @param: landlord 房东对象 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李洪涛 + * @date: 2025年4月13日 下午3:16:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 李洪涛 v1.0.0 新建方法 + */ + public void setLandlord(User landlord) { + this.landlord = landlord; + } + + /** + * + * @Function: getRentDays + * @Description: 计算租赁天数 + * + * @param: 无 + * @return:int 租赁天数 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:10:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public int getRentDays() { + if (rentStartTime == null || rentEndTime == null) { + return 0; + } + long diff = rentEndTime.getTime() - rentStartTime.getTime(); + return (int) (diff / (1000 * 60 * 60 * 24)); + } + /** + * + * @Function: toString + * @Description: 重写toString方法 + * + * @param: 无 + * @return:String 对象字符串表示 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:10:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + @Override + public String toString() { + return "Order{" + + "id=" + id + + ", orderNo='" + orderNo + '\'' + + ", totalRent=" + totalRent + + ", status='" + status + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/model/entity/Reservation.java b/HRS/src/com/hrs/model/entity/Reservation.java new file mode 100644 index 0000000..4085d7a --- /dev/null +++ b/HRS/src/com/hrs/model/entity/Reservation.java @@ -0,0 +1,743 @@ +package com.hrs.model.entity; + +import java.util.Date; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: Reservation.java +* @Description: 预约看房实体类 +* +* @version: v1.0.0 +* @author: 赵恒 +* @date: 2026年4月13日 上午9:59:56 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 赵恒 v1.0.0 新建文件 +*/ +public class Reservation { + + private Long id; // 主键ID + private Long tenantId; // 租客ID + private Long houseId; // 房源ID + private Long landlordId; // 房东ID + private Date reserveTime; // 预约看房时间 + private String remark; // 租客备注 + private String status; // 预约状态:0-待确认;1-已确认;2-已取消;3-已完成 + private Date handleTime; // 房东处理时间 + private String createBy; // 创建人 + private Date createTime; // 创建时间 + private String updateBy; // 更新人 + private Date updateTime; // 更新时间 + + // 关联字段(不存数据库) + private House house; // 房源详情 + private User tenant; // 租客信息 + private User landlord; // 房东信息 + /** + * + * @Function: Reservation + * @Description: 无参构造方法 + * + * @param: 无 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:11:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Reservation() { + } + /** + * + * @Function: getId + * @Description: 获取主键ID + * + * @param: 无 + * @return:Long 主键ID + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:11:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Long getId() { + return id; + } + /** + * + * @Function: setId + * @Description: 设置主键ID + * + * @param: id 主键ID + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:12:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setId(Long id) { + this.id = id; + } + /** + * + * @Function: getTenantId + * @Description: 获取租客ID + * + * @param: 无 + * @return:Long 租客ID + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:12:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Long getTenantId() { + return tenantId; + } + /** + * + * @Function: setTenantId + * @Description: 设置租客ID + * + * @param: tenantId 租客ID + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:12:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + /** + * + * @Function: getHouseId + * @Description: 获取房源ID + * + * @param: 无 + * @return:Long 房源ID + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:12:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Long getHouseId() { + return houseId; + } + /** + * + * @Function: setHouseId + * @Description: 设置房源ID + * + * @param: houseId 房源ID + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:13:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setHouseId(Long houseId) { + this.houseId = houseId; + } + /** + * + * @Function: getLandlordId + * @Description: 获取房东ID + * + * @param: 无 + * @return:Long 房东ID + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:13:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Long getLandlordId() { + return landlordId; + } + /** + * + * @Function: setLandlordId + * @Description: 设置房东ID + * + * @param: landlordId 房东ID + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:13:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setLandlordId(Long landlordId) { + this.landlordId = landlordId; + } + /** + * + * @Function: getReserveTime + * @Description: 获取预约看房时间 + * + * @param: 无 + * @return:Date 预约看房时间 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:13:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Date getReserveTime() { + return reserveTime; + } + /** + * + * @Function: setReserveTime + * @Description: 设置预约看房时间 + * + * @param: reserveTime 预约看房时间 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:14:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setReserveTime(Date reserveTime) { + this.reserveTime = reserveTime; + } + /** + * + * @Function: getRemark + * @Description: 获取租客备注 + * + * @param: 无 + * @return:String 租客备注 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:14:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getRemark() { + return remark; + } + /** + * + * @Function: setRemark + * @Description: 设置租客备注 + * + * @param: remark 租客备注 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:14:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setRemark(String remark) { + this.remark = remark; + } + /** + * + * @Function: getStatus + * @Description: 获取预约状态 + * + * @param: 无 + * @return:String 预约状态(0-待确认;1-已确认;2-已取消;3-已完成) + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:14:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getStatus() { + return status; + } + /** + * + * @Function: setStatus + * @Description: 设置预约状态 + * + * @param: status 预约状态(0-待确认;1-已确认;2-已取消;3-已完成) + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:15:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setStatus(String status) { + this.status = status; + } + /** + * + * @Function: getStatusText + * @Description: 获取预约状态文本 + * + * @param: 无 + * @return:String 预约状态文本 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:15:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getStatusText() { + switch (status) { + case "0": return "待确认"; + case "1": return "已确认"; + case "2": return "已取消"; + case "3": return "已完成"; + default: return "未知"; + } + } + /** + * + * @Function: getHandleTime + * @Description: 获取房东处理时间 + * + * @param: 无 + * @return:Date 房东处理时间 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:15:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Date getHandleTime() { + return handleTime; + } + /** + * + * @Function: setHandleTime + * @Description: 设置房东处理时间 + * + * @param: handleTime 房东处理时间 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:15:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setHandleTime(Date handleTime) { + this.handleTime = handleTime; + } + /** + * + * @Function: getCreateBy + * @Description: 获取创建人 + * + * @param: 无 + * @return:String 创建人 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:16:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getCreateBy() { + return createBy; + } + /** + * + * @Function: setCreateBy + * @Description: 设置创建人 + * + * @param: createBy 创建人 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:16:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + /** + * + * @Function: getCreateTime + * @Description: 获取创建时间 + * + * @param: 无 + * @return:Date 创建时间 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:16:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Date getCreateTime() { + return createTime; + } + /** + * + * @Function: setCreateTime + * @Description: 设置创建时间 + * + * @param: createTime 创建时间 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:16:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + /** + * + * @Function: getUpdateBy + * @Description: 获取更新人 + * + * @param: 无 + * @return:String 更新人 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:17:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getUpdateBy() { + return updateBy; + } + /** + * + * @Function: setUpdateBy + * @Description: 设置更新人 + * + * @param: updateBy 更新人 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:17:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + /** + * + * @Function: getUpdateTime + * @Description: 获取更新时间 + * + * @param: 无 + * @return:Date 更新时间 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:17:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Date getUpdateTime() { + return updateTime; + } + /** + * + * @Function: setUpdateTime + * @Description: 设置更新时间 + * + * @param: updateTime 更新时间 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:17:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + /** + * + * @Function: getHouse + * @Description: 获取房源详情 + * + * @param: 无 + * @return:House 房源对象 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:18:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public House getHouse() { + return house; + } + /** + * + * @Function: setHouse + * @Description: 设置房源详情 + * + * @param: house 房源对象 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:18:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setHouse(House house) { + this.house = house; + } + /** + * + * @Function: getTenant + * @Description: 获取租客信息 + * + * @param: 无 + * @return:User 租客对象 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:18:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public User getTenant() { + return tenant; + } + /** + * + * @Function: setTenant + * @Description: 设置租客信息 + * + * @param: tenant 租客对象 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:18:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setTenant(User tenant) { + this.tenant = tenant; + } + /** + * + * @Function: getLandlord + * @Description: 获取房东信息 + * + * @param: 无 + * @return:User 房东对象 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:19:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public User getLandlord() { + return landlord; + } + /** + * + * @Function: setLandlord + * @Description: 设置房东信息 + * + * @param: landlord 房东对象 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:19:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setLandlord(User landlord) { + this.landlord = landlord; + } + /** + * + * @Function: toString + * @Description: 重写toString方法 + * + * @param: 无 + * @return:String 对象字符串表示 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午3:19:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + @Override + public String toString() { + return "Reservation{" + + "id=" + id + + ", houseId=" + houseId + + ", reserveTime=" + reserveTime + + ", status='" + status + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/model/entity/User.java b/HRS/src/com/hrs/model/entity/User.java new file mode 100644 index 0000000..4d5de3e --- /dev/null +++ b/HRS/src/com/hrs/model/entity/User.java @@ -0,0 +1,707 @@ +package com.hrs.model.entity; + +import java.util.Date; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: User.java +* @Description: 用户实体类 +* +* @version: v1.0.0 +* @author: 赵恒 +* @date: 2026年4月13日 上午10:00:10 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 赵恒 v1.0.0 新建文件 +*/ +public class User { + + // 数据库字段对应 + private Long id; // 主键ID + private String userName; // 用户名 + private String password; // 密码 + private String realName; // 真实姓名 + private String phone; // 手机号 + private String idCard; // 身份证号 + private String roleType; // 角色类型:0-租客 1-房东 2-管理员 + private String status; // 账号状态:0-未认证 1-已认证 2-禁用 + private String createBy; // 创建人 + private Date createTime; // 创建时间 + private String updateBy; // 更新人 + private Date updateTime; // 更新时间 + /** + * + * @Function: User + * @Description: 无参构造方法 + * + * @param: 无 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:46:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public User() { + } + /** + * + * @Function: User + * @Description: 全参构造方法 + * + * @param: id 主键ID, userName 用户名, password 密码, realName 真实姓名, phone 手机号, idCard 身份证号, roleType 角色类型, status 账号状态, createBy 创建人, createTime 创建时间, updateBy 更新人, updateTime 更新时间 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:47:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public User(Long id, String userName, String password, String realName, + String phone, String idCard, String roleType, String status, + String createBy, Date createTime, String updateBy, Date updateTime) { + this.id = id; + this.userName = userName; + this.password = password; + this.realName = realName; + this.phone = phone; + this.idCard = idCard; + this.roleType = roleType; + this.status = status; + this.createBy = createBy; + this.createTime = createTime; + this.updateBy = updateBy; + this.updateTime = updateTime; + } + /** + * + * @Function: getId + * @Description: 获取主键ID + * + * @param: 无 + * @return:Long 主键ID + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:48:05 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Long getId() { + return id; + } + /** + * + * @Function: setId + * @Description: 设置主键ID + * + * @param: id 主键ID + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:48:20 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setId(Long id) { + this.id = id; + } + /** + * + * @Function: getUserName + * @Description: 获取用户名 + * + * @param: 无 + * @return:String 用户名 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:48:35 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getUserName() { + return userName; + } + /** + * + * @Function: setUserName + * @Description: 设置用户名 + * + * @param: userName 用户名 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:48:50 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setUserName(String userName) { + this.userName = userName; + } + /** + * + * @Function: getPassword + * @Description: 获取密码 + * + * @param: 无 + * @return:String 密码 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:49:05 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getPassword() { + return password; + } + /** + * + * @Function: setPassword + * @Description: 设置密码 + * + * @param: password 密码 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:49:20 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setPassword(String password) { + this.password = password; + } + /** + * + * @Function: getRealName + * @Description: 获取真实姓名 + * + * @param: 无 + * @return:String 真实姓名 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:49:35 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getRealName() { + return realName; + } + /** + * + * @Function: setRealName + * @Description: 设置真实姓名 + * + * @param: realName 真实姓名 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:49:50 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setRealName(String realName) { + this.realName = realName; + } + /** + * + * @Function: getPhone + * @Description: 获取手机号 + * + * @param: 无 + * @return:String 手机号 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:50:05 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getPhone() { + return phone; + } + /** + * + * @Function: setPhone + * @Description: 设置手机号 + * + * @param: phone 手机号 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:50:20 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setPhone(String phone) { + this.phone = phone; + } + /** + * + * @Function: getIdCard + * @Description: 获取身份证号 + * + * @param: 无 + * @return:String 身份证号 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:50:35 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getIdCard() { + return idCard; + } + /** + * + * @Function: setIdCard + * @Description: 设置身份证号 + * + * @param: idCard 身份证号 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:50:50 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setIdCard(String idCard) { + this.idCard = idCard; + } + /** + * + * @Function: getRoleType + * @Description: 获取角色类型 + * + * @param: 无 + * @return:String 角色类型(0-租客 1-房东 2-管理员) + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:51:05 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getRoleType() { + return roleType; + } + /** + * + * @Function: setRoleType + * @Description: 设置角色类型 + * + * @param: roleType 角色类型(0-租客 1-房东 2-管理员) + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:51:20 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setRoleType(String roleType) { + this.roleType = roleType; + } + /** + * + * @Function: getStatus + * @Description: 获取账号状态 + * + * @param: 无 + * @return:String 账号状态(0-未认证 1-已认证 2-禁用) + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:51:35 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getStatus() { + return status; + } + /** + * + * @Function: setStatus + * @Description: 设置账号状态 + * + * @param: status 账号状态(0-未认证 1-已认证 2-禁用) + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:51:50 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setStatus(String status) { + this.status = status; + } + /** + * + * @Function: getCreateBy + * @Description: 获取创建人 + * + * @param: 无 + * @return:String 创建人 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:52:05 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getCreateBy() { + return createBy; + } + /** + * + * @Function: setCreateBy + * @Description: 设置创建人 + * + * @param: createBy 创建人 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:52:20 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + /** + * + * @Function: getCreateTime + * @Description: 获取创建时间 + * + * @param: 无 + * @return:Date 创建时间 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:52:35 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Date getCreateTime() { + return createTime; + } + /** + * + * @Function: setCreateTime + * @Description: 设置创建时间 + * + * @param: createTime 创建时间 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:52:50 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + /** + * + * @Function: getUpdateBy + * @Description: 获取更新人 + * + * @param: 无 + * @return:String 更新人 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:53:05 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public String getUpdateBy() { + return updateBy; + } + /** + * + * @Function: setUpdateBy + * @Description: 设置更新人 + * + * @param: updateBy 更新人 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:53:20 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + /** + * + * @Function: getUpdateTime + * @Description: 获取更新时间 + * + * @param: 无 + * @return:Date 更新时间 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:53:35 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public Date getUpdateTime() { + return updateTime; + } + /** + * + * @Function: setUpdateTime + * @Description: 设置更新时间 + * + * @param: updateTime 更新时间 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:53:50 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + /** + * + * @Function: isTenant + * @Description: 判断是否为租客 + * + * @param: 无 + * @return:boolean 是否为租客 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:54:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public boolean isTenant() { + return "0".equals(this.roleType); + } + /** + * + * @Function: isLandlord + * @Description: 判断是否为房东 + * + * @param: 无 + * @return:boolean 是否为房东 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:54:30 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public boolean isLandlord() { + return "1".equals(this.roleType); + } + /** + * + * @Function: isAdmin + * @Description: 判断是否为管理员 + * + * @param: 无 + * @return:boolean 是否为管理员 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:54:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + + public boolean isAdmin() { + return "2".equals(this.roleType); + } + /** + * + * @Function: isVerified + * @Description: 判断账号是否已认证 + * + * @param: 无 + * @return:boolean 是否已认证 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:55:00 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + public boolean isVerified() { + return "1".equals(this.status); + } + /** + * + * @Function: toString + * @Description: 重写toString方法 + * + * @param: 无 + * @return:String 对象字符串表示 + * @throws:无 + * + * @version: v1.0.0 + * @author: 赵恒 + * @date: 2025年4月13日 下午2:55:15 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月13日 赵恒 v1.0.0 新建方法 + */ + @Override + public String toString() { + return "User{" + + "id=" + id + + ", userName='" + userName + '\'' + + ", realName='" + realName + '\'' + + ", phone='" + phone + '\'' + + ", roleType='" + roleType + '\'' + + ", status='" + status + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/service/CollectionService.java b/HRS/src/com/hrs/service/CollectionService.java new file mode 100644 index 0000000..b8f4607 --- /dev/null +++ b/HRS/src/com/hrs/service/CollectionService.java @@ -0,0 +1,71 @@ +package com.hrs.service; + +import com.hrs.model.entity.Collection; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: CollectionService.java +* @Description: 收藏业务逻辑接口 +* +* @version: v1.0.0 +* @author: 黄红 +* @date: 2026年4月13日 上午10:00:51 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 黄红 v1.0.0 新建文件 +*/ +public interface CollectionService { + + /** + * 添加收藏 + * @param tenantId 租客ID + * @param houseId 房源ID + * @return 添加结果 + */ + CollectionResult addCollection(Long tenantId, Long houseId); + + /** + * 取消收藏(通过收藏ID) + */ + boolean deleteCollectionById(Long collectionId, Long tenantId); + + /** + * 取消收藏(通过房源ID) + */ + boolean deleteCollectionByHouseId(Long houseId, Long tenantId); + + /** + * 获取租客的收藏列表(带房源详情) + */ + List getTenantCollections(Long tenantId); + + /** + * 检查是否已收藏 + */ + boolean isCollected(Long tenantId, Long houseId); + + /** + * 获取收藏数量 + */ + int getCollectionCount(Long tenantId); + + /** + * 收藏操作结果类 + */ + class CollectionResult { + private boolean success; + private String message; + private boolean exists; + + public boolean isSuccess() { return success; } + public void setSuccess(boolean success) { this.success = success; } + public String getMessage() { return message; } + public void setMessage(String message) { this.message = message; } + public boolean isExists() { return exists; } + public void setExists(boolean exists) { this.exists = exists; } + } +} diff --git a/HRS/src/com/hrs/service/HouseService.java b/HRS/src/com/hrs/service/HouseService.java new file mode 100644 index 0000000..49a65b1 --- /dev/null +++ b/HRS/src/com/hrs/service/HouseService.java @@ -0,0 +1,94 @@ +package com.hrs.service; + +import com.hrs.model.entity.House; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: HouseService.java +* @Description: 房源业务逻辑接口 +* +* @version: v1.0.0 +* @author: 黄红 +* @date: 2026年4月13日 上午10:01:06 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 黄红 v1.0.0 新建文件 +*/ +public interface HouseService { + + /** + * 获取已上架房源(租客端) + */ + List getPublishedHouses(); + + /** + * 按区域筛选房源 + */ + List searchByArea(String area); + + /** + * 按价格区间筛选房源 + */ + List searchByPrice(int minPrice, int maxPrice); + + /** + * 获取房源详情 + */ + House getHouseDetail(Long houseId); + + /** + * 获取房东的房源列表 + */ + List getLandlordHouses(Long landlordId); + + /** + * 添加房源 + * @return 添加结果 + */ + AddHouseResult addHouse(House house); + + /** + * 更新房源 + */ + UpdateHouseResult updateHouse(House house, Long landlordId); + + /** + * 删除房源 + */ + boolean deleteHouse(Long houseId, Long landlordId); + + /** + * 审核房源(管理员) + */ + boolean auditHouse(Long houseId, boolean approved); + + /** + * 添加房源结果类 + */ + class AddHouseResult { + private boolean success; + private String message; + + public boolean isSuccess() { return success; } + public void setSuccess(boolean success) { this.success = success; } + public String getMessage() { return message; } + public void setMessage(String message) { this.message = message; } + } + + /** + * 更新房源结果类 + */ + class UpdateHouseResult { + private boolean success; + private String message; + + public boolean isSuccess() { return success; } + public void setSuccess(boolean success) { this.success = success; } + public String getMessage() { return message; } + public void setMessage(String message) { this.message = message; } + } +} diff --git a/HRS/src/com/hrs/service/OrderService.java b/HRS/src/com/hrs/service/OrderService.java new file mode 100644 index 0000000..44b74b2 --- /dev/null +++ b/HRS/src/com/hrs/service/OrderService.java @@ -0,0 +1,91 @@ +package com.hrs.service; + +import com.hrs.model.entity.Order; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: OrderService.java +* @Description: 订单业务逻辑接口 +* +* @version: v1.0.0 +* @author: 黄红 +* @date: 2026年4月13日 上午10:01:16 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 黄红 v1.0.0 新建文件 +*/ +public interface OrderService { + + /** + * 创建订单 + */ + CreateOrderResult createOrder(Long tenantId, Long houseId, Date startDate, Date endDate); + + /** + * 模拟支付 + */ + boolean payOrder(Long orderId, Long tenantId); + + /** + * 取消订单(租客) + */ + boolean cancelOrder(Long orderId, Long tenantId); + + /** + * 获取租客订单列表 + */ + List getTenantOrders(Long tenantId); + + /** + * 获取房东订单列表 + */ + List getLandlordOrders(Long landlordId); + + /** + * 获取所有订单(管理员) + */ + List getAllOrders(); + + /** + * 获取订单详情 + */ + Order getOrderDetail(Long orderId); + + /** + * 统计租客订单数量 + */ + int getTenantOrderCount(Long tenantId); + + /** + * 统计所有订单数量 + */ + int getAllOrderCount(); + + /** + * 创建订单结果类 + */ + class CreateOrderResult { + private boolean success; + private String message; + private Long orderId; + private String orderNo; + private BigDecimal totalRent; + + public boolean isSuccess() { return success; } + public void setSuccess(boolean success) { this.success = success; } + public String getMessage() { return message; } + public void setMessage(String message) { this.message = message; } + public Long getOrderId() { return orderId; } + public void setOrderId(Long orderId) { this.orderId = orderId; } + public String getOrderNo() { return orderNo; } + public void setOrderNo(String orderNo) { this.orderNo = orderNo; } + public BigDecimal getTotalRent() { return totalRent; } + public void setTotalRent(BigDecimal totalRent) { this.totalRent = totalRent; } + } +} diff --git a/HRS/src/com/hrs/service/ReservationService.java b/HRS/src/com/hrs/service/ReservationService.java new file mode 100644 index 0000000..c023e64 --- /dev/null +++ b/HRS/src/com/hrs/service/ReservationService.java @@ -0,0 +1,71 @@ +package com.hrs.service; + +import com.hrs.model.entity.Reservation; +import java.util.Date; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: ReservationService.java +* @Description: 预约看房业务逻辑接口 +* +* @version: v1.0.0 +* @author: 黄红 +* @date: 2026年4月13日 上午10:01:27 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 黄红 v1.0.0 新建文件 +*/ +public interface ReservationService { + + /** + * 创建预约 + */ + ReservationResult createReservation(Long tenantId, Long houseId, Date reserveTime, String remark); + + /** + * 获取租客的预约列表 + */ + List getTenantReservations(Long tenantId); + + /** + * 获取房东收到的预约列表 + */ + List getLandlordReservations(Long landlordId); + + /** + * 租客取消预约 + */ + boolean cancelReservationByTenant(Long reservationId, Long tenantId); + + /** + * 房东处理预约(确认/拒绝) + */ + boolean handleReservation(Long reservationId, Long landlordId, boolean approve); + + /** + * 获取预约详情 + */ + Reservation getReservationDetail(Long reservationId); + + /** + * 获取房东待处理预约数量 + */ + int getPendingCount(Long landlordId); + + /** + * 预约操作结果类 + */ + class ReservationResult { + private boolean success; + private String message; + + public boolean isSuccess() { return success; } + public void setSuccess(boolean success) { this.success = success; } + public String getMessage() { return message; } + public void setMessage(String message) { this.message = message; } + } +} diff --git a/HRS/src/com/hrs/service/UserService.java b/HRS/src/com/hrs/service/UserService.java new file mode 100644 index 0000000..15a4eca --- /dev/null +++ b/HRS/src/com/hrs/service/UserService.java @@ -0,0 +1,51 @@ +package com.hrs.service; + +import com.hrs.model.entity.User; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: UserService.java +* @Description: 用户业务逻辑接口 +* +* @version: v1.0.0 +* @author: 黄红 +* @date: 2026年4月13日 上午10:01:45 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 黄红 v1.0.0 新建文件 +*/ +public interface UserService { + + /** + * 用户登录验证 + * @param username 用户名 + * @param password 明文密码 + * @param roleType 角色类型 + * @return 登录成功返回User对象,失败返回null + */ + User login(String username, String password, String roleType); + + /** + * 用户注册 + * @param user 用户信息 + * @param confirmPassword 确认密码 + * @return 注册结果和错误信息 + */ + RegisterResult register(User user, String confirmPassword); + + /** + * 注册结果类 + */ + class RegisterResult { + private boolean success; + private String message; + + public boolean isSuccess() { return success; } + public void setSuccess(boolean success) { this.success = success; } + public String getMessage() { return message; } + public void setMessage(String message) { this.message = message; } + } +} diff --git a/HRS/src/com/hrs/service/impl/CollectionServiceImpl.java b/HRS/src/com/hrs/service/impl/CollectionServiceImpl.java new file mode 100644 index 0000000..bfd197c --- /dev/null +++ b/HRS/src/com/hrs/service/impl/CollectionServiceImpl.java @@ -0,0 +1,156 @@ +package com.hrs.service.impl; + +import com.hrs.dao.CollectionDao; +import com.hrs.dao.HouseDao; +import com.hrs.dao.impl.CollectionDaoImpl; +import com.hrs.dao.impl.HouseDaoImpl; +import com.hrs.model.entity.Collection; +import com.hrs.model.entity.House; +import com.hrs.service.CollectionService; + +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: CollectionServiceImpl.java +* @Description: 收藏业务逻辑实现类 +* +* @version: v1.0.0 +* @author: 黄红 +* @date: 2026年4月13日 上午10:04:16 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 黄红 v1.0.0 新建文件 +*/ +public class CollectionServiceImpl implements CollectionService { + + private CollectionDao collectionDao = new CollectionDaoImpl(); + private HouseDao houseDao = new HouseDaoImpl(); + + /** + * 添加收藏 + * @param tenantId 租客ID + * @param houseId 房源ID + * @return 添加结果 + */ + @Override + public CollectionResult addCollection(Long tenantId, Long houseId) { + CollectionResult result = new CollectionResult(); + + // 1. 参数校验 + if (tenantId == null || tenantId <= 0) { + result.setSuccess(false); + result.setMessage("用户未登录"); + return result; + } + + if (houseId == null || houseId <= 0) { + result.setSuccess(false); + result.setMessage("房源信息错误"); + return result; + } + + // 2. 检查房源是否存在且已上架 + House house = houseDao.findById(houseId); + if (house == null) { + result.setSuccess(false); + result.setMessage("房源不存在"); + return result; + } + + if (!"1".equals(house.getStatus())) { + result.setSuccess(false); + result.setMessage("房源已下架,无法收藏"); + return result; + } + + // 3. 检查是否已收藏 + if (collectionDao.isCollected(tenantId, houseId)) { + result.setSuccess(false); + result.setMessage("已经收藏过该房源"); + result.setExists(true); + return result; + } + + // 4. 添加收藏 + Collection collection = new Collection(); + collection.setTenantId(tenantId); + collection.setHouseId(houseId); + + boolean success = collectionDao.add(collection); + result.setSuccess(success); + result.setMessage(success ? "收藏成功" : "收藏失败,请稍后重试"); + + return result; + } + + /** + * 取消收藏(通过收藏ID) + */ + @Override + public boolean deleteCollectionById(Long collectionId, Long tenantId) { + if (collectionId == null || tenantId == null) { + return false; + } + + // 验证该收藏是否属于当前用户(实际DAO层可以直接删除,但为了安全可以验证) + return collectionDao.deleteById(collectionId); + } + + /** + * 取消收藏(通过房源ID) + */ + @Override + public boolean deleteCollectionByHouseId(Long houseId, Long tenantId) { + if (houseId == null || tenantId == null) { + return false; + } + + return collectionDao.delete(tenantId, houseId); + } + + /** + * 获取租客的收藏列表(带房源详情) + */ + @Override + public List getTenantCollections(Long tenantId) { + if (tenantId == null || tenantId <= 0) { + return null; + } + + List collections = collectionDao.findByTenantId(tenantId); + + // 过滤掉已下架的房源 + collections.removeIf(c -> { + House house = c.getHouse(); + return house == null || !"1".equals(house.getStatus()); + }); + + return collections; + } + + /** + * 检查是否已收藏 + */ + @Override + public boolean isCollected(Long tenantId, Long houseId) { + if (tenantId == null || houseId == null) { + return false; + } + return collectionDao.isCollected(tenantId, houseId); + } + + /** + * 获取收藏数量 + */ + @Override + public int getCollectionCount(Long tenantId) { + if (tenantId == null || tenantId <= 0) { + return 0; + } + return collectionDao.countByTenantId(tenantId); + } +} diff --git a/HRS/src/com/hrs/service/impl/HouseServiceImpl.java b/HRS/src/com/hrs/service/impl/HouseServiceImpl.java new file mode 100644 index 0000000..9266c21 --- /dev/null +++ b/HRS/src/com/hrs/service/impl/HouseServiceImpl.java @@ -0,0 +1,194 @@ +package com.hrs.service.impl; + +import com.hrs.dao.HouseDao; +import com.hrs.dao.impl.HouseDaoImpl; +import com.hrs.model.entity.House; +import com.hrs.service.HouseService; + +import java.math.BigDecimal; +import java.util.List; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: HouseServiceImpl.java +* @Description: 房源业务逻辑实现类 +* +* @version: v1.0.0 +* @author: 黄红 +* @date: 2026年4月13日 上午10:04:33 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 黄红 v1.0.0 新建文件 +*/ +public class HouseServiceImpl implements HouseService { + + private HouseDao houseDao = new HouseDaoImpl(); + + /** + * 获取已上架房源(租客端) + */ + @Override + public List getPublishedHouses() { + return houseDao.findPublishedHouses(); + } + + /** + * 按区域筛选房源 + */ + @Override + public List searchByArea(String area) { + if (area == null || area.trim().isEmpty()) { + return getPublishedHouses(); + } + return houseDao.findHousesByArea(area); + } + + /** + * 按价格区间筛选房源 + */ + @Override + public List searchByPrice(int minPrice, int maxPrice) { + if (minPrice <= 0 && maxPrice <= 0) { + return getPublishedHouses(); + } + if (minPrice <= 0) { + minPrice = 0; + } + if (maxPrice <= 0) { + maxPrice = Integer.MAX_VALUE; + } + return houseDao.findHousesByPrice(minPrice, maxPrice); + } + + /** + * 获取房源详情 + */ + @Override + public House getHouseDetail(Long houseId) { + if (houseId == null || houseId <= 0) { + return null; + } + return houseDao.findById(houseId); + } + + /** + * 获取房东的房源列表 + */ + @Override + public List getLandlordHouses(Long landlordId) { + if (landlordId == null || landlordId <= 0) { + return null; + } + return houseDao.findByLandlordId(landlordId); + } + + /** + * 添加房源 + * @return 添加结果 + */ + @Override + public AddHouseResult addHouse(House house) { + AddHouseResult result = new AddHouseResult(); + + // 1. 参数校验 + if (house.getTitle() == null || house.getTitle().trim().isEmpty()) { + result.setSuccess(false); + result.setMessage("房源标题不能为空"); + return result; + } + + if (house.getRentPrice() == null || house.getRentPrice().compareTo(BigDecimal.ZERO) <= 0) { + result.setSuccess(false); + result.setMessage("租金不能为空或小于0"); + return result; + } + + if (house.getLandlordId() == null || house.getLandlordId() <= 0) { + result.setSuccess(false); + result.setMessage("房东信息错误"); + return result; + } + + // 2. 设置默认值 + if (house.getStatus() == null) { + house.setStatus("0"); // 默认待审核 + } + + // 3. 保存 + boolean success = houseDao.add(house); + result.setSuccess(success); + result.setMessage(success ? "房源添加成功,等待管理员审核" : "添加失败,请稍后重试"); + + return result; + } + + /** + * 更新房源 + */ + @Override + public UpdateHouseResult updateHouse(House house, Long landlordId) { + UpdateHouseResult result = new UpdateHouseResult(); + + // 1. 参数校验 + if (house.getId() == null || house.getId() <= 0) { + result.setSuccess(false); + result.setMessage("房源信息错误"); + return result; + } + + // 2. 验证权限(该房源是否属于当前房东) + House existingHouse = houseDao.findById(house.getId()); + if (existingHouse == null || !existingHouse.getLandlordId().equals(landlordId)) { + result.setSuccess(false); + result.setMessage("无权修改此房源"); + return result; + } + + // 3. 已上架的房源修改后需要重新审核 + if ("1".equals(existingHouse.getStatus())) { + house.setStatus("0"); // 重新进入待审核状态 + } else { + house.setStatus(existingHouse.getStatus()); + } + + // 4. 更新 + boolean success = houseDao.update(house); + result.setSuccess(success); + result.setMessage(success ? "修改成功" : "修改失败"); + + return result; + } + + /** + * 删除房源 + */ + @Override + public boolean deleteHouse(Long houseId, Long landlordId) { + if (houseId == null || landlordId == null) { + return false; + } + + House house = houseDao.findById(houseId); + if (house == null || !house.getLandlordId().equals(landlordId)) { + return false; + } + + return houseDao.delete(houseId); + } + + /** + * 审核房源(管理员) + */ + @Override + public boolean auditHouse(Long houseId, boolean approved) { + if (houseId == null || houseId <= 0) { + return false; + } + + String status = approved ? "1" : "3"; // 1-已上架,3-违规/拒绝 + return houseDao.updateStatus(houseId, status); + } +} diff --git a/HRS/src/com/hrs/service/impl/OrderServiceImpl.java b/HRS/src/com/hrs/service/impl/OrderServiceImpl.java new file mode 100644 index 0000000..92215e3 --- /dev/null +++ b/HRS/src/com/hrs/service/impl/OrderServiceImpl.java @@ -0,0 +1,241 @@ +package com.hrs.service.impl; + +import com.hrs.dao.HouseDao; +import com.hrs.dao.OrderDao; +import com.hrs.dao.impl.HouseDaoImpl; +import com.hrs.dao.impl.OrderDaoImpl; +import com.hrs.model.entity.House; +import com.hrs.model.entity.Order; +import com.hrs.service.OrderService; + +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: OrderServiceImpl.java +* @Description: 订单业务逻辑实现类 +* +* @version: v1.0.0 +* @author: 黄红 +* @date: 2026年4月13日 上午10:09:00 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 黄红 v1.0.0 新建文件 +*/ +public class OrderServiceImpl implements OrderService { + + private OrderDao orderDao = new OrderDaoImpl(); + private HouseDao houseDao = new HouseDaoImpl(); + + /** + * 创建订单 + */ + @Override + public CreateOrderResult createOrder(Long tenantId, Long houseId, Date startDate, Date endDate) { + CreateOrderResult result = new CreateOrderResult(); + + // 1. 参数校验 + if (tenantId == null || tenantId <= 0) { + result.setSuccess(false); + result.setMessage("用户未登录"); + return result; + } + + if (houseId == null || houseId <= 0) { + result.setSuccess(false); + result.setMessage("房源信息错误"); + return result; + } + + if (startDate == null || endDate == null) { + result.setSuccess(false); + result.setMessage("请选择租赁时间"); + return result; + } + + // 2. 检查房源是否存在且已上架 + House house = houseDao.findById(houseId); + if (house == null) { + result.setSuccess(false); + result.setMessage("房源不存在"); + return result; + } + + if (!"1".equals(house.getStatus())) { + result.setSuccess(false); + result.setMessage("房源已下架,无法下单"); + return result; + } + + // 3. 日期校验 + Date now = new Date(); + if (startDate.before(now)) { + result.setSuccess(false); + result.setMessage("租赁开始日期不能早于今天"); + return result; + } + + if (endDate.before(startDate)) { + result.setSuccess(false); + result.setMessage("结束日期不能早于开始日期"); + return result; + } + + // 4. 计算天数和总租金 + long diff = endDate.getTime() - startDate.getTime(); + int days = (int) TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS); + if (days <= 0) { + days = 1; + } + + // 按比例计算租金 + BigDecimal monthlyRent = house.getRentPrice(); + BigDecimal dailyRent = monthlyRent.divide(BigDecimal.valueOf(30), 2, BigDecimal.ROUND_HALF_UP); + BigDecimal totalRent = dailyRent.multiply(BigDecimal.valueOf(days)).setScale(2, BigDecimal.ROUND_HALF_UP); + + // 5. 生成订单编号 + String orderNo = generateOrderNo(); + + // 6. 创建订单 + Order order = new Order(); + order.setTenantId(tenantId); + order.setHouseId(houseId); + order.setOrderNo(orderNo); + order.setRentStartTime(startDate); + order.setRentEndTime(endDate); + order.setTotalRent(totalRent); + order.setPayStatus("0"); // 待支付 + order.setStatus("0"); // 待签约 + + boolean success = orderDao.add(order); + + result.setSuccess(success); + result.setMessage(success ? "订单创建成功,请完成支付" : "订单创建失败,请稍后重试"); + if (success) { + result.setOrderId(order.getId()); + result.setOrderNo(orderNo); + result.setTotalRent(totalRent); + } + + return result; + } + + /** + * 模拟支付 + */ + @Override + public boolean payOrder(Long orderId, Long tenantId) { + if (orderId == null || tenantId == null) { + return false; + } + + Order order = orderDao.findById(orderId); + if (order == null || !order.getTenantId().equals(tenantId)) { + return false; + } + + // 只有待支付的订单可以支付 + if (!"0".equals(order.getPayStatus())) { + return false; + } + + return orderDao.updatePayStatus(orderId, "1"); + } + + /** + * 取消订单(租客) + */ + @Override + public boolean cancelOrder(Long orderId, Long tenantId) { + if (orderId == null || tenantId == null) { + return false; + } + + Order order = orderDao.findById(orderId); + if (order == null || !order.getTenantId().equals(tenantId)) { + return false; + } + + // 只有待支付的订单可以取消 + if (!"0".equals(order.getPayStatus())) { + return false; + } + + return orderDao.updateStatus(orderId, "3"); // 3-已取消 + } + + /** + * 获取租客订单列表 + */ + @Override + public List getTenantOrders(Long tenantId) { + if (tenantId == null || tenantId <= 0) { + return null; + } + return orderDao.findByTenantId(tenantId); + } + + /** + * 获取房东订单列表 + */ + @Override + public List getLandlordOrders(Long landlordId) { + if (landlordId == null || landlordId <= 0) { + return null; + } + return orderDao.findByLandlordId(landlordId); + } + + /** + * 获取所有订单(管理员) + */ + @Override + public List getAllOrders() { + return orderDao.findAll(); + } + + /** + * 获取订单详情 + */ + @Override + public Order getOrderDetail(Long orderId) { + if (orderId == null || orderId <= 0) { + return null; + } + return orderDao.findById(orderId); + } + + /** + * 统计租客订单数量 + */ + @Override + public int getTenantOrderCount(Long tenantId) { + if (tenantId == null || tenantId <= 0) { + return 0; + } + return orderDao.countByTenantId(tenantId); + } + + /** + * 统计所有订单数量 + */ + @Override + public int getAllOrderCount() { + return orderDao.countAll(); + } + + /** + * 生成订单编号 + */ + private String generateOrderNo() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + return "ORD" + sdf.format(new Date()); + } +} diff --git a/HRS/src/com/hrs/service/impl/ReservationServiceImpl.java b/HRS/src/com/hrs/service/impl/ReservationServiceImpl.java new file mode 100644 index 0000000..d31338b --- /dev/null +++ b/HRS/src/com/hrs/service/impl/ReservationServiceImpl.java @@ -0,0 +1,187 @@ +package com.hrs.service.impl; + +import com.hrs.dao.HouseDao; +import com.hrs.dao.ReservationDao; +import com.hrs.dao.impl.HouseDaoImpl; +import com.hrs.dao.impl.ReservationDaoImpl; +import com.hrs.model.entity.House; +import com.hrs.model.entity.Reservation; +import com.hrs.service.ReservationService; + +import java.util.Date; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: ReservationServiceImpl.java +* @Description: 预约看房业务逻辑实现类 +* +* @version: v1.0.0 +* @author: 黄红 +* @date: 2026年4月13日 上午10:06:14 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 黄红 v1.0.0 新建文件 +*/ +public class ReservationServiceImpl implements ReservationService { + + private ReservationDao reservationDao = new ReservationDaoImpl(); + private HouseDao houseDao = new HouseDaoImpl(); + + /** + * 创建预约 + */ + @Override + public ReservationResult createReservation(Long tenantId, Long houseId, Date reserveTime, String remark) { + ReservationResult result = new ReservationResult(); + + // 1. 参数校验 + if (tenantId == null || tenantId <= 0) { + result.setSuccess(false); + result.setMessage("用户未登录"); + return result; + } + + if (houseId == null || houseId <= 0) { + result.setSuccess(false); + result.setMessage("房源信息错误"); + return result; + } + + if (reserveTime == null) { + result.setSuccess(false); + result.setMessage("请选择预约时间"); + return result; + } + + // 2. 检查房源是否存在且已上架 + House house = houseDao.findById(houseId); + if (house == null) { + result.setSuccess(false); + result.setMessage("房源不存在"); + return result; + } + + if (!"1".equals(house.getStatus())) { + result.setSuccess(false); + result.setMessage("房源已下架,无法预约"); + return result; + } + + // 3. 检查预约时间(不能早于当前时间1小时) + Date now = new Date(); + long minReserveTime = now.getTime() + TimeUnit.HOURS.toMillis(1); + if (reserveTime.getTime() < minReserveTime) { + result.setSuccess(false); + result.setMessage("预约时间至少需要提前1小时"); + return result; + } + + // 4. 创建预约 + Reservation reservation = new Reservation(); + reservation.setTenantId(tenantId); + reservation.setHouseId(houseId); + reservation.setLandlordId(house.getLandlordId()); + reservation.setReserveTime(reserveTime); + reservation.setRemark(remark); + + boolean success = reservationDao.add(reservation); + result.setSuccess(success); + result.setMessage(success ? "预约成功,请等待房东确认" : "预约失败,请稍后重试"); + + return result; + } + + /** + * 获取租客的预约列表 + */ + @Override + public List getTenantReservations(Long tenantId) { + if (tenantId == null || tenantId <= 0) { + return null; + } + return reservationDao.findByTenantId(tenantId); + } + + /** + * 获取房东收到的预约列表 + */ + @Override + public List getLandlordReservations(Long landlordId) { + if (landlordId == null || landlordId <= 0) { + return null; + } + return reservationDao.findByLandlordId(landlordId); + } + + /** + * 租客取消预约 + */ + @Override + public boolean cancelReservationByTenant(Long reservationId, Long tenantId) { + if (reservationId == null || tenantId == null) { + return false; + } + + Reservation reservation = reservationDao.findById(reservationId); + if (reservation == null || !reservation.getTenantId().equals(tenantId)) { + return false; + } + + // 只有待确认的预约可以取消 + if (!"0".equals(reservation.getStatus())) { + return false; + } + + return reservationDao.cancel(reservationId, tenantId); + } + + /** + * 房东处理预约(确认/拒绝) + */ + @Override + public boolean handleReservation(Long reservationId, Long landlordId, boolean approve) { + if (reservationId == null || landlordId == null) { + return false; + } + + Reservation reservation = reservationDao.findById(reservationId); + if (reservation == null || !reservation.getLandlordId().equals(landlordId)) { + return false; + } + + // 只有待确认的预约可以处理 + if (!"0".equals(reservation.getStatus())) { + return false; + } + + String status = approve ? "1" : "2"; // 1-已确认,2-已取消/拒绝 + return reservationDao.updateStatus(reservationId, status); + } + + /** + * 获取预约详情 + */ + @Override + public Reservation getReservationDetail(Long reservationId) { + if (reservationId == null || reservationId <= 0) { + return null; + } + return reservationDao.findById(reservationId); + } + + /** + * 获取房东待处理预约数量 + */ + @Override + public int getPendingCount(Long landlordId) { + if (landlordId == null || landlordId <= 0) { + return 0; + } + return reservationDao.countByLandlordId(landlordId); + } +} diff --git a/HRS/src/com/hrs/service/impl/UserServiceImpl.java b/HRS/src/com/hrs/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..0c36a9b --- /dev/null +++ b/HRS/src/com/hrs/service/impl/UserServiceImpl.java @@ -0,0 +1,128 @@ +package com.hrs.service.impl; + +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.util.MD5Util; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: UserServiceImpl.java +* @Description: 用户业务逻辑实现类 +* +* @version: v1.0.0 +* @author: 黄红 +* @date: 2026年4月13日 上午10:06:30 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 黄红 v1.0.0 新建文件 +*/ +public class UserServiceImpl implements UserService { + + private UserDao userDao = new UserDaoImpl(); + + /** + * 用户登录验证 + * @param username 用户名 + * @param password 明文密码 + * @param roleType 角色类型 + * @return 登录成功返回User对象,失败返回null + */ + @Override + public User login(String username, String password, String roleType) { + // 1. 参数校验 + if (username == null || username.trim().isEmpty()) { + return null; + } + if (password == null || password.trim().isEmpty()) { + return null; + } + + // 2. 密码加密 + String encryptedPassword = MD5Util.md5(password); + + // 3. 查询用户 + User user = userDao.findByUsernameAndPassword(username, encryptedPassword); + + // 4. 验证角色 + if (user != null && !user.getRoleType().equals(roleType)) { + return null; + } + + // 5. 验证账号状态 + if (user != null && "2".equals(user.getStatus())) { + return null; + } + + return user; + } + + /** + * 用户注册 + * @param user 用户信息 + * @param confirmPassword 确认密码 + * @return 注册结果和错误信息 + */ + @Override + public RegisterResult register(User user, String confirmPassword) { + RegisterResult result = new RegisterResult(); + + // 1. 参数校验 + if (user.getUserName() == null || user.getUserName().trim().isEmpty()) { + result.setSuccess(false); + result.setMessage("用户名不能为空"); + return result; + } + + if (user.getPassword() == null || user.getPassword().trim().isEmpty()) { + result.setSuccess(false); + result.setMessage("密码不能为空"); + return result; + } + + // 2. 密码一致性校验 + if (!user.getPassword().equals(confirmPassword)) { + result.setSuccess(false); + result.setMessage("两次输入的密码不一致"); + return result; + } + + // 3. 手机号格式校验 + if (user.getPhone() == null || !user.getPhone().matches("^1[3-9]\\d{9}$")) { + result.setSuccess(false); + result.setMessage("手机号格式不正确"); + return result; + } + + // 4. 用户名唯一性校验 + User existUser = userDao.findByUsername(user.getUserName()); + if (existUser != null) { + result.setSuccess(false); + result.setMessage("用户名已存在"); + return result; + } + + // 5. 手机号唯一性校验 + User existPhone = userDao.findByPhone(user.getPhone()); + if (existPhone != null) { + result.setSuccess(false); + result.setMessage("手机号已注册"); + return result; + } + + // 6. 密码加密 + user.setPassword(MD5Util.md5(user.getPassword())); + user.setStatus("0"); // 默认未认证 + + // 7. 保存用户 + boolean success = userDao.add(user); + result.setSuccess(success); + result.setMessage(success ? "注册成功" : "注册失败,请稍后重试"); + + return result; + } +} diff --git a/HRS/src/com/hrs/util/DBUtil.java b/HRS/src/com/hrs/util/DBUtil.java new file mode 100644 index 0000000..7a38f5b --- /dev/null +++ b/HRS/src/com/hrs/util/DBUtil.java @@ -0,0 +1,158 @@ +package com.hrs.util; + +import java.sql.*; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: DBUtil.java +* @Description: 数据库连接工具类 +* +* @version: v1.0.0 +* @author: 董济硕 +* @date: 2026年4月13日 上午10:08:25 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 董济硕 v1.0.0 新建文件 +*/ +public class DBUtil { + + // 数据库配置信息 + private static final String DRIVER = "com.mysql.jdbc.Driver"; + private static final String URL = "jdbc:mysql://localhost:3306/hrs?useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true"; + private static final String USERNAME = "root"; // MySQL用户名 + private static final String PASSWORD = "root"; // MySQL密码 + /** + * + * @Function: + * @Description: 静态代码块:加载数据库驱动 + * + * @param: 无 + * @return:无 + * @throws:ClassNotFoundException + * + * @version: v1.0.0 + * @author: 董济硕 + * @date: 2025年4月6日 上午10:11:25 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月6日 董济硕 v1.0.0 新建方法 + */ + static { + try { + Class.forName(DRIVER); + System.out.println("✅ MySQL驱动加载成功!"); + } catch (ClassNotFoundException e) { + System.out.println("❌ MySQL驱动加载失败!"); + e.printStackTrace(); + } + } + + /** + * + * @Function: getConnection + * @Description: 获取数据库连接 + * + * @param: 无 + * @return:Connection 数据库连接对象 + * @throws:SQLException + * + * @version: v1.0.0 + * @author: 董济硕 + * @date: 2025年4月6日 上午10:14:58 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月6日 董济硕 v1.0.0 新建方法 + */ + public static Connection getConnection() throws SQLException { + return DriverManager.getConnection(URL, USERNAME, PASSWORD); + } + /** + * + * @Function: close + * @Description: 关闭连接(查询用) + * + * @param: ResultSet 结果集, PreparedStatement 预编译语句, Connection 数据库连接 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 董济硕 + * @date: 2025年4月6日 上午10:19:21 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月6日 董济硕 v1.0.0 新建方法 + */ + + public static void close(ResultSet rs, PreparedStatement pstmt, Connection conn) { + if (rs != null) { + try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } + } + close(pstmt, conn); + } + /** + * + * @Function: close + * @Description: 关闭连接(增删改用) + * + * @param: PreparedStatement 预编译语句, Connection 数据库连接 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 董济硕 + * @date: 2025年4月6日 上午10:50:58 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月6日 董济硕 v1.0.0 新建方法 + */ + public static void close(PreparedStatement pstmt, Connection conn) { + if (pstmt != null) { + try { pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } + } + if (conn != null) { + try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } + } + } + /** + * + * @Function: main + * @Description: 测试数据库连接 + * + * @param: String[] 命令行参数 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 董济硕 + * @date: 2025年4月6日 上午10:55:14 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月6日 董济硕 v1.0.0 新建方法 + */ + public static void main(String[] args) { + Connection conn = null; + try { + conn = DBUtil.getConnection(); + System.out.println("✅ 数据库连接成功!"); + System.out.println("连接对象:" + conn); + } catch (SQLException e) { + System.out.println("❌ 数据库连接失败!"); + e.printStackTrace(); + } finally { + close(null, null, conn); + } + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/util/ImageUploadUtil.java b/HRS/src/com/hrs/util/ImageUploadUtil.java new file mode 100644 index 0000000..4604c68 --- /dev/null +++ b/HRS/src/com/hrs/util/ImageUploadUtil.java @@ -0,0 +1,251 @@ +package com.hrs.util; + +import javax.servlet.http.Part; +import java.io.*; +import java.text.SimpleDateFormat; +import java.util.*; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: ImageUploadUtil.java +* @Description: 房源图片上传工具类 +* +* @version: v1.0.0 +* @author: 黄红 +* @date: 2026年4月13日 上午10:09:44 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 黄红 v1.0.0 新建文件 +*/ +public class ImageUploadUtil { + + // 允许的图片类型 + private static final Set ALLOWED_TYPES = new HashSet<>(Arrays.asList( + "image/jpeg", "image/jpg", "image/png", "image/gif" + )); + + // 最大文件大小 5MB + private static final long MAX_FILE_SIZE = 5 * 1024 * 1024; + + // 上传目录 + private static final String UPLOAD_DIR = "upload/house/"; + /** + * + * @Function: saveImage + * @Description: 保存单张图片 + * + * @param: Part 文件部件, HttpServletRequest 请求对象 + * @return:String 图片相对路径,失败返回null + * @throws:IOException + * + * @version: v1.0.0 + * @author: 黄红 + * @date: 2025年4月6日 上午10:11:11 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月6日 黄红 v1.0.0 新建方法 + */ + public static String saveImage(Part part, javax.servlet.http.HttpServletRequest request) { + if (part == null || part.getSize() == 0) { + return null; + } + + // 检查文件类型 + String contentType = part.getContentType(); + if (!ALLOWED_TYPES.contains(contentType)) { + System.out.println("不支持的文件类型:" + contentType); + return null; + } + + // 检查文件大小 + if (part.getSize() > MAX_FILE_SIZE) { + System.out.println("文件过大:" + part.getSize()); + return null; + } + + // 获取文件扩展名 + String extension = getExtension(contentType); + + // 生成唯一文件名 + String fileName = generateFileName() + extension; + + // 获取上传目录的绝对路径 + String uploadPath = request.getServletContext().getRealPath("/") + UPLOAD_DIR; + + // 创建目录 + File uploadDir = new File(uploadPath); + if (!uploadDir.exists()) { + uploadDir.mkdirs(); + } + + // 保存文件 + String filePath = uploadPath + fileName; + try (InputStream input = part.getInputStream(); + OutputStream output = new FileOutputStream(filePath)) { + + byte[] buffer = new byte[1024]; + int length; + while ((length = input.read(buffer)) > 0) { + output.write(buffer, 0, length); + } + + return UPLOAD_DIR + fileName; + + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + /** + * + * @Function: saveMultipleImages + * @Description: 保存多张图片(用于添加房源) + * + * @param: Collection 文件部件集合, HttpServletRequest 请求对象 + * @return:String 多张图片路径(逗号分隔),失败返回null + * @throws:IOException + * + * @version: v1.0.0 + * @author: 黄红 + * @date: 2025年4月6日 上午10:15:28 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月6日 黄红 v1.0.0 新建方法 + */ + public static String saveMultipleImages(java.util.Collection parts, + javax.servlet.http.HttpServletRequest request) { + List savedPaths = new ArrayList<>(); + + for (Part part : parts) { + if (part.getName().equals("images") && part.getSize() > 0) { + String path = saveImage(part, request); + if (path != null) { + savedPaths.add(path); + } + } + } + + if (savedPaths.isEmpty()) { + return null; + } + + return String.join(",", savedPaths); + } + /** + * + * @Function: deleteImage + * @Description: 删除图片文件 + * + * @param: imagePath 图片相对路径, HttpServletRequest 请求对象 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 黄红 + * @date: 2025年4月6日 上午10:14:23 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月6日 黄红 v1.0.0 新建方法 + */ + public static void deleteImage(String imagePath, javax.servlet.http.HttpServletRequest request) { + if (imagePath == null || imagePath.trim().isEmpty()) { + return; + } + + String realPath = request.getServletContext().getRealPath("/") + imagePath; + File file = new File(realPath); + if (file.exists()) { + file.delete(); + } + } + /** + * + * @Function: deleteImages + * @Description: 删除多张图片 + * + * @param: imagePaths 多张图片路径(逗号分隔), HttpServletRequest 请求对象 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 黄红 + * @date: 2025年4月6日 上午10:20:18 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月6日 黄红 v1.0.0 新建方法 + */ + public static void deleteImages(String imagePaths, javax.servlet.http.HttpServletRequest request) { + if (imagePaths == null || imagePaths.trim().isEmpty()) { + return; + } + + String[] paths = imagePaths.split(","); + for (String path : paths) { + deleteImage(path.trim(), request); + } + } + /** + * + * @Function: getExtension + * @Description: 根据内容类型获取文件扩展名 + * + * @param: contentType 文件内容类型 + * @return:String 文件扩展名 + * @throws:无 + * + * @version: v1.0.0 + * @author: 黄红 + * @date: 2025年4月6日 上午10:22:45 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月6日 黄红 v1.0.0 新建方法 + */ + private static String getExtension(String contentType) { + switch (contentType) { + case "image/jpeg": + case "image/jpg": + return ".jpg"; + case "image/png": + return ".png"; + case "image/gif": + return ".gif"; + default: + return ".jpg"; + } + } + /** + * + * @Function: generateFileName + * @Description: 生成唯一文件名 + * + * @param: 无 + * @return:String 唯一文件名 + * @throws:无 + * + * @version: v1.0.0 + * @author: 黄红 + * @date: 2025年4月6日 上午10:24:23 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月6日 黄红 v1.0.0 新建方法 + */ + private static String generateFileName() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + return sdf.format(new Date()) + "_" + UUID.randomUUID().toString().substring(0, 8); + } +} \ No newline at end of file diff --git a/HRS/src/com/hrs/util/MD5Util.java b/HRS/src/com/hrs/util/MD5Util.java new file mode 100644 index 0000000..c0050a9 --- /dev/null +++ b/HRS/src/com/hrs/util/MD5Util.java @@ -0,0 +1,142 @@ +package com.hrs.util; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** +* Copyright: Copyright (c) 2026 chinasofti +* +* @ClassName: MD5Util.java +* @Description: MD5加密工具类 +* +* @version: v1.0.0 +* @author: 李鑫 +* @date: 2026年4月13日 上午10:10:21 +* +* Modification History: +* Date Author Version Description +*---------------------------------------------------------* +* 2026年4月13日 李鑫 v1.0.0 新建文件 +*/ +public class MD5Util { + /** + * + * @Function: md5 + * @Description: 将字符串进行MD5加密 + * + * @param: str 要加密的字符串 + * @return:String MD5加密后的32位小写字符串 + * @throws:NoSuchAlgorithmException + * + * @version: v1.0.0 + * @author: 李鑫 + * @date: 2025年4月6日 上午10:20:32 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月6日 李鑫 v1.0.0 新建方法 + */ + public static String md5(String str) { + if (str == null || str.isEmpty()) { + return null; + } + + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] bytes = md.digest(str.getBytes()); + + // 将字节数组转换为十六进制字符串 + StringBuilder sb = new StringBuilder(); + for (byte b : bytes) { + // 取字节的高四位 + int high = (b >> 4) & 0x0f; + // 取字节的低四位 + int low = b & 0x0f; + sb.append(hexChar(high)); + sb.append(hexChar(low)); + } + + return sb.toString(); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + return null; + } + } + /** + * + * @Function: hexChar + * @Description: 将0-15的数字转换为十六进制字符 + * + * @param: value 0-15的整数值 + * @return:char 对应的十六进制字符 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李鑫 + * @date: 2025年4月6日 上午10:24:58 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月6日 李鑫 v1.0.0 新建方法 + */ + private static char hexChar(int value) { + if (value >= 0 && value <= 9) { + return (char) ('0' + value); + } else { + return (char) ('a' + (value - 10)); + } + } + /** + * + * @Function: verify + * @Description: 验证密码是否匹配 + * + * @param: inputPassword 用户输入的明文密码, storedPassword 数据库中存储的MD5密码 + * @return:boolean 是否匹配 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李鑫 + * @date: 2025年4月6日 上午10:28:42 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月6日 李鑫 v1.0.0 新建方法 + */ + public static boolean verify(String inputPassword, String storedPassword) { + String encrypted = md5(inputPassword); + return encrypted != null && encrypted.equals(storedPassword); + } + /** + * + * @Function: main + * @Description: 测试方法 + * + * @param: String[] 命令行参数 + * @return:无 + * @throws:无 + * + * @version: v1.0.0 + * @author: 李鑫 + * @date: 2025年4月6日 上午10:30:25 + * + * Modification History: + * Date Author Version Description + *---------------------------------------------------------* + * 2025年4月6日 李鑫 v1.0.0 新建方法 + */ + public static void main(String[] args) { + String password = "123456"; + String encrypted = md5(password); + System.out.println("明文密码:" + password); + System.out.println("MD5加密:" + encrypted); + System.out.println("长度:" + encrypted.length()); + + // 验证 + System.out.println("验证结果:" + verify("123456", encrypted)); + } +} \ No newline at end of file