Java仿ATM操作系统

image.png

前言

本文主要介绍使用Java简单实现仿ATM操作系统。
该ATM系统主要包括:登录、开户、查询、存款、取款、转账、修改密码、退出、注销账户功能。
该ATM系统主要使用while循环来实现各项功能的循环操作。
结构组成:账户实体类和主系统操作类。

一、账户实体Account类

该类主要包含账户需要的所有字段和存取款的操作方法。

1. 定义字段

定义字段并实现setter和getter方法。

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;
    }
}

2 重写构造方法

    public Account(String cardId, String userName, String password, double quotaMoney) {
        this.cardId = cardId;
        this.userName = userName;
        this.password = password;
        this.quotaMoney = quotaMoney;
    }

3 存款

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

4 取款

0:取款额大于余额
1:取款成功
2:取款额大于单次取款限额

    public int outMoney(double money) {
        if (money > this.money) {
            return 0;
        } else if (money > this.quotaMoney) {
            return 2;
        } else {
            this.money -= money;
            return 1;
        }
    }

二、主系统操作ATMSystem类

该类包括ATM系统的所有操作功能的实现。主要包括系统主页面和登录之后个人页面。

1 系统主页面

系统主页面主要实现登录和开户的功能。

1.1 启动

本系统使用List集合来存储账户信息。

public class ATMSystem {
    public static void main(String[] args) {
        // 存储账户信息
        List accounts = new ArrayList<>();
        start(accounts);
    }

    /* 起始主页 */
    public static void start(List accounts) {
        System.out.println("==========欢迎您进入ATM系统==========");
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("1、登录");
            System.out.println("2、开户");
            System.out.println("请您选择操作:");
            int type = scanner.nextInt();
            switch (type) {
                case 1:
                    login(scanner, accounts);
                    break;
                case 2:
                    register(scanner, accounts);
                    break;
                default:
                    System.out.println("您选择的操作有误。");
            }
        }
    }
}

1.2 登录

实现逻辑:
1、判断系统中账户个数。
2、通过输入的卡号查询对应账户进行判断。
3、判断输入的密码。
4、进入个人主页面。

    /* 登录 */
    public static void login(Scanner scanner, List accounts) {
        System.out.println("==========欢迎您进入到登录操作==========");
        if (accounts.size() == 0) {
            System.out.println("当前系统无任何账户,请先开户再登录!");
            return;
        }
        Account account = null;
        while (true) {
            System.out.println("请您输入卡号:");
            String cardId = scanner.next();
            account = queryAccountByCardId(accounts, cardId);
            if (account == null) {
                System.out.println("您输入的卡号有误!");
            } else {
                break;
            }
        }
        while (true) {
            System.out.println("请您输入密码:");
            String password = scanner.next();
            if (account.getPassword().equals(password)) {
                break;
            } else {
                System.out.println("您输入的密码有误!");
            }
        }
        System.out.println("尊敬的" + account.getUserName() + ",欢迎您进入系统!\n您的卡号是:" + account.getCardId());
        enterSystem(scanner, accounts, account);
    }
    /* 查询账户 */
    public static Account queryAccountByCardId(List accounts, String cardId) {
        for (int i = 0; i < accounts.size(); i++) {
            Account a = accounts.get(i);
            if (a.getCardId().equals(cardId)) {
                return a;
            }
        }
        return null;
    }

1.3 开户

实现逻辑:
1、输入账户基本信息。
2、生成8位由数字组成的不重复的卡号。
3、存储新账户信息。

    /* 开户 */
    public static void register(Scanner scanner, List accounts) {
        System.out.println("==========欢迎您进入到开户操作==========");
        System.out.println("请您输入姓名:");
        String name = scanner.next();
        String password;
        while (true) {
            System.out.println("请您输入密码:");
            password = scanner.next();
            System.out.println("请您确认密码:");
            if (scanner.next().equals(password)) {
                break;
            } else {
                System.out.println("您两次输入的密码不一致,请重新设置");
            }
        }
        System.out.println("请您设置单次最大取现金额:");
        double quotaMoney = scanner.nextDouble();
        String cardId = createCardId(accounts);
        Account account = new Account(cardId, name, password, quotaMoney);
        accounts.add(account);
        System.out.println("恭喜您开户成功!您的卡号是:\"" + account.getCardId() + "\",请您妥善保管。");
    }
    /* 生成卡号 */
    public static String createCardId(List accounts) {
        Random random = new Random();
        while (true) {
            String carId = "";
            for (int i = 0; i < 8; i++) {
                carId += random.nextInt(10);
            }
            Account a = queryAccountByCardId(accounts, carId);
            if (a == null) {
                return carId;
            }
        }
    }

2 个人主页面

登录成功之后进入个人主页面主要实现查询、存款、取款、转账、修改密码、退出、注销账户功能。

    /* 进入个人主页面 */
    public static void enterSystem(Scanner scanner, List accounts, Account account) {
        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、注销账户");
            int type = scanner.nextInt();
            switch (type) {
                case 1:
                    showAccount(account);
                    break;
                case 2:
                    depositMoney(scanner, accounts, account);
                    break;
                case 3:
                    drawMoney(scanner, accounts, account);
                    break;
                case 4:
                    transferMoney(scanner, accounts, account);
                    break;
                case 5:
                    updatePassword(scanner, accounts, account);
                    return;
                case 6:
                    logout(accounts);
                    return;
                case 7:
                    destroyAccount(accounts, account);
                    return;
                default:
            }
        }
    }

2.1 查询

主要展示当前登录账户信息。

    /* 展示账户信息 */
    public static void showAccount(Account account) {
        System.out.println("==========当前账户信息==========");
        System.out.println("卡号:" + account.getCardId() + "\n" + "户主:" + account.getUserName() + "\n" + "余额:" + account.getMoney() + "\n" + "当次取现额度:" + account.getQuotaMoney());
    }

2.2 存款

实现逻辑:
1、当前账户调用存款方法进行存款。
2、存款完成展示当前账户最新信息。

    /* 存款 */
    public static void inMoney(Scanner scanner, List accounts, Account account) {
        System.out.println("==========存款操作==========");
        System.out.println("请输入存款金额:");
        double money = scanner.nextDouble();
        account.inMoney(money);
        System.out.println("存款完成!");
        showAccount(account);
    }

2.3 取款

实现逻辑:
1、当前账户调用取款方法进行取款。
2、根据当前账户取款方法返回值给出相应的提示。
3、取款完成展示当前账户最新信息。

    /* 取款 */
    public static void outMoney(Scanner scanner, List accounts, Account account) {
        System.out.println("==========取款操作==========");
        while (true) {
            System.out.println("请输入取款金额:");
            double money = scanner.nextDouble();
            int status = account.outMoney(money);
            switch (status) {
                case 1:
                    System.out.println("取款完成!");
                    showAccount(account);
                    return;
                case 0:
                    System.out.println("账户余额不足!");
                    break;
                case 2:
                    System.out.println("超出单次取现额度!");
                    break;
                default:
                    System.out.println("系统故障!");
            }
        }
    }

2.4 转账

实现逻辑:
1、判断当前系统中账户个数。
2、判断当前账户余额。
3、判断转账账户是否存在。
4、判断转账账户是否是自己。
5、对接收账户进行信息确认。
6、判断当前账户取款方法返回值。
7、转账成功展示当前账户最新信息。

    /* 转账 */
    public static void transferMoney(Scanner scanner, List accounts, Account account) {
        System.out.println("==========转账操作==========");
        if (accounts.size() < 2) {
            System.out.println("当前只有一个账号,暂无法转账!");
            enterSystem(scanner, accounts, account);
            return;
        }
        if (account.getMoney() == 0) {
            System.out.println("对不起,您的账户没钱,就别转了~~");
            return;
        }
        while (true) {
            System.out.println("请输入转账账号:");
            Account a = queryAccountByCardId(accounts, scanner.next());
            if (a == null) {
                System.out.println("账号不存在!");
            } else  {
                if (account.getCardId().equals(a.getCardId())) {
                    System.out.println("您不可以给自己转账!");
                    continue;
                }
                System.out.println("请确认【*" + a.getUserName().substring(1) + "】的姓氏:");
                String surname = scanner.next();
                if (surname.equals(a.getUserName().substring(0, 1))) {
                    while (true) {
                        System.out.println("请输入转账金额:");
                        double money = scanner.nextDouble();
                        int status = account.outMoney(money);
                        switch (status) {
                            case 1:
                                a.inMoney(money);
                                System.out.println("转账成功!您为" + a.getUserName() + "转账了:" + money);
                                showAccount(account);
                                return;
                            case 0:
                                System.out.println("账户余额不足!您最多可以转:" + account.getMoney());
                                break;
                            case 2:
                                System.out.println("超出单次取现额度!");
                                break;
                            default:
                                System.out.println("系统故障!");
                        }
                    }
                } else {
                    System.out.println("对不起,您认证的信息错误!");
                }
            }
        }
    }

2.5 修改密码

实现逻辑:
1、旧密码确认。
2、判断两次输入的新密码是否一致。
3、修改当前账户密码。
4、在循环的switch中直接return结束循环返回到系统主页面。

    /* 修改密码 */
    public static void updatePassword(Scanner scanner, List accounts, Account account) {
        System.out.println("==========修改密码操作==========");
        while (true) {
            System.out.println("请输入密码:");
            String password = scanner.next();
            if (password.equals(account.getPassword())) {
                break;
            } else {
                System.out.println("密码错误!");
            }
        }
        while (true) {
            System.out.println("请输入新密码:");
            String password1 = scanner.next();
            System.out.println("请确认新密码:");
            String password2 = scanner.next();
            if (password1.equals(password2)) {
                System.out.println("密码修改成功!");
                account.setPassword(password1);
                break;
            } else {
                System.out.println("密码不一致!");
            }
        }
    }

2.6 退出

实现逻辑:
1、给出提示之后在循环的switch中直接return结束循环返回到系统主页面。

    /* 退出 */
    public static void logout(List accounts) {
        System.out.println("欢迎下次光临!");
    }

2.7 注销账户

实现逻辑:
1、将当前账户从账户集合中移除。
2、在循环的switch中直接return结束循环返回到系统主页面。

    /* 注销账户 */
    public static void destroyAccount(List accounts, Account account) {
        accounts.remove(account);
        System.out.println("您的账户已注销!");
    }

总结

以上就是关于Java仿ATM操作系统实现的全部内容。

如果有什么问题,我们可以一起交流讨论解决。

最后,希望可以帮助到有需要的码友。

你可能感兴趣的:(Java仿ATM操作系统)