从0到1,实现Java控制台版本的ATM管理系统
从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;
}