资源描述
数据库课程设计报告
-----宾馆信息管理系统
学院:软件学院
专业:软件工程
班级:2014级软件3班
姓名:邱天乐
学号:201400301248
任课教师:任国珍老师
助教老师:姜鹏程
目录
一、开发平台 4
1.1 数据库: MySQL: 4
1.2 操作系统: 4
1.3 开发工具: 4
1.4 整个系统采用C/S架构 4
二、数据库规划 4
2.1 任务陈述 4
2.2 任务目标 5
三、系统定义 5
3.1 系统边界 5
3.2 用户视图 5
3.2.1 酒店前台视图 5
3.2.2 数据库系统多用户视图 6
3.3 系统模型图 6
四、需求分析 7
4.1 用户需求说明 7
4.1.1 数据需求 7
4.1.2 事务需求 7
4.2 系统需求说明 8
4.2.1 软件环境 8
4.2.2 硬件环境 8
4.2.3 初始数据库大小 8
4.2.4 数据库增长速度 9
4.2.5记录查找的类型和平均数量 9
4.2.6性能 9
4.2.7安全性 9
五、数据库逻辑设计 9
5.1 ER图 10
5.2 数据字典 10
5.2.1实体和联系属性: 10
5.2.2属性描述: 10
六、数据库物理设计 12
6.1 索引 12
6.2 安全机制 12
6.2.1系统安全 12
6.2.2数据安全 12
七、应用程序设计 13
7.1 功能模块 13
7.1.1 换房 13
7.1.2 登记入住 13
7.1.3 查看预定 13
7.1.4 预订客户入住 13
7.1.5 更新房态功能 14
7.1.6 结账功能 14
7.1.7 显示会员及添加会员功能 14
7.2 界面设计 14
7.2.1 登入界面 14
7.2.2 系统主界面 15
.2.3 预定界面 15
7.2.4 预订信息界面 16
7.2.5 预定入住界面 16
7.2.6 客人登记界面 17
7.2.7 换房界面 17
7.2.8 结账界面 18
7.2.9 会员制度及会员信息界面 18
7.2.10 本店会员界面 19
7.2.11 会员办理界面 19
7.3 重要事务代码 20
7.3.1 入住代码 20
7.3.2 更换房间代码 27
八、测试和运行 33
8.1 房间的个数的测试 33
8.2 系统运行bug测试 33
8.3 客户端的数量 33
九、总结 33
9.1 课设总结 33
9.2 系统优点 34
9.3 系统不足 34
9.4 经验与收获 34
一、开发平台
1.1 数据库: MySQL:
MySQL数据库是目前最流行的关系型数据库,其体积小、速度快,使用的SQL语言也是用于访问数据库的最常用语言,一般的中小型系统都使用MySQL进行开发。
1.2 操作系统:
Windows 10
1.3 开发工具:
Eclipse Neon
Eclipse是一个开源的、基于java的可扩展开发平台。是一个较老的集成开发环境,主要用于开发java程序。通过其他插件,可以构建其他语言的开发环境。
1.4 整个系统采用C/S架构
Java
服务器
架构图:
Java
客户端
数据库
二、数据库规划
2.1 任务陈述
一套功能强大而又使用简便的客房管理软件,适用于宾馆管理、酒店管理、招待所管理。主要功能:团体,散客入住客人的信息登记,换房,正常退房,挂帐退房,挂单补款结帐,预定管理,贵宾卡管理,押金管理,各种强大的宾馆统计报表,异常处理。
要求:
1、 需求分析;
2、 数据库的概念设计;
3、 数据库的逻辑设计;
4、 数据库的物理设计;
5、 应用程序设计;
6、 编程实现;
2.2 任务目标
实现一个宾馆信息 管理系统,具有如下功能:
1、 更新并查看房态(列出每种房间类型的房号列表并标注状态)。
2、 预定信息的添加、删除(若有客人预定,则添加预定信息,若退订,则删除信息)。
3、 预定入住(若有预定的客人到店入住,则需提供预定入住)。
4、 登记信息的添加、更新(即客人未预定,直接到店入住,进行登记)。
5、 换房信息的添加、更新(对要求换房的客人进行房态等的更新)。
6、 押金的添加及查询(对押金的管理)。
7、 结账(客人退房结账,需更新住房信息以及房态)。
8、 VIP的管理(添加、删除以及更新,包括等级管理、以及住房晚数管理)。
9、 VIP的查询(查看本酒店中所有的VIP,以及相关信息,或者查看单个VIP信息)。
10、VIP优惠(管理VIP优惠尺度的数据)。
三、系统定义
3.1 系统边界
本系统包括预订管理、入住管理、VIP管理、客房管理、退房管理。
3.2 用户视图
3.2.1 酒店前台视图
(1) 预订管理:
预订房间、为客人办理预订、取消预订、查看指定客人的预订信息、查看酒店所有的预订信息
(2) VIP管理:
查看酒店所有的VIP信息、办理VIP、管理酒店所有的VIP信息
(3) 客房管理:
查看房态、更新房态
(4) 入住管理:
为客人办理入住、查看所有入住信息、换房操作
(5) 退房管理:
办理退房、管理押金、管理VIP房价、打印账单
3.2.2 数据库系统多用户视图
酒店前台
3.3 系统模型图
预订房号
预订
预订,提交预订信息
客人
交付押金
入住
付款成为
客人信息
客房信息
结账
预订记录
登记
结帐单、押金
VIP
结账
房号
修改房态/宾客记录
退房
四、需求分析
4.1 用户需求说明
4.1.1 数据需求
数据视图:(红色字为主码)
客房信息 room:(房间号, 房间类型, 房间入住状态, 房间价格, 房间大小,房间中的床数)
预定信息 book:(订单号, 姓名, 性别, 电话, 身份证号, 预订房间号,入住天数, 房间保留时间, 金额, 备注)
顾客登记信息 checkin:(入住订单号, 姓名, 性别, 电话, 身份证号, 会员等级, 房间号, 押金, 入住时间,入住天数,备注)
换房信息 :(需要更换房间号, 登记ID,客户姓名,房间总价,入住天数,
变更成的房间号,增减房费,变更后的房间总价)
结账信息:(房间号,登记ID,姓名,手机号,房费,入住时间,入住天数,退房时间,押金,卡内余额,会员登记,生成积分)
会员信息 vip:(会员编号,姓名,性别,身份证号,电话,邮箱,会员等级,积分,晚数)
办理会员信息:(会员ID,姓名,性别,身份证号,电话,邮箱,会员等级,应交纳金额)
4.1.2 事务需求
酒店前台:
数据查询:
(1)现有所有房间的详细信息:
房间是否可用。
(2)已有的所有预订订单:
订单号、预订人、预订房间号及类型、预定时间、房间保留时间时间
(3)已有的所有入住单:
入住单号、入住人信息(手机号、身份证等)、入住晚数、入住时间
(4)换房的房间信息以及当前可用房间
(5)已有的所有VIP信息:
VIP编号、姓名、身份信息、等级、入住晚数
(6)退房信息:
退房人姓名、房号、房费、押金
数据录入:
(1)录入预订订单:
订单号、预订人、预订房间号及类型、预定时间、房间保留时间时间
(3)录入入住单:
入住单号、入住人信息(手机号、身份证等)、入住晚数、入住时间
(4)录入换房信息
(5)录入新注册的VIP信息:
VIP编号、姓名、身份信息、等级
(6)录入退房信息:
退房人姓名、房号、房费、押金
数据删除:
(1)删除过期订单
(2)删除入住单
4.2 系统需求说明
4.2.1 软件环境
支持MySQL数据库
4.2.2 硬件环境
Inter(R)Core(TM)i5-3230M CPU @ 2.60GHz 2.60GHz
4.2.3 初始数据库大小
客房信息21条
会员信息1条
预订订单信息3条
入住订单信息7条
预订登记信息2条
入住登记信息10条
4.2.4 数据库增长速度
住宿信息每天增长大约50条
预订信息每天增长大约50条
退宿信息每天增长大约30条
换房信息每天增长大约10条
其他信息增长速度不定
4.2.5记录查找的类型和平均数量
查询客房信息 大约每天50次
查询住宿信息 大约每天50次
查询客户信息 大约每天50次
查询退宿信息 大约每天50次
4.2.6性能
单个记录查询时间少于1秒,高峰期少于5秒
多个记录查询时间少于5秒,高峰期少于10秒
更新/保存记录时间少于1秒,高峰期少于5秒
4.2.7安全性
前台管理人员登录时需要用户名及密码。
五、数据库逻辑设计
5.1 ER图
入住
客人
房间
交押金
预订
成为
交押金
预订客人
会员
5.2 数据字典
5.2.1实体和联系属性:
Book : bid, bname, bsex, bpnum, bidcard, brnum, bday, bholdtime, bsummoney
Checkin : cid, cname, csex, cpnum, cidcard, crnum, cmoney, ccheckin, ccheckout, cday, ccheckoutornot, cash, cps, clevel
Room : rid, rtype, rrate, rsize, rbednum, rstate
Vip : vid, vname, vsex, vidcard, vpnum, vmailbox, vlevel, vpoints, fangwannum
User(酒店前台): name, password
5.2.2属性描述:
实体
属性
属性描述
数据类型
NULL
预订信息表
book
bid
预订单号
VARCHAR(45)
Not
bname
预订人姓名
VARCHAR(45)
Not
bsex
性别
VARCHAR(45)
Not
bpnum
电话号码
VARCHAR(45)
Not
bidcard
身份账号
VARCHAR(45)
Not
brnum
房间号
VARCHAR(45)
Not
bday
预订时间
VARCHAR(45)
Yes
bsummoney
合计费用
VARCHAR(45)
Yes
bps
备注
VARCHAR(45)
Yes
bholdtime
房间保留时间
VARCHAR(45)
Yes
登记入住信息表
checkin
cid
入住单号
VARCHAR(45)
Not
cname
入住人姓名
VARCHAR(45)
Not
csex
性别
VARCHAR(45)
Not
cpnum
电话号码
VARCHAR(45)
Not
cidcard
身份证号
VARCHAR(45)
Not
cviplevel
Vip级别
VARCHAR(45)
Yes
crnum
房间号
VARCHAR(45)
Not
ccheckin
入住时间
VARCHAR(45)
Yes
ccheckout
退房时间
VARCHAR(45)
Yes
cday
入住天数
VARCHAR(45)
Yes
ccheckoutornot
是否已退房
VARCHAR(45)
Yes
csummoney
房费合计
VARCHAR(45)
Yes
cps
备注
VARCHAR(45)
Yes
房间信息表
room
rid
房间号
VARCHAR(45)
Not
rtype
房间类型
VARCHAR(45)
Not
rrate
房价
VARCHAR(45)
Not
rsize
房间面积
VARCHAR(45)
Not
rbednum
床数
VARCHAR(45)
Not
rstate
当前是否可用
VARCHAR(45)
Not
会员信息表
vip
vid
Vip号码
VARCHAR(45)
Not
vname
姓名
VARCHAR(45)
Not
vsex
性别
VARCHAR(45)
Not
vidcard
身份证号
VARCHAR(45)
Not
vpnum
电话号码
VARCHAR(45)
Not
vmailbox
邮箱
VARCHAR(45)
Not
vlevel
等级
VARCHAR(45)
Not
vpoints
积分
VARCHAR(45)
Not
fangwannum
已住房晚数
VARCHAR(45)
Yes
前台人员信息表
user
name
用户名
VARCHAR(45)
Not
password
密码
VARCHAR(45)
Not
六、数据库物理设计
6.1 索引
数据库中的索引:
表名
主键
外键
book
bid
rid
checkin
cid
rid
room
rid
无
vip
vid
cid
user
name
无
所有表中都对主键做了索引,作为表的主索引,方便快速查找
6.2 安全机制
6.2.1系统安全
1、提供了充足的异常处理机制,能够捕获由各种错误引发的异常(如:越权操作、输入数据类型与数据库要求类型不一致、查询过程中出现的错误等等)。
2、系统登录时要凭用户名和密码进入,输入正确时才可以进入系统。若用户名和密码输入正确,系统可以打开符合该用户身份的操作界面。其他界面该用户没有权限访问。
3、严格控制用户权限、防止SQL注入、对用户信息管理,遵守法律
6.2.2数据安全
1、根据用户身份,用户进入不同的用户界面,即享有不同的权限,只有管理员才可以实现修改一些重要信息,以确保数据库不被随意更改,保证数据安全。
2、在该系统中,任何有关删除或添加数据的操作都需要二次确认才可以在数据库中真正执行。通过高级语言应用程序的限制,不同的用户只能查询修改其有权访问的数据。
七、应用程序设计
7.1 功能模块
7.1.1 换房
当住户想更换房间时,点击换房按钮,进入换房界面,输入需要更换的房间号,点击 “显示登记信息” 按钮,将会显示换房界面及房态,再输入要变更成的房间号,点击 “显示该房间信息” 按钮,系统会自动计算出新的房价以及差价。在输入已预订或者已入住的房间时系统会做出提示。
7.1.2 登记入住
录入该登记客户的姓名,性别,身份证号,手机号等信息,输入要入住的房间号,入住天数,点击显示相关信息按钮,将会显示房间的房态以及自动计算出总的消费情况,在登记的过程中,如果输入错误信息系统会进行提示,例如:输入房间号不合法,忘记输入入住天数,输入房间号已入住或预定,忘记输入押金等等。
7.1.3 查看预定
在主界面,点击 “预定” 按钮,便可显示出预定信息界面,选择一行,点击 “入住” 按钮即可进入预定客户入住界面,假如某条预定信息已过预留时间,可以选择删除该条信息。特色功能:积分换房,使用积分换房的预定入住时无需缴纳押金,结账时将不产生积分,但是入住房多少晚加一,进入预定客户入住界面时,预定的信息将会自动显示出来。
7.1.4 预订客户入住
在预订信息界面中,可以选择一个已经预订了的客人信息,然后点击下面的“入住”按钮,便可以弹出预订入住的界面,里面所有的预订信息系统都会自动生成,只需要到店并且付了押金,便可以办理入住了。
7.1.5 更新房态功能
界面中有四个按钮分别对应着四种房型(大床房,标准间,家庭房,豪华套房)。点击按钮,下方文本域会列出对应房型的所有房号。已被占用的房号会被标注“不可用”。
7.1.6 结账功能
输入要结账的房间号,点击显示入住信息按钮,系统会自动生成相关信息,
根据卡内余额可以得出该客户需要追加的房费或退还的押金,同时假如该客户是会员,系统会自动计算出生成的积分情况,入住房多少晚也会自动加一。
7.1.7 显示会员及添加会员功能
点击VIP按钮,显示会员制度及会员信息界面,界面内详细阐述了本店的会员制度,会员等级判定情况,点击 “本店会员” 按钮将显示本店现有会员的相关信息,点击会员办理按钮,将进行会员的办理,其中办理黄金会员需要交纳现金30元,白金会员需要交纳现金200元,系统会自动提示,输入相关信息,点击 “办理” 按钮即可。
7.2 界面设计
7.2.1 登入界面
前台人员必须先通过用户名、密码登入系统才能进行操作。
7.2.2 系统主界面
左图为主页面,右列四个按钮点击后就会在下方文本域显示对应房型的房间信息。左列则是预定、入住、换房、结账和VIP的功能按钮。
.2.3 预定界面
左图为预订界面,输入客人姓名等信息,以及预订的房间和天数,便可进行预订。
7.2.4 预订信息界面
显示当前酒店所有的预订信息,包括预订人的各种信息,下面可以进行预订,并且可以对已经有预订的用户进行入住操作。
7.2.5 预定入住界面
界面风格与下面的客人登记界面相同,酒店管理员可以在这个界面插入新的预定信息。
7.2.6 客人登记界面
7.2.7 换房界面
换房时只需输入两个房间号即可,其他内容自动生成。
7.2.8 结账界面
结账时只需输入要结账的房间号,其他内容系统自动生成。
7.2.9 会员制度及会员信息界面
7.2.10 本店会员界面
7.2.11 会员办理界面
7.3 重要事务代码
7.3.1 入住代码
import javax.swing.JFrame;
import hm.database;
import java.awt.Point;
import java.awt.Dimension;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import .Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.*;
public class Checkin {
private JFrame jf;
database data3;
private JTextField cname;
private JTextField cpnum;
private JTextField cidcard;
private JTextField crnum;
private JTextField crtype;
private JTextField crrate;
private String rtype;
String id, name, sex, pnum, idcard, rnum, money, checkin, checkout, day,
cash, checkoutornot, ps;
private String viplevel;
JLabel type;
JComboBox<String> cviplevel;
JRadioButton male, female;
private JTextField crsize;
private JTextField crbednum;
private JTextField cmoney;
private JTextField cday;
private JLabel lblNewLabel_11;
private JTextField ccash;
private JLabel lblNewLabel_12;
private JLabel label;
private JLabel labelregister;
private JTextField ctime;
private JTextField cps;
Socket soc;
public Checkin(final String ck) {
data3 = new database();
jf = new JFrame();
jf.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
jf.dispose();
}
});
jf.setSize(new Dimension(600, 400));
jf.setLocation(new Point(300, 150));
jf.setTitle("客人登记");
jf.getContentPane().setLayout(null);
JLabel cid = new JLabel("登记ID:" + ck);
cid.setBounds(10, 10, 166, 28);
jf.getContentPane().add(cid);
JLabel lblNewLabel = new JLabel("姓名:");
lblNewLabel.setBounds(124, 47, 52, 28);
jf.getContentPane().add(lblNewLabel);
cname = new JTextField();
cname.setBounds(168, 51, 66, 21);
jf.getContentPane().add(cname);
cname.setColumns(10);
JLabel lblNewLabel_1 = new JLabel("性别:");
lblNewLabel_1.setBounds(262, 51, 52, 21);
jf.getContentPane().add(lblNewLabel_1);
ButtonGroup groupsex = new ButtonGroup();
male = new JRadioButton("男", true);
male.setBounds(298, 50, 42, 23);
jf.getContentPane().add(male);
female = new JRadioButton("女", false);
female.setBounds(342, 50, 42, 23);
jf.getContentPane().add(female);
groupsex.add(male);
groupsex.add(female);
// if (female.isSelected()) {
// sex = "女";
// } else {
// sex = "男";
// }
JLabel lblNewLabel_2 = new JLabel("手机号:");
lblNewLabel_2.setBounds(390, 54, 54, 15);
jf.getContentPane().add(lblNewLabel_2);
cpnum = new JTextField();
cpnum.setBounds(441, 51, 110, 21);
jf.getContentPane().add(cpnum);
cpnum.setColumns(10);
JLabel lbll = new JLabel("身份证号:");
lbll.setBounds(124, 95, 75, 28);
jf.getContentPane().add(lbll);
cidcard = new JTextField();
cidcard.setBounds(201, 99, 154, 21);
jf.getContentPane().add(cidcard);
cidcard.setColumns(10);
JLabel lblNewLabel_3 = new JLabel("会员等级:");
lblNewLabel_3.setBounds(390, 102, 66, 15);
jf.getContentPane().add(lblNewLabel_3);
cviplevel = new JComboBox<String>();
cviplevel.setEditable(false);
cviplevel.addItem("非会员");
cviplevel.addItem("黄金会员");
cviplevel.addItem("白金会员");
cviplevel.addItem("钻石会员");
// 会员等级
cviplevel.setBounds(451, 99, 100, 21);
jf.getContentPane().add(cviplevel);
JLabel lblNewLabel_4 = new JLabel("房间号:");
lblNewLabel_4.setBounds(124, 143, 54, 28);
jf.getContentPane().add(lblNewLabel_4);
crnum = new JTextField();
crnum.setBounds(168, 147, 66, 21);
jf.getContentPane().add(crnum);
crnum.setColumns(10);
JLabel lblNewLabel_5 = new JLabel("房间类型:");
lblNewLabel_5.setBounds(262, 150, 70, 15);
jf.getContentPane().add(lblNewLabel_5);
crtype = new JTextField();
crtype.setEditable(false);
crtype.setBounds(326, 147, 66, 21);
jf.getContentPane().add(crtype);
crtype.setColumns(10);
type = new JLabel("房间图片");
type.setBounds(10, 143, 100, 74);
jf.getContentPane().add(type);
JLabel lblNewLabel_6 = new JLabel("房费:");
lblNewLabel_6.setBounds(402, 150, 54, 15);
jf.getContentPane().add(lblNewLabel_6);
crrate = new JTextField();
crrate.setEditable(false);
crrate.setBounds(451, 147, 66, 21);
jf.getContentPane().add(crrate);
crrate.setColumns(10);
JLabel lblNewLabel_7 = new JLabel("房间面积:");
lblNewLabel_7.setBounds(262, 198, 70, 15);
jf.getContentPane().add(lblNewLabel_7);
crsize = new JTextField();
crsize.setEditable(false);
crsize.setBounds(326, 196, 66, 21);
jf.getContentPane().add(crsize);
crsize.setColumns(10);
JLabel lblNewLabel_8 = new JLabel("床数:");
lblNewLabel_8.setBounds(402, 198, 54, 15);
jf.getContentPane().add(lblNewLabel_8);
crbednum = new JTextField();
crbednum.setEditable(false);
crbednum.setBounds(451, 196, 66, 21);
jf.getContentPane().add(crbednum);
crbednum.setColumns(10);
JLabel lblNewLabel_9 = new JLabel("总消费:");
lblNewLabel_9.setBounds(262, 245, 54, 15);
jf.getContentPane().add(lblNewLabel_9);
cmoney = new JTextField();
cmoney.setEditable(false);
cmoney.setBounds(326, 242, 66, 21);
jf.getContentPane().add(cmoney);
cmoney.setColumns(10);
JLabel lblNewLabel_10 = new JLabel("入住天数:");
lblNewLabel_10.setBounds(124, 198, 66, 15);
jf.getContentPane().add(lblNewLabel_10);
cday = new JTextField();
cday.setBounds(186, 195, 48, 21);
jf.getContentPane().add(cday);
cday.setColumns(10);
// ########################################################
lblNewLabel_11 = new JLabel("押金:");
lblNewLabel_11.setBounds(402, 245, 54, 15);
jf.getContentPane().add(lblNewLabel_11);
ccash = new JTextField();
ccash.setBounds(451, 242, 42, 21);
jf.getContentPane().add(ccash);
ccash.setColumns(10);
JButton rbutton = new JButton("显示相关信息");
rbutton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
rtype = data3.rType(crnum.getText());
if (rtype == null) {
JOptionPane.showMessageDialog(null, "房间号不正确!");
} else {
if (data3.rState(crnum.getText())) {
JOptionPane.showMessageDialog(null, "该房间已被预定或入住!");
} else {
if (cday.getText().equals("")) {
JOptionPane.showMessageDialog(null, "入住天数不能为空!");
}
}
}
type.setIcon(new ImageIcon(Checkin.class
.getResource("/pictures/" + rtype + ".jpg")));
crtype.setText(rtype);
crrate.setText(data3.rRate(crnum.getText()) + "元");
crsize.setText(data3.rSize(crnum.getText()) + "平方米");
crbednum.setText(data3.rBednum(crnum.getText()) + "张");
name = cname.getText();
pnum = cpnum.getText();
idcard = cidcard.getText();
rnum = crnum.getText();
if (female.isSelected()) {
sex = "女";
展开阅读全文