模拟ATM系统 —— 用户注册、登录和用户操作页设计 、查询账号、退出账号功能

开发工具:idea

一、项目步骤:
1.系统准备、首页设计
2.用户开户功能
3.用户登录功能
4.用户操作页设计 、查询账号、退出账号功能
5.用户存款功能
6.用户取款功能
7.用户转账功能
8.用户修改密码、注销账号功能

二、各部分内容和代码
1.系统准备、首页设计
分析:

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

实现步骤:

  • 定义账户类,用于后期创建账户对象封装用户的账户信息
  • 账户类中的信息至少包含:卡号、姓名、密码、余额、每次取现额度
  • 准备一个ArrayList的集合,用于存储系统用户的账户对象
//定义账户类
public class Account {
    private String carId;  //卡号
    private String userName; //用户名
    private String passWord;   //密码
    private double money; //余额
    private double quotaMoney;//每次取现额度

    public String getCarId() {
        return carId;
    }

    public void setCarId(String carId) {
        this.carId = carId;
    }

    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;
    }
}
import java.util.ArrayList;
import java.util.Scanner;
/**
 * ATM系统入口
 */
public class ATMSystem {
    public static void main(String[] args) {
//    1、定义账户类
//    2、定义一个集合容器,负责以后存储全部账号对象,进行相关业务操作
        ArrayList<Account> accounts = new ArrayList<>();
//    3、展示系统的首页
        while (true) {
            System.out.println("===================ATM系统=============================");
            System.out.println("1、账户登录");
            System.out.println("2、账户开户");

            Scanner sc = new Scanner(System.in);
            System.out.println("请您选择操作:");
            int command = sc.nextInt();

            switch (command){
                case 1:
    //                用户登录
                    break;
                case 2:
    //                用户开户
                    break;
                default:
                    System.out.println("您选择的操作不存在!!");
            }
        }
    }
}

2.用户开户功能
分析:
开户功能就是在系统的集合容器中存入一个新的账户对象的信息

实现步骤:
*开户应定义成一个方法,并且传入账户集合:public static void register(ArrayList accounts){...}
*创建一个Account账户类的对象用于封装账户信息(卡号、姓名、密码...)
*键盘输入姓名、密码、确认密码(两次密码保持一致)
*生成账户卡号、卡号必须是系统自动生成的8位数字(卡号唯一)(难点
*把Account账户对象存入到集合accounts中

把实现开户功能定义成一个独立的方法:register(accounts,sc);

/**
   * 用户开户功能
   * @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.out.println("对不起,您输入的密码不一致,请重新输入!");
          }
      }

      System.out.println("请您输入账户当此限额:");
      double quotaMoney = sc.nextDouble();
      account.setQuotaMoney(quotaMoney);

//        为账户随机生成8位且与其他账户不一样的卡号(独立功能,独立方法)
     String cardId = getRandomCardId(accounts);
      account.setCarId(cardId);

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


  /**
   * 为账户随机生成8位且与其他账户不一样的卡号
   * @return
   */
  private static String getRandomCardId(ArrayList<Account> accounts) {
      Random r = new Random();
      while (true) {
      //1、生成8位数字
          String cardId = "";
          for (int i = 0; i < 8; i++) {
              cardId += r.nextInt(10); //0~9
          }

      //  2、判断8位数字是否与其他账户重复
          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.getCarId().equals(cardId)){
              return acc; //卡号重复
          }
      }
      return null; //查无此人
  }

3.用户登录功能
分析:
*登录功能定义成一个方法,并且传入账户集合:public static void login(ArrayList accounts){...}
*让用户输入卡号,根据卡号去账户集合查询账户对象
*如果没有找到账户对象,说明登录卡号不存在,提示继续输入卡号
*如果找打账户对象,说明卡号存在,继续输入密码
*如果密码不正确,提示继续输入密码
*如果密码正确,登陆成功

把实现用户登录功能定义成一个独立的方法:login(accounts,sc);

  • 补充:卫语句就是把复杂的条件表达式拆分成多个条件表达式。

if(obj != null){
doSomething();
}

转换成卫语句以后的代码如下:
if(obj == null){
return;
}
doSomething();

  /**
    * 登录功能
    * @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; //卫语言风格,解决方法的执行
       }
       //2、正式进入登录
       while (true) {
           System.out.println("请您输入登录卡号:");
           String cardId = sc.next();
           //3、判断卡号是否存在,根据卡号去账户集合查询账户对象
           Account acc = getAccountByCardId(cardId, accounts);
           if (acc != null){
               //卡号存在
               //4、让用户输入密码,认证密码
               while (true) {
                   System.out.println("请您输入登录密码:");
                   String passWord = sc.next();
                   //判断当前账户对象的密码是否与用户输入的密码一致
                   if (acc.getPassWord().equals(passWord)){
                       //登录成功
                       System.out.println("恭喜您,"+acc.getUserName()+"先生/女士进入系统,您的卡号是:"+acc.getCarId());
                        //展示登录成功后的操作页
                       showUserCommand(sc,acc);
                       return; //跳出登录方法
                   }else {
                       System.out.println("对不起,您输入的密码有误!");
                   }
               }
           }else {
               System.out.println("对不起,您的卡号不存在!");
           }
       }
   }

4.用户操作页设计 、查询账号、退出账号功能
分析:
*用户登陆成功后,需要进入用户操作页
*查询——直接展示当前登录成功的账户对象的信息
*退出账户是需要回到首页的


 /**
     * 展示用户登录后的操作页
     */
    private static void showUserCommand(Scanner sc,Account acc) {
        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:
                    //存款
                    break;
                case 3:
                    //取款
                    break;
                case 4:
                    //转账
                    break;
                case 5:
                    //修改密码
                    break;
                case 6:
                    //退出
                    System.out.println("退出成功,欢迎下次光临!");
                    return; //让当前方法停止执行,跳出去
                case 7:
                    //注销账户
                    break;
            }
        }
    }

    /**
     * 展示用户信息
     * @param acc
     */
    private static void showAccount(Account acc) {
        System.out.println("================当前账户信息如下=======================");
        System.out.println("卡号:"+acc.getCarId());
        System.out.println("户主:"+acc.getUserName());
        System.out.println("余额:"+acc.getMoney());
        System.out.println("限额:"+acc.getQuotaMoney());
    }

实现效果:

posted @ 2022-03-19 19:42  luckylily  阅读(729)  评论(0)    收藏  举报