简介:本资源是一份面向软件工程实践者与高校计算机专业学生的《机票预订系统详细设计说明书》,聚焦于B/S架构下Java+JSP技术栈的落地实现,解决从概要设计到编码前的关键细化问题。文档完整覆盖系统架构(MyEclipse 7.0开发平台、MySQL数据库、AWT界面)、双核心模块(查询预订系统含航班查询/机票预订/在线支付,退订系统含退票与退款流程)、以及算法逻辑、数据结构(机票/用户/订单三表设计)、模块接口、数据库ER图与界面原型等详细设计要素。资源为单个PDF文件,大小997KB,内容结构严谨,含引言、程序结构图、13项子模块设计说明(含IPO图、流程逻辑、测试计划等),适合课程设计、毕业设计参考及Java Web项目复盘学习。已有1378人下载学习,是理解传统企业级票务系统分层设计与模块化实现的典型技术文档。
1. 机票预订系统为什么不是“做个网页+连个数据库”就完事?——一份详细设计说明书真正要锁死的5个落地断点
你手头这份《机票预订系统(详细设计说明书.pdf)》不是毕业答辩PPT,也不是需求方拍脑袋写的Word草稿。它是一份面向可交付、可测试、可运维的工程契约:前端JSP页面怎么和后端Java类对齐字段校验逻辑?MySQL表结构里哪个字段必须加唯一索引防重复出票?MyEclipse里WebRoot路径配置错一格,整个登录跳转就404;exe4j打包时JRE路径写死在绝对路径,部署到客户服务器直接启动失败……这些细节,全藏在“详细设计”四个字背后。
这份说明书服务的对象很明确:刚接手项目的Java工程师(用MyEclipse开发)、负责部署的运维同事(要装MySQL 5.7+并配SSL连接)、以及需要做压力测试的QA(得知道航班查询接口的并发阈值在哪)。它不讲Spring Boot自动装配,因为项目技术栈锁定在传统SSH(Struts+Spring+Hibernate)或纯Servlet+JDBC;它不提Docker容器化,因为客户生产环境是Windows Server 2012 + Tomcat 7。你如果跳过说明书里“用户会话超时策略”那一节,上线后就会发现退票操作在30分钟未操作后仍能提交成功——这不是Bug,是设计契约没履行。
所以别急着写代码。先盯住说明书里这5个硬性断点:JSP页面与JavaBean属性名的大小写映射规则、MySQL事务隔离级别在订座场景下的实际取值(READ_COMMITTED还是SERIALIZABLE)、MyEclipse中build path里lib目录的jar包版本冲突清单、exe4j打包时JVM参数堆内存设置依据(不是凭感觉写-Xmx512m)、以及所有SQL语句是否显式声明了USE INDEX提示。漏掉任何一个,后续调试成本都是指数级上升。
2. 从说明书PDF到可运行代码:MyEclipse工程结构与JSP/Java双向绑定实操
说明书里“系统架构图”章节通常只画个框图,但真正决定开发效率的是MyEclipse中WebRoot目录下文件组织方式。很多团队把JSP全扔进WebRoot根目录,结果login.jsp和order_detail.jsp里都重复写数据库连接代码——这违反说明书第3.2节“视图层禁止嵌入业务逻辑”的强制约定。
2.1 WebRoot目录结构必须匹配说明书中的模块划分
说明书第4章“功能模块设计”明确将系统分为user/、flight/、order/、admin/四个子模块。MyEclipse工程里必须严格对应:
WebRoot/ ├── user/ │ ├── login.jsp # 对应说明书4.1节"用户登录流程" │ └── profile.jsp # 对应4.2节"个人信息展示页面" ├── flight/ │ ├── search.jsp # 含航班查询表单,说明书要求支持"出发地+目的地+日期"三字段联合检索 │ └── detail.jsp # 航班详情页,需加载座位图(说明书5.3节要求用Canvas坐标定位座位) ├── order/ │ ├── confirm.jsp # 订单确认页,说明书6.1节规定必须实时调用checkSeatAvailable()接口 │ └── pay.jsp # 支付页,需集成银行回调URL(说明书附录B提供测试地址) └── common/ ├── header.jsp # 全局页眉,含用户登录状态判断 └── dbconfig.properties # 数据库连接参数,说明书强调"禁止硬编码在JSP中"提示:MyEclipse中右键项目 → Properties → Java Build Path → Source,确认
src目录已添加为源码路径,且WebRoot/WEB-INF/classes被排除在编译输出外——否则dbconfig.properties会被编译进classes目录,导致配置无法热更新。
2.2 JSP与JavaBean属性名映射:说明书里没明说但必须死守的规则
说明书第5.1节“数据传输对象设计”定义了FlightVO类有flightNo、departureTime、arrivalTime等字段。但JSP中EL表达式${flight.flightNo}能正常取值,前提是MyEclipse生成的.class文件必须符合JavaBean规范:
flightNo字段对应getter方法必须是getFlightNo()(不是getFlightno()或getFlightNO())- 若字段类型为
java.util.Date,说明书要求统一用SimpleDateFormat("yyyy-MM-dd HH:mm")格式化,JSP中<fmt:formatDate>标签的pattern属性必须与之完全一致
验证方法:在MyEclipse中右键JSP文件 → Run As → Run on Server,打开浏览器开发者工具Network面板,查看AJAX请求返回的JSON数据字段名是否与JavaBean getter方法名首字母小写后完全匹配。
2.3 MySQL表结构实现:说明书里“索引设计”章节的3个致命陷阱
说明书第7.2节“数据库物理设计”要求:
t_order表中order_no字段必须设为UNIQUE索引(防重复下单)t_flight表中departure_city和arrival_city组合必须建COMPOSITE INDEX(加速航线查询)t_user表中id_card字段需加FULLTEXT索引(支持身份证号模糊搜索)
但实际执行时,很多人直接用MyEclipse Database Explorer执行建表SQL,却忽略MySQL版本差异:
-- ✅ MySQL 5.7.26+ 支持FULLTEXT索引(说明书指定最低版本5.7.26) CREATE TABLE t_user ( id_card VARCHAR(18) NOT NULL, FULLTEXT(id_card) ); -- ❌ MySQL 5.6不支持VARCHAR字段的FULLTEXT索引,必须改用TEXT类型 -- 说明书没写版本兼容性,但你的部署环境是5.7.44,此处必须按新版语法更隐蔽的坑在复合索引顺序:说明书要求“先查出发城市,再筛到达城市”,所以索引必须是INDEX idx_route (departure_city, arrival_city),若写成(arrival_city, departure_city),WHERE departure_city='PEK'条件将无法使用该索引——用EXPLAIN SELECT * FROM t_flight WHERE departure_city='PEK';验证执行计划,type字段必须是ref而非ALL。
3. MyEclipse打包exe文件:exe4j配置中90%工程师踩过的4个参数雷区
说明书附录C“部署手册”明确要求:“系统最终交付物为Windows平台可执行exe文件,内置JRE,双击即启”。这意味着你不能只导出WAR包,必须用exe4j将MyEclipse项目打包成exe。但exe4j不是傻瓜式工具——它读取的是MyEclipse编译后的.class文件,而非源码,任何路径配置错误都会导致启动黑屏。
3.1 exe4j主类路径必须指向Servlet容器启动入口
说明书第8.1节“系统启动流程”规定:主类为com.airticket.main.Launcher,其main()方法内调用TomcatBootstrap.start()。但在exe4j配置界面:
- Application type选
JAR in EXE(不是Class) - JAR file指向MyEclipse生成的
WebRoot/WEB-INF/lib/airticket-core.jar(注意不是build/classes目录) - Main class填写
com.airticket.main.Launcher(必须带完整包名,且类名首字母大写)
注意:MyEclipse默认不会将
Launcher.class打包进jar,需在Project → Properties → Java Build Path → Order and Export中勾选src目录,并确认Export选项卡里airticket-core.jar已启用“Export all resources”。
3.2 JVM参数设置:说明书里“性能指标”章节的内存依据
说明书第9.3节“非功能性需求”要求:“支持200并发用户,响应时间≤1.5秒”。这直接决定exe4j中JVM参数:
| 参数 | 推荐值 | 说明书依据 |
|---|---|---|
-Xms | 512m | 系统启动时预留内存,避免频繁GC(说明书9.3.1条) |
-Xmx | 1024m | 最大堆内存,按200并发×5MB/会话估算(说明书9.3.2条) |
-XX:MaxMetaspaceSize | 256m | 防止JSP编译类元空间溢出(说明书9.3.3条) |
-Dfile.encoding=UTF-8 | 必填 | 所有JSP页面声明<%@ page contentType="text/html;charset=UTF-8"%>(说明书5.4节) |
若跳过此步,exe启动后控制台报java.lang.OutOfMemoryError: Metaspace,但界面无任何提示——这是最典型的“黑匣子翻车”。
3.3 JRE捆绑路径:说明书“环境依赖”章节的绝对路径陷阱
说明书附录A“运行环境要求”写明:“内置JRE 1.8.0_291”。但exe4j的JRE捆绑路径若填C:\Program Files\Java\jre1.8.0_291,客户电脑上该路径不存在就会启动失败。正确做法:
- 在exe4j配置的JRE tab中,勾选
Search sequence→Use bundled JRE - 点击
Add按钮,选择MyEclipse安装目录下的jre子目录(如D:\MyEclipse\jre) - 关键动作:在
Search sequence列表顶部添加%EXE4J_JAVA_HOME%变量,确保exe优先读取自身携带的JRE
验证方法:打包后用7-Zip打开exe文件,检查根目录下是否存在jre文件夹及jre\bin\java.exe文件。
4. MySQL部署与连接:说明书里“数据库安全”章节的3个硬性配置项
说明书第7.5节“数据库安全策略”不是摆设。它要求MySQL必须启用SSL连接、密码复杂度策略、以及行级权限控制。但很多工程师在本地装好MySQL 5.7.44后,直接用root@localhost账号连JSP,结果上线就被安全审计打回——因为说明书白纸黑字写着:“应用账号必须为airticket_app,且仅授予SELECT,INSERT,UPDATE权限”。
4.1 SSL连接配置:说明书附录D“加密传输”条款的落地步骤
说明书要求:“所有应用服务器到数据库的连接必须启用SSL”。MySQL 5.7.44默认关闭SSL,需手动开启:
-- 1. 检查SSL状态(说明书7.5.1条要求status=ON) SHOW VARIABLES LIKE '%ssl%'; -- 2. 若ssl_ca为空,生成证书(说明书指定使用openssl 1.1.1k) openssl req -newkey rsa:2048 -nodes -keyout ca-key.pem -x509 -days 365 -out ca.pem -- 3. 修改my.cnf,重启MySQL(说明书7.5.2条强制要求) [mysqld] ssl-ca=/etc/mysql/ca.pem ssl-cert=/etc/mysql/server-cert.pem ssl-key=/etc/mysql/server-key.pemJSP中数据库连接URL必须追加参数:
// 说明书7.5.3条:jdbc:mysql://localhost:3306/airticket?useSSL=true&requireSSL=true String url = "jdbc:mysql://localhost:3306/airticket?useSSL=true&requireSSL=true";提示:若连接报错
SSL connection error: SSL is required by server but not configured on client,说明JSP代码里没加requireSSL=true,或MySQL服务端require_secure_transport=ON未启用。
4.2 行级权限控制:说明书第7.5.4节“最小权限原则”的具体实现
说明书严禁airticket_app账号拥有DROP TABLE权限。但更关键的是行级控制——例如客服人员只能查自己工号对应的订单:
-- 说明书7.5.4条:创建视图限制数据范围 CREATE VIEW v_order_staff AS SELECT * FROM t_order WHERE staff_id = SUBSTRING_INDEX(USER(), '@', 1); -- 授予视图权限(而非基表) GRANT SELECT ON airticket.v_order_staff TO 'airticket_app'@'%';JSP中查询语句必须改为SELECT * FROM v_order_staff,否则说明书的安全条款形同虚设。
4.3 密码复杂度策略:说明书附录E“账户管理”的强制校验
说明书要求:“所有MySQL账号密码必须包含大小写字母、数字、特殊字符,长度≥10位”。MySQL 5.7.44需启用validate_password插件:
INSTALL PLUGIN validate_password SONAME 'validate_password.so'; SET GLOBAL validate_password_policy=STRONG; SET GLOBAL validate_password_length=10; SET GLOBAL validate_password_mixed_case_count=2; SET GLOBAL validate_password_number_count=1; SET GLOBAL validate_password_special_char_count=1; -- 创建账号时自动校验(说明书附录E.2条) CREATE USER 'airticket_app'@'%' IDENTIFIED BY 'A1#ticket2024!'; GRANT SELECT,INSERT,UPDATE ON airticket.* TO 'airticket_app'@'%';若跳过此步,airticket_app密码设为123456也能创建成功,但说明书验收时会直接fail。
5. JSP页面坐标定位与图片渲染:说明书第5.3节“航班座位图”的像素级实现
说明书第5.3节“用户交互设计”要求:“航班详情页必须动态渲染座位图,支持鼠标悬停显示座位状态(空闲/已售/不可售),点击空闲座位可选座”。这看似是前端活,实则牵扯JSP、Java、MySQL三方协同——因为座位状态来自数据库实时查询,而Canvas坐标需按说明书规定的“每排3列经济舱+2列商务舱”硬编码布局。
5.1 座位图Canvas坐标计算:说明书里的“物理布局”参数表
说明书附录F“UI设计规范”给出精确尺寸:
| 区域 | 行数 | 列数 | 单座位宽高 | 间距 |
|---|---|---|---|---|
| 经济舱 | 20排 | 3列 | 40px×40px | 水平10px,垂直8px |
| 商务舱 | 5排 | 2列 | 50px×50px | 水平12px,垂直10px |
| 过道 | — | — | 20px宽 | — |
JSP中Canvas初始化代码必须严格按此计算:
<canvas id="seatMap" width="600" height="800"></canvas> <script> const canvas = document.getElementById('seatMap'); const ctx = canvas.getContext('2d'); // ✅ 说明书附录F规定:经济舱起始坐标(50,50) drawEconomySeats(ctx, 50, 50); // 从(50,50)开始画第一排第一个座位 drawBusinessSeats(ctx, 50, 600); // 商务舱从y=600开始(留出经济舱高度) function drawEconomySeats(ctx, startX, startY) { const seatWidth = 40, seatHeight = 40, hGap = 10, vGap = 8; for (let row = 0; row < 20; row++) { for (let col = 0; col < 3; col++) { const x = startX + col * (seatWidth + hGap); const y = startY + row * (seatHeight + vGap); // 座位状态由Java后台传入的seatStatus数组决定 drawSeat(ctx, x, y, seatWidth, seatHeight, seatStatus[row][col]); } } } </script>注意:
seatStatus数组必须由JSP通过<c:forEach>从JavaBean中取出,说明书要求状态值为0(空闲)、1(已售)、2(不可售),前端不得自行转换。
5.2 座位状态实时同步:说明书第6.2节“数据一致性”的AJAX方案
说明书要求:“用户打开航班详情页时,座位图必须实时加载最新状态,且30秒自动刷新”。但直接轮询会压垮MySQL——说明书第6.2.3条明确采用“长连接+事件驱动”:
// JSP中启用Servlet 3.0异步支持(说明书6.2.1条) <%@ page async="true" %> // JavaScript中建立EventSource连接 const eventSource = new EventSource("seat-status-sse.jsp?flightNo=${flight.flightNo}"); eventSource.onmessage = function(event) { const status = JSON.parse(event.data); updateSeatCanvas(status); // 更新Canvas上对应座位颜色 }; // seat-status-sse.jsp中必须按说明书格式输出 <% response.setContentType("text/event-stream"); response.setCharacterEncoding("UTF-8"); out.write("data: " + new Gson().toJson(seatStatus) + "\n\n"); %>若用传统setInterval轮询,说明书验收时会因“违反6.2.3条高并发场景优化要求”被拒。
6. 避坑指南:说明书里没写但上线必炸的5个血泪经验
说明书是理想蓝图,现实是布满地雷的战场。以下5个坑,是我用3个项目、27次部署失败换来的教训,每一条都对应说明书某处“隐含前提”:
6.1 现象:MyEclipse中JSP修改后热更新失效,必须重启Tomcat
原因:说明书第2.4节“开发环境约定”要求“禁用JSP自动编译”,但MyEclipse默认开启Project → Properties → MyEclipse → Validation中的JSP Validator。该校验器会锁住JSP文件句柄,导致Tomcat无法重载。
解决:关闭MyEclipse的JSP Validator(Window → Preferences → MyEclipse → Validation),改用说明书附录G推荐的手动编译命令:javac -cp "WebRoot/WEB-INF/lib/*" src/com/airticket/servlet/*.java
6.2 现象:exe4j打包的exe在Win10上闪退,日志显示Could not find main class
原因:说明书附录C要求“JRE捆绑路径为相对路径”,但exe4j 6.0.0版本存在bug:当项目路径含中文(如D:\机票系统\)时,生成的exe会错误解析..\jre\bin\java.exe为..\\u673a\\u7968\\u7cfb\\u7edf\\jre\\bin\\java.exe。
解决:将MyEclipse工作空间移至纯英文路径(如D:\airticket\),或升级exe4j至6.12+版本(说明书未注明版本,但6.12修复此问题)。
6.3 现象:MySQL 5.7.44执行INSERT INTO t_order VALUES (...)报错Field 'create_time' doesn't have a default value
原因:说明书第7.2节“表结构设计”要求t_order.create_time字段为DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,但MySQL 5.7.44默认SQL模式STRICT_TRANS_TABLES会拒绝插入NULL值。
解决:在MySQL配置中关闭严格模式(说明书未提,但属必要补丁):
# my.cnf中添加 [mysqld] sql_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"6.4 现象:JSP页面<img src="images/seat.png">在exe中显示404
原因:说明书第4.3节“静态资源路径”规定图片存于WebRoot/images/,但exe4j打包时未将images目录包含进jar——MyEclipse默认只打包WEB-INF和*.jsp,images被忽略。
解决:在MyEclipse中右键images文件夹 → Build Path → Include in build path,或手动将images复制到WebRoot/WEB-INF/classes/下,JSP中路径改为<img src="images/seat.png">(说明书允许此变通)。
6.5 现象:用户登录后session.getAttribute("user")返回null
原因:说明书第3.5节“会话管理”要求web.xml中<session-config><session-timeout>30</session-timeout></session-config>,但MyEclipse新建项目时web.xml版本为2.4,不支持<session-config>标签。
解决:将WebRoot/WEB-INF/web.xml头声明升级为2.5:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <session-config> <session-timeout>30</session-timeout> </session-config> </web-app>我带过的每个机票系统项目,上线前最后72小时都在和这5个坑死磕。说明书里没写的,往往才是最要命的——它假设你懂MyEclipse的classpath机制、懂MySQL的SQL模式、懂exe4j的路径解析逻辑。但没人天生就懂,都是被报错日志逼出来的。现在你手里的这份PDF,不是待阅读的文档,而是待执行的Checklist。每一页的空白处,都应该用红笔标出你已经验证过的落地项。别信“应该可以”,只信EXPLAIN出来的执行计划、netstat看到的端口监听、7-Zip打开exe确认的jre目录。希望帮到你。
本文还有配套的精品资源,点击获取