酒店信息管理系统——数据库课程设计(浙江工商大学管工学院适用)
1 系统需求分析
在经济全球化导致行业竞争愈发激烈的今天,方便快捷的管理手段已经成为各个行业所迫切需要的要求,酒店作为现代社会行业的实体,更应该通过信息资源的深入开发和广泛利用,不断提高生成、经营、管理、决策的效率和水平,进而提高酒店的经济效益和综合竞争力,实现从传统管理向现代管理的转变。
在疫情反复零星出现的背景下,对酒店服务进行信息化升级能够让顾客不必接触酒店工作人员,有效降低人员接触,保护人民群众身体健康。而且,酒店信息化升级有助于规范化酒店管理,提升酒店管理效率,保护顾客隐私,实现智能化的管理方式。
同时,国家建设部也有明确规定:凡星级酒店在项目审批时,其设计方案必须包括计算机管理系统,否则不予立项,由此可见,酒店管理计算机化势在必行。本项目推行的酒店管理系统旨在将先进的计算机技术与现代的酒店服务管理完美结合起来,实现现代酒店住宿、餐饮、娱乐的全新概论服务和管理方式。一个合格的酒店管理系统可以提高服务质量,如:强大而方便的快速预订,便利而完善的前台接洽等,减轻顾客的入住和服务人员工作的负担。
图 1‑1 酒店信息管理系统功能结构图
在对杭州万豪酒店和杭州阿里巴巴“菲住布渴”调研的基础上,我对本系统设计了五大功能——员工管理功能、客房管理功能、客户管理功能、订单管理功能、报表和维护功能、登录功能。其中登录功能是整个程序的入口,也是管理信息系统最基本的功能。以下逐一介绍设计的功能
登录功能:登录账号来自于员工账号,最初进入系统的账号来自于员工表,需通过SQL进行初始化,首页显示找回密码选项,不过尚未开发完毕,修改密码功能设置在登录成功后的主页中。
员工管理功能:进入员工管理页面可以查看自己的个人信息,包括基本身份信息和权限信息,1级权限方可进行添加、删除和修改员工的操作。其中查询员工与修改员工的功能集成在同一页面,查询到即可修改。删除员工需要提供编号、姓名和身份证号。添加员工需提供完整注册信息。
客房管理功能:作为酒店工作人员可以查询满足顾客要求的客房信息并办理入住,入住登记分为个人入住、团队入住和预订入住。预约功能可以帮助个人或团队提前预约,并可取消预约。退房功能与入住功能类似。房间管理功能可以增加房间,在修改房间页面可以实现先检索再修改或删除的操作。
客户管理功能:酒店记录顾客的入住记录作为将来数据分析和客房推荐的基础。包含客户的增删查改。查询功能将入住次数作为一个筛选条件。
订单管理功能:订单管理可以查询预订订单、已实现订单和入住记录。
报表和维护功能:数据库备份功能提供了快捷导出数据库.sql,导出指定数据表.sql和导出指定数据表.csv等服务。报表查看利用了python的matplotlib库来绘制七日出租率和收益折线图,客户类型分布饼图以及员工业绩表现柱形图。
2 概念结构设计
通过对一般酒店管理信息系统的需求、内容和流程分析,我设计了如下实体及其属性:
员工staff:{员工编号sid,员工姓名sname,员工性别ssex,入职时间stime,登录账号susername,登录密码spassword,权限等级srole,员工身份证号sidcard,员工号码sphone}
个人客户client:{客户姓名cname,客户编号cid,客户电话cphone,客户年龄cage,客户性别csex,入住次数accomodation_times,登记时间register_time}
客房room:{客房编号rid,客房类型rtype,客房楼层rstorey,客房价格rprice,rdesc,客房描述rdesc,客房图片rpic}
订单hotelorder:{订单编号id,订单类型ordertype,开始时间start_time,结束时间end_time,支付方式pay_type,订单金额money,客房编号rid,订单评价remark,订单时间order_time}
团队客户:{团队名称tname,团队编号tid,团体电话tphone,入住次数accomodation_times,登记时间register_time }
根据实体、属性及实体之间的相互联系,我绘制了如下实体关系图(E-R图)。
图 2‑1酒店信息管理系统E-R图
3 逻辑结构设计
团体客户和客房的入驻联系是1:n,可以将它们之间的联系与n端实体团体客户合并;客户与订单的预订关系也是1:n,同样可以将其中的联系与n端实体合并,而员工与客房之间的管理和员工与订单的登记联系方式是n:m,将其联系转化称独立的关系模式。具体的基本E-R图向关系模式的转化如下所述:
员工(员工编号,员工姓名,员工性别,入职时间,登录账号,登录密码,权限等级,员工身份证号,员工号码)
个人客户(客户编号,客户姓名,客户电话,客户年龄,客户性别,入住次数,登记时间,登记员工编号)
客房(客房编号,客房类型,客房楼层,客房价格,客房描述,客房图片)
订单(订单编号,订单类型,开始时间,结束时间,支付方式,订单金额,客房编号,订单评价,订单时间,登记员工编号)
团队客户(团队编号,团队名称,团体电话,入住次数,登记时间,登记员工编号)
个人预订(客户编号,客房编号,开始时间,结束时间,预订时间,评价)
团队预订(团队编号,客房编号,开始时间,结束时间,预订时间,评价)
个人登记(客户编号,客房编号,开始时间,结束时间,登记员工编号,评价)
团体登记(团队编号,客房编号,开始时间,结束时间,登记员工编号,评价)
4 物理结构设计
设计表结构。一般地,实体对应于表,实体的属性对应于表的列,实体之间的关系成为表的约束。逻辑设计中的实体大部分可以转换成物理设计中的表,但是它们并不一定是一一对应的。
4.1 表汇总
课程设计中的缩写与术语如表4-1所示。
表 4‑1数据库的表
表名 |
功能说明 |
booking_client |
记录个人客户的预约记录 |
booking_team |
记录团体客户的预约记录 |
checkin_client |
记录个人客户的入住记录(含费用) |
checkin_team |
记录团体用户的入住记录(含费用) |
client |
记录个人顾客信息和入住信息 |
hotelorder |
记录酒店所有订单信息和收入情况 |
room |
记录房间信息 |
staff |
记录酒店员工的个人信息和工作账户 |
team |
记录团体顾客信息和入住信息 |
4.2 表booking_client
课程设计中的缩写与术语如表4-2所示。
表 4‑2表booking_client结构
表名 |
booking_client |
||||
列名 |
数据类型(精度范围) |
空/非空 |
约束条件 |
主码 |
外码 |
cid |
varchar(255) |
NOT NULL |
|
是 |
client.cid |
rid |
varchar(255) |
NOT NULL |
|
是 |
room.cid |
start_time |
date |
DEFAULT NULL |
|
|
|
end_time |
date |
DEFAULT NULL |
|
|
|
booking_time |
timestamp |
DEFAULT NULL |
|
|
|
remark |
varchar(255) |
DEFAULT NULL |
|
|
|
补充说明 |
|
4.3 表booking_team
课程设计中的缩写与术语如表4-3所示。
表 4‑3表booking_team结构
表名 |
booking_team |
||||
列名 |
数据类型(精度范围) |
空/非空 |
约束条件 |
主码 |
外码 |
tid |
varchar(255) |
NOT NULL |
|
是 |
team.tid |
rid |
varchar(255) |
NOT NULL |
|
是 |
room.cid |
start_time |
date |
DEFAULT NULL |
|
|
|
end_time |
date |
DEFAULT NULL |
|
|
|
booking_time |
timestamp |
DEFAULT NULL |
|
|
|
remark |
varchar(255) |
DEFAULT NULL |
|
|
|
补充说明 |
|
4.4 表checkin_client
课程设计中的缩写与术语如表4-4所示。
表 4‑4表checkin_client结构
表名 |
checkin_client |
||||
列名 |
数据类型(精度范围) |
空/非空 |
约束条件 |
主码 |
外码 |
cid |
varchar(255) |
NOT NULL |
|
是 |
client.cid |
rid |
varchar(255) |
NOT NULL |
|
是 |
room.rid |
start_time |
date |
DEFAULT NULL |
|
|
|
end_time |
date |
DEFAULT NULL |
|
|
|
total_price |
varchar(255) |
DEFAULT NULL |
|
|
|
remark |
varchar(255) |
DEFAULT NULL |
|
|
|
check_in_sid |
varchar(255) |
DEFAULT NULL |
|
|
staff.sid |
补充说明 |
|
4.5 表checkin_team
课程设计中的缩写与术语如表4-5所示。
表 4‑5表checkin_team结构
表名 |
checkin_team |
||||
列名 |
数据类型(精度范围) |
空/非空 |
约束条件 |
主码 |
外码 |
tid |
varchar(255) |
NOT NULL |
|
是 |
team.tid |
rid |
varchar(255) |
NOT NULL |
|
是 |
room.rid |
start_time |
date |
DEFAULT NULL |
|
|
|
end_time |
date |
DEFAULT NULL |
|
|
|
total_price |
varchar(255) |
DEFAULT NULL |
|
|
|
remark |
varchar(255) |
DEFAULT NULL |
|
|
|
check_in_sid |
varchar(255) |
DEFAULT NULL |
|
|
staff.sid |
补充说明 |
|
4.6 表client
课程设计中的缩写与术语如表4-6所示。
表 4‑6表client结构
表名 |
client |
||||
列名 |
数据类型(精度范围) |
空/非空 |
约束条件 |
主码 |
外码 |
cname |
varchar(255) |
NOT NULL |
|
|
|
cid |
varchar(255) |
NOT NULL |
|
是 |
|
cphone |
date |
DEFAULT NULL |
|
|
|
cage |
varchar(255) |
NOT NULL |
|
|
|
csex |
varchar(255) |
DEFAULT NULL |
|
|
staff.sid |
register_sid |
varchar(255) |
DEFAULT NULL |
|
|
|
accomodation_times |
int(11) |
DEFAULT NULL |
|
|
|
register_time |
timestamp |
DEFAULT NULL |
|
|
|
补充说明 |
|
4.7 表hotelorder
课程设计中的缩写与术语如表4-7所示。
表 4‑7表hotelorder结构
表名 |
hotelorder |
||||
列名 |
数据类型(精度范围) |
空/非空 |
约束条件 |
主码 |
外码 |
id |
varchar(255) |
NOT NULL |
|
是 |
|
ordertype |
varchar(255) |
NOT NULL |
|
是 |
|
start_time |
date |
DEFAULT NULL |
|
|
|
end_time |
date |
NOT NULL |
|
|
|
rid |
varchar(255) |
DEFAULT NULL |
|
是 |
room.rid |
pay_type |
varchar(255) |
DEFAULT NULL |
|
|
|
money |
varchar(255) |
DEFAULT NULL |
|
|
|
remark |
varchar(255) |
DEFAULT NULL |
|
|
|
order_time |
timestamp |
DEFAULT NULL |
|
|
|
register_sid |
varchar(255) |
DEFAULT NULL |
|
|
staff.sid |
补充说明 |
|
4.8 表room
课程设计中的缩写与术语如表4-8所示。
表 4‑8表room结构
表名 |
room |
||||
列名 |
数据类型(精度范围) |
空/非空 |
约束条件 |
主码 |
外码 |
rid |
varchar(255) |
NOT NULL |
|
是 |
|
rtype |
varchar(255) |
NOT NULL |
|
是 |
|
rstorey |
date |
DEFAULT NULL |
|
|
|
rprice |
date |
NOT NULL |
|
|
|
rdesc |
varchar(255) |
DEFAULT NULL |
|
是 |
room.rid |
rpic |
varchar(255) |
DEFAULT NULL |
|
|
|
补充说明 |
|
4.9 表staff
课程设计中的缩写与术语如表4-6所示。
表 4‑9表staff结构
表名 |
staff |
||||
列名 |
数据类型(精度范围) |
空/非空 |
约束条件 |
主码 |
外码 |
rid |
varchar(255) |
NOT NULL |
|
是 |
|
rtype |
varchar(255) |
NOT NULL |
|
是 |
|
rstorey |
date |
DEFAULT NULL |
|
|
|
rprice |
date |
NOT NULL |
|
|
|
rdesc |
varchar(255) |
DEFAULT NULL |
|
是 |
room.rid |
rpic |
varchar(255) |
DEFAULT NULL |
|
|
|
补充说明 |
|
4.10 表team
课程设计中的缩写与术语如表4-6所示。
表 4‑10表team结构
表名 |
team |
||||
列名 |
数据类型(精度范围) |
空/非空 |
约束条件 |
主码 |
外码 |
tname |
varchar(255) |
NOT NULL |
|
|
|
tid |
varchar(255) |
NOT NULL |
|
是 |
|
tphone |
varchar(255) |
DEFAULT NULL |
|
|
|
check_in_sid |
varchar(255) |
DEFAULT NULL |
|
|
staff.sid |
accomodation_times |
int(11) |
DEFAULT NULL |
|
|
|
register_time |
timestamp |
DEFAULT NULL |
|
|
|
补充说明 |
|
5 视图设计
当用户对数据库中的一张或者多张表的某些字段的组合感兴趣,而又不想每次键入这些查询时,用户就可以定义一个视图,以便解决这个问题。视图中列可以来自于表里的不同列,这些列都是用户所感兴趣的数据列。
视图与表不同,它在物理上不是真实存在的,而是一个虚表。在数据库里仅存放视图的定义,而不存放视图对应的数据。视图中的这些数据存放在其对应的表中,如果表中的数据发生了变化,从视图中查询出的数据也会随之发生改变。从这个意义来看,视图就像一个窗口,透过它可以看到数据库中用户感兴趣的数据及变化。每一次查看视图或引用视图的的时候,都会运行一次视图上的查询。
用户可以使用SELECT语句从视图里查询数据,对于符合一定约束条件的视图,还可以使用INSERT、UPDATE、DELETE、MERGE INTO等语句修改视图对应的基础表里的数据。视图在提供操作方便的同时,还可以保障数据库数据的安全。
我在数据库物理结构设计的基础上设计了如下视图:
(1)查询客户(Customers)信息的视图定义如下。
Create view Customers(客户编号,客户姓名,客户性别,客户手机)
As select Cid,Cname,Csex,Cphone
From Client
(2)查询客房(Rooms)信息的视图定义如下。
Create view Rooms(客房编号,客房类型,客房单价,客房楼层)
As select Rid,Rtype,Rprice,Rstorey
From Room
(3)查询客户住宿(Living)信息的视图如下。
Create view Living(客房编号,客房号,入住日期,结算日期,房费)
As select Cid,Rid, start_time, end_time, total_price
From checkin_client
(4)查询管理员(Administrators)信息的视图定义如下。
Create view Administrators(管理员编号,管理员姓名,管理员账户)
As select Sid,Sname, Susername
From Staff
Where Srole>1
图 5‑1 酒店信息管理系统视图设计
6 数据保护设计
数据库的一大特点是数据可以共享,数据共享必然带来数据库的安全性问题,数据库系统中的数据共享不能是无条件的共享,所以我们有必要进行数据库安全性设计。
6.1 防止用户直接操作数据库的方法
作为合格的管理信息系统,我们需要对应用软件进行合理设计以防止数据库被不合法使用而造成的数据泄露、更改或损坏。用户身份鉴别是数据库管理系统提供的最外层安全保护措施,每个用户在系统中都有一个用户标识(由用户名和用户标识号组成),用户标识号(UID)在系统的生命周期内是唯一的,并且系统内部记录这所有合法用户的标识,系统鉴别是指由系统提供一定的方式让用户标识自己的身份或名字。用户进入系统时由系统进行核对,通过鉴定后才提供使用数据库管理系统的权限。
所以我设置了登录界面作为酒店信息管理系统的唯一入口,并将数据库的角色与员工用户名相结合,以实现用户只能用帐号登陆到应用软件,通过应用软件访问数据库,而没有其他途径操作数据库。
图 6‑1 设计账户登录页面
6.2 用户帐号密码的加密方法
得益于PyQt5自带的单行文本框具有4种输入显示模板供选择:
Normal |
默认,输入什么即显示什么 |
Password |
密码,一般是用小黑点覆盖你所输入的字符 |
PasswordEchoOnEdit |
编辑时输入字符显示输入内容,否则用小黑点代替 |
NoEcho |
任何输入都看不见(只是看不见,不是不能输入) |
我们只需要自定义类继承自QWidget,设置初始值。便可实现对用户帐号的密码进行加密处理,确保在任何地方都不会出现密码的明文。
图 6‑2 密文登录页面
6.3 角色与权限
数据库角色是被命名的一组与数据库操作相关的权限,角色是权限的集合。可以为一组具有相同权限的用户创建一个角色,使用角色来管理数据库权限可以简化授权的过程。
确定每个角色对数据库表的操作权限,如创建、检索、更新、删除等。每个角色拥有刚好能够完成任务的权限,不多也不少。多了可能导致用户隐私泄露,商业机密被非法获取,少了不能完成自身对应的工作,带来诸多不便。在应用时再为用户分配角色,则每个用户的权限等于他所兼角色的权限之和。
我设计的酒店信息管理系统中的缩写与术语如表5所示。
表5 数据库的角色
角色 |
可以访问的表与列 |
操作权限 |
1级权限员工 |
booking_client、booking_team |
Update |
checkin_client、checkin_team |
Update |
|
client、room、team、hotelorder |
Select |
|
2级权限员工 |
staff、room |
Update、Delete、Select |
client、team |
Drop、Update、Delete、Select |
|
hotelorder、booking_client… |
Update、Select、Drop、Delete |
7 系统实现
7.1 数据库连接
我采用的编译器为Pycharm2021.2.2 professional 采用的DBMS为MySQL 8.0.29。由于pycharm专业版自带database的“视图”,故连接方式为直接在集成开发环境(IDE)配置连接,能够实现软件设计和数据库设计一站式完成。
首先安装好MySQL配置好系统管理员账户,在pycharm中新建项目,选择菜单栏view-Tool windows-database开始连接MySQL数据库。 python编译器配置在之前的学习中大家都以掌握,下面只展示数据库编译器的连接,在右上角run/debug configurations中即可开始配置编译器。
图 7‑1 在Pycharm中连接MySQL数据库
在弹出的框中输入@localhost 3306端口的DBA用户名和密码即可连接成功。但需要注意的是,此连接方式仅仅是将pycharm变成了一个可以运行SQL命令的编译器,想要直接通过python代码操作数据库,还需要使用pymsql库,并提前填好数据库配置信息。
图 7‑2连接MySQL数据库及配置数据库编译器
图 7‑3 python数据库配置
7.2 功能界面设计
图 7‑4酒店管理软件主页
与此前的功能结构图一致,我设置了五个功能即客房管理,员工管理,客户管理,订单管理,维护和报表。另外,为了页面整体美观,我又添加了一个“敬请期待”图形补齐页面。由于时间有限,能力有限,人手不足,五个功能没有完全实现,各功能页面均采用了如下相同UI。
图 7‑5客房管理主页
客房管理提供了如下功能:
客房信息查询 |
提供按条件筛选客房的功能 |
办理入住 |
根据客户信息填写住房信息办理入住 |
预订登记 |
办理提前客房提前预订的服务 |
办理退房 |
员工办理退房手续 |
更新房源 |
高级员工(管理员)增添房间及修改房间信息 |
图 7‑6入住、退房办理及房间更新功能
员工管理提供了如下功能:
个人信息 |
展示该登录账号的员工个人信息 |
查询员工 |
对管理员提供按姓名检索并修改/删除员工的功能 |
增添员工 |
管理员填写完整新入职员工信息录入数据库 |
删除员工 |
管理员根据员工编号、姓名、身份证号删除员工 |
图 7‑7查询、修改员工管理功能
维护与报表提供了如下功能:
数据库备份 |
用于管理员导出数据库.sql或表格.csv |
报表查看 |
展示七天订单折线图和员工绩效柱形图、客户类型饼图 |
图 7‑8订单报表功能(基于matplotlib)