基于J2EE酒店管理系统设计与实现

摘要:随着现代计算机技术的发展,给社会及个人生活带来了翻天覆地的变化,计算机技术已经进入到了人们日常生活中的各个方面,人们越来越多的使用互联网进行消费以及其他日常的使用。而在酒店这一竞争激烈的行业里,使用计算机软件进行酒店管理已经在行业内如火如荼的进行。如今越来越多的人使用app或web在网络上预定酒店,使用手机支付在酒店里的费用。当所有的消费都通过网络进行,所有的信息在网络上流通时,酒店就需要订制专门的系统,为用户提供网上预定的平台,为企业提供和服务渠道、银行渠道信息对接的后台管理,进行信息的获取和资金的转入。这将极大的提高酒店的运营效率和服务水准,减少因手工管理漏洞而引起的经济损失。

本文首先阐述了酒店管理的现状和未来发展趋势,说明了编写这篇论文的目的及意义。然后介绍了使用到的技术,其中详细说明了MyBatis,Spring,SpringMVC这三个框架的原理和使用方法。第三部分主要描述本系统的具体实现过程,先基于酒店业务和发展需求制定一个系统总体设计方案,罗列系统中应该具备的功能,然后对每个功能进行详细的业务流程设计,最后根据方案完成代码的编写,实现一个易用、稳定、多功能的酒店管理系统。

关键词:酒店管理;Spring;MyBatis;Spring-MVC;mysql

 一、绪论

  1.1背景及意义

在信息时代和经济全球化的飞速发展下,互联网风暴席卷了城市的每一个角落。为了应对人们消费水平的日益提高和消费方式的改变,许多行业在进行创新和变革,而长久以来竞争就非常激烈的酒店行业将面临前所未有的机遇和挑战。

伴随着我国经济的持续快速增长和人民生活水平的不断提高,旅游业成为了我国发展最快的朝阳产业,而旅游业的蓬勃发展必将推动大量的游客入住酒店,在酒店进行消费。与此同时,行业的高速发展使资本大量的涌入,竞争在酒店行业也越来越激烈。因此如何提升酒店的服务,提高管理水平,减少成本,尤其是如何高效处理酒店运营中产生的大量数据,已经成为酒店管理者亟待解决的重要课题。

在以前使用传统方式进行酒店管理的时代,常会出现各种各样的漏洞,例如现金的流失、手工记账错误、房间问题没有及时处理、无法及时了解房间是否有人入住、对酒店目前经营状况不了解,这些都会造成酒店管理的低效和成本的增加,对酒店的发展产生不好的影响。

而在信息化社会中,使用信息化技术将非常有效的帮助酒店提高竞争优势,具体体现在以下方面:

(1)加强了酒店运营的管理

酒店管理员可以对房价进行监控和管理,对房间的使用以及房型进行调控,对生成的酒店报表进行核查,收银时员工不需要输入账单的价格,价格由管理员在系统中设置,而杜绝了财务上出现的纰漏。系统所有的操作都会被记录保存下来,如果出现业务上的问题,管理员可以查看操作记录来查找问题所在并制定相应的解决方案呢。系统的各项功能都设置了权限,前台接待员只有前台功能的权限,而不能触及酒店的核心信息。房价,用户数据,企业报表这些信息只有酒店的管理员才有权限接触,保证不会被不相关的人员查看和操作。

(2)提高工作效率

酒店管理系统将提供简洁易懂的界面,方便快捷的操作流程,可以让接待员快速办理客人的入住和酒店的其他业务,提高了业务的办理效率。同时,系统将为接待员提供实时的房态信息,可以为客人订房提供准确的房间信息,已经入住的客人的饮食,换房要求会立刻通过系统通知前台,通过酒店管理系统,关于客人的一切业务,都可以及时的反馈到前台并进行相应的处理,提高了酒店的服务水平,也减少了很多可能产生的问题。系统也能够为酒店各项数据进行统计,包括酒店的营业收入,房间出租率以及各项支出,方便酒店的管理者快速的对酒店出现的问题作出相应的解决。

(3)提高经济效率

通过房态管理,员工可以向客人提供酒店实时的房间状况,让客人选择满意的房间,而不需要每日进行人工的统计,减少了人工的成本,也提高了客房的出租率。通过使用软件来处理酒店里的各种业务,极大的简化人工的操作,不需要让员工记住繁琐的业务流程,节省了对酒店接待员的培训费用。同时,酒店管理者可以在线上发布新的活动公告和营销方案,既吸引了广大用户来入住酒店,也减少了线下的宣传费用,通过酒店的入住客源和淡旺季来制定相应的策略,在合适的时机制定合适的优惠策略,而减少不必要的花费。

(4)增加客户流量

线上的平台为用户预订酒店提供了一个快捷的渠道,使用户不需要到酒店才能 订房间,使所有使用互联网的人群都成为我们的潜在用户。同时,线上平台也是一个巨大的宣传渠道,无论是官方的推送或是客户之间的推荐,都能通过互联网进行广泛的传播,必将吸引更多的用户入住。

 1.2本文的工作

基于上述原因,本文阐述了这套基于J2EE的酒店管理系统的设计与开发,提高了酒店管理的效率,减少了运营过程中产生的纰漏,并且高效的处理了酒店日常业务中产生的大量数据。

本系统实现了酒店运营中前台业务,后台管理,系统管理这三大模块的功能,具体包括预订、入住、结账、房态、订单、报表等功能。经过测试,该系统可以正常运行,完成酒店日常运营的需要。

本系统使用的开发工具为eclipse, 数据库使用的是Mysql,框架使用了MyBatis,Spring,SpringMVC这三个框架。

1.3本文的组织结构

第一章是绪论,主要包括论文研究的背景意义和对本篇论文的总体介绍。

第二章是相关技术介绍,主要介绍了本系统在持久层,业务层,视图层分别用到的框架,即MyBatis,Spring,SpringMVC,然后阐述了框架的原理和配置步骤,搭建服务所需环境。

第三章是系统分析,包括可行性分析和需求分析。分别从技术、操作、经济上进行了可行性分析,从功能和非功能两个方面阐述了需求。

第四章是系统概要设计,根据需求设计了主要的模块和功能,添加了概括性的描述,并对这些功能进行了结构的划分。然后完成了数据库概念模型的设计,为后面系统的详细设计做好准备。

第五章是系统详细的设计,对概要设计中的每一个功能分别从功能概述、流程图展示、代码细节、核心代码截图这四个方面进行详细的阐述。

第六章是系统测试,在系统设计完成之后对每一个功能进行了测试,并添加了测试的结果和系统的界面截图,然后从代码角度阐述了性能上的优化,最后总结了本系统存在的问题。

第七章为总结,一方面对本文的内容进行一个概括性的总结,另一方面对本文实现的酒店管理系统进行一个客观公正的评价,包括项目中的亮点和不足。

 二、相关技术介绍

  2.1 MyBatis框架介绍

MyBatis 是一款运用于持久层的框架,它可以利用sql的动态配置来灵活的执行数据库处理操作,同时具有触发器,函数,存储过程等高级特性,将数据库和对象映射起来。MyBatis 将所有与数据库连接所需的参数放在了配置文件中,不需要进行jdbc编程就可以获取数据库中的数据,减少了创建和销毁数据库连接的开销。同时MyBatis将所有的sql语句封装在配置文件中并通过代理模式执行,将接口和 Java 的实体类映射成数据库中的数据,分离了持久层接口和具体实现。

Mybatis 拥有接口层、数据处理层、基础支撑层这三层架构,如图2.1所示。

72761b3372e6cd01fdf5cc5edbd296de  图2.1 Mybatis体系结构

Mybatis的三层架构介绍:

(1)api接口层:本层提供了有业务对象相关的接口,让Service层调用。业务层只需使用这些接口而不必了解内部实现,就可以完成对数据库的操作。接口被使用后,就会获取配置在相应mapper中的sql语句对数据库进行处理。

(2)数据处理层:当api接口层被调用后,就会执行本层对应的sql语句执行数据库操作,然后将从数据库中获取的数据返回。本层封装最原始的数据库操作,直接对数据库进行操作。

(3)基础支撑层:本层包括连接数据库所需的最基本的组件和相应的配置信息,包括与数据库连接所需的驱动,数据库事务的处理,对经常使用的数据进行缓存以及数据库用户名密码的配置。这些都是最基础的数据库功能,是实现数据库功能的必要保证。

 2.2 Spring框架介绍

Spring是一个开源的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,所以它将面向接口的编程思想运用于整个系统应用。

在任何web服务器中如TomCat,JBoss,我们都可以不受环境的限制,使用Spring 框架中提供的功能。Spring 不受特定的服务器限制,不会将自身绑定到指定的项目和对象中,从而突出了Spring的优势:在Spring中配置的对象可以在不同的项目和环境中执行,在不同的服务器中实现重用,降低了耦合性,增加了可扩展性。Spring的体系结构如图2.2所示。

图2.2 Spring体系结构

c5f57dff2aea7011a2a8253aa0d10410  组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

(1)核心容器:该容器实现了Spring中最基本的特性。核心容器的主要包括对象工厂,用来生成和加载实例。该特性实现了ioc控制反转,将原本由资源双方来控制的对象交由Spring容器来控制,降低了对象之间的耦合度,使代码专注于对象的使用而不是对象的创建。

(2)Spring 上下文:Spring-content.xml保存了Spring相关功能的配置信息,在项目启动时系统会自动读取该文件实现Spring的初始化。Spring-content中可以配置许多功能,例如事务的管理,字符的设置,字段的校验,异常的管理。

(3)Spring AOP:除了IOC之外,Spring还提供了另一个强大的功能:AOP。Aop被称为截断器,用于在配置的方法执行前或执行完成时对其进行特定的操作。利用aop,我们将系统中的核心业务和一些通用的业务分割来,可以很容易的实现日志,事务的管理。减少了代码的冗余,将核心代码和相关代码分隔开来。

 2.3 Spring MVC 框架介绍

Spring 的 Web MVC 框架的核心是分发器,当用户传入一个请求时。分发器调用相应的执行程序处理被分派的请求,同时,SpringMVC还具有其他功能包括地址映射,视图分析,参数的校验,文件的下载上传等。所有的请求入口都使用Controller注解来表示,相应的方法使用@RequestMapping注解来响应请求。SpringMVC的体系结构如图2.2所示。

39ff2c5fbe5f9590eb41afee40271162  图2.2 Spring体系结构

spring-mvc共用七各组件,用来实现客户端发出http请求到服务器在返回数据的一系列流程。

(1)DispatcherServlet:前端控制器

当用户请求抵达前端控制器后,前端控制器就作为mvc模式中的controller,DispatcherServlet作为整个流程的控制中心,它会调用其它组件执行用户的请求,使用分发器可以大大减少组件之间的耦合程度。

HandlerMapping:处理器映射器根据用户不同的请求,处理器映射器会找到相应的处理器,在springmvc中,我们可以使用配置文件方式,实现接口方式,注解方式等不同的方式完成不同的映射。

Handler:处理器相对于前端控制器,Handler的角色定位是后端控制器,在前端控制器的作用下,不同的url会有不同的Handler处理用户的具体请求。而Handler一般是有程序员根据具体的业务进行开发,因为具体的业务处理是千差万别的。

(4)HandlAdapter:处理器适配器

由于前端控制器无法识别处理器的类型,所以我们需要使用HandlerAdapter对处理器进行执行,通过扩展适配器可以执行更多种类的处理器。

(5)ViewResolver:视图解析器

ViewResolver的作用是将处理结果转换成View视图,首先视图解析器会将逻辑视图名转换成物理视图,也就是具体的页面,然后生成视图对象,最后渲染Views视图,给视图加样式后将最终的页面传给用户。

View:视图我们可以在SpringMVC中使用很多种类型的视图,包括:html、jsView、xml等。而jsp是我们使用最多的视图种类。一般来说,视图是需要参与元根据具体的业务进行具体的开发的,因为不同的业务需要提供不同的页面。

  三、需求分析

  3.1可行性分析

可行性分析是企业级应用开发流程中必须要执行的步骤。在进行正式开发前,需要对开发中可能出现的问题进行预测,对实现本项目需要的成本以及项目完成后对酒店带来的收益进行评估。尤其是在竞争日益激烈的酒店行业,一个进展到一半却发现无法完成的项目,或者是一个无法给酒店带来收益的项目,将会给酒店带来巨大的损失。因此,本节将从技术、操作、经济这三方面对系统进行可行性分析。

(1)技术可行性

本系统涉及的技术都是非常成熟并被广泛使用的。首先j2ee,mysql都是非常流行的开发工具,易于开发,跨平台,可以在不同类型的计算机上使用,ssm框架封装了持久层、业务层和视图层,极大的提高了开发的效率;其次本系统面向的是中小型酒店,tomcat完全可以满足服务器的功能,由于用户量不是特别的大,数据库使用的是mysql,体积小、灵活性好、免费,非常适合数据量不是很大的企业使用。而且本系统开发周期较短,所需人数少。所以在技术上是可行的。

(2)操作可行性

本系统为了提高酒店员工的工作效率,提供的非常易于使用的交互界面,不需要进行复杂的操作即可完成酒店日常的业务,日常操作只需几步就可以完成。对于不同的角色设置了不同的权限,防止产生误操作。对酒店的操作都会保留记录,若出现问题可以快速找到问题。对系统流程中的关键业务都使用了提示框进行提醒,对异常的操作进行警告。因此本系统非常容易上手,对用户的友好度高,在操作上是可行的。

(3)经济可行性

本项目的成本主要包括软件的开发费用和开发后少量的维护费用,收益为在使用本系统后,酒店的业务能够得到及时的处理,较少了员工的培训成本和出错产生的经济损失,吸引更多的客户进入酒店,并能方便的查看酒店的经营状态,对酒店的经营策略进行对有效的调整。所以本系统在经济上也是切实可行的。

3.2 性能分析

一个系统,除了在功能上需要满足需求以外,性能上的优化也是至关重要的。一个需要等待很长时间的功能将极大的降低酒店人员的工作效率,一个不稳定,在高压情况下可能产生宕机的系统将会给酒店造成极大的经济损失。因此,本节从性能上对系统进行分析。

可移植性本系统使用JAVA语言进行编写,而JAVA本身依托于JAVA虚拟机,具有很高的移植性。本系统可以直接在windows、linu、 mac等系统上运行,不需要在环境变更时进行额外的代码开发,极大的提高了代码的生命周期。

安全性作为酒店管理系统,信息中可能包含企业内部的私密信息以及关于财务上的一些资料。因此本系统使用者登录时必须进行时身份认证,对不同的角色设置权限使其只能使用自己管辖内的功能,并且将系统中所有的操作记录在日志中,以提高系统的安全性。

易用性本系统具有简洁的用户界面,能使员工能快速掌握系统的使用,使管理员非常容易的查看关于酒店经营的信息。要求对系统的操作要简便,减少在操作上可能出现的纰漏,增加工作的效率。管理员可以通过本系统方便的查找房间信息,客人信息,经营状况等相关信息,并可以对数据进行多种方式的统计和查询,方便管理者对酒店进行管理,提高管理的灵活性。

稳定性首先本系统需要保证在代码上没有任何功能性bug,然后需要本系统在任何情况下,包括大数据量处理,特殊的输入字符,都能让功能正常执行,而不会出现时好时坏的情况。在性能上,需要在电量,体积,内存上都能符合需求,任何功能的相应时间都控制在500ms以内。

 四、系统总体设计

  4.1系统功能结构设计

本系统功能主要包括三大模块,涉及酒店管理的各个方面。前台接待模块负责酒店日常的运营,实现客人的预定、入住、结账等业务;后台管理模块主要负责对酒店的房间,房价,房型进行管控,对客人的信息和订单进行分析生成报表,提高对酒店的管理效率;系统管理模块主要负责用户的登录、登出、修改密码,实现本系统基本的安全性。具体的系统功能如图4.1所示。

e9246d0dc5a3860b895a0fbb9c60cc35  图4.1 系统功能结构图

 4.2 系统功能模块设计

本节主要从业务上对功能进行阐述,使用简单直观的流程图对功能的逻辑进行梳理,描述每个功能在系统中发挥的作用及使用的场景。

 4.2.1 系统管理模块设计

本模块是任意一个企业管理系统都具备的基础模块,用于实现用户的登录、登出、和修改密码。保证系统的安全性,防止信息被其他人员窃取和破坏。

(1)登录功能设计

使用登录功能可以判断使用本系统的用户是否是合法用户,若用户名和密码全部正确,则可以使用系统内的功能,否则不允许其进入系统。这样可以防止非酒店员工进入系统进行非法操作。登录流程图如图4.2所示。

a31559ca1e187357641df5991a50e419  图4.2登录流程图

(2)修改密码功能设计

用户在成功登录系统后,可以根据原密码重新设置一个新密码,新密码需要输入两遍,设置完成后需要重新登录,此功能可以提升系统的安全性,防止密码被他人窃取后破坏系统。修改密码流程图如图4.3所示。

f36306207af7ebc9db703a2ffb82af74  图4.3 修改密码流程图

(3)退出系统功能

系统使用者在使用完系统后,可以退出系统,若要重新使用系统,必须再次输入用户名和密码,该功能可以保证系统安全性,消除在使用完系统后被别人使用的风险。交接班的时候也可以用来作为切换账号的功能使用。

dcb7955055e6c0aee4b619dc6a405a71  图4.3 退出系统流程图

 4.2.2 后台管理模块设计

本模块一方面实现了房间、房价、房型的配置,管控酒店经营中的核心数据,另一方面实现了订单、客人信息、报表展示。方便管理者及时了解酒店的经营状态,对经营的方案进行调整。接下来阐述各个功能的设计。

(1)客人管理功能设计

系统可以对入住酒店的客人的信息进行管理, 主要包括一下方面:获取当前入住的客人信息以方便进行酒店相关服务;将所有入住过酒店的客户的信息保存起来,用于业务扩展;将保存的客户信息做成通讯录的形式,可以进行增加,修改,删除。客户管理流程图如图4.4所示。

7a4f0d92735b731f2f20cf025e4b6fa5  图4.4 客户管理流程图

(2)房型管理功能设计

基本上所有的酒店都会提供不同类型的客房来满足不同客户的需求,酒店除了提供基本的类型如单人间,双人间,也可以在节日或各种活动期间添加特殊的房间类型,将已有的房间类型改成不同的名字,或删除酒店不再使用的房间类型。本系统可以让管理员管理酒店的房间类型,包括类型的添加,修改,删除。房型管理流程图如图4.5所示。

c0119679f7cfd4485159194e1201e082  图4.5 房型管理流程图

(3)订单管理功能设计

在预定,入住,结账的时候都涉及到订单的添加和修改,除此以外,本系统会专门提供一个功能模块,对酒店的所有订单进行管理,包括查询某一时间段的所有订单,根据订单号查询订单等功能,也可以对任意订单进行删除和修改。极大里方便了酒店工作人员对酒店的账目进行管理,对财务上出现的纰漏进行及时的处理。订单流程图如图4.6所示。

d457107a8e845b06bd7c52acda401311  图4.6 订单管理流程图

(4)客房管理功能设计

客房管理可以通过房间号来查询各个房间的基本情况和配置信息,同时可以对房间信息进行修改,添加新的房间,删除不再使用的房间,便于对酒店进行管理。房间管理流程图如图4.7所示。

06468973852f96e7649d3e4a4b7a134b  图4.7 房间管理模块流程图

(5)报表功能设计

为了方便酒店管理者了解酒店的经营现状,对今后的运营进行统筹规划,本系统可以按月生成酒店的报表,提供酒店月盈利金额,酒店房间出租率,酒店各个时间段入住数量等数据。报表流程图如图4.8所示。

1fbaa5ff410d0efa88c00f4f4a85cf9e  图4.8 报表管理流程图

 4.2.3 前台接待模块设计

本模块主要包括预定,入住,结账等面向客户的功能,用于实现酒店日常的经营,提高前台接待人员的工作效率。接下来对模块中的各个功能进行设计。

(1)预定功能设计

预定房间可以让客人提前订房以防止在需要入住的时候订不到房间,客户只需要提供本人身份证即可,前台服务员根据客人预订的时间查看房态,让客人选择房间,再根据生成的费用收取押金。系统自动会生成订单并把该房间设置成已预订状态。预定流程图如图5.6所示。

dba030a86e7180568d41fdadf4497791  图4.9 预订流程图

(2)入住功能设计

本功能是客人进入酒店所必须办理的手续,已经预定过的客户直接凭身份证号即可入住,未预定的客户除了提供身份证以外还需要选择房间,并支付押金,在客户办理好入住手续后系统都会生成相应的订单,并且将客人信息添加到正在入住客人的名单中。

入住流程图如图4.10所示。

3c56ba730bc77e6db44ea8ba0980d6ba  图4.10 入住功能流程图

(4)结账功能设计

本功能是客人离开酒店前的最后一道程序,接待员只需要客人的身份证就可以对相应的房间做退房处理,然后退还押金,操作十分简便。结账流程图如图4.11所示。

58423f6e18edc923487d3e43b8edbdbb  图4.11 结账模块流程图

 4.3 数据库设计

本节主要介绍数据库中使用到的实体、实体的属性、实体之间的关系。在数据库设计中,ER模型主要用来对现实世界的事物进行抽象,本节首先从功能设计、业务流程方面介绍为什么这样设计。 然后从字段的命名、数据类型的选用、约束和主键设置描述数据在数据库中的具体保存形式。总体的er图如图4.12所示

f72d22dc870f0cef24c65c59bcec9fd5  图4.12 总体ER图

(1)用户表

字段名 名称 数据类型 非空 主键
user_id 用户id Integer
user_name 用户名 Varchar(32)
user_pwd 用户密码 Varchar(32)

图4.13 用户表

用户表用于描述使用本系统的用户,在用户登录、修改密码、登出等功能使用到。

包括三个属性即id, 用户名,用户密码。id 属性作为该用户的标识符,用户名和密码作为用户登录系统时的判断条件。字段的命名都以“user”开头,表明是用户表中的字段;主键id为自增字段所以设为整型,用户名和密码一般都不会太长所以设为32位的字符类型。本表中的三个字段都不能为空。

(2)字典表

字段名 名称 数据类型 非空 主键
dic_id 字典id Integer
dic_type 字典种类 Varchar(32)
dic_code 字典编码 num(2.0)
dic_name 字典名 Varchar(32)

图4.14 字典表

字典表用于描述其他实体中的一些配置信息。一般来说,人的性别,婚否,状态等配置信息我们都不会用具体的描述,而是会用0,1来表示。一来0,1比字符消耗更少的内存,减少了数据库的存储压力,二来在进行修改、扩展时会更加灵活。一般我们将这种表称为字典表。

本模型包括4个属性即id,字典种类,字典编码,字典名。Id是对每一项配置信息的唯一标志,字典种类主要用于描述是何种配置信息,字典编码一般都为0,1等数字,字典名为字典编码对应的具体描述。通常其他表中的配置信息都为字典编码,而界面中显示的是字典编码对应的字典名。

字段的命名都以“dic”开头,表明是字典表中的字段;主键id为自增字段所以设为整型,字典编码一般为0、1所以设为2位的整型就足够了,字典种类和字典编码都为具体的描述所以设为32位的字符型;本表中的所有字段都不能为空。

(3)房间种类表

字段名 名称 数据类型 非空 主键
room_type_id 房间种类id Integer
room_type_name 房间种类名称 Varchar(32)
room_type_remark 房间种类备注 Varchar(200)

图4.15 房间种类表

房间种类表用于描述房间的种类,在房间类型管理功能中使用。

本模型包括3个属性即id,种类名称,种类备注。Id作为房间类型的唯一标志,种类名称顾名思义,种类备注为房间种类的介绍。

字段的命名都以“room_type”开头,表明是房间种类表中的字段;主键id为自增字段所以设为整型,房间种类名称一般不长所以设为32位的字符型即可,备注字段需要保存很长的一段对房间的介绍所以设为长度为200的字符型;本表中的所有属性都不能为空。

(4)客人表

字段名 名称 数据类型 非空 主键
guest_id 客人id Integer
guest_name 客人姓名 varchar(32)
guest_id_card 客人身份证 Varchar(18)
guest_phone 客人电话 Varchar(60)
guest_sex 客人性别 Num(2,0)
guest_age 客人年龄 Num(2,0)

图4.16 客人表

客人表用于描述入住酒店的客人,在客人信息管理、查看房间客人等功能使用到。同时,客人信息是业务扩展中使用频率最高的信息,将客人的信息保存在数据库中是任何一个系统都必须要做的事情。

本模型包括5个属性即id,姓名,性别,身份证,电话,年龄。Id为客人的唯一标志,姓名、性别、年龄为客人基础信息,身份证和电话是办理酒店业务时必须要提供的信息。

字段都以“guest”开头,表明是客人表中的字段;主键id为自增字段所有设为整型,客人姓名一般不会太长所以设为32位长的字符串,身份证固定长度所以设为长度为18的字符型,性别和年龄都不会用超过100的数字表示所以设为2位长的整型;除性别、年龄外其他字段不能为空。

(5)事务表

字段名 名称 数据类型 非空 主键
affair_id 事务id Integer
room_id 房间id Integer
room_state 房间状态 Num(2.0)
start_time 开始时间 dateTime
end_time 结束时间 dateTime

图4.17 事务表

事务表用于描述预定,入住,退房等会改变房间信息的时间。与其他系统不同,酒店系统中每个房间在不同的时间会用不同的状态,而房间表只表示房间的基本信息且只每个房间记录只能保存一个状态。在查询某个时间的房态时会产生问题。为了满足业务需求,也为了保持表的单一职责,我们增添事务表用于存储修改房间状态的事件信息。在查询房态时只需联查事务信息和房间信息就可以房态信息。

本模型包括5个属性即id,房间id,开始时间,结束时间,房间状态,id作为事务的唯一标志,房间id为事务中房间的标志,然后是事务的开始时间和结束时间,房间状态用于描述该时间段内该房间所处的状态

本表中字段不会和其他表中的字段产生混淆,所以字段名不以表名开头;主键事务id和外键房间id都为自增数字所以设为整型,房间状态以0、1表示,用2位数字表示即可,开始时间和结束时间都要精确到分秒所以用dateTime而不是用date表示;本表中的所有属性都不能为空。

(6)订单表

字段名 名称 数据类型 非空 主键
order_id 订单id Integer
room_id 房间id Integer
order_guest 入住客人 Varchar(100)
arrivial 抵达时间 Datetime
departure 离开时间 Datetime
order_state 订单状态 Num(2.0)

图4.18 订单表

订单表用于描述酒店运营中产生的订单,主要在订单管理、财务报表功能中使用到。值得注意的是,本系统中一个被订的房间对应一张订单。

本表包括6个属性,房间id为订单对应房间的标志,客人id为入住才此房间的客人标志,抵达时间、离开时间、订单金额都是订单实体必要的属性。

本表易于其他表产生混淆的字段都以“order”开头;主键id和外键房间id都为自增数字,所以设为整型,入住客人可能有多个所以将客人的身份证拼接成字符串存放在该字段中,设为100长度的字符串型;订单状态用0、1表示用2位的数字表示即可;本表的所有字段都不能为空。

(7)房间表

字段名 名称 数据类型 非空 主键
room_id 房间id Integer
room_no 房间号 Varchar(32)
room_price 房间价格 Decimal(7,2)
room_state 房间状态 num(2,0)

图4.19 房间表

房间表用于描述酒店业务中的房间。房间实体是本系统的核心实体,在预定,入住,房态查询,结账等关键功能中都会使用到。

本表包括4个属性即id, 房间号, 房间状态,价格,id为房间的唯一标志,房间号、价格顾名思义,房间状态默认为可入住,其余房间状态都保存在事务表中。

本表中所有字段都以“room”开头,表明是房间表中的字段;主键id为自增数字所以设为整型,房间号一般为3-5位字符可能会添加一些修饰名词,设为32位长的字符型,价格设为总长度7位,小数点后两位的整型,房间状态用0、1表示所以使用2位长数字表示即可;本表中所有字段都不能为空。

  五、系统实现与测试

本章主要对酒店管理系统进行代码的开发和测试。完成功能的实现,检验系统在功能上是否已经完成了需求,发现系统在功能、代码、性能上可能存在的问题。首先,本节对每一个功能都从代码的角度进行梳理并放置核心的代码,然后从不同的情景进行测试,列出测试结果。最后展示了该功能的页面截图。

5.1 系统管理模块实现与测试

(1)用户登录

在login.jsp界面输入用户名和密码,点击登录将username和password这两个参数传入后台 ,首先根据username到user表中数查找是否有该用户名,如果没有则返回用户名错误,若存在则返回查询到的用户对象。然后判断password与返回的该用户名的密码是否相等,若密码不相等,则密码错误,若用户名和密码都检测成功则进入main.jsp页面,将用户的id保存到session中,否则仍停留在login.jsp页面并要求其重新登录。

代码:

Map<String,String> resultMap = new HashMap<String,String>();

User user = userMapper.SelectUserByName(userName);

if(user==null) {

resultMap.put(“error”, “用户名不存在”);

}else if(!user.getUserPwd().equals(password)){

resultMap.put(“error”, “密码错误”);

}

测试结果描述:

测试情景 结果
用户名输入不正确 界面提示:该用户不存在
用户名正确但密码不正确 界面提示:密码错误
用户名和密码都正确 登录成功,跳转到系统主页面

表6.1 用户登录测试结果

界面截图:

图6.1 登陆界面截图

b5ba0a55cc360c5e1e7d5fbe9ef70000  修改密码changePwd.jsp界面传入oldpassword和newpassword这两个参数,首先获取session中的用户ID,根据用户ID到user表中查询该用户信息,判断查到的密码是否与输入的原密码是否相同,然后判断两次输入的新密码是否一致,若都相同则将新密码更新到用户表中,修改完密码后跳转到login.jsp界面以验证新密码,若期间数据不匹配提示修改密码错误并留在密码修改界面。

代码

User user = userMapper.SelectUserById(id);

if(oldPassword.equals(user.getUserPwd())) {

user.setUserPwd(newPassword);

userMapper.changePwd(user);

}

测试结果描述:

测试情景 结果
原密码输入不正确 界面提示:请输入正确密码
新密码两次输入不正确 界面提示:两次密码输入不一致
原密码和新密码输入都正确 跳转到登陆界面进行重新登陆

表6..2 修改密码测试结果

界面展示:

图6.2 修改密码界面展示

0f0d9fe67ca4d226d52da632136a7066  (3)退出系统实现和测试

点击‘退出系统后’,系统会提示让其确认是否退出。确认后,后台删除用户session,并将页面跳转到登录界面,否则仍留在原来的界面。

代码:

if(isQuit) {

request.getRequestDispatcher(“login.jsp”).forward(request, response);

}

测试结果描述:

测试情景 结果
确认退出时点击否 仍停留在本界面
确认退出时点击是 跳转到登陆界面

表6.3 退出系统测试结果

界面展示:

9836cfecbb063501baff9ce1f5eddc20  图6.3 退出系统页面展示

6.2后台管理模块实现与测试

(1)客人管理

获取当前酒店客人的信息,需要根据当前时间查询affair表中的记录,将记录中的客人身份证信息放入List中,然后遍历list,根据List中的ID从客人信息表中获取数据并返回。保存所有入住过酒店的客人的信息,需要在办理入住时,前台输入入住客人信息时,先判断该客人id在guest表中是否已经存在,若没有则在guest表中添加记录。管理客人的信息,只需要对guest表进行增删改查操作即可。

代码:

boolean hasThisGuest = guestMapper.selectGuestById(guest.getId())!=null;

If(hasThisGuest) {

return ResultHandle.getResultMap(“error”, “客人已存在”);

}

int result = roomMapper.addRoom(room);

测试结果描述:

测试情景 结果
将客户信息输入表单并提交 界面提示:添加用户成功
点击‘详情’按钮 跳转到用户详情界面
修改客户信息并提交 界面提示:修改用户信息成功
点击‘删除’按钮 界面提示:是否确认删除?

表6.4 客户管理测试结果

界面展示:

7d5e0e205c409bbeea92da166feb3c9d  图6.4 客户管理流程图

(3)房型管理

首先在roomTypeManager.jsp页面,系统会查询room_type表将所有可用的房型返回到房型管理页面,然后当管理员添加一个房型时,将roomTypeName输入后,后台会先检测room_type表中该房间是否存在,若存在则不能添加。在修改和删除房型时,后天首先到affair表中查询该房型是否存在,若存在则说明有人正在使用该房型,系统提示不能删除和修改,否则直接删除或修改房型表中该房型对应的记录。

代码:

int result = roomTypeMapper.deleteRoomType(RoomTypeID);

if(result!=1) {

resultMap.put(“error”, “删除失败”);

}else {

resultMap.put(“success”, “删除成功”);

}

测试结果描述:

测试情景 结果
添加已存在房型 界面提示:该房型已经存在
添加不存在的房型 添加成功后跳转到房型主页面
删除房型 界面提示:是否确认删除
修改房型 修改成功后跳转到房型主页面
查询房型 房型主页面显示所有房型信息

图6.5 房型管理测试结果

684d195c79b5ea9e632ca9ba179d78ef  图6.5 房型管理界面展示

(3)客房管理

本模块实现的是对room表的增删改查,在删除和修改时需要检查该房间是否在affair表中存在,若存在则说明该房间正在被使用,系统提示无法删除。

代码:

boolean isInUse = affairMapper.selectAffair(roomID)!=null;

if(isInUse) {

return ResultHandle.getResultMap(“error”, “添加失败”);

}

int result = roomMapper.deleteRoom(roomID);

测试结果描述:

测试情景 结果
输入时间点击查询 返回该时间段酒店房态
添加重复房间并提交 系统提示:该房间已存在
删除正使用的房间 系统提示:该房间正在使用中无法删除
修改正使用的房间 系统提示:该房间正在使用中无法修改
添加新的房间 添加成功并跳转到房间管理页面
删除不在使用的房间 删除成功并跳转到房间管理页面
修改不在使用的房间 修改成功并跳转到房间管理页面

表6.6 房间管理测试结果

界面展示:

14f83b1866f838d93199d41baacbcf83  图6.6 房间管理界面展示

(4)业务表报

查询月营业额时,后台根据设置的时间查询order表中对应的订单号,将所有的订单对象放入list中,对其进行遍历,将同一个月订单的订单金额相加,组装成一个key为月份,value为总金额的Map返回。查询房间出租率时,后台查询房间表和订单表,分别计算该时间段内订单对应房间的数量和房间表中的总数,两者相处得到出租率,最后返回一个键为时间,值为出租率的Map.然后将orderConsumeMap和 roomRentRatMap 这两个Map组装返回。

代码:

List<Order> orderList = orderMapper.selectConsumeByTime(Date startTime,Date endTime)

Map<String,Integer> orderConsumeMap = getConsume(orderList);

Map<String,String> roomRentRatMap = getRoomRent(orderList);

return Build(orderConsumeMap,roomRentRatMap);

测试结果描述:

测试情景 结果
输入时间并查询 显示该时间段的企业报表

图6.7 报表功能测试结果

界面展示:

d608d86e439e1f3235e8bfbba9f3c5c3  图6.7 报表管理界面展示

(5)订单管理

点击订单管理界面后,后台根据startTime和endTime和查询订单表并将结果放入List中返回页面。输入订单号后点击查询,后台根据订单号查询order表并返回相关记录。点击订单旁边的修改和删除按钮,后台根据ID对order表中的相应记录进行修改和删除操作。

代码:

int result = orderMapper.updateOrder(order);

if(result!=1) {

resultMap.put(“error”, “修改失败”);

}else {

resultMap.put(“success”, “修改成功”);

}

测试结果:

测试情景 结果
输入时间点击查询 显示该时间内的订单
点击详情 跳转到订单详情页面

表6.8 订单管理测试结果

界面展示:

图6.8订单管理截图

2748bf6fe779e210681bbf37f0e2933c  6.3接待业务模块实现与测试

(1)预订

在recetption.jsp将预定时间作为参数传入,后台根据时间查询rooom表和affair表,将该时段可以预定的房间类的集合传到前台,然后选择房间后,将房间的ID集合传入后台,在房间表中查询房间的价格,每一个房间生成一个订单类,遍历这些订单类生成订单的总价,将订单的状态设置为预定。

代码:

guestMapper.addGuest(guest);

Room room = roomMapper.selectRoomByNo(roomNo);

int dateDiff = DateUtil.getDateDiff(arrival, departure);

double consume = room.getRoomPrice()*dateDiff;

orderMapper.addOrder(order);

affairMapper.addAffair(affair);

测试结果描述;

测试情景 结果
输入房间和预定人信息 跳转到预定页面,显示订单信息
点击预定 系统提示:预定成功

表6.6 预定测试结果

界面展示:

485d6a1b7571b09d0abc287a93a443bf  图5.12 预订界面展示

(2)入住

首先判断客人是否已经预定,若已经预定,后台根据预定人的身份证号到事务表中查询相应的预定记录,若存在则将将对应的房间号返回,然后添加每个房间的客人信息,每一个房间的生成一个记录,并将订单状态设置为已入住。若客人没有预定,则首先查询房间表和事务表将可以入住的房间返回让客人选择,然后录入客人信息,若客人表中存在则无需录入,若不存在 则在客人表中添加一条记录。最后将房间号和对应客人信息组装成订单对象,设置订单状态为已入住并保存在订单表中。

代码:

if(!hasReservation) {

this.reservation(reservationMap;)

}else {

orderMapper.addOrder(order);

affairMapper.addAffair(affair);

}

测试结果描述

测试情景 结果
输入预定人信息 直接跳转到订单界面,显示订单信息
输入房间和客人信息 跳转到订单界面
点击入住 系统提示:入住成功

表6.7 入住功能测试结果

界面展示

ac10ca53b8017c5e53d0b87715ca2ba0  图6.7 入住界面展示

(3)结账

前台传入客人的身份证号,后台在事务表中查询当天退房该id所对应的记录,根据事务表中的订单号查询订单表,将订单的金额返回到前台,收取费用后,点击确认退房,数据库中将该订单的状态改为已结账,将事务表中该事务删除。

代码:

for(String roomNo:roomNoList) {

Room room = roomMapper.selectRoomByNo(roomNo);

Order order = orderMapper.selectCheckOutOrder(time, roomId);

order.setRecordStateCode(0);

orderMapper.updateOrder(order);

affairMapper.deleteAffair(affairID);

}

测试结果描述:

测试情景 结果
输入错误房间号 系统提示:该订单不存在
输入正确房间号 系统提示应收取金额
点击“确认” 结账成功跳转到主页面

表6.8结账功能测试结果

界面展示:

图6.8 结账界面展示

50cff88b6337d62efc48ae0dbb58ef58  6.4 性能优化

一个优秀的程序,必须要确保在可读性、正确性、健壮性、时间消耗、空间消耗上表现优异,上文的测试主要检测了系统在功能和界面上能否正常使用,而无法发现内部代码的不足。本节主要以代码角度,从数据结构,线程管理,数据库优化等方面对系统的性能优化进行阐述。由于篇幅有限,只列出其中一些部分。

所有的HashMap(哈希表),ArrayList(线性表),LinkedList(链表)都根据具体业务设置了初始容量,防止数据量大时集合出现多次扩容,在表结构重建上产生太多的消耗。在循环中不进行变量的创建,而是在循环外创建在循环内实体化;在循环中不进行数据库操作,而是从数据库中把多条数据一次性取出,在循环中只进行数据处理;所有的集合都在循环外创建,在一次循环中使用完后调用clear()方法作为一个新的集合在下一次循环中使用。所有这些操作都是为了避免在循环次数过多的情况下造成资源过多的消耗。在对数据流进行处理时,比如把所有未入住的房间的价格调高10%,把所有订单用switch-case分类,我们使用parallelStream()代替Stream(),将串行处理设置为并行处理,极大的提高了数据处理的效率。在数据库表中,在那些使用频繁且选择性好的列上添加索引,设置复合索引时把这些列排在前面,减少视图、触发器的使用,这些操作都增强了数据库查询的效率。在数据库语句编写上,使用了or代替union,将jion改为not exists,用with as 去除多次扫描等操作,提高了特定情况下的数据库性能。

 6.5问题总结

由上节测试结果可知,本系统已基本完成所需功能,足以应付酒店的日常运营。但由于时间有限及个人水平不足,本系统还存在以下不足:

(1)界面不太美观:本系统界面使用Bootstrap进行开发,由于项目侧重于功能上的开发,本系统界面上只使用了Bootstrap提供的表格,菜单栏,表单,提示框等基础组件,不同功能的表格使用的是同一套样式。界面可以将数据的清晰地展示给用户,虽然简洁但谈不上精美。

(2)未使用缓存:本系统界面上展示的所有数据都是从数据库中提取的。缓存可以将获取的数据暂时保存起来,减少系统到数据库调用的次数。对于当日房态,在住客人这些短期内不变但经常需要查看的信息,若不使用缓存,会造成服务器的压力过大,影响系统的稳定性。

(3)系统过于本地化:本系统主要适用于中小型酒店的管理,所以功能都只在本地系统执行。没有提供网络化、平台化的服务如 在线预约,手机支付,在线查房等功能。虽然本系统已经足够中小型酒店满足日常的运营的需求,但在移动互联网如火如荼的发展下,本系统显得略微低级和简陋。

五、总结

本系统设计并实现了一个基于J2EE的酒店管理系统,使用了MyBatis,Spring,SpringMVC三层框架,设计了前台接待、后台管理、系统管理三大模块,实现了预定、结账、房态、订单等一系列功能,满足了酒店日常经营的需求。在系统实现上,从底层的sql语句编写,到业务层的数据逻辑处理,再到视图层jsp界面的编写都由本人独立完成。在老师的指导下做了一些改进,添加了事务表,查询房间状态时只需要将客房表和事务表中该时间段的事务联查即可。既提高了查询的性能,也降低了表与表之间的耦合度。由于时间有限,本系统仍然存在很多的不足,比如没有在系统中加入缓存,增加了服务器的压力;只实现了利润和出租率的报表,对酒店经营状况的展示有限。

参考文献

[1] 耿祥义.《JSP基础编程》 清华大学出版社.2004. 55-162.

[2] 孙鑫. 《JavaWeb开发详解》 电子工业出版社.2006.50-100.

[3] 萨师煊,王珊.《数据库系统概论》.北京:高等教育出版社,1998

[4] 张洪斌 .《Java2高级程序设计》 中科多媒体出版社.2001.85-9

[5] [美]Bruce Eckel 《Java编程思想》 机械工业出版社 2005-9

[6] 沃尔斯. 《Spring in Action》 人民邮电出版社 2006-3

[7] [美]尼古拉斯·泽卡斯. 《JavaScript高级程序设计》(第3版)2012-3-29

[8] [美] Joshua Bloch. 《Effective Java》 机械工业出版社 2009-1-1

[9] 杨开振. 《Java EE 互联网轻量级框架整合开发》 电子工业出版社 2017-7

[10] 许川佩,张民. 《基于Ajax的J2EE安全应用框架》 计算机工业出版社 2010

[11] 王宜贵. 《软件工程》 机械工业出版社 2012:20-79

[12] 赵亚娟. 计算机软件JAVA编程特点及其技术研. 数字技术与应用,2016,01:113.

[13] Martin Ngobye Computing Static Slice for Java Programs.2012

[14] Joshua Bloch.Effective Java Programming Language Guide.Addison-Wesley

[15] Buell.Data structures using Java. Jones&Bartlett Learning.2013

[16] Metsker S J.Java设计模式.第二版.电子工业出版社.2012

[17] Kathy.Head First Java,2nd Edition.O’Reilly Media.2005

致谢

在这次的毕业设计中得到了很多人的鼎力相助。尤其感谢老师给我提供的宝贵建议,帮助我完成毕业论文的撰写,在他的指导下让我对论文的脉络有了清晰的了解,然后一步步完成了酒店管理系统的开发和实现。在代码的开发过程中,感谢同学和我一起讨论技术上遇到的难题,提供不同的解决方案,让功能可以有效的运行。再次感谢此次论文设计过程中帮助过我的所有人,让我少走了很多弯路,学到了很多知识。

在大学生涯结束之际,同时也感谢这四年中老师和同学的陪伴。为我制定大学生涯规划,教会我相关的知识技能,最后衷心的祝愿南京信息工程大学的师生身体健康,生活幸福。

基于J2EE酒店管理系统设计与实现

基于J2EE酒店管理系统设计与实现

价格 ¥9.90 发布时间 2023年8月18日
已付费?登录刷新
下载提示:

1、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“文章版权申述”(推荐),也可以打举报电话:18735597641(电话支持时间:9:00-18:30)。

2、网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。

3、本站所有内容均由合作方或网友投稿,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务。

原创文章,作者:1158,如若转载,请注明出处:https://www.447766.cn/chachong/161418.html,

Like (0)
1158的头像1158编辑
Previous 2023年8月18日
Next 2023年8月18日

相关推荐

My title page contents