机场调度系统这类题目,在计算机毕设里属于典型的“看着很唬人,实际很好做”的选题。很多同学一看到“智慧机场”“地面保障”“协同系统”这几个词就吓住了,觉得自己搞不定。其实拆开来看,它的核心就是:用Java和SpringBoot,把航班、机位、保障任务这三类数据进行合理的管理和调度。我这些年帮不少学生梳理过这个题目,也自己动手搭过类似的框架,今天就把从选题到落地的完整思路写出来,包括技术选型、数据库设计、算法细节、部署避坑,以及怎么在答辩时把亮点讲清楚。
先说说适合什么人看。如果你正准备做SpringBoot相关的毕业设计,尤其是带一点“调度”“管理”“协同”色彩的系统,这篇文章可以直接作为你的设计参考。哪怕你选的题目不是机场,而是医院排号、体育馆场地预定、港口泊位调度,底层逻辑也完全相通。如果你是新手,对Java基础、SpringBoot版本选择、MyBatis-Plus生成建表SQL、启动失败排查这些高频问题有困惑,这篇文章里也会逐个给到答案。
1. 机场调度的业务模型:先搞懂你要管的是什么
1.1 把“航班起降”拆成几个典型场景
我见过太多人拿到题目就急着写代码,结果写出来的系统只是飞机信息表的增删改查,完全没有“调度”的影子。要避免这个问题,第一步一定是把业务场景拆清楚。
机场调度里最常见的场景有三个。第一是航班计划管理:每天有几十上百个航班,每个航班有计划起飞时间、计划到达时间、执飞航空公司、航班号、起降类型(进港、离港、经停)。第二是机位分配:一架飞机落地后要停到某个机位,需要这个机位空闲、类型匹配(窄体机、宽体机)、且占用时间不冲突。第三是地面保障协同:飞机停好后,需要摆渡车、廊桥、行李车、加油车、清洁队等一系列保障任务在规定时间内到位,否则会影响下一个航班的进出港。
把这三个场景映射到系统里,就是三个核心模块:航班动态管理、机位调度管理、保障任务协同管理。三者的关系是一条主链路:航班落地或起飞前,先生成动态信息;动态信息触发机位分配;机位确定后,围绕机位和航班生成保障任务。
1.2 三个核心实体:航班、机位、保障任务
数据库设计是这个项目的灵魂。很多人用SpringBoot写毕设,喜欢拿一张表搞定所有事,后面扩展的时候哭都来不及。机场调度系统的核心实体至少应该包含三个:
航班表(flight_info),字段包括航班号、起降类型、计划起飞时间、计划到达时间、实际起飞时间、实际到达时间、出发地、目的地、机型、所属航空公司、航班状态(计划、登机、起飞、巡航、到达、取消等)。
机位表(gate_info),字段包括机位编号、所在航站楼、机位类型(近机位、远机位)、可容纳机型等级、当前状态(空闲、占用、维护)、备注。部分系统会把机位和廊桥绑定,那可以再加一个廊桥编号字段。
航班机位调度表(flight_gate_assign),不建议直接改航班表里的机位字段,而是单独建一张分配记录表,记录航班号、机位号、计划开始占用时间、计划结束占用时间、实际占用开始时间、结束时间、分配状态。这样历史数据可查,将来做排序和冲突检测也方便。
保障任务表(support_task)也不能少:任务编号、航班号、机位编号、任务类型(行李装卸、加油、客舱清洁、摆渡车、廊桥对接)、责任单位、计划开始时间、计划结束时间、实际完成时间、状态(待派发、进行中、已完成、超时)。
这几张表之间通过航班号或机位编号关联。在MyBatis-Plus里,用实体类加注解的方式直接映射就行,省去手写大量XML的时间,这一点放到后面的技术选型里细讲。
1.3 这个题目的重点和难点
先泼一盆冷水:这个题目拿及格很容易,拿优秀很难。及格线是把航班的增删改查做出来,再加一个简单的机位分配下拉框。想要拿高分,你必须把“调度”两个字做出含金量——也就是算法逻辑。
机位分配算法是核心加分点。真实机场的机位分配要考虑机型匹配、占用时间窗、廊桥优先、转场时间间隔、航站楼区域匹配等多个约束条件。在我的实践里,比较适合毕设实现的方案是:先把空闲机位筛选出来,再按照与航班的匹配度打分,分数高的优先分配,这是一种贪心思路。至于排序选型、打分细节,我会在后面的实操章节展开。
另一个难点是保障任务的时序。一个航班从落地到再次起飞,中间可能有60到90分钟的过站时间。保障任务之间存在先后关系:廊桥对接要在旅客下机前完成,行李装卸要在旅客下机后立刻开始,客舱清洁要在旅客下机之后、下一批旅客登机之前完成。这些前后置关系用状态机来管理,比单纯对任务表做增删改查更能体现出系统设计能力。
2. 技术选型:SpringBoot不背锅,关键是版本与组合
2.1 一套稳定可复现的版本组合
在辅导过程中经常有学生问我,SpringBoot版本选哪个比较好。我的建议很直接:不要追最新,不要用太高。当前阶段SpringBoot 2.7.x仍然是一个稳妥的选择,因为它的文档最多、社区遇到过的坑都被填平了、和MyBatis-Plus、MySQL连接驱动的兼容性也最成熟。非要用SpringBoot 3.x当然也可以,但要注意3.x基于Jakarta命名空间,部分老教程里的javax包会直接报错,排查起来很耽误时间。
给一套我实测可用的版本组合:
- JDK:1.8或11都可以。如果学校要求Java新特性,用17也行,但JDK 8配合SpringBoot 2.7是毕设最常见的组合。
- Spring Boot:2.7.6
- MyBatis-Plus:3.5.3
- MySQL:5.7或8.0,注意数据库连接驱动要匹配
- Lombok:1.18.24
- Hutool:5.8.16,用于日期处理、加密和随机数生成
- Swagger或SpringDoc:用于接口调试和答辩展示
这套组合有个好处:依赖冲突基本不存在,报错少,学生可以把精力放在业务和算法上,而不是耗在连数据库都调不通的环境问题里。
2.2 用MyBatis-Plus生成建表SQL的两种方式
很多同学在社区里搜“mybatisplus根据java实体类生成创建表的sql语句”,这个问题在毕设阶段其实很容易解决。MyBatis-Plus官方文档提到过代码生成器,但它生成的更多是实体类、Mapper、Service,而不是建表SQL。想把实体类反推成建表SQL,我一般用两种方式。
第一种是手动写SQL,但用MyBatis-Plus的字段注解来约束映射关系。比如实体类里加@TableName("flight_info"),字段上加@TableField("flight_no"),然后手动建表。这种方式最可控,也符合毕设要求,建议优先用。
第二种是使用独立的小工具来做自动生成,比如:Flyway + JPA自动建表、或者直接用SQLiteOnline等在线工具把实体类里的字段翻译成CREATE TABLE语句。不过自动生成有一个坑:字段类型映射不一定符合你的预期,比如LocalDateTime默认生成datetime还是timestamp,不同工具不一样。所以我的建议是:自动生成作为参考,手工微调后再执行。
这里把核心航班表的建表语句拿出来作为参考,直接可以抄到你的项目里:
CREATE TABLE flight_info ( id BIGINT AUTO_INCREMENT PRIMARY KEY, flight_no VARCHAR(20) NOT NULL COMMENT '航班号', flight_type VARCHAR(10) NOT NULL COMMENT '起降类型:ARRIVE/DEPART', airline VARCHAR(50) COMMENT '航空公司', aircraft_type VARCHAR(20) COMMENT '机型', origin_airport VARCHAR(50) COMMENT '出发地', dest_airport VARCHAR(50) COMMENT '目的地', plan_start_time DATETIME COMMENT '计划起飞/到达时间', real_start_time DATETIME COMMENT '实际起飞/到达时间', flight_status VARCHAR(20) DEFAULT 'SCHEDULED' COMMENT '航班状态', create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) COMMENT '航班动态信息表';机位分配表的建表SQL要注意加唯一约束,防止同一个机位同一时间段被分配两次。可以将航班号、机位编号、时间段三个字段加联合索引,并在创建记录时先做冲突查询。
2.3 表结构设计:从航班动态到机位占用
好的表结构会让算法好写很多,糟的表结构会让代码里到处是if-else。我建议把“时段占用”这个概念单独提出来,不混在机位表里。
机位表只存机位的基本属性,不存“当前被哪个航班占用”。占用的动态信息放在航班机位调度表里,这样你查一个机位是否空闲,只需要查询调度表里是否存在时间段重叠的记录。核心SQL大致如下:
SELECT COUNT(*) FROM flight_gate_assign WHERE gate_id = #{gateId} AND assign_status IN (1, 2) AND plan_start_time < #{endTime} AND plan_end_time > #{startTime}这段话的意思是:如果你的开始时间小于该机位已有分配的结束时间,且你的结束时间大于已有分配的开始时间,说明存在重叠。重叠数大于0,机位不可用。这个查询条件在很多调度类项目里都能复用。
同时建议给航班表和调度表加上MySQL分区或索引优化,尽管数据量不大,但是在答辩时可以说“我通过索引优化保证高频查询效率”,这是很加分的话术。
3. 核心功能实现:航班动态模块怎么做
3.1 动态列表:多条件分页查询与状态筛选
航班动态管理模块看起来简单,但实际上有两个坑:第一是多条件组合查询;第二是状态实时刷新。多条件组合查询在MyBatis-Plus里可以用LambdaQueryWrapper解决,推荐在Service层用条件构造器,避免在Mapper里写一堆if和where拼接。
举个例子,按照航班号模糊查询、起降类型、航班状态、时间段范围查询:
LambdaQueryWrapper<FlightInfo> wrapper = new LambdaQueryWrapper<>(); wrapper.like(StringUtils.hasText(query.getFlightNo()), FlightInfo::getFlightNo, query.getFlightNo()) .eq(StringUtils.hasText(query.getFlightType()), FlightInfo::getFlightType, query.getFlightType()) .eq(StringUtils.hasText(query.getFlightStatus()), FlightInfo::getFlightStatus, query.getFlightStatus()) .between(query.getStartTime() != null && query.getEndTime() != null, FlightInfo::getPlanStartTime, query.getStartTime(), query.getEndTime());这个写法比MyBatis XML里的动态SQL要直观很多。用StringUtils.hasText做空值判断,能有效避免用户不筛选项时返回空结果。
状态实时刷新的第一个方案是前端轮询,简单可靠;第二个方案是用WebSocket推送,进阶学生可以使用。毕设里用轮询就够了,反正数据量不大,每5秒拉一次接口,前端展示动态刷新,答辩时效果已经很好。
3.2 起降状态机:从计划到起飞/落地的流转
航班状态是整个系统的发动机。状态定义得清晰,机位分配和保障任务才能跟着状态自动触发。我习惯把状态定义成枚举,而不是字符串散落在代码里:
- SCHEDULED:计划中,还没有进入实际运行窗口
- BOARDING:开始登机(离港航班)
- DEPARTED:已起飞
- ARRIVED:已降落
- LANDING:正在降落(进港航班)
- PARKING:已入位
- CANCELLED:取消
- DELAYED:延误
状态流转可以用简单的Service方法实现,比如changeFlightStatus(flightId, targetStatus),内部校验一下当前状态是否可以跳到目标状态,避免直接从“计划中”跳到“已起飞”这种不合逻辑的情况。这个条件判断逻辑写清楚,答辩时就是亮点:我用状态机管理航班流转,而不是简单地改字段。
当航班状态变为“已降落”时,系统自动触发机位分配流程;当“已入位”时,自动生成保障任务。这一步可以通过Spring事件机制来实现,也可以用最直接的在Service方法里调用另一个Service。毕设阶段直接调用就好,不要引入大量事件总线设计,避免把自己绕晕。
3.3 时间轴与冲突检测
航班动态里容易忽略的是时间冲突检测。比如同一个航班的计划起飞时间和计划到达时间不能相差少于30分钟,同一架飞机连续执行的多个航班之间要有过站时间。这些属于业务规则,可以在航班插入、更新时做校验。
我曾经看过一个学生做这个模块,航班时间直接让前端传字符串,数据库存成varchar,结果到了机位分配的时候解析时间格式报错,查了半天。这里强烈建议用LocalDateTime,Controller接收参数时用@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss"),前端传标准格式,避免字符串比较大小带来的各种脑溢血问题。
4. 机位分配:排序算法与推荐逻辑
4.1 我为什么不用冒泡排序,但还是把话题聊透
网上热搜里总能看到“冒泡排序java”这个词,说明很多学生还在用排序算法练手。回到机位分配场景,有人会想,我把机位列表排序,然后把航班逐个分配进去,排序用冒泡,是不是就是算法实现了?从原理上讲没错,但从实际效率角度,我要泼一盆冷水:毕设阶段的数据量可能只有几十个机位,冒泡排序和快速排序的性能差距完全体现不出来,用哪个都不影响结果。
但是,在机位推荐里真正重要的不是手写排序算法,而是排序的依据。一个好的机位推荐排序会考虑多个维度:机位是否近机位(是否有廊桥)、机位与航站楼入口的距离、机位是否适合当前机型、机位占用率(太忙的机位往后放)、预计占用时长。把这些维度封装成一个Comparator接口实现,比自己手写冒泡排序更有意义。
我不反对在答辩PPT里写上“我掌握冒泡排序、插入排序,并在机位调度预处理中使用了Comparable排序”,但如果你真在Service层写一个冒泡排序去排机位列表,反而显得知识停留在课程设计阶段。更好的做法是使用Collections.sort()配合自定义Comparator,或者用Comparator.comparing().thenComparing()链式语法,这也是业界最常用的排序写法。
4.2 机位推荐:优先队列+占用区间判断
机位推荐的实现逻辑,我用一个伪代码来拆解:
第一步,获取候选机位。根据航班的机型等级,筛选gate_info表中支持该机型的机位。比如A320属于C类飞机,默认只能使用支持C类及以上机型的机位。
第二步,过滤时间冲突。对候选机位逐一调用调度表,查询与目标航班的时间窗是否有重叠。
第三步,给剩余机位打分。打分规则可以设计为:
- 近机位加30分
- 当前空闲且20分钟内无其他计划占用加20分
- 机位所在航站楼与航班出发/到达区域匹配加20分
- 该机位当日剩余空闲时长超过两小时加10分
第四步,按照得分从高到低排序,取最高得分的机位作为推荐结果。
如果一次分配后发现该机位不符合要求或用户手动改选,可以展示得分排名前五的机位候选列表,而不是只给一个结果,这样在演示时效果更直观。
机位分配的主动分配和被动推荐都要记录操作日志,方便答辩时展示系统有追踪和审计功能。
4.3 手动调整与锁定:人工兜底
算法推荐只是一个起点,最终的分配决策必须允许人工干预。我见过有同学把机位分配写成全自动,点击分配后怼完一条记录就不让改了。这个设计在演示时有点“僵硬”,因为现场的专家可能问“如果我临时想换一个机位怎么办”。
正确做法是:推荐结果旁边提供机位列表,用户可以手动选择任意空闲机位;分配后提供“解除分配”和“更换机位”操作;更换机位时再次做时间冲突校验,并且把原机位释放、新机位写入,同时在操作日志里记录变更原因。这个“人工兜底”的设计很符合真实机场业务,因为算法永远无法覆盖所有突发情况。
5. 地面保障协同:这才是能拉开差距的地方
5.1 保障任务怎么建、怎么派
地面保障协同模块一般会有这样几个业务步骤:航班入位后,系统根据航班类型自动生成保障任务清单。离港航班需要登机服务、行李装载、配餐、加油;进港航班需要客舱清洁、行李卸载、廊桥对接。生成的每个任务都对应一个责任单位,比如廊桥对接归机场运行部,加油归航空公司地服或指定油料公司。
任务生成后,进入“待派发”状态,可以由调度员把任务指派给具体的班组,也可以按责任单位自动派发。派发后班组在移动端或电脑端接收任务,开始执行,完成后上报状态。整个流程在系统里的体现就是support_task表的状态字段依次变化。
这里可以增加一个超时预警功能:如果当前时间距离计划开始时间不足15分钟,任务仍未派发,系统就产生一条预警记录,在前端醒目标记。这个设计看着不难,但在答辩时能给评委留下很深的“业务完整性”印象。
5.2 并发控制与状态流转:防止资源错配
地面保障协同最怕的是什么?是同一个保障班组被同时派给两个时间冲突的航班。如果只是在界面上下拉选择责任人,不做并发判断,很容易出现一个班组在上午10点同时服务两架飞机的情况。
解决办法是:在派发保障任务时,查询该班组在任务时段是否已有未完成任务。这里的核心SQL和机位冲突检测类似,同样是时间段重叠判断。为了进一步防止并发写入,可以在数据库层给support_task表加一个responsible_group_id和plan_time_range的联合唯一索引,或者用悲观锁/乐观锁。
我给学生的建议是,不必过度设计分布式锁,用MySQL的行级锁SELECT ... FOR UPDATE就能满足毕设需求。在事务里锁定班组记录,再检查任务冲突,冲突则报错,否则插入任务并提交。这是Spring的@Transactional可以轻松处理的事情。
5.3 消息通知该选什么:ActiveMQ还是简单轮询
热搜词里有“springboot整合activemq”,也有“springboot定时任务”。在保障协同场景里,要不要使用消息队列,我建议看两点:数据量、业务实时性。
毕设项目数据量小,没有高并发,引入ActiveMQ反而增加配置复杂度,尤其在某些环境下还要额外安装中间件,让学生折腾半天。我的推荐是:在保证功能完整的前提下,先用Spring的@Scheduled定时任务扫描待办任务,把即将超时的任务改为预警状态;如果项目要求“推送通知”,可以加一个简单的WebSocket推送模块,而不是重型MQ。
但如果你的指导老师明确要求使用消息队列,或者你想把系统设计写到“高可用、松耦合”的层次,再用ActiveMQ也不迟。可以用它实现保障任务创建后向不同责任单位推送通知,生产者是调度服务,消费者是班组端。SpringBoot整合ActiveMQ的步骤并不复杂,引入依赖、配置连接工厂、用JmsTemplate发送消息、用@JmsListener监听队列即可。但一定记得在服务器或本机额外安装ActiveMQ,否则项目脱离不了本地环境。
6. 部署与排查:从本地跑通到服务器上线
6.1 宝塔+Docker部署SpringBoot
论文和答辩都要求系统能运行起来,这就要解决部署问题。“宝塔docker部署springboot”是我常见的热搜词,说明很多人确实在这一步卡住了。我把一套可行的流程写在这里。
先在本地把项目打包成jar包。如果是Maven项目,执行mvn clean package -DskipTests,打包完成后在target目录下生成jar文件。确认jar包版本正确后,编写Dockerfile:
FROM openjdk:11-jre-slim MAINTAINER you COPY target/airport-schedule.jar /app/airport-schedule.jar WORKDIR /app ENV TZ=Asia/Shanghai EXPOSE 8080 ENTRYPOINT ["java", "-jar", "airport-schedule.jar"]然后在宝塔面板里安装Docker管理器,上传Dockerfile和jar包到同一个目录,构建镜像,再创建容器。容器创建时要设置端口映射,比如宿主机的8081映射到容器内部的8080。如果用了MySQL,建议用宝塔自带的MySQL服务,配置好spring.datasource.url为服务器的MySQL地址。
一个常见的坑是数据库时区问题。连接MySQL 8时,如果不在JDBC URL里加上serverTimezone=Asia/Shanghai,启动时会报时区异常或日期错乱。配置的时候加上即可:
spring: datasource: url: jdbc:mysql://127.0.0.1:3306/airport_schedule?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai另一个坑是端口占用。如果8080端口被占用,启动会报Port already in use。服务器上可以先执行netstat -tlnp | grep 8080查看占用情况,再决定换端口或释放占用进程。在宝塔里部署,我习惯直接把宿主端口换成8080之外的值,比如8081、8082,避免与宝塔面板和nginx冲突。
6.2 启动失败问题清单与解决办法
这些年帮学生排查SpringBoot启动失败时,遇到最多的问题基本集中在以下几类,做成长清单放在这里当速查表:
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 启动即报 ClassNotFound | 依赖冲突或漏引包 | mvn dependency:tree检查依赖,确认版本 |
| 启动后页面404 | 控制器未扫描到 | 检查主启动类的位置,包路径是否覆盖controller |
| 连接数据库失败 | URL、账号、密码、时区问题 | 逐个核对datasource配置 |
| 启动特别慢 | 服务器内存不够或日志输出模式 | 调整JVM参数-Xmx256m,关闭debug日志 |
| 数据库表不存在 | 没有执行建表脚本 | 用spring.sql.init或手动执行SQL |
| 刷新页面报500 | Mapper扫描不全 | 主启动类加@MapperScan或在Mapper类加@Mapper |
| 时间字段差8小时 | 时区设置不一致 | JDBC URL加serverTimezone=Asia/Shanghai |
| 中文显示乱码 | 字符集不统一 | 数据库、连接URL、前端页面都改成UTF-8 |
这里还要提一个和Java环境配置相关的坑:如果服务器或本机装了多个JDK版本,环境变量没配对,很可能出现编译用JDK 17、运行用JDK 8或者反过来,导致莫名其妙的UnsupportedClassVersionError。解决办法是统一JAVA_HOME,或者在IDE里指定Project SDK为同一个版本,Maven的java.version也保持一致。热搜词“java环境变量使用多个jdk”说的就是这个问题。
6.3 多项目与登录态隔离的扩展
有些同学会在一个服务器上同时跑前端、后端、数据库多个项目,这时候登录态隔离会成为一个隐藏问题。热搜词里“多个springboot项目如何一次登录其他不用登录”其实就是单点登录的话题。
如果只是毕设,不建议做完整的SSO,复杂度太高。比较务实的方式有两种。第一种是前端统一走同一个网关或同一域名,后端项目用JWT做Token校验,前端存Token,多个后端服务共用同一个JWT密钥,这样一次登录后多个服务都能识别。第二种是后端只做接口服务,前端用Session登录,并把Session放到Redis中,多个后端实例共享同一个RedisSession,这是Spring Session的典型用法。
做机位调度和保障协同这两块业务时,如果需要区分管理员、调度员、班组人员三种角色,可以在JWT里带role字段,然后在Spring Security或拦截器里做角色校验。不要把所有权限逻辑写死在Controller里,尽量抽出类似@RequireRole("dispatcher")的自定义注解,代码会干净很多。
7. 进阶方向:从能用到优秀,我建议这样做
7.1 集成Flink做实时航班计算值不值
热搜词里有“springboot整合flink”,这确实是当前Java生态下的一个热点。但落到毕设场景,我必须很直白地说:如果只是为了加分而集成Flink,不值得。Flink适合做大规模、低延迟、有状态的流式处理,毕设项目的数据量可能每分钟只有几条航班更新,跑一个Flink任务的开销比系统本身还大,演示时还容易出问题。
但如果你学有余力,可以在项目里设计一个“实时统计”模块:用定时任务从航班表读取最近五分钟内的起降记录,统计各航空公司当天的航班准点率,并输出到一张统计表。这类实时指标用Spring的调度就能实现,不需要Flink。把系统架构图里写一个“实时统计服务”,但实际上用@Scheduled完成,是我在不少毕设里看到的取巧且有效的方案。
如果真的想展示Flink能力,可以做这样一个非核心功能:监听航班表Binlog或定期拉取航班数据,在Flink任务里计算“每个机位的平均占用时长”和“高峰时段机位紧张度”,把结果写入Redis供前端展示。这属于锦上添花,不要因此排队核心开发时间。
7.2 前端搭配Vue3的效果
项目名称里如果包含“智慧机场”,那大概率需要展示面板和大屏效果。推荐后端纯接口,前端用Vue3 + Element Plus。整个系统可以做成“后端管理系统 + 数据大屏”的组合:大屏展示今日航班总数、准点率、机位使用率、保障任务超时数量;管理系统跑增删改查和调度操作。
我不建议前端全用静态页面,因为答辩时动态接入后端数据的系统会比写死数据的页面高出不少档次。在Vue3里用Axios调用后端接口,表格用Element Plus的el-table,图表用ECharts,学习成本很低,两三天就能上手。
7.3 答辩时怎么讲出亮点
最后分享一点答辩经验。评委最反感的是听到“我这个系统用了SpringBoot、MyBatis-Plus、MySQL,完成了增删改查”,没有任何业务思考。你可以按照这个思路来描述:
- 先说痛点:机场航班调度中最怕机位冲突和保障超时,我用系统来解决这两个问题。
- 再说方案:设计了三层数据模型,用时间片段重叠判断实现冲突检测,用打分排序实现机位推荐,用状态机管理保障任务的流转。
- 最后说效果:演示一个航班从计划到落地、入位、保障、再起飞的全流程,并展示异常情况下的预警提醒。
这套话术比单纯罗列技术栈要有力得多,因为它在回答“为什么做”而不是“做了什么”。
最后想说的话
机位调度和航班动态管理听起来是航空专业的事,但落到计算机毕设里,它考查的还是你对数据建模、算法设计、系统架构和工程运维的基本功。我把用的版本组合、建表SQL、冲突检测逻辑、部署步骤和常见坑都写明白了,接下来就是动手敲代码的过程。如果你的导师或者自己对某个模块有更深的要求,比如算法改遗传算法、后端加消息队列、前端加大屏,也可以基于这篇文章的框架去扩展。毕竟机场调度这个场景的扩展方向很多,把基础做扎实,后续想折腾什么都能接得住。