4.17总结

发布时间 2023-04-17 20:06:25作者: 封织云
package com.fzyun;

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

public class ATMSystem {
    public static void main(String[] args) {
        //1.定义一个账户类
        //2.定义一个集合容器,负责以后存储全部的账户对象,进行相关的业务操作
        ArrayList<Account> accounts = new ArrayList<>();
        Scanner sc = new Scanner(System.in);//放在外面节省内存。
        //3.展示系统的首页
        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:
                    //用户注册——创建方法,Alt+回车+回车
                    register(accounts,sc);
                    break;
                default:
                    System.out.println("您输入的操作命令不存在");
            }
        }
    }

    /**
     * 登录功能
     * @param accounts 全部账户对象集合
     * @param sc 扫描器
     */
    private static void login(ArrayList<Account> accounts, Scanner sc) {
        System.out.println("========系统登陆操作=======");
        //1.判断账户集合中是否存在账户,如果没有帐户,不能进行登陆操作
        if (accounts.size() == 0){
            System.out.println("对不起,此系统还没有任何账户,请先注册");
            return;//结束方法的执行,跳到case1 break
        }

        //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);
                    }else {
                        System.out.println("您输入的密码有误");
                    }
                }
            }else {
                System.out.println("系统中不存在该账户卡号q");
            }
        }
    }

    /**
     * 展示登陆后的操作页
     */
    private static void showUserCommand(Scanner sc , Account acc) {
        while (true) {
            System.out.println("========用户操作页=======");
            System.out.println("1.查询账户");
            System.out.println("1.存款");
            System.out.println("1.取款");
            System.out.println("1.转账");
            System.out.println("1.修改密码");
            System.out.println("1.退出");
            System.out.println("1.注销账户");
            System.out.println("请选择:");
            int command = sc.nextInt();
            switch (command){
                case 1:
                    //查询账户(当前登录的信息)
                    showAccount(acc);
                    break;
                case 2:
                    //存款
                    break;
                case 3:
                    //取款
                    break;
                case 4:
                    //转账
                    break;
                case 5:
                    //修改密码
                    break;
                case 6:
                    //退出
                    break;
                case 7:
                    //注销账户
                    break;
                default:
                    System.out.println("您输入的操作命令不争取");
            }
        }
    }

    /**
     * 方法目的:用户注册开户
     * private只能在本类中使用
     * @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 (okPassWord.equals(passWord)){
                //认证通过,可以注册
                account.setPassWord(okPassWord);
                break;//密码录入成功
            }else {
                System.out.println("您输入的两次密码不一致,请重新确认");
            }
        }
        System.out.println("请您输入账户当次限额:");
        double quotaMoney = sc.nextDouble();
        account.setQuotaMoney(quotaMoney);

        //为账户生成随机八位且与其他账号不重复的号码
        String carID = getRandomCardID(account);
        account.setCardID(carID);

        //3.    将账户对象添加到账户集合中
        account.add(account);
        System.out.println("恭喜您" + userName + "注册成功" + "请您妥善保管卡号");
    }

    /**
     * 为我们账户生成八位与其他账户卡号不同的号码
     * @return
     */
    private static String getRandomCardID(ArrayList<Account> accounts) {
        Random r = new Random();
        //1.先生成8位数字
        while (true) {
            String cardID = "";
            for (int i = 0; i < 8; i++) {//随机八个数字,将其连接起来
                cardID += r.nextInt(10);//bound 10,生成数字范围为0-9 10位数
            }

            //2.判断8位卡号是否重复,根据这个卡号去查询用户对象
            Account acc = getAccountByCardID(cardID,accounts);
            if (acc == null){
                //说明没有重复,是新卡号,可以作为新注册的账号
                return cardID;
            }
        }
    }

    /**
     * 根据卡号查询出一个账户对象
     * @param cardID 卡号
     * @param accound 全部账户集合
     * @return 账户对象//null
     */
    private static Account getAccountByCardID(String cardID , ArrayList<Account> accound){
        for (int i = 0; i < accound.size(); i++) {
            Account acc = accound.get(i);
            if (acc.getCardID().equals(cardID)){
                return acc;
            }
        }
        return null;//查无此账号
    }
}