ATM管理系統(tǒng)java窗口界版_第1頁
ATM管理系統(tǒng)java窗口界版_第2頁
ATM管理系統(tǒng)java窗口界版_第3頁
ATM管理系統(tǒng)java窗口界版_第4頁
ATM管理系統(tǒng)java窗口界版_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

ATM管理系統(tǒng)引言:本系統(tǒng)采用JAVA語言并在eclipse環(huán)境下編寫測試完成,涉及類的概念,以及面向?qū)ο蟮膸状筇匦裕ɡ^承,封裝,多態(tài),抽象),也有異常處理機制,采用集合(更好)存儲賬戶數(shù)據(jù),基本可以滿足大多數(shù)BAM系統(tǒng)的相關(guān)實現(xiàn)。JAVA類的面相對象的應(yīng)用,擁有異常處理機制,不會因為輸入錯誤而導(dǎo)致程序崩潰。本系統(tǒng)各個類之間的相互關(guān)系,涉及繼承、封裝、多態(tài)、抽象,在多態(tài)中又涉及重載和重寫,相關(guān)聯(lián)系請關(guān)注代碼注釋??梢詫崿F(xiàn)數(shù)據(jù)保存功能,數(shù)據(jù)將保存在文件中(即當你注冊了一個賬戶,下次再登錄系統(tǒng)時,可以實現(xiàn)與上次最后的操作相銜接)。最后賬戶號自動生成,比較符合現(xiàn)實。1、軟件需求分析1.1市場需求由于的各方面發(fā)展速度的大幅提高,幾乎所有的銀行都配備了不用繁瑣的人工操作的ATM自動取款機。人們可以隨時隨地進行交易,不再受銀行的服務(wù)時間的約束,取款時也為人們節(jié)省了很多時間,方便快捷。對于配有ATM自動取款機的銀行,客戶較多,系統(tǒng)需操作方便,信息讀取與存儲及時快速,方便客戶進行自由交易和系統(tǒng)管理員對信息的管理。1.2功能需求軟件應(yīng)包含取款、存款、轉(zhuǎn)賬、查詢、修改密碼等ATM機的主要功能。2、程序結(jié)構(gòu)本系統(tǒng)主要有7個類,即①Account(賬戶類)②SaveAccount(儲蓄賬戶類):不能透支③CreditAccount(信用賬戶類):可以透支④Bank(銀行類)⑤ATMOpenAccountFrame(開戶窗口頁面)⑥ATMLoginFrame(登錄窗口頁面)⑦ATMMainFrame(操作窗口頁面) 注:帶有完善的相關(guān)信息提示彈出窗口(見下面截圖)類的具體屬性級行為見代碼3、功能介紹主要功能有:1.開戶(儲蓄賬戶—信用賬戶) 2.查詢賬戶余額 3.存款 4.取款 5.轉(zhuǎn)賬(一個賬戶到另一個賬戶)4、軟件設(shè)計7、運行時界面簡示 1.初始界面(賬戶登錄) 2.賬戶登錄后界面 3.相關(guān)信息提示一覽(只列舉一部分)1、查詢: 2、存款:3、取款:4、轉(zhuǎn)賬:4、用戶開戶界面:注意事項:1、本系統(tǒng)采用的編程環(huán)境是JDK1.7,jer7。所以,運行代碼需要保持電腦上所裝的JDK為1.7以上版本,如有報錯,只需換個高一點的版本即可。注意:第一次裝JDK,要配置環(huán)境變量(請查閱相關(guān)資料,比較簡單)2、本系統(tǒng)代碼涉及到包,所以如果報名不一致就會報錯,解決方法:修改一下包名即可3、建議把各個類寫在同一個包下面,且每一個類單獨寫一個java文件,如下圖: 4、在運行程序前,需要在項目下面新建一個account.txt(用來保存數(shù)據(jù))文件(如上圖),并在其中寫入至少一個賬戶信息,(如下圖,其中每項代表的意思,請讀者參照代碼內(nèi)的注釋),否則在初始化的時候會因為找不到賬戶信息,從而產(chǎn)生異常。 系統(tǒng)源碼:Account類packagecom.qx;importjavax.swing.JOptionPane;/***賬戶類:包含兩種賬戶類型-->1.儲蓄賬戶2.信用賬戶*/publicabstractclassAccount{ //屬性 protectedlongid; protectedStringpassword; protectedStringname; protectedStringpersonId; protectedStringaccountType; protecteddoublebalance; //構(gòu)造方法 publicAccount(){ super(); } publicAccount(longid,Stringpassword,Stringname,StringpersonId, Stringtype,doublebalance){ super(); this.id=id; this.password=password; =name; this.personId=personId; this.accountType=type; this.balance=balance; } //getXxx,setXxx方法 publiclonggetId(){ returnid; } publicvoidsetId(longid){ this.id=id; } publicStringgetPassword(){ returnpassword; } publicvoidsetPassword(Stringpassword){ this.password=password; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ =name; } publicStringgetPersonId(){ returnpersonId; } publicvoidsetPersonId(StringpersonId){ this.personId=personId; } publicStringgetAccountType(){ returnaccountType; } publicvoidsetAccountType(StringaccountType){ this.accountType=accountType; } publicdoublegetBalance(){ returnbalance; } publicvoidsetBalance(doublebalance){ this.balance=balance; } /** *存款 */ publicvoiddeposit(doublemoney){ balance+=money; } /** *取款(取款方式由賬戶類型決定,所以設(shè)為抽象方法,相應(yīng)的Account類應(yīng)設(shè)為抽象類) */ publicabstractvoidwithdraw(doublemoney); }SavingAccount類packagecom.qx;importjavax.swing.JOptionPane;/***儲蓄賬戶類*/publicclassSavingAccountextendsAccount{ //構(gòu)造函數(shù) publicSavingAccount(){ super(); } publicSavingAccount(longid,Stringpassword,Stringname, StringpersonId,StringaccountType,doublebalance){ super(id,password,name,personId,accountType,balance); } //對父類的withdraw()實現(xiàn) publicvoidwithdraw(doublemoney){ if(balance<money){ /*System.out.println("對不起,賬戶余額不足!");*/ JOptionPane.showMessageDialog(null,"對不起,賬戶余額不足!", "信息提示",JOptionPane.ERROR_MESSAGE); } else { balance-=money; } }}CreditAccount類packagecom.qx;importjavax.swing.JOptionPane;/***信用賬戶類,增加一個信用額度ceiling屬性*/publicclassCreditAccountextendsAccount{ privateintceiling; //構(gòu)造函數(shù) publicCreditAccount(){ super(); } publicCreditAccount(longid,Stringpassword,Stringname, StringpersonId,StringaccountType,doublebalance,intceiling){ super(id,password,name,personId,accountType,balance); this.ceiling=ceiling; } //getXxx,setXxx方法 publicintgetCeiling(){ returnceiling; } publicvoidsetCeiling(intceiling){ this.ceiling=ceiling; } //實現(xiàn)父類的withdraw() publicvoidwithdraw(doublemoney){ if((balance+ceiling)<money){ /*System.out.println("對不起,已超出您的信用額度!");*/ JOptionPane.showMessageDialog(null,"對不起,已超出您的信用額度!", "信息提示",JOptionPane.ERROR_MESSAGE); } else { balance-=money; } }}Bank類packagecom.qx;importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileNotFoundException;importjava.io.FileReader;importjava.io.FileWriter;importjava.io.IOException;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;importjava.util.Properties;importjavax.swing.JOptionPane;/***Bank類*編寫B(tài)ank類,屬性:1.當前所有的賬戶對象的集合,存放在數(shù)組中2.當前賬戶數(shù)量方法:1.用戶開戶,需要的參數(shù):id,密碼,密碼確認,姓名,身份證號碼,賬戶類型,返回新創(chuàng)建的Account對象的賬號,提示:用s1.equals(s2)可以比較s1,s2兩個字符串的值是否相等.賬戶類型是一個整數(shù),為0的時候表示儲蓄賬戶,為1的時候表示信用賬戶2.用戶登錄,參數(shù):id,密碼返回登錄賬戶的賬號3.用戶存款,參數(shù):id,存款數(shù)額,返回void4.用戶取款,參數(shù):id,取款數(shù)額,返回void5.查詢余額,參數(shù):id,返回該賬戶的余額double用戶會通過調(diào)用Bank對象以上的方法來操作自己的賬戶,請分析各個方法需要的參數(shù)*/publicclassBank{ /*privateAccount[]accounts=newAccount[20];*/ privateListaccountsList; privateintnumber;//賬戶數(shù)目 privateintid=1001;//確定銀行賬號從1001開始生成,即第一個賬戶的賬號是1001 //構(gòu)造函數(shù) publicBank(){ accountsList=newArrayList<Account>(); number=0; BufferedReaderbufReader=null; Propertiesprops=System.getProperties(); Stringpath=props.getProperty("user.dir"); try{ bufReader=newBufferedReader(newFileReader(newFile(path,"account.txt"))); Strings=bufReader.readLine(); while(s!=null){ String[]str=s.split(","); if(str[4].equals("0")) { AccountsavingAcc=newSavingAccount(Long.parseLong(str[0]), str[1].toString(),str[2].toString(), str[3].toString(),str[4].toString(), Double.parseDouble(str[5])); accountsList.add(savingAcc); } else { AccountcreditAcc=newCreditAccount(Long.parseLong(str[0]), str[1].toString(),str[2].toString(), str[3].toString(),str[4].toString(), Double.parseDouble(str[5]),5000); accountsList.add(creditAcc); } number++; id++; s=bufReader.readLine(); } }catch(NumberFormatExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(FileNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }finally{ try{ if(bufReader!=null) { bufReader.close(); } }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } } //getXxx,setXxx publicListgetAccounts(){ returnaccountsList; } publicvoidsetAccounts(Listaccounts){ this.accountsList=accounts; } publicintgetNumber(){ returnnumber; } publicvoidsetNumber(intnumber){ this.number=number; } publicintgetId(){ returnid; } publicvoidsetId(intid){ this.id=id; } /** *開戶 */ publicAccountopenAccount(Stringpasswd1,Stringpasswd2,Stringname, StringpersonId,Stringtype){ //創(chuàng)建一個新賬戶 Accountaccount=null; //判斷兩次密碼是否一致 if(passwd1.equals(passwd2)){ //若一致,再判斷賬戶類型(根據(jù)type的值) if(type.equals("1")){ //可令開始余額為10,信用額度為5000 account=newCreditAccount(id,passwd1,name,personId,type,10,5000); } else { account=newSavingAccount(id,passwd1,name,personId,type,10); } //將賬戶存入賬戶集合accountsList中 accountsList.add(account); JOptionPane.showMessageDialog(null,"開戶成功!?。?,"信息提示", JOptionPane.INFORMATION_MESSAGE); JOptionPane.showMessageDialog(null,"您的卡號為:"+id+"\n"+ "您的密碼為:"+passwd1+"\n"+"您的戶名為:"+name+"\n"+ "您的身份證號為:"+personId+"\n"+"您的賬戶類型為:"+type+"\n","信息提示", JOptionPane.INFORMATION_MESSAGE); account.accountType=type; number++; id++; returnaccount;//此時開戶成功 } else { JOptionPane.showMessageDialog(null,"對不起!您兩次密碼輸入不匹配,開戶失?。。?!", "信息提示",JOptionPane.ERROR_MESSAGE); returnnull;//此時開戶失敗 } } /** *保存數(shù)據(jù) */ publicvoidsaveAccountDate(){ BufferedWriterbufWriter=null; try{ Propertiesprops=System.getProperties(); Stringpath=props.getProperty("user.dir"); Strings=null; bufWriter=newBufferedWriter(newFileWriter(newFile(path,"account.txt"))); for(Iteratoriterator=accountsList.iterator();iterator.hasNext();) { //若存在賬戶 Accountacc=(Account)iterator.next(); //寫入賬戶信息到account.txt bufWriter.write(acc.id+","); bufWriter.write(acc.getPassword()+","); bufWriter.write(acc.getName()+","); bufWriter.write(acc.getPersonId()+","); bufWriter.write(acc.getAccountType()+","); bufWriter.write(Double.toString(acc.getBalance())); bufWriter.newLine(); } bufWriter.flush();//清空緩存中的內(nèi)容 }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }finally{ try{ if(bufWriter!=null){ bufWriter.close(); } }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } } /** *登錄驗證 */ publicAccountverifyAccount(longid,Stringpassword){ Accountaccount=null; Accountacc=null; for(Iteratoriterator=accountsList.iterator();iterator.hasNext();) { //若存在賬戶 acc=(Account)iterator.next(); if(acc!=null){ if(id==acc.getId()&&password.equals(acc.getPassword())){ account=acc; break; } } else { break; } } returnaccount; } /** *轉(zhuǎn)賬驗證(方法的重載) */ publicAccountverifyAccount(longid){ Accountaccount=null; Accountacc=null; for(Iteratoriterator=accountsList.iterator();iterator.hasNext();) { //若存在賬戶 acc=(Account)iterator.next(); if(acc!=null){ if(id==acc.getId()){ account=acc; break; } } else { break; } } returnaccount; } /** *轉(zhuǎn)賬 */ publicvoidtransferAccount(Accountaccount1,Accountaccount2,doublemoney){ account1.withdraw(money); account2.deposit(money); } /** *存款 */ publicvoiddeposit(Accountaccount,doublemoney){ account.deposit(money); } /** *取款 */ publicvoidwithdraw(Accountaccount,doublemoney){ account.withdraw(money); } }ATMLoginFrame類packagecom.qx;importjava.awt.Dimension;importjava.awt.GridLayout;importjava.awt.Toolkit;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JOptionPane;importjavax.swing.JPanel;importjavax.swing.JTextField;publicclassATMLoginFrameextendsJFrame{ privateJLabeljblCardNo,jblPasswd; privateJTextFieldjtfCardNo,jtfPasswd; privateJButtonjbOk,jbCancel,jbOpenAccount; privateJPaneljp1,jp2,jp3,jp4; privateBankbank; publicATMLoginFrame(){ bank=newBank(); //實例化所有組件 jblCardNo=newJLabel("用戶名:"); jblPasswd=newJLabel("密碼:"); jtfCardNo=newJTextField(20); jtfPasswd=newJTextField(20); jbOk=newJButton("確定"); jbCancel=newJButton("取消"); jbOpenAccount=newJButton("沒有賬戶,開戶"); jp1=newJPanel(); jp2=newJPanel(); jp3=newJPanel(); jp4=newJPanel(); jp1.add(jblCardNo); jp1.add(jtfCardNo); jp2.add(jblPasswd); jp2.add(jtfPasswd); jp3.add(jbOk); jp3.add(jbCancel); jp4.add(jbOpenAccount); //將每行逐行添加到frame中 this.add(jp1); this.add(jp2); this.add(jp3); this.add(jp4); this.setLayout(newGridLayout(4,1));//取消默認管理器,設(shè)置為3行1列的網(wǎng)格布局 Dimensiond=Toolkit.getDefaultToolkit().getScreenSize(); this.setTitle("登陸界面"); this.setBounds((d.width-300)/2,(d.height-200)/2,300,200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設(shè)置關(guān)閉窗口時JVM同時推出 this.pack();//調(diào)整窗口至能容納組件的最小尺寸 this.setVisible(true);//設(shè)置窗口可見 this.setResizable(false);//不能最大化 //使用匿名內(nèi)部類給2個按鈕注冊監(jiān)聽器 jbCancel.addActionListener( newActionListener(){ publicvoidactionPerformed(ActionEvente){ dispose();//關(guān)閉窗口 } } ); jbOk.addActionListener( newActionListener(){ publicvoidactionPerformed(ActionEvente){ //取出用戶界面輸入的用戶名和密碼 longcardNo=Integer.parseInt(jtfCardNo.getText()); Stringpasswd=jtfPasswd.getText(); //調(diào)用Bank的相關(guān)方法將二者與正確的做比對 Accountaccount=bank.verifyAccount(cardNo,passwd); if(account!=null)//假如正確,進入操作界面 { ATMMainFramemainFrame=newATMMainFrame(bank,account);//進入操作界面 dispose();//關(guān)閉登陸界面 }else{//假如錯誤,使用對話框提示錯誤信息 JOptionPane.showMessageDialog(null,"卡號或密碼錯誤","信息提示",JOptionPane.ERROR_MESSAGE); } } } ); jbOpenAccount.addActionListener( newActionListener(){ publicvoidactionPerformed(ActionEventarg0){ ATMOpenAccountFrameopenFram=newATMOpenAccountFrame(); dispose();//關(guān)閉登陸界面 } } ); } /** *@paramargs */ publicstaticvoidmain(String[]args){ ATMLoginFrameatm=newATMLoginFrame(); }}ATMMainFrame類packagecom.qx;importjava.awt.Dimension;importjava.awt.FlowLayout;importjava.awt.GridLayout;importjava.awt.Toolkit;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.util.Scanner;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JOptionPane;importjavax.swing.JPanel;publicclassATMMainFrameextendsJFrame{ privateAccountaccount; privateBankbank; privateJButtonjbDeposit,jbWithdraw,jbCancel,jbQuery,jbTransfer; privateJLabeljblMsg,jblName; privateJPaneljp1,jp2,jp3,jp4; /** *@paramargs */ publicATMMainFrame(finalBankbank,AccounttmpA){ this.account=tmpA; this.bank=bank; jbQuery=newJButton("查詢"); jbDeposit=newJButton("存款"); jbWithdraw=newJButton("取款"); jbTransfer=newJButton("轉(zhuǎn)賬"); jbCancel=newJButton("退卡"); jblName=newJLabel("賬戶姓名:"+account.getName()); jblMsg=newJLabel(); jp1=newJPanel(); jp2=newJPanel(); jp3=newJPanel(); jp4=newJPanel(); jp1.add(jbQuery); jp1.add(jbDeposit); jp2.add(jbWithdraw); jp2.add(jbTransfer); jp3.add(jbCancel); jp4.add(jblName); jp4.add(jblMsg); //將每行逐行添加到frame中 this.add(jp1); this.add(jp2); this.add(jp3); this.add(jp4); this.setLayout(newGridLayout(4,1));//取消默認管理器,設(shè)置為4行1列的網(wǎng)格布局 Dimensiond=Toolkit.getDefaultToolkit().getScreenSize(); this.setTitle("操作界面"); this.setBounds((d.width-300)/2,(d.height-200)/2,300,200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設(shè)置關(guān)閉窗口時JVM同時推出 //this.pack();//調(diào)整窗口至能容納組件的最小尺寸 this.setVisible(true);//設(shè)置窗口可見 this.setResizable(false); //使用匿名內(nèi)部類給查詢按鈕注冊監(jiān)聽器 jbQuery.addActionListener( newActionListener(){ publicvoidactionPerformed(ActionEvente){ JOptionPane.showMessageDialog(null,"您賬戶的當前余額為:"+account.getBalance(), "信息提示",JOptionPane.INFORMATION_MESSAGE); } } ); //給存款按鈕注冊監(jiān)聽器 jbDeposit.addActionListener( newActionListener(){ publicvoidactionPerformed(ActionEventarg0){ Strings=JOptionPane.showInputDialog("請輸入存款金額:"); doublemoney=Double.parseDouble((s.equals("")?"0":s)); bank.deposit(account,money); JOptionPane.showMessageDialog(null,"存款成功?。?!","信息提示", JOptionPane.INFORMATION_MESSAGE); jblName=newJLabel("賬戶姓名:"+account.getName()); jblMsg.setText("余額:"+account.getBalance()); } } ); //給取款按鈕注冊監(jiān)聽器 jbWithdraw.addActionListener( newActionListener(){ publicvoidactionPerformed(ActionEventarg0){ Strings=JOptionPane.showInputDialog("請輸入取款金額:"); doublemoney=Double.parseDouble((s.equals("")?"0":s)); bank.withdraw(account,money); /*JOptionPane.showMessageDialog(null,"取款成功?。。?,"信息提示", JOptionPane.INFORMATION_MESSAGE);*/ jblName=newJLabel("賬戶姓名:"+account.getName()); jblMsg.setText("余額:"+account.getBalance()); } } ); //給轉(zhuǎn)賬按鈕注冊監(jiān)聽器 jbTransfer.addActionListener( newActionListener(){ publicvoidactionPerformed(ActionEvente){ StringsId=JOptionPane.showInputDialog("請輸入要轉(zhuǎn)賬的卡號:"); longid2=Long.parseLong(sId); Accountaccount2=bank.verifyAccount(id2); if(account2!=null) { StringsNum=JOptionPane.showInputDialog("請輸入您要轉(zhuǎn)入賬戶的金額:"); doublemoney=Double.parseDouble((sNum.equals("")?"0":sNum)); if(money<=account.balance) { bank.transferAccount(account,account2,money); JOptionPane.showMessageDialog(null,"轉(zhuǎn)賬成功?。?!","信息提示", JOptionPane.INFORMATION_MESSAGE); } else { JOptionPane.showMessageDialog(null,"抱歉,您賬戶沒有足夠的金額!請查看后重新選擇輸入!", "信息提示",JOptionPane.ERROR_MESSAGE); } } else { JOptionPane.showMessageDialog(null,"抱歉,沒有找到您要轉(zhuǎn)入的賬戶信息!請核對后重新選擇輸入!","信息提示", JOptionPane.ERROR_MESSAGE); } jblName=newJLabel("賬戶姓名:"+account.getName()); jblMsg.setText("余額:"+account.getBalance()); } } ); //給退卡按鈕注冊監(jiān)聽器 jbCancel.addActionListener( newActionListener(){ publicvoidactionPerformed(ActionEvente){ bank.saveAccountDate(); dispose();//關(guān)閉窗口 } } ); } }ATMOpenAccountFrame類packagecom.qx;importjava.awt.Dimension;importjava.awt.GridLayout;importjava.awt.Toolkit;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論