目录
一、系统的搭建
1.ATM系统的架构时怎么样的?
- 定义了一个账户类Account,定义系统关系的账户信息
- 定义了一个ATM类,代表ATM系统,负责处理账户相关的业务需求
- 定义了一个Test类,负责测试系统:创建ATM对象代表ATM系统并启动
2.ATM类中使用什么来存储系统用户的账户信息?
ArrayList<Account> accounts=new ArrayList<>();
二、开户功能
- 定义一个开户方法:creatAccount
- 在方法里创建一个Account账户对象,负责封装用户的账户信息(姓名、性别、密码、卡号)
- 卡号需要由系统自动生成(卡号要求是8的数字生成,且不能重复)
- 张行乎对象存入到账户集合中去
生成一个新卡号
- 定义一个方法:createCardId(),用来返回一个不重复的新卡号
- 方法里,使用循环生成了8个随机的数字连起来作为卡号
- 接着判断该卡号是否与其他账户的卡号重复
- 根据该卡号去账户集合中查询账户对象,如果没有查询到账户对象,该卡号不重复,即可返回
- 如果查询到了账户对象,则使用循环重复以上操作
三、用户登录
- 设计一个登录方法:login,负责完成用户登录
- 方法里:如果系统无任何账户对象,直接结束登录操作
- 有账户对象,则让用户输入卡号,根据卡号去账户集合中查询账户对象
- 如果没有找到账户对象,说明登录卡号不存在,提示继续输入卡号
- 如果找到了账户对象,说明卡号存在,继续输入密码
- 如果密码不正确,提示继续输入密码
- 如果密码也正确,则登录成功,并给出相应的提示
四、操作页设计、查询账户、退出账户
五、存款和取款
存款和取款是如何实现账户余额更新的?
调用当前账户对象的setMoney方法的金额的修改
六、转账
七、销户
八、密码修改
最终代码
1.创建一个Account类
public class Account {
private String cardId;
private String userName;
private char sex;
private String passWord;
private double money;
private double limit;
public Account() {
}
public Account(String cardId, String userName, char sex, String passWord, double money, double limit) {
this.cardId = cardId;
this.userName = userName;
this.sex = sex;
this.passWord = passWord;
this.money = money;
this.limit = limit;
}
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public String getUserName() {
return userName+(sex=='男'?"先生":"女士");
}
public void setUserName(String userName) {
this.userName = userName;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
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 getLimit() {
return limit;
}
public void setLimit(double limit) {
this.limit = limit;
}
}
2.创建一个ATM类
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class ATM {
private ArrayList<Account> accounts = new ArrayList<>();
private Scanner sc = new Scanner(System.in);
private Account loginAcc;//记住登录后的用户信息
/*
* 启动ATM系统,展示欢迎界面
* */
public void start() {
while (true) {
System.out.println("=====欢迎进入ATM系统=====");
System.out.println("1、用户登录");
System.out.println("2、用户开户");
System.out.println("请选择:");
int command = sc.nextInt();
switch (command) {
case 1:
//用户登录
login();
break;
case 2:
//用户开户
creatAccount();
break;
default:
System.out.println("没有该用户");
}
}
}
// 完成用户的登录操作
private void login() {
System.out.println("===系统登录====");
//1、判断系统中是否存在账户对象,存在才能登录,如果不存在,直接结束登录
if (accounts.size() == 0) {
System.out.println("当前系统中无任何账户,请先开户在登录!");
return; //跳出登录操作
}
//2、系统中存在账户对象,可以开始进行登录操作了
while (true) {
System.out.println("请您输入您的登录卡号:");
String cardId = sc.next();
//3、判断这个卡号是否存在
Account account = getAccountByCardId(cardId);
if (account == null) {
//说明卡号不存在
System.out.println("您输入的卡号不存在,请确认!");
} else {
while (true) {
//卡号存在,用户输入密码
System.out.println("请您输入登录密码:");
String passWord = sc.next();
//4、判断密码是否正确
if (account.getPassWord().equals(passWord)) {
//密码正确,登录成功
loginAcc = account;
System.out.println("恭喜您,您登录成功!" + account.getUserName() + "成功登陆了系统,您的卡号是:" + cardId);
//展示登录后的操作界面
showUserCommand();
return;//跳出并结束当前登录的方法
} else {
System.out.println("您输入的密码不正确,请重新输入!");
}
}
}
}
}
//展示用户登录后的操作界面
private void showUserCommand() {
while (true) {
System.out.println(loginAcc.getUserName() + "您可以选择如下功能进行账户处理:");
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("7.注销当前账户");
System.out.print("请选择:");
int command = sc.nextInt();
switch (command) {
case 1:
//查询当前账户
showLoginAccount();
break;
case 2:
//存款
deposiMoney();
break;
case 3:
//取款
drawMoeny();
break;
case 4:
//转账
transformMoney();
break;
case 5:
//密码修改
updatePassWord();
return;
case 6:
//退出
System.out.println(loginAcc.getUserName() + "您退出系统成功!");
return;//跳出并结束当前方法
case 7:
//注销当前账户
if (deleteAccount()) {
//销户成功,回到欢迎页面
return;
}
break;
default:
System.out.println("您当前选择的操作是不存在的,请确认!");
}
}
}
private void updatePassWord() {
while (true) {
System.out.println("==账户密码修改==");
//1、提醒用户认证当前密码
System.out.println("请您输入当前账户的密码:");
String passWord = sc.next();
//2、认证当前密码是否正确
if (loginAcc.getPassWord().equals(passWord)) {
//认证通过
while (true) {
//3、修改密码
System.out.println("请您输入新密码:");
String newPassWord = sc.next();
System.out.println("请您再次输入密码:");
String okPassWord = sc.next();
//4、判断两次密码是否一致
if (okPassWord.equals(newPassWord)) {
//可以修改
loginAcc.setPassWord(okPassWord);
System.out.println("恭喜您,您的密码修改成功!");
return;
} else {
System.out.println("您输入的2此密码不一致!");
}
}
} else {
System.out.println("您当前输入的密码不正确!");
}
}
}
//销户
private boolean deleteAccount() {
System.out.println("===销户操作===");
//1、询问用户是否需要销户
System.out.println("您是否需要销户?确认y/取消n");
String command = sc.next();
switch (command) {
case "y":
//确认销户
//判断当前账户是否有余额
if (loginAcc.getMoney() == 0) {
//销户
accounts.remove(loginAcc);
System.out.println("您好,您的账户已经成功销户了!");
return true;
}
default:
System.out.println("好的您的账户保留!!");
return false;
}
}
//转账
private void transformMoney() {
System.out.println("===用户转账===");
//1、判断系统中是否存在其他账户
if (accounts.size() < 2) {
System.out.println("当前系统中只有一个账户,无法为其他账户转账!");
return;
}
//2、判断当前账户中是否有余额
if (loginAcc.getMoney() == 0) {
//
System.out.println("没有余额,无法转账!");
return;
}
while (true) {
//3、真正开始转账了
System.out.println("请输入对方的卡号:");
String cardId = sc.next();
//4、判断这个卡号是否正确
Account account = getAccountByCardId(cardId);
if (account == null) {
System.out.println("您输入对方的卡号不存在");
} else {
//对方的账户存在,继续让用户认证姓氏
String name = "*" + account.getUserName().substring(1);
System.out.println("请输入【" + name + "】的姓氏:");
String preName = sc.next();
//5、判断这个姓氏是否正确
if (account.getUserName().startsWith(preName)) {
while (true) {
//认证通过,转账
System.out.println("请您输入转账给对方的金额:");
double money = sc.nextDouble();
//6、判断这个金额是否没有超过自己的余额
if (loginAcc.getMoney() >= money) {
//转给对方
//更新自己的账户余额
loginAcc.setMoney(loginAcc.getMoney() - money);
//更新对方的账户余额
account.setMoney(account.getMoney() + money);
System.out.println("您转账成功了!");
return;//跳出转账方法
} else {
System.out.println("您余额不足,不能转账,最多可以转" + loginAcc.getMoney());
}
}
} else {
System.out.println("您认证的姓氏有问题!");
}
}
}
}
//取款
private void drawMoeny() {
//1、判断账户余额是否达到100元,如果没有达到100元,就不让用户取钱了
if (loginAcc.getMoney() < 100) {
System.out.println("您的账户余额不足100元,无法取钱!");
return;
}
//2、用户输入取款金额
while (true) {
System.out.println("请输入您的取款金额:");
double money = sc.nextDouble();
//3、判断账户余额是否足够
if (loginAcc.getMoney() >= money) {
//账户的余额是足够的
//4、判断当前余额是否超过了每次限额
if (money > loginAcc.getLimit()) {
System.out.println("您当前取款超过了当前的限额,您每次最多可取:" + loginAcc.getLimit());
} else {
//可以开始取钱了,更新当前账户余额
loginAcc.setMoney(loginAcc.getMoney() - money);
System.out.println("您取款:" + money + "成功," + "取款后的余额为:" + loginAcc.getMoney());
break;
}
} else {
//账户余额不足
System.out.println("您的账户余额不足,您的账户余额为:" + loginAcc.getMoney());
}
}
}
//存款
private void deposiMoney() {
System.out.println("===存款操作===");
System.out.println("请输入您的存款金额:");
double money = sc.nextDouble();
//更新当前登录账户的余额
loginAcc.setMoney(loginAcc.getMoney() + money);
System.out.println("恭喜您,您的存钱为:" + money + "成功,存钱后的余额为:" + loginAcc.getMoney());
}
//展示当前用户登录的信息
private void showLoginAccount() {
System.out.println("当前您的账户信息如下:");
System.out.println("卡号:" + loginAcc.getCardId());
System.out.println("姓名:" + loginAcc.getUserName());
System.out.println("性别:" + loginAcc.getSex());
System.out.println("余额:" + loginAcc.getMoney());
System.out.println("限额:" + loginAcc.getLimit());
}
//完成用户开户操作
private void creatAccount() {
System.out.println("======系统开户操作=====");
//1、创建一个账户对象,用于封装用户的开户信息
Account account = new Account();
//2、需要用户输入自己的开户信息,赋值给账户对象
System.out.println("请输入您的账户名称:");
String name = sc.next();
account.setUserName(name);
while (true) {
System.out.println("请您输入您的性别:");
char sex = sc.next().charAt(0);
if (sex == '男' || sex == '女') {
account.setSex(sex);
break;
} else {
System.out.println("您输入的性别有误! 只能是男或者女");
}
}
while (true) {
System.out.println("请您输入您的账户密码:");
String passWord = sc.next();
System.out.println("请您输入您的确认密码:");
String okPassWord = sc.next();
//判断2此密码是否一样
if (okPassWord.equals(passWord)) {
account.setPassWord(okPassWord);
break;
} else {
System.out.println("您输入的两次密码不一致,请您重新输入!");
}
}
System.out.println("请您输入您的取现额度:");
double limit = sc.nextDouble();
account.setLimit(limit);
//需要为这个账户生成一个卡号(由系统自动生成,8位数字表示,不能与其他账户的卡号重复)
String newCardId = createCardId();
account.setCardId(newCardId);
//3、把这个账户对象,存入到账户集合中去
accounts.add(account);
System.out.println("恭喜您" + account.getUserName() + "开户成功,您的卡号是:" + account.getCardId());
}
/*
* 返回一个8为数字的卡号,而且这个卡号不能与其他账户卡号重复
* */
private String createCardId() {
while (true) {
//1、定义个String类型的变量,记住8位数字作为一个卡号
String cardId = "";
//2、使用循环,循环8次,每次产生一个随机数给cardId连接起来
Random r = new Random();
for (int i = 0; i < 8; i++) {
int data = r.nextInt(10);
cardId += data;
}
//3、判断cardId中记住的卡号,是否与其他账户中的卡号重复了,若没有重复,才可以作为一个新卡号返回。
Account account = getAccountByCardId(cardId);
if (account == null) {
//说明cardId没有找到账户对象,因此cardId没有和其他的账户卡号重复,可以返回一个新的卡号
return cardId;
}
}
}
// 根据卡号查询账户对象返回
private Account getAccountByCardId(String cardId) {
//遍历全部的账户对象
for (int i = 0; i < accounts.size(); i++) {
Account account = accounts.get(i);
//判断这个账户对象account的卡号是否我们要找的卡号
if (account.getCardId().equals(cardId)) {
return account;
}
}
return null;//查无账户,这个卡号不存在
}
}
3.创建一个测试类
public class Test {
public static void main(String[] args) {
//1、创建一个ATM对象,代表ATM系统
ATM atm=new ATM();
//2、调用ATM对象的start方法,启动系统
atm.start();
}
}