基于springboot的酒店客房管理系统----数据库课程设计
目录
1.需求分析
1.1用例模型
1.1.1用例图
1.1.2用例描述
1.2过程模型
1.2.1数据流
1.2.2数据字典
1.3 安全性和完整性需求
1.4?数据字典
1.4.1数据项
1.4.2数据结构
1.4.3数据流
1.4.4数据存储
1.4.5数据过程
2概念结构设计
2.1 ER模型
2.1.1 实体及属性
2.1.2 实体之间的联系
2.2 E-R图
2.2.1?房间实体及属性
2.2.2?客户实体及属性
2.2.3客户与房间的预定关系E-R图
2.2.4客户与房间的入住关系
2.2.5客户与房间的退房关系
2.2.6全局E-R图
3逻辑结构设计
3.1?E-R图向关系模型的转换
3.1.1?数据库模式
3.1.2数据库外模式
3.1.3关系模型的优化
3.2?转换为MySQL8的关系模型
4物理结构设计
4.1存取方法
4.1索引的建立
1.聚簇索引
2.索引设计
4.2?存储结构
4.2.1数据的存放位置
4.2.2系统配置
5数据库实施
5.1创建数据库及数据库对象
5.1.1创建数据库
5.1.2创建表
5.1.3创建视图
5.1.4存储函数和触发器
5.2装入数据
5.3部分关键功能说明
5.4界面的设计实现和部分代码
5.5关键功能代码展示
5.6系统功能展示
5.6.1登录与注册功能展示:
5.6.2管理员界面功能展示:
5.6.3客户界面功能展示:
6?数据库运行和维护
6.1?数据库转储策略
6.2数据库备份与恢复方案
6.2.1数据库备份
6.2.2数据库恢复:
6.2.3 MySQL 主从备份:
6.3数据报表导出功能
6.4连接池的使用
6.5权限管理
6.6查询优化
小 ?结
1、 收获与体会
2、 系统需要改进的地方
1.需求分析
应用背景:近年来,随着社会的快速发展和互联网的高速兴起,各地的旅客量迅速增加,酒店、宾馆数量也随之急剧增加,有关客房管理的各种信息量也在不断成倍长,酒店就需要各种各样的能使工作人员对这种庞大的信息进行更快更方便更准确管理的系统。在当今时代,计算机已经被大众广泛应用,人们都习惯于在网络上进行购物、工作等一系列活动。例如,人们去外地旅游,大多数人就会选择通过网上根据自己需要来预订客房,此时酒店就需要相应的客房管理系统来提供并管理客房的相关信息。因此,酒店客房管理系统对于酒店的客房信息管理有着非常重要的作用,特别是对于客房数量比较多的酒店来说,这个系统不仅方便了客户,也方便了工作人员,同时也节省了大量的时间。
系统目标:根据开发设计系统时系统应该满足的可操作性,实用性,可靠性以及可维护性等原则,针对酒店客房管理系统的主要数据和功能需求,开发了基于mysql且利用java语言书写,利用html,css,javascipt实现前端界面和springboot整合ssm实现后端功能,利用mybatis远程连接数据库实现该系统的相关功能的简要酒店客房管理系统。
1.1用例模型
1.1.1用例图
1.1.2用例描述
ID
1
名称
添加客房
优先级
参与者
管理员,目标允许管理员向系统中新增客房信息。
触发条件
管理员希望在系统中添加新的客房信息。
前置条件
管理员已登录到系统。
后置条件
新增客房信息成功保存在系统中。
正常流程
1.管理员登录系统。
2.管理员选择新增客房的功能。
3.管理员输入客房的详细信息,包括房间号、房型等。
4.系统验证信息格式,确认无误后保存客房信息。
扩展流程
1.如果输入的客房信息格式有误,系统将显示相应的错误提示,要求管理员进行修正。
ID
2
名称
删除客房
优先级
参与者
管理员,允许管理员从系统中删除特定客房的信息。
触发条件
管理员希望在系统中删除特定客房的信息。
前置条件
管理员已登录到系统。
后置条件
被删除客房信息从系统中移除。
正常流程
1.管理员登录系统。
2.管理员选择删除客房的功能。
3.管理员输入要删除客房的标识信息(如房间号)。
4.系统确认删除操作,从数据库中移除客房信息。
扩展流程
1.如果系统无法确认客房的标识信息,将向管理员显示相应的提示信息。
ID
3
名称
修改客房
优先级
参与者
管理员,目标允许管理员修改系统中特定客房的信息。
触发条件
管理员希望在系统中修改特定客房的信息。
前置条件
管理员已登录到系统。
后置条件
客房信息得到相应的更新。
正常流程
管理员登录系统。
管理员选择修改客房信息的功能。
管理员输入要修改客房的标识信息(如房间号)。
系统检索并显示客房的当前信息。
管理员修改客房信息,系统验证信息格式,确认无误后保存更新。
扩展流程
1.如果系统无法确认客房的标识信息,将向管理员显示相应的提示信息。
ID
4
名称
查看客房
优先级
参与者
管理员/客户,目标允许管理员/客户查询特定客房的详细信息。
触发条件
管理员/客户希望在系统中查询特定客房的详细信息。
前置条件
管理员/客户已登录到系统。
后置条件
显示所查询客房的详细信息。
正常流程
1.管理员/客户登录系统。
2.管理员/客户选择查询客房信息的功能。
3.管理员/客户输入客房的标识信息(如房间号、房型等)。
4.系统检索并显示客房的详细信息。
扩展流程
1.如果系统未找到匹配的客房信息,向管理员/客户显示相应的提示信息。
ID
5
名称
预定客房
优先级
参与者
客户,目标允许客户成功预定所需的客房。
触发条件
客户希望在系统中预定特定类型或特定日期的客房。
前置条件
管理员已登录到系统。
后置条件
系统更新客房的预定信息,保留预定记录。
正常流程
1.客户登录系统。
2.客户选择预定客房的功能。
3.客户选择客房的类型、日期、入住人数等信息。
4.系统检查客房的可用性,确认客房可以预定。
5.客户确认预定信息,包括入住日期、退房日期、房间类型等。
6.系统生成预定记录,保留客户的预定信息。
扩展流程
1.如果客房在选定的日期内不可用,系统将向客户显示相关提示信息,客户可选择其他日期或房型。
ID
6
名称
修改客户
优先级
参与者
管理员/客户,目标允许管理员修改系统中特定客户的信息
触发条件
管理员/客户希望在系统中修改特定客户的信息。
前置条件
管理员/客户已登录到系统。
后置条件
客户信息得到相应的更新。
正常流程
1.管理员/客户登录系统。
2.管理员/客户选择修改客户信息的功能。
3.管理员/客户输入要修改客户的标识信息(如客户ID)。
4.系统检索并显示客户的当前信息。
5.管理员/客户修改客户信息,系统验证信息格式,确认无误后保存更新。
扩展流程
1.如果系统无法确认客户的标识信息,将向管理员显示相应的提示信息。
ID
7
名称
查看客户
优先级
参与者
管理员/客户,目标允许管理员/客户查询特定客户的详细信息。
触发条件
管理员/客户希望在系统中查询特定客户的详细信息。
前置条件
管理员/客户已登录到系统。
后置条件
显示所查询客户的详细信息。
正常流程
1.管理员/客户登录系统。
2.管理员/客户选择查询客户信息的功能。
3.管理员/客户输入客户的标识信息(如客户ID、姓名等)。
4.系统检索并显示客户的详细信息。
扩展流程
1.如果系统未找到匹配的客户信息,向管理员/客户显示相应的提示信息。
ID
8
名称
添加客户
优先级
参与者
管理员/客户,目标允许管理员/客户向系统中新增客户信息。
触发条件
管理员/客户希望在系统中添加新的客户信息。
前置条件
管理员/客户已登录到系统。
后置条件
新增客户信息成功保存在系统中。
正常流程
1.管理员/客户登录系统。
2.管理员/客户选择新增客房的功能。
3.管理员/客户输入客房的详细信息,包括房间号、房型等。
4.系统验证信息格式,确认无误后保存客房信息。
扩展流程
1.如果输入的客房信息格式有误,系统将显示相应的错误提示,要求管理员进行修正。
ID
9
名称
登录系统
优先级
参与者
管理员/客户,目标允许合法用户通过有效的身份验证进入系统,获得访问权限。
触发条件
管理员/客户希望进入系统并访问其功能,需要提供合法的凭据进行身份验证。
前置条件
管理员/客户必须拥有系统账户。
后置条件
管理员/客户登录成功后,可以开始访问系统提供的功能。
正常流程
1.管理员/客户打开系统登录界面。
2.管理员/客户输入有效的用户名和密码。
3.系统验证提供的凭据。
4.如果提供的凭据有效且匹配系统中的记录,系统允许管理员/客户登录。
扩展流程
1.如果管理员/客户提供的用户名不存在或密码不匹配系统记录,系统将显示相应的错误消息,提示用户重新输入正确的凭据。。
ID
10
名称
退房登记
优先级
参与者
客户,管理员,目标客户成功完成退房登记,酒店系统更新客房和客户信息。
触发条件
客户完成酒店住宿并希望退房。
前置条件
客户已支付所有费用。
后置条件
客户离开酒店,房间标记为可用状态,酒店系统更新客房和客户信息。
正常流程
1.客户到达酒店前台完成退房手续。
2.管理员检查客房是否存在未支付的费用。
3.如果费用已支付,管理员更新客房状态。
4.管理员退还客户押金。
5.客户离开酒店。
扩展流程
1.如果客户有未支付的费用,管理员应要求客户支付并完成退房手续。
2.如果有任何关于押金退还的争议,管理员应与客户协商并解决问题。
3.如果客户有未支付的费用,管理员应要求客户支付,并在支付完成后完成退房手续。
ID
11
名称
入住登记
优先级
参与者
客户,管理员,目标:客户成功完成入住登记,酒店系统更新客房和客户信息。
触发条件
客户希望入住酒店并获得相应的房间。
前置条件
客户已经选择房型。
后置条件
客户获得房间号码,酒店系统更新房间和客户信息。
正常流程
1.客户到达酒店前台。
2.客户提供有效的身份信息和预订信息。
3.管理员检查客房的可用性。
4.如果房间可用,管理员分配房间并记录客户信息。
5.客户支付房费。
6.管理员提供房卡或其他凭证给客户。
7.入住登记完成。
扩展流程
1.如果客户未提供有效的身份信息或预订信息有误,管理员应该协助客户解决问题或更新信息。
2.如果客户所选房型不可用,管理员应该提供其他可用的房型,并协助客户选择。
1.2过程模型
此处大多功能的数据字典和数据流图基本一致,下面列举几个有代表性的功能的数据字典和数据流图。
1.2.1数据流图
上下文图:
图1.1上下文图
0层数据流图:
图1.20层数据流图
1层数据流图:
图1.3房间信息查询数据流图
图1.4客户信息录入数据流图
图1.5客户信息修改数据流图
图1.6预定信息管理数据流图
图1.7入住信息办理数据流图
图1.8退房结账信息数据流图
1.2.2数据字典
- 房间信息查询
数据结构:房间基本信息(房间号,房间类型,房间价格,所需押金,房间状态,房间大小,床位数、有无配备早餐)
对数据项进行分析,主要分析如下:
房间号:对每个房间分配具有唯一特殊的编号,也是系统为客户提供房间信息和管理员管理房间的依据。
数据流分析:
这些数据项由管理员输入系统,并最终通过查询功能呈现给管理员或者用户。
- 客户信息录入
数据结构:客户信息(客户编号,姓名,性别,证件类型,证件号码,联系电话,客户级别)
对数据项进行分析,主要分析如下:
客户编号:在添加新客户时为客户分配的具有唯一标识的编号,也是系统查询客户信息的依据。
证件号码:号码对应唯一的一个公民,是查询客户信息的另一依据。
客户级别:系统根据不同的客户级别提供不同程度上的优惠折扣率。
数据流分析:
这些数据项由管理员输入系统,并最终保存到数据库相应的表中。
- 客户信息修改
数据结构和数据项与上述一致,不在赘述
数据流分析:
修改时,数据项从数据库检索出来,作为修改后,又提交回客户信息表。
- 预定信息管理
数据结构:预定信息(客户编号,客户姓名,性别,证件类型,证件号码,联系电话,房间号,房间类型,支付金额,预计入住时间,预计离开时间)
对数据项进行分析,主要分析如下:
客户编号:在添加新客户时为客户分配的具有唯一标识的编号,也是系统查询客户信息的依据。
证件号码:号码对应唯一的一个公民,是查询客户信息的另一依据。
房间号:对每个房间分配具有唯一特殊的编号,也是系统为客户提供房间信息和管理员管理房间的依据。
支付金额:支付金额=房间价格X客户级别提供的优惠折扣率
数据流分析:
客户先查询当前空闲房间,选择某个房间填写预定信息,系统接收处理之后将相关信息提供给管理员进行信息登记和审核。
- 入住信息办理
数据结构:入住信息(客户编号,客户姓名,证件类型,证件号码,房间号,入住时间,预计离开时间,押金,预定金额,付款金额)
对数据项进行分析,主要分析如下:
客户编号:在添加新客户时为客户分配的具有唯一标识的编号,也是系统查询客户信息的依据。
证件号码:号码对应唯一的一个公民,是查询客户信息的另一依据。
房间号:对每个房间分配具有唯一特殊的编号,也是系统为客户提供房间信息和管理员管理房间的依据。
押金:根据每个房价类型的不同需要不同的押金
预定金额:若没有办理相关预定,则预定金额=0;若若已经办理相关预定,则预定金额=预定时支付的金额。
付款金额:付款金额=预定金额+押金。
数据流分析:
管理员将这些数据项输入到系统中,系统接收处理完成后进行相关信息的存储,并存入到相关报表中。
- 退房结账信息
数据结构:退房结账信息(客户编号,房间号,入住时间,退房时间,定金,共需付款金额,还需支付金额,结算信息)
对数据项进行分析,主要分析如下:
客户编号:在添加新客户时为客户分配的具有唯一标识的编号,也是系统查询客户信息的依据。
房间号:对每个房间分配具有唯一特殊的编号,也是系统为客户提供房间信息和管理员管理房间的依据。
定金:办理预定时支付的金额。
共需付款金额:从办理入住到退房需要的金额。
还需支付金额:共需支付金额-定金;
结算信息:声明顾客还需要支付的金额或者酒店应返还的金额。
数据流分析:
客户发出退房申请,管理员处理相关信息后,根据房间物品的情况来退还客户押金,多退少补,并将该信息存储到退房结账报表中。
1.3 安全性和完整性需求
1、所有管理员和客户均可查询客房信息,但只有管理员才能对客房信息进行添加,删除和修改
2、管理员可以查看、删除,修改用户信息,而用户只能查看,修改自己的信息。
3、管理员可以查看,删除,增加,修改入住信息,预定信息和退房信息,而客户只能查看自己的预定信息。
1.4****?数据字典****
1.4.1数据项
数据项名
别名
数据类型
数据长度
取值范围
简述
客户编号
customer_id
int
-
主键
客户姓名
customer_name
Varchar
20
-
非空
客户性别
customer_gender
Varchar
8
-
非空
客户证件编号
customer_id_number
Varchar
20
-
唯一
客户联系电话
customer_contact_number
Varchar
15
-
—
客户级别编号
customer_livel_id
Varchar
15
-
外键
级别编号
level_id
int
-
-
主键
级别名称
level_name
varchar
20
-
非空
折扣率
discount_rate
float
(5,2)
-
非空
房间类型编号
room_type_id
int
-
-
主键
房间类型名称
room_type_name
varchar
20
-
非空
房间价格
room_price
float
(10,2)
-
非空
房间押金
room_deposit
float
(10,2)
-
非空
房间状态编号
room_status_id
int
-
-
主键
房间状态名称
room_status_name
varchar
20
-
非空
房间编号
room_id
int
-
-
主键
房间类型编号
room_type_id
int
-
-
非空
房间状态编号
room_status_id
int
-
-
非空
房间大小
room_size
varchar
20
-
房间床位数
bed_count
int
-
-
房间是否配备早餐
breakfast_included
boolean
-
True 或false
客户编号
customer_id
int
not null
-
非空
房间编号
room_id
int
not null
-
非空
预定支付金额
reservation_payment
float(10, 2)
not null
-
非空
预计入住时间
check_in_date
date
not null
-
非空
预计离开时间
check_out_date
date
not null
-
非空
客户编号
customer_id
int
not null
-
主键,非空
房间编号
room_id
int
not null
-
非空
入住时间
check_in_date
date
not null
-
非空
预计离开时间
expected_check_out_date
date
not null
-
非空
预定金额
reservation_amount
float(10, 2)
not null
reservation_amount >= 0
非负
付款金额
payment_amount
float(10, 2)
not null
payment_amount >= 0
非负
客户编号
customer_id
int
not null
-
非空,主键
房间编号
room_id
int
not null
-
非空
入住时间
check_in_date
date
not null
-
非空
退房时间
check_out_date
date
not null
-
非空
共需付款金额
total_income
float(10, 2)
not null
payment_amount >= 0
非负
还需付款金额
need_pay
float(10, 2)
not null
refund_deposit >= 0
非负
结算信息
return_message
Varchar(50)
not null
total_income >= 0
非负
1.4.2数据结构
名称
别名
含义
组成
客户信息
Customer表
客户的基本信息
客户编号+客户姓名+客户性别+客户证件编号+客户联系电话+客户级别编号
身份证件表
IdentityDocument表
身份证件类型的基本信息
证件编号+证件类型
客户级别
CustomerLevel表
客户级别以及折扣率的基本信息
级别编号+级别名称+折扣率
房间类型表
RoomType表
房间类型对应的价格押金信息
房间类型编号+房间类型名称+房间价格+房间押金
房间状态表
RoomStatus表
房间状态信息
房间状态编号+房间状态名称
房间表
Room表
房间相关信息
房间编号+房间类型编号+房间状态编号+房间大小+房间床位数+房间是否配备早餐
预定信息表
Reservation表
预定房间的基本信息
客户编号+房间编号+预定支付金额+预计入住时间+预计离开时间
入住信息表
CheckInInfo表
入住房间的基本信息
客户编号+房间编号+入住时间+预计离开时间+预定金额+付款金额
退房信息表
CheckOutInfo表
退房的基本信息
客户编号+房间编号+入住时间+退房时间+共需付款金额+还需付款金额+结算信息
1.4.3数据流
部分 数据流
名称
预定房间信息
含义
客户添加预定信息到预定信息表
来源
在系统上添加的数据
去向
预定信息表
组成
客户编号+房间编号+预定支付金额+预计入住时间+预计离开时间
名称
入住房间信息
含义
客户到达酒店前台办理入住手续,管理添加入住信息
来源
在系统上添加的数据
去向
预定信息表
组成
客户编号+房间编号+入住时间+预计离开时间+预定金额+付款金额
名称
退房信息
含义
客户完成住宿并要求退房的过程
来源
在系统上添加退房信息
去向
退房信息表
组成
客户编号+房间编号+入住时间+退房时间+付款金额+退还押金+总支付金额
名称
房间信息查询
含义
客户想要查看房间信息
来源
房间信息表
去向
系统界面展示
组成
客户编号+房间编号+入住时间+退房时间+付款金额+退还押金+总支付金额
名称
客户信息录入
含义
客户/管理员向系统添加客户信息
来源
在系统上添加的数据
去向
客户信息表
组成
客户编号+客户姓名+客户性别+客户证件编号+客户联系电话+客户级别编号
名称
客户信息修改
含义
客户/管理员向系统修改客户信息
来源
在系统上修改数据
去向
客户信息表
组成
客户编号+客户姓名+客户性别+客户证件编号+客户联系电话+客户级别编号
1.4.4数据存储
1)客户信息=客户编号+客户姓名+客户性别+客户证件编号+客户联系电话+客户级别编号;
2)房间信息=客户编号+房间编号+入住时间+退房时间+付款金额+退还押金+总支付金额;
3)预定信息=客户编号+房间编号+预定支付金额+预计入住时间+预计离开时间;
4)退房信息=客户编号+房间编号+入住时间+退房时间+付款金额+退还押金+总支付金额;
5)入住信息=客户编号+房间编号+入住时间+预计离开时间+预定金额+付款金额
1.4.5数据过程
客户信息录入: 管理员或客户通过系统输入客户的个人资料和联系方式,创建新的客户档案。
客户信息修改: 管理员或客户通过系统更改已有客户档案中的信息。
房间信息查询: 客户通过系统查询可用客房的类型、价格和可预订信息。
客户退房:客户填写退房信息,客户完成付款、结算账单后,退回房卡并离开房间,标志着客户正式离开酒店。
客户入住房间: 客户提供预订信息和身份证明后,办理入住手续并领取房卡或钥匙,进入所预订的客房;系统添加相应的注入信息;
客户预定房间: 客户通过酒店系统预订特定类型和日期的客房,并提交预订请求。
2****概念结构设计
2.1 ER模型
2.1.1 实体及属性
客户=客户编号+姓名+性别+证件类型+证件号码+联系电话+客户级别
房间=房间号+房间类型+房间价格+所需押金+房间状态+房间大小+床位数+有无配备早餐
管理员=用户名+密码
用户=用户名+密码
2.1.2 实体之间的联系
客户与房间的预定关系:一个房间可以对应多个客户,一个房间在不同时间可以被不同的客户预定,一个客户也可以对应多个房间,一个客户在不同时间可以预定不同的房间,故房间与客户是多对多的关系;预定信息=客户编号+客户姓名+性别+证件类型+证件号码+联系电话+房间号+房间类型+预定支付金额+预计入住时间+预计离开时间;
客户与房间的入住关系:一个房间可以对应多个客户,一个房间在不同时间可以被不同的客户入住,一个客户也可以对应多个房间,一个客户在不同时间可以入住不同的房间,故房间与客户是多对多的关系;入住信息=客户编号+客户姓名+证件类型+证件号码+房间号+入住时间+预计离开时间+押金+预定金额+付款金额;
客户与房间的退房关系:一个房间可以对应多个客户,一个房间在不同时间可以被不同的客户退房,一个客户也可以对应多个房间,一个客户在不同时间可以退不同的房间,
故房间与客户是多对多的关系;退房结账信息=客户编号+房间号+入住时间+退房时间+付款金额+退还押金+总收入金额;
2.2 E-R图
2.2.1?房间实体及属性
图2.1房间实体及属性E-R图
2**.2.2?客户实体****及属性**
图2.2客户实体及属性E-R图
2.2.3客户与房间的预定关系E-R图
图2.3预定关系E-R图
2.2.4客户与房间的入住关系
图2.4入住关系E-R图
2.2.5客户与房间的退房关系
图2.5退房关系E-R图
2.2.6全局E-R图
上述的E-R图全部为分E-R图,需要将它们消除冲突并消除冗余后合并得到最终的全局E-R图。先分析上面实体之间的关系,显然房间和客户存在实体型的一对多关系,管理员和房间之间存在多对多的关系。通过分析,可以发现,客户的证件类型可以抽象出一个单独的身份证件实体来表示客户和管理者中的证件属性;同样客户级别也抽象出单独的客户级别实体来进行记录。后续房间状态和房间类型在进行相关金额计算的时候也需要单独用到,因此将它们独立为两个实体,分别为房间状态实体和房间类型实体;上诉实体的属性在最终的全局E-R图有体现出来,这样我们成功消除了可能产生的结构冲突,同一对象在不同应用中具有不同的抽象,同一实体在不同子系统的E-R图中所包含的属性个数和属性排列次序不完全相同和实体间的联系在不同的E-R图中为不同类型这三类结构冲突经常会出现在初步的E-R图中,需要加以注意。
将上述局部E-R图合并后得到全局E-R图如下:
图2.6全局E-R图
3****逻辑结构设计
3.1****?E-R图向关系模型的转换****
3.1.1****?数据库模式****
客户:(客户编号,姓名,性别,证件类型,证件号码,联系电话,客户级别)
房间:(房间号,房间类型,房间价格,所需押金,房间状态,房间大小,床位数、有无配备早餐)
预定信息:(客户编号,客户姓名,性别,证件类型,证件号码,联系电话,房间号,房间类型,预定支付金额,预计入住时间,预计离开时间)
入住信息:(客户编号,客户姓名,证件类型,证件号码,房间号,入住时间,预计离开时间,押金,预定金额,付款金额)
退房结账信息:(客户编号,房间号,入住时间,退房时间,付款金额,退还押金,总收入金额)
3.1.2********数据库外模式
外模式,是数据库用户,包括应用开发员和用户能够看到和使用的局部数据的逻辑结构和特征的描述,在具体数据库系统中即为视图,是于某个应用或功能有关的数据的逻辑表示。
酒店客房管理系统的设置的视图和相关信息如下:
客户个人信息视图
在本系统中,无论是客户本身还是管理员都需要经常对客户个人信息查看,这些信息包括客户编号,客户姓名,客户性别,客户电话号码,客户录入的身份证件类型,证件号码,客户级别。定义为视图customer_info_view。
所有的房间信息视图
客户需要查询正处于空房状态的房间信息,而管理员需要查询所有状态下的所有房间信息进行管理,这个视图信息包括房间号码、房间类型、房间一天入住价格、房间押金、房间大小、房间床位数、房间是否配备早餐、房间状态。定义为视图all_room_view。
所有的预定信息视图
管理员在进行预定管理时需要经常查看当前的所有预定信息,也可以根据需要导出所有的预定信息,包括已经失效的预定信息。这些数据包括客户编号、客户姓名、客户电话号码、客户级别、房间编号、房间类型、预定入住时间、预计退房时间、预定支付金额以及标识某元组当前是否正处于预定状态的信息表中。定义为视图all_reserve_view。
3.1.3关系模型的优化
对于客户关系模型而言,所有的非主属性不完全函数依赖于它们各自的主码,因此两个关系模型不属于2NF。存在数据冗余,修改异常等问题,需要进一步优化,需要将证件类型和证件号码单独抽象出来一个身份证件实体;同样客户级别也不完全依赖于主码,因此也需要单独将客户级别的属性抽象出来一个用户实体。
对于房间关系模型,所有的非主属性不完全函数依赖于它们各自的主码,因此关系模型不属于2NF,存在数据冗余,修改异常等问题,而且后续对于各种金额计算和产生报表需要根据房间类型和房间状态来筛选,因此单独将房间类型和房间状态抽象出来为两个实体,分别为房间类型实体和房间状态实体。
经过分解得到以下几个关系:
客户:(客户编号,客户姓名,性别,证件编号,联系电话,级别编号)
身份证件:(证件编号,证件类型,证件号码)
用户级别:(级别编号,级别名称,折扣率)
房间:(房间编号,房间类型编号,房间状态编码,房间大小,房间床位数,是否配备早餐)
房间状态:(房间状态编号,房间状态名称)
房间类型:(房间类型编号,房间类型名称,房间价格,房间押金)
对于分解后的关系模型,可以看到所有的非主属性都完全函数依赖于主码编号,因此分解后的上诉表属于2NF。而且不存在非主属性传递依赖的关系,属于3NF。初步优化后的结果可能会存在部分数据的冗余,但是如果将其拆分,后续大量的查询将会频繁使用多表连接查询,大大降低系统执行效率,而这部分的数据冗余的代价较低,因此此处采用空间换时间的策略,不再对员工关系模型进行分解。
对于预定信息和入住信息,退房结账信息的关系模型,因为是管理员对客户和房间进行统一的管理,但实际上还是客户与房间实体之间的相互关系,因此实际上还是客户与房间之间的E-R模型。对客户实体,房间实体进行优化之后产生身份证件实体、房间类型实体、房间状态实体,因此在上诉实体的情况下,对预定联系,入住联系,退房结账联系进行相关优化,优化后的模型属性如下所示:
预定信息:(客户编号,房间编号,预定支付金额,定金,预计入住时间,预计离开时间)
入住信息:(客户编号,房间编号,入住时间,预计离开时间,预定金额,付款金额)
退房结账信息:(客户编号,房间编号,入住时间,退房时间,付款金额,退还押金,总收入金额)
至此,基本解决了原来的数据冗余过大,修改异常的问题。
经过上述优化后,得到最终的关系模型如下:
客户:(客户编号,客户姓名,性别,证件编号,联系电话,级别编号)
身份证件:(证件编号,证件类型,证件号码)
用户级别:(级别编号,级别名称,折扣率)
房间:(房间编号,房间类型编号,房间状态编码,房间大小,房间床位数,是否配备早餐)
房间状态:(房间状态编号,房间状态名称)
房间类型:(房间类型编号,房间类型名称,房间价格,房间押金)
预定信息:(客户编号,房间编号,预定支付金额,定金,预计入住时间,预计离开时间)
入住信息:(客户编号,房间编号,入住时间,预计离开时间,预定金额,付款金额)
退房结账信息:(客户编号,房间编号,入住时间,退房时间,共需付款金额,还需支付金额,结算信息)
3**.2?转换为MySQL8的关系模型**
1客户表(customer)
字段名称
代码
数据类型
约束
客户编号
customer_id
int
主键
客户姓名
customer_name
Varchar(20)
非空
客户性别
customer_gender
Varchar(8)
非空
客户证件编号
customer_id_number
Varchar(20)
唯一
客户联系电话
customer_contact_number
Varchar(15)
—
客户级别编号
customer_livel_id
Varchar(15)
外键
表3.1客户表
2身份证件表(IdentityDocument)
字段名称
代码
数据类型
约束
证件编号
document_id
int
主键,非空
证件类型
document_type
Varchar(20)
非空
表3.2身份证件表
3客户级别表(userlevel)
字段名称
代码
数据类型
约束
级别编号
level_id
int
非空,主键
级别名称
level_name
Varchar(20)
非空
折扣率
discount_rate
Float(5,2)
非空
表3.3身份证件表
4房间类型表(roomtype)
字段名称
代码
数据类型
约束
房间类型编号
room_type_id
int
主键
房间类型名称
room_type_name
Varchar(20)
非空
房间价格
room_price
float(10,2)
非空
房间押金
room_deposit
float(10,2)
非空
表3.4客户级别表
5房间状态表(roomstatus)
字段名称
代码
数据类型
约束
房间状态编号
room_status_id
int
主键
房间状态名称
room_status_name
Varchar(20)
非空
表3.5房间状态表
6房间表(room)
字段名称
代码
数据类型
约束
房间编号
room_id
int
主键
房间类型编号
room_type_id
int
非空
房间状态编号
room_status_id
int
非空
房间大小
room_size
Varchar(20)
主键
房间床位数
bed_count
int
非空
房间是否配备早餐
breakfast_included
boolean
非空
表3.6房间表
7预定信息表(reservation)
字段名称
代码
数据类型
约束
预定编号
Re_no
int
自增,主键
客户编号
customer_id
int
非空
房间编号
room_id
int
非空
入住时间
check_in_date
date
非空
预计离开时间
expected_check_out_date
Date
非空
定金
reservation_payment
float(10, 2)
非负
预定支付金额
payment_amount
float(10, 2)
非负
表3.7 预定信息表
8入住信息表(checkininfo)
字段名称
代码
数据类型
约束
预定编号
Re_no
int
自增,主键
客户编号
customer_id
int
非空
房间编号
room_id
int
非空
入住时间
check_in_date
date
非空
预计离开时间
expected_check_out_date
Date
非空
定金
reservation_payment
float(10, 2)
非负
预定支付金额
payment_amount
float(10, 2)
非负
表3.8 入住信息表
9退房结账信息表(check_out)
字段名称
代码
数据类型
约束
客户编号
customer_id
int
非空,主键
房间编号
room_id
int
非空
入住时间
check_in_date
date
非空
退房时间
check_out_date
date
非空
付款金额
payment_amount
float(10, 2)
非负
退还押金金额
refund_deposit
float(10, 2)
非负
总收入金额
total_income
float(10, 2)
非负
表3.9 退房结账信息表
10用户表(users)
字段名称
代码
数据类型
约束
账号编号
User_id
int
主键,自增
用户名
username
int
非空
密码
password
varchar
非空
表3.10 用户表
11管理员表administrators)
字段名称
代码
数据类型
约束
账号编号
admin_id
int
主键,自增
用户名
username
int
非空
密码
password
varchar
非空
表3.11 管理员表
4物理结构设计
4.1存取方法
4.1索引的建立
物理结构设计的任务是根据数据库管理系统支持的存取方法确定选择存取方法,常见的存取方法为索引和聚簇方法。
1.聚簇索引
设计聚簇,一般来说需要考虑以下条件:
- 经常使用连接操作的关系
- 一个关系的一组属性经常出现在相等比较条件中
- 一个关系的一个或者一组属性值重复率高
- 不经常更新的表中属性
对于user_level表、ID表、room_status、room_type不经常更新,而且与customer表、room表、admin表进行进行连接。因此应该使用聚簇。因为MySQL存储引擎会自动给主码建立聚簇索引,因此上诉表中的属性不需要我们去手动建立聚簇索引。
2.索引设计
对于索引的建立,一般来说需要考虑下面的条件:
(1)一个或者一组属性经常出现在查询条件中
(2)属性经常作为聚集函数的参数
(3)属性经常出现在连接条件中
(4)属性的属性值变动大,数据不集中
(5)基于上诉原则,我们建立以下索引:
系统经常根据电话号码进行客户查询(根据实际意义,电话号码只属于一个人),因此需要对客户中电话号码建立索引,实现如下:
图4.1客户电话索引图
因为建立的基本表中的主键属性为大部分连接查询的条件信息,而MySQL的存储引擎自动会给主码建立索引信息,因此无需我们再次进行索引建立。
而且对于索引建立来说,并不是说索引越多越好,因为索引的建立需要消耗空间,同时维护和查找索引同样要付出代表,因此索引的建立应该适中。
4.2****存储结构
4.2.1数据的存放位置
确定数据的存放位置和存储结构要综合考虑存取时间、存储空间利用率和维护代价三方面的因素。这三个方面常常都是相互矛盾的,因此需要进行权衡选择折中的方法。
为了提高系统性能,应该根据应用情况将数据的易变部分和稳定部分,经常存储和存取频率较低部分进行分开存储,这种情况特别适合于多用户和多数据量的情况,具体的存放原则是:
(1)减少访问上的冲突,提高并发性能。对于数据操作事务尽力能够访问存放于不同磁盘分区上的数据,提高I/0的并发性能,提高访问速率。
(2)分散数据表中的数据,均衡数据操作。数据库中的数据访问频率是不均匀的,对于经常访问的数据应该分散到不同的磁盘分区,充分利用每个磁盘分区的访问性能。
(3)减少数据的变迁,缓解访问压力。对于经常被访问的数据位置应该有一个相对固定的存储位置,不能经常性的更改,这样能有效缓解系统的瓶颈。
因此能将前面建立的表和索引进行分开存储,将经常访问的信息分别存储到不同的磁盘中,提高I/O并发度。
4.2.2系统配置
关系型数据库一般都提供了一些系统配置变量和存储分配参数,供设计人员和数据库管理人员进行物理优化。初始情况下,系统都为这些变量赋予默认值,但这些值不一定使用于每一种应用场景,在进行物理设计时需要对一些变量进行赋值,以让数据库性能更符合设计预期。
常见的系统配置变量有:同时使用数据库的用户数,同时打开的数据库对象数,内存分配参数,缓冲区分配参数,存储分配参数,物理块大小,锁的数目等。对于本次设计的系统而言,大部分系统配置变量都采用默认值,只修改了创建数据库时字符集的指定为UTF8。
5数据库实施
5.1****创建数据库及数据库对象
5.1.1创建数据库
图5.1创建数据库sql代码图
5.1.2创建表
a)创建身份证件表
图5.2创建身份证件表sql图
b)创建客户级别表
图5.3创建客户级别表sql图
c)创建房间类型表
图5.4创建房间类型表sql图
d)创建房间状态表
图5.5创建房间状态表sql图
e)创建客户表
图5.6创建客户表sql图
f)创建房间表
图5.7创建房间表sql图
g)创建预定信息表
图5.8创建预定信息表sql图
h)创建入住信息表
图5.9创建入住信息表sql图
i)创建退房信息表
图5.10创建退房信息表sql图
j)创建administrators表
图5.11创建账号密码表sql图
K)创建users表
图5.12创建账号密码表sql图
5.1.3创建视图
- customer_info_view视图
图5.13创建customer_info_view视图
2.all_room_view视图
图5.14创建all_room_view视图
3.all_reserve_view视图
图5.16创建all_reserve_view视图
5.1.4存储函数和触发器
为了实现插入数据和更新数据时,对于一些数据计算和更改,本系统设置了触发器和存储函数来辅助实现,具体如下:
- 存储函数,用于根据客户等级和房间类型计算出每天的费用
图5.18repay存储函数
- 触发器,当在customer表中插入数据sex=‘M’或者’F’自动转换成’男’和’女’
图5.19sex_confirm触发器
- 触发器,当在customer表中更新数据sex='M’或者’F’自动转换成’男’和’女’.
图5.19sex_update触发器
- 触发器,当当向checkininfo表插入数据后,如果该customer_id和room_id在reservation表中,应该把reservation表中的re_flag设置为0,并将房间状态从预定房改为入住房。
如果不在reservation表中,则将房间状态从空房改为入住房。
图5.19chin_update触发器
- 触发器,当向reservation表插入数据后,应该把房间状态从空房改为预定房。
图5.20re_update触发器
- 写一个触发器,当向checkininfo表中插入customer_id,room_id,check_in_date,
expected_check_out_date,后计算出 reservation_amount,payment_amount,cii_flag并插入表中。
图5.20chin_money_count触发器
- 触发器,向reservation表插入数据时,从roomtype表查询出押金,然后计算预计入住天数,算出reservation_payment=一天房价*预计入住天数*0.3,再将re_flag赋值为1.
图5.20reservation_payment_count触发器
- 触发器,向checkoutinfo表插入数据时,从checkininfo表查询出reservation_payment,从checkininfo表查出check_in_info,算出total_count,need_pay,然后得出返回信息。
2.触发器,当向checkoutinfo表插入数据后,应该立刻把check_in表中的chin_flag设置为0,并将房间状态改为空房。
所有触发器展示:
5.2装入数据
- 向管理员表插入数据,用于登录认证
- 向房间状态表插入数据
3.向房间类型表插入数据
- 向房间表插入数据:
向客户级别表插入数据
- 向customer表插入数据
-
向checkininfo表插入数据
-
向checkoutinfo表插入数据
-
向administrators表插入数据
5.3部分关键功能说明
- 连接数据库模块
在application.yml下实现数据库的连接,服务器端口配置server:port:80指定了应用程序的服务器端口,此应用程序将在端口80上监听HTTP请求。即在访问http://localhost:80即可访问到相关应用程序。
在进行数据库操作时,每次操作都需要获取数据库连接,使用完毕后应该将连接释放,会导致性能下降:频繁地建立和释放连接会增加系统开销和延迟,导致系统性能下降;要解决这个问题,可以使用连接池来管理数据库连接,连接池可以重用连接,减少连接的创建和释放开销;因此数据库配置建立了一个使用Druid连接池的数据源。连接到名为hotel_system的MySQL数据库,该数据库位于localhost的端口3306上。连接使用了com.mysql.cj.jdbc.Driver JDBC驱动程序,连接凭据包括用户名root和密码123456。JDBC URL中的serverTimezone=UTC是将服务器的时区设置为UTC。
thymeleaf: prefix: classpath:/templates/ suffix: .html 是thymeleaf的自动配置了规则前缀和后缀,所以只要我们把html页面放在calsspath:/templates/下,thymeleaf就能自动渲染。
mybatis:configuration:map-underscore-to-camel-case: true配置针对MyBatis持久层框架,指定了配置选项,其中 map-underscore-to-camel-case: true 表示在处理数据库查询结果时,将下划线分隔的列名转换为驼峰命名规则,使得Java结果集对象中的字段名更符合Java的命名习惯。
实现代码如下:
5.4界面的设计实现和部分代码
界面的设计和相关代码存放在对应的源代码文件,这里只对几个主要的功能模块进行解释和代码呈现,具体的代码可以到指定源代码中查看。
- 登录界面
程序运行后,我们可以访问http://localhost:80/index进行登录,登录分为管理员和普通用户登录,选择不同的用户登录进入不同页面,其核心主要是管理员或用户输入用户名和密码,通过前端表单接收用户名和密码,然后用ajax把表单数据封装成json数据,然后通过相关接口传送到后端;其登录界面相关逻辑代码如下:
身份校验逻辑代码:
登录功能实现结果:
- 管理员操作界面
主界面展示,当管理员登录成功后进入管理员界面,对于不同功能的操作可以点击页面菜单栏的选项进入相应的操作。
- 客户操作界面
主界面展示,当客户登录成功后进入客户界面,对于不同功能的操作可以点击页面菜单栏的选项进入相应的操作。
- 具体的页面功能会在后续的系统功能测试中展示,相关逻辑代码可以到对应的源代码中查找,这里不再进行赘述。
5.5关键功能代码展示
a.房间状态页面展示:
实现代码:
本系统均使用MSCM实现
-
controller控制层:controller通过service的接口来控制业务流程,也可通过接收前端传过来的参数进行业务操作。
-
model层又称数据模型层,存放实体类,与数据库中的属性值基本保持一致。
-
service层,又称业务逻辑层:主要是针对具体的问题的操作,把一些数据层的操作进行组合,间接与数据库打交道(提供操作数据库的方法)。要做这一层的话,要先设计接口,在实现类。
Service接口:
Service实现类:
- mapper层,又称数据存储对象,相当于DAO层,mapper层直接与数据库打交道(执行SQL语句),接口提供给service层。
这里就只是一个数据查询展示,相对比较简单,房间类型,身份证件,用户级别表也是只做了简单查询,故此不做过多描述,因为这四个表在实际中几乎不需要进行增删改操作,也为了节省时间。
b.客户信息功能实现:
- 添加功能的实现:
Controller层:从前端页面获取customerId传到后端
Service层:
Service接口:
Service实现类:
Mapper层:
@Inrest: 这是对象关系映射框架的注解,用于指示该方法是一个数据库添加方法。insert into customer (customer_name, customer_gender , customer_document_id, " +
“customer_id_number, customer_contact_number, customer_level_id)” +
" values (#{customerName},#{customerGender},#{customerDocumentId}," +
“#{customerIdNumber},#{customerContactNumber},#{customerLevelId})”) 这是一个 SQL 添加语句,它会从名为 customer的数据库表中添加封装成customer对象的数据。结果展示:
当点击添加客户按钮,跳转到添加客户详情页面:
点击添加按钮,若符合要求则会显示添加成功。
添加成功后可以看到页面多了一条刚刚我们添加的数据:
同时,数据库也添加到了相关数据:
但是这里出现了小问题,因为我在添加这条数据之前删了一条数据,会导致编号自增删除之后不连续,所以出现了52号数据而不是51号,所以这里用手动自增的方式修改编号
SQL代码:
结果展示:
删除功能的实现:
Controller层:从前端页面获取customerId传到后端
Service层:
Service接口代码:
Service实现类代码:
Model层:Customer实体类,与数据库的customer表相对应。
Mapper层:
@Delete: 这是对象关系映射框架的注解,用于指示该方法是一个数据库删除方法。“delete from customer where customer_id=#{customerId}”: 这是一个 SQL 删除语句,它会从名为 customer的数据库表中删除customer_id等于customerId,而这个customerId是从函数deleteCustomerById中获取。
结果展示:
点击编号为51的客户信息的删除按钮,点击确定后删除了编号为51的客户信息
可以看到页面最后一个是编号为50的数据,编号为51的已被删除。
数据库表中的数据:
更新功能的实现:
Controller层:
Service层:
Service接口:
Service实现类:
Mapper层:
@Update:这是对象关系映射框架的注解,用于指示该方法是一个数据库更新方法。"update customer set customer_name=#{customerName}, customer_gender=#{customerGender}, " + "customer_document_id=#{customerDocumentId},customer_id_number=#{customerIdNumber},“customer_contact_number=#{customerContactNumber},customer_level_id=#{customerLevelId}where customer_id=#{customerId}” 这是一个 SQL更新语句,它会从名为 customer的数据库表中更新数据封装成customer对象的数据,当customer_id=customerId时,更新对象;
结果展示:
更新前数据:
点击编辑按钮进入更新客户详情页面:
其中客房信息,预定信息,入住信息和退房信息,实现功能逻辑基本相同,故只给出客户信息代码实现,等到功能展示将做更详细说明。由于时间关系,预定信息,入住信息和退房信息并未做更新操作,为了页面美观,保留了编辑按钮。
视图功能实现:
视图功能管理三个模块均实现了分页查询,但是由于实现逻辑一样,所以故只展示一个页面代码。
- 分页功能实现:
为了方便实现,在pom.xml导入了PageHelper插件帮助实现mybatis分页展示。
Controller层:
Service层:
Service接口:
Service实现类:
Model层:
Mapper层:
@Select 注解:表示这个方法是用于执行查询操作的。 SQL 查询语句是 “SELECT * FROM customer_info_view LIMIT #{offset}, #{pageSize}”,查询的是名为 customer_info_view 的视图(View)中的所有列(*表示所有列)。LIMIT 子句用于限制返回的结果行数,#{offset} 和 #{pageSize} 是 MyBatis 的参数占位符,用于接收实际的参数值。
@Param 注解用于将方法参数与 SQL 查询语句中的参数占位符进行映射。在这里,@Param(“offset”) 表示将方法参数 offset 映射到 SQL 查询语句中的 #{offset},同理,@Param(“pageSize”) 表示将方法参数 pageSize 映射到 SQL 查询语句中的 #{pageSize}。
结果展示如下:在数据库里客户信息视图有五十条数据,在页面展示一页10条,共5页。
模糊查询功能实现:
实现代码:
Controller层:
Service层:
Service接口:
Service实现类:
Mapper层:
@Select 注解: 表示用于执行查询操作。在这里,查询的是名为 customer_info_view 的视图中,满足特定条件的数据;查询语句是 “SELECT * FROM customer_info_view WHERE customer_contact_number LIKE CONCAT(‘%’, #{phone}, ‘%’)”. 这里使用了 LIKE 操作符进行模糊匹配,CONCAT(‘%’, #{phone}, ‘%’) 用于构建一个模糊匹配的字符串,其中 #{phone} 是 MyBatis 的参数占位符,用于接收实际的电话号码参数。
@Param 注解: 用于将方法参数与 SQL 查询语句中的参数占位符进行映射。@Param(“phone”) 表示将方法参数 phone 映射到 SQL 查询语句中的 #{phone}。
结果展示:
在搜索框搜入3915,即可实现
把数据展示到页面上:
5.6系统功能展示
5.6.1登录与注册功能展示:
管理员登录:
进入管理员界面:
客户登陆:
进入客户登录界面:
注册功能展示:
数据库user表:
5.6.2管理员界面功能展示:
- 房间信息视图:
模糊查询搜索房间类型:
-
预定信息视图:
-
客户信息视图:
模糊查询客户电话
客房信息
添加房间:
添加成功:
结果显示:
删除房间:
删除成功:
结果展示:
更新房间前:
更新房间:
更新房间成功:
更新完结果展示:
房间状态展示:
房间类型展示:
预定信息展示:
添加预定:
结果展示:
删除预定:删除编号为19的数据
结果展示:
入住信息展示:
添加入住信息:
结果展示:删除入住信息:
删除入住信息:删除编号为19的数据
结果展示:
退房信息展示:
添加退房信息:
结果展示:
删除退房信息:删除编号为19的数据
编号为19的数据被删除
客户展示:
更新前数据:
更新客户:
点击编辑按钮进入更新客户详情页面:添加客户:
添加成功后可以看到页面多了一条刚刚我们添加的数据:
可以看到页面最后一个是编号为50的数据,编号为51的已被删除。
身份证件展示:
用户级别展示:
5.6.3客户界面功能展示:
房间预定功能:
预定信息添加:
个人信息展示:
个人信息修改:
查看个人预定信息功能:
6****数据库运行和维护
6**.1****数据库转储策略**
数据转储:DBA定期将数据库复制到磁盘上保存起来,能够使因某种原因而遭到破坏的数据库进行恢复为上一次备份的状态。
转储方法:
①静态转储:转储期间不能对数据库进行任何存取等活动,是最直接的转储方法,必须等待转储完毕后才能对数据库进行存取修改等操作;静态转储效率会比较低,转储期间,新的事务无法进行;
②动态转储:转储期间允许对数据进行存取或者修改;动态转储相比静态转储的好处是转储期间,不会影响新事务的运行,效率有所提高;但转储结束后的数据并不能保证即时生效,如果转储期间,事务对数据进行了修改的话,转储后的数据就不能与原数据库中的数据保持一致性,因此要把转储期间事务对数据库进行的修改活动等记录下来成为日志文件,再合并上转储后的数据,才能与原数据库保持数据一致性;
③海量转储:每次都转储整个数据库;相比于动态转储的好处是,不用担心数据一致性的问题,在转储后不必进行记录日志文件等操作,对于恢复数据库会相对简单;但若数据库很大,那么每次转储耗费时间就会很长,也浪费存储空间;
④增量转储:每次只转储上次备份后变化的数据;相对于海量转储,提高了转储效率,只对更新的数据进行转储,实际上也是减少了数据冗余,是比较实用高效的转储方法。
6.2数据库备份与恢复方案
6.2.1数据库备份
在进行数据库更改操作中,可能会导致数据错误,甚至数据库奔溃的情况,因此需要进行数据库数据的相关备份;使用 mysqldump 命令可以备份整个数据库或特定表的数据和结构。
# 备份整个数据库到文件
mysqldump -u username -p dbname > backup.sql
# 备份特定表到文件
mysqldump -u username -p dbname table_name > table_backup.sql
这将提示输入密码,然后将数据库或表的内容导出到指定的 SQL 文件中。
这里用dataGrip图视化实现数据库备份把hotel_system数据库数据保存到桌面下文件夹drmp文件夹,保存的数据文件名为data.sql;点击hotel_system备份整个库,右键点击Export with ‘mysqldump’,

6.2.2数据库恢复:
使用备份文件还原数据库或表。
# 还原整个数据库
mysql -u username -p dbname < backup.sql
# 还原特定表
mysql -u username -p dbname < table_backup.sql
这将提示输入密码,然后将备份文件中的内容还原到数据库或表中。在dataGrip图视化工具需要恢复数据的库上右键点击Restore with ‘mysql’
6.2.3 MySQL 主从备份:
主从备份是通过在主服务器上使用 mysqldump 备份数据,然后将备份文件复制到从服务器并还原的方式实现的。在主服务器上执行备份:mysqldump -u username -p --single-transaction --master-data=2 dbname > master_backup.sql这将创建一个带有主服务器信息的备份文件,将备份文件传输到从服务器上。
在从服务器上还原备份:mysql -u username -p dbname < master_backup.sql
这将在从服务器上还原主服务器的数据。
6.3数据报表导出功能
首先是在pom.xml导入相关依赖:
在Controller层给出Get接口以响应相关导出报表的HTTP请求。,该接口处理导出请求,并调用相应的服务层方法生成Excel文件。
图5.35数据报表导出代码
6.4连接池的使用
在进行数据库操作时,每次操作都需要获取数据库连接,使用完毕后应该将连接释放,会导致性能下降:频繁地建立和释放连接会增加系统开销和延迟,导致系统性能下降;要解决这个问题,可以使用连接池来管理数据库连接,连接池可以重用连接,减少连接的创建和释放开销;因此数据库配置建立了一个使用Druid连接池的数据源,用于提高性能。
6.5权限管理
根据功能需求分析可以知道该系统有管理员和客户两类用户,因此需要root用户对管理员和客户进行授权。
- 客户授权
下面以客户用户张三为例,在数据库中创建用户zs,并赋予相关权限,由功能需求可知,客户对reserve视图,reservation表,Customer表有查询功能,客户对reservation表具有添加的权限,对于Customer表中除了用户级别字段没有修改权限其余都能修改,但是因为MySQL对用户权限赋予最低为表级,无法定位到字段。
在数据库中创建用户和授权如下:
2.管理员授权
下面以管理员admin为例,在数据库中创建用户admin,并赋予相关权限,由功能需求可知,管理员对于所有表的增删改查都具有权限,同时具有把权限赋给其他人的权限。
在数据库中创建用户和赋予权限如下:
6.6查询优化
- 建立索引实现查询优化:
得出的查询时间需要91ms
对上述查询进行优化我们可以建立以下索引:
再次执行查询语句可以看到查询需要91ms;
并没有实现查询的优化;有时候,索引并不总是带来性能的提升,有时甚至可能导致性能下降。在这种情况下,可能有其他因素导致了性能问题。
(2)使用INNER JOIN代替隐式JOIN: 明确使用INNER JOIN语法,而不是隐式的WHERE子句连接。这可以使查询更加清晰,并可能有助于优化器生成更有效的查询计划。
我们可以得出查询需要85ms,做到了查询的优化。
小 ?结
- 收获与体会
本次数据库的课程设计我收获了很多,首先基于一个系统的数据库设计,让我重新理解老师课堂上讲解的内容,例如触发器的使用,存储函数的使用,视图的建立,索引建立等等,什么时候使用这些技术来提高数据的查询和更新效率;其次,针对酒店客房管理系统,需要根据需求来设计系统的逻辑模型,这一块十分关键,中间也是因为自己理解上的问题导致修改系统的E-R模型,进一步体会到从需求到设计的关键性是提炼出模型;设计完E-R模型后,需要将这些数据模型转化成数据库系统能操作的关系对象,根据范式分析和实际情况分解关系,得到最终的关系模式,这里对于数据冗余,数据操作异常有了进一步的体会;最后在数据库实施阶段,我熟悉了更多的SQL语句,如增删改查,多表连接等功能,在图视化部分,学习利用java语言springboot提供的框架与数据库进行连接,将mybatis与SQL结合,实现数据增删改查,用web制作页面的展示。
本次设计过程虽然耗费的时间比较长,但是这个过程中收获的东西是无法用时间来衡量的,这为我将来学习更深层次的技术打下一定的基本,我个人很享受这个过程,希望在未来能有更多的机会接触这种类似项目的开发。
- 系统需要改进的地方
性能优化方面,在涉及到数据库查询的优化、索引的使用方面仍然需要学习使用其他的查询优化方法。
功能方面:由于时间关系,本系统并没有对预定,入住和退房做更新功能,导致功能相对欠缺,另外,并没有对时间操作有很好的把握,在预定,入住,退房功能,对一段时间进行预定,入住或退房,而这段时间之前和之后都没有进行相关的处理,比如说时间冲突。
用户界面方面:由于此界面是参考网上模板,与实际的酒店管理系统差距较大,而且界面过于繁琐,需要进行简化,尤其是对于好一部分页面跳转时由于前端接口与后端接口出现不对应而导致进入错误页面。
安全性方面: 酒店客房管理系统涉及到大量敏感信息,包括客人个人信息。确保系统具有强大的安全性,采用加密技术保护数据,实施合适的身份验证和授权机制。
相关文章:
基于springboot的酒店客房管理系统----数据库课程设计
目录 1.需求分析 1.1用例模型 1.1.1用例图 1.1.2用例描述 1.2过程模型 1.2.1数据流 1.2.2数据字典 1.3 安全性和完整性需求 1.4?数据字典 1.4.1数据项 1.4.2数据结构 1.4.3数据流 1.4.4数据存储 1.4.5数据过程 2概念结构设计 2.1 ER模型 2.1.1 实体及属性 2…...
SPDK vhost介绍
目录 1. vhost技术的背景与动机Virtio 介绍virtio-blk数据路径为例 2. vhost技术的核心原理2.1 vhost-kernel2.2 vhost-user举例 2.3 SPDK vhostvhost的优势IO请求处理数据传输控制链路调整 3. SPDK vhost的实现与配置3.1 环境准备3.2 启动SPDK vhost服务3.3 创建虚拟块设备3.4…...
理解C++运行时类型识别符: typeid
1. 格式 typeid (type-id) typeid (expression) typeid 运算符允许在运行时确定对象的类型。 typeid 的结果是一个 const type_info&。该值是对 type_info 对象的引用,该对象表示 type-id 或表达式的类型,具体取决于使用哪种形式的 typeid。有关…...
Fullcalendar @fullcalendar/react 样式错乱丢失问题和导致页面卡顿崩溃问题
问题描述: 我使用 fullcalendar的react版本时,出现了一个诡异的问题,当我切换到 一个iframe页面时(整个页面是一个iframe嵌入的),再切换回来日历的样式丢失了!不仅丢失了样式还导致页面崩溃了&…...
C++从入门到实战(二)C++命名空间
C从入门到实战(二)C命名空间 前言一、C的第一个程序二、命名空间(一)为什么需要命名空间(二)定义命名空间(三)使用命名空间1.通过命名空间限定符:2.使用 using 声明&…...
Spring 定时任务:@Scheduled 注解四大参数解析
本文主要介绍了在 Spring 框架中使用Scheduled注解实现定时任务的方法,重点讲解了fixedRate、fixedDelay、cron和initialDelay这四个参数的用法,并通过实例代码进行了详细说明。 1. fixedRate 参数 参数含义 fixedRate指定任务固定时间间隔执行。如设…...
计算机网络之物理层
本文章目录结构出自于《王道计算机考研 计算机网络_哔哩哔哩_bilibili》 01 物理层 在网上看到其他人做了详细的笔记,就不再多余写了,直接参考着学习吧。 1 详解物理层-通信基础【王道计算机网络笔记】_wx63088f6683f8f的技术博客_51CTO博客 2 详解物…...
Oracle 数据库常见字段类型大全及详细解析
在工作期间会遇到数据库建表的业务,经常会使用复制粘帖等操作,而不清楚数据库的字段类型。本文记录了 Oracle 数据库常见字段类型,根据不同的数据需求,可以选择不同的字段类型来存储数据。 文章目录 一、字符类型(Char…...
总线、UART、IIC、SPI
一图流 总线 概念 连接多个部件的信息传输线,是各部件共享的传输介质 类型 片内总线:连接处理器内核和外设的总线,在芯片内部 片外总线:连接芯片和其他芯片或者模块的总线 总线的通信 总线通信的方式 串行通信 数据按位顺序传…...
纯css实现div宽度可调整
<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>纯css实现div尺寸可调整</title><style…...
Arduino大师练成手册 -- 读取DHT11
要在 Arduino 上控制 DHT11 温湿度传感器,你可以按照以下步骤进行: 硬件连接: 将 DHT11 的 VCC 引脚连接到 Arduino 的 5V 引脚。 将 DHT11 的 GND 引脚连接到 Arduino 的 GND 引脚。 将 DHT11 的 DATA 引脚连接到 Arduino 的数字引脚&am…...
GS论文阅读--GeoTexDensifier
前言 本文是一个关于高斯致密化策略对高斯地图进行优化,他主要关注了几何结构和纹理信息。我最近对于高斯点的分布比较感兴趣,因为高斯点的分布决定了之后重建质量的好坏,初始化高斯很重要,但之后的维护需要致密化与修建策略&…...
Android实战经验篇-玩转Selinux(详解版)
列文章转如下链接: Android Display Graphics系列文章-汇总 Android实战经验篇-系列文章汇总 本文主要包括部分: 一、Selinux概述 1.1 SELinux是什么? 1.2 自主访问控制(DAC) 1.3 强制访问控制(MAC&…...
【langgraph】ubuntu安装:langgraph:未找到命令
langgraph 在ubuntu24.04 参考:langgraph运行:报错: (05_ep_dev) root@k8s-master-pfsrv:/home/zhangbin/perfwork/01_ai/05_ep_dev/expert# langgraph dev langgraph:未找到命令查看langraph的安装情况 pip show langgraph...
深入探究分布式日志系统 Graylog:架构、部署与优化
文章目录 一、Graylog简介二、Graylog原理架构三、日志系统对比四、Graylog部署传统部署MongoDB部署OS或者ES部署Garylog部署容器化部署 五、配置详情六、优化网络和 REST APIMongoDB 七、升级八、监控九、常见问题及处理 一、Graylog简介 Graylog是一个简单易用、功能较全面的…...
HTML新春烟花
系列文章 序号目录1HTML满屏跳动的爱心(可写字)2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心(简易版)7HTML粒子爱心8HTML蓝色动态爱心9HTML跳动的爱心(双心版)1…...
CentOS 7 安装fail2ban hostdeny方式封禁ip —— 筑梦之路
centos 7 换源参考CentOS 7.9 停止维护(2024-6-30)后可用在线yum源 —— 筑梦之路_centos停止维护-CSDN博客 安装fail2ban yum install fail2ban 新增配置文件 cat > /etc/fail2ban/action.d/hostsdeny.conf << EOF [Definition] actionstart actionstop action…...
java入门基础笔记语法篇(3)
一、 注释 什么是注释 注释定义:注释是写在程序中对代码进行解释说明的文字,方便自己和他人查看以理解程序。 Java注释的三种写法: 单行注释:以“//”开头,注释内容只能写一行。多行注释:以“/*”开头&…...
VUE对接deepseekAPI调用
1.先去开放平台注册账号申请api key。开放平台:https://platform.deepseek.com/api_keys 2.你的项目需要有发送请求的axios或者自己写。 npm install axios # 或 yarn add axios 3.创建 API 调用函数 在 Vue 项目中,通常会将 API 调用的逻辑封装到一个…...
【C++高并发服务器WebServer】-1:Linux中父子进程fork创建及关系、GDB多进程调试
本文目录 一、进程创建二、GDB多进程调试 一、进程创建 在Linux中输入man 2 fork可以查看man文档中的fork的相关函数信息。 fork的作用就是创建一个子进程。 通过fork我们可以知道,创建子进程的时候,复制父进程的信息。 我们看看翻译的man文档信息&am…...
leetcode——相交链表(java)
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后&…...
Spring 框架:配置缓存管理器、注解参数与过期时间
在 Spring 框架中,可通过多种方式配置缓存具体行为,常见配置方法如下。 1. 缓存管理器(CacheManager)配置 基于内存的缓存管理器配置(以SimpleCacheManager为例) SimpleCacheManager 是 Spring 提供的简单…...
UDP協議與代理IP介紹
UDP,全稱是用戶數據報協議(User Datagram Protocol),是Internet協議套組的一部分,與TCP協議一道工作。與TCP相比,UDP可以理解為一個更“羽量級”的協議。它不需要像TCP那樣在數據傳輸開始之前建立連接&…...
24.日常算法
1. 数组中两元素的最大乘积 题目来源 给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值。请你计算并返回该式的最大值。 示例 1: 输入:nums [3,4,5,2] 输出:12 解释…...
【Python】FastAPI框架快速实现后端(一)
FastAPI框架快速实现后端-SQLModel的使用 介绍正文基础模型模型与表定义数据表模型关系定义 介绍 最近1个多月,用FastAPI做了几个日常工作用的小功能,感觉FastAPI确实很适合这种场景,功能要求简单,交付要求比较急,这个…...
西门子【Library of General Functions (LGF) for SIMATIC S7-1200 / S7-1500】
文章目录 概要整体架构流程技术名词解释技术细节小结 概要 通用函数库 (LGF) 扩展了 TIA Portal 中用于 PLC 编程的 STEP 7 指令(数学函数、时间、计数器 等)。该库可以不受限制地使用,并包含 FIFO 、搜索功能、矩阵计算、 astro 计…...
年度总结和寒假总结
年度总结 加入Hope实验室 年初,我加入了Hope实验室,在实验室里,我接触到了更加前沿的技术和项目。刚开始时,我主要学习了Java语言和MySQL数据库。这是我第一次系统地接触这些技术,相比之前的课堂学习,实验…...
STM32 GPIO配置 点亮LED灯
本次是基于STM32F407ZET6做一个GPIO配置,实现点灯实验。 新建文件 LED.c、LED.h文件,将其封装到Driver文件中。 双击Driver文件将LED.c添加进来 编写头文件,这里注意需要将Driver头文件声明一下。 在LED.c、main.c里面引入头文件LED.h LED初…...
C#标准Mes接口框架(持续更新)
前言 由于近期我做了好几个客户的接入工厂Mes系统的需求。但是每个客户的Mes都有不同程度的定制需求,原有的代码复用难度其实很大。所以打算将整个接入Mes系统的框架单独拿出来作为一个项目使用,同时因为不同的设备接入同一个Mes系统,所以代…...
22_设计方案(4.1.7)
4.1.7 数据组织存储实例 全区所有数据库信息根据业务使用范围存储在互联网区、政务外网区、自然资源业务网区的服务器。互联网区的服务器主要存储互联网数据库。政务外网区的服务器主要存储全区所有市、县(区)不动产登记业务库、档案库、后台管理库、工作流库,全区共享查询…...
Ansys Thermal Desktop 概述
介绍 Thermal Desktop 是一种用于热分析和流体分析的通用工具。它可用于组件或系统级分析。 来源:CRTech 历史 Thermal Desktop 由 C&R Technologies (CR Tech) 开发。它采用了 SINDA/FLUINT 求解器。SINDA/FLUINT 最初由 CR Tech 的创始人为 NASA 的约翰逊航…...
PageView组件的功能和用法
文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了如何屏蔽事件关的内容,本章回中将介绍PageView Widget.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍的PageView是指左右滑动或者上下滑动显示不同的页面,Flutter把它…...
自动化实现的思路变化
阶段一: 1、成功调用。第一步,一般是用现用的工具,或者脚本成功调用接口 2、解决关联接口的参数传递。有的接口直接,存在参数的传递,一般的思路,就是将这个参数设置为变量。 3、简化代码。总会有些东西是重…...
微信小程序启动小程序APP Page Component创建顺序
之前之后的打印 都是在()之外...
从 UTC 日期时间字符串获取 Unix 时间戳:C 和 C++ 中的挑战与解决方案
在编程世界里,从 UTC 日期时间字符串获取 Unix 时间戳,看似简单,实则暗藏玄机。你以为输入一个像 “Fri, 17 Jan 2025 06:07:07” 这样的 UTC 时间,然后轻松得到 1737094027(从 1970 年 1 月 1 日 00:00:00 UTC 开始经…...
[Spring] Gateway详解
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
计数排序算法
基本思想 先确定待排序数组的最大值(Max)和最小值(Min),随后创建Max - Min 1个长度的数组称为计数数组,计数数组的索引对应着待排序数组中元素的值,数组的值表示该元素的出现次数。通过从前往…...
Spring--基于注解的声明式事务
基于注解的声明式事务 1.选择一个合适的事务管理器实现加入到ioc容器 2.使用注解指定哪些方法需要添加事务即可 1.事务属性:只读 // readOnly true把当前事务设置为只读 默认是false! Transactional(readOnly true)Transactional注解放在类上 生效原则 如果一…...
SQL-leetcode—1164. 指定日期的产品价格
1164. 指定日期的产品价格 产品数据表: Products ---------------------- | Column Name | Type | ---------------------- | product_id | int | | new_price | int | | change_date | date | ---------------------- (product_id, change_date) 是此表的主键(具…...
微服务搭建----springboot接入Nacos2.x
springboot接入Nacos2.x nacos之前用的版本是1.0的,现在重新搭建一个2.0版本的,学如逆水行舟,不进则退,废话不多说,开搞 1、 nacos2.x搭建 1,首先第一步查询下项目之间的版本对照,不然后期会…...
JavaEE:多线程进阶
JavaEE:多线程进阶 一、对比不同锁策略之间的应用场景及其区别1. 悲观锁 和 乐观锁1.1 定义和原理1.2 应用场景1.3 示例代码 2. 重量级锁 和 轻量级锁2.1 定义和原理2.2 应用场景2.3 示例代码 3. 挂起等待锁 和 自旋锁3.1 定义和原理3.2 应用场景3.3 示例代码 4. 几…...
软件测试 —— jmeter(2)
软件测试 —— jmeter(2) HTTP默认请求头(元件)元件作用域和取样器作用域HTTP Cookie管理器同步定时器jmeter插件梯度压测线程组(Stepping Thread Group)参数解析总结 Response Times over TimeActive Thre…...
[java] 面向对象进阶篇1--黑马程序员
目录 static 静态变量及其访问 实例变量及其访问 静态方法及其访问 实例方法及其访问 总结 继承 作用 定义格式 示例 总结 子类不能继承的内容 继承后的特点 成员变量 成员变量不重名 成员变量重名 super访问父类成员变量 成员方法 成员方法不重名 成员方法…...
openstack单机安装
openstack单机安装 网卡配置安装依赖开启虚拟环境修改配置文件 部署openstack部署openstack客户端访问可视化界面Horizon补充 本篇主要讲述Ubuntu2204单机安装openstackstable/2024.2。其他版本的Linux系统或者openstack版本,请参考openstack官网。 网卡配置 需要配…...
OFD、PDF 电子签章系统处理流程
在C#中实现电子签章系统的处理流程,可以参考以下步骤和技术实现: 1. 电子签章系统的基本流程 电子签章系统的核心流程包括以下几个步骤: 密钥生成:生成公钥和私钥对,私钥由签章人保管,公钥用于验证签名。…...
「 机器人 」系统辨识实验浅谈
前言 系统辨识实验是一种通过实验和数据分析的方法,用于建立物理系统的数学模型的技术。系统辨识是控制工程和系统科学中的重要环节,尤其是在模型未知或复杂的情况下。以下是系统辨识实验的详细介绍: 1. 系统辨识实验的目的 1.1 建模 为动态系统(如机械系统、电气系统或生…...
15.7k!DISM++一款快捷的系统优化工具
软件介绍 链接 软件介绍 dism是一款由初雨团队开发的win系统优化工具,可当作是微软系统命令行工具dism的GUI版本。可用作系统垃圾清除、启动项管理、程序卸载、驱动管理、系统优化等 该工具个人感觉最重要的就是系统优化选项,它将一些实用、无用或者没…...
Windows10安装MySQL找不到MSVCR120.dll和MSVCP120.dll问题解决
个人博客地址:Windows10安装MySQL找不到MSVCR120.dll和MSVCP120.dll问题解决 | 一张假钞的真实世界 msvcp120.dll、msvcr120.dll、vcomp120.dll属于VC2013版中的动态链接库,如果丢失重新安装VC2013即可。下载地址:https://www.microsoft.com…...
Vue 3 30天精进之旅:Day 03 - Vue实例
引言 在前两天的学习中,我们成功搭建了Vue.js的开发环境,并创建了我们的第一个Vue项目。今天,我们将深入了解Vue的核心概念之一——Vue实例。通过学习Vue实例,你将理解Vue的基础架构,掌握数据绑定、模板语法和指令的使…...
被遮挡QT窗口置顶
问题描述 开发环境:windows QT 需求: 单击托盘将桌面窗口在被遮挡的情况下置顶解决方案 方案1 资料链接 代码实现 Qt::WindowFlags flags windowFlags(); this->setWindowFlags((flags | Qt::WindowStaysOnTopHint)); this->showMaximized();…...