1、设计题目
功能需求如下: (1)班次信息包括:班次、发车时间、起点站、终点站、行车时间、额定载量。 车票信息包括:日期、班次、额定载量(人)、已售(张)。例如:(2022/5/12, 3,40,5),表示2022年5月12日,班次3,额定载量40人,已售5张 (2)系统功能要求: 1)班次信息的增、删、改、浏览功能; 2)查询路线:可按班次号、起点站、终点站查询; 3)统计售票情况:统计指定日期的全部班次售票数量。 4)售票和退票功能 A:输入日期、班次、预购票数量,当预购票数量<=剩余车票,才能售票;售票后,自动更新已定票人数。 B:输入日期、班次、退票数量;退票后,自动更新已定票人数。 (3)数据组织及存储要求 1)班次信息、车票信息分别存储在2个文件(.txt)中,增、删、改、查、浏览等操作都是对文件操作; 2)班次、车票的信息在内存中要求使用泛型集合方式组织,具体实现类型自定。 (4)测试数据要求:存储班次信息及车票信息的两个文件,至少各有10条数据(不同班次、不同售票日期)。
2、 概要设计
2.1功能模块设计
1、数据库设计:
设计两张表,一个用于存储班次信息,另一个用于存储车票信息。
确定数据库的结构,包括字段和索引的设计。
使用SQL语句对数据库进行增删改查。
2、班次信息管理模块:
设计班次信息界面,提供增删改查班次信息的功能。
实现班次信息的增删改查操作,通过SQL语句操作对数据库进行更新。
需要验证输入的班次信息的合法性。
3、路线查询模块:
设计界面,提供按班次号、起点站、终点站查询路线的功能。
实现按班次号、起点站、终点站查询路线的功能,通过文件操作从数据库中检索符合条件的班次信息并显示到界面中。
4、售票统计模块:
设计总界面,提供统计指定日期的全部班次售票数量的功能。
实现统计指定日期的全部班次售票数量的功能,通过文件操作从数据库中获取符合日期条件的班次信息并计算已售票数量。
5、售票和退票模块:
设计界面,提供售票和退票功能的输入界面。
实现售票和退票功能,根据输入的日期、班次、票数量,进行剩余票量的验证和更新已售票数量的操作。
系统功能模块图:如图2-1所示
图2-1车票管理系统功能模块图
各个类图如图所示:
Trip类图如图2-2所示
图2-2
Ticket类图如图2-3所示:
图2-3
2.2 系统流程
班次信息管理流程图如2-4图所示:
图2-4
3. 详细设计
3.1 算法思路
这个系统采用三层架构(MVC)模式,这样做的好处是模块管理清晰,逻辑结构也符合实际情况,能够提供良好的代码结构和分离关注点的能力,提高系统的可扩展性、可维护性和可重用性,同时也促进开发效率。
班次信息管理模块类(Trip):
- 班次信息数据库(schedules)
方法:
- 浏览班次信息(selectCondition):
- 从班次信息数据库中读取并显示所有班次信息
- 要是什么条件都不输入,则输出全部的班次信息,要是输入对应的条件,则根据条件输对应车次信息
- 增加班次信息(addTrip):
- 接收新的班次信息作为参数
- 将新的班次信息添加到班次信息数据库
- 修改班次信息(updateTrip):
- 接收要修改的班次号和新的班次信息作为参数
- 在班次信息数据库中找到对应班次号的班次信息并更新为新的班次信息
- 删除班次信息(deleteTrip):
- 接收要删除的班次号作为参数
- 在班次信息数据库中找到对应班次号的班次信息并删除
车票信息管理模块(Ticket):
方法:
- 统计指定日期的全部班次售票数量(countTicketsByDate):
- 接收日期作为参数
- 在班次信息数据库中查找符合日期条件的班次信息,并计算已售票数量
- 返回统计结果
- 售票功能(sellTicket):
- 接收日期、班次和预购票数量作为参数
- 在车票信息数据库中找到对应日期和班次的车票信息
- 验证剩余车票数量是否足够
- 如果足够,更新已售票数量
- 返回售票结果
- 退票功能(refundTicket):
- 接收日期、班次和退票数量作为参数
- 在车票信息数据库中找到对应日期和班次的车票信息
- 更新已售票数量,增加退票数量
- 返回退票结果
系统模块构架如图所示:
4、小细节
1、在实体类我用的时间类型是Date,在涉及到时间字段的时候,这个类型输出的时间是系统规定的,对用户不友好,因此要进行时间格式的转化
做法很简单,就是在涉及时间的参数是在它的前面加上这个注解:
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date date;
2、在设计多表查询时,要用到 mybatis 强大重要的结果映射 类resultMap。
resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的数千行代码。ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
就好比在这个课设题目中,我要在两张表里抽取某些字段出来,这时就用到了resultMap
在resultMap就可以这样配置,属性column 时绑定数据库表的字段,property属性是实体类字
段,通过这个resultMap就可以进行数据映射了
<resultMap id="TripMap" type="com.zst.pojo.Trip">
<!-- 班次表 -->
<result column="classes" property="classes"/>
<result column="start_time" property="startTime"/>
<result column="start_station" property="startStation"/>
<result column="end_station" property="endStation"/>
<result column="travel_time" property="travelTime"/>
<result column="capacity" property="capacity"/>
<!-- 车票表 -->
<association property="ticket" javaType="com.zst.pojo.Ticket">
<result column="sold_tickets" property="soldTickets"/>
</association>
</resultMap>
在SQL语句就得这么写了,这个多表查询是通过classes来查的
<select id="selectByCondition" resultMap="TripMap" parameterType="java.util.Map">
select s.classes,s.start_time,s.start_station,s.end_station,s.travel_time,s.capacity,t.sold_tickets
from schedules s, tickets t
where
s.classes = t.classes
</select>
@Test
public void select() throws ParseException {
SqlSession session = MybatisUtils.getSession();
TripMapper ticketMapper = session.getMapper(TripMapper.class);
List<Trip> tripList = ticketMapper.listTrips();
tripList.stream().forEach(System.out::println);
}
4、总结
这个只是为了应付课设的完成,并没有在其中把每个细节做到完美,就是在车票的方面,过期的车票啊,没有能做到过期自动销毁,过期不能买票的功能,还有弹窗的方式只是用了Ajax的自带弹窗,没有优化好,做这个笔记只是以此来记录一下这个过程。
要是有小伙伴也遇到这个相关的课设就可以找我交流一下,项目含金量不高,但应对大一的课设是游刃有余的了。
最终效果图
源代码链接:https://github.com/suzimoyyds/tickets.githttps://github.com/suzimoyyds/tickets.git