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

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

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • spi,i2c,uart三种总线的区别(vga接口是干嘛用的)

    一SPII2CUART通信速率比较二串行和并行同步和异步的区别三I2C接口与串行接口的区别四总线接口UARTI2CSPIUSB的异同点五串口通信UARTSPII2C区别UART通用异步收发器I2CUART总结一、SPII2CUART通信速率比较:SPI>I2C>UART1、同步通信>异步通信;2、同步通信…

  • Python编程题2–水仙花数

    Python编程题2–水仙花数题目如果一个3位数等于其各位数字的立方和,则称这个数为水仙花数。例如:153=13+53+3^3,因此153就是一个水仙花数请按照从小到大的顺序输出1000以内的水仙花数

  • [CTO札记]BlogBus机房搬迁居然在白天,而且要1天!

    [CTO札记]BlogBus机房搬迁居然在白天,而且要1天!

  • 数据结构学习笔记(二)–ElemType是什么?

    数据结构学习笔记(二)–ElemType是什么?ElemType(也有的书上称之为elemtp)是数据结构的书上为了说明问题而用的一个词。它是elementtype(“元素的类型”)的简化体。 因为数据结构是讨论抽象的数据存储和算法的,一种结构中元素的类型不一定是整型、字符型、浮点型或者用户自定义类型,为了不重复说明,使用过程中用“elemtype”代表所有可能的数据类型,简单明了的概括了整体。在算法中,除特别说明外,规定ElemType的默

  • 双向LSTM (BiLSTM) (双向RNN)

    双向LSTM (BiLSTM) (双向RNN)为什么用双向LSTM?单向的RNN,是根据前面的信息推出后面的,但有时候只看前面的词是不够的,例如,我今天不舒服,我打算____一天。只根据‘不舒服‘,可能推出我打算‘去医院‘,‘睡觉‘,‘请假‘等等,但如果加上后面的‘一天‘,能选择的范围就变小了,‘去医院‘这种就不能选了,而‘请假‘‘休息‘之类的被选择概率就会更大。什么是双向LSTM?双向卷积神经网络的隐藏层要保存两个值,A参与正向计算,A’参与反向计算。最终的输出值y取决于A和A’:即正向..

发表回复

您的电子邮箱地址不会被公开。

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