ATM存取钱项目
ATM存取钱项目
项目涉及的知识点
1 系统架构搭建
ATM类中使用什么来存储账户的全部信息?
1.1 Account类
public class Account {private String cardId;private String userName;private char sex;private String passWord;private double money;private double limit;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 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;}
}
1.2 ATM类
一些方法也在该类
private ArrayList<Account> accounts=new ArrayList<>();//存储系统账户信息private Scanner sc=new Scanner(System.in);private Account loginAccount;//记录登录后的账户登录public class ATM {private ArrayList<Account> accounts=new ArrayList<>();//存储系统账户信息private Scanner sc=new Scanner(System.in);}
1.3 Test类
public class Test {public static void main(String[] args) {//1.创建一个ATM对象,代表ATM系统ATM atm = new ATM();//2.调用ATM对象的start方法,启动系统atm.satrt();}
}
2 启动ATM系统,欢迎界面
public void satrt(){while (true) {System.out.println("===欢迎进入ATM系统===");System.out.println("1,用户登录");System.out.println("2,用户开户");System.out.println("请选择");int choice=sc.nextInt();switch (choice){case 1://用户登录login();break;case 2://用户开户createAccount();break;default:System.out.println("没有该操作");}}}
3 开户功能的实现
3.1 开户功能的需求
3.2 开户功能实现需要哪几步操作
3.2.1 创建一个账户对象,用于封装用户信息
System.out.println("==系统开户操作==");
//1.创建一个账户对象,用于封装用户信息
Account account=new Account();
3.2.2 需要用户输入自己的开户信息,赋值给账户对象
System.out.println("请输入您的账户名称:");
String name=sc.next();
account.setUserName(name);
3.2.3 输入账户性别
while (true) {System.out.println("请输入您的性别");char sex=sc.next().charAt(0);//if (sex=='男'||sex=='女'){account.setSex(sex);break;}else {System.out.println("您输入的性别有问题--只能是男或女");}
}
3.2.4 输入账户密码
while (true) {System.out.println("请您输入你的账户密码:");String password=sc.next();System.out.println("请输入您的确认密码:");String password2=sc.next();//判断;两次密码是否一样if(password.equals(password2)){account.setPassWord(password2);break;}else {System.out.println("输入的两次密码不一致,请您确认==");}
}
3.2.5 设置取现额度
System.out.println("请输入您的取现额度");
double limit=sc.nextDouble();
account.setLimit(limit);
3.2.6 生成卡号
3.2.6.1 根据卡号查询账户返回
private Account getAccountByCardId(String cardId){//遍历全部的账户对象for (Account account:accounts) {Account account1=account;if(account1.getCardId().equals(cardId)){return account1;}}return null;//查无此账户,这个卡号不存在
}
3.2.6.2 返回一个8位数字的卡号,并且这个卡号不能与其他账户卡号重复
private String createCardId(){while (true) {//1.定义一个String类型的变量记住8位数字作为一个卡号String cardId="";//2.使用循环,循环8次,每次产生一个随机数给cardId链接起来Random random=new Random();for (int i = 0; i < 8; i++) {int number= random.nextInt(10);cardId+=number;}//3.判断cardId记录的卡号是否与其他账户卡号是否重复Account account=getAccountByCardId(cardId);if(account==null){//说明cardId未找到,这个id没有被其他账户占有,// 因此,可以返回它作为一个新卡号return cardId;}}
}
3.2.7 把这个账户对象,存入账户集合中
accounts.add(account);
System.out.println("恭喜您"+account.getUserName()+"开户成功,您的卡号是:" );
3.3 用户登录功能
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();//判断密码是否正确if (account.getPassWord().equals(password)){loginAccount=account;//密码正确,登录成功System.out.println("恭喜您,"+account.getUserName()+"登录成功,您的卡号是:"+account.getCardId());//展示登录后的操作界面showUserCommand();return;//退出并结束当前方法}else {System.out.println("您输入的密码不正确,请确认~~");}}}}}
3.4 用户操作页设计
3.4.1 展现当前账户信息
private void showLoginAccount(){System.out.println("==当前账户信息如下:==");System.out.println("卡号:"+loginAccount .getCardId());System.out.println("户主"+loginAccount.getUserName());System.out.println("性别"+loginAccount.getSex());System.out.println("余额"+loginAccount.getMoney());System.out.println("单次限额"+loginAccount.getLimit());
}
3.5 存取款的实现
3.5.1用户存款
private void depositMoney() {System.out.println("==存钱操作==");System.out.println("请您输入存款金额:");double money=sc.nextDouble();//更新当前账户的余额loginAccount.setMoney(loginAccount.getMoney()+money);System.out.println("恭喜您,您存钱:"+money+"成功,存钱后余额是:"+loginAccount .getMoney());}
3.5.2 用户取款
private void drawMoney() {System.out.println("==取钱操作==");//1.先判断账户余额是否达到100元,若是不够100,则不允许该账户取钱if (loginAccount.getMoney()<100){System.out.println("您的余额不足100元,不允许取钱~~");return;}//2.让用户输入取款金额while (true) {System.out.println("请输入存款金额:");double money=sc.nextDouble();//3.判断用户余额是否足够if (loginAccount.getMoney()>=money){//账户余额足够//4.取款金额不允许超过限额if (money>loginAccount.getLimit()){System.out.println("您当前取款金额超过了每次限额,您每次最多可取:"+loginAccount.getLimit()+"~~");}else {//可以开始取钱,更新当前账户余额即可loginAccount.setMoney(loginAccount.getMoney()-money);System.out.println("您取款"+money+"成功,取款后余额:"+loginAccount.getMoney());break;}}else {System.out.println("余额不足,您账户的余额是:"+loginAccount.getMoney()+"~~");}}
}
3.6 转账
private void transferMoney() {System.out.println("用户转账");//1.判断系统中是否存在其他账户if(accounts.size()<2){System.out.println("当前系统中只有你一个账户,无法为其他账户转账~~");return;}//2.判断自己账户中是否有钱if (loginAccount.getMoney()==0){System.out.println("您自己都没钱,就别转帐了~~");return;}while (true) {//3.真正开始转账System.out.println("请您输入对方的卡号:");String idCard=sc.next();//4.判断卡号是否正确Account account=getAccountByCardId(idCard);if (account==null){System.out.println("卡号输入错误~~");}else {//对方账户存在,继续让用户认证姓氏String name = "*"+account.getUserName().substring(1);//substring(1) - 截取用户名字符串从第2个字符开始到末尾的子串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(loginAccount .getMoney()>=money){//转给对方//更新自己的账户余额以及对方的账户余额loginAccount.setMoney(loginAccount.getMoney()-money);//更新对方账户余额account.setMoney(account.getMoney()+money);System.out.println("恭喜您转账成功,您当前账户余额为:"+loginAccount.getMoney());return;//直接跳出转账方法}else {System.out.println("您余额不足,无法给对方转账这么多余额,最多可转:"+loginAccount .getMoney()+"~~");}}}else {System.out.println("对不起,您认证的姓氏有问题~~");}}}
}
3.7 销户功能
private boolean deleteAccount() {System.out.println("==销户操作==");//1.问用户是否确定要销户?System.out.println("请问确认要销户吗?y/n");String choice=sc.next();switch (choice){case "y"://进行销户//2.判断用户账户是否还有余额if (loginAccount.getMoney()==0){//真的销户了accounts.remove(loginAccount);System.out.println("您好,您的账户销户成功~~");return true;}else {System.out.println("对不起,您的账户还有余额不允许销户~~");return false;}default :System.out.println("好的,您的账户保留!");return false;}}
3.8 密码修改
private void updatePassWord() {System.out.println("==账户密码修改操作==");while (true) {//1.提醒用户认证当前密码System.out.println("请您输入当前账户的密码:");String password=sc.next();//2.认证密码是否正确if(loginAccount.getPassWord().equals(password)){//认证通过while (true) {//3.真正开始修改密码System.out.println("请输入新密码:");String newPassWord1=sc.next();System.out.println("请再次输入密码:");String newPassWord2=sc.next();//4.判断两次密码是否一致if (newPassWord1.equals(newPassWord2)){//可以开始修改密码了loginAccount.setPassWord(newPassWord1);System.out.println("恭喜您,您的密码修改成功~~");return;}else {System.out.println("您输入的两次密码不一致~~");}}}else {System.out.println("您当前输入的密码不正确~~");}}}private void updatePassWord() {System.out.println("==账户密码修改操作==");while (true) {//1.提醒用户认证当前密码System.out.println("请您输入当前账户的密码:");String password=sc.next();//2.认证密码是否正确if(loginAccount.getPassWord().equals(password)){//认证通过while (true) {//3.真正开始修改密码System.out.println("请输入新密码:");String newPassWord1=sc.next();System.out.println("请再次输入密码:");String newPassWord2=sc.next();//4.判断两次密码是否一致if (newPassWord1.equals(newPassWord2)){//可以开始修改密码了loginAccount.setPassWord(newPassWord1);System.out.println("恭喜您,您的密码修改成功~~");return;}else {System.out.println("您输入的两次密码不一致~~");}}}else {System.out.println("您当前输入的密码不正确~~");}}
}
源代码
一.Account类
package com.xie;public class Account {private String cardId;private String userName;private char sex;private String passWord;private double money;private double 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;}
}
二.ATM类
package com.xie;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 loginAccount;//记录登录后的账户登录//启动ATM系统,欢迎界面public void satrt(){while (true) {System.out.println("===欢迎进入ATM系统===");System.out.println("1,用户登录");System.out.println("2,用户开户");System.out.println("请选择");int choice=sc.nextInt();switch (choice){case 1://用户登录login();break;case 2://用户开户createAccount();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();//判断密码是否正确if (account.getPassWord().equals(password)){loginAccount=account;//密码正确,登录成功System.out.println("恭喜您,"+account.getUserName()+"登录成功,您的卡号是:"+account.getCardId());//展示登录后的操作界面showUserCommand();return;//退出并结束当前方法}else {System.out.println("您输入的密码不正确,请确认~~");}}}}}//完成用户开户操作private void createAccount(){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 password2=sc.next();//判断;两次密码是否一样if(password.equals(password2)){account.setPassWord(password2);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 random=new Random();for (int i = 0; i < 8; i++) {int number= random.nextInt(10);cardId+=number;}//3.判断cardId记录的卡号是否与其他账户卡号是否重复Account account=getAccountByCardId(cardId);if(account==null){//说明cardId未找到,这个id没有被其他账户占有,// 因此,可以返回它作为一个新卡号return cardId;}}}//根据卡号查询账户返回 accountsprivate Account getAccountByCardId(String cardId){//遍历全部的账户对象for (Account account:accounts) {Account account1=account;if(account1.getCardId().equals(cardId)){return account1;}}return null;//查无此账户,这个卡号不存在}//展示登录后的操作界面private void showUserCommand(){while (true) {System.out.println(loginAccount.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.println("请选择:");int choice=sc.nextInt();switch (choice){case 1://查询当前账户showLoginAccount();break;case 2://存款操作depositMoney();break;case 3://取款drawMoney();break;case 4://转账transferMoney();return;case 5://密码修改updatePassWord();return;case 6://退出System.out.println(loginAccount.getUserName()+"您退出系统成功!");return;//退出并结束当前方法case 7://注销当前账户if (deleteAccount()) {//销户成功了,回到欢迎界面return;}break;default:System.out.println("当前选择的操作是不存在的,请确认~~");}}}//展现当前账户信息private void showLoginAccount(){System.out.println("==当前账户信息如下:==");System.out.println("卡号:"+loginAccount .getCardId());System.out.println("户主"+loginAccount.getUserName());System.out.println("性别"+loginAccount.getSex());System.out.println("余额"+loginAccount.getMoney());System.out.println("单次限额"+loginAccount.getLimit());}//存款private void depositMoney() {System.out.println("==存钱操作==");System.out.println("请您输入存款金额:");double money=sc.nextDouble();//更新当前账户的余额loginAccount.setMoney(loginAccount.getMoney()+money);System.out.println("恭喜您,您存钱:"+money+"成功,存钱后余额是:"+loginAccount .getMoney());}//取钱private void drawMoney() {System.out.println("==取钱操作==");//1.先判断账户余额是否达到100元,若是不够100,则不允许该账户取钱if (loginAccount.getMoney()<100){System.out.println("您的余额不足100元,不允许取钱~~");return;}//2.让用户输入取款金额while (true) {System.out.println("请输入存款金额:");double money=sc.nextDouble();//3.判断用户余额是否足够if (loginAccount.getMoney()>=money){//账户余额足够//4.取款金额不允许超过限额if (money>loginAccount.getLimit()){System.out.println("您当前取款金额超过了每次限额,您每次最多可取:"+loginAccount.getLimit()+"~~");}else {//可以开始取钱,更新当前账户余额即可loginAccount.setMoney(loginAccount.getMoney()-money);System.out.println("您取款"+money+"成功,取款后余额:"+loginAccount.getMoney());break;}}else {System.out.println("余额不足,您账户的余额是:"+loginAccount.getMoney()+"~~");}}}//转账private void transferMoney() {System.out.println("用户转账");//1.判断系统中是否存在其他账户if(accounts.size()<2){System.out.println("当前系统中只有你一个账户,无法为其他账户转账~~");return;}//2.判断自己账户中是否有钱if (loginAccount.getMoney()==0){System.out.println("您自己都没钱,就别转帐了~~");return;}while (true) {//3.真正开始转账System.out.println("请您输入对方的卡号:");String idCard=sc.next();//4.判断卡号是否正确Account account=getAccountByCardId(idCard);if (account==null){System.out.println("卡号输入错误~~");}else {//对方账户存在,继续让用户认证姓氏String name = "*"+account.getUserName().substring(1);//substring(1) - 截取用户名字符串从第2个字符开始到末尾的子串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(loginAccount .getMoney()>=money){//转给对方//更新自己的账户余额以及对方的账户余额loginAccount.setMoney(loginAccount.getMoney()-money);//更新对方账户余额account.setMoney(account.getMoney()+money);System.out.println("恭喜您转账成功,您当前账户余额为:"+loginAccount.getMoney());return;//直接跳出转账方法}else {System.out.println("您余额不足,无法给对方转账这么多余额,最多可转:"+loginAccount .getMoney()+"~~");}}}else {System.out.println("对不起,您认证的姓氏有问题~~");}}}}//销户private boolean deleteAccount() {System.out.println("==销户操作==");//1.问用户是否确定要销户?System.out.println("请问确认要销户吗?y/n");String choice=sc.next();switch (choice){case "y"://进行销户//2.判断用户账户是否还有余额if (loginAccount.getMoney()==0){//真的销户了accounts.remove(loginAccount);System.out.println("您好,您的账户销户成功~~");return true;}else {System.out.println("对不起,您的账户还有余额不允许销户~~");return false;}default :System.out.println("好的,您的账户保留!");return false;}}//修改密码private void updatePassWord() {System.out.println("==账户密码修改操作==");while (true) {//1.提醒用户认证当前密码System.out.println("请您输入当前账户的密码:");String password=sc.next();//2.认证密码是否正确if(loginAccount.getPassWord().equals(password)){//认证通过while (true) {//3.真正开始修改密码System.out.println("请输入新密码:");String newPassWord1=sc.next();System.out.println("请再次输入密码:");String newPassWord2=sc.next();//4.判断两次密码是否一致if (newPassWord1.equals(newPassWord2)){//可以开始修改密码了loginAccount.setPassWord(newPassWord1);System.out.println("恭喜您,您的密码修改成功~~");return;}else {System.out.println("您输入的两次密码不一致~~");}}}else {System.out.println("您当前输入的密码不正确~~");}}}
}
三.Test类
package com.xie;public class Test {public static void main(String[] args) {//1.创建一个ATM对象,代表ATM系统ATM atm = new ATM();//2.调用ATM对象的start方法,启动系统atm.satrt();}
}System.out.println("请输入新密码:");String newPassWord1=sc.next();System.out.println("请再次输入密码:");String newPassWord2=sc.next();//4.判断两次密码是否一致if (newPassWord1.equals(newPassWord2)){//可以开始修改密码了loginAccount.setPassWord(newPassWord1);System.out.println("恭喜您,您的密码修改成功~~");return;}else {System.out.println("您输入的两次密码不一致~~");}}}else {System.out.println("您当前输入的密码不正确~~");}}}
}
三.Test类
package com.xie;public class Test {public static void main(String[] args) {//1.创建一个ATM对象,代表ATM系统ATM atm = new ATM();//2.调用ATM对象的start方法,启动系统atm.satrt();}
}