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

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

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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【Unity3D 灵巧小知识点】 ☀️ | Unity中如何使用代码切换场景

    【Unity3D 灵巧小知识点】 ☀️ | Unity中如何使用代码切换场景Unity小科普老规矩,先介绍一下Unity的科普小知识:Unity是实时3D互动内容创作和运营平台。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助Unity将创意变成现实。Unity平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。也可以简单把Unity理解为一个游戏引擎,可以用来专业制作游戏!Unity小知识点学习Unity中如何使用代码切.

    2022年5月29日
    42
  • 织梦dedecms中arclist标签下无法嵌套图片

    织梦dedecms中arclist标签下无法嵌套图片

    2021年9月21日
    40
  • android之回调函数的用法和意义

    CallBack是回调的意思,一般称之为回调函数百科的解释:http://baike.baidu.com/link?url=8yMUwVEFRzxR4JGMxVN_UnFgJIH4WTnsybuW5NfwgKqVKP8NtShfJnNNeY9mBzRT用一个比较形象的例子:你饿了,想吃饭,就一会去问你妈一声”开饭没有啊?”这就是正常函数调用.但是今天你妈包饺子,花的时间比较长,

    2022年3月10日
    44
  • 谈谈CListCtrl 扩展风格设置方法-SetExtendedStyle和ModifyStyleEx 比较[通俗易懂]

    谈谈CListCtrl 扩展风格设置方法-SetExtendedStyle和ModifyStyleEx 比较[通俗易懂]谈谈CListCtrl扩展风格设置方法————————————–SetExtendedStyle和ModifyStyleEx比较 对于初学者来说,当他需要设定listctrl的扩展风格时,常常想到用ModifyStyleEx来设定,代码如下:ModifyStyleEx(0,LVS_EX_GRIDLINES)这是不正确的,正

    2022年7月19日
    19
  • S3C2440中断介绍

    S3C2440中断介绍1.1   S3C2440系统中断CPU和外设构成了计算机系统,CPU和外设之间通过总线进行连接,用于数据通信和控制,CPU管理监视计算机系统中所有硬件,通常以两种方式来对硬件进行管理监视:l  查询方式:CPU不停的去查询每一个硬件的当前状态,根据硬件的状态决定处理与否。好比是工厂里的检查员,不停的检查各个岗位工作状态,发现情况及时处理。这种方式实现起来简单,通常用在只有少量外设硬件的系

    2022年5月5日
    38
  • tensorflow各个版本的CUDA以及Cudnn版本对应关系

    tensorflow各个版本的CUDA以及Cudnn版本对应关系概述,需要注意以下几个问题:(1)NVIDIA的显卡驱动程序和CUDA完全是两个不同的概念哦!CUDA是NVIDIA推出的用于自家GPU的并行计算框架,也就是说CUDA只能在NVIDIA的GPU上运行,而且只有当要解决的计算问题是可以大量并行计算的时候才能发挥CUDA的作用。CUDA的本质是一个工具包(ToolKit);但是二者虽然不一样的。显卡驱动的安装:当我们使用…

    2022年6月9日
    28

发表回复

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

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