面向對象設計大作業——火車售票系統


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM