资源描述
酒店客房管理系统
本学期学习了数据库系统概论这门课,初步掌握了数据库的一般性知识,获得了一些基本的数据库操作技能,能够对数据库进行一些简单的操作。结合上星期学习的JAVA基础这门课,本次课程设计将通过Java利用Mysql, MyEclipse来做一个实例练习掌握的知识。
一. 系统概述
1. 系统目标
采用电脑管理业务、财务等诸多环节已成为推动宾馆业迅速发展的先决条件,宾馆客房管理系统是各大中小型宾馆所需要使用的一个管理系统。建立起一套功能完善的管理信息系统,既能满足业务人员日常处理的需要,增强企业经营全过程的数字化管理水平;又能满足管理人员决策分析的需要,提高公司管理层对公司经营反馈信息的响应速度。
本实例将通过使用Mysql, MyEclipse设计软件,帮助酒店客房相关人员快速方便地对客人信息,员工信息进行管理。将原本散乱的客人信息系统化,图形化,建立一个运行稳定,易于操作的酒店客房管理系统,让工作人员能够方便快捷地执行各项工作。
2.具体需求
1)功能需求
l 系统初始化
对系统的基本信息的名称、编号的初始化,对系统管理员的密码以及其他系统使用人员的用户名、权限、密码等的设定。
l 客房信息管理
实现房间基本信息的增、删、改、查等的维护工作。支持根据房间状态是预订、入住、空闲等类型进行查询。
l 物品信息管理
实现客房日常消耗物品信息的增删改查等维护工作。支持物品存量查询、入库登记、出库登记。
l 员工信息管理
实现员工基本信息的增删改查等维护工作。支持员工与入住、结账、物品出入库等活动的登记,做到经手人负责。
l 宾馆入住管理
实现客房预订登记,主要是登记客人身份证、手机号码、预订房间类型和天数等基本信息,实现入住登记,即根据登记的客人身份证信息查询到预订的房间,修改房间状态,收取押金,实现房间调整,退房结账。
l 客人消费管理
实现客房收费物品、洗衣费、餐饮等服务项目登记,如果超过押金要及时给出预警。最后退房时结算。
l 系统安全管理
实现对系统数据库进行备份和恢复的功能,以增强系统可靠性,并对系统用户进行权限管理,以增加系统的安全性。
2) 性能需求
l 数据精确度:查询时应保证查全率,所有相应域包含查询关键字的记录都应能查到;
l 时间特性:一般操作的响应时间应在1~2s内;
l 适应性:Windows2000以上系统均可运行
3) 系统安全性
一个功能完善的酒店客房管理系统,除了应保证能正常执行功能以外,还要具备一定的数据保护能力,以防止人为破坏或自然破坏。为此,要做到以下内容:
l 要有严格的登录用户身份检查功能,防止非法用户的登录
l 对各用户的操作权限要有严格分工,不能因为分工不清造成数据的不安全或损坏。
l 对用户登录信息进行保护,防止泄露
l 对用户提交的数据进行预先的完整性检查,防止垃圾数据进入数据库。
l 保证对数据库增加、删除、修改等操作的安全执行,保持数据库中各基本表之间的数据完整性。
l 另外还要注意网络安全和物理安全、数据备份等。
二. 需求分析
进行系统功能分析及数据流图分析
数据流程分析就是吧数据在组织内部的流动情况抽象出来,舍去了具体组织结构、信息载体、处理工作等,单从数据流动过程来考察实际业务的数据处理模式。数据流程分析主要包括对信息的流动、传递、处理、存储等的分析。
酒店客房管理
前厅部
预定
入住
调整
退房
人力资源部
员工登记
员工入住
员工离职
采购部
新物品添加删除
员工物品出入库
客房部
服务物品项目登记
押金预警
客人物品出入
新服务添加删除
DBA
操作者信息
备份恢复
秘钥管理
以上为数据流图
三. 数据库设计
数据库结构设计的好坏对应用系统的效率以及实现的效果有很大的影响,一个优秀的数据库结构设计会减少数据库的存储量,数据的完整性和一致性比较高,系统具有较快的响应速度,简化基于此数据库的应用程序的实现等。
由于数据库设计的重要性,人们提出了许多数据库结构设计的技术。但是这些设计方法和设计者的工作经验有很大的关系。因此要从根本上解决所有数据库结构设计的问题,需要多实践,在实践中积累经验和教训,最终成为数据库结构设计的专家。
1. 数据库概念结构设计
这一设计阶段是在需求分析的基础上,设计出能够满足用户需求的各种实体,以及它们之间的关系,为后面的逻辑结构设计单下基础。
这个阶段不用考虑所采用的数据库管理系统、操作系统类型和机器类型等问题。这阶段可用的工具很多,用的最多的是E-R图,另外还有许多计算机辅助工具,如CASE等可以帮助进行设计。
在本次设计中,根据需求分析的结果,对系统中涉及到的数据进行抽象,主要实体有预订,入住,客房,服务项目,客房,库房,员工,员工物品,权限等。
据此,画出酒店客房管理系统的实体-联系图,如图所示。
预订
手机
姓名
违约金
身份证
房间类型
预订天数
是
服务项目
是
房间号
服务项目
项目总金额
项目数量
项目单价
员工物品
是
库房
物品
数量
员工号
员工号
员工号
员工
是
姓名
员工号
员工房间号
月工资
是
入住
当前天数
房间号
押金
应付总金额
身份证
分房
客房
房间号
备注
一天的价格
房间状态
房间类型
2. 数据库逻辑结构设计
概念结构是独立于实际设计模型的信息结构,必须将其转化为逻辑结构后才能进行数据库应用的设计。也就是要将概念上的结构转化为Mysql数据库系统所支持的实际数据模型。
转化原则:
l 一个实体型转化为一个关系模式。
l 实体的属性就是关系的属性,实体的码就是关系的码。
l 实体间的联系:
n 1:1,转换为一个独立的关系模式,或与任意一端的关系模式合并。
n 1:N,转换为一个独立的关系模式,或与N端关系模式合并。
n M:N,转换为一个独立的关系模式。
l 具有相同码的关系模式可合并。
基于以上原则,转换之后的关系模式集为:
n 秘钥信息(用户名,秘钥)
n 注册信息(用户名,密码,用户类型)
n 客人信息:(姓名,身份证,手机)
n 客人预订:(身份证,房间号,房间类型,入住天数,违约金)
n 客人入住:(身份证,房间号,押金,应付总金额,目前入住天数)
n 客房信息:(房间号,房间类型,房间状态,房间价格)
n 员工信息:(姓名,员工号,员工房间号,月工资)
n 库房存储:(物品,物品单价,数量)
n 员工物品:(员工号,物品,数量)
n 服务项目:(服务物品,服务单价)
n 服务登记:(房间号,服务物品,服务数量,服务总价)
考虑因素:
n 每张表设置一到两个主键。
n 以客人信息表中的身份证为参照目标,在客人入住表中设置外键。
n 以员工信息表中的员工号,库房存储表中的物品为参照目标,在员工物品表中设置外键。
n 设置3个触发器,实现当向客人预订表中插入数据时,改客房信息中相应客房状态为预订,当向客人入住表插入数据时,改客房信息中相应客房状态为入住,当向客人入住表删除数据时,改客房信息中相应客房状态为空闲。
n 设置触发器,实现当向库房存储表中插入数据时,向服务物品表中插入相应数据。
3. 数据库物理结构设计
根据逻辑模型,为关系模式选择存取方法,并设计关系,索引等数据文件的物理存储结构,如下:
/* 秘钥信息 */
create table 秘钥信息(用户名 char(10),秘钥 char(10),primary key(秘钥));
/* 登录信息 */
create table 注册信息(用户名 char(10), 密码 char(10), 用户类型 char(10),primary key(用户名));
/* 客人信息 */
create table 客人信息(姓名 char(20) not null,身份证 char(20),手机 char(16) not null,primary key(身份证));
/* 客人预订 */
create table 客人预订(身份证 char(20),房间号 char(4) not null,房间类型 char(6) not null,入住天数 int not null,违约金 int not null,primary key(身份证));
/* 客人入住 */
create table 客人入住(身份证 char(20),房间号 char(4) not null,押金 int not null,应付总金额 int not null,目前入住天数 int not null,primary key(身份证),foreign key (身份证) references 客人信息(身份证),check(Pledge=100));
/* 客房信息 */
create table 客房信息(房间号 char(4),房间类型 char(6) not null,房间状态 char(4) not null,房间价格 int not null,primary key(房间号));
/* 员工信息 */
create table 员工信息(姓名 char(20) not null,员工号 char(6),员工房间号 char(4),月工资 int not null,primary key(员工号));
/* 库房存储 */
create table 库房存储(物品 char(30),物品单价 int not null,数量int not null,primary key(物品));
/* 员工物品 */
create table 员工物品(员工号 char(6),物品 char(30),数量 int not null,primary key(员工号,Item),foreign key (员工号) references 员工信息(员工号),foreign key (物品) references 库房存储(物品),check(数量>=0));
/* 服务项目 */
create table 服务项目(服务物品 char(30),服务单价 int not null,primary key(服务物品));
/* 服务登记 */
create table 服务登记(房间号 char(4),服务物品 char(30),服务数量int not null,服务总价 int not null,foreign key (房间号) references 客房信息(房间号),foreign key (服务物品) references 服务项目(服务物品),check(服务数量>=0));
/* 插入仓库触发器 */
create trigger 插入仓库 after insert on 仓库信息 for each row insert into 服务项目 values(new.物品,new.单价);
/* 改变客房状态触发器1 */
create trigger 改变客房状态1 after insert on 预订信息 for each row update 客房信息 set 房间状态='预订' where 客房信息.房间号=new.房间号;
/* 改变客房状态触发器2 */
create trigger 改变客房状态2 after insert on 入住信息 for each row update 客房信息 set 房间状态='入住' where 客房信息.房间号=new.房间号;
/* 改变客房状态触发器3 */
create trigger 改变客房状态3 after delete on 入住信息 for each row update 客房信息 set 房间状态='空闲' where 客房信息.房间号=old.房间号;
四. 数据库实施
在Mysql命令行中输入用户名,密码进入Mysql,在记事本上写一句操作,同时在命令行中运行一句,确保成功。这样也可以利用记事本里的语句段快速重建数据库,以便测试使用。
数据库建好,所有表创建完毕后,添加初始化的数据。
Mysql中的数据库创建语句与初始化语句见编码部分。
五. 应用程序设计
1. 系统功能模块设计
在系统功能分析的基础上,设计系统功能模块划分如下图。
酒店客房管理系统
管理员
采购部
人力资源部
客房部
前厅部
六. 源代码及实现
1)Mysql创建数据库以及初始化代码
set names gbk;
create database hotel character set UTF8;
use hotel;
create table code(Usertype char(10),Code char(10),primary key(Code));
create table logininfo(Username char(10), Password char(10), Usertype char(10),primary key(Username));
create table guestinfo(Gname char(20) not null,Id char(20),Tel char(16) not null,primary key(Id));
create table preorder(Id char(20),Rnum char(4) not null,Rtype char(6) not null,Pdays int not null,Absent int not null,primary key(Id));
create table checkin(Id char(20),Rnum char(4) not null,Pledge int not null,Gmoney int not null,Ndays int not null,primary key(Id),foreign key (Id) references guestinfo(Id),check(Pledge=100));
create table roominfo(Rnum char(4),Rtype char(6) not null,Rstate char(4) not null,Rmoney int not null,primary key(Rnum));
create table staffinfo(Sname char(20) not null,SId char(6),SRnum char(4),Mwage int not null,primary key(SId));
create table storage(Item char(30),Uprice int not null,Iamount int not null,primary key(Item));
create table staffitem(SId char(6),Item char(30),Iamount int not null,primary key(SId,Item),foreign key (SId) references staffinfo(SId),foreign key (Item) references storage(Item),check(Iamount>=0));
create table servitem(Servitem char(30),Uprice int not null,primary key(Servitem));
create table service(Rnum char(4),Servitem char(30),Samount int not null,Servcost int not null,foreign key (Rnum) references roominfo(Rnum),foreign key (Servitem) references servitem(Servitem),check(Samount>=0));
create trigger insert_into_storage after insert on storage for each row insert into Servitem values(new.Item,new.Uprice);
create trigger room_state_change1 after insert on preorder for each row update roominfo set Rstate='预订' where roominfo.Rnum=new.Rnum;
create trigger room_state_change2 after insert on checkin for each row update roominfo set Rstate='入住' where roominfo.Rnum=new.Rnum;
create trigger room_state_change3 after delete on checkin for each row update roominfo set Rstate='空闲' where roominfo.Rnum=old.Rnum;
insert into guestinfo values('张三','3','333');
insert into guestinfo values('李四','4','444');
insert into guestinfo values('王五','5','555');
insert into guestinfo values('赵六','6','666');
insert into guestinfo values('魏七','7','777');
insert into guestinfo values('朱八','8','888');
insert into guestinfo values('张三一','31','999');
insert into guestinfo values('张三二','32','000');
insert into roominfo values('1840','套房','空闲',500);
insert into roominfo values('1841','套房','空闲',500);
insert into roominfo values('1842','套房','空闲',500);
insert into roominfo values('0001','标准间','空闲',200);
insert into roominfo values('0002','标准间','空闲',200);
insert into roominfo values('0003','标准间','空闲',200);
insert into roominfo values('0301','单人间','空闲',100);
insert into roominfo values('0302','单人间','空闲',100);
insert into roominfo values('0303','单人间','空闲',100);
insert into roominfo values('1001','三人间','空闲',300);
insert into roominfo values('1002','三人间','空闲',300);
insert into roominfo values('1003','三人间','空闲',300);
insert into roominfo values('1501','大床间','空闲',250);
insert into roominfo values('1502','大床间','空闲',250);
insert into roominfo values('1503','大床间','空闲',250);
insert into preorder values('3','1840','套房',3,20);
insert into preorder values('4','0001','标准间',1,20);
insert into preorder values('5','0002','标准间',1,20);
insert into preorder values('6','1002','三人间',7,20);
insert into checkin values('3','1840',100,1500,0);
insert into checkin values('4','0001',100,200,0);
insert into checkin values('5','0002',100,200,0);
insert into staffinfo values('小明','000001','1908',50000);
insert into staffinfo values('小刚','000002','1908',50000);
insert into staffinfo values('小红','000003','1908',50000);
insert into staffinfo values('小胖','000004','1908',50000);
insert into staffinfo values('小瘦','000005','1908',50000);
insert into storage values('自行车',10,10);
insert into storage values('梯子',10,15);
insert into storage values('五金工具箱',10,23);
insert into storage values('打印机',10,15);
insert into storage values('订书机',10,45);
insert into staffitem values('000001','自行车',2);
insert into staffitem values('000003','梯子',1);
insert into staffitem values('000004','订书机',2);
insert into servitem values('足疗',80);
insert into servitem values('理发',30);
insert into servitem values('按摩',233);
insert into servitem values('洗衣',80);
insert into servitem values('餐饮',30);
insert into servitem values('睡衣',100);
insert into servitem values('香烟',50);
insert into service values('1840','足疗',2,160);
insert into service values('0001','香烟',1,50);
insert into logininfo values(1,1,'前厅部');
insert into logininfo values(2,2,'客房部');
insert into logininfo values(3,3,'人力资源部');
insert into logininfo values(4,4,'采购部');
insert into logininfo values(5,5,'管理员');
insert into code values('前厅部','111');
insert into code values('客房部','222');
insert into code values('人力资源部','333');
insert into code values('采购部','444');
insert into code values('管理员','555');
2) 应用程序部分主要代码
连接数据库LoadDriver.java
package db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.*;
// Notice, do not import com.mysql.jdbc.*
// or you will have problems!(注意,不要导入com.mysql.jdbc.*,否则// 将出现问题!)
public class LoadDriver {
private Connection conn;
private PreparedStatement pstat;
private Statement stat;
public LoadDriver() {
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/hotel", "root", "sa");
// Do something with the Connection
} catch (SQLException ex) {
// handle any errors
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
} catch (Exception ex) {
// handle the error
System.out.println(ex.getStackTrace());
}
}
public PreparedStatement preparedStatement(String sql) throws SQLException {
pstat = conn.prepareStatement(sql);
return pstat;
}
public Statement createStatement() throws SQLException {
stat = conn.createStatement();
return stat;
}
public int executeUpdate(String sql) throws SQLException {
stat = conn.createStatement();
return stat.executeUpdate(sql);
}
public ResultSet executeQuery(String sql) throws SQLException {
stat = conn.createStatement();
return stat.executeQuery(sql);
}
public void closeConn() throws SQLException {
if (pstat != null) {
pstat.close();
}
conn.close();
}
}
由于应用程序部分代码太长,仅贴上截图以供参考。以下为程序实现的截图。
登录界面:
展开阅读全文