面向对象设计大作业——火车售票系统

面向对象设计大作业——火车售票系统

Git地址

Gitee仓库

程序运行效果

用户注册登录:
面向对象设计大作业——火车售票系统
按始发地、目的地查询购票:
面向对象设计大作业——火车售票系统
按车次号查询购票:
面向对象设计大作业——火车售票系统
查看已购车票,退票,注销:
面向对象设计大作业——火车售票系统
管理员登录,查看所有用户信息:
面向对象设计大作业——火车售票系统
录入车次:
面向对象设计大作业——火车售票系统
删除车次:
面向对象设计大作业——火车售票系统
修改车次信息:
面向对象设计大作业——火车售票系统
查看所有车次:
面向对象设计大作业——火车售票系统
管理员注销:
面向对象设计大作业——火车售票系统

系统结构功能图

面向对象设计大作业——火车售票系统

系统描述

点击运行火车售票系统软件,用户输入用户名密码,或者直接注册一个账号。登录成功后进入用户界面,可以选择按始发地、目的地或者车次号查询购票,点击用户信息里面的已购车票,可以查看已经购买的车票和进行退票,操作完成后进行注销。管理员输入唯一的账号进行登录,可以点击功能查看所有用户信息或者注销返回登录界面。管理员可以录入车次,修改车次信息,删除车次和查看所有车次信息

UML类图

面向对象设计大作业——火车售票系统

MVC模式

MVC模式中,M指Model(业务模型),V指View(视图),C指Controller(控制器),其中Controller也就是事件监听器。就让我们拿
MVC模式的好处:
1.代码耦合度低。每个模块各司其职,M、V、C分别负责不同的功能,对界面的操作代码和业务逻辑代码之间分离。
2.可以做到分层开发。编写业务逻辑代码的程序员不用考虑界面操作,编写控制器的只需要处理与view交互的数据,并选择合适的业务逻辑代码处理数据即可。
3.扩展性和可维护性高。由于各功能模块之间代码分离,修改某部分代码时只要处理好接口,就不会影响到其他代码。
面向对象设计大作业——火车售票系统

MVC模式在程序中的体现

面向对象设计大作业——火车售票系统

DAO模式

DAO模式,是将业务逻辑与数据的具体访问相分离的一种模式,它可以根据后台数据存储方式的不同,定义不同的实现方法。例如,编写GUI相关代码时,无需考虑数据操作的具体实现方法,只需要调用相应DAO方法。如果底层数据存储方式需要改变,只要增加DAO接口的新实现类即可,有利于不同人员的分工合作,提高效率。
面向对象设计大作业——火车售票系统
面向对象设计大作业——火车售票系统
面向对象设计大作业——火车售票系统

项目包结构和关键代码

包结构

面向对象设计大作业——火车售票系统

关键代码

用户进行购票:

private void purchaseActionPerformed(java.awt.event.ActionEvent evt) {
   //GEN-FIRST:event_purchaseActionPerformed
        // TODO add your handling code here:
        int[] selectRows=trainNumberInformation.getSelectedRows();
        AlreadyBoughtTheTicketOperationExcelImpl alreadyBoughtTheTicketOperationExcel = new AlreadyBoughtTheTicketOperationExcelImpl();
        TrainNumberInfoOperationExcelImpl trainNumberInfoOperationExcel = new TrainNumberInfoOperationExcelImpl();
        DefaultTableModel model=(DefaultTableModel)trainNumberInformation.getModel();
        TableModel model1=trainNumberInformation.getModel();
        for (int i = selectRows.length - 1; i >= 0; i--) {
   
            int selectRow = selectRows[i];
            if (selectRow!=-1) {
   
                int count=(Integer) model1.getValueAt(selectRow,5);
                count--;
                AlreadyBoughtTheTicket alreadyBoughtTheTicket1=new AlreadyBoughtTheTicket(this.user.getUserName(),this.user.getPassword(),(String)model1.getValueAt(selectRow,0),(String)model1.getValueAt(selectRow,1),(String)model1.getValueAt(selectRow,2),(String)model1.getValueAt(selectRow,3),(String)model1.getValueAt(selectRow,4),1,(Double) model1.getValueAt(selectRow,6));
                if ( alreadyBoughtTheTicketOperationExcel.purchase(alreadyBoughtTheTicket1)==null) {
   
                    JOptionPane.showMessageDialog(null, "该票已经购买过!,请重新选择");
                    break;
                } else {
   
                    TrainNumberInfo trainNumberInfo=new TrainNumberInfo((String)model1.getValueAt(selectRow,0),(String)model1.getValueAt(selectRow,1),(String)model1.getValueAt(selectRow,2),(String)model1.getValueAt(selectRow,3),(String)model1.getValueAt(selectRow,4),count,(Double) model1.getValueAt(selectRow,6));
                    trainNumberInfoOperationExcel.reduce(trainNumberInfo);
                }
                if (count== 0) {
   
                    model.removeRow(selectRow);
                    break;
                }
                trainNumberInformation.setValueAt(count,selectRow,5);
            }
        }
    }//GEN-LAST:event_purchaseActionPerformed

用户进行退票:

private void refundActionPerformed(java.awt.event.ActionEvent evt) {
   //GEN-FIRST:event_refundActionPerformed
        // TODO add your handling code here:
        AlreadyBoughtTheTicket alreadyBoughtTheTicket1=null;
        TrainNumberInfoOperationExcelImpl trainNumberInfoOperationExcel = new TrainNumberInfoOperationExcelImpl();
        AlreadyBoughtTheTicketOperationExcelImpl alreadyBoughtTheTicketOperationExcel=new AlreadyBoughtTheTicketOperationExcelImpl();
        int[] selectRows=alreadyBoughtTheTicket.getSelectedRows();
        DefaultTableModel model=(DefaultTableModel)alreadyBoughtTheTicket.getModel();
        TableModel model1=alreadyBoughtTheTicket.getModel();
        for (int i = selectRows.length - 1; i >= 0; i--) {
   
            int selectRow = selectRows[i];
            if (selectRow!=-1) {
   
                int count=(Integer) model1.getValueAt(selectRow,5);
                count--;
                alreadyBoughtTheTicket1=new AlreadyBoughtTheTicket(this.user.getUserName(),this.user.getPassword(),(String)model1.getValueAt(selectRow,0),(String)model1.getValueAt(selectRow,1),(String)model1.getValueAt(selectRow,2),(String)model1.getValueAt(selectRow,3),(String)model1.getValueAt(selectRow,4),(Integer) model1.getValueAt(selectRow,5),(Double) model1.getValueAt(selectRow,6));
                alreadyBoughtTheTicketOperationExcel.refund(alreadyBoughtTheTicket1);
                TrainNumberInfo trainNumberInfo=new TrainNumberInfo((String)model1.getValueAt(selectRow,0),(String)model1.getValueAt(selectRow,1),(String)model1.getValueAt(selectRow,2),(String)model1.getValueAt(selectRow,3),(String)model1.getValueAt(selectRow,4),1,(Double) model1.getValueAt(selectRow,6));
                trainNumberInfoOperationExcel.add(trainNumberInfo);
                if (count== 0) {
   
                    model.removeRow(selectRow);
                    break;
                }
                alreadyBoughtTheTicket.setValueAt(count,selectRow,5);
            }
        }
    }//GEN-LAST:event_refundActionPerformed

特色

该程序的所有信息都是通过excel文档进行存储,能够方便地写入和读取信息,不需要担心像txt文档存储格式的问题,所用到的是阿里巴巴开发的EasyExcel工具,它能够实现对excel文档快速,方便地进行一系列操作。
如果对这个感兴趣,可以观看教学视频
该程序实现了从jar到exe的转换,可以在任一一台电脑安装使用,即使该电脑没有安装jdk,都可以使用。
实现方法,参考以下链接
https://blog.csdn.net/mawei7510/article/details/89638126
https://blog.csdn.net/mawei7510/article/details/89675034

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114440.html原文链接:https://javaforall.net

(0)
上一篇 2021年10月6日 下午10:00
下一篇 2021年10月6日 下午11:00


相关推荐

  • thetrialthatrockedtheworld总结_the average hourly wage

    thetrialthatrockedtheworld总结_the average hourly wage聊聊storm WindowTridentProcessor的FreshCollector

    2022年4月20日
    86
  • SDK和API的区别

    SDK和API的区别不知道区别的人 大概率是你还没搞懂 API SDK 是什么 讲个小故事 研发人员 A 开发了软件 A 研发人员 B 正在研发软件 B 有一天 研发人员 B 想要调用软件 A 的部分功能来用 但是他又不想从头看一遍软件 A 的源码和功能实现过程 怎么办呢 研发人员 A 想了一个好主意 我把软件 A 里你需要的功能打包好 写成一个函数 你按照我说的流程 把这个函数放在软件 B 里 就能直接用我的功能了 其中 API 就是研发人员 A 说的那个函数 这就是 API 的诞生 日常生活中 我们有很多类似 API 的场景 比如 电脑需要调用手机里面的信息 这时

    2026年3月20日
    2
  • spring mvc 控制器方法传递一些经验对象的数组

    spring mvc 控制器方法传递一些经验对象的数组

    2022年1月8日
    56
  • pycharm的查找替换_pycharm调用其他py文件

    pycharm的查找替换_pycharm调用其他py文件1、打开要修改的文件2、ctrlr调出替换功能,如图所示:3、上面红框是需要更改的部分,下面红框是想要更改为部分,编辑后,点击“replaceall”即可示例原始页面ctrlr调出替换功能,如图所示在上一栏输入被替换字段,下一栏输入想换成的字段点击replaceall结果…

    2022年8月28日
    7
  • Letsencrypt简单教程调整

    Letsencrypt简单教程调整Letsencrypt 简单教程 一文较为详细地介绍了 Letsencrypt 的安装以及使用方法 然而 最近在一台服务器部署 letsencrypt 时 执行 letsencrypt auto 命令出现错误 letsencrypt autohelpallS autoisdeprec Yoursystemis autoanymore

    2026年1月25日
    2
  • Linux文本处理神器awk实战案例

    Linux文本处理神器awk实战案例1.什么是awk2.打印不同列的内容3.打印行号和列号4.修改输入和输出分隔符5.输入多个文件6.修改某一列的值7.条件筛选后打印8.运算9.正则表达式

    2022年7月11日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号