Java实现ATM项目

ATM系统

系统内容分析

  1. 每个用户的账户信息都是一个对象,需要提供账户类。
  2. 需要准备一个容器,用于存储系统全部账户对象信息。
  3. 首页只需要包含:登录和注册两个功能。

实现步骤

  1. 定义账户类,用于后期创建账户对象封装用户的账户信息。
  2. 账户类中的信息至少包含(卡号、姓名、密码、余额、取现额度)
  3. 需要准备一个ArrayList的集合,用于存储系统用户的账户对象。
  4. 需要展示欢迎页包含2个功能:开户功能、登录功能。
package com.ATM;

public class Account {
    private String cardId;//卡号
    private String name;//姓名
    private String password;//密码
    private Double money;//余额
    private Double quotaMoney;//当次取现额度


    public Account() {
    }

    public Account(String cardId, String name, String password, Double money, Double quotaMoney) {
        this.cardId = cardId;
        this.name = name;
        this.password = password;
        this.money = money;
        this.quotaMoney = quotaMoney;
    }

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    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.ATM;

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

public class ATMSystem {
    public static void main(String[] args) {
        //1.定义一个ArrayList集合
        ArrayList<Account> accounts = new ArrayList<>();

        //2.准备系统首页的登录,开户
        showMain(accounts);

    }
    
    public static void showMain(ArrayList<Account> accounts){
        System.out.println("===========欢迎进入首页===========");
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入你想输入的操作:");
            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("无效指令");
            }
        }
    }
  
}
output:
===========欢迎进入首页===========
请输入你想输入的操作:
1.登录
2.开户
您可以输入命令了!

开户功能的实现

分析

  • 开户功能其实就是往系统的集合容器中存入一个新的账户对象的信息。

开户功能实现步骤

  1. 定义开户方法完成开户
  2. 键盘录入姓名、密码、确认密码(需保证两次密码一致)
  3. 生成账户卡号,卡号必须由系统自动生成8位数字(必须保证卡号的唯一)
  4. 创建Account账户类对象用于封装账户信息(姓名,卡号,密码)
  5. 把Account账户类对象存入到集合accounts中去。
  /**
     * 用户开户功能
     *
     * @param accounts 账户的集合对象
     * @param sc       扫描器的对象
     */
    private static void register(ArrayList<Account> accounts, Scanner sc) {
        System.out.println("=========用户开户功能========");
        //2.键盘录入   姓名   密码  确认密码
        System.out.println("请输入开户名称:");
        String name = sc.next();
        String password = "";
        while (true) {
            System.out.println("请输入开户密码:");
            password = sc.next();
            System.out.println("请再次确认密码:");
            String okPassword = sc.next();
            //判断两次输入的密码是否一致
            if (okPassword.equals(password)) {
                break;
            } else {
                System.out.println("两次密码输入不一致,请重新输入!");
            }
        }
        System.out.println("请输入当日限额:");
        Double quotaMoney = sc.nextDouble();

        //3.生成账户卡号,卡号必须由系统自动生成8位数字(必须保证卡号的唯一)
        String cardId = creatCardId(accounts);

        //4.创建Account账户类对象用于封装账户信息(姓名,卡号,密码)
        Account account = new Account(cardId, name, password, quotaMoney);

        //5.把Account账户类对象存入到集合accounts中去。
        accounts.add(account);
        System.out.println("恭喜您,开户成功!您的卡号是:"+account.getCardId()+"请妥善保管!");
    }

	 /**
     * 生成账户卡号,卡号必须由系统自动生成8位数字(必须保证卡号的唯一)
     * @param accounts
     * @return
     */
    public static String creatCardId(ArrayList<Account> accounts) {
        while (true) {
            //生成8位随机的数字代表卡号
            String cardId = "";
            Random r = new Random();
            for (int i = 0; i < 8; i++) {
                int id = r.nextInt(10);
                cardId += id;
            }
            //判断卡号是否重复
            Account account = getAccountByCardId(cardId, accounts);
            if (account == null) {
                //说明当前卡号没有重复
                return cardId;
            }
        }
    }

    /**
     * 根据卡号到集合中去查询账户对象,判断卡号是否重复
     *
     * @param cardId
     * @return
     */
    public 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 accounts)
  2. 让用户键盘录入卡号,根据卡号查询账户对象
  3. 如果没有找到账户对象,说明卡号不存在,提示继续输入卡号
  4. 如果找到了对象说明卡号存在,继续输入密码
  5. 如果密码不正确,提示继续输入密码
  6. 如果密码正确,提示登录成功!
 /**
     * 完成用户登录
     *
     * @param accounts
     * @param sc
     */
    private static void login(ArrayList<Account> accounts, Scanner sc) {
        if (accounts.size()==0){
            //没有任何账户
            System.out.println("当前系统中无任何账户,您需要先注册!");
            return;//直接结束方法的执行!
        }
        System.out.println("==========用户登录==========");
        //2.让用户键盘录入卡号,根据卡号查询账户对象
        while (true) {
            System.out.println("请输入卡号:");
            String cardId = sc.next();
            //根据卡号查询对象
            Account acc = getAccountByCardId(cardId, accounts);
            //3.如果没有找到账户对象,说明卡号不存在,提示继续输入卡号
            if (acc != null) {
                while (true) {
                    //4.卡号存在,提示用户继续输入密码
                    System.out.println("请输入密码:");
                    String password = sc.next();
                    //5.判断密码是否正确
                    if (acc.getPassword().equals(password)) {
                        //密码正确,登录成功!
                        System.out.println("恭喜您,"+acc.getName()+"先生/女生,成功进入系统!");
                        //展示系统登录后的操作页面
                    } else {
                        System.out.println("您输入的密码有误,请重新输入!");
                    }
                }
            } else {
                System.out.println("卡号不存在,请继续输入卡号:");
            }
        }
    }

用户操作页设计、查询账户、退出账户功能实现

分析

  1. 用户登录成功后,需要进入到用户操作页
  2. 查询就是直接展示当前登录成功的账户对象的信息
  3. 退出账户是要回到首页的

用户存款

存款分析

  1. 存款就是拿到当前账户对象
  2. 然后让用户输入存款的金额
  3. 调用账户对象的setMoney方法将账户中的余额修改成存钱后的余额
  4. 存钱后需要查询一下账户信息,确认是否存钱成功了!
/**
     * 存钱的操作
     * @param acc
     * @param sc
     */
    private static void depositMoney(Account acc,Scanner sc) {
        System.out.println("=========存款操作===========");
        System.out.println("请输入存款金额:");
        double money = sc.nextDouble();

        // 直接把金额修改到账户对象的money中去
        acc.setMoney(acc.getMoney()+money);
        System.out.println("存款完成!");
        showAccount(acc);

    }

取款分析

  • 取款需要判断账户是否有钱
  • 有钱则拿到自己的账户对象
  • 然后让用户输入取款金额
  • 判断金额是否超过了当次限额,以及余额是否足够
  • 满足要求则调用账户对象的setMoney方法完成金额的修改
  /**
     * 取款功能
     * @param acc
     * @param sc
     */
    private static void drawMoney(Account acc, Scanner sc) {
        System.out.println("=========取款操作===========");
        //判断账户余额是否大于100元
        if (acc.getMoney() >= 100) {
            while (true) {
                System.out.println("请输入取款金额:");
                double money = sc.nextDouble();
                //判断取款金额有没有超过单次限额
                if (money <= acc.getQuotaMoney()) {
                    //判断余额是否大于取款金额
                    if (acc.getMoney() >= money) {
                        //够钱,允许取款
                        acc.setMoney(acc.getMoney() - money);
                        System.out.println("取款" + money + "元成功,还剩" + acc.getMoney());
                        return;//取钱后,干掉取款方法
                    }
                } else {
                    System.out.println("此次取款超过单次取款限额,请少取点!");
                }
            }
        } else {
            System.out.println("余额低于最低取款标准!");
        }
    }

用户转账功能

分析

  1. 转账功能需要判断系统中是否有2个账户对象及以上
  2. 同事还要判断自己账户是否有钱
  3. 接下来要输入对方卡号,判断对方账户是否存在
  4. 对方账户存在还要认证对方户主的姓氏
  5. 满足要求则可以把自己账户对象的金额修改到对方账户对象中去

销户

  • 修改密码就是把当前对象的密码属性使用set方法进行更新
 /**
     * 修改密码
     *
     * @param acc
     * @param sc
     */
    private static void updatePassWord(Account acc, Scanner sc) {
        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 okNewPassWord = sc.next();
                    if (newPassWord.equals(okNewPassWord)) {
                        //可以进行修改
                        acc.setPassword(okNewPassWord);
                        System.out.println("密码修改成功!");
                        return;
                    } else {
                        System.out.println("两次密码输入的不一致!");
                    }
                }
            } else {
                System.out.println("你输入的旧密码有误!");
            }
        }
    }
  • 销户是从集合对象中删除当前对象,并返回首页

全部代码

package com.ATM;

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

public class ATMSystem {
    public static void main(String[] args) {
        //1.定义一个ArrayList集合
        ArrayList<Account> accounts = new ArrayList<>();

        //2.准备系统首页的登录,开户
        showMain(accounts);

    }

    public static void showMain(ArrayList<Account> accounts) {
        System.out.println("===========欢迎进入首页===========");
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入你想输入的操作:");
            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) {
        if (accounts.size() == 0) {
            //没有任何账户
            System.out.println("当前系统中无任何账户,您需要先注册!");
            return;//直接结束方法的执行!
        }
        System.out.println("==========用户登录==========");
        //2.让用户键盘录入卡号,根据卡号查询账户对象
        while (true) {
            System.out.println("请输入卡号:");
            String cardId = sc.next();
            //根据卡号查询对象
            Account acc = getAccountByCardId(cardId, accounts);
            //3.如果没有找到账户对象,说明卡号不存在,提示继续输入卡号
            if (acc != null) {
                while (true) {
                    //4.卡号存在,提示用户继续输入密码
                    System.out.println("请输入密码:");
                    String password = sc.next();
                    //5.判断密码是否正确
                    if (acc.getPassword().equals(password)) {
                        //密码正确,登录成功!
                        System.out.println("恭喜您," + acc.getName() + "先生/女生,成功进入系统!");
                        //展示系统登录后的操作页面
                        showUserCommand(acc, sc, accounts);
                        return;//结束登录方法
                    } else {
                        System.out.println("您输入的密码有误,请重新输入!");
                    }
                }
            } else {
                System.out.println("卡号不存在,请继续输入卡号:");
            }
        }
    }

    private static void showUserCommand(Account acc, Scanner sc, 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:
                    //取款
                    drawMoney(acc, sc);
                    break;
                case 4:
                    //转账
                    transferMoney(acc, accounts, sc);
                    break;
                case 5:
                    //修改密码
                    updatePassWord(acc, sc);
                    break;
                case 6:
                    //退出
                    System.out.println("欢迎下次光临系统!");
                    return;//结束当前操作的方法!
                case 7:
                    //注销
                    accounts.remove(acc);
                    System.out.println("销户成功!");
                    return;
                default:
                    System.out.println("您输入的指令有误!请重新输入");
            }
        }
    }

    /**
     * 修改密码
     *
     * @param acc
     * @param sc
     */
    private static void updatePassWord(Account acc, Scanner sc) {
        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 okNewPassWord = sc.next();
                    if (newPassWord.equals(okNewPassWord)) {
                        //可以进行修改
                        acc.setPassword(okNewPassWord);
                        System.out.println("密码修改成功!");
                        return;
                    } else {
                        System.out.println("两次密码输入的不一致!");
                    }
                }
            } else {
                System.out.println("你输入的旧密码有误!");
            }
        }
    }

    /**
     * 转账
     *
     * @param acc
     * @param accounts
     * @param sc
     */
    private static void transferMoney(Account acc, ArrayList<Account> accounts, Scanner sc) {
        //1.转账功能需要判断系统中是否有2个账户对象及以上
        if (accounts.size() < 2) {
            System.out.println("系统中没有其他的账户供您转账!");
            return;
        }

        //2.同时还要判断自己账户是否有钱
        if (acc.getMoney() == 0) {
            System.out.println("你自己都没钱了就别转了吧!");
            return;
        }

        //3.开始转账逻辑
        // 接下来要输入对方卡号,判断对方账户是否存在
        while (true) {
            System.out.println("请输入对方卡号");
            String cardId = sc.next();
            Account account = getAccountByCardId(cardId, accounts);
            //判断这个账户对象是否存在
            if (account != null) {
                //判断这个账户对象是否是自己
                if (acc.getCardId().equals(account.getCardId())) {
                    //正在给自己转账
                    System.out.println("您不可以给自己转账");
                } else {
                    //确认对方的姓氏
                    String name = "*" + account.getName().substring(1);
                    System.out.println("请您确认【" + name + "】的姓氏");
                    String preName = sc.next();
                    //判断
                    if (account.getName().startsWith(preName)) {
                        //真正开始转账
                        System.out.println("请输入转账的金额:");
                        double money = sc.nextDouble();
                        if (acc.getMoney() > money) {
                            acc.setMoney(acc.getMoney() - money);
                            account.setMoney(account.getMoney() + money);
                            System.out.println("恭喜你为" + account.getName() + "转账:" + money + "元成功!");
                            showAccount(acc);
                            return;
                        } else {
                            System.out.println("你的余额不足以转账!你最多可以转" + acc.getMoney());
                        }
                    } else {
                        System.out.println("对不起,您输入的信息有误!");
                    }
                }

            } else {
                System.out.println("你转账的卡号有问题!");
            }
        }
    }

    /**
     * 取款功能
     *
     * @param acc
     * @param sc
     */
    private static void drawMoney(Account acc, Scanner sc) {
        System.out.println("=========取款操作===========");
        //判断账户余额是否大于100元
        if (acc.getMoney() >= 100) {
            while (true) {
                System.out.println("请输入取款金额:");
                double money = sc.nextDouble();
                //判断取款金额有没有超过单次限额
                if (money <= acc.getQuotaMoney()) {
                    //判断余额是否大于取款金额
                    if (acc.getMoney() >= money) {
                        //够钱,允许取款
                        acc.setMoney(acc.getMoney() - money);
                        System.out.println("取款" + money + "元成功,还剩" + acc.getMoney());
                        return;//取钱后,干掉取款方法
                    }
                } else {
                    System.out.println("此次取款超过单次取款限额,请少取点!");
                }
            }
        } else {
            System.out.println("余额低于最低取款标准!");
        }
    }

    /**
     * 存钱的操作
     *
     * @param acc
     * @param sc
     */
    private static void depositMoney(Account acc, Scanner sc) {
        System.out.println("=========存款操作===========");
        System.out.println("请输入存款金额:");
        double money = sc.nextDouble();

        // 直接把金额修改到账户对象的money中去
        acc.setMoney(acc.getMoney() + money);
        System.out.println("存款完成!");
        showAccount(acc);

    }

    private static void showAccount(Account acc) {
        System.out.println("=========当前账户详情===========");
        System.out.println("卡号:" + acc.getCardId());
        System.out.println("姓名:" + acc.getName());
        System.out.println("余额:" + acc.getMoney());
        System.out.println("当日限额:" + acc.getQuotaMoney());
    }

    /**
     * 用户开户功能
     *
     * @param accounts 账户的集合对象
     * @param sc       扫描器的对象
     */
    private static void register(ArrayList<Account> accounts, Scanner sc) {
        System.out.println("=========用户开户功能========");
        //2.键盘录入   姓名   密码  确认密码
        System.out.println("请输入开户名称:");
        String name = sc.next();
        String password = "";
        while (true) {
            System.out.println("请输入开户密码:");
            password = sc.next();
            System.out.println("请再次确认密码:");
            String okPassword = sc.next();
            //判断两次输入的密码是否一致
            if (okPassword.equals(password)) {
                break;
            } else {
                System.out.println("两次密码输入不一致,请重新输入!");
            }
        }
        System.out.println("请输入当日限额:");
        Double quotaMoney = sc.nextDouble();

        //3.生成账户卡号,卡号必须由系统自动生成8位数字(必须保证卡号的唯一)
        String cardId = creatCardId(accounts);

        //4.创建Account账户类对象用于封装账户信息(姓名,卡号,密码)
        Account account = new Account(cardId, name, password, quotaMoney);

        //5.把Account账户类对象存入到集合accounts中去。
        accounts.add(account);
        System.out.println("恭喜您,开户成功!您的卡号是:" + account.getCardId() + "请妥善保管!");
    }

    /**
     * 生成账户卡号,卡号必须由系统自动生成8位数字(必须保证卡号的唯一)
     *
     * @param accounts
     * @return
     */
    public static String creatCardId(ArrayList<Account> accounts) {
        while (true) {
            //生成8位随机的数字代表卡号
            String cardId = "";
            Random r = new Random();
            for (int i = 0; i < 8; i++) {
                int id = r.nextInt(10);
                cardId += id;
            }
            //判断卡号是否重复
            Account account = getAccountByCardId(cardId, accounts);
            if (account == null) {
                //说明当前卡号没有重复
                return cardId;
            }
        }
    }

    /**
     * 根据卡号到集合中去查询账户对象,判断卡号是否重复
     *
     * @param cardId
     * @return
     */
    public 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;//说明卡号没有重复
    }
}

posted @ 2022-01-07 22:26  tryAgainCs  阅读(342)  评论(0编辑  收藏  举报