目录

项目主要目标

技术选型

面向对象编程

使用集合容器

程序流程控制

使用常见API

系统架构搭建与欢迎页设计

Account

ATM

Test

用户开户功能实现

录入账户名称与性别

录入账户密码与取现额度

生成新卡号

存入账户

登录功能实现

登录后操作实现

退出账户

存款、取款功能实现

存款功能

取款功能

转账功能实现

销户、密码修改操作实现

销户

密码修改

查询账户操作实现


文末附带完整源码链接

项目主要目标

  1. 系统架构搭建、欢迎页设计
  2. 开户功能实现
  3. 登录功能实现
  4. 操作页展示、查询账户、退出账户
  5. 存款、取款功能实现
  6. 转账功能实现
  7. 销户功能实现
  8. 用户密码修改

技术选型

面向对象编程

每个账户都是一个账户对象:所以需要设计账户类Account,月用于创建账户对象封装账户信息。ATM同样是一个对象,需要设计ATM类,代表ATM管理系统,负责对账户的处理。

使用集合容器

ATM管理类中需要提供一个容器用于存储系统全部账户对象的信息,我们选ArrayList集合。

程序流程控制

需要结合分支、循环、跳转关键字等程序流程控制的知识,用来控制系统的业务流程。

使用常见API

登录信息的内容比较,数据的分析,处理等都需要常用API来解决,如使用String。

系统架构搭建与欢迎页设计

系统架构搭建

  1. 定义一个账户类Account,至少需要包含(卡号、姓名、性别、密码、余额、每次取现额度)
  2. 定义一个ATM类,用来代表ATM系统,负责提供所有的业务需求,比如:展示ATM的系统欢迎页、开通帐户、转账……
  3. 定义一个测试类TeSt,负责对我们开发的ATM系统进行测试。

系统欢迎页

==欢迎进入月亮银行ATM系统==

1.用户登录

2.用户开户

请选择您要操作的命令:

Account

package user.ATMTest;public class Account {private String userName;//姓名private String cardId; //卡号private char sex;//性别private String passWord; //密码private double money; //余额private double limit; //每次取现额度public Account() {}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getCardId() {return cardId;}public void setCardId(String cardId) {this.cardId = cardId;}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 user.ATMTest;import java.util.ArrayList;import java.util.Scanner;public class ATM {private ArrayList accounts = new ArrayList(); //创建一个ArrayList集合用来存储所有账户//设计欢迎页,它是一个功能,所以把它写在方法里private Scanner sc = new Scanner(System.in);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:break;case 2:break;default:System.out.println("您输入的操作有误,请重新输入!");}}}}

Test

package user.ATMTest;public class Test {public static void main(String[] args) {ATM atm = new ATM(); //创建一个ATM对象,用来代表ATM系统,负责供应所有的业务需求//调用ATM对象的start方法,测试启动系统atm.start();}}

用户开户功能实现

  • 也就是新增一个账户,往系统的账户集合中添加一个账户对象。

账户的要求

  • 用户信息包含:姓名、性别、密码、每次取现额度、卡号。
  • 注意:卡号由系统生成,要求是8位的数字组成的(且卡号不能重复)

录入账户名称与性别

//首先要创建一个账户对象,用来存储账户的信息Account acc = new Account();//让用户自己输入账户的信息//录入名称System.out.println("请输入您的账户名称:");String name = sc.next();acc.setUserName(name);//录入性别这里只能选择输入男或者女,可以写个循环while(true){System.out.println("请输入您的性别:");char sex = sc.next().charAt(0); //截取第一个字符if(sex == '男' || sex == '女'){acc.setSex(sex);break;}else {System.out.println("您输入的性别有误,只能是男或者女~");}}

录入账户密码与取现额度

//录入账户密码,因为需要二次确认,所以也用循环while(true){System.out.println("请您设置您的账户密码:");String passWord = sc.next();System.out.println("请您输入您的确认密码:");String okPassWord = sc.next();//判断两次密码是否一致if(okPassWord.equals(passWord)){acc.setPassWord(passWord);break;}else {System.out.println("您输入的确认密码与第一次不一致,请重新设置密码。");}}//录入取现额度,这里只为模拟系统,不考虑由系统定初始取现额度或者计算取现额度System.out.println("请您输入您的取现额度:");double limit = sc.nextDouble();acc.setLimit(limit);

生成新卡号

为新开户的账户生成一个新卡号:

  • 新卡号的要求是一个8位的数字,且不能与其他账户对象的卡号重复。
  • 新卡号得到后,需要赋值给当前账户对象。
//生成随机新卡号,且不重复,可以定义一个方法createCardIdString newCardId = createCardId();acc.setCardId(newCardId);
private String createCardId(){while(true){//定义一个String类型的变量用来存储8位数字作为卡号String cardId = "";//循环8次Random r = new Random();for (int i = 0; i < 8; i++) {int data = r.nextInt(10); // 0~9cardId += data;}//判断cardId中存储的卡号是否与其他账户的卡号重复了//这里定义了一个方法,用来查询当前卡号是否存在账户,如果有就返回账户,无则返回nullAccount acc = getAccountByCardId(cardId);if(acc == null){return cardId;}//随机出来的新卡号与之前的账户重复则通过while循环重新生成卡号}}//根据卡号查询账户对象并返回private Account getAccountByCardId(String cardId) {for (int i = 0; i < accounts.size(); i++) {Account acc = accounts.get(i);//判断这个账户对象acc中的卡号是否与提供的卡号一致if(acc.getCardId().equals(cardId)){return acc;}//如果全都判断完了,则表示找不到这个账户}return null; //返回null值}

存入账户

//所有信息录入完毕,现在就把这个账户对象,放到账户集合中去accounts.add(acc);System.out.println("恭喜您," + acc.getUserName() + "开户成功,您的卡号是:" + acc.getCardId());
//对Account类中的getUserName方法做一点小改动public String getUserName() {return userName + (sex == '男' ? "先生" : "女士");}

测试运行:

登录功能实现

用户登录功能要求:

  1. 如果系统没有任何账户对象,则不允许登录。
  2. 让用户输入登录的卡号,先判断卡号是否正确,如果不正确要给出提示。
  3. 如果卡号正确,再让用户输入账户密码,如果密码不正确要给出提示,如果密码也正确,则给出登录成功的提示。
//完成用户登录操作private void login() {System.out.println("==月亮银行ATM系统登录界面==");//判断系统中是否存在账户对象,如果不存在,则直接结束登录操作if(accounts.size() == 0){System.out.println("当前系统中无任何账户,请先开户再来登录~");return; //结束当前方法}//系统中存在账户对象,可以开始进行登录while(true){System.out.println("请您输入您的登录卡号:");String cardId = sc.next();//判断这个卡号是否存在Account acc = getAccountByCardId(cardId);if(acc == null){//账户不存在System.out.println("您输入的登录卡号不存在,请确认!");}else{//账户存在//开始输入密码,需要验证密码,所以嵌套一层循环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("您输入的密码不正确,请确认!");}}}}}

测试运行:

1.测试登录时系统中无任何账户

2.开户

3.测试登录时账户卡号输入不正确

4.测试登录时密码输入不正确

5.测试登录成功

登录后操作实现

登录成功后,我们创建一个用来记录当前登录的账户的对象

//创建一个记录登录后的账户的对象private Account loginAcc;

接着就是写登录后的操作界面:

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.注销当前账户");int command = sc.nextInt();switch (command){case 1://查询当前账户break;case 2://存款break;case 3://取款break;case 4://转账break;case 5://密码修改break;case 6://退出break;case 7://注销当前账户break;default:System.out.println("您选择的操作不存在,请确认!");}}}

把它放在登录操作完成之后:

测试运行:

开始完善所有的功能

退出账户

测试运行:

存款、取款功能实现

用户存款功能

  • 用户为自己的账户存钱,存钱后更新账户的余额即可。

用户取款功能

  • 用户从自己的账户中取钱,取钱的要求:
  1. 需要先判断账户的余额是否大于>100元,如果够,让用户输入取款金额。
  2. 需要判断取款金额是否超过了当次限额,以及余额是否足够。

存款功能

private void depositMoney() {System.out.println("==月亮银行-存钱操作==");System.out.println("请您输入存款金额:");double money = sc.nextDouble();//更新当前登录账户的余额loginAcc.setMoney(loginAcc.getMoney() + money); //注意这里要将原本的余额加上存款的数额System.out.println("恭喜您,成功存款" + money + "元,存钱后账户余额为:" + loginAcc.getMoney()+ "元");}

取款功能

private void drawMoney() {System.out.println("==月亮银行-取钱操作==");//1.判断当前账户余额是否达到了100元,如果不满100元,就不允许取款if(loginAcc.getMoney() = money){//账户余额够//再判断取款金额是否超过了每次限额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()+ "元");}}}

测试运行:

1.测试存款

2.测试取款金额不满100

3.测试取款金额超过每次限额

4.测试取款

转账功能实现

用户转账功能

  • 把钱转给别人,转账前需要判断:
  1. 自己账户是否有钱,系统中是否有其他账户。
  2. 接下来让用户输入对方卡号,判断对方账户是否存在,账户如果存在,还需要认证对方账户的户主姓氏。

测试运行:

1.测试系统账户数量不足

2.测试转账时不足100元

3.测试转账卡号不存在

4.测试姓氏验证不通过

5.测试转账金额超过自身余额

6.测试转账成功

销户、密码修改操作实现

销户

  • 销户就是从系统中删除当前账户,销户的要求:
  1. 首先要询问用户是否确定要销户,如果不确定,则回到操作界面。
  2. 如果确定,要判断用户的账户中是否有钱,有则不允许销户,并回到操作界面。
  3. 如果没钱,则完成销户,并回到欢迎页。
//销户操作,因为要返回操作界面或者回到欢迎页,所以可以将方法写成boolean类型private boolean deleteAccount() {System.out.println("==月亮银行-销户操作==");//让用户确认销户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;}else{//账户中还有钱System.out.println("对不起,您的账户中还有余额,不允许销户!");return false;}default://不进行销户System.out.println("已取消销户操作。");return false;}}

测试运行:

1.测试取消销户操作

2.测试销户不成功

3.测试成功销户

密码修改

  • 更改账户的密码,修改密码的要求:
  1. 需要先认证用户当前的密码
  2. 认证通过后,需要让用户输入两次新密码
  3. 两次密码一样,则更新账户密码,并回到欢迎界面

private void updatePassWord() {System.out.println("==月亮银行-账户密码修改操作==");while(true){//1.提醒用户认证当前密码System.out.println("请您输入当前账户的密码:");String passWord = sc.next();//2.验证密码是否正确if(loginAcc.getPassWord().equals(passWord)){//验证通过//开始修改密码while(true){System.out.println("请您输入新密码:");String newPassWord = sc.next();System.out.println("请您再次输入密码:");String okPassWord = sc.next();//判断两次密码是否一致if(okPassWord.equals(newPassWord)){//一致,对账户的密码进行修改loginAcc.setPassWord(newPassWord);System.out.println("您的密码已修改成功,请重新登陆~");return;}else{//两次密码不一致System.out.println("您输入的两次密码不一致,请重新设置新密码。");}}}else{//密码验证不通过System.out.println("您当前输入的密码不正确!请重试");}}}

测试运行:

1.测试密码验证不通过

2.测试二次密码确认

查询账户操作实现

将账户的信息输出即可。

private void selectUser() {System.out.println("====月亮银行ATM系统====");//账户姓名这里不带敬语System.out.println("账户姓名:" + loginAcc.getUserName().replace("先生","").replace("女士",""));System.out.println("账户卡号:" + loginAcc.getCardId());System.out.println("性别:" + loginAcc.getSex());System.out.println("账户余额:" + loginAcc.getMoney() + "元");System.out.println("每次取现额度:" + loginAcc.getLimit() + "元");System.out.println("密码:********");int flag = 0; //用于控制显示密码while (true) {System.out.println("------------------------------------------");System.out.println("您可选择如下操作:");System.out.println("1.显示密码");System.out.println("2.退出");int command = sc.nextInt();switch (command){case 1:if(flag == 0){System.out.println("密码:" + loginAcc.getPassWord());flag++;}else{System.out.println("密码已显示");}break;case 2:return;}}}

测试运行:

完结撒花,完整的源代码——InsCode – 让你的灵感立刻落地


END


学习自:黑马程序员——JavaSE课程