资讯动态

基于Java的机场航班起降与协调管理系统毕业设计全解析

发布时间:2026/10/18 16:11:25 来源:尧图企业网站定制
简介基于Java的机场航班起降与协调管理系统毕业设计完整资料包面向计算机专业毕业生、Java Web学习者及需要快速搭建课设项目的人群。资源围绕航班调度与协调管理场景涵盖需求分析、系统架构设计、编码实现、测试优化及答辩展示全流程适合用于毕业设计参考或项目实战练手。压缩包仅84.93MB包含项目报告、答辩PPT、源代码、数据库脚本、系统截图及部署演示视频等核心内容虽未统计具体文件数量但各类型资料分工明确源代码支撑二次开发数据库文件用于环境还原部署视频辅助复现运行过程。目前已有495人学习浏览实用性得到初步验证。通过该项目读者可系统掌握Java Web开发中的MVC模式、Servlet与JSP交互、Spring及MyBatis框架应用、关系型数据库设计等关键技能同时学习如何撰写规范的技术文档、制作答辩材料并完成项目部署对提升工程实践与求职竞争力有直接帮助。1. 机场航班起降与协调管理系统毕设选题的价值与含金量基于 Java 的机场航班起降与协调管理系统毕业设计听起来像是一堆增删改查但真正的难点集中在两个地方跑道的时间冲突和停机位的实时释放。我见过不少同学把航班表、跑道表、停机位表建好就以为完事了等到做调度功能时才发现同一个跑道在相近时间被分配给两个航班系统也照单全收。这套系统的价值在于让“协调”两个字落地——用代码约束同一资源在同一时刻只能给一个航班使用。标题里的这个毕设包包含了项目报告、答辩 PPT、源代码、数据库、截图和部署视频这提醒你交付的不只是一份能跑的代码而是一套完整的项目叙事需求怎么拆、表怎么建、算法怎么写、文档怎么组织、答辩怎么演示。适合想用 Spring Boot 方向练手、又希望选题有业务深度的同学也适合想在答辩时讲出“冲突检测”这种真实业务难点的人。2. 系统架构与数据模型把起降协调拆成表、状态机和角色整体架构我一般建议用 Spring Boot MyBatis MySQL Thymeleaf前端用服务端渲染不搞前后端分离。理由很实际Spring Boot 内嵌 Tomcat打包成一个 jar 就能在其他机器上跑起来答辩演示时少很多环境坑MyBatis 把 SQL 写在 XML 里老师一问“这个冲突检测怎么实现的”你可以直接展示 SQL 和 Java 代码比 JPA 自动生成的逻辑更好讲清楚MySQL 则是最稳妥的毕设数据库导出 sql 文件就能复现整个项目结构。下面先把数据模型立住再谈实现。2.1 角色与用例机场人员如何操作系统系统里我设计了三种角色对应真实机场中的不同岗位。系统管理员维护用户、跑道、停机位等基础数据机场调度员是核心使用者负责创建航班计划、分配跑道和停机位、处理延误和备降查询员只能查看航班动态不能修改任何数据。角色划分越清晰后期的权限控制和页面按钮显示就越容易做答辩时也可以顺手提一句“不同角色看到的菜单不同”。用例上调度员的主要操作包括新增航班计划、查询当天起降航班、为航班分配跑道、为航班分配停机位、处理延误/备降/取消、查看协调记录。系统管理员还有用户管理和基础数据管理。这些用例基本对应了你项目中需要开发的页面和接口建议在项目报告的用例图里全部画出来答辩时用一张图说明功能范围。2.2 核心数据表设计航班、跑道、停机位、调度单航班表是核心中的核心字段要能支撑起降和协调两个关键词。我这里给出一份可以直接用的建表 SQL你可以在自己的数据库里执行。CREATE TABLE flight ( id BIGINT PRIMARY KEY AUTO_INCREMENT, flight_no VARCHAR(10) NOT NULL COMMENT 航班号, aircraft_type VARCHAR(20) NOT NULL COMMENT 机型, origin VARCHAR(30) NULL COMMENT 出发城市, destination VARCHAR(30) NULL COMMENT 到达城市, type TINYINT NOT NULL COMMENT 0起飞 1降落, plan_time DATETIME NOT NULL COMMENT 计划起降时间, actual_time DATETIME NULL COMMENT 实际起降时间, status TINYINT NOT NULL DEFAULT 0 COMMENT 0计划 1滑行 2完成 3延误 4取消, runway_id BIGINT NULL COMMENT 当前占用跑道ID, gate_id BIGINT NULL COMMENT 当前停机位ID, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, KEY idx_plan_time (plan_time), KEY idx_status (status) ) COMMENT航班表;这里有意把时间字段全部用 DATETIME而不是 VARCHAR。理由是后续排序、区间冲突检测都依赖时间比较字符串排序会出现“2024-06-02 09:00”排在“2024-06-01 12:00”前面的错误。runway_id 和 gate_id 是逻辑外键后面会通过业务代码维护不建议在这里强行加物理外键因为删除航班时会有一堆关联约束反而增加开发负担。跑道表记录跑道编号、长度、状态停机位表还应该有机型容量字段用来匹配大飞机和小飞机。真正的“协调”记录则放到单独的 schedule_record 表里记录跑道分配、停机位分配、时间变更原因和时间。2.3 航班生命周期状态机从计划到起降航班不是一条静态记录它有一个从计划到完成的状态流转过程。状态机的设计直接影响后面的业务逻辑复杂度。我习惯用一张状态表来约束流转关系。状态码名称含义后续动作0计划航班已创建未开始滑行分配跑道和停机位1滑行飞机推出或落地后滑跑中跑道占用锁定2完成已起飞离场或已落地到位释放跑道和停机位3延误计划时间变更重新分配时间窗4取消航班取消释放已分配资源状态流转规则是计划 - 滑行 - 完成这是主链计划可以跳转到延误或取消延误处理完可以回到计划。在代码里不要在 Controller 中直接改状态而是抽取一个changeFlightStatus方法统一处理凡是进入“完成”或“取消”状态都要自动释放该航班占用的跑道和停机位。这样能避免“航班状态都取消了跑道还显示占用”这种低级问题。2.4 技术选型对比Spring Boot MyBatis 为什么够用有些同学纠结要不要用 Spring Cloud或者把系统做成分布式。对一个毕业设计来说单机 Spring Boot 完全够用而且更好答辩。项目里的“协调”更多是业务层的时间窗冲突检测不是高并发场景不需要引入消息队列和分布式锁。MyBatis 相比 JPA 的优势在于可控跑道冲突的 SQL 可以直接写在 XML 里调试观察执行计划老师问细节你也答得上来。前端选 Thymeleaf 是因为它能和 Spring Boot 无缝集成页面数据渲染由后端完成部署时不需要单独起 Node 服务。如果你一定要用 Vue也能做但需要额外处理跨域和静态资源分离建议把精力留给核心调度算法。3. 核心业务实现CRUD、跑道冲突检测与停机位分配数据模型建好后接下来就是写业务代码。这一章挑选三个最关键的部分详细展开航班管理、跑道冲突检测和停机位分配。航班管理是基础 CRUD跑道冲突检测是整个系统的灵魂停机位分配则考验你对业务规则的理解。坐标管理系统里真正的“协调”就是这几个模块之间如何保证资源不被重复分配。3.1 航班管理CRUD 与批量导入先给一个最简 Controller 骨架展示如何组织接口。RestController RequestMapping(/api/flight) public class FlightController { Autowired private FlightService flightService; PostMapping public Result create(RequestBody FlightCreateDTO dto) { flightService.create(dto); return Result.success(); } GetMapping(/list) public Result list(RequestParam(required false) Integer type, RequestParam(required false) String flightNo) { return Result.success(flightService.list(type, flightNo)); } PutMapping(/{id}/status) public Result changeStatus(PathVariable Long id, RequestParam Integer status) { flightService.changeStatus(id, status); return Result.success(); } }FlightCreateDTO是入参对象里面只放前端传来的字段避免把实体类直接暴露给前端。create 方法里需要校验两件事航班号不能重复plan_time 不能早于当前时间。批量导入时我一般用 POI 读取 Excel逐行解析成 Flight 对象然后批量插入数据库中间任何一行失败都要回滚整批数据否则会出现导入一半成功一半失败的情况。这个逻辑可以在 Service 层加Transactional注解。3.2 跑道分配时间窗冲突检测算法跑道分配本质上是一个时间区间重叠判断问题。假设起飞航班需要占用跑道 15 分钟降落航班需要占用 10 分钟那么两个航班的时间窗只要重叠就不能共用同一条跑道。区间重叠的 Java 判断代码很简单。public boolean isOverlap(LocalDateTime start1, LocalDateTime end1, LocalDateTime start2, LocalDateTime end2) { return start1.isBefore(end2) start2.isBefore(end1); }这段代码用的是左闭右开区间 [start, end)。意思是如果前一个航班在 10:00 结束后一个航班在 10:00 开始这两个航班不冲突只有后一个航班开始时间早于前一个结束时间才判定为重叠。分配跑道时先把所有已占用的跑道时间段查出来过滤掉有空闲的跑道选第一条空闲的分配给航班。public synchronized AssignResult assignRunway(FlightApply apply) { ListRunwayOccupy occupies runwayOccupyMapper .findOverlap(apply.getStartTime(), apply.getEndTime()); ListLong freeRunways runwayMapper.findAll() .stream().filter(r - occupies.stream() .noneMatch(o - o.getRunwayId().equals(r.getId()))) .map(Runway::getId).collect(Collectors.toList()); if (freeRunways.isEmpty()) { return AssignResult.fail(当前跑道全部占用建议调整航班时间); } Long runwayId freeRunways.get(0); runwayOccupyMapper.insert(apply.getId(), runwayId, apply.getStartTime(), apply.getEndTime()); flightMapper.updateRunway(apply.getId(), runwayId); return AssignResult.success(runwayId); }方法上加了synchronized作用是保证在同一时间只有一个线程能执行分配逻辑防止两个请求同时查到同一条空闲跑道。虽然放到真实集群环境会有问题但单机部署的毕业设计足够用。findOverlap的 SQL 要自己写核心条件是start #{end} AND end #{start}这样数据库层就已经过滤掉大部分不冲突的记录了。分配完成后要更新航班表的 runway_id同时向占用表插入一条记录这两个操作必须在同一个事务里。3.3 停机位分配优先级与释放停机位分配比跑道多一个约束条件机型必须匹配。大飞机不能停小停机位所以停机位表里要有一个 capacity 字段分配时先过滤掉容量不够的停机位再按优先级排序。优先级策略我一般用两个因子计划起飞时间早的优先航班号字典序小的优先。用 SQL 排序比在 Java 里排序更简单。释放停机位的逻辑相对独立因为航班可能被取消、可能临时更换停机位甚至备降后需要重新分配。释放时要同时更新停机位状态和航班表的 gate_id 字段。Transactional public void releaseGate(Long flightId) { Flight flight flightMapper.findById(flightId); if (flight.getGateId() ! null) { gateMapper.updateStatus(flight.getGateId(), 0); flightMapper.updateGate(flightId, null); } }这里的updateStatus(gateId, 0)把停机位状态改为空闲updateGate把航班关联的停机位置空。注意Transactional必须加因为两个更新操作任意一个失败都会导致数据不一致。一个常见事故是停机位释放了但航班表仍保留旧 gate_id后续查航班详情时就会看到一条“幽灵停机位”。3.4 协调管理延误、备降与取消流程“协调”这两个字主要体现在异常情况处理上。延误时航班要重新分配时间窗并清空原来的跑道占用备降时航班可能没有计划时间系统要立即寻找空闲跑道和停机位取消时要释放所有资源。这些操作我统一放到一个 CoordinationService 里每个方法都加事务。示例延误处理流程是更新航班状态为 3、删除旧的跑道占用记录、按新时间重新分配跑道。如果新时间冲突就返回失败提示要求调度员手动换一个时间。备降处理要有优先级因为备降航班通常时间敏感我建议先占用一个空闲停机位再处理跑道。取消处理最简单释放资源后把状态置为 4。这里要注意所有涉及状态变更的接口都要在协调记录表里插入一条日志包括操作人、原状态、新状态、原因和处理时间。答辩时老师看到审计日志会觉得你的系统完整性高出不少层次。4. 项目报告、答辩PPT与部署视频从能跑到能答辩的完整交付这个标题最后带了一长串交付物清单项目报告、答辩 PPT、源代码、数据库、截图和部署视频这意味着你不能只写代码。很多同学代码能跑但报告写得像软件工程教材目录PPT 全是文字视频录制时环境起不来结果答辩评分上不去。其实这部分比代码更容易拉开差距因为它是老师判断你是否理解自己项目的重要依据。4.1 项目报告的结构与干货点项目报告建议按这个章节框架写绪论需求分析系统设计详细设计与实现系统测试总结与展望。绪论里重点写机场调度背景和“是否可以用算法减少跑道占用冲突”的选题意义需求分析要画出角色用例图和功能列表系统设计要包含架构图、E-R 图和数据库表清单详细设计与实现要写清跑道冲突检测算法、停机位分配策略系统测试要有测试用例表。干货点一定放在“跑道冲突检测算法”这一节把区间重叠公式、时间窗边界条件、并发处理方式写清楚这部分是老师最爱问的技术点。报告忌写成名词堆砌。不要大段复制 Spring Boot 官方文档而是要写“本系统的航班表为什么用 DATETIME 不用 VARCHAR”“停机位释放逻辑如何避免资源泄漏”。这类结合具体问题的话才能让老师相信系统是你亲手做的。4.2 答辩PPT每一页讲什么、演示怎么串答辩 PPT 控制在 12 到 15 页每页只讲一个核心点。我通常这样安排第一页封面写题目第二页背景和意义第三页需求分析第四页技术选型第五页功能结构第六页数据库 E-R 图第七页核心算法——跑道冲突检测第八页核心代码展示第九页系统截图第十页测试结果第十一页总结第十二页致谢。演示时先花两分钟讲需求再用三分钟讲架构和数据表接下来五分钟进入代码演示最后留一分钟总结。代码演示环节不要照着代码念要当场演示一个冲突场景给两个航班分配同一条跑道系统如何拒绝第二个航班。这个演示做完基本可以回答“系统怎么体现协调”这个问题。4.3 截图与部署视频的录制规范截图要清晰展示三个层次系统主界面、数据库表结构、核心代码。截图分辨率建议 1920x1080窗口别最小化标签页要能看清接口路径。部署视频更讲究录制前先把 MySQL、JDK、Maven 环境检查一遍脚本跑通后再录。视频里要展示从启动数据库到执行 SQL 初始化脚本再到运行 jar 包最后浏览器访问的全过程。不要在视频里临场去查错误日志更不要把编译器的大红报错录进去。我见过有人录了 20 分钟视频其中 10 分钟在解决环境问题这种视频宁可重录也不要交给老师。5. 避坑记录航班调度系统里最容易翻车的5个细节做这类系统最大的风险不是代码跑不起来而是数据不一致。下面这 5 个坑是我在带毕设过程中反复看到的每一个都能让原本看起来正常的系统在演示时突然崩溃。5.1 时间字段用 String 存取排序和区间判断全乱现象航班列表按计划时间排序时结果顺序完全不对比如“2024-06-02 09:00”出现在“2024-06-01 12:00”前面。原因数据库字段用了 VARCHARJava 里用 String 接收排序按照字典序比较。解决数据库字段用 DATETIMEJava 实体用 LocalDateTimeMyBatis 映射时显式指定 jdbcType。result columnplan_time propertyplanTime jdbcTypeTIMESTAMP/这样查询列表 ORDER BY plan_time 才能按时间排序跑道冲突检测的isBefore和isAfter才不会出错。5.2 跑道分配并发冲突两个航班同时分配到同一个跑道现象同时提交两个航班分配请求关闭控制台日志看两个请求都拿到了同一条空闲跑道最终生成两条占用记录。原因分配逻辑没有锁保护线程 A 查完空闲列表后线程 B 也执行了同样的查询两个线程都以为跑道可用。解决在分配方法上加synchronized或者在跑道占用表加唯一索引。我给一个双保险写法。CREATE UNIQUE INDEX uk_runway_time ON runway_occupy(runway_id, start_time);加上唯一索引后即使业务层漏了锁数据库也会拒绝同一跑道同一开始时间的重复记录避免脏数据。5.3 MySQL 连接参数忘加时区和编码现象项目启动后查询航班时间全部相差 8 小时页面中文显示乱码。原因JDBC URL 缺少serverTimezone和characterEncoding参数。解决把连接字符串写成下面这样。jdbc:mysql://localhost:3306/airport_demo?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai这里serverTimezoneAsia/Shanghai解决的是 MySQL 服务器时区与本地不一致的时间偏移characterEncodingutf8解决乱码。注意 MySQL 版本不同时区参数可能需要配置数据库端变量。5.4 删除航班时外键约束阻断现象删除一条已经分配过跑道的航班记录系统直接抛异常提示违反外键约束。原因schedule_record 或 runway_occupy 表里保存了 flight_id主外键关系阻止了直接删除。解决删除航班前先删除关联记录或者给外键配置ON DELETE CASCADE。两个方案我更推荐前者因为级联删除容易误删但代码里维护更可控。示例DELETE FROM runway_occupy WHERE flight_id #{flightId}; DELETE FROM schedule_record WHERE flight_id #{flightId}; DELETE FROM flight WHERE id #{flightId};把这三个操作放进同一个事务保证要么全部成功要么全部回滚。5.5 答辩演示时数据缺失现场查不到航班现象演示到一半老师问某个航班号你输入后返回空列表页面一片空白。原因开发时随手造的数据在测试过程中被删了或者没有准备完整的演示数据。解决写一个data.sql初始化脚本包含至少 10 条航班、5 条跑道、5 个停机位、多条正常和延误记录在 Spring Boot 启动时自动加载。spring.sql.init.modealways spring.sql.init.schema-locationsclasspath:schema.sql spring.sql.init.data-locationsclasspath:data.sql我习惯在演示前重新执行一次数据库初始化确保数据是完整可复现的而不是依赖开发时的手工改动。这个习惯能避免很多现场事故。6. 进阶技巧定时任务自动释放停机位让系统更像真实调度系统基础功能做完后想让系统在答辩时更有说服力建议加一个 Spring 定时任务自动释放长时间未释放的停机位。真实机场不会让调度员一直盯着屏幕手动手动操作系统应该能主动识别异常状态。我用Scheduled实现一个简单版本。Component public class GateReleaseTask { Autowired private FlightMapper flightMapper; Autowired private GateMapper gateMapper; Scheduled(fixedDelay 60000) public void releaseExpiredGates() { LocalDateTime threshold LocalDateTime.now().minusHours(2); ListFlight flights flightMapper.findLandedUnreleased(threshold); for (Flight f : flights) { gateMapper.release(f.getGateId()); flightMapper.updateGate(f.getId(), null); } } }fixedDelay 60000表示上一次任务执行完后再等 60 秒运行不会因为任务耗时产生重叠执行。threshold是边界参数你可以根据机场规则改成 30 分钟或更长。findLandedUnreleased这条 SQL 要查状态是“完成”且 gate_id 不为空、落地时间超过 2 小时的航班你可以自己在 Mapper XML 里写。加上这个定时任务系统就具备了“自动协调”的能力答辩时你可以说停机位不会长期被占用系统会按规则自动回收。我习惯在交付前检查三件事数据库初始化脚本能否干净执行、jar 包能否在另一台机器上跑起来、演示数据是否足够撑起三分钟讲解。把这些写进自己的交付清单后我很少再遇到现场翻车的情况。这个方向真的值得做哪怕标题只写“毕业设计”但把协调调度逻辑做完后你收获的算法能力和工程思维是普通增删改查项目给不了的。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑