ATM的运行逻辑

275 阅读6分钟

前言

随着网络时代的发展,ATM早已经普及,面对注册登录等的底层逻辑你是否熟悉呢?特此,书写ATM的运行逻辑,来帮助大家更好的理解.

1.ATM架构的搭建

首先我们应定义一个账户类,来管理账户数据.还需要一个atm类,创建方法对数据进行操作.最后需要一个测试类,来调试我们的代码. 1.创建账户类时,我们应运用封装思想,来让数据具有安全性,私有起来更便于操作.(可选中右键,快捷操作) 2.创建atm类时,会用arraylist在对数据进行统计. 3.建测试类,调用atm系统.

账户类

package com.heliu;

public class Account { private String cardID; private String userName; private char sex; private String passWord; private double money; private double limit;

public void setCardID(String cardID) {
    this.cardID = cardID;
}

public void setUserName(String userName) {
    this.userName = userName;
}

public void setSex(char sex) {
    this.sex = sex;
}

public void setPassWord(String passWord) {
    this.passWord = passWord;
}

public void setMoney(double money) {
    this.money = money;
}

public void setLimit(double limit) {
    this.limit = limit;
}

public String getCardID() {
    return cardID;
}

public String getUserName() {
    return userName+(sex =='男'?"先生":"女士");
}

public char getSex() {
    return sex;
}

public String getPassWord() {
    return passWord;
}

public double getMoney() {
    return money;
}

public double getLimit() {
    return limit;
}`

测试类

package com.heliu;

public class text {
    public static void main(String[] args) {
        /*创建ATM*/
        ATM atm = new ATM();
        atm.start();


    }
}

用户界面的设计

package com.heliu;

import java.security.PrivateKey;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class ATM {
    private Scanner sc =new Scanner(System.in);
    private Account loginAcc;

    private  ArrayList<Account> accounts = new ArrayList<>();
    /*欢迎界面*/
    public void  start(){
        while(true){
            System.out.println("欢迎来到ATM");
            System.out.println("1.用户登录");
            System.out.println("2.用户开户");
            System.out.println("3.退出");
            int comand = sc.nextInt();
            switch (comand){
                case 1:
                    login();
                    break;
                    //用户登录
                case 2:
                    creatAccount();
                    break;
                case 3:
                    return;
                default:
                    System.out.println("没有该操作!");



            }
        }
    }

2.开户功能

在使用atm系统时,首先应该账户登录,所以我们需要一段代码来来完成账户的注册. 1.首先创建一个方法来建立名字,性别,密码. 2.利用随机数,生成八位卡号 3.

/*开户*/
    private void creatAccount(){
        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(okpassWord);
                break;
            }else{
                System.out.println("密码不一致");
            }
        }
        System.out.println("请您输入您的取现额度");
        double limit = sc.nextDouble();
        acc.setLimit(limit);
        String newCard = createCardId();
        accounts.add(acc);

        acc.setCardID(newCard);
        System.out.println("恭喜您,开户成功!"+acc.getUserName()+"开户成功,您的卡号是"+acc.getCardID()+"您的取现额度是"+acc.getLimit());



    }
//生成卡号
    private  String createCardId(){
        while (true) {
            String cardId = "";
            Random r  =new Random();

            for (int i = 0; i < 8; i++) {
               int data = r.nextInt(10);
               cardId += data;
            }
            Account acc =getAccountByCardId(cardId);
            if(acc ==null){
                return cardId;
            }
        }
    }
//检测密码
    private Account getAccountByCardId(String cardId){
        for (int i = 0; i < accounts.size(); i++) {
            Account acc = accounts.get(i);
            if(acc.getCardID().equals(cardId)){
                return acc;
            }
        }
        return  null;
    }






}

2.登录操作

进行一切操作的基础,那就是首先要登录.在欢迎那个界面走向的登陆,属于同一个独立的逻辑,所以要写成一个新方法. 1.首先要判断是否创立账户

System.out.println("==用户登录==");
if(accounts.size()==0){
    System.out.println("系统无账户,请先开户!");
    return;
}

2.有之则进入登陆系统. 既要判断账号的有无null, 同时还要探测密码是否正确,通过equals比较 当错误时又要重新返回,所以需要一个死循环.

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)){
                loginAcc = acc;

                System.out.println("恭喜您登陆成功"+acc.getUserName()+"您的卡号是"+acc.getCardID());
                showUserComand();
                return;//跳出当前并结束登录

            }else{
                System.out.println("您输入的密码不正确");

            }
        }
    }

3.登录后的一系列操作

当进入后,设计一系列功能,因为是多个分支,所以需要switch分支来进行.最后再对各个功能创建新方法

 private  void  showUserComand(){
        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.println("请选择");
            int command = sc.nextInt();
            switch (command){
                case 1:
                    showloginAccount();
                    //查询账户
                    break ;
                case 2:
                    //存款
                    depositMoney();

                break ;
                case 3:
                    drawMoney();

                    break ;
                case 4:
                    transfeMoney();

                    break ;
                case 5:
                    updatePassWord();
                    return;
                case 6:
                    System.out.println(loginAcc.getUserName()+"您退出系统成功");
                    return;
                case 7:
                    //注销
                    if(deleteAccount()){
                        return;
                    }else {

                    }

                default:
                    System.out.println("您当前选择的操作是不存在的");

``
            }
        }


}

同时登陆完成后,需要展示用户信息.

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());
 ;



}

4.存取款功能的实现

当新建一个账户后,空空如也.这时我们需要新建两个方法,分别实现存取款的操作. 首先是存款操作.

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("取款操作");
    if(loginAcc.getMoney()>100){
        System.out.println("请您输入取款金额");
        double money = sc.nextDouble();
        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());
            }

        }else{
            System.out.println("余额不足,您的余额是"+loginAcc.getMoney());
        }

    }else{
        System.out.println("余额不足100");
        return;
    }
}

5.转账功能

转账呢,首先要自己有钱吧? 首先要有两个账户吧? 有优先判定 最重要的是,转账还有账户认证, 截取函数substring来避开第一位,同时第一位成为*. 姓氏判断startsWith进行核查 最后完成验证,才可以进行操作.

private void transfeMoney() {
    System.out.println("用户转账");
    if(accounts.size()<2){
        System.out.println("只有一个账户,无法转账");
        return;
    }
    if (loginAcc.getMoney() ==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 {
            String name ="*"+acc.getUserName().substring(1);

            System.out.println("请您输入["+name+"]姓氏");
            String preName = sc.next();
            if(acc.getUserName().startsWith(preName)){
                while (true) {
                    System.out.println("请输入转账金额");
                    double money = sc.nextDouble();
                    if(loginAcc.getMoney()>=money){
                        loginAcc.setMoney(loginAcc.getMoney()-money);
                        acc.setMoney(acc.getMoney()+money);
                        System.out.println("恭喜您,转账成功!");
                        return;
                        //可以转
                    }else{
                        System.out.println("余额不足,最多可以转"+loginAcc.getMoney());
                    }
                }
            }else{
                System.out.println("对不起,您认证的形式有问题");
            }

        }
    }

}

7.销户操作

销户很重要,首先要确认是否销户.~! 其次销户不能有存款,从账户删掉.用remove函数 新建方法, 销户是否完成,通过布尔类型来决定返回值 销户成功后,回到欢迎页!

private boolean deleteAccount() {
    System.out.println("进行销户");
    System.out.println("请您确认销户");
    System.out.println("y表示确定");
    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;
    }
}

8.密码修改

为确保用户账号安全,可以通过最重要的密码修改,来保护账户. 密码修改应该慎重,所以修改密码需要输入两次,函数比较 当原密码或者新密码错误时,又需要重新进行,又需要一个死循环.

private void updatePassWord() {
    System.out.println("账户密码修改");
    while (true) {
        System.out.println("请您输入当前密码");
        String passWord = sc.next();
        if(loginAcc.getPassWord().equals(passWord)){
            while (true) {
                System.out.println("请您输入新密码");
                String newPassWorad = sc.next();

                System.out.println("请您再次输入确认密码");
                String okPassWorad = sc.next();

                if(okPassWorad.equals(newPassWorad)){
                    loginAcc.setPassWord(okPassWorad);
                    System.out.println("恭喜您,修改密码成功");
                    return;

                }else{
                    System.out.println("两次密码输入不一致");
                }
            }
        }else{
            System.out.println("您当前密码输入不正确");
        }
    }

}

至此,atm基本操作已完成