面向对象设计大作业——火车售票系统
Git地址
程序运行效果
用户注册登录:
按始发地、目的地查询购票:
按车次号查询购票:
查看已购车票,退票,注销:
管理员登录,查看所有用户信息:
录入车次:
删除车次:
修改车次信息:
查看所有车次:
管理员注销:
系统结构功能图
系统描述
点击运行火车售票系统软件,用户输入用户名和密码,或者直接注册一个账号。登录成功后进入用户界面,可以选择按始发地、目的地或者车次号查询购票,点击用户信息里面的已购车票,可以查看已经购买的车票和进行退票,操作完成后进行注销。管理员输入唯一的账号进行登录,可以点击功能,查看所有用户信息或者注销返回登录界面。管理员可以录入车次,修改车次信息,删除车次和查看所有车次信息。
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