基于SpringBoot的高铁售票系统的设计与实现_第1页
基于SpringBoot的高铁售票系统的设计与实现_第2页
基于SpringBoot的高铁售票系统的设计与实现_第3页
基于SpringBoot的高铁售票系统的设计与实现_第4页
基于SpringBoot的高铁售票系统的设计与实现_第5页
已阅读5页,还剩22页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGE4PAGE1摘要随着高铁网络不断扩展,人们对高铁出行的需求日益增长。虽然12306作为官方大型售票平台在旅客运输中占据重要地位,但在服务非主干道中小型车站时存在诸多不足。例如,非主干道铁路车次信息变更时,12306系统无法及时同步,导致旅客出行计划受影响;在出行高峰期,系统高并发处理能力不足,出现卡顿甚至崩溃现象,严重影响购票体验。本项目基于SpringBoot3开发分布式高铁售票系统,旨在解决非主干道中小型车站售票难题。系统利用SpringCloudAlibaba微服务架构优化票额分配,借助Nacos和Redis保障数据一致性和实时同步,集成Sentinel实现限流、熔断和降级以优化系统性能。经JMeter压力测试,优化后的系统平均响应时间大幅缩短,吞吐量显著提升,在高并发场景下稳定性增强。该系统不仅能提升旅客购票便捷性,优化铁路运营管理,还能推动区域经济发展,对改善非主干道中小型车站售票服务具有重要意义。关键词:SpringBoot3;分布式系统;高铁售票;性能优化;微服务架构打印格式说明

TITLEWiththecontinuousexpansionofthehigh-speedrailnetwork,people'sdemandforhigh-speedrailtravelisincreasingdaybyday.Although12306,asanofficiallarge-scaleticketingplatform,holdsanimportantpositioninpassengertransportation,therearemanydeficiencieswhenservingsmallandmedium-sizedstationsonnon-mainroads.Forexample,whenthetrainnumberinformationofnon-mainroadrailwayschanges,the12306systemfailstosynchronizeintime,resultingintheimpactonpassengers'travelplans.Duringpeaktravelperiods,thesystem'shigh-concurrencyprocessingcapacityisinsufficient,resultinginlagorevencrashes,whichseriouslyaffectstheticketpurchasingexperience.Thisprojectdevelopsadistributedhigh-speedrailticketingsystembasedonSpringBoot3,aimingtosolvetheticketingproblemsofsmallandmedium-sizedstationsonnon-mainroads.ThesystemutilizestheSpringCloudAlibabamicroservicearchitecturetooptimizeticketallocation,guaranteesdataconsistencyandreal-timesynchronizationwiththehelpofNacosandRedis,andintegratesSentineltoachieveratelimiting,circuitbreakinganddegradationtooptimizesystemperformance.AftertheJMeterstresstest,theaverageresponsetimeoftheoptimizedsystemwassignificantlyshortened,thethroughputwassignificantlyincreased,andthestabilitywasenhancedinhigh-concurrencyscenarios.Thissystemcannotonlyenhancetheconvenienceofpassengerspurchasingtickets,optimizetheoperationandmanagementofrailways,butalsopromoteregionaleconomicdevelopment,whichisofgreatsignificanceforimprovingtheticketingservicesofsmallandmedium-sizedstationsonnon-mainroads.1概述1.1研究背景在当今数字化时代,互联网深度融入人们的生活,极大地改变了出行购票方式,12306作为国内铁路售票的核心平台,在旅客运输体系中发挥着关键作用。然而,随着铁路网络不断拓展延伸,非主干道铁路的运输需求逐渐凸显,12306在服务非主干道中小型车站时暴露出诸多问题。信息更新与准确性方面存在问题。非主干道铁路车次因设备故障、天气变化或调度调整等出现变更时,12306系统无法及时同步信息。这使得旅客按照原计划出行时,遭遇车次取消或晚点,却未能提前知晓,严重影响出行安排,给旅客规划行程带来困扰。系统性能与稳定性也面临挑战。在节假日、旅游旺季等出行高峰期,非主干道铁路的购票需求增加,12306系统高并发处理能力不足的问题凸显。由于非主干道相关数据处理优化不足,系统容易出现卡顿、页面加载缓慢甚至崩溃的情况,极大地影响了旅客的购票体验。1.2研究意义本项目致力于打造一款基于SpringBoot3的分布式高铁售票系统,应用于非主干道中小型车站,具有重要的现实意义。从提升旅客出行体验角度来看,旅客能够更便捷地购买到合适的车票,降低出行成本。及时准确的信息更新,能让旅客提前了解车次变更和车站设施情况,合理规划行程,避免因信息不畅导致的时间浪费和行程延误。友好的界面设计和个性化服务,方便旅客查找车次信息,满足个性化需求,从而显著提升旅客的出行满意度。在优化铁路运营管理方面,精准的票额分配可以提高票源利用率,减少资源浪费,提升铁路运营的经济效益。系统性能的提升,确保了在高并发情况下购票流程的顺畅,降低网络问题对售票业务的影响,保障售票工作的高效稳定进行。同时,完善的信息管理和个性化服务,有助于铁路部门更好地了解旅客需求,为运输资源的合理调配和服务优化提供数据支持。从推动区域经济发展层面分析,改善非主干道中小型车站的售票服务,能够促进区域间的人员流动和交流。便捷的购票体验可以吸引更多游客前往非主干道沿线的景点旅游,带动当地旅游业及相关产业的发展,促进区域经济增长。此外,高效的售票系统也有利于加强沿线城镇与外界的联系,为区域经济合作和发展创造更好的条件。1.3研究内容基于分布式技术的票额分配优化:利用SpringCloudAlibaba微服务架构,将票额分配功能拆分成独立的服务模块,实现弹性扩展。借助Nacos的服务注册与配置功能,实时配置车站售票情况等信息。使用Redis分布式锁解决在票额分配过程中的数据一致性问题,防止超卖现象发生,确保票额分配的准确性和公平性。数据一致性保障下的信息实时同步:采用Seata的AT模式,车次信息变更、车站设施信息更新等操作的事务一致性。对于车站信息,系统定期进行采集和更新,将数据存储在MySQL数据库中,并确保各服务模块之间数据的一致性,使旅客能够获取到准确、及时的信息。高并发下的系统性能优化:针对非主干道铁路在出行高峰期的高并发访问,利用Redis缓存余票数据,减少数据库的直接访问压力,提高系统响应速度。集成Sentinel实现限流、熔断和降级功能,当系统负载过高时,自动限制流量,优先保障核心购票功能的稳定运行,避免系统崩溃。系统测试与持续优化:使用JMeter进行全面的压力测试,模拟不同的客流量和业务场景,对系统的性能、稳定性、票额分配准确性、信息同步及时性等方面进行评估。根据测试结果,不断调整和优化系统参数、算法以及功能模块。在实际应用中,收集旅客反馈和运营数据,持续改进系统,确保系统能够稳定、高效地运行,满足非主干道中小型车站的售票需求。

2需求分析2.1可行性分析本项目采用SpringCloudAlibaba微服务架构,结合Redis、RocketMQ、Sentinel等成熟中间件,技术方案具备较高的可行性,具体分析如下:架构方面,将系统按业务拆分为独立模块,支持弹性拓展。采用Nacos实现服务注册与配置。性能方面,通过Redis缓存余票数据,集成Sentinel实现熔断降级等保证高并发处理。数据方面,采用SeataAT模式保障购票流程的ACID特性,开发运维方面,使用Freemarker模板避免重复开发,降低工作量,使用JMeter进行性能测试。综上,本项目技术选型成熟、社区支持完善,各模块均有成功落地案例,技术风险可控,具备完全可行性。2.2功能性需求分析2.2.1会员功能会员功能包括:登录、乘车人管理、对乘车人信息管理、车票查询与购买、已购车票查询。图2.SEQ图2.\*ARABIC1会员功能用例图在会员登录中,用户需要在在登录界面输入手机号码后点击获取验证码,在乘车人管理功能中,支持对乘车人的信息进行添加、删除和编辑操作。在车票查询与购买中,会员要在余票票查询界面选择乘车日期,起始站与终点站,选择后点击查找,系统将根据录入信息展示查询结果。若要购票,点击对应的车次预定按钮,系统会跳转至订单界面,勾选需要购票的乘车人后选择票种与座位类型后点击提交订单。排队购票情况会实时显示,最后弹出购票结果。在已购车票中,将展示已购车票信息。2.2.2管理员功能管理员功能包括:会员管理、业务管理、基础数据维护、跑批管理图2.SEQ图2.\*ARABIC2管理员功能用例图在会员管理中,管理员可在会员管理界面查看已购车票乘客的详细信息。业务管理管理中包含令牌余量管理、订单信息管理、余票信息管理、每日车次车站车厢座位管理。在基础数据维护中包含车站管理、火车管理、火车车站管理、车厢管理、座位管理。在跑批管理中,可以在跑批管理界面可对跑批任务进行管理,可以每日自动生成车票数据。

2.3非功能性需求分析 非功能性需求实现方案高并发能力使用Redis缓存余票数据Sentinel限流分布式锁优化低响应时间异步处理订单状态更新高吞吐量消息队列RocketMQ验证码削峰高可用性Nacos集群部署Sentinel服务熔断降级数据一致性Seata的AT模式防止机器人刷票令牌大闸图2-2SEQ图2-2\*ARABIC1熔断机制状态图图2-2SEQ图2-2\*ARABIC2系统负载均衡图

3开发环境与技术3.2开发技术SpringBoot3:作为核心框架,用于快速搭建和开发应用程序,简化配置和依赖管理。SpringBoot提供了自动配置功能,能够快速集成各种中间件和框架,如数据库连接、缓存、消息队列等,大大提高了开发效率。MySQL:用于存储系统的各种数据,如会员信息、车票信息、订单信息等。MySQL是一款开源的关系型数据库管理系统,具有高性能、可靠性和可扩展性,能够满足系统对数据存储和管理的需求。Maven3.9.4:项目构建工具,用于管理项目的依赖和构建过程。Maven通过pom.xml文件定义项目的依赖关系和构建配置,能够自动下载和管理项目所需的各种依赖库,并且支持项目的编译、测试、打包等操作。Nacos2.2.1:用于实现服务注册与发现、配置管理等功能。Nacos是一个动态服务发现、配置管理和服务管理平台,能够帮助微服务架构中的各个服务进行注册和发现,并且提供了统一的配置管理功能,方便对系统的配置进行管理和更新。Seata2.1.0:使用其AT模式实现分布式事务的一致性和事务回滚。Seata是一款开源的分布式事务解决方案,能够解决分布式系统中事务一致性的问题。在本系统中,通过Seata的AT模式,确保在多个服务之间进行数据操作时,能够保证事务的一致性,当出现异常时能够进行事务回滚。Sentinel1.8.6:实现限流和熔断功能,保护系统在高并发情况下的稳定性。Sentinel是一个轻量级的流量控制框架,能够对系统的流量进行控制,如限流、熔断、降级等,防止系统因为流量过大而导致服务不可用。Freemarker:用于制作模板,快捷生成系统中各模块的CRUD操作。Freemarker是一个模板引擎,通过定义模板文件和数据模型,能够快速生成代码,提高开发效率。在本系统中,使用Freemarker模板生成各模块的CRUD操作代码,减少了手动编写代码的工作量。Quartz:实现定时生成余票信息的功能。Quartz是一个开源的任务调度框架,能够按照预定的时间和频率执行任务。在本系统中,使用Quartz定时任务来生成余票信息,确保余票信息的实时性和准确性。Redis:用于缓存数据,提高系统的吞吐量,并且使用Redis分布式锁解决库存超卖问题。Redis是一个高性能的内存数据库,支持多种数据结构,如字符串、哈希、列表、集合等。在本系统中,使用Redis缓存热点数据,减少数据库的访问压力,提高系统的响应速度。同时,使用Redis分布式锁来保证在高并发情况下,库存操作的原子性,防止出现超卖问题。Redisson:Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-MemoryDataGrid),提供了一系列分布式的Java常用对象,如分布式锁、分布式集合等。在本系统中,使用Redisson的看门狗机制来自动延长锁的有效期,防止因为业务执行时间过长而导致锁超时释放,从而避免超卖问题的发生。JMeter:用于进行压力测试,评估系统在不同负载情况下的性能表现。3.3系统架构本系统采用微服务架构,将系统的各个功能模块拆分成独立的服务,通过服务间的调用和协作来完成业务逻辑。具体的服务模块包括:会员模块(member):管理乘车人,余票和我的车票业务模块(business):核心票务功能:余票查询、车次信息获取与更新、订单创建与状态变更。批处理模块(batch):管理定时任务:如每日车次更新、订单状态同步、余票统计。网关模块(gateway):请求路由:为会员、管理员和批处理模块提供统一的入口。公共模块(common):通用工具:日志、异常处理、数据转换等公共功能。图3-3SEQ图3-3\*ARABIC1系统架构图4系统设计4.2数据库设计1.member表(会员相关表)该表用于存储会员的基本信息,在整个系统中起着标识会员身份的重要作用。id:作为唯一标识member表中某一条记录的字段,设置为自增主键。它能确保每个会员在系统中有唯一的身份标识,方便后续对会员信息的管理和查询。mobile:存储会员的手机号,设置为唯一键。手机号是会员注册和登录系统的重要凭证,保证了每个手机号只能对应一个会员,避免重复注册。表中所有字段都设置为非空,以确保数据的完整性和有效性。表名描述主要字段member存储会员信息id:会员唯一标识;mobile:会员手机号(唯一)passenger存储乘车人信息,关联会员id:乘车人唯一标识;member_id:关联的会员ID;name:乘车人姓名;id_card:乘车人身份证号2.passenger

表车次相关表此表主要用于存储乘车人的详细信息,并且与会员表相关联,体现了会员与乘车人之间的关系。id:作为唯一标识

passenger

表中某一条记录的字段,设置为自增主键。它为每个乘车人提供了唯一的标识,便于对乘车人信息进行精确管理。member_id:作为外键,关联

member

表中的

id

字段。通过这个字段,可以明确每个乘车人所属的会员,建立了会员与乘车人之间的关联关系。name:存储乘车人的姓名,为后续的票务预订和乘车管理提供必要信息。id_card:存储乘车人的身份证号,这是乘车人身份的重要证明,用于验证乘车人的身份信息。type:表示旅客类型,通过枚举类型

PassengerTypeEnum

进行定义,方便对不同类型的旅客进行分类管理。表中设置了

member_id

的索引,以提高根据会员ID查询乘车人信息的效率。同时,除了

create_time

update_time

用于记录数据的新增和修改时间外,其他字段都设置为非空,保证了乘车人信息的完整性。表名描述主要字段train存储车次的基本信息id:车次唯一标识;code:车次编号(唯一);type:车次类型;start:始发站;end:终点站daily_train存储每日车次信息,与train表关联id:每日车次唯一标识;date:日期;code:车次编号(与日期组合唯一);type:车次类型;start:始发站;end:终点站3.train表车站相关表该表用于存储车次的基本信息,是车次信息管理的核心表。id:作为唯一标识train表中某一条记录的字段,设置为自增主键。它为每个车次提供了唯一的标识,方便对车次信息进行管理和查询。code:车次编号,设置为唯一键。车次编号是车次的重要标识,在系统中具有唯一性,方便用户查询和识别不同的车次。type:车次类型,通过枚举类型TrainTypeEnum进行定义,便于对不同类型的车次进行分类管理。start和end:分别表示车次的始发站和终点站,明确了车次的行驶路线。start_time和end_time:分别记录车次的出发时间和到站时间,为用户提供了车次的运行时间信息。表中设置了create_time和update_time字段,用于记录车次信息的新增和修改时间,方便对数据进行跟踪和管理。表名描述主要字段station存储车站信息id:车站唯一标识;name:站名(唯一);name_pinyin:站名拼音;name_py:站名拼音首字母train_station存储车次经停的车站信息id:记录唯一标识;train_code:车次编号;index:站序;name:站名daily_train_station存储每日车次经停的车站信息id:记录唯一标识;date:日期;train_code:车次编号;index:站序;name:站名4.train_station表车厢与座位相关表 此表用于存储车次经停的车站信息,详细描述了车次在各个车站的运行情况。id:作为唯一标识train_station表中某一条记录的字段,设置为自增主键。它为每个车次的经停站记录提供了唯一的标识,方便对经停站信息进行管理和查询。train_code:车次编号,与train表中的code字段关联,明确了该经停站信息所属的车次。index:站序,标识了该车站在车次经停站中的顺序,方便对车次的经停站进行排序和查询。name:站名,存储了经停站的名称。in_time、out_time和stop_time:分别记录了车次进站时间、出站时间和停站时长,为用户提供了车次在该车站的详细运行信息。km:里程(公里),表示从上一站到本站的距离,用于计算车次的行驶里程。表中设置了多个唯一键,如train_code_index_unique和train_code_name_unique,确保了车次经停站信息的唯一性和准确性。同时,设置了create_time和update_time字段,用于记录经停站信息的新增和修改时间。表名描述主要字段train_carriage存储车次的车厢信息id:车厢唯一标识;train_code:车次编号;index:厢号;seat_type:座位类型;seat_count:座位数train_seat存储车次的座位信息id:座位唯一标识;train_code:车次编号;carriage_index:厢序;row:排号;col:列号;seat_type:座位类型daily_train_carriage存储每日车次的车厢信息id:每日车厢唯一标识;date:日期;train_code:车次编号;index:厢号;seat_type:座位类型;seat_count:座位数daily_train_seat存储每日车次的座位信息及售卖情况id:每日座位唯一标识;date:日期;train_code:车次编号;carriage_index:厢序;row:排号;col:列号;seat_type:座位类型;sell:售卖情况(0表示可卖,1表示已卖)5.train_carriage表票务相关表该表用于存储车次的车厢信息,为车次的座位管理提供了基础。id:作为唯一标识train_carriage表中某一条记录的字段,设置为自增主键。它为每个车厢记录提供了唯一的标识,方便对车厢信息进行管理和查询。train_code:车次编号,与train表中的code字段关联,明确了该车厢信息所属的车次。index:厢号,标识了车厢在车次中的顺序。seat_type:座位类型,通过枚举类型SeatTypeEnum进行定义,便于对不同类型的座位进行分类管理。seat_count、row_count和col_count:分别记录了车厢的座位数、排数和列数,为座位的布局和管理提供了信息。表中设置了train_code_index_unique唯一键,确保了同一车次中车厢编号的唯一性。同时,设置了create_time和update_time字段,用于记录车厢信息的新增和修改时间。表名描述主要字段daily_train_ticket存储每日车次的余票信息id:记录唯一标识;date:日期;train_code:车次编号;start:出发站;end:到达站;ydz:一等座余票;edz:二等座余票;rw:软卧余票;yw:硬卧余票ticket存储车票信息,关联会员和乘车人id:车票唯一标识;member_id:会员ID;passenger_id:乘车人ID;train_date:日期;train_code:车次编号;carriage_index:厢序;seat_row:排号;seat_col:列号;start_station:出发站;end_station:到达站;seat_type:座位类型confirm_order存储确认订单信息id:订单唯一标识;member_id:会员ID;date:日期;train_code:车次编号;start:出发站;end:到达站;daily_train_ticket_id:余票ID;tickets:车票信息(JSON格式);status:订单状态6.train_seat表定时任务相关表(Quartz)此表用于存储车次的座位信息,详细描述了每个座位的具体情况。id:作为唯一标识train_seat表中某一条记录的字段,设置为自增主键。它为每个座位记录提供了唯一的标识,方便对座位信息进行管理和查询。train_code:车次编号,与train表中的code字段关联,明确了该座位信息所属的车次。carriage_index:厢序,标识了座位所在的车厢。row和col:分别表示座位的排号和列号,通过具体的排号和列号可以准确定位座位的位置。seat_type:座位类型,通过枚举类型SeatTypeEnum进行定义,与train_carriage表中的座位类型相对应。carriage_seat_index:同车厢座序,标识了该座位在车厢内的顺序。表中设置了create_time和update_time字段,用于记录座位信息的新增和修改时间。表名描述主要字段QRTZ_JOB_DETAILS存储定时任务的详细信息SCHED_NAME:定时任务名称;JOB_NAME:job名称;JOB_GROUP:job组;JOB_CLASS_NAME:job类名QRTZ_TRIGGERS存储触发器信息,关联jobSCHED_NAME:定时任务名称;TRIGGER_NAME:触发器名称;TRIGGER_GROUP:触发器组;JOB_NAME:job名称;JOB_GROUP:job组;NEXT_FIRE_TIME:下一次触发时间7.daily_train表分布式事务相关表(Seata)该表用于存储每日车次的信息,结合了日期和车次信息,为每日车次的管理和查询提供了支持。id:作为唯一标识daily_train表中某一条记录的字段,设置为自增主键。它为每个每日车次记录提供了唯一的标识,方便对每日车次信息进行管理和查询。date:日期,记录了该车次运行的具体日期。code:车次编号,与train表中的code字段关联,明确了该每日车次所属的车次。type、start、start_time、end和end_time等字段与train表中的相应字段含义相同,用于描述每日车次的基本信息。表中设置了date_code_unique唯一键,确保了同一日期下车次编号的唯一性。同时,设置了create_time和update_time字段,用于记录每日车次信息的新增和修改时间。表名描述主要字段global_table存储全局事务会话数据xid:全局事务ID(唯一);transaction_id:事务ID;status:事务状态branch_table存储分支事务会话数据branch_id:分支事务ID(唯一);xid:全局事务ID;transaction_id:事务ID;resource_id:资源ID;branch_type:分支事务类型;status:分支事务状态lock_table存储锁数据row_key:行键(唯一);xid:全局事务ID;transaction_id:事务ID;branch_id:分支事务ID;resource_id:资源ID;table_name:表名;pk:主键;status:锁状态图4-SEQ图4-\*ARABIC18核心业务ER图4.3系统类图4.3.1member模块类图此代码库围绕铁路会员系统开发,包含多个功能模块,以下是各模块及类的简述:1.实体类Member:存储会员手机号等信息。Passenger:记录乘客的基本信息,与会员关联。Ticket:保存车票详细信息,关联会员与乘客。2.数据访问层MemberMapper、PassengerMapper、TicketMapper:提供对对应实体表的增删改查操作。3.服务层MemberService:处理会员注册、发送验证码、登录等业务逻辑。PassengerService:管理乘客信息,包括保存、查询、初始化等操作。TicketService:负责车票的保存、查询和删除操作。4.控制层MemberController:处理会员相关的HTTP请求,如注册、登录等。PassengerController:处理乘客信息的增删改查请求。TicketController:处理车票查询请求。FeignTicketController:通过Feign调用其他服务的车票保存接口。TestController:用于测试,返回配置信息和端口号。5.请求与响应类XXXReq:封装前端请求数据,包含数据校验注解。XXXResp:封装后端响应数据,如分页数据、登录信息等。6.配置类SpringMvcConfig:配置SpringMVC拦截器,包括日志和会员认证拦截器。4.3.2business模块类图此代码库围绕铁路票务系统中的确认订单功能开发,包含多个功能模块,以下是各模块及类的简述:1.实体类ConfirmOrder:用于存储确认订单的相关信息,包含订单ID、会员ID、日期、车次编号、出发站、到达站、余票ID、订单状态、创建时间、修改时间以及车票信息等。2.数据访问层ConfirmOrderMapper:作为数据访问接口,提供对

ConfirmOrder

实体表的基本增删改查操作,如插入、按主键查询、按主键更新和按主键删除等。3.服务层ConfirmOrderService:处理确认订单的业务逻辑,依赖

ConfirmOrderMapper

进行数据操作。提供的功能包括:save:保存确认订单信息。queryList:查询确认订单列表,并进行分页处理,返回分页响应数据。delete:根据订单ID删除确认订单。doConfirm:处理确认订单的异步出票逻辑,包含令牌校验、分布式锁处理、订单状态更新等操作。updateStatus:更新确认订单的状态。sell:处理售票业务,包括余票校验、座位选择、事务处理等。4.响应类ConfirmOrderQueryResp:用于封装确认订单查询的响应数据,其属性与

ConfirmOrder

实体类基本一致,用于将查询结果返回给前端。5.类之间的关系ConfirmOrderMapper

ConfirmOrder:ConfirmOrderMapper

操作

ConfirmOrder

实体,实现对

ConfirmOrder

表的增删改查。ConfirmOrderService

ConfirmOrderMapper:ConfirmOrderService

使用

ConfirmOrderMapper

来完成数据的持久化操作。ConfirmOrderService

ConfirmOrder:ConfirmOrderService

ConfirmOrder

实体进行业务逻辑处理,如保存、删除、更新状态等。ConfirmOrderService

ConfirmOrderQueryResp:ConfirmOrderService

在查询确认订单列表时,将查询结果封装成

ConfirmOrderQueryResp

类型的分页响应数据返回。4.3.3business模块类图1.实体类BusinessException:封装业务异常,含BusinessExceptionEnum属性,重写fillInStackTrace提升性能。BusinessExceptionEnum:定义多种业务异常枚举,如手机号、车站、车次等相关异常。CommonResp:通用响应类,含成功标志、消息和泛型内容。MemberLoginResp:会员登录响应,有ID、手机号和令牌。PageReq:分页请求,含页码和每页条数。PageResp:分页响应,含总条数和当前页列表。MemberTicketReq:会员车票请求,含会员、乘客、车次、座位等信息。2.服务工具类JwtUtil:生成、校验JWT令牌。SnowUtil:生成雪花算法ID。3.拦截器与切面LogIntercerInterceptor:从请求头解析令牌,设置登录会员信息。LogAspect:记录控制器请求信息、返回结果及耗时。4.异常处理ControllerExceptionHandler:统一处理系统、业务和校验异常,封装成CommonResp返回。5.上下文LoginMemberContext:用ThreadLocal存储登录会员信息。6.类关系BusinessException包含BusinessExceptionEnum。ControllerExceptionHandler处理BusinessException,返回CommonResp。MemberInterceptor使用JwtUtil解析令牌,设置LoginMemberContext中的MemberLoginResp。LoginMemberContext存储MemberLoginResp。4.3.4gateway模块类图1.实体类ConfirmOrder:存储确认订单的相关信息,涵盖订单ID、会员ID、日期、车次编号等多个属性。2.数据访问层ConfirmOrderMapper:作为接口,提供对ConfirmOrder实体表的基本增删改查操作,包含插入、按主键查询、按主键更新和按主键删除等方法。3.服务层ConfirmOrderService:处理确认订单的业务逻辑,依赖ConfirmOrderMapper完成数据持久化操作。其功能有保存订单信息、查询订单列表并分页、删除订单、处理异步出票逻辑、更新订单状态以及处理售票业务等。4.响应类ConfirmOrderQueryResp:用于封装确认订单查询的响应数据,属性和ConfirmOrder实体类基本一致,目的是把查询结果返回给前端。5.类间关系:ConfirmOrderMapper操作ConfirmOrder实体,实现对ConfirmOrder表的增删改查。ConfirmOrderService使用ConfirmOrderMapper来进行数据持久化。ConfirmOrderService对ConfirmOrder实体开展业务逻辑处理。ConfirmOrderService在查询确认订单列表时,将结果封装成ConfirmOrderQueryResp类型的分页响应数据返回。4.3.5generator模块类图1.实体类Field:存储数据库表字段信息,如名称、类型、注释等,为代码生成提供基础数据。2.数据访问层DbUtil:提供数据库交互功能,可获取连接、表注释和列信息,为代码生成提取表结构数据。3.服务层ServerGenerator:核心代码生成类,启动main方法后,能生成服务器端和Vue代码。依赖DbUtil获取数据,依赖FreemarkerUtil处理模板生成代码。EnumGenerator:负责将Java枚举转为JavaScript对象和数组,并写入JS文件。4.工具类FreemarkerUtil:用于Freemarker模板引擎的配置和文件生成。5.类之间的关系DbUtil与Field:DbUtil创建并封装Field对象,提取表字段信息。ServerGenerator与DbUtil:ServerGenerator调用DbUtil获取数据。ServerGenerator与FreemarkerUtil:ServerGenerator借助FreemarkerUtil生成代码。EnumGenerator与FreemarkerUtil:同属代码生成模块,可能协同工作。4.1系统时序图4.1.1车次信息管理时序图车次信息管理包括数据模型、请求和响应类及部分服务方法。Train

Station

类定义了车次和车站的基本属性;TrainSaveReq、StationSaveReq

等请求类用于接收客户端请求数据,包含车次、车站、车厢、座位、余票、令牌等信息,且有日期、车次编号等字段的校验;TrainQueryResp、TrainStationQueryResp

等响应类用于返回查询结果;ConfirmOrderService

中的

reduceTickets

方法用于减少余票数量,会根据座位类型进行相应扣除;SkTokenService

genDaily

方法负责生成指定日期和车次的令牌信息,先删除旧记录,再根据座位数和到站数计算并插入新的令牌数量。整体围绕车次信息的生成、查询、更新和余票管理等功能。4.1.2订单确认时序图订单确认时序图展示了用户发起订单确认请求后的一系列操作流程。用户向

BeforeConfirmOrderService

发起

beforeDoConfirm

调用,随后进入循环,按前端传值的排队人数多次校验令牌余量。若令牌校验不通过,BeforeConfirmOrderService

抛出异常并结束流程;若校验通过,保存订单数据到数据库,调用

ConfirmOrderService

doConfirm

方法处理订单。最终,ConfirmOrderService

将处理结果返回给

BeforeConfirmOrderService,由其向用户返回订单ID。4.1.3票务处理时序图票务处理时序图聚焦于订单处理后的票务操作。ConfirmOrderService

开启票务处理流程,先调用

DailyTrainTicketService

查询余票信息。接着进行余票预扣减和判断,根据用户是否选座采取不同策略,有选座时计算座位偏移值,无选座则按默认规则选座。完成选座操作得到最终结果后,调用

AfterConfirmOrderService

处理选座后的事务,如更新座位和余票信息等。最后,AfterConfirmOrderService

将处理结果返回给

ConfirmOrderService。5编码与实现5.1会员模块会员模块在数据访问层面,PassengerMapper

接口定义了对

Passenger

表的增删改查操作,PassengerExample

类提供丰富的查询条件构建方法,如按姓名、身份证、创建时间等字段进行比较、范围查询和模糊查询。业务逻辑层的

PassengerService

类承担核心业务处理,save

方法用于保存或更新乘客信息,queryList

方法实现分页查询乘客列表,delete

方法根据ID删除乘客,queryMine

方法查询当前登录会员的所有乘客并按姓名升序排列,init

方法用于初始化乘客数据以避免线上体验时数据为空。TicketService

类负责票务的新增、查询和删除操作。控制器层方面,PassengerController

提供

/passenger/save、/passenger/query-list、/passenger/delete/{id}

/passenger/query-mine

等接口处理乘客信息的保存、查询和删除;TicketAdminController

提供

/admin/ticket/query-list

接口供管理员查询票务信息。此外,TestController

用于测试配置中心功能,通过Nacos获取配置信息。PassengerSaveReq

TicketSaveReq

类作为请求类,对请求参数进行校验;PassengerQueryResp

TicketQueryResp

类作为响应类,封装返回数据。PassengerTypeEnum

枚举类定义了乘客类型。配置文件

perties

配置了应用服务端口、数据库连接信息等,logback-spring.xml

配置了日志输出。整体项目结构清晰,各模块分工明确,实现了会员模块中乘客和票务信息的管理功能。分享5.2业务模块业务模块在数据请求层面,定义了多个请求类用于封装前端传来的数据并进行校验。DailyTrainSaveReq、TrainSaveReq分别用于保存每日列车和普通列车信息,包含车次编号、类型、始发站、终点站、出发和到站时间等必要信息,且对这些信息进行了非空校验。StationSaveReq用于保存车站信息,要求站名、站名拼音和站名拼音首字母不能为空。TrainCarriageSaveReq负责保存列车车厢信息,对车次编号、厢号、座位类型、排数等字段进行校验。TrainSeatSaveReq和DailyTrainSeatSaveReq用于保存列车座位信息,除了车次、厢序、排号、列号、座位类型等基本信息外,DailyTrainSeatSaveReq还增加了日期和售卖情况字段,并对各字段进行了严格的非空校验。TrainStationSaveReq和DailyTrainStationSaveReq用于保存列车站点信息,包含车次编号、站序、站名、进站和出站时间、停站时长、里程等信息,同样对关键字段进行了非空校验。此外,TrainQueryReq和StationQueryReq继承自PageReq,用于分页查询列车和车站信息。在数据响应层面,TrainQueryResp和StationQueryResp类分别封装了列车和车站的查询结果,包含了相应的基本信息和创建、修改时间,并使用@JsonFormat注解对日期格式进行了规范。在数据查询条件构建方面,TrainStationExample类提供了丰富的查询条件构建方法。它允许根据列车站点的多个字段(如id、trainCode、index、name等)进行比较、范围查询、模糊查询等操作,支持isNull、isNotNull、equalTo、notEqualTo、greaterThan、lessThan等多种条件,方便根据不同的业务需求筛选数据。整体而言,该业务模块通过合理的请求类设计、规范的响应类封装以及灵活的查询条件构建,实现了对列车业务信息的全面管理和高效查询,为列车业务的稳定运行提供了坚实的基础。5.3批处理模块批处理模块在数据请求层面,定义了多个请求类用于封装前端传来的数据并进行校验。CronJobReq用于封装定时任务的相关信息,包括任务组、任务名、描述和Cron表达式等,可用于创建、暂停、重启、更新和删除定时任务等操作。在数据响应层面,CronJobResp类封装了定时任务的查询结果,包含任务组、任务名、描述、状态、Cron表达式、下次执行时间和上次执行时间等信息,并使用@JsonFormat注解对日期格式进行了规范。在数据交互层面,定义了多个Feign客户端接口用于与其他服务进行远程调用。BusinessFeign用于调用业务服务的接口,如获取业务服务的问候语、生成指定日期的每日车次数据等;MemberFeign用于调用会员服务的接口,如初始化乘客数据。在定时任务执行方面,定义了多个Job类用于执行具体的定时任务。DailyTrainJob用于生成15天后的车次数据;PassengerJob用于初始化乘客数据,防止线上体验时乘客被删光;TestJob为测试用的定时任务,执行时会打印开始和结束信息。在配置方面,通过perties配置了服务器端口、上下文路径、数据库连接信息、MyBatisXML文件路径和日志级别等;通过logback-spring.xml配置了日志的输出格式和存储路径;通过perties配置了Nacos注册中心和配置中心的地址、命名空间,以及Sentinel相关的配置。整体而言,该批处理模块通过合理的请求类设计、规范的响应类封装、便捷的数据交互接口、具体的定时任务实现以及完善的配置管理,实现了对定时任务的全面管理和对其他服务的远程调用,为系统的稳定运行和业务逻辑的自动化处理提供了坚实的基础。5.4网关模块在数据请求层面,定义多个请求类封装前端传来的数据并校验,CronJobReq用于封装定时任务相关信息如任务组、任务名、描述和Cron表达式等,支持创建、暂停、重启、更新和删除定时任务操作。数据响应层面,CronJobResp类封装定时任务查询结果,含任务组、任务名、描述、状态、Cron表达式、下次及上次执行时间等信息,且用@JsonFormat注解规范日期格式。数据交互层面,定义多个Feign客户端接口与其他服务远程调用,BusinessFeign调用业务服务接口如获取问候语、生成每日车次数据等,MemberFeign调用会员服务接口如初始化乘客数据。定时任务执行方面,定义多个Job类执行具体任务,DailyTrainJob生成15天后车次数据,PassengerJob初始化乘客数据防止线上体验时被删光,TestJob为测试用定时任务执行时打印开始和结束信息。配置方面,通过perties配置服务器端口、上下文路径、数据库连接信息、MyBatisXML文件路径和日志级别等,通过logback-spring.xml配置日志输出格式和存储路径,通过perties配置Nacos注册中心和配置中心地址、命名空间及Sentinel相关配置。整体来看,该批处理模块经合理请求类设计、规范响应类封装、便捷数据交互接口、具体定时任务实现及完善配置管理,实现定时任务全面管理和其他服务远程调用,为系统稳定运行和业务逻辑自动化处理提供坚实基础。5.5公共模块在数据请求层面,定义了多个请求类用于封装前端传来的数据并进行校验。MemberTicketReq用于封装会员车票相关请求数据,可获取座位列信息;PageReq用于封装分页请求信息,包含页码和每页条数,并对其进行非空和最大条数校验。在数据响应层面,CommonResp类用于通用响应封装,可设置响应的成功状态和消息;MemberLoginResp用于封装会员登录响应信息,可设置手机号和令牌;PageResp用于封装分页响应信息,包含总条数和当前页列表。在数据交互层面,定义了多个Feign客户端接口用于与其他服务进行远程调用(文档未明确体现具体接口方法)。在异常处理方面,通过ControllerExceptionHandler对校验异常(如BindException)进行统一处理,返回封装了错误信息的CommonResp。在工具类方面,SnowUtil封装了hutool雪花算法,可生成唯一ID及ID字符串;JwtUtil可用于创建、验证JWT令牌及获取令牌中的JSON数据。在日志处理方面,通过LogAspect切面类对所有com.veii包下的Controller类的方法进行拦截,在方法执行前后打印请求和响应信息,排除特殊类型参数和敏感字段,并记录方法执行耗时。在配置方面,通过common/pom.xml配置了项目的依赖,包括SpringBootWeb、SpringCloud、SpringBootAOP、FastJSON、Hutool等。整体而言,该模块通过合理的请求类设计、规范的响应类封装、便捷的数据交互接口、完善的异常和日志处理、实用的工具类以及合理的依赖配置,实现了对业务数据的请求、响应处理,数据交互和异常处理,为系统的稳定运行和业务逻辑的实现提供了坚实的基础。分享6测试6.1功能测试6.1.1登录功能测试测试项名称登录功能测试应用场景用户登录会员界面编号前置条件输入说明步骤预期结果实际结果login_1进入登录界面输入全部符合要求输入电话号码点击获取验证码输入正确验证码(8888)点击登录按钮登录成功登录成功login_2进入登录界面

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论