Java项目开发(航空管理系统)
主要内容:
1.此项目所需的准备事项
1.1 数据库的准备
基于提供的SQL语句,请参照考试要求创建名为session1的新数据库于Navicat环境中。随后,请将构建的数据表插入到新查询中,并执行这些指令直至构建的数据表成功执行。建好的表如下图所示:

图1-1 创建好的表格
1.2 项目创建
启动Eclipse后,在菜单中选择File选项并新建一个Dynamic Web Project项目;随后,请根据题目要求为该项目命名为SunshineAirlines

图1-2 创建好的项目
1.2.1 JAR包
1.2.1.1 JAR包的概念
Jar即为Java Archive File这一名称,并属于Java文档格式之一。类似于我们在常见场景中见到的.rar和.zip文件末尾的形式。而Jar包则包含了一系列可供访问的方法入口。
1.2.1.2 如何导入JAR包
请将试题中的JAR包拷贝并放置于项目应用的WebContent目录下WEB-INF层级中的lib文件夹内。如图

图1-3 JAR包的存放位置
1.3 Eclipse中tomcat服务器的运行配置
如下图所示,在项目设置中依次执行以下操作:首先单击Properties按钮,在搜索栏中输入Targeted Runtimes以定位相关配置项。随后创建一个新的Tomcat服务实例,并选择合适版本后单击完成按钮以开始配置流程。请参考下文中的详细操作步骤,在服务器界面中找到类似于超链接的设置项并进行下一步操作

图1-4 tomcat配置过程

图1-5 tomcat配置过程

图1-6 tomcat配置过程

图1-7 tomcat配置过程

图1-8 tomcat配置过程
1.4此项目的五层结构的作用
1.4.1Servlet层
在浏览器与服务器之间起到中介作用的servlet,在其运行过程中能够获取浏览器所发送的数据信息,并将其传输至服务器端完成一系列处理任务
1.4.2Service层
服务层有时也被称作业务层,其主要功能是整合一系列操作,并将多种操作整合在一起。
1.4.3 Dao层
Data Access Layer(简称DAO)通常被称为Dao层,在数据库系统中扮演着关键角色。它主要涉及基本的数据操作,并负责实现对数据库中某一张表或某一实体的增删改查操作。
1.4.4 Pojo层
类似于JavaBean的是Pojo层,在功能上实现了将数据进行封装的能力,并且实现了业务逻辑与展示逻辑的分离。这使得整个系统的开发复杂度得到了显著降低。
1.4.4 Mysqlhelper层
MySQLHelper本质上是项目运行所需的必要准备。具体而言,在MySQLHelper层中实现了与数据库之间的连接,并制定了确保后续操作更加便捷和高效的接口方法。例如,在实际应用中我们可以利用该层来完成插入、删除、更新和查询等基本功能。
1.4.5 helper层的实现
1.4.5.1 通过JDBC与数据库建立连接
在开始操作之前,我们需要配置必要的连接参数。其中最为关键的是获取到与数据库建立连接所需的URL地址,并注册所需的驱动程序。 userName和password分别代表了用户名以及相应的密码。这些信息将帮助我们准确地访问指定的数据库名称及其相关设置。以上是为了确保后续操作能够顺利进行。

初始化工作已从图1-9中得以实施。在类的静态代码块中进行驱动注册,从而确保驱动能够顺利地完成注册过程。即使程序出现某些异常情况也不会导致驱动无法成功 registration,由于静态代码块是在类创建时就被执行了的原因。接下来通过DriverManager以及预先配置好的连接参数来建立与目标数据库之间的连接关系

图 1-10 注册驱动,建立连接
1.4.5.2对数据库中的元素进行增删改处理
1.4.5.2.1 三个初始化的对象
1.4.5.2.1.1 Connection
在软件系统架构中,“Connection对象”也可用于实现与目标数据库之间的通信关系;同时,在实际应用开发中,“Connection对象”也可被看作是特定业务逻辑的核心载体。这些对象的主要职责就是为用户提供完整的事务处理支持,并在数据存取操作流程中起到承上启下的关键作用。
1.4.5.2.1.2 PreparedStatement
preparedStatement 是一种将 SQL 语句进行预先处理的对象,在项目开发中常用于存储和管理预先编译好的 SQL 语句;preparedStatement 对象通过支持预先编译功能,在程序运行时能够显著提升执行效率的同时也增强了代码易读性;
1.4.5.2.1.3 ResultSet
ResultSet主要用于接受数据库返回的数据集。

图1-11 初始化
1.4.5.3查询操作

图1-12 用于查询操作的整体代码



图1-13用于验证函数的基本结构。
基于本次项目的背景需求, HashMap以其键值对与数据库字段名值对应的特点, 被选作数据存储方案。
因为List作为接口无法直接创建实例, 因此我们选择使用ArrayList这种具体实现类来进行数据存储。
其中所存储的数据类型为HashMap<String, Object>, 因此在初始化ArrayList时也需要指定相应的数据类型。
用于查询操作的函数应返回List< HashMap<String, Object>>类型的结果, 以避免最基础功能逻辑上的错误。

图1-14展示了数据库连接及sql语句预处理的过程。
使用getConnection()函数来建立与数据库的连接,并采用Connection对象内置的方法prepareStatement将sql语句存储到pstmt这个预处理对象中。

图1-15 数据的归类
我们通过遍历para(来自数据库的参数)来分析每个元素。对于String类型的参数,则将其以String形式存入预处理对象中的第i+1个问号位置。对于Integer类型的参数,则将其存入预处理对象中的第i+1个问号位置,并采用Int数据类型。

图1-16 数据的处理以及存储
随后利用preparedStatement对象中的内置功能执行预定义SQL语句,并将 ResultSet 中所得的结果存储于变量中。
并由此获得 ResultSet 对象各列的数据类型及属性信息;
接着创建一个 ArrayList 来保存后续需要处理的数据项。
其中 getColumnLabel 返回的是对应 ResultSet 列的真实名称。
而 columnNum代表 ResultSet 对象中的总列数。
此外,在提取数据时会调用getColumnLabel方法以确保真实名称与SQL别名一致;
与此同时,在预定义的数据映射表 rsmd 中查找各列为对应的名称。
最后将提取到的实际数值与相应的字段名称结合后存入到 HashMap 中,
并通过 list.add() 方法将这些键-值对添加至 ArrayList 集合内完成数据存储。
1.4.5.4增删改操作

图1-17 增删改操作整体代码
1.4.5.5剩余资源的释放

图1-18所示为剩余资源释放函数代码
在遵循先开后关的原则下执行资源释放:
依次按顺序关闭ResultSet->PreparedStatement->Connection
2.用户登录接口
2.1 在Servlet层实现
在Servlet层创建一个UserLoginServlet, 并将WebServlet中的绑定地址修改为"/login"(如下图所示),以便在调用API文档中的URL时不会出现错误

图2-1所示的是Web Service容器中的Servlet实例属性的修改情况。在doGet方法体内进行如下操作:首先通过从客户端获取HTTP响应内容,并将这些数据转换为可被服务层理解的形式;随后将处理后的数据发送至服务层以便于后续的数据管理需求。

在图2-2中展示了Servlet层的功能实现代码。其中,在请求处理过程中,客户端通过request.getParameter()方法从request对象获取来自浏览器发送到客户端的数据。具体来说,在此过程中获取了两个关键数据:邮件地址和密码信息。这些数据随后会被Servlet层传递给Service层进行进一步处理。经过Service层的处理后,并调用toJSONString()这个静态方法将结果集进行序列化(如图2-3所示)。值得注意的是,在API测试数据集中,并未包含任何中文字符相关的信息,因此无需额外的转码操作即可确保通信的有效性。然而,在响应端若出现密码错误或用户邮箱不存在的情况时,则需要将响应内容转换为UTF-8编码以防止浏览器无法正确显示相关内容。

图2-3 序列化显示
2.2 Service层实现

图2-4 判断邮箱是否存在
这一功能的主要作用是帮助快速确定登录失败时的错误原因。

图2-5 描述了登录方法的流程图
2.3 Dao层实现

图2-6 判断指定的邮箱地址是否存在于 在users表中查询是否有来自service层传输过来的email数据

图2-7 主要用于验证邮件和密码的有效性
Dao层的核心在于执行特定的SQL语句,在线获取对应的服务层传入的数据(如email和password),并判断这些数据是否存在于users表中。
根据返回数据类型以及ArrayList的索引特性(默认将第一个元素存放在下标为0的位置),我们只需提取第一个节点中的键值对信息(即所需的具体数据)。
3.用户查询接口
3.1 Servlet层实现
在servlet层创建一个名为GetUserListServlet的组件,并对WebServlet的属性进行赋值设置为login(如图所示),这样可以避免在引用API文档中的URL时出现错误

图3-1 界面内容发生了变化
在doGet方法体内进行操作,在此过程中实现了从浏览器获取所需的数据并将其传输至服务层以满足服务层的需求

图3-2所示的是Servlet层的功能实现代码。在图3-2中,该过程实现了客户端通过request.getParameter()方法从Request对象中获取来自浏览器发送到客户端的数据(具体包括roleId、startPage和pageSize三个字段)。随后将处理结果传递给Service层进行进一步操作,并经过Service层的处理后得到返回的结果集合。随后使用toJSONString()静态方法将结果集进行序列化(序列化效果如图3-4所示)。由于API测试数据中不包含任何中文字符,因此无需对数据进行转码处理。

图3-3 序列化显示
3.2 Service层实现

实现图3-4中查询用户功能的方法如下:
首先创建一个result结果集,默认情况下视为成功状态(success)。如果在执行过程中失败,则无需返回任何数据。
根据题目要求可知,默认情况下RoleId设置为0。
当RoleId为0时不进行参数化的Query;而当RoleId不为0时,则执行带RoleId的Query。
将获取的数据传递给Dao层,并获取相应的返回集合
3.3 Dao层实现
3.3.1不带RoleId的查询

图3-5 基于模糊查询检索用户列表 系统将在users表中检查是否存在来自service层传递过来的email字段

图3-6 通过模糊查询获取用户列表
3.3.2带RoleId的查询

图3-7 通过模糊查询获取用户列表

本节主要介绍通过模糊查询技术获取用户列表的方法(如图3-8所示)。本节的重点在于数据库层的主要实现逻辑集中在SQL语句方面。基于以下所示的SQL语句框架(如图3-9),系统能够完成数据匹配判断功能(三种常见的查询方法)。此外需要注意的是,在具体实现过程中需要考虑以下几个关键点:首先,在返回结果数据类型的定义上,默认情况下系统会将HashMap结构以及ArrayList容器使得第一个元素被存储在索引0的位置处。其次,在实际应用中只需提取第一条记录中的键值对信息即可。
4.用户增加接口
4.1 Servlet层实现
为在Servlet层创建一个名为AddUserServlet的应用程序逻辑模块,并将该模块集成到WebServlet中以便访问其服务接口,同时将WebServlet的URL前缀设置为/addUser(如图所示),从而确保当使用API文档指定的URL时仍能正常工作

图4-1显示了WebServlet值的变化情况。在处理doGet方法时,系统会从servlet层获取来自浏览器的数据,并将其传递至service layer以确保 service layer所需的数据。

图4-2展示了Servlet层的功能实现代码

图4-3 序列化显示
4.2 Service层实现

图4-4 查询邮箱是否在users表中存在

以图4-5为基础,在service层实现用户数量的增加方法。具体步骤如下:
- 初始化一个Result变量,默认设为'已失败'(fail)状态。
 - 检查users表中是否存在当前欲添加的邮箱:
- 若不存在,则将Flag字段标记为'success'。
 - 然后将数据发送至Dao层获取相应返回结果。
根据题目要求的需求,
结合图3-4中用于判断邮箱存在性的方法的结果,
即可确定异常原因究竟是密码错误还是邮箱不存在的问题。 
 
4.3 Dao层实现

图4-6 是一个用于确认邮箱是否存在的流程图;在users表中进行查询以确定是否有来自服务层的数据存入email字段。

图4-7 用户增加方法
在Dao层的实现中核心内容是构建有效的sql语句体系基于如图所示的sql语句框架能够实现将service层接收的数据以HashMap形式存储其中具体包括:email用于接收邮件地址;firstName表示用户的第一名称;lastName记录用户的姓氏姓名组合信息;dateOfBirth存储用户出生日期以便后续进行年龄计算或其他相关操作photo为用户提供头像链接方便视觉识别功能phone则用于管理联系方式确保通讯渠道畅通地址信息则涵盖了用户的具体居住方位以便于地理定位服务gender标识用户性别便于后续权限管理和安全性设置password则作为账户安全屏障保障用户数据不被非法获取或泄露最后roid字段关联到角色权限确保资源分配机制的有效运行
5.获取用户信息(根据用户id)接口
5.1 Servlet层实现
在Servlet层创建一个名为GetUserInfoServlet的对象,并将该对象的配置参数设置为/newResourceUrl(如图所示),从而避免因配置错误导致的问题出现

图5-1是关于WebServlet相关数据字段的更新页面

图5-2所示的Servlet层功能实现代码,在图5-2中实现了客户端通过request.getParameter()方法从request对象中获取来自浏览器传输到客户端的数据(这里获取了userId这个数据)。然后将处理结果交由service层进行处理,并得到服务层返回的结果集合后使用toJSONString()静态方法将结果集进行序列化编码(序列化效果如图5-3所示)。需要注意的是,在API测试用例中的请求内容并未包含中文字符因此不需要对响应内容进行转码处理;然而,在response响应中如果用户信息不存在时需要用中文提示因此需要对发送的数据执行转码操作并将其转换为UTF-8格式以确保浏览器能够正确显示。

图5-3 序列化显示
5.2 Service层实现

图5-4:查询用户信息方法
首先创建一个resultResult对象,默认设置为失败状态;若用户的登录状态为成功,则将Flag字段的值更新为success。随后将这些数据发送至Dao层后获取相应的返回集合。为了确定错误原因,请检查users表中的返回数据是否存在。
5.3 Dao层实现

图5-5所示的通过ID进行查询过程主要在于使用SQL语句进行操作。该过程如图所示的方式能够判断service层传入的数据(userId)是否存在于users表中。由于返回的数据类型为HashMap,并且ArrayList默认将第一个元素存储在索引0的位置上,则只需提取列表的第一个元素中的键值对部分即可获取所需数据;若无匹配结果(即列表为空),则返回null值。
6.用户更新接口
6.1 Servlet层实现
在servlet容器中创建一个UpdateUserServlet实例,并将其配置为负责处理用户更新操作。将原有的HTTP状态码字段更改为/modifyUser(如图所示),以便于后续开发人员快速定位问题并进行调试

图6-1 WebServlet值的更改
在doGet方法体内进行操作时, 首先通过servlet层接收来自浏览器的数据, 然后将这些数据传递给service层, 从而确保service层能够满足相关需求

图6-2所示的是Servlet层的功能实现代码

图6-3 序列化显示
6.2 Service层实现

图6-4 判断邮箱是否已经存在

图6-5 识别用户信息是否存在及其邮箱是否有记录。其主要功能是:如果所有需要更新的用户都没有记录,则无法完成此次更新。

实现用户信息更新的方法体现在图6-6中。具体步骤如下:首先初始化一个result resultSet,默认设置为更新失败(fail)状态。若更新成功,则将Flag字段设置为success状态。接着向Dao层发送数据,并获取相应的返回结果集。随后,在loginInfo集合中补充所需的数据内容。因为程序需要明确错误原因而采取相应措施:首先调用图6-5的功能模块来检查用户的记录是否存在。若记录不存在,则直接报错并显示'fail'状态。若记录存在,则调用系统提供的邮箱存在性检测功能模块(如图6-4所示),获取该功能模块的结果。如果检测到该邮箱已存在,则更新操作无法完成(return fail)。反之,则整个操作能够顺利完成。
6.3 Dao层实现

核查需要更新的邮箱信息是否已被使用过,在users表中查看是否有来自service层传递过来的email地址存在。

在Dao层的主要实施方式是通过一系列SQL语句操作数据库表中已存在的记录(如图所示)。这些SQL语句即可完成从service层接收的数据(包括email、firstName、lastName等),将更新后的数据直接存入数据库中。
7.城市查询接口
7.1 Servlet层实现
在Servlet层创建一个新的名为getCityNames的Servlet,并将WebServlet中的值重定向为/getCityNames(如图所示),以确保使用API文档中的URL时不出现错误。

图7-1展示了WebServlet值的变化情况;在 doGet 方法体内,则完成了从servlet层次获取来自客户端的数据,并将这些数据发送至 service 层以便于服务端需求得以满足。

在图7-2中,在线展示了一种功能实现代码。该代码实现了客户端通过request.getParameter()方法从request对象中获取来自浏览器发送到客户端的数据(其中重点关注了获取的email和password两个数据项)。经servlet层处理后返回一组数据集合。然后通过toJSONString()静态方法将结果集进行序列化处理(如图7-3所示)。由于API测试数据中的request内容以及服务器发送到流量中的response中均未包含中文字符,因此无需进行转码处理。

图7-3 序列化显示
7.2 Service层实现

图7-4展示了城市查询方法的实现流程。
初始化一个Result resultSet。
默认设置为查询成功状态(success)。
将数据传输至Dao层后,并获取相应的返回集合
7.3 Dao层实现

图7-5用于验证邮箱和密码的一致性。
Dao层的实现核心在于其SQL语句的设计。
参考下图中的sql语句能够完成获取city表中全部信息的任务。
8.航班状态查询(根据出发日期)
8.1 Servlet层实现
用于在Servlet层创建一个GetFlightStatusServlet,并将其值设置为/getFlightStatus(如上所示),从而确保当使用API文档中的URL时不会出现问题。

图8-1所示WebServlet值的更改情况如下:在doGet方法体内进行操作时,首先实现从servlet层获取来自浏览器的数据,随后将这些数据传递至service层,以确保服务端能够满足需求。

图8-2所示为Servlet层的功能实现代码

图8-3 序列化显示
8.2 Service层实现

图8-4 展示了登录流程的方案
8.3 Dao层实现

图8-5 获取航班总数
通过日期的限制,来统计符合当前所需日期的航班总数。

图8-6航班状态查询
9.航班计划查询(管理员)接口
9.1 Servlet层实现
在servlet层创建一个名为GetScheduleServlet的对象,并将其配置为将WebServlet实例的请求参数设置为'login'(如图所示),这样可以防止在调用API文档中引用的URL时出现问题

如图9-1所示,WebServlet值的更改是在doGet方法体内部完成的。具体来说,在doGet方法体内部完成了从servlet层获取来自浏览器的数据,并将这些数据传输至service层以确保服务层能够满足所需的需求。

图9-2所示的代码片段主要负责实现客户端与服务器之间的数据交互流程。具体而言,在图9-2的功能模块中,代码负责从Request头文件中读取并提取自Browser的请求数据(包括startDate、endDate、from City、toCity等字段),随后将这些数据传递给Service Layer进行处理。经Service Layer处理后得到一个集合结果(如图9-3所示),该集合结果被进一步转换为JSON格式(使用该类中的静态方法toJSONString()对结果集进行序列化编码)。在本测试场景下,所有Request头文件和Response头文件的内容均为纯英文字符,在此情况下无需进行任何转码操作即可满足需求。

图9-3 序列化显示
9.2 Service层实现

图9-4 实现航班计划查询的方法
9.3 Dao层实现

以图9-5为基础实现航班计划查询的方式,在其主要体现为通过精心设计的SQL语句进行数据整合与计算的基础上(如图9-5所示的具体sql语句),不仅能够利用多表连接的优势(基于如图所示的具体sql语句),从而能够有效获取所需数据的信息(不仅能够利用多表连接的优势)。
10.机票售出详情(根据航班计划id)接口
10.1 Servlet层实现
在servlet层注册一个新的GetScheduleDetailServlet, 并设置该ServletContext的访问路径为/getScheduleDetail(如图所示), 以便确保当用户通过API文档指定该URL时系统能够正确解析并执行相应的操作

图10-1展示了WebServlet值的变化情况,在doGet方法体内完成利用servlet层获取浏览器中的数据,并将这些数据传递给service层以满足其需求。

图10-2展示了Servlet层的功能实现代码。在该页面中,默认情况下会展示当前月份的日历(如图10-1所示)。当用户点击某个月份时(例如选择某个月份),系统会自动跳转到对应的月份日历页面(如图10-2)。在默认情况下,默认情况下默认情况下默认情况下默认情况下默认情况下默认情况下默认情况下默认情况下默认情况下默认情况下,默认显示当前月份的日历信息(如图10-3所示)。当用户点击某个月份时(例如选择某个月份),系统会自动跳转到对应的月份日历页面。


图10-3 序列化显示
10.2 Service层实现

图10-4 查询机票售出详情
初始化一个resultResult变量,默认状态标记为未成功(fail)。随后,在确认航班信息的存在性之后,
当确认航班信息存在时,则将标志字段设置为成功状态(success)。接着,
通过网络层向数据库服务层发送请求,并获取响应数据集合。根据系统需求,
必须包含以下字段:ScheduleInfo、TicketInfo、SelectedSeat 和 SeatLayout,
因此可以使用统一的数据映射表来整合这些相关信息。最后,
再将这个映射表设置为结果集的数据源位置即可完成操作。
10.3 Dao层实现
在users表中寻找是否存在service层传输过来的email数据。

图10-5 ScheduleInfo一栏的信息获取

图10-6 TicketInfo一栏的信息获取

图10-7 SelectedSeat一栏的信息获取

图10−8座力分析一栏的信息获取 Daof层实现的核心点在于使用SQL语句.基于图10−5至10−8中的查询语句,从而能够提取出所需的关键信息.
11.航班计划状态修改接改
11.1 Servlet层实现
请在Web应用的servlet层上搭建一个UpdateScheduleServlet实例,并将其中的web.xml配置文件中的update Schedule字段设置为新的值 /updateSchedule(如图所示),这样可以避免在调用API文档中的URL时出现问题。

图11-1展示了WebServlet值的更改情况

图11-2所示的是Servlet层的功能实现代码。图11-2中的客户端通过调用request.getParameter()方法从请求对象中获取来自浏览器的数据(这些数据包括email和password两个字段),然后将这些数据传递给Servlet层进行处理。处理完成后,在得到结果集后会调用静态方法toJSONString()将其序列化(序列化效果如图11-3所示)。由于API测试数据中的request字段不包含中文字符因此不需要进行转码处理。然而在response返回的内容中如果航班计划信息不存在则需要用中文提示信息因此需要将response中的内容编码为UTF-8格式以防止浏览器无法正确显示中文提示信息。

图11-3 序列化显示
11.2 Service层实现

图11-4 展示航班状态更新过程的方法
11.3 Dao层实现

图11-5 识别航班信息有无 有助于后续打印及更新出现问题时的处理(航班计划不存在)

图11-6 航班状态更新
Dao层的核心内容体现在其使用的SQL语句上。采用如图所示的具体SQL语句形式,则能够完成服务层输入数据(即将航班状态从当前scheduleId中修改为与服务层提供的status一致)的任务。
12. 航班计划查询(员工)接口
12.1 Servlet层实现
在Servlet层创建一个新的GetSearchFlightServlet,并将其中引用的URL路径更改为(getSearchFlight)(如图所示),以避免在参考API文档时出现路径错误。

本图分析了WebServlet容器参数的变化情况。
在该doGet方法体内,我们首先实现了从servlet容器中获取来自客户端的数据,并将这些信息通过网络接口发送至服务端。
为了确保服务端能够满足相关需求,我们完成了上述操作。

在图12-2中展示了Servlet层的功能实现代码。该代码实现了客户端从request对象中通过getParameter()方法获取来自浏览器的原始数据,并将这些数据(包括email和password)传递给服务层进行处理。服务层完成特定操作后会返回一个数据集合,并通过toJSONString()静态方法将其序列化为JSON格式(如图12-3所示为Non-stop序列化效果,图12-4所示为1-stop序列化效果)。由于测试用例中的API请求和响应数据均不含中文字符内容,因此无需进行转码转换。

图12-3 Non-Stop序列化显示

图12-4 1-Stop序列化显示
12.2 Service层实现

如图12-5所示,对不同类型的飞行进行了分步处理。根据flightType数据能够明确确定每架航班的类型。若属于Non-stop类型(无中转),则只需计算单程航班数量;若属于1-stop类型(含中转),则需计算两段行程:始发航班及 connecting航班。通过将所有非中转与含中转的数据整合到同一个列表框中即可实现数据汇总。

图12-6 获取Non-stop的方法

图12-7 获取1-step的方法
12.3 Dao层实现

从Service层的角度看,在Non-stop功能中需要计算三种参数(AllCount、DelayCount、NotDelay)。其中函数TIMESTAMPDIFF(MINUTE, datetime_expression1, datetime_expression2)的作用是计算两个时间差值(以分钟为单位)。这里之所以采用这种方式是因为当TIMESTAMPDIFF(MINUTE,...) > 15时会自动为飞机的着陆与起飞预留出一个合适的时间间隔。这样做不仅能够有效避免因飞机着陆与起飞的时间变化导致显示延误的问题,并且还能够确保系统对其他相关数据进行显示。在处理预计到达时间(PreArrivalTime)时由于表中未直接提供这一数据信息因此需要通过起飞时间和飞行时间来进行推算。其中函数DATE_ADD(date, INTERVAL expr unit)的作用是将指定时间段加到指定日期上从而完成所需的时间计算工作。

图12-9展示了实现一站式服务的策略。该策略与非一停服务相似,在操作上只需展示两条航线的信息,并分别以S1和S2作为标识符标注这两条航线的服务班机信息。

图12-10 获取service层所说的三个参数的方法
在本方案中处理这三个参数的方式与Non-stop系统中的一致。其中涉及的三个关键参数包括AllCount、DelayCount和NotDelay。
其中TIMESEAMPDIFF(unit,datetime_expr1,datetime_expr2)这一函数用于计算datetime_expr1与datetime_expr2的时间差,默认以unit为单位。
而(TIMESTAMPDIFF(MINUTE,DATE_ADD(Schedule.Date,INTERVAL Route.FlightTime MINUTE),FlightStatus.ActualArrivalTime) >15)这一条件设置是为了当该分钟数超过15时,则表示飞行时间超出预定范围。
参考文章
[1] 本节详细解析了IT学习者必懂的JDBC技术要点
[2] 深入探讨JavaWeb框架中的三层架构实现
[3] 分析其在性能和扩展性方面的优势与不足
[4] 对比传统MVC模式的优势
[5] 本节重点解析了Java面向对象编程中的POJO与其关联对象Bean之间的关键差异
[6] 全面指导您如何轻松完成Tomcat服务器的下载、安装及环境变量配置
