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