上传完整架构
This commit is contained in:
17
HRS/.classpath
Normal file
17
HRS/.classpath
Normal file
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jre-1.8">
|
||||
<attributes>
|
||||
<attribute name="owner.project.facets" value="java"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.eclipse.jst.server.tomcat.runtimeTarget/Apache Tomcat v9.0">
|
||||
<attributes>
|
||||
<attribute name="owner.project.facets" value="jst.web"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
|
||||
<classpathentry kind="output" path="build/classes"/>
|
||||
</classpath>
|
||||
31
HRS/.project
Normal file
31
HRS/.project
Normal file
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>HRS</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.wst.common.project.facet.core.builder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.wst.validation.validationbuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
|
||||
<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
|
||||
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
12
HRS/.settings/.jsdtscope
Normal file
12
HRS/.settings/.jsdtscope
Normal file
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry excluding="**/bower_components/*|**/node_modules/*|**/*.min.js" kind="src" path="WebContent"/>
|
||||
<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.WebProject">
|
||||
<attributes>
|
||||
<attribute name="hide" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary"/>
|
||||
<classpathentry kind="output" path=""/>
|
||||
</classpath>
|
||||
7
HRS/.settings/org.eclipse.jdt.core.prefs
Normal file
7
HRS/.settings/org.eclipse.jdt.core.prefs
Normal file
@@ -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
|
||||
8
HRS/.settings/org.eclipse.wst.common.component
Normal file
8
HRS/.settings/org.eclipse.wst.common.component
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
|
||||
<wb-module deploy-name="HRS">
|
||||
<wb-resource deploy-path="/" source-path="/WebContent" tag="defaultRootSource"/>
|
||||
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src"/>
|
||||
<property name="context-root" value="HRS"/>
|
||||
<property name="java-output-path" value="/HRS/build/classes"/>
|
||||
</wb-module>
|
||||
</project-modules>
|
||||
10
HRS/.settings/org.eclipse.wst.common.project.facet.core.xml
Normal file
10
HRS/.settings/org.eclipse.wst.common.project.facet.core.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<faceted-project>
|
||||
<runtime name="Apache Tomcat v9.0"/>
|
||||
<fixed facet="wst.jsdt.web"/>
|
||||
<fixed facet="java"/>
|
||||
<fixed facet="jst.web"/>
|
||||
<installed facet="java" version="1.8"/>
|
||||
<installed facet="jst.web" version="4.0"/>
|
||||
<installed facet="wst.jsdt.web" version="1.0"/>
|
||||
</faceted-project>
|
||||
@@ -0,0 +1 @@
|
||||
org.eclipse.wst.jsdt.launching.baseBrowserLibrary
|
||||
1
HRS/.settings/org.eclipse.wst.jsdt.ui.superType.name
Normal file
1
HRS/.settings/org.eclipse.wst.jsdt.ui.superType.name
Normal file
@@ -0,0 +1 @@
|
||||
Window
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
HRS/build/classes/com/hrs/controller/user/LoginController.class
Normal file
BIN
HRS/build/classes/com/hrs/controller/user/LoginController.class
Normal file
Binary file not shown.
BIN
HRS/build/classes/com/hrs/controller/user/LogoutController.class
Normal file
BIN
HRS/build/classes/com/hrs/controller/user/LogoutController.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
HRS/build/classes/com/hrs/dao/CollectionDao.class
Normal file
BIN
HRS/build/classes/com/hrs/dao/CollectionDao.class
Normal file
Binary file not shown.
BIN
HRS/build/classes/com/hrs/dao/HouseDao.class
Normal file
BIN
HRS/build/classes/com/hrs/dao/HouseDao.class
Normal file
Binary file not shown.
BIN
HRS/build/classes/com/hrs/dao/OrderDao.class
Normal file
BIN
HRS/build/classes/com/hrs/dao/OrderDao.class
Normal file
Binary file not shown.
BIN
HRS/build/classes/com/hrs/dao/ReservationDao.class
Normal file
BIN
HRS/build/classes/com/hrs/dao/ReservationDao.class
Normal file
Binary file not shown.
BIN
HRS/build/classes/com/hrs/dao/UserDao.class
Normal file
BIN
HRS/build/classes/com/hrs/dao/UserDao.class
Normal file
Binary file not shown.
BIN
HRS/build/classes/com/hrs/dao/impl/CollectionDaoImpl.class
Normal file
BIN
HRS/build/classes/com/hrs/dao/impl/CollectionDaoImpl.class
Normal file
Binary file not shown.
BIN
HRS/build/classes/com/hrs/dao/impl/HouseDaoImpl.class
Normal file
BIN
HRS/build/classes/com/hrs/dao/impl/HouseDaoImpl.class
Normal file
Binary file not shown.
BIN
HRS/build/classes/com/hrs/dao/impl/OrderDaoImpl.class
Normal file
BIN
HRS/build/classes/com/hrs/dao/impl/OrderDaoImpl.class
Normal file
Binary file not shown.
BIN
HRS/build/classes/com/hrs/dao/impl/ReservationDaoImpl.class
Normal file
BIN
HRS/build/classes/com/hrs/dao/impl/ReservationDaoImpl.class
Normal file
Binary file not shown.
BIN
HRS/build/classes/com/hrs/dao/impl/UserDaoImpl.class
Normal file
BIN
HRS/build/classes/com/hrs/dao/impl/UserDaoImpl.class
Normal file
Binary file not shown.
BIN
HRS/build/classes/com/hrs/filter/EncodingFilter.class
Normal file
BIN
HRS/build/classes/com/hrs/filter/EncodingFilter.class
Normal file
Binary file not shown.
BIN
HRS/build/classes/com/hrs/filter/LoginFilter.class
Normal file
BIN
HRS/build/classes/com/hrs/filter/LoginFilter.class
Normal file
Binary file not shown.
BIN
HRS/build/classes/com/hrs/model/entity/Collection.class
Normal file
BIN
HRS/build/classes/com/hrs/model/entity/Collection.class
Normal file
Binary file not shown.
BIN
HRS/build/classes/com/hrs/model/entity/House.class
Normal file
BIN
HRS/build/classes/com/hrs/model/entity/House.class
Normal file
Binary file not shown.
BIN
HRS/build/classes/com/hrs/model/entity/Order.class
Normal file
BIN
HRS/build/classes/com/hrs/model/entity/Order.class
Normal file
Binary file not shown.
BIN
HRS/build/classes/com/hrs/model/entity/Reservation.class
Normal file
BIN
HRS/build/classes/com/hrs/model/entity/Reservation.class
Normal file
Binary file not shown.
BIN
HRS/build/classes/com/hrs/model/entity/User.class
Normal file
BIN
HRS/build/classes/com/hrs/model/entity/User.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
HRS/build/classes/com/hrs/service/CollectionService.class
Normal file
BIN
HRS/build/classes/com/hrs/service/CollectionService.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
HRS/build/classes/com/hrs/service/HouseService.class
Normal file
BIN
HRS/build/classes/com/hrs/service/HouseService.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
HRS/build/classes/com/hrs/service/OrderService.class
Normal file
BIN
HRS/build/classes/com/hrs/service/OrderService.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
HRS/build/classes/com/hrs/service/ReservationService.class
Normal file
BIN
HRS/build/classes/com/hrs/service/ReservationService.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
HRS/build/classes/com/hrs/service/UserService.class
Normal file
BIN
HRS/build/classes/com/hrs/service/UserService.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
HRS/build/classes/com/hrs/service/impl/HouseServiceImpl.class
Normal file
BIN
HRS/build/classes/com/hrs/service/impl/HouseServiceImpl.class
Normal file
Binary file not shown.
BIN
HRS/build/classes/com/hrs/service/impl/OrderServiceImpl.class
Normal file
BIN
HRS/build/classes/com/hrs/service/impl/OrderServiceImpl.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
HRS/build/classes/com/hrs/service/impl/UserServiceImpl.class
Normal file
BIN
HRS/build/classes/com/hrs/service/impl/UserServiceImpl.class
Normal file
Binary file not shown.
BIN
HRS/build/classes/com/hrs/util/DBUtil.class
Normal file
BIN
HRS/build/classes/com/hrs/util/DBUtil.class
Normal file
Binary file not shown.
BIN
HRS/build/classes/com/hrs/util/ImageUploadUtil.class
Normal file
BIN
HRS/build/classes/com/hrs/util/ImageUploadUtil.class
Normal file
Binary file not shown.
BIN
HRS/build/classes/com/hrs/util/MD5Util.class
Normal file
BIN
HRS/build/classes/com/hrs/util/MD5Util.class
Normal file
Binary file not shown.
170
HRS/sql/hrs_init.sql
Normal file
170
HRS/sql/hrs_init.sql
Normal file
@@ -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;
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
68
HRS/src/com/hrs/controller/admin/AdminHouseController.java
Normal file
68
HRS/src/com/hrs/controller/admin/AdminHouseController.java
Normal file
@@ -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<House> pendingList = houseDao.findPendingHouses();
|
||||
List<House> publishedList = houseDao.findPublishedHousesForAdmin();
|
||||
List<House> 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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
61
HRS/src/com/hrs/controller/admin/AdminOrderController.java
Normal file
61
HRS/src/com/hrs/controller/admin/AdminOrderController.java
Normal file
@@ -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<Order> 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);
|
||||
}
|
||||
}
|
||||
@@ -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("}");
|
||||
}
|
||||
}
|
||||
94
HRS/src/com/hrs/controller/admin/AdminUserController.java
Normal file
94
HRS/src/com/hrs/controller/admin/AdminUserController.java
Normal file
@@ -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<User> allUsers = getAllUsers();
|
||||
|
||||
// 分离不同角色
|
||||
List<User> tenants = new java.util.ArrayList<>();
|
||||
List<User> landlords = new java.util.ArrayList<>();
|
||||
List<User> 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<User> getAllUsers() {
|
||||
// 通过DAO获取所有用户
|
||||
// 注意:UserDAO中没有findAll方法,需要添加
|
||||
// 这里先用查询所有租客和房东的方式
|
||||
List<User> 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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
152
HRS/src/com/hrs/controller/landlord/HouseAddController.java
Normal file
152
HRS/src/com/hrs/controller/landlord/HouseAddController.java
Normal file
@@ -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<Part> 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());
|
||||
}
|
||||
}
|
||||
111
HRS/src/com/hrs/controller/landlord/HouseDeleteController.java
Normal file
111
HRS/src/com/hrs/controller/landlord/HouseDeleteController.java
Normal file
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
138
HRS/src/com/hrs/controller/landlord/HouseEditController.java
Normal file
138
HRS/src/com/hrs/controller/landlord/HouseEditController.java
Normal file
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
63
HRS/src/com/hrs/controller/landlord/HouseListController.java
Normal file
63
HRS/src/com/hrs/controller/landlord/HouseListController.java
Normal file
@@ -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<House> 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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<Order> 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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<Reservation> 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);
|
||||
}
|
||||
}
|
||||
89
HRS/src/com/hrs/controller/user/CollectionAddController.java
Normal file
89
HRS/src/com/hrs/controller/user/CollectionAddController.java
Normal file
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
127
HRS/src/com/hrs/controller/user/CollectionDeleteController.java
Normal file
127
HRS/src/com/hrs/controller/user/CollectionDeleteController.java
Normal file
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<Collection> 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);
|
||||
}
|
||||
}
|
||||
73
HRS/src/com/hrs/controller/user/HouseDetailController.java
Normal file
73
HRS/src/com/hrs/controller/user/HouseDetailController.java
Normal file
@@ -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);
|
||||
}
|
||||
}
|
||||
74
HRS/src/com/hrs/controller/user/HouseListController.java
Normal file
74
HRS/src/com/hrs/controller/user/HouseListController.java
Normal file
@@ -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<House> 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);
|
||||
}
|
||||
}
|
||||
120
HRS/src/com/hrs/controller/user/LoginController.java
Normal file
120
HRS/src/com/hrs/controller/user/LoginController.java
Normal file
@@ -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);
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user