ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

机票预订系统详细设计说明书实战:从输入项表到退票事务的代码落地

机票预订系统详细设计说明书实战:从输入项表到退票事务的代码落地 简介这份机票预订系统详细设计说明书面向软件工程课程设计、毕业设计及Java Web初学者聚焦于将概要设计落地为可编码的详细方案解决程序模块具体设计问题。资源为单个PDF文档压缩包约997KB内容按标准设计说明书结构组织涵盖引言、程序系统结构、查询预订系统与退订系统两大模块的设计说明并逐项展开程序描述、功能、性能、输入输出项、算法、流程逻辑、接口、存储分配、注释设计、限制条件与测试计划等条目。读者可据此获得完整的模块划分思路、算法与数据结构设计、数据库表结构、模块接口定义及界面设计方案并了解系统采用JavaJSP与AWT、MyEclipse 7.0配合MySQL的技术路线。文档还给出机票预订、取票通知、查询航班、打印机票、营运统计及后台航班管理等功能的职责划分便于对照编码与撰写设计报告。目前已有1378人学习下载适合需要规范设计文档模板与实现参考的读者。1. 从一份 PDF 说起机票预订系统详细设计说明书到底能拿来干什么很多做课程设计或者接私活的同行手里都攒过一堆“XX管理系统”的文档但真正能拿来当施工图用的不多。这份《机票预订系统详细设计说明书.pdf》属于那种少见的、能把一个 JavaJSP 老项目从模块划分讲到数据库字段的文档。它不是泛泛的需求描述而是直接给出了查询预订系统和退订系统两个核心程序的输入项、输出项、算法逻辑、接口定义和存储分配。换句话说你拿到它基本可以照着把代码骨架搭出来而不是对着“系统应具备良好扩展性”这种废话发呆。这份文档适合三类人一是正在做软件工程课程设计、需要一份能落地的详细设计参考的学生二是接手了类似机票预订、票务管理类外包项目、想快速理清模块边界的开发者三是想看看传统 JSPMySQL 项目在详细设计阶段到底要写清楚哪些东西的从业者。它的技术栈是 MyEclipse 7.0 MySQL Java/JSP AWT运行环境是个人电脑开发者署名张锐钦。文档里对查询、插入、更新这些数据库操作的定义、对输入项数据类型的约束、对三次密码错误自动关闭这类限制条件的描述都是可以直接抄进自己设计文档里的硬内容。2. 查询预订系统的详细设计拆解从输入项表到算法逻辑2.1 输入项与输出项的数据约束怎么用文档第 3.4 节给了一张输入项表里面把姓名、性别、身份证号码、联系电话、电子邮件、工作单位、航班号、账单号、航班等级、航班日期这些字段的数据类型、数据格式、有效范围、输入方式、数据来源和保密条件都列清楚了。这张表的价值在于它直接告诉你数据库建表时每个字段该用什么类型、该不该加密、该由谁输入。比如姓名是 Varchar要求 6 位以上输入方式是输入来源是乘客保密条件是加密。身份证号码是 Varchar16 到 20 位输入乘客加密。航班号是 Varchar8 位以上选择乘客无保密。账单号是 Varchar8 位以上输入系统生产无保密。这些约束看起来简单但实际建表时很容易漏掉“系统生产”这个来源标记导致账单号被设计成用户手动输入后面退票流程就对不上了。输出项表在 3.5 节列出了飞行出发地、目的地、起飞时间、商务仓票价、经济仓票价、座位空数、是否领票、航班日期、航班等级。输出方式全是字符串保密条件全是无。这意味着查询结果直接以字符串形式返回给前端展示不需要在输出层做额外加密。对于 JSP 页面来说就是直接out.print或者放进 request 域里渲染。提示输入项表里的“保密条件”列是很多人会忽略的。姓名、性别、身份证、电话、邮件、工作单位都标了加密但航班号、账单号、航班等级、航班日期没有。这说明加密策略是按字段敏感度区分的不是一刀切。你在实现时如果对所有字段都加密反而会增加不必要的解密开销。2.2 算法逻辑与流程逻辑的代码化落地文档 3.6 节给出了【确定】按钮和【取消】按钮的算法描述。【确定】按钮触发的是用户合法性验证取得用户名和密码加密后传输到数据库与账户表比对如果正确就进入系统总控界面并获得相应权限否则提示“用户名或密码错误”累计错误三次系统自动关闭。【取消】按钮就是关闭登录窗口。这段算法描述可以直接翻译成 Java 代码。下面是一个基于 JSPServlet 的登录验证实现示例// LoginServlet.java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username request.getParameter(username); String password request.getParameter(password); // 使用 MD5 加密密码文档 3.10 节提到调用加密函数 MD5 String encryptedPwd MD5Util.encrypt(password); // 查询账户表进行一致性验证 UserDao userDao new UserDao(); User user userDao.findByUsernameAndPassword(username, encryptedPwd); HttpSession session request.getSession(); if (user ! null) { // 验证通过存入 session 并获得相应权限 session.setAttribute(user, user); session.setAttribute(role, user.getRole()); response.sendRedirect(main.jsp); } else { // 累计错误次数三次后自动关闭 Integer errorCount (Integer) session.getAttribute(errorCount); errorCount (errorCount null) ? 1 : errorCount 1; session.setAttribute(errorCount, errorCount); if (errorCount 3) { // 前端通过 window.close() 关闭或服务端使 session 失效 session.invalidate(); response.getWriter().write(scriptwindow.close();/script); } else { request.setAttribute(msg, 用户名或密码错误); request.getRequestDispatcher(login.jsp).forward(request, response); } } }这段代码的逻辑说明先取参数再加密再查库比对。参数说明username和password来自登录表单MD5Util.encrypt对应文档 3.10 节提到的 MD5 加密函数errorCount存在 session 里实现累计计数三次错误后session.invalidate()让会话失效前端配合window.close()关闭窗口。这里有个细节文档说“系统将自动关闭”在 Web 环境里浏览器窗口不一定能被服务端强制关闭所以常见做法是服务端让 session 失效前端页面收到响应后执行关闭脚本。流程逻辑在 3.7 节给出了乘客订票流程开始 → 输入航班信息 → 跳转到网银页面 → 订票系统流程图。还有 ER 图涉及电子邮件、电话、身份证号。这说明订票流程里有一个外部支付跳转环节不是纯内部闭环。你在实现时需要在订单状态里加一个“待支付”状态等网银回调后再更新为“已支付”。2.3 接口设计与存储分配的实际含义3.8 节接口部分提到几个关键点服务器程序上可使用 MySQL 的备份命令对数据库进行保存网络软件接口使用无差错的传输协议采用滑动窗口方式对数据进行网络传输及接收输入方面用 Java/JSP 的标准输入输出处理键盘鼠标输出方面打印机的连接和使用也用 Java 标准输入输出处理内部接口各模块之间采用函数调用、参数传递、返回值的方式传递信息。这些描述里“滑动窗口方式”在应用层开发中通常不需要自己实现底层 TCP 协议已经处理了。文档这么写可能是参考了网络编程教材的通用表述。实际开发中你只需要关注 HTTP 请求的可靠传输即可。打印机部分Java 可以用java.awt.print包或者javax.print包来实现文档提到用 AWT 开发界面所以打印机票功能大概率是基于 AWT 的打印 API。3.9 节存储分配说“本程序用高级语言 JSP 进行编程直接内存分配由 JSP 程序运行时分配。本组件所依赖的变量、结构要求全部在组件内声明。”这句话的实际意思是不需要手动管理内存变量作用域控制在组件内部避免全局变量污染。对于 JSP 来说就是尽量用局部变量少用 session 存大对象。3. 退订系统的设计要点退票流程与数据一致性3.1 退订输入项与查询预订的差异退订系统的输入项表在 4.4 节字段比查询预订少很多身份证号码、航班号、账单号。身份证号码是 Varchar16 到 20 位输入乘客加密航班号是 Varchar8 位以上选择乘客无保密账单号是 Varchar8 位以上输入系统生产无保密。输出项在 4.5 节飞行出发地、目的地、起飞时间、座位空数、是否退票、航班日期。对比查询预订的输入项退订系统不需要姓名、性别、电话、邮件、工作单位这些乘客个人信息只需要身份证号做身份核验加上航班号和账单号定位具体订单。这说明退订操作的权限控制更依赖“谁知道账单号”这个事实而不是完整的乘客信息。文档 4.1 节也明确说了“该功能只有管理员有权力操作所以乘客先得联系管理员”。3.2 退票流程的代码实现与状态流转4.7 节退票流程逻辑开始 → 输入航班和乘客信息 → 显示机票信息 → 查看个人及航班信息并确认退票 → 退票成功。这个流程比订票简单但有一个关键点退票成功后座位空数要加回去订单状态要改成“已退票”如果涉及退款还要触发退款流程。下面是一个退票服务的核心代码示例// RefundService.java public boolean refundTicket(String idCard, String flightNo, String billNo) { Connection conn null; try { conn DBUtil.getConnection(); conn.setAutoCommit(false); // 开启事务 // 1. 根据身份证、航班号、账单号查询订单 String querySql SELECT * FROM ticket_order WHERE id_card? AND flight_no? AND bill_no? AND status已支付; PreparedStatement queryPs conn.prepareStatement(querySql); queryPs.setString(1, idCard); queryPs.setString(2, flightNo); queryPs.setString(3, billNo); ResultSet rs queryPs.executeQuery(); if (!rs.next()) { conn.rollback(); return false; // 订单不存在或状态不允许退票 } // 2. 更新订单状态为已退票 String updateOrderSql UPDATE ticket_order SET status已退票, refund_timeNOW() WHERE bill_no?; PreparedStatement updatePs conn.prepareStatement(updateOrderSql); updatePs.setString(1, billNo); updatePs.executeUpdate(); // 3. 座位空数加一 String updateSeatSql UPDATE flight_info SET seat_availableseat_available1 WHERE flight_no? AND flight_date?; PreparedStatement seatPs conn.prepareStatement(updateSeatSql); seatPs.setString(1, flightNo); seatPs.setString(2, rs.getString(flight_date)); seatPs.executeUpdate(); conn.commit(); return true; } catch (Exception e) { if (conn ! null) { try { conn.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } } e.printStackTrace(); return false; } finally { DBUtil.close(conn); } }逻辑说明退票涉及三个数据库操作——查订单、改订单状态、加座位空数。这三个操作必须在一个事务里否则可能出现订单退了但座位没加回去或者座位加了但订单状态没改的脏数据。参数说明idCard、flightNo、billNo来自退票表单status已支付是退票的前提条件未支付或已退票的订单不能再次退票seat_availableseat_available1是座位回补操作。注意文档 4.6 节的算法描述和 3.6 节几乎一样都是登录验证的算法。这可能是文档编写时的复制粘贴遗留问题。实际退票算法应该以 4.7 节的流程逻辑为准而不是 4.6 节的登录验证描述。你在参考这份文档时要交叉比对章节内容避免被重复段落误导。3.3 退订系统的接口与限制条件4.8 节接口部分和 3.8 节基本一致也是 MySQL 备份命令、无差错传输协议、Java/JSP 标准输入输出。这说明两个子系统在接口层面共用同一套基础设施。退订系统没有单独的限制条件章节但查询预订系统的 3.11 节限制条件提到“当系统第一次使用时具有统一的用户 ID 和密码超级用户和 123456。在三次验证错误后系统将自动关闭。”这个限制条件对退订系统同样适用因为退订操作也需要管理员登录。这里有一个实际开发中容易踩的坑文档说“超级用户和 123456”是初始账号但 3.13 节又说“对用户 ID 和密码的更安全加密方式尚未解决”。这意味着初始密码是明文写在文档里的而且加密方式只是 MD5没有加盐。你在实际部署时至少要在首次登录后强制修改密码并且把 MD5 换成 MD5盐或者 bcrypt。不过这是文档明确标注的“尚未解决的问题”不是遗漏而是设计阶段的已知限制。4. 避坑与常见问题排查从文档到代码的五个翻车点4.1 输入项表里的“有效范围”和“数据格式”容易看漏现象建表时把姓名字段设成varchar(10)结果用户输入 6 位以上姓名时不够用或者把身份证号设成char(18)但文档写的是 16 到 20 位遇到 20 位的旧身份证号就截断了。原因文档 3.4 节的输入项表里“有效范围”列写的是“6 位以上”“16—20 位”“8 位以上”这些是下限或区间不是固定长度。很多人扫一眼表格只看到 Varchar 就随手给个 50 或 255或者反过来给得太小。解决姓名用varchar(50)身份证号用varchar(20)电话和邮件用varchar(50)航班号和账单号用varchar(20)。所有标了“加密”的字段在数据库里存的是加密后的密文长度会比明文长所以字段长度要留足余量。MD5 输出是 32 位十六进制字符串所以密码字段至少varchar(32)。4.2 三次错误自动关闭在 Web 环境里不生效现象按照文档 3.6 节实现了错误计数但第三次错误后浏览器窗口没有关闭只是提示了错误信息。原因文档写的是“系统将自动关闭”在桌面应用里可以调用System.exit(0)或者关闭窗口但在 JSP 页面里服务端无法直接关闭客户端浏览器窗口。window.close()也只能关闭由脚本打开的窗口用户手动打开的标签页通常不允许脚本关闭。解决服务端在第三次错误时让 session 失效并返回一个提示页面页面上放一个“关闭窗口”的按钮让用户手动点击。或者更常见的做法是锁定账号一段时间而不是关闭窗口。文档的限制条件是基于桌面应用的思维移植到 Web 时要调整。4.3 退票流程里漏掉座位回补导致超卖现象用户退票后订单状态变成“已退票”但航班座位空数没有加回去导致后续查询显示座位已满实际有座位却卖不出去。原因文档 4.7 节的退票流程图只画到“退票成功”没有明确画出“座位空数加一”这一步。4.5 节的输出项表里有“座位空数”字段但那是退票后展示给管理员看的不是自动回补的逻辑。解决在退票服务里把“更新订单状态”和“座位空数加一”放在同一个事务里要么都成功要么都回滚。上面 3.2 节的代码示例已经展示了这个做法。另外座位空数建议用seat_available字段直接加减而不是每次去 count 订单表后者在并发下容易算错。4.4 账单号由系统生产但生成规则没定义现象文档 3.4 节说账单号是“系统生产”但全文没有说明账单号的生成规则。开发时随手用UUID或者时间戳生成结果退票时管理员拿到的账单号和系统里的对不上。原因详细设计说明书应该定义账单号的格式但这份文档在 3.4 节只标了“系统生产”没有给出具体规则。这是文档的一个缺口。解决常见做法是用“航班号日期序号”的格式比如CA1234-20240520-001。这样账单号本身携带了航班和日期信息退票时管理员即使只记得部分信息也能定位。生成时在数据库里用唯一索引约束避免重复。4.5 MD5 加密在 JSP 里调用时容易传错参数现象登录时明明密码正确但一直提示“用户名或密码错误”。调试发现数据库里存的密文和 Java 加密出来的密文不一致。原因MD5 加密对字符编码敏感。JSP 页面默认编码可能是 ISO-8859-1而 Java 代码里用的是 UTF-8同一个密码字符串在不同编码下 MD5 结果不同。另外有些 MD5 工具类会在加密后转成大写有些转小写数据库里存的和代码里算的不一致。解决统一用 UTF-8 编码加密后统一转成小写十六进制字符串。在MD5Util.encrypt方法里明确指定StandardCharsets.UTF_8。数据库连接 URL 里加上useUnicodetruecharacterEncodingUTF-8。如果还是不对把加密前后的字符串打印出来比对通常能很快定位。5. 把详细设计说明书变成可运行原型的进阶技巧文档 3.12 节提到了测试计划先对各子单元过程进行测试再对各模块包括接口进行测试最后对系统进行测试和维护。这个顺序是对的但实际做的时候很多人会跳过单元测试直接跑整个系统结果一出错就不知道是哪个模块的问题。我的习惯是拿到这份详细设计说明书后先不急着写业务代码而是先把输入项表和输出项表转成数据库 DDL再把算法描述转成单元测试用例最后才写 JSP 页面。具体做法是用文档 3.4 节和 4.4 节的输入项表生成建表语句用 3.5 节和 4.5 节的输出项表生成查询视图用 3.6 节和 4.6 节的算法描述生成测试用例。比如登录验证的测试用例至少覆盖正确用户名密码、错误用户名、错误密码、空用户名、空密码、三次错误后锁定。退票的测试用例覆盖已支付订单退票、未支付订单退票、已退票订单再次退票、不存在的账单号退票。下面是一个把输入项表转成建表语句的示例-- 根据文档 3.4 节输入项表生成的乘客信息表 CREATE TABLE passenger ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL COMMENT 姓名6位以上加密存储, gender VARCHAR(2) NOT NULL COMMENT 性别2位加密存储, id_card VARCHAR(20) NOT NULL COMMENT 身份证号码16-20位加密存储, phone VARCHAR(50) NOT NULL COMMENT 联系电话8位以上加密存储, email VARCHAR(50) NOT NULL COMMENT 电子邮件8位以上加密存储, work_unit VARCHAR(50) NOT NULL COMMENT 工作单位8位以上加密存储, created_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 根据文档 3.4 节和 3.5 节生成的订单表 CREATE TABLE ticket_order ( bill_no VARCHAR(20) PRIMARY KEY COMMENT 账单号系统生产, passenger_id INT NOT NULL COMMENT 关联乘客, flight_no VARCHAR(20) NOT NULL COMMENT 航班号8位以上, flight_date VARCHAR(20) NOT NULL COMMENT 航班日期8位以上, flight_class VARCHAR(2) NOT NULL COMMENT 航班等级2位以上, status VARCHAR(10) NOT NULL DEFAULT 待支付 COMMENT 订单状态, refund_time DATETIME NULL COMMENT 退票时间, FOREIGN KEY (passenger_id) REFERENCES passenger(id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;这段 SQL 的逻辑说明passenger表对应输入项表里的乘客信息字段所有标了“加密”的字段在应用层加密后存入数据库里不存明文。ticket_order表对应输入项表里的航班号、账单号、航班等级、航班日期加上订单状态和退票时间用于退订流程。参数说明VARCHAR(50)是给加密后的密文留的余量VARCHAR(20)对应身份证号和账单号的 16-20 位和 8 位以上要求。status默认“待支付”支付成功后改为“已支付”退票后改为“已退票”。验证方法上我一般会写一个简单的 JUnit 测试类把文档里的算法描述逐条转成断言。比如 3.6 节的“累计错误三次系统将自动关闭”对应的测试就是连续调用三次登录失败断言第三次返回的结果是 session 失效或窗口关闭标记。这样做的目的是让文档里的每一条规则都有对应的代码验证而不是靠人工点页面去试。从那以后我每次拿到详细设计说明书都强制自己先把输入项表和输出项表转成 DDL 和测试用例再动手写业务逻辑。这份机票预订系统的文档虽然有些章节存在复制粘贴的痕迹比如 4.6 节和 3.6 节算法描述雷同但整体结构完整字段约束和流程逻辑足够支撑一个可运行的原型。希望帮到你。本文还有配套的精品资源点击获取
返回列表