宾馆客房管理系统
目录
需求分析
一、需求描述:
该酒店管理系统旨在为酒店提供包括员工管理、客房管理、客户管理、订单管理、报表维护等方面的一体化解决方案。同时,还提供用户登录和密码管理等功能。其业务需求涵盖了从客户预订、入住到退房的整个流程管理,并提供详细的报表支持,以便于酒店的日常运营和决策。
员工管理:管理员可以添加新员工的信息,如姓名、职位、联系方式等;删除现有员工的信息,确保信息的准确性和及时性;更新员工的详细信息,维护员工档案的完整性;支持通过姓名、职位等多种方式查询员工信息,方便管理。
客房管理:管理客户的预约信息,包括个人和团体预约。录入客户的预订信息,生成预订单;处理客户的预约取消请求,更新预订状态。处理客户的入住登记,包括个人入住和团体入住,记录单个客户的入住信息,分配房间,处理团体客户的入住需求,分配多个房间。管理客户退房手续,结算费用,更新房间状态。管理酒店的房间信息,包括添加新房间和修改现有房间信息,录入新房间的详细信息,如房间号、房型、价格等,更新现有房间的信息,保持房间资料的准确性。
客户管理:提供多种方式查询客户信息,方便服务和管理;录入新客户的信息,建立客户档案。
订单管理:查询客户的预订信息,跟踪预订状态;查询客户的订单信息,包括已完成和未完成的订单。
报表和维护:定期备份系统数据库,确保数据安全;导出数据库数据,进行本地存储或迁移;导出特定数据表,便于分析和审查。生成和展示各种管理报表,提供数据支持和决策依据;导出报表数据表格,便于记录和分享。
登录功能:用户通过用户名和密码登录系统,确保系统安全;提供找回密码功能,帮助用户重新获取访问权限;用户可以修改个人密码,确保账号的安全性。
二、功能描述:
员工管理功能
添加员工:录入员工的详细信息,如姓名、职位、联系方式,建立员工档案。
删除员工:删除员工信息,确保信息的准确性和及时性。
修改员工:更新员工的详细信息,维护员工档案的完整性。
查询员工信息:通过姓名、职位等多种方式查询员工信息,方便管理和调度。
客房管理功能
预约功能
预约:录入并管理客户的预约信息,生成预订单。
取消预约:处理预约取消请求,更新预订状态。
入住功能
个人入住:记录客户入住信息,分配房间。
团体入住:处理团体客户入住,分配多个房间。
房间管理
添加房间:录入新房间信息,如房间号、房型、价格等,更新系统房间数据。
修改房间:更新现有房间信息,保持数据准确性。
客户管理功能
查询客户:通过多种方式查询客户信息,方便服务和管理。
添加客户:录入新客户信息,建立客户档案。
订单管理功能
查询预订:查询并跟踪客户预订信息。
查询订单:查询客户的订单信息,管理订单状态。
报表和维护功能
数据库备份:定期备份数据库,确保数据安全。
导出数据库:导出数据库数据,便于存储和迁移。
导出数据表:导出特定数据表,方便分析和审查。
报表展示
生成报表:生成各类管理报表,支持决策。
导出报表:导出报表数据,便于记录和分享。
登录功能
登录:用户通过用户名和密码登录系统。
找回密码:提供找回密码功能,确保用户可以重新获取登录权限。
修改密码:用户可以修改个人密码,确保账号安全。
概念结构设计
实体信息
员工staff:{员工编号sid,员工姓名sname,员工性别ssex,登录账号susername,登录密码spassword,权限等级srole }
个人客户client:{客户姓名cname,客户编号cid,客户电话cphone,客户年龄cage,客户性别csex,登记时间register_time}
客房room:{客房编号rid,客房类型rtype,客房人数rsize,客房价格rprice,客房状态rstatus }
订单hotelorder:{订单编号id,订单类型ordertype,开始时间start_time,结束时间end_time,支付方式pay_type,订单金额money,客房编号rid,订单时间order_time}
团队客户:{团队名称tname,团队编号tid,团体电话tphone,登记时间register_time }
ER 图
逻辑结构设计
E-R图向关系模式的转化
团体客户和客房的入驻联系是1:n,可以将它们之间的联系与n端实体团体客户合并;客户与订单的预订关系也是1:n,同样可以将其中的联系与n端实体合并,而员工与客房之间的管理和员工与订单的登记联系方式是n:m,将其联系转化称独立的关系模式。具体的基本E-R图向关系模式的转化如下所述:
员工(员工编号,员工姓名,员工性别,登录账号,登录密码,权限等级)
个人客户(客户编号,客户姓名,客户电话,客户年龄,客户性别,登记时间,登记员工编号)
客房(客房编号,客房类型,客房容量,客房价格,客房状态)
订单(订单编号,订单类型,开始时间,结束时间,订单金额,登记员工编号)
团队客户(团队编号,团队名称,团体电话,登记时间,登记员工编号)
个人预订(客户编号,客房编号,开始时间,结束时间,预订时间)
团队预订(团队编号,客房编号,开始时间,结束时间,预订时间)
个人登记(客户编号,客房编号,开始时间,结束时间,登记员工编号)
团体登记(团队编号,客房编号,开始时间,结束时间,登记员工编号)
物理结构设计
各表一览
表1 房间信息表room
表中列名 | 数据类型 | 可否为空 | 说明 |
rid | varchar(255) | Not null (主键) | 房间编号 |
rtype | varchar(255) | Not null | 房间类型 |
rsize | SMALLINT | Not null | 房间人数 |
rprice | date | Not null | 房间价格 |
rstatus | varchar(255) | Not null | 房间状态 |
表2 酒店员工的个人信息和工作账户表staff
表中列名 | 数据类型 | 可否为空 | 说明 |
sid | varchar(255) | Not null (主键) | 员工编号 |
sname | varchar(255) | Not null | 员工姓名 |
ssex | varchar(255) | 可为空 | 员工性别 |
susername | varchar(255) | Not null | 员工账号 |
spassword | varchar(255) | Not null | 员工密码 |
srole | varchar(255) | Not null | 权限等级 |
表3 个人顾客信息和入住信息表client
表中列名 | 数据类型 | 可否为空 | 说明 |
cname | varchar(255) | Not null | 客户姓名 |
cid | varchar(255) | Not null (主键) | 客户编号 |
cphone | date | 可为空 | 客户电话 |
cage | varchar(255) | Not null | 客户年龄 |
csex | varchar(255) | 可为空 | 客户性别 |
register_sid | varchar(255) | 可为空 | 登记员工编号 |
register_time | timestamp | 可为空 | 登记时间 |
表4 团体顾客信息和入住信息表team
表中列名 | 数据类型 | 可否为空 | 说明 |
tname | varchar(255) | Not null | 团队名称 |
tid | varchar(255) | Not null (主键) | 团队编号 |
tphone | varchar(255) | 可为空 | 团队电话 |
check_in_sid | varchar(255) | 可为空 | 登记员工编号 |
register_time | timestamp | 可为空 | 登记时间 |
表5 个人客户的预约记录表booking_client
表中列名 | 数据类型 | 可否为空 | 说明 |
cid | varchar(255) | Not null (主键) | 客户编号 |
rid | varchar(255) | Not null (主键) | 房间编号 |
start_time | date | 可为空 | 开始时间 |
end_time | date | 可为空 | 结束时间 |
booking_time | timestamp | 可为空 | 预订时间 |
表6 团体客户的预约记录booking_team
表中列名 | 数据类型 | 可否为空 | 说明 |
tid | varchar(255) | Not null (主键) | 团队编号 |
rid | varchar(255) | Not null (主键) | 房间编号 |
start_time | date | 可为空 | 入住时间 |
end_time | date | 可为空 | 退房时间 |
booking_time | timestamp | 可为空 | 预订时间 |
表7 个人客户的入住记录表checkin_client
表中列名 | 数据类型 | 可否为空 | 说明 |
cid | varchar(255) | Not null (主键) | 客户编号 |
rid | varchar(255) | Not null (主键) | 房间编号 |
start_time | date | 可为空 | 入住时间 |
end_time | date | 可为空 | 退房时间 |
total_price | varchar(255) | 可为空 | 总价 |
check_in_sid | varchar(255) | 可为空 | 登记员工编号 |
表8 团体用户的入住记录表checkin_team
表中列名 | 数据类型 | 可否为空 | 说明 |
tid | varchar(255) | Not null (主键) | 团队编号 |
rid | varchar(255) | Not null (主键) | 房间编号 |
start_time | date | 可为空 | 入住时间 |
end_time | date | 可为空 | 退房时间 |
total_price | varchar(255) | 可为空 | 总价 |
check_in_sid | varchar(255) | 可为空 | 登记员工编号 |
表9 酒店所有订单信息和收入情况表hotelorder
表中列名 | 数据类型 | 可否为空 | 说明 |
id | varchar(255) | Not null (主键) | 订单编号 |
ordertype | varchar(255) | Not null | 订单类型 |
start_time | date | 可为空 | 订单开始时间 |
end_time | date | Not null | 订单结束时间 |
rid | varchar(255) | 可为空 | 房间编号 |
money | varchar(255) | 可为空 | 金额 |
order_time | timestamp | 可为空 | 订单时间 |
register_sid | varchar(255) | 可为空 | 登记员工编号 |
数据库实现
数据库的建立:
创建数据库
CREATE DATABASE `HotelSystem` DEFAULT CHARACTER SET = 'utf8mb4';
创建表
CREATE TABLE `room` (
`rid` VARCHAR(255) NOT NULL,
`rtype` VARCHAR(255) NOT NULL,
`rsize` SMALLINT NOT NULL,
`rprice` VARCHAR(255) NOT NULL,
`rstatus` VARCHAR(255) NOT NULL,
PRIMARY KEY (`rid`),
KEY `rprice` (`rprice`),
KEY `rtype` (`rtype`, `rprice`)
);
CREATE TABLE `staff` (
`sid` varchar(255) NOT NULL,
`sname` varchar(255) NOT NULL,
`ssex` varchar(255) DEFAULT NULL,
`susername` varchar(255) NOT NULL,
`spassword` varchar(255) NOT NULL,
`srole` varchar(255) NOT NULL,
PRIMARY KEY (`sid`),
UNIQUE KEY `susername` (`susername`)
);
CREATE TABLE `client` (
`cname` varchar(255) NOT NULL,
`cid` varchar(255) NOT NULL,
`cphone` varchar(255) DEFAULT NULL,
`cage` varchar(255) NOT NULL,
`csex` varchar(255) DEFAULT NULL,
`register_sid` varchar(255) DEFAULT NULL,
`register_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`cid`),
KEY `sid` (`register_sid`),
KEY `cid` (`cid`, `register_sid`),
CONSTRAINT `sid` FOREIGN KEY (`register_sid`) REFERENCES `staff` (`sid`)
);
CREATE TABLE `team` (
`tname` varchar(255) NOT NULL,
`tid` varchar(255) NOT NULL,
`tphone` varchar(255) DEFAULT NULL,
`check_in_sid` varchar(255) DEFAULT NULL,
`register_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`tid`),
KEY `team_sid` (`check_in_sid`),
CONSTRAINT `team_sid` FOREIGN KEY (`check_in_sid`) REFERENCES `staff` (`sid`)
);
CREATE TABLE `booking_client` (
`cid` varchar(255) NOT NULL,
`rid` varchar(255) NOT NULL,
`start_time` DATE DEFAULT NULL,
`end_time` DATE DEFAULT NULL,
`booking_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`cid`, `rid`),
KEY `rid` (`rid`),
CONSTRAINT `booking_client_ibfk_1` FOREIGN KEY (`cid`) REFERENCES `client` (`cid`),
CONSTRAINT `booking_client_ibfk_2` FOREIGN KEY (`rid`) REFERENCES `room` (`rid`)
);
CREATE TABLE `booking_team` (
`tid` varchar(255) NOT NULL,
`rid` varchar(255) NOT NULL,
`start_time` DATE DEFAULT NULL,
`end_time` DATE DEFAULT NULL,
`booking_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`tid`, `rid`),
KEY `rid` (`rid`),
CONSTRAINT `booking_team_ibfk_1` FOREIGN KEY (`tid`) REFERENCES `team` (`tid`),
CONSTRAINT `booking_team_ibfk_2` FOREIGN KEY (`rid`) REFERENCES `room` (`rid`)
);
CREATE TABLE `checkin_client` (
`rid` varchar(255) NOT NULL,
`cid` varchar(255) NOT NULL,
`start_time` DATE DEFAULT NULL,
`end_time` DATE DEFAULT NULL,
`total_price` varchar(255) DEFAULT NULL,
`check_in_sid` varchar(255) DEFAULT NULL,
PRIMARY KEY (`rid`, `cid`),
KEY `cid` (`cid`),
KEY `check_in_sid` (`check_in_sid`),
CONSTRAINT `checkin_client_ibfk_1` FOREIGN KEY (`rid`) REFERENCES `room` (`rid`),
CONSTRAINT `checkin_client_ibfk_2` FOREIGN KEY (`cid`) REFERENCES `client` (`cid`),
CONSTRAINT `checkin_client_ibfk_3` FOREIGN KEY (`check_in_sid`) REFERENCES `staff` (`sid`)
);
CREATE TABLE `checkin_team` (
`rid` varchar(255) NOT NULL,
`tid` varchar(255) NOT NULL,
`start_time` DATE DEFAULT NULL,
`end_time` DATE DEFAULT NULL,
`total_price` varchar(255) DEFAULT NULL,
`check_in_sid` varchar(255) DEFAULT NULL,
PRIMARY KEY (`rid`, `tid`),
KEY `teamsid` (`check_in_sid`),
KEY `teamtid` (`tid`),
CONSTRAINT `teamrid` FOREIGN KEY (`rid`) REFERENCES `room` (`rid`),
CONSTRAINT `teamsid` FOREIGN KEY (`check_in_sid`) REFERENCES `staff` (`sid`),
CONSTRAINT `teamtid` FOREIGN KEY (`tid`) REFERENCES `team` (`tid`)
);
CREATE TABLE `hotelorder` (
`id` varchar(255) NOT NULL,
`ordertype` varchar(255) NOT NULL,
`start_time` DATE NOT NULL,
`end_time` DATE NOT NULL,
`rid` varchar(255) NOT NULL,
`money` varchar(255) DEFAULT NULL,
`order_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`register_sid` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `rid` (`rid`),
KEY `register_sid` (`register_sid`),
CONSTRAINT `hotelorder_ibfk_1` FOREIGN KEY (`rid`) REFERENCES `room` (`rid`),
CONSTRAINT `hotelorder_ibfk_2` FOREIGN KEY (`register_sid`) REFERENCES `staff` (`sid`)
);
视图建立
-- 创建Customers视图:包含客户的ID、姓名、性别和电话信息
CREATE VIEW Customers AS SELECT Cid, Cname, Csex, Cphone FROM Client;
-- 创建Rooms视图:包含房间的ID、类型、大小、价格和状态
CREATE VIEW Rooms AS
SELECT Rid, Rtype, Rsize, Rprice, rstatus
FROM Room;
-- 创建Living视图:包含入住的房间ID、客户ID、开始时间、结束时间和总价格
CREATE VIEW Living AS
SELECT
Rid,
Cid,
start_time,
end_time,
total_price
FROM checkin_client;
-- 创建Administrators视图:包含管理员的ID、姓名和用户名,角色大于1的员工
CREATE VIEW Administrators AS
SELECT Sid, Sname, Susername
FROM Staff
WHERE
Srole > 1
索引建立
--客户电话号码索引:加快通过电话号码查询客户信息的速度
CREATE INDEX idx_cphone ON client (cphone);
--房间价格索索引:加快通过价格查询房间的速度
CREATE INDEX idx_rprice ON room (rprice);
--为状态字段添加索引可能会有助于快速筛选
CREATE INDEX idx_rstatus ON room (rstatus);
--根据入住日期、预订日期或注册时间来查询数据
CREATE INDEX idx_start_time ON booking_client (start_time);
CREATE INDEX idx_end_time ON booking_client (end_time);
CREATE INDEX idx_register_time ON client (register_time);
安全性设计:
设置权限
-- 创建1级权限员工角色
CREATE ROLE Level1_Staff;
-- 创建2级权限员工角色
CREATE ROLE Level2_Staff;
--授予员工权限
GRANT Level1_Staff TO 'zs123' @'%';
GRANT Level2_Staff TO 'ranxi' @'%';
1级员工授予更新、删除和选择权限
2级员工授予投放、更新、删除和选择权限
完整性设计:
触发器建立
-- 创建入住时更新房间状态的触发器
DELIMITER $$
CREATE TRIGGER UpdateRoomStatusOnCheckIn
AFTER INSERT ON checkin_client
FOR EACH ROW
BEGIN
UPDATE room
SET rstatus = '占用'
WHERE rid = NEW.rid;
END$$
DELIMITER;
-- 创建退房时更新房间状态的触发器
DELIMITER $$
CREATE TRIGGER UpdateRoomStatusOnCheckOut
AFTER UPDATE ON checkin_client
FOR EACH ROW
BEGIN
IF NEW.end_time < CURRENT_DATE THEN
UPDATE room
SET rstatus = '空闲'
WHERE rid = NEW.rid;
END IF;
END$$
DELIMITER;