從0到1,實現Java控制台版本的ATM管理系統 其實作為一名Java的程式猿,無論你是初學也好,大神也罷,管理系統一直都是一個非常好的例子,初學者主要是用數組、List等等來寫出一個簡易的管理系統.牛逼一點的大神則用資料庫+swing來做一個有界面的管理系統,其實都並不會太難。 今天我就先 ...
從0到1,實現Java控制台版本的ATM管理系統
其實作為一名Java的程式猿,無論你是初學也好,大神也罷,管理系統一直都是一個非常好的例子,初學者主要是用數組、List等等來寫出一個簡易的管理系統.牛逼一點的大神則用資料庫+swing來做一個有界面的管理系統,其實都並不會太難。
今天我就先寫一個簡單的管理系統:用List來實現銀行的ATM管理系統
1.ATM系統技術選型分析
技術點分析
1.1 面向對象編程
每個用戶對象要對應一個賬戶對象,所以需要設計賬戶類Account
1.2 程式流程式控制制
需要結合分支、迴圈、跳轉等相關操作控製程序的業務邏輯
1.3 使用集合容器
系統需要提供一一個容器用於存儲這些賬戶對象的信息,我們選ArrayList集合,因為ArrayList底層是可變的數組,操作起來相比於數組較為方便一些
1.4 使用常見API
內容比較,分析,數據處理等需要用到String等常用API
2.學習收穫
2.1 優秀的面向對象編程能力,清晰、縝密的業務、數據分析能力
2.2 形成良好的編碼習慣,獲得一定的編碼經驗
2.3 熟練使用程式流程技術來控制電腦完成自己的想法
2.4 形成Java編程的業務思維,和解決問題的能力,讓基礎知識形成體系,為後續學習Java高級技術做有
力支撐
3.功能分析
3.1 賬戶類、首頁設計
分析:
①每個用戶一個賬戶對象,需要設計賬戶類,賬戶類至少包含(卡號、用戶名、餘額、取現額度、密碼)
1、用戶的賬戶信息,系統如何表示的?
- 定義賬戶類Account, 定義系統關心的屬性信息。
一個標準類的書寫應當包括如下細節:
-
成員屬性私有化
-
提供空參/滿參的構造方法
-
提供get/set方法
public class Account {
//成員屬性
//卡號
private String cardID;
//用戶名
private String userName;
//密碼
private String passWord;
//餘額
private double money;
//取現額度
private double quotaMoney;
//提供空參/滿參的構造方法
public Account() {
}
public Account(String cardID, String username, String password, double money, double quotaMoney) {
this.cardID = cardID;
this.userName = username;
this.passWord = password;
this.money = money;
this.quotaMoney = quotaMoney;
}
//提供get/和set方法
public String getCardID() {
return cardID;
}
public void setCardID(String cardID) {
this.cardID = cardID;
}
public String getUsername() {
return userName;
}
public void setUsername(String username) {
this.userName = username;
}
public String getPassword() {
return passWord;
}
public void setPassword(String password) {
this.passWord = password;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public double getQuotaMoney() {
return quotaMoney;
}
public void setQuotaMoney(double quotaMoney) {
this.quotaMoney = quotaMoney;
}
}
②系統採用什麼來存儲賬戶對象?
- 需要定義一個ArrayList的集合用於存儲賬戶對象。
//定義集合對象,存儲所有賬戶信息
ArrayList<Account> accountList = new ArrayList<>();
③需要展示歡迎頁包含2個功能:註冊開戶、登錄賬戶。
==========歡迎您進入黑馬銀行ATM系統==========
1. 登錄賬戶.
2. 註冊賬戶.
3. 退出.
===========================================
3.2 用戶開戶功能實現
開戶功能的實現需要哪幾步操作,需要註意什麼問題?
- 開戶功能 應該獨立定義成方法,並傳入當前集合對象給該方法。
- 卡號 是通過設計的方法隨機返回8個數字代表卡號,註意:卡號不能重覆
- 把開戶的信 息封裝成Account對象,存入到集合中。
分析
①開戶功能應該獨立定義成方法,並傳入當前集合對象給該方法。
private static boolean registerAccount(ArrayList<Account> accountList, Scanner scanner)
②需要提示用戶輸入個人信息,開戶的卡號是系統自動生成的8位數。
private static String createCardID(ArrayList<Account> accountList)
③註意:自動生成的卡號不能與其他用戶的卡號重覆。
private static Account isCardIDExisting(ArrayList<Account> accountList, String cardID)
④最終把用戶開戶的信息封裝成Account對象,存入到集合中。
Account account = new Account(cardID, userName, passWord, 0.0, quotaMoney);//滿參構造,初始化數據
accountList.add(account);
運行效果
==========歡迎您進入黑馬銀行ATM系統==========
1. 登錄賬戶.
2. 註冊賬戶.
3. 退出.
===========================================
請輸入命令1、2、3. 選擇對應的操作: 2
==========歡迎您進入黑馬銀行用戶辦卡界面==========
請輸入您的姓名: 常州陪彭於晏
請輸入您的密碼: 9527
請再次輸入您的密碼: 9527
請設置當次取現額度: 15000
尊敬的常州陪彭於晏貴賓先生/女士,您的賬戶已經開卡成功,您的卡號是: 65301297.
註冊成功~~~
3.3 用戶登錄功能實現
1、登錄功能如何實現的?
- 根據卡號去集合中查詢對應的賬戶對象。
- 如果找到了賬戶對象, 說明卡號存在,繼續輸入密碼。
- 如果密碼也正確, 則登錄成功。
分析
①需要根據卡號去集合中查詢對應的賬戶對象。
private static Account isCardIDExisting(ArrayList<Account> accountList, String cardID)
②如果找到了賬戶對象,說明卡號存在,繼續輸入密碼。
③如果密碼也正確,則登錄成功。
運行效果
==========歡迎您進入黑馬銀行ATM系統==========
1. 登錄賬戶.
2. 註冊賬戶.
3. 退出.
=========================================
請輸入命令1、2、3. 選擇對應的操作: 1
==========黑馬銀行ATM系統登錄界面==========
請輸入您的卡號: 77711112
請輸入您的密碼: 9527
登錄成功~~~
3.4 用戶操作頁設計、查詢賬戶、退出賬戶功能
分析
①用戶登錄成功後,需要進入用戶操作頁。
private static void showCommand(Account account, ArrayList<Account> accountList, Scanner scanner)
②查詢就是直接展示當前登錄成功的賬戶對象的信息。
private static void showAccountInfo(Account account)
③退出賬戶是需要回到首頁的。
運行效果
==========黑馬銀行ATM系統登錄界面==========
請輸入您的卡號: 37682957
請輸入您的密碼: 9527
登錄成功~~~
尊敬的常州彭於晏貴賓先生/女士,您可以辦理如下業務,您的卡號是37682957~~~
==========歡迎您進入黑馬銀行用戶操作界面==========
1.查詢.
2.存款.
3.取款.
4.轉賬.
5.修改密碼.
6.退出.
7.註銷當前賬戶.
============================================
請選擇相關操作數:6
成功退出黑馬銀行用戶操作界面~~~
==========歡迎您進入黑馬銀行ATM系統==========
1. 登錄賬戶.
2. 註冊賬戶.
3. 退出.
=========================================
請輸入命令1、2、3. 選擇對應的操作:
3.5 用戶存款、取款功能設計
分析
①存款和取款都是拿到當前用戶的賬戶對象。
②通過調用賬戶對象的set方法修改其餘額。
運行效果
尊敬的常州彭於晏貴賓先生/女士,您可以辦理如下業務,您的卡號是18209986~~~
==========歡迎您進入黑馬銀行用戶操作界面==========
1.查詢.
2.存款.
3.取款.
4.轉賬.
5.修改密碼.
6.退出.
7.註銷當前賬戶.
============================================
請選擇相關操作數:2
==========歡迎您進入黑馬銀行用戶存款界面==========
請輸入存款的金額:15000
==========歡迎您進入黑馬銀行用戶詳情界面==========
您的賬戶信息如下:
卡號: 18209986
姓名: 常州彭於晏
餘額: 15000.0元
當次取現額度: 15000.0元
===========================================
您已經存款成功~~~
==========歡迎您進入黑馬銀行用戶取款界面==========
請輸入取款的金額:26000
此次取款金額超出了當次取現額度~~~
請輸入取款的金額:1000
==========歡迎您進入黑馬銀行用戶詳情界面==========
您的賬戶信息如下:
卡號: 18209986
姓名: 常州彭於晏
餘額: 14000.0元
當次取現額度: 15000.0元
===========================================
您已經取款成功~~~
3.6 用戶轉賬功能設計
分析
①轉賬功能要分析對方賬戶是否存在的問題。
②還要分析自己的餘額是否足夠的問題。
3.7 用戶密碼修改功能、銷戶功能
分析
①修改密碼就是把當前對象的密碼屬性使用set方法進行更新。
②銷戶是從集合對象中刪除當前對象,並回到首頁。
至此,ATM管理系統就在這裡,是不是很簡單呢?
4.部分源碼展示
public class ATMSystem {
public static void main(String[] args) {
//定義集合對象,存儲所有賬戶信息
ArrayList<Account> accountList = new ArrayList<>();
//鍵盤錄入的對象
Scanner scanner = new Scanner(System.in);
//操作數
int keyWord = 0;
//迴圈標誌
boolean runningFlag = true;
//登錄/註冊操作的返回值 成功/失敗
boolean status = true;
while (runningFlag) {
System.out.println("==========歡迎您進入黑馬銀行ATM系統==========\n");
System.out.println("1. 登錄賬戶.\n");
System.out.println("2. 註冊賬戶.\n");
System.out.println("3. 退出.\n");
System.out.println("=========================================\n");
System.out.print("請輸入命令1、2、3. 選擇對應的操作: ");
keyWord = scanner.nextInt();
System.out.println();
switch (keyWord) {
case 1:
//1. 登錄 待實現
//System.out.println("登錄 待實現\n");
status = loginAccount(accountList, scanner);
if (status) {
//System.out.println("登陸成功~~~\n");
} else
System.out.println("登錄失敗~~~\n");
break;
case 2:
//2. 註冊 待實現
//System.out.println("註冊 待實現\n");
status = registerAccount(accountList, scanner);
if (status)
System.out.println("註冊成功~~~\n");
else
System.out.println("註冊失敗~~~\n");
break;
case 3:
runningFlag = false;
System.out.println("成功退出黑馬銀行ATM系統,歡迎您下次使用~~~\n");
break;
default:
System.out.println("\n您當前輸入的命令不合法,請重新輸入~~~\n");
break;
}
}
}
註冊
private static boolean registerAccount(ArrayList<Account> accountList, Scanner scanner) {
System.out.println("==========歡迎您進入黑馬銀行用戶辦卡界面==========\n");
System.out.print("請輸入您的姓名: ");
scanner.nextLine();
String userName = scanner.nextLine();
System.out.println();
String passWord = "", rePassWord = "";
while (true) {
System.out.print("請輸入您的密碼: ");
passWord = scanner.nextLine(); // 讀取用戶輸入的密碼
System.out.println();
System.out.print("請再次輸入您的密碼: "); // 再次確認密碼
rePassWord = scanner.nextLine(); // 讀取用戶再次輸入的密碼
System.out.println();
//檢驗用戶兩次輸入的密碼是否相同
if (passWord.equals(rePassWord)) {
break;
} else {
System.out.println("您2次輸入的密碼不一致,請核對後重新輸入~~~\n");
}
}
//銀行系統生成銀行卡號,開戶的卡號是系統自動生成的8位數
String cardID = createCardID(accountList);
//現階段還未學到日期類,沒法統計每天取多少錢,本次只作當次取現額度,等日後學習至日期類,再作變更
System.out.print("請設置當次取現額度: ");//一次最多取多少錢
double quotaMoney = scanner.nextDouble();
System.out.println();
Account account = new Account(cardID, userName, passWord, 0.0, quotaMoney);//滿參構造,初始化數據
accountList.add(account);
System.out.println("尊敬的" + account.getUsername() + "貴賓先生/女士,您的賬戶已經開卡成功,您的卡號是: " + account.getCardID() + ".\n");
return true;
}
完整代碼詳見:https://gitee.com/AIITCherry/to-do-list