简易的ATM银行系统(Java)

哈喽,我又来啦!好久没更新了,最近在复习Java基础,然后做了一个简单的ATM系统,可以实现开户,登录,查询,存款,取款,转账,修改密码,注销等简单的功能。

下面附上代码

首先是一个账户的实体类这里就没啥解释的了。

package ATM;

/**
 * @author 小于小于, 一条咸鱼
 * @date 2022/7/19 15:17
 */
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 ATM;

import org.omg.CORBA.ACTIVITY_COMPLETED;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

/**
 * @author 小于小于, 一条咸鱼
 * @date 2022/7/19 15:17
 */
public class ATMSystem {
    public static void main(String[] args) {
        //2、定义一个集合容器,负责以后存储全部的账户对象,进行相关的业务操作
        ArrayList<Account> accounts = new ArrayList<>();
        //3.系统页面展示
        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.err.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;
        }
        //2.正式进入登录操作
        while (true) {
            System.out.println("请您输入登录卡号");
            String cardId = sc.next();
            //3.判断卡号是否存在:根据卡号去账户集合中查询账户对象
            Account acc = getAccountByCardId(cardId,accounts);
            if (acc != null) {
                while (true) {
                    //说明卡号存在
                    //4.判断用户密码,认证密码
                    System.out.println("请输入密码:");
                    String passWord = sc.next();
                    //判断当前账户对象的密码是否与用户输入的密码一致
                    if (acc.getPassWord().equals(passWord)){
                        //登录成功。
                        System.out.println("恭喜您," +acc.getUserName()+"先生/女士进入系统,您的卡号是:" + acc.getCardId());
                        //....查询  转账  取款 ...
                        showUserCommand(sc,acc,accounts);
                        return;//干掉登录方法
                    }else {
                        System.err.println("对不起,您输入的密码有误,请重新输入~");
                    }
                }
            }else {
                System.err.println("对不起,系统中不存在该账户卡号~~·");
            }
        }
    }

    /**
     * 展示登录后的操作页
     */
    private static void showUserCommand(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 :
                    //查询账户
                    showAccount(acc);
                    break;
                case 2 :
                    //存款
                    depositMoney(acc,sc);
                    break;
                case 3 :
                    //取款
                    dropMoney(sc,acc);
                    break;
                case 4 :
                    //转账
                    transforMoney(acc, sc, accounts);
                    break;
                case 5 :
                    //修改密码
                    updatePassWord(acc, sc);
                    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 acc 当前登录账户对象
     * @param sc  扫描器
     */
    private static void updatePassWord(Account acc, Scanner sc) {
        System.out.println("==================用户密码修改======================");
        //1.判断密码是否正确’
        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)){
                        //2次密码一样,可以修改
                        acc.setPassWord(okPassword);
                        System.out.println("恭喜您密码修改成功");
                        return;
                    }else {
                        System.out.println("您输入的2次密码不一样~~~");
                    }
                }
            } else {
                System.out.println("您输入的密码不正确!!!");
            }
        }
    }

    /**
     * 转账
     *
     * @param acc      自己的账户
     * @param sc       扫描器
     * @param accounts 全部账户集合
     */
    private static void transforMoney(Account acc, Scanner sc, ArrayList<Account> accounts) {
        System.out.println("================用户转账操作===================");
        //1.判断是否足够两个账户
        if (accounts.size() < 2) {
            System.out.println("当前系统,不足两个账户,你要转账给鬼啊,赶紧去开户");
            return;
        }
        //2.开始转账
        if (acc.getMoney() == 0){
            System.out.println("小穷鬼,你自己都没钱,还想转账!");
            return;
        }
        while (true) {
            //3.开始转账
            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)){
                    //认证通过,真正开始转账
                    while (true) {
                        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());
                            System.out.println("恭喜"+account.getUserName()+"收到"+acc.getUserName()+"的转账"+money+"元。" + "你现在有"+account.getMoney() + money+"元");
                            return;
                        }
                    }
                } else {
                    System.out.println("对不起,您输入的信息有误");
                }

            }
        }
    }

    /**
     * 取钱
     *
     * @param sc  扫描器
     * @param acc 当前账户对象
     */
    private static void dropMoney(Scanner sc, Account acc) {
        System.out.println("============用户取钱操作================");
        //1.加判断是否足够100元
        if (acc.getMoney() <= 100){
            System.out.println("对不起,小穷鬼,你的账户没钱,赶紧去存钱!!!");
            return;
        }

        //2.提示用户输入取款金额
        while (true) {
            System.out.println("请您输入取款金额:");
            double money = sc.nextDouble();

            //3.判断这个金额是否满足要求。
            if(money > acc.getQuotaMoney()){
                System.out.println("对不起,您当前的取款金额超过每次取款限额!每次最多可以取:" + acc.getQuotaMoney());
            } else {
                // 没有超过当前限额
                //4.判断是否超过了账户的总金额
                if (money > acc.getMoney()){
                    System.out.println("没钱,去的太多了!");
                }else {
                    //可以取钱了
                    System.out.println("恭喜你取钱" + money + "元,成功!");
                    //更新余额
                    acc.setMoney(acc.getMoney() - money);
                    //取钱结束
                    showAccount(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("恭喜您,存钱成功,当前账户信息如下:");
        showAccount(acc);
    }

    /**
     * 展示账户信息
     *
     * @param acc acc
     */
    private static void showAccount(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("==============系统开户操作==================");
        //1.创建一个账户对象,用于后期封装用户信息。
        Account account = new Account();

        //2.录入当前这个账户的信息,注入到账户对象中去
        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.err.println("对不起,您输入的2次密码不一样,请重新输入~~~");
            }
        }
        System.out.println("请您输入账户当次限额:");
        double quotaMoney = sc.nextDouble();
        account.setQuotaMoney(quotaMoney);

        //为账户随机一个17位与其他账户卡号不能重复的号码(独立功能,独立成方法)。
        String cardId = getRandomCardId(accounts);
        account.setCardId(cardId);

        //3.把账户对象添加到账户集合中去。
        accounts.add(account);
        System.out.println("恭喜您," + userName + "先生/女士,您开户成功,您的卡号是:" + cardId + ",请您妥善保管您的卡号!");


    }

    /**
     * 为账户生成17位与其他账户卡号不同的号码
     *
     * @return
     */
    private static String getRandomCardId(ArrayList<Account> accounts) {
        //1.生成17位数字
        Random rand = new Random();
        while (true) {
            String cardId = "";
            for (int i = 0; i < 17; i++) {
                cardId += rand.nextInt(10);
            }
            //2.判断这个17位卡号是否与其他账户的卡号重复
            //根据这个卡号去查询账户对象
            Account acc = getAccountByCardId(cardId,accounts);
            if (acc == null) {
                // 说明cardId 此时没有重复,这个卡号是一个新卡号了,可以使用这个卡号作为新注册账号的卡号
                return cardId;
            }
        }
    }

    /**
     * 根据卡号查询出一个账户对象出来
     *
     * @param cardId   卡号
     * @param accounts  全部账户的集合
     * @return  账户对象 | 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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YHB0731

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值