前言
- 该文章为Java基础自学笔记
- 其他内容:Java基础学习笔记目录
- 学习用书:
《Java核心技术 卷Ⅰ 基础知识(第10版)》 《Java经典编程300例》
第十三章 【综合项目】ATM系统模拟
13.1 ATM系统技术点分析
13.1.1 面向对象编程
- 每个用户账户都是一个对象:需要设计账户类Account用于创建账户对象封装账户信息
13.1.2 程序流程控制
- 需要结合分支、循环、跳转关键字等相关操作控制程序的业务逻辑
13.1.3 集合容器
- 系统需要提供一个容器用于存储这些账户对象的信息(ArrayList集合)
13.1.4 使用常见API
- 登录信息的内容比较,业务数据的分析、处理都需要用到String等常用API来解决
13.2 系统准备
- 分析:
- 实现步骤:
- 定义账户类,用于后期创建账户对象封装用户的账户信息
- 账户类中的信息至少需要包含(卡号、姓名、密码、余额、取现额度)
系统准备代码
public class Account {
private String userId;
private String userName;
private String password;
private double balance;
private double quota;
public Account() {
}
public Account(String userId, String userName, String password, double quota) {
this.userId = userId;
this.userName = userName;
this.password = password;
this.quota = quota;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
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 getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public double getQuota() {
return quota;
}
public void setQuota(double quota) {
this.quota = quota;
}
}
13.3 首页设计
- 分析:
- 需要准备一个容器,用于存储系统全部账户对象信息
- 首页只需要包含:登录和注册两个功能
- 实现步骤:
- 需要准备一个ArrayList集合,用于存储系统用户的账户对象
- 需要展示欢迎页包含两个功能:用户注册、登录账户
首页设计代码
public static void main(String[] args) {
ArrayList<Account> accounts = new ArrayList<>();
Scanner sc = new Scanner(System.in);
showMain(accounts, sc);
}
private static void showMain(ArrayList<Account> accounts, Scanner sc) {
while (true) {
System.out.println("================欢迎进入ATM系统首页================");
System.out.println("1.登录账户");
System.out.println("2.注册账户");
System.out.println("0.退出系统");
System.out.print("请输入您的操作:");
String command = sc.next();
switch (command) {
case "1":
login(accounts, sc);
break;
case "2":
register(accounts, sc);
break;
case "0":
System.exit(1);
default:
System.out.println("您输入的操作指令有误!请重新输入");
}
}
}
首页设计测试
================欢迎进入ATM系统首页================
1.登录账户
2.注册账户
0.退出系统
请输入您的操作:
13.4 用户开户功能实现
- 分析:
- 开户功能是往系统的集合容器中存入一个新的账户对象的信息
- 实现步骤:
- 定义方法完成开户
- 键盘录入姓名、密码、确认密码(保证两次密码一致)
- 生成账户卡号,卡号由系统自动生成的以01开头的8位数字(保证卡号唯一)
- 创建Account账户类对象用于封装账户信息(姓名、密码、卡号、限额)
- 把Account账户类对象存入到集合accounts中
用户开户功能代码
private static void register(ArrayList<Account> accounts, Scanner sc) {
System.out.println("==============欢迎进入ATM账户注册界面==============");
System.out.print("请输入账户名称:");
String userName = sc.next();
String password;
while (true) {
System.out.print("请输入账户密码:");
password = sc.next();
if (password.length() < 6) {
System.out.println("密码不得少于6位!");
continue;
}
System.out.print("请输入确认密码:");
String confirmPassword = sc.next();
if (password.equals(confirmPassword)) {
break;
} else {
System.out.println("两次输入的密码不一致!");
}
}
System.out.print("请设置单次取现额度:");
double quota = sc.nextDouble();
String userId = creatUserId(accounts);
accounts.add(new Account(userId, userName, password, quota));
System.out.println("恭喜您," + userName + "先生/女士,开户已完成,您的卡号是:" + userId);
}
private static String creatUserId(ArrayList<Account> accounts) {
Random r = new Random();
while (true) {
String userId = "10";
for (int i = 0; i < 6; i++) {
userId += r.nextInt(10);
}
if (getAccountByUserId(userId, accounts) == null) {
return userId;
}
}
}
private static Account getAccountByUserId(String userId, ArrayList<Account> accounts) {
for (Account account : accounts) {
if (account.getUserId().equals(userId)) {
return account;
}
}
return null;
}
用户开户功能测试
==============欢迎进入ATM账户注册界面==============
请输入账户名称:马云
请输入账户密码:123456
请输入确认密码:123456
请设置单次取现额度:5000
恭喜您,马云先生/女士,开户已完成,您的卡号是:10473645
请输入账户密码:12345
密码不得少于6位!
请输入账户密码:123456
请输入确认密码:123455
两次输入的密码不一致!
13.5 用户登录功能实现
- 实现步骤:
- 定义方法完成登录
- 让用户键盘录入卡号,根据卡号查询账户对象
- 如果没有找到账户对象,说明卡号不存在,提示继续输入卡号
- 如果找到账户对象,说明卡号存在,继续输入密码
- 如果密码不正确,提示继续输入密码
- 如果密码正确,提示登录成功并进入用户操作页面
用户登录功能代码
private static void login(ArrayList<Account> accounts, Scanner sc) {
if (accounts.size() == 0) {
System.out.println("当前系统无任何账户,请先注册再登录!");
register(accounts, sc);
}
System.out.println("==============欢迎进入ATM账户登录界面==============");
while (true) {
System.out.print("请输入用户卡号:");
String userId = sc.next();
Account account = getAccountByUserId(userId, accounts);
if (account == null) {
System.out.println("卡号" + userId + "不存在,请确认卡号!");
continue;
}
while (true) {
System.out.print("请输入用户密码:");
String password = sc.next();
if (!password.equals(account.getPassword())) {
System.out.println("密码输入有误,请确认密码!");
continue;
}
System.out.println("登陆成功!欢迎" + account.getUserName() + "先生/女士进入系统!");
showUserCommand(account, accounts, sc);
return;
}
}
}
用户登录功能测试
==============欢迎进入ATM账户登录界面==============
请输入用户卡号:10473645
请输入用户密码:123456
登陆成功!欢迎马云先生/女士进入系统!
当前系统无任何账户,请先注册再登录!
==============欢迎进入ATM账户注册界面==============
请输入账户名称:
请输入用户卡号:123456
卡号123456不存在,请确认卡号!
请输入用户卡号:10473645
请输入用户密码:123455
密码输入有误,请确认密码!
13.6 用户操作页设计
用户操作页代码
private static void showUserCommand(Account account, ArrayList<Account> accounts, Scanner sc) {
while (true) {
System.out.println("==============欢迎进入ATM用户操作界面==============");
System.out.println("1.查询账户信息");
System.out.println("2.存款");
System.out.println("3.取款");
System.out.println("4.转账");
System.out.println("5.修改密码");
System.out.println("6.销户");
System.out.println("0.退出登录");
System.out.print("请输入您的操作:");
String command = sc.next();
switch (command) {
case "1":
showAccount(account);
break;
case "2":
deposit(account, sc);
break;
case "3":
withdrawal(account, sc);
break;
case "4":
transfer(account, accounts, sc);
break;
case "5":
changePassword(account, sc);
break;
case "6":
delAccount(account, accounts);
return;
case "0":
System.out.println("您已退出登录!");
return;
default:
System.out.println("您输入的操作指令有误!请重新输入");
}
}
}
用户操作页测试
==============欢迎进入ATM用户操作界面==============
1.查询账户信息
2.存款
3.取款
4.转账
5.修改密码
6.销户
0.退出登录
请输入您的操作:
13.7 查询账户
查询账户代码
private static void showAccount(Account account) {
System.out.println("==============欢迎进入ATM用户详情界面==============");
System.out.println("您的账户信息如下:");
System.out.println("卡号:" + account.getUserId());
System.out.println("姓名:" + account.getUserName());
System.out.println("余额:" + account.getBalance());
System.out.println("单次限额:" + account.getQuota());
}
查询账户测试
==============欢迎进入ATM用户详情界面==============
您的账户信息如下:
卡号:10473645
姓名:马云
余额:0.0
单次限额:5000.0
13.8 存款功能
- 存款功能分析:
- 获取当前账户对象
- 用户输入存款金额
- 调用账户对象的setMoney方法将账户余额修改成存款后的余额
- 存款后需要查询一下账户信息,确认存款已成功
存款功能代码
private static void deposit(Account account, Scanner sc) {
System.out.println("==============欢迎进入ATM用户存款界面==============");
System.out.print("请输入存款金额:");
double money = sc.nextDouble();
account.setBalance(account.getBalance() + money);
System.out.println("存款成功!");
showAccount(account);
}
存款功能测试
==============欢迎进入ATM用户存款界面==============
请输入存款金额:6000
存款成功!
==============欢迎进入ATM用户详情界面==============
您的账户信息如下:
卡号:10473645
姓名:马云
余额:6000.0
单次限额:5000.0
13.9 取款功能
- 取款功能分析:
- 取款需要先判断账户是否有钱
- 有钱则获取账户对象
- 用户输入取款金额
- 判断取款金额是否超过了单次限额,以及余额是否充足
- 满足要求则调用账户对象的setMoney方法完成金额的修改
取款功能代码
private static void withdrawal(Account account, Scanner sc) {
System.out.println("==============欢迎进入ATM用户取款界面==============");
if (account.getBalance() < 100) {
System.out.println("余额不足100元,无法取款!");
return;
}
while (true) {
System.out.print("请输入取款的金额:");
double money = sc.nextDouble();
if (money > account.getBalance()) {
System.out.println("您的余额不足!");
continue;
}
if (money > account.getQuota()) {
System.out.println("您当前取款超过了单次限额!单次限额:" + account.getQuota());
continue;
}
account.setBalance(account.getBalance() - money);
System.out.println("取款成功!余额:" + account.getBalance());
return;
}
}
取款功能测试
==============欢迎进入ATM用户取款界面==============
请输入取款的金额:5000
取款成功!余额:1000.0
请输入取款的金额:6000
您当前取款超过了单次限额!单次限额:5000.0
请输入取款的金额:5000
您的余额不足!
=============欢迎进入ATM用户取款界面==============
余额不足100元,无法取款!
13.10 转账功能
- 转账功能分析:
- 判断系统中是否有大于2个账户对象
- 判断当前账户是否有钱
- 输入对方卡号,判断对方账户是否存在
- 对方账户存在还需要认证对方户主的姓氏
- 满足要求则修改当前账户对象和对方账户对象的金额
转账功能代码
private static void transfer(Account account, ArrayList<Account> accounts, Scanner sc) {
System.out.println("==============欢迎进入ATM用户转账界面==============");
if (accounts.size() < 2) {
System.out.println("当前系统中账户不足2个,无法转账");
return;
}
if (account.getBalance() == 0) {
System.out.println("余额不足,无法转账");
return;
}
while (true) {
System.out.print("请输入转账的账户卡号:");
String transId = sc.next();
Account transAccount = getAccountByUserId(transId, accounts);
if (transAccount == null) {
System.out.println("账户不存在,请重新确认!");
continue;
}
if (transAccount == account) {
System.out.println("无法为自己转账!");
continue;
}
String transName = "*" + transAccount.getUserName().substring(1);
while (true) {
System.out.println("您当前要为【" + transName + "】转账!");
System.out.print("请输入姓氏确认:");
String firstName = sc.next();
if (!firstName.equals(transAccount.getUserName().substring(0, 1))) {
System.out.println("您输入的姓氏有误!");
continue;
}
while (true) {
System.out.print("请输入转账金额:");
double money = sc.nextDouble();
if (money > account.getBalance()) {
System.out.println("您的余额不足,无法转账!余额为:" + account.getBalance());
continue;
}
account.setBalance(account.getBalance() - money);
transAccount.setBalance(transAccount.getBalance() + money);
System.out.println("转账完成!当前余额为:" + account.getBalance());
return;
}
}
}
}
转账功能测试
==============欢迎进入ATM用户详情界面==============
您的账户信息如下:
卡号:10753979
姓名:马化腾
余额:0.0
单次限额:3000.0
==============欢迎进入ATM用户转账界面==============
请输入转账的账户卡号:123456
账户不存在,请重新确认!
请输入转账的账户卡号:10753979
您当前要为【*化腾】转账!
请输入姓氏确认:马
请输入转账金额:3000
转账完成!当前余额为:2000.0
==============欢迎进入ATM用户详情界面==============
您的账户信息如下:
卡号:10753979
姓名:马化腾
余额:3000.0
单次限额:3000.0
==============欢迎进入ATM用户转账界面==============
当前系统中账户不足2个,无法转账
==============欢迎进入ATM用户转账界面==============
余额不足,无法转账
请输入转账的账户卡号:10473645
无法为自己转账!
==============欢迎进入ATM用户转账界面==============
请输入转账的账户卡号:123456
账户不存在,请重新确认!
您当前要为【*化腾】转账!
请输入姓氏确认:牛
您输入的姓氏有误!
请输入转账金额:3000
您的余额不足,无法转账!余额为:2000.0
13.11 修改密码功能
修改密码功能代码
private static void changePassword(Account account, Scanner sc) {
System.out.println("=============欢迎进入ATM用户修改密码界面=============");
while (true) {
System.out.print("请输入原密码:");
String oldPassword = sc.next();
if (!oldPassword.equals(account.getPassword())) {
System.out.println("原密码输入错误!请重新输入");
continue;
}
while (true) {
System.out.print("请输入新密码:");
String newPassword = sc.next();
if (newPassword.length() < 6) {
System.out.println("密码不得少于6位!");
continue;
}
System.out.print("请确认新密码:");
String newConfirmPassword = sc.next();
if (!newPassword.equals(newConfirmPassword)) {
System.out.println("两次输入的密码不一致!");
continue;
}
account.setPassword(newPassword);
System.out.println("密码已修改!");
return;
}
}
}
修改密码功能测试
=============欢迎进入ATM用户修改密码界面=============
请输入原密码:123456
请输入新密码:111111
请确认新密码:111111
密码已修改!
请输入原密码:12345
原密码输入错误!请重新输入
请输入新密码:11111
密码不得少于6位!
请输入新密码:111111
请确认新密码:222222
两次输入的密码不一致!
13.12 销户功能
销户功能代码
private static void delAccount(Account account, ArrayList<Account> accounts) {
accounts.remove(account);
System.out.println("卡号" + account.getUserId() + "已销户");
}
销户功能测试
请输入您的操作:6
卡号10473645已销户
================欢迎进入ATM系统首页================
1.登录账户
2.注册账户
0.退出系统
请输入您的操作:1
==============欢迎进入ATM账户登录界面==============
请输入用户卡号:10473645
卡号10473645不存在,请确认卡号!
|