一,账户类、首页设计
1.系统准备和首页设计
实现步骤:
- 定义账户类,用于后期创建账户对象封装用户的账户信息
- 账户类中的信息至少需要包含(卡号、姓名、密码、余额、取现额度
- 需要准备一个ArrayList的集合,用于存储系统用户的账户对象
- 需要展示欢迎页包含2个功能:开户功能、登录账户
package com.itheima; /* 账户类 */ public class Account { private String cardId; private String userName;//用户名 private String passWord;//密码 private double money;//账户余额 private double quotaMoney;//每次取现额度 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; } }
package com.itheima; /* 账户入口 */ import java.util.ArrayList; import java.util.Scanner; public class ATMSystem { public static void main(String[] args) { ArrayList<Account> accounts = new ArrayList<>(); Scanner sc = new Scanner(System.in); 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: //账户登录 break; case 2: //账户开户 break; default: System.out.println("您输入的操作命令不存在"); } } } }
2.用户开户功能实现
实现步骤
- 开户应该定义成一个方法,并传入账户集合
public static void register(ArrayList<Account> accounts) {...}
- 创建一个Account账户类的对象用于封装账户信息 (姓名、密码、卡号)
- 键盘录入姓名、密码、确认密码(需保证两次密码一致)
- 生成账户卡号必须由系统自动生成8位数字 (必须保证卡号的唯一)
- 把Account账户对象存入到集合accounts中去。
switch (command) { case 1: //账户登录 break; case 2: //账户开户 register(accounts,sc); break; default: System.out.println("您输入的操作命令不存在"); }
/** * 用户开户功能的实现 * @param accounts 接收的账户集合 */ private static void register(ArrayList<Account> accounts,Scanner sc ) { System.out.println("==============系统开户操作=================="); Account account=new Account(); System.out.println("请输入您的账户用户名:"); String userName=sc.next(); account.setUserName(userName); while (true) { System.out.println("请输入您的账户密码:"); String passWord=sc.next(); System.out.println("请确认密码:"); String okPassWord=sc.next(); if (passWord.equals(okPassWord)){ account.setPassWord(okPassWord); break; }else{ System.out.println("对不起,您输入的两次密码不一致,请重新确认"); } } System.out.println("请输入您的账户当次限额:"); double quotaMoney=sc.nextDouble(); account.setQuotaMoney(quotaMoney); //产生随机8位数账户 (独立功能 独立成方法) String cardId=getRandomCardId(accounts); account.setCardId(cardId); accounts.add(account); System.out.println("恭喜你,"+userName+"开户成功,您的卡号是"+cardId+"请您妥善保管"); } /** * 为账户生成8位与其他账户考好不同的号码。 * @return */ private static String getRandomCardId(ArrayList<Account> accounts) { //生成8位数字 Random r=new Random(); while (true) { String cardId=""; for (int i = 0; i < 8; i++) { cardId+=r.nextInt(10); } //判断卡号是否与其他账户卡号重复 Account acc=getAccountByCardId(cardId,accounts); if (acc==null){ return cardId; } } } /** *panduan集合中是否有相同的卡号 * @param cardId * @param accounts * @return acc null */ private static Account getAccountByCardId(String cardId,ArrayList<Account> accounts){ for (int i = 0; i < accounts.size(); i++) { Account acc=accounts.get(i); if (acc.getCardId().equals(cardId)){ return acc; } } return null;//查无此账号 }
二.用户登录功能
1.用户登录功能的实现
- 登录功能应该定义成一个方法,并传入账户集合:
public static void login(ArrayList<Account> accounts) (...)
- 让用户输入卡号,根据卡号去账户集合中查询账户对象
- 如果没有找到账户对象,说明登录卡号不存在,提示继续输入卡号
- 如果找到了账户对象,说明卡号存在,继续输入密码。
- 如果密码不正确,提示继续输入密码
- 如果密码也正确,登陆成功!!
switch (command) { case 1: //账户登录 login(accounts,sc); break; case 2: //账户开户 register(accounts,sc); break; default: System.out.println("您输入的操作命令不存在"); }
/** * 用户登录功能 * @param accounts 全部账户对象的集合 * @param sc 扫描器 */ private static void login(ArrayList<Account> accounts, Scanner sc) { System.out.println("==============系统登录操作=================="); //判断账户集合中是否存在账户,若不存在账户,登录功能不能运行 if (accounts.size()==0){ System.out.println("对不起,当前系统无账户,请先开户再来"); return; //语言风格,解决方法的执行 } while (true) { System.out.println("请输入登录卡号:"); String cardId=sc.next(); //根据卡号去账户集合中查询账户对象 Account acc=getAccountByCardId(cardId,accounts); if (acc!=null){ //卡号存在 输入密码 认证密码 while (true) { System.out.println("请输入您的密码"); String passWord=sc.next(); if (acc.getPassWord().equals(passWord)){ System.out.println("恭喜你,"+acc.getUserName()+"先生/女士进入系统,您的卡号是:"+acc.getCardId()); }else { System.out.println("对不起,您输入的密码有误"); } } }else { System.out.println("对不起,系统中不存在该账户卡号"); } } }
三.登录后的功能
1.用户操作页设计、查询账户、退出账户功能实现
- 用户登录成功后,需要进入用户操作页
- 查询就是直接展示当前登录成功的账户对象的信息
- 退出账户是需要回到首页的。
if (acc.getPassWord().equals(passWord)){ System.out.println("恭喜你,"+acc.getUserName()+"先生/女士进入系统,您的卡号是:"+acc.getCardId()); //登录成功展示操作页 shouUserConmmand(sc,acc); return;//退出当前方法 }else { System.out.println("对不起,您输入的密码有误"); }
/** * 展示登录后的操作页 */ private static void shouUserConmmand(Scanner sc,Account acc) { while (true) { System.out.println("==============用户操作页=================="); 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 command=sc.nextInt(); switch (command){ case 1: //查询账户(展示当前登录账户信息) shouwAccount(acc); break; case 2: //存款 break; case 3: //取款 break; case 4: //转账 break; case 5: //修改密码 break; case 6: //退出 System.out.println("退出成功,欢迎下次访问"); return;//退出当前方法 case 7: //注销账户 break; default: System.out.println("您输入的命令不正确"); } } }
/** * 展示账户信息 * @param acc */ private static void shouwAccount(Account acc) { System.out.println("==============当前账户信息如下=================="); System.out.println("卡号:"+acc.getCardId()); System.out.println("户主:"+acc.getUserName()); System.out.println("余额:"+acc.getMoney()); System.out.println("限额:"+acc.getQuotaMoney()); }
2、用户存款功能实现
- 存款就是拿到当前账户对象
- 然后让用户输入存款的金额
- 调用账户对象的setMoney方法将账户余额修改成存钱后的余额
/** * 存钱 * @param acc 当前账户对象 * @param sc 扫描器 */ private static void depositMoney(Account acc, Scanner sc) { System.out.println("==============用户存钱操作=================="); System.out.println("请输入您存款余额"); double money=sc.nextDouble(); acc.setMoney(acc.getMoney()+money); System.out.println("恭喜你,存钱成功,当前账户信息如下:"); shouwAccount(acc); }
3、取款功能实现
- 取款需要先判断账户是否有钱
- 有钱则拿到自己账户对象
- 然后让用户输入取款金额
- 判断取款金额是否超过了当次限额,以及余额是否足够
- 满足要求则调用账户对象的setMoney方法完成金额的修改
/** * 取钱功能 * @param acc 当前账户对象 * @param sc 扫描器 */ private static void drawMoney(Account acc, Scanner sc) { System.out.println("==============用户取钱操作=================="); //判断账户中余额是否够100元 if (acc.getMoney()<100){ System.out.println("对不起,当前账户中不够100元,不能取钱"); return; } while (true) { System.out.println("请输入您要取款的金额:"); double money=sc.nextDouble(); //判断取款金额是否超过限额 if (acc.getQuotaMoney()<money){ System.out.println("对不起,您当前取款金额超过每次限额,每次最多可取:"+acc.getQuotaMoney()); }else { //是否超过账户的总余额 if (money>acc.getMoney()){ System.out.println("余额不足,您的账户目前的总余额"+acc.getMoney()); }else { System.out.println("恭喜你,取钱"+money+"元,成功"); acc.setMoney(acc.getMoney()-money); shouwAccount(acc); return; } } } }
4、转账功能的实现
- 转账功能需要判断系统中是否有2个账户对象及以上
- 同时还要判断自己账户是否有钱
- 接下来需要输入对方卡号,判断对方账户是否存在
- 对方账户存在还需要认证对方户主的姓氏
- 满足要求则可以把自己账户对象的金额修改到对方账户对象中去
/** * 转账功能 * @param sc 扫描器 * @param acc 自己的账户集合 * @param accounts 全部的账户集合 */ private static void transferMoney(Scanner sc, Account acc, ArrayList<Account> accounts) { System.out.println("==============用户转账操作=================="); //判断是否有2个账户 if (accounts.size()<2){ System.out.println("当前系统中,不足2个账户,不能进行转账,请去开户"); return; } //判断自己账户是否有钱 if (acc.getMoney()==0){ System.out.println("对不起,您自己都没钱,就别转了吧"); return; } while (true) { System.out.println("请您输入对方账户的卡号"); String cardId = sc.next(); //不能是自己的卡号 if (cardId.equals(acc.getCardId())){ System.out.println("对不起,您不可以向自己转账"); continue; } //判断卡号是否存在 根据卡号去查询对方账户 Account account = getAccountByCardId(cardId, accounts); if (account==null){ System.out.println("对不起,您输入的这个卡号不存在"); }else { //判断认证姓氏是否正确 String userName = account.getUserName(); String tip = "*" + userName.substring(1); System.out.println("请您输入["+tip+"]的姓氏"); String preName=sc.next(); if (userName.startsWith(preName)){ System.out.println("请您输入转账金额"); double money = sc.nextDouble(); //判断余额是否足够 if (money>acc.getMoney()){ System.out.println("对不起,您余额不足,您最多可以转账:"+acc.getMoney()); }else { //余额足够,可以转账 acc.setMoney(acc.getMoney()-money); account.setMoney(account.getMoney()+money); System.out.println("转账成功,您的账户还剩下"+acc.getMoney()); return; } }else { System.out.println("对不起,您输入的信息有误"); } } } }
5、密码修改、销户功能的实现
- 修改密码就是把当前对象的密码属性使用set方法进行更新
- 销户是从集合对象中删除当前对象,并回到首页
/** *修改密码 * @param sc 扫描器 * @param acc 当前登录成功的账户对象 */ private static void updatePassWord(Scanner sc, Account acc) { System.out.println("==============用户密码修改=================="); while (true) { System.out.println("请您输入当前密码:"); String passWord = sc.next(); if (acc.getPassWord().equals(passWord)){ while (true) { System.out.println("请您输入新密码:"); String newPassWord=sc.next(); System.out.println("请您确认新密码:"); String okPassWord=sc.next(); if (newPassWord.equals(okPassWord)){ acc.setPassWord(newPassWord); System.out.println("修改密码成功"); return; }else { System.out.println("两次密码输入不相同"); } } }else { System.out.println("您输入的密码不正确"); } } }
/** * 销户功能 * @param acc 当前账户集合 * @param sc 扫描器 * @param accounts */ private static void deleteAccount(Account acc, Scanner sc, ArrayList<Account> accounts) { System.out.println("==============用户销户=================="); System.out.println("您真的销户吗?y/n"); String rs=sc.next(); switch (rs){ case "y": if (acc.getMoney()>0){ System.out.println("您账户中还有余额,无法销户"); }else { accounts.remove(acc); System.out.println("销户已完成"); } break; default: System.out.println("好的,账户已保留"); } }
四、完整代码
Acoount类
package com.itheima; /* 账户类 */ public class Account { private String cardId; private String userName;//用户名 private String passWord;//密码 private double money;//账户余额 private double quotaMoney;//每次取现额度 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; } }
ATMSystem类package com.itheima; /* 账户入口 */ import java.util.ArrayList; import java.util.Random; import java.util.Scanner; public class ATMSystem { public static void main(String[] args) { ArrayList<Account> accounts = new ArrayList<>(); Scanner sc = new Scanner(System.in); 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(accounts,sc); break; case 2: //账户开户 register(accounts,sc); break; default: System.out.println("您输入的操作命令不存在"); } } } /** * 用户登录功能 * @param accounts 全部账户对象的集合 * @param sc 扫描器 */ private static void login(ArrayList<Account> accounts, Scanner sc) { System.out.println("==============系统登录操作=================="); //判断账户集合中是否存在账户,若不存在账户,登录功能不能运行 if (accounts.size()==0){ System.out.println("对不起,当前系统无账户,请先开户再来"); return; //语言风格,解决方法的执行 } while (true) { System.out.println("请输入登录卡号:"); String cardId=sc.next(); //根据卡号去账户集合中查询账户对象 Account acc=getAccountByCardId(cardId,accounts); if (acc!=null){ //卡号存在 输入密码 认证密码 while (true) { System.out.println("请输入您的密码"); String passWord=sc.next(); if (acc.getPassWord().equals(passWord)){ System.out.println("恭喜你,"+acc.getUserName()+"先生/女士进入系统,您的卡号是:"+acc.getCardId()); //登录成功展示操作页 shouUserConmmand(sc,acc,accounts); return;//退出当前方法 }else { System.out.println("对不起,您输入的密码有误"); } } }else { System.out.println("对不起,系统中不存在该账户卡号"); } } } /** * 展示登录后的操作页 */ private static void shouUserConmmand(Scanner sc,Account acc,ArrayList<Account> accounts) { while (true) { System.out.println("==============用户操作页=================="); 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 command=sc.nextInt(); switch (command){ case 1: //查询账户(展示当前登录账户信息) shouwAccount(acc); break; case 2: //存款 depositMoney(acc,sc); break; case 3: //取款 drawMoney(acc,sc); break; case 4: //转账 transferMoney(sc,acc,accounts); break; case 5: //修改密码 updatePassWord(sc,acc); return; case 6: //退出 System.out.println("退出成功,欢迎下次访问"); return;//退出当前方法 case 7: //注销账户 if(deleteAccount(acc,sc,accounts)){ return; }else { break; } default: System.out.println("您输入的命令不正确"); } } } /** * 销户功能 * @param acc 当前账户集合 * @param sc 扫描器 * @param accounts */ private static boolean deleteAccount(Account acc, Scanner sc, ArrayList<Account> accounts) { System.out.println("==============用户销户=================="); System.out.println("您真的销户吗?y/n"); String rs=sc.next(); switch (rs){ case "y": if (acc.getMoney()>0){ System.out.println("您账户中还有余额,无法销户"); }else { accounts.remove(acc); System.out.println("销户已完成"); return true; } break; default: System.out.println("好的,账户已保留"); } return false; } /** *修改密码 * @param sc 扫描器 * @param acc 当前登录成功的账户对象 */ private static void updatePassWord(Scanner sc, Account acc) { System.out.println("==============用户密码修改=================="); while (true) { System.out.println("请您输入当前密码:"); String passWord = sc.next(); if (acc.getPassWord().equals(passWord)){ while (true) { System.out.println("请您输入新密码:"); String newPassWord=sc.next(); System.out.println("请您确认新密码:"); String okPassWord=sc.next(); if (newPassWord.equals(okPassWord)){ acc.setPassWord(newPassWord); System.out.println("修改密码成功"); return; }else { System.out.println("两次密码输入不相同"); } } }else { System.out.println("您输入的密码不正确"); } } } /** * 转账功能 * @param sc 扫描器 * @param acc 自己的账户集合 * @param accounts 全部的账户集合 */ private static void transferMoney(Scanner sc, Account acc, ArrayList<Account> accounts) { System.out.println("==============用户转账操作=================="); //判断是否有2个账户 if (accounts.size()<2){ System.out.println("当前系统中,不足2个账户,不能进行转账,请去开户"); return; } //判断自己账户是否有钱 if (acc.getMoney()==0){ System.out.println("对不起,您自己都没钱,就别转了吧"); return; } while (true) { System.out.println("请您输入对方账户的卡号"); String cardId = sc.next(); //不能是自己的卡号 if (cardId.equals(acc.getCardId())){ System.out.println("对不起,您不可以向自己转账"); continue; } //判断卡号是否存在 根据卡号去查询对方账户 Account account = getAccountByCardId(cardId, accounts); if (account==null){ System.out.println("对不起,您输入的这个卡号不存在"); }else { //判断认证姓氏是否正确 String userName = account.getUserName(); String tip = "*" + userName.substring(1); System.out.println("请您输入["+tip+"]的姓氏"); String preName=sc.next(); if (userName.startsWith(preName)){ System.out.println("请您输入转账金额"); double money = sc.nextDouble(); //判断余额是否足够 if (money>acc.getMoney()){ System.out.println("对不起,您余额不足,您最多可以转账:"+acc.getMoney()); }else { //余额足够,可以转账 acc.setMoney(acc.getMoney()-money); account.setMoney(account.getMoney()+money); System.out.println("转账成功,您的账户还剩下"+acc.getMoney()); return; } }else { System.out.println("对不起,您输入的信息有误"); } } } } /** * 取钱功能 * @param acc 当前账户对象 * @param sc 扫描器 */ private static void drawMoney(Account acc, Scanner sc) { System.out.println("==============用户取钱操作=================="); //判断账户中余额是否够100元 if (acc.getMoney()<100){ System.out.println("对不起,当前账户中不够100元,不能取钱"); return; } while (true) { System.out.println("请输入您要取款的金额:"); double money=sc.nextDouble(); //判断取款金额是否超过限额 if (acc.getQuotaMoney()<money){ System.out.println("对不起,您当前取款金额超过每次限额,每次最多可取:"+acc.getQuotaMoney()); }else { //是否超过账户的总余额 if (money>acc.getMoney()){ System.out.println("余额不足,您的账户目前的总余额"+acc.getMoney()); }else { System.out.println("恭喜你,取钱"+money+"元,成功"); acc.setMoney(acc.getMoney()-money); shouwAccount(acc); return; } } } } /** * 存钱 * @param acc 当前账户对象 * @param sc 扫描器 */ private static void depositMoney(Account acc, Scanner sc) { System.out.println("==============用户存钱操作=================="); System.out.println("请输入您存款余额"); double money=sc.nextDouble(); acc.setMoney(acc.getMoney()+money); System.out.println("恭喜你,存钱成功,当前账户信息如下:"); shouwAccount(acc); } /** * 展示账户信息 * @param acc */ private static void shouwAccount(Account acc) { System.out.println("==============当前账户信息如下=================="); System.out.println("卡号:"+acc.getCardId()); System.out.println("户主:"+acc.getUserName()); System.out.println("余额:"+acc.getMoney()); System.out.println("限额:"+acc.getQuotaMoney()); } /** * 用户开户功能的实现 * @param accounts 接收的账户集合 */ private static void register(ArrayList<Account> accounts,Scanner sc ) { System.out.println("==============系统开户操作=================="); Account account=new Account(); System.out.println("请输入您的账户用户名:"); String userName=sc.next(); account.setUserName(userName); while (true) { System.out.println("请输入您的账户密码:"); String passWord=sc.next(); System.out.println("请确认密码:"); String okPassWord=sc.next(); if (passWord.equals(okPassWord)){ account.setPassWord(okPassWord); break; }else{ System.out.println("对不起,您输入的两次密码不一致,请重新确认"); } } System.out.println("请输入您的账户当次限额:"); double quotaMoney=sc.nextDouble(); account.setQuotaMoney(quotaMoney); //产生随机8位数账户 (独立功能 独立成方法) String cardId=getRandomCardId(accounts); account.setCardId(cardId); accounts.add(account); System.out.println("恭喜你,"+userName+"开户成功,您的卡号是"+cardId+"请您妥善保管"); } /** * 为账户生成8位与其他账户考好不同的号码。 * @return */ private static String getRandomCardId(ArrayList<Account> accounts) { //生成8位数字 Random r=new Random(); while (true) { String cardId=""; for (int i = 0; i < 8; i++) { cardId+=r.nextInt(10); } //判断卡号是否与其他账户卡号重复 Account acc=getAccountByCardId(cardId,accounts); if (acc==null){ return cardId; } } } /** *panduan集合中是否有相同的卡号 * @param cardId * @param accounts * @return acc null */ private static Account getAccountByCardId(String cardId,ArrayList<Account> accounts){ for (int i = 0; i < accounts.size(); i++) { Account acc=accounts.get(i); if (acc.getCardId().equals(cardId)){ return acc; } } return null;//查无此账号 } }