1、账户类与首页设计

系统准备分析:

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

实现步骤:

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

账户类:

/*
账户类
 */
public class Account {
    /*
    成员变量私有
     */
    private String cardNumber;//卡号
    private String userName;//姓名
    private String passWord;//密码
    private double money;//余额
    private double quotaMoney;//取现额度

    public String getCardNumber() {
        return cardNumber;
    }

    public void setCardNumber(String cardNumber) {
        this.cardNumber = cardNumber;
    }

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

首页设计:

/*
    首页设计
     */
    public static void main(String[] args) {
        //1、定义账户类,用于后期创建账户对象封装用户的账户信息
        //2、定义一个集合,存储系统用户的账户对象
        ArrayList<Account> accounts = new ArrayList<>();
        //3、登录和注册功能
        Scanner sc = new Scanner(System.in);

        System.out.println("--------欢迎来到ATM系统--------");
        while (true){
            System.out.println("1、用户登录:");
            System.out.println("2、用户注册:");
            System.out.println("请您选择操作1/2:");
            int operation = sc.nextInt();//operation:操作
            switch (operation){
                case 1:
                    //定义一个用户登录的方法
                    logIN(accounts,sc);
                    break;
                case 2:
                    //定义一个用户注册的方法(alt加回车自动生成方法。)
                    signIn(accounts,sc);
                    break;
                    default:
                        System.out.println("对不起,您输入的操作命令有误,请重新输入-");
            }
        }
    }

2、用户注册功能实现

分析:

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

实现步骤:

  1. 定义一个注册的方法:signIn:private static void signIn(ArrayList<Account> accounts, Scanner sc)
  2. 键盘录入姓名、密码、确认密码(密码要保持一致)
  3. 生成账户卡号,卡号必须由系统自动生成8位数字(保证卡号的唯一性)
  4. 创建Account账户类对象用于封装账户信息(姓名、密码、卡号)
  5. 把Account账户类对象存入到集合accounts中去
/**
     *     用户注册的方法
     * @param accounts 接收的账户集合
     * @param sc
     */
    private static void signIn(ArrayList<Account> accounts, Scanner sc) {

        System.out.println("--------欢迎进入ATM注册界面--------");
        Account account = new Account();//新建一个账户
        System.out.println("请您输入您的姓名:");
        account.setUserName(sc.next());
        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.out.println("您输入的两次密码不一致,请重新输入。");
            }
        }
        System.out.println("请您设置当日取现额度:");
        account.setQuotaMoney(sc.nextDouble());

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

        accounts.add(account);//把这个对象放到集合里去
        System.out.println("恭喜您," + account.getUserName() + "先生/女士,您开户成功,你的卡号是:" + cardNumber + ",请你妥善保管卡号!");

    }

    /**
     *随机生成一个8位号码方法
     * @param accounts
     * @return
     */
    private static String getRandomCardNumber(ArrayList<Account> accounts) {
        Random r = new Random();
       while (true) {
           //1、生成八位数字
           String cardNumber = "";
           for (int i = 0; i < 8; i++) {
               cardNumber += r.nextInt(10);
           }

           //2、判断这8位数字有没有跟账户类集合里的卡名重复
           //根据这个卡号,去查询账户对象
           Account account = getAccountByCardNumber(cardNumber, accounts);
           if (account == null) {
               //说明卡号没有重复,说明这个卡号能使用,把这个卡号返回
               return cardNumber;
           }
       }
    }

    /**
     *根据卡号查出一个账户对象出来
     * @param cardNumber 卡号
     * @param accounts 全部账户的集合
     * @return
     */
    private static Account getAccountByCardNumber(String cardNumber,ArrayList<Account> accounts){
        for (int i = 0; i < accounts.size(); i++) {
            Account account = accounts.get(i);
            if (account.getCardNumber().equals(cardNumber)){
                return account;
            }
        }
        return null;//代表查无此账号
    }

3、用户登录功能实现

分析:

  1. 定义登录方法:private static void logIN(ArrayList<Account> accounts, Scanner sc)
  2. 让用户键盘录入卡号,根据卡号查询账户对象
  3. 如果没有找到账户对象,说明卡号不存在,提示继续输入卡号
  4. 如果找到了账户对象,说明卡号存在,继续输入密码
  5. 如果密码不正确,提示继续输入密码
  6. 如果密码正确,提示登录成功。
/**
     * 用户登录的方法
     * @param accounts 全部账户对象的集合
     * @param sc 扫描器
     */
    private static void logIN(ArrayList<Account> accounts, Scanner sc) {
        System.out.println("----------欢迎您进入ATM系统登录界面----------");
        //1、判断系统中有没有账户
        if (accounts.size() > 0 ){
            //1、进入登陆界面
            while (true){
                System.out.println("请输入您的卡号:");
                String userCardNumber = sc.next();
                //判断卡号是否存在
                Account account = getAccountByCardNumber(userCardNumber,accounts);
                if (account != null){//说明卡号存在
                    while (true) {
                        System.out.println("请输入您的密码:");
                        String UserPassWord = sc.next();
                        //判断密码正不正确。
                        if (account.getPassWord().equals(UserPassWord)){
                            System.out.println("欢迎您:" + account.getUserName() + "先生/女士。" +"您的卡号为:"+ account.getCardNumber());
                            //进入操作页面:查询。。。存款等等。。。。(方法)
                            operationInterface(account,accounts,sc);
                            return; // 干掉登录方法
                        }else{
                            System.out.println("您输入的密码不正确,请重新输入");
                        }
                    }
                }else{
                    System.out.println("您输入的卡号不存在,请重新输入");
                }


            }

        }else{
            System.out.println("系统里还没有账户,先去注册账户吧");
        }
    }

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

需求分析:

  1. 用户登录成功之后,需要进入用户操作界面
  2. 查询就是直接展示当前登录成功的账户对象信息
  3. 退出账户是需要回到首页
/**
     * 用户操作页面
      * @param account 现在登录的这个账户
     * @param accounts
     * @param sc
     */
    private static void operationInterface(Account account, ArrayList<Account> accounts, Scanner sc) {
        System.out.println("--------欢迎您进入银行ATM用户操作界面--------");
        while (true){
            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 operation = sc.nextInt();
            switch (operation){
                case 1:
                    queryAccount(account);
                    break;
                case 2:
                    depositMoney(account,sc);
                    break;
                case 3:
                    drawMoney(account,sc);
                    break;
                case 4:
                    transferAccounts(accounts,account,sc);
                    break;
                case 5:
                    changePassword(account,sc);
                    return;//退出这个方法,回到登录界面去(因为改了密码,需要重新登录)
                case 6:
                    System.out.println("退出成功,欢迎下次光临!");
                    return;//退出这个方法了,干掉用户登陆后操作页,回到首页
                case 7:
                    unsubscribe(accounts,account,sc);
                    return;//退出这个方法了,干掉用户登陆后操作页,回到首页
                default:
                        System.out.println("对不起,您输入的操作有误,请重新输入。");
            }
        }
    }


    /**
     * 1、查询功能
     * @param account 当前账户对象
     */
    private static void queryAccount(Account account) {
        System.out.println("欢迎您进入ATM用户详情界面");
        System.out.println("您的账户信息如下:");
        System.out.println("卡号:" + account.getCardNumber());
        System.out.println("姓名:" + account.getUserName());
        System.out.println("余额:" + account.getMoney());
        System.out.println("当次取现额度:" + account.getQuotaMoney());
    }
}

5、用户存取钱

存钱分析:

  1. 存钱就是拿到当前账户对象。
  2. 然后用户输入存款的金额。
  3. 调用用户对象的setMoney方法将账户余额修改成存钱后的余额。
/**
     * 2、存款
     * @param account 当前账户对象
     * @param sc 扫描器
     */
    private static void depositMoney(Account account,Scanner sc) {
        System.out.println("欢迎您进入ATM用户存款界面");
        System.out.println("请你输入存款的金额:");
        double money = sc.nextDouble();
        account.setMoney(account.getMoney()+money);
        System.out.println("恭喜您,存款成功!您的账户信息如下:");
        queryAccount(account);
    }

取钱分析:

  1. 取款需要先判断账户是否有钱
  2. 有钱则拿到自己账户对象
  3. 然后让用户输入取款金额
  4. 判断取款金额是否超出当日限额,以及余额是否足够
  5. 满足要求则调用账户对象的setMoney方法完成金额修改
/**
     * 3、取款
     * @param account 当前账户对象
     * @param sc
     */
    private static void drawMoney(Account account, Scanner sc) {
        System.out.println("欢迎您进入ATM用户取款界面");
        //先判断账户是否有100元,不足100元不能进行取款
        if (account.getMoney() < 100){
            System.out.println("对不起,您的账户余额不足100元,先去存钱吧!");
            return;//退出取款的方法,回到了用户操作界面
        }
        //进行取款
        while (true){
            System.out.println("请您输入取款的金额:");
            double drawMoney = sc.nextDouble();
            if (drawMoney > account.getQuotaMoney()){
                System.out.println("对不起,您的取款金额超出取现额度。您的取款额度为:" + account.getQuotaMoney());
            }else{
                //满足取款额度的条件,再判断余额是否够
                if (drawMoney>account.getMoney()){
                    System.out.println("对不起,您的余额不足。");
                }else{
                    account.setMoney(account.getMoney()-drawMoney);
                    System.out.println("取款成功!您账户还有" + account.getMoney() + "多钱。");
                    return;//取钱结束,要退出这个方法
                }
            }
        }
    }

6、转账功能

需求分析:

  1. 转账功能需要判断系统中是否由2个账户对象及以上
  2. 同时还要判断自己账户是否有钱
  3. 接下来需要输入对方卡号,判断对方账户是否存在
  4. 对方账户存在还需要认证对方户主的姓氏
  5. 满足要求则可以把自己账户对象的金额修改到对方的账户对象上
/**
     * 4、转账
     * @param accounts 全部账户集合
     * @param account 自己的账户对象
     * @param sc
     */
    private static void transferAccounts(ArrayList<Account> accounts, Account account, Scanner sc) {
        System.out.println("欢迎您进入ATM用户转账界面");
        //1、判断系统里是否有两个账户对象及以上
        if (accounts.size() < 2) {
            System.out.println("当前系统的账户不足2个,不能转账!");
            return;//退出这个转账方法
        }
        //2、判断自己账户是否有钱(如果自己账户0块钱,就不要转账了)
        if (account.getMoney()<0){
            System.out.println("您自己账户都没钱了,就别转帐了!");
            return;//退出这个转账方法
        }
        //3、开始转账
        while (true){
            //输入对方的卡号,判断是不是跟自己的一样,再判断账户是否存在
            System.out.println("输入对方的卡号:");
            String cardNumber = sc.next();
            //这个卡号不能是自己的
            if (cardNumber.equals(account.getCardNumber())){
                System.out.println("您不可以给自己转账哦!");
                continue;
            }
            //判断这个卡号是否存在
            Account account1 = getAccountByCardNumber(cardNumber,accounts);
            if (account1 != null){//说明这个卡号存在
                //首先认证他的姓氏:
                String str = "*" + account1.getUserName().substring(1);
                System.out.println("请输入对方的姓氏确定" + str);
                String lastName = sc. next();

                //判断输入的姓氏对不对
                if (account1.getUserName().startsWith(lastName)){//startsWith方法:判断姓名字符串的是不是以lastName字符开始
                    //可以进行转钱了。
                    while (true){
                        System.out.println("请你输入转账的金额:");
                        double transferAccountsMoney = sc.nextDouble();
                        //判断有没有这么多钱可以转
                        if (transferAccountsMoney>account.getMoney()){
                            System.out.println("您的账户没有那么多钱可以转账,您账户还有:" + account.getMoney());
                        }else{
                            //开始转账
                            account.setMoney(account.getMoney()-transferAccountsMoney);//转出
                            account1.setMoney(account1.getMoney()+transferAccountsMoney);//转入
                            System.out.println("转账成功,您的账户还有:" + account.getMoney());
                            return;
                        }
                    }
                }
            }else{
                System.out.println("您输入的卡号不存在。");
            }
        }
    }

7、用户修改密码和注销账户

/**
     *5、修改密码
     * @param account 当前登陆的账户对象
     * @param sc
     */
    private static void changePassword(Account account, Scanner sc) {
        System.out.println("欢迎您进入ATM用户修改密码界面");
        while (true){
            System.out.println("请您输入当前的密码:");
            String passWord = sc.next();
            //判断当前密码是否正确
            if (passWord.equals(account.getPassWord())){
                while (true){
                    System.out.println("请输入您要修改的密码:");
                    String newPassWord = sc.next();
                    System.out.println("请再次输入您要修改的密码:");
                    String okNewPassWord = sc.next();
                    //判断两次输入的密码一样吗?
                    if (newPassWord.equals(okNewPassWord)){
                        account.setPassWord(okNewPassWord);//新密码赋给set方法
                        System.out.println("恭喜您修改密码成功!请重新登陆");
                        return;//退出修改密码方法
                    }else{
                        System.out.println("对不起,您输入的两次密码不一致,请重新输入。");
                    }
                }
            }else{
                System.out.println("您好,密码输入错误,请重新输入。");
            }
        }
    }


    /**
     * 7、销户
     * @param accounts
     * @param account
     * @param sc
     */
    private static void unsubscribe(ArrayList<Account>accounts,Account account, Scanner sc) {
        System.out.println("欢迎您进入ATM用户销户界面");
        System.out.println("您真的要销户吗?y/f");
        String rs = sc.next();
        switch (rs){
            case "y":
                if (account.getMoney()>0){
                    System.out.println("对不起,您的账户还有钱,不允许销户。");
                }else{
                    accounts.remove(account);//从集合里直接删除account元素
                    System.out.println("您的账户已销户。");
                    return;
                }
                break;
            default:
                System.out.println("您的账户保留了。");
        }
    }