java课程设计——租房管理系统

java课程设计——租房管理系统,实现代码和主要思路。

效果图

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

数据库设计

admin表

租房管理系统需要有人管理,使用者拥有管理员账号。管理员账号拥有查看房间,增加房间,出租房间,结算租金,增加租金,查看用户,查看缴费记录等权限。


字段 属性 备注
id varchar(20)(主键) 账号
name varchar(20) 姓名
password varchar(20) 密码

tenant表

房间的租用者需要登记信息才能租用房间,也应该拥有账号和密码。租用者拥有普通用户账号。普通用户账号拥有修改自身密码,查看房间,租用房间,缴纳租金等权限。


字段 属性 备注
id varchar(20) 账号
password Char(20) 密码
name varchar(20) 租客姓名
card Char(18) 身份证号
sett Int(11) 是否缴纳租金
room Int(18) 房间号
time Date(0) 租房时间
sex Char(255) 租客性别
hometown Char(255) 租客地址

room表

每个房间的信息需要存储,因此需要一个Room表来存储房间信息。


字段 属性 备注
id int(10) 房间号
grade varchar(20) 型号
price Float(0) 价格
state int(20) 是否有人租用
remarks Int(11) 备注

history表

history表用于存储缴费记录。


字段 属性 备注
id int(11)(主键自增) 序号
name varchar(255)外键 姓名
room varchar(255)(外键) 房间号
registertime datetime(0) 开始租房时间
exittime datetime(0) 结束租房时间
money float(20) 租金
remarks varchar(255) 备注

message表

在租用者缴费时,需要有管理员用户确认,当租用者点击缴纳租金时,向数据库存储一条消息,在管理员登录后点击缴费申请,程序从数据库中读取数据,之后显示。


字段 属性 备注
fromid varchar(255) 来自账号的消息
toid varchar(255) 管理员账号
room int(11) 房间号

业务实体类

为了提高系统代码的可重用性,有必要将系统中的基本业务实体抽象为类。业务实体是系统在现实中的真实存在(比如管理员,房间,普通用户),或抽象概念(比如历史记录),它们在系统中是由各种数据组成的,具有一定意义的数据结构,本系统中需要定义5个业务实体,下面将一一介绍。实体类和数据库中的数据表现对应。每个类拥有和数据库相同的属性并对类进行封装。

Admin实体类

管理员是系统的操作者。出于安全性考虑,系统不能有任何人都可以操作。通过分析。管理员拥有的特征信息有账号,姓名和密码,所以可以定义管理员实体。

package renting.bll.entity;

/*
管理员实体类
*/

public class Admin {
	private String id;                 //编号
	private String name;           //姓名
	private String password;      //密码
	private String extend;         //权限
	//省略set与get方法与构造方法
}

History实体类

历史记录是以前房间的所有租用记录,方便查账与查账使用。历史记录是一种抽象概念。通过分析发现,一条历史记录应该拥有的特征信息应该有编号,租房者姓名,房间号,开始租房时间,结束租房时间,租金。

package renting.bll.entity;

/*
历史记录实体
历史记录实体是小区房间的缴费记录,方便统计与查账使用
*/
import java.util.Date;

public class History {
	private int id; //编号
	private String name;//姓名
	private int room;//房间号
	private Date registerTime;//开始租房时间
	private Date exitTime; //结束租房时间
	private float money; //租金
	private String remarks;  //备注
	//省略set与get方法与构造方法
}

Message类

在普通用户缴纳租金时,需要管理员用户确定,因此需要一个类存储用户的信息。

package renting.bll.entity;

public class Message {
	private String from;
	private String to;
	private int room;
	//省略set与get方法与构造方法
}

Room实体类

每个房间需要有相应的信息,这样既可以便于根据用户需求,租用不同的房间,同时也方便查询和选择房间。客房的特征信息有房间号,级别(如三室一厅),价格,状态(是否被人租用)。

package renting.bll.entity;

/*
客房实体
*/

public class Room {
	private int id;               //房间号
	private String grade ;      //级别
	private float price;        //价格
	private int state;           //状态
	private String remarks;    //备注
//省略set与get方法与构造方法
}

Tenanta实体类

租用房间的普通用户也需要存储下来,通过分析发现,普通用户的特征信息有账号,密码,姓名,身份证号,房间号,状态(是否缴纳租金),租金,入住时间,性别,籍贯。可以定义房客实体。

package renting.bll.entity;

import java.util.Date;

/*
房客实体类
*/
public class Tenant {
	private String id;           //帐号
	private String password;  //密码
	private String name;     //姓名
	private String card;     //身份证
	private int room;         //房间号
	private int sett;        //状态
	private Float money;      //租金
	private Date time;        //入住时间
	private String sex;       //性别
	private String hometown;  //籍贯

	//省略set与get方法与构造方法
	
}

数据库ER图设计

在这里插入图片描述

数据库连接层

数据库连接层实现连接数据库并获取连接的功能。代码如下:

package renting.dal;

/*
数据库连接
*/

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConnecter {
	/*
		连接数据库
	*/
	private String driver = "com.mysql.cj.jdbc.Driver";
	private String url = "jdbc:mysql://localhost:3306/renting?serverTimezone=UTC&characterEncoding=utf-8";
	private String user = "root";
	private String password = "12481632";
	
	public Connection getConnection() throws SQLException {
	    try {
	        Class.forName(driver);
	    } catch (java.lang.ClassNotFoundException cnfe) {
	        cnfe.printStackTrace();
	        System.out.println("驱动失败");
	    }
	    Connection conn = null;
	   
	    try {
	    	conn = DriverManager.getConnection(url, user, password);
	    	
	    }catch(SQLException ex) {
	    	System.out.println("数据库登录失败!");
	    } 
	    return conn;
	}
/*

*/
}

业务管理层

管理员业务处理

管理员业务处理类:getPreparedStatement()方法

public class AdminManager {
	private PreparedStatement getPreparedStatement(String sql) throws SQLException {
	    return new DBConnecter().getConnection().prepareStatement(sql);
	}
}

上述类中定义了一个私有方法getPreparedStatement(),主要用来获取java.sql.PrepareStatement类的实体,以便于处理SQL语句。在所有的业务处理类中都有getPreparedStatement()方法,方法的作用也都一样,后面也都不再多说。

管理员业务处理类:login()方法
在管理员登录的时候,需要判断账号与密码是否正确,login()方法返回一个布尔类型,如果数据库中存在此账号,登录成功,返回true,否则登录失败,返回false。同样在普通用户中也有一个login()方法,后面就不再介绍。

public boolean login(Admin admin) throws SQLException {
		String sql="select * from admin where id=? and password=?";
	    PreparedStatement ps = getPreparedStatement(sql);
	    ps.setString(1, admin.getId());
	    ps.setString(2, admin.getPassword());
	    ResultSet rs = ps.executeQuery();
	    int ans = 0;
	    if(rs.next()) {
	    	ans = 1;
	    }    
	    rs.close();
	    ps.close();
	    if(ans == 1) {
	    	return true;
	    }
	    else return false;
	}

管理员业务处理类:JudgeAdminID()方法
在修改账号与密码的时候,需要判断数据库中是否存在该账号,JudgeAdminID()方法在数据库中查询账号是存在,如果存在,返回true,否则返回false。同样在普通用户中也有一个JudgeTenantId()方法,后面就不再介绍。

//判断账号是否存在
	public boolean JudgeAdminID(String ID) throws SQLException {
		String sql = "select * from Admin where id = ?";
		PreparedStatement ps = getPreparedStatement(sql);
		ps.setString(1, ID);
		ResultSet rs = ps.executeQuery();
		if(rs.next())
			return true;
		return false;
	}

普通用户业务处理

普通用户业务处理:QueryPeopleAsCard()方法
用于按照身份证号来查找普通用户,主程序将需要查找的身份证号传过来,然后用SQL语句查询,如果查询成功,返回true,否则返回false。与此功能相似的还有按照账号查询和按照房间号查询。

/*
	 * 按身份证号查询房客
	 */
	public boolean QueryPeopleAsCard(String Card) throws SQLException {
		sql = "select * from tenant where card=?";
		PreparedStatement ps = getPreparedStatement(sql); 
		ps.setString(1, Card);
		ResultSet rs = ps.executeQuery();
		if(rs.next()) {
			this.tenant.setId(rs.getString("id"));
			this.tenant.setPassword(rs.getString("password"));
			this.tenant.setName(rs.getString("name"));
			this.tenant.setSex(rs.getString("sex"));
			this.tenant.setRoom(rs.getInt("room"));
			this.tenant.setHometown(rs.getString("hometown"));
			this.tenant.setTime(rs.getDate("time"));
			this.tenant.setCard(rs.getString("card"));
			
			return true;
		}
		return false;
		
	}

普通用户业务处理:insertTenant()方法
insertTenant()方法用于插入房客信息,在普通用户注册时,会有相应的信息,在用户注册成功后,会把信息写入数据库,或者登记房客时,会根据身份证号查询该用户是否拥有账号,如果拥没有账号,会自动生成一个账号,然后更新信息。

//插入房客信息
	public boolean insertTenant(Tenant tenant) throws SQLException {
		sql = "insert into tenant (id, password, name, card, room, time, sex, hometown) values(?,?,?,?,?,?,?,?)";
		PreparedStatement ps = getPreparedStatement(sql); 
		ps.setString(1, tenant.getId());
		ps.setString(2, tenant.getPassword());
		ps.setString(3, tenant.getName());
		ps.setString(4, tenant.getCard());
		ps.setInt(5, tenant.getRoom());
		ps.setDate(6, (Date) tenant.getTime());
		ps.setString(7, tenant.getSex());
		ps.setString(8, tenant.getHometown());
		
		ps.executeUpdate();
		return true;
		
	}

普通用户业务处理:TestingSett()方法
TestingSett()方法检测用户是否交过租金,如果交过租金,会弹出“该用户已缴纳租金”的窗口,如果没有缴纳租金,则会弹出“缴纳租金成功”的窗口,并且更新数据库中的数据。

//检测是否交过押金
	public void TestingSett (String id) throws SQLException {
		sql = "select * from tenant where id=?";
		PreparedStatement ps = getPreparedStatement(sql); 
		ps.setString(1, id);
		ResultSet rs = ps.executeQuery();
		Tenant tenant = new Tenant();
		tenant.setCard("");
		if(rs.next()) {
			tenant.setId(rs.getString("id"));
			tenant.setPassword(rs.getString("password"));
			tenant.setName(rs.getString("name"));
			tenant.setSex(rs.getString("sex"));
			tenant.setRoom(rs.getInt("room"));
			tenant.setHometown(rs.getString("hometown"));
			tenant.setTime(rs.getDate("time"));
			tenant.setCard(rs.getString("card"));
			tenant.setSett(rs.getInt("sett"));
		}
		if(tenant.getSett()==1) {
			JOptionPane.showMessageDialog(null, "该用户已缴纳租金!", "该用户已缴纳租金", JOptionPane.ERROR_MESSAGE);
		}
		else {
			JOptionPane.showMessageDialog(null, "缴纳租金成功!", "缴纳租金成功", JOptionPane.INFORMATION_MESSAGE);
			sql = "update tenant set sett=1 where id=?";
			ps = getPreparedStatement(sql); 
			ps.setString(1, id);
			ps.executeUpdate();
		}
	}

房间业务处理

房间业务处理类:getCustomer()方法
用于获得所有房间的信息,主页面的下方是一个表格,将所有的房间信息显示在表格中,首先需要获取所有房间的信息。

//查询所有房间
	private ResultSet getCustomer() throws SQLException{
		String sql = "select * from room";
		PreparedStatement ps = getPreparedStatement(sql);
		return ps.executeQuery();
	}

房间业务处理类:toArrayList()方法
将上面获得的信息转化成列表

private ArrayList<Room> toArrayList(ResultSet rs) {
		try {
			ArrayList<Room> al = new ArrayList<>();
			Room room = new Room();
			while (rs.next()) {
				room = new Room();
				room.setId(rs.getInt("id"));
				room.setGrade(rs.getString("grade"));
				room.setPrice(rs.getFloat("price"));
				room.setState(rs.getInt("state"));
				room.setRemarks(rs.getString("remarks"));
				al.add(room);
			}
			rs.close();
			return al;
		} catch(SQLException ex) {
			return null;
		}
	}

房间业务处理类:toDefaultTableModel()方法
将获得的列表转化成表格中应该显示的数据,并加上表头,生成表格。

private DefaultTableModel toDefaultTableModel(ArrayList<Room> al) {
		int row = al.size();
		Object [][] o = new Object[row+1][5];
		Room room = null;
		o[0][0]="房间号";
		o[0][1]="级别";
		o[0][2]="租金";
		o[0][3]="状态";
		o[0][4]="备注";
		for(int i=0; i<row; i++) {
			room = al.get(i);
			for(int j=0; j<5; j++) {
				if(j==0) {
					o[i+1][j] = Integer.valueOf(room.getId());
				} else if(j==1) {
					o[i+1][j] = room.getGrade();
				} else if(j==2) {
					o[i+1][j] = Float.valueOf(room.getPrice());
				} else if(j==3) {
					o[i+1][j] = room.getState()==1 ? "已租出" : "未租出";
				} else if(j==4) {
					o[i+1][j] = room.getRemarks();
				}
				
			}
		}
		String col[]= {"房间号", "级别", "价格", "状态", "备注"};
		return new MyDefaultTableModel(o, col);
	}

房间业务处理类:getMessage()方法
获取表格,经过上面几个步骤,可以把所有的房间信息都放到表格中,之后在主程序中调用就可以在主页面上显示一个显示房间信息的表格。

public DefaultTableModel getMessage() {
		
		try {
			return toDefaultTableModel(toArrayList(getCustomer()));
		}catch (SQLException ex) {
			return null;
		}
	}

房间业务处理类:RoomAdd()方法
用于添加房间,获取一个Room类,将Room类中的属性插入数据库。

public boolean RoomAdd(Room room) throws SQLException {
		
		try {
			String sql = "insert into room (id, price, grade, state) values (?,?,?,?)";
			PreparedStatement ps = getPreparedStatement(sql);
			ps.setInt(1, room.getId());
			ps.setFloat(2, room.getPrice());
			ps.setString(3, room.getGrade());
			ps.setInt(4,  0);
			ps.executeUpdate();
			JOptionPane.showMessageDialog(null, "添加房间成功!", "添加房间成功", JOptionPane.INFORMATION_MESSAGE); 
			return true;
		}catch(SQLException ex) {
			return false;
		}
		
	}

房间业务处理类: UpdateRoom()方法
用于更新租金,由主程序进入修改租金界面后,当输入修改的金额并点击确定后,调用此方法更新租金。

//更新租金
	public void UpdateRoom(Room room) throws SQLException {
		 String sql = "update room set price=? where id=?";
		 PreparedStatement ps = getPreparedStatement(sql);
		 ps.setFloat(1, room.getPrice());
		 ps.setInt(2, room.getId());
		 ps.executeUpdate();
		JOptionPane.showMessageDialog(null, "修改租金成功!", "修改租金成功", JOptionPane.INFORMATION_MESSAGE); 
	}

历史记录处理

历史记录处理类中基本上只有一些SQL语句实现历史记录的增删改查,还有一个获取历史记录表格,显示在窗口上的方法,这里不再多说。

主要功能&图形化

登录

登录界面的正上方是一个租房管理系统的标签,华文楷体,账号类型有管理员账号和普通用户可以选择,选择不同的账号类型,会调用不同的方法来判断账号是否正确。点击登录会判断账号的正确性,如果正确跳转到主页面,如果错误会弹出账号或密码错误的窗口。点击注册,跳转到注册账号的窗口。
在这里插入图片描述

注册

注册账号有四个文本框,分别是用户名,账号,密码,确认密码。点击注册,当四个框中有任何一个文本框是空的时候,都会弹出“XX不能为空”的窗口,当密码和确认密码不同的时候也会弹出相应的窗口,如果符合条件,会弹出注册成功的窗口,将用户信息加入数据库,并转到登录界面。点击取消,返回登录界面。
在这里插入图片描述

主页面

主页面的最上方是菜单栏,下面一一介绍。

系统管理包含三个选项:刷新,修改密码,退出系统。
点击刷新,将更新表格,如果有其他管理员在此时添加房间,在刷新后会显示出来。
点击修改密码,转到修改密码窗口。
点击退出系统,将会关闭所有窗口,退出系统。

基本管理包含两个选项:出租房间和结算租金。
点击出租房间,将会转到出租房间的界面。
点击结算租金,将会跳转到结算租金的界面。

房间管理包含三个选项:增加房间,查询房间,增加租金。
点击相应的按钮将会转到与之对应的窗口。

房客管理包含两个选项:增加租金和查询房客,其中查询房客又包含三个选项:按身份证号查询,按房间号查询,按账号查询。
点击不同的按钮转到不同的窗口。

缴费管理包含两个选项:缴费记录和缴费申请。
点击缴费记录会出现一个新的窗口,窗口上有一个表格,表格显示历史缴费记录。
点击缴费申请,如果没有普通用户申请缴费,弹出当前没有申请需要处理。如果有用户申请缴费,则会弹出一个窗口,有用户名和房间号信息。
在这里插入图片描述

修改密码

主页面点击修改密码将会进入修改密码窗口,在修改密码界面上有五个属性:账号类型,账号,密码,修改密码,确认密码。
当任何一个文本框为空时或修改密码与确认密码不相同时,将会弹出相应的窗口。点击确定后,将根据账号类型调用不同的方法确认账号密码是否正确,如果符合条件,将会修改账号的密码。
在这里插入图片描述

出租房间

在主页面点击出租房间按钮,将会跳转到出租房间的界面,包含五个属性:身份证号,房间号,姓名,性别和籍贯。
在这里插入图片描述当所有信息都输入之后将会根据身份证号判断数据库中是否存在账号,如果不存在,则会自动生成账号和密码,之后显示房间信息和房客信息。
在这里插入图片描述之后有房主的信息确认,点击确定,更新数据库中的信息。

在这里插入图片描述

结算租金

主界面点击结算租金,将会跳转到结算租金界面,输入房间号,将会显示房间信息。
在这里插入图片描述之后会显示房间信息和房客信息,点击返回跳转到主页面,点击确定缴纳租金,此时会判断该房客是否缴纳租金。
在这里插入图片描述如果此用户已缴费,弹出“该用户已缴纳租金”的窗口,如果该用户没有缴费,则弹出缴费成功的窗口,并更新数据库中的数据。
在这里插入图片描述

增加房间

主页面点击增加房间,进入增加房间页面。
之后输入房间号与租金,可以选择级别,级别包括三个选项:三室一厅,两室一厅,一室一厅。点击取消,返回主页面。点击添加,判断是否符合条件,如果符合条件,将数据加入数据库。
在这里插入图片描述

查询房间

主页面点击查询房间进入查询房间界面。
输入房间号,点击确定将会判断是房间号是否存在。
在这里插入图片描述如果房间号存在,将会在左边显示房间信息,如果该房间有人租用,将会在右边显示房客信息,如果没人租用,将会在右边显示该房间还没有租用。
在这里插入图片描述

增加租金

主页面点击增加租金,跳转到增加租金界面。输入房间号,点击确定,将会对房间号进行判断。
在这里插入图片描述如果房间存在,将会显示房间号和原租金,新租金后面有一个文本框,用于输入新租金。在输入新租金并点击确定之后会更新房间的租金。
在这里插入图片描述
在房客管理中同样有一个增加租金的选项,点击之后会出现以下窗口。输入身份证号之后,会根据身份证号查询房间,之后根据房间号跳转窗口。
在这里插入图片描述

查询房客

主界面点击查询房客将会有三个选项,按身份证号查询,按房间号查询,按房间号查询。
三种查询方式类似,在此只写按身份证号查询。
输入身份证号后点击确定,将会对身份证号进行判断。
在这里插入图片描述如果数据库中有该身份证号,将显示房客信息,否则弹出不存在此用户的窗口。
在这里插入图片描述

缴费记录

点击主页面中的缴费记录,将会跳转到缴费记录的窗口,缴费记录的页面是一个表格上面有所有存储在数据库中的数据,点击返回回到主页面。
在这里插入图片描述

缴费申请

点击缴费管理中的缴费请求,如果有人请求缴费,则会弹出用户的姓名和房间号,如果没有,则会弹出当前没有用户请求缴费的窗口。
在这里插入图片描述

普通用户主页面

普通用户作为房间的租用者,权限不能和房间的使用者相同。普通用户账号的主页面的菜单栏只有系统管理,其中有修改密码,刷新,退出系统三个选项。左上方会显示欢迎与使用者的名字。如果该用户租了房间,右上方会显示房间信息,下面会有一个缴纳租金的按钮,点击缴纳租金,如果没有缴纳,则会向数据库中写入一条信息,等待管理员账号确认,如果已经缴纳,弹出已经缴纳租金的窗口。
在这里插入图片描述如果该用户还没有租房,右边会有一个去租房的按钮,点击之后会跳转到租房页面。
在这里插入图片描述代码可能还存在Bug和没有完善的地方,很多地方写的也不完美,如果有什么意见或建议可以指出。

代码链接

csdn

https://download.csdn.net/download/qq_41505957/12095097

码云

https://gitee.com/zhang_yi_qiang/RentingSystem

GitHub

发布了463 篇原创文章 · 获赞 122 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_41505957/article/details/103913049