每一年都奔走在自己热爱里

荣耀的背后刻着一道孤独

ATM


ATM

首页和账户类名

image-20220331152957554

image-20220331153112363

用户开户功能

image-20220331155607962

image-20220331184355603

登录功能

image-20220331184557963

image-20220331191426462

用户存款功能

image-20220401162728252

取款功能

image-20220401164057201

用户转账功能

image-20220401191554226

修改密码

image-20220401195147552

Account类

package ATM;
/*
* 账户类
*
* */
public class Account {

   /*
   * 成员变量
   *
   * */
   private  String cardId;//卡号
   private String username;//姓名
   private String passWord;//密码
   private double money;// 余额
   private double quotemoney;//每次取现额度

   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 getQuotemoney() {
       return quotemoney;
  }

   public void setQuotemoney(double quotemoney) {
       this.quotemoney = quotemoney;
  }
}

AccountSystem

package ATM;
import com.sun.xml.internal.stream.StaxXMLInputSource;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
/*系统入口
* */
public class AcountSystem {
   public static void main(String[] args) {
       /*
        * 定义一个集合容器,用来存放所有的账户对象,进行相关的操作
        * */
       ArrayList<Account> accounts = new ArrayList<>();
       /*
        * 展示系统的首页
        * 快捷键:ctrl+alt+t
        * */
       /*
        * 用户用键盘输入
        * */
       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();
           /*
            * 单个值问一问是1还是2想到用seitch
            * */
           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("=================进入登录功能===========================");
//       判断用户集合中是否存在账户,用户集合中没有账户
       if(accounts.size()==0){
           System.out.println("对不起,当前系统没有任何账户,请先开户");
           return;//结束方法的执行
      }else{
       /*
       * 正式进入登录操作
       * */
           while (true) {
               System.out.println("请输入卡号:");
               String cardId=sc.next();
               /*判断卡号是否存在
               * 根据卡号查找账户对象
               * */
               Account acc = getAccountByCardId(cardId, accounts);
               if (acc!=null){
                   // 说明卡号存在
//                   用户输入密码
                   /*
                   * 当输入密码有误时候,我们必须继续输入,所以使用死循环
                   * */
                   while (true) {
                       System.out.println("请您输入密码:");
                       String password = sc.next();
//                   判断当前账户的密码是否与输入账户的密码一致
                       if (password.equals(acc.getPassWord())){
                           System.out.println("恭喜您,"+acc.getUsername()+"登录成功了!您的卡号是:"+acc.getCardId());
                           /*
                           * 展示用户登录后的操作页
                           * 可以独立成方法
                           * */
                           showUsercommand(sc,acc,accounts);
                           //继续结束登录方法
                           return;
                      }else{
                           System.out.println("对不起,您输入的密码有误!");
                      }
                  }
              }else{
                   System.out.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.注销账户");
           while (true) {
               System.out.println("请选择:");//说明需要扫描器
               int command = sc.nextInt();
               /*
               * 单值匹配,用switch
               * */
               switch (command){
                   case 1:
       //               查询账户
                       showaccount(acc);
                       break;
                   case 2:
       //               存款
                       depositMoney(acc,sc);
                       break;
                   case 3:
       //               取款
                       drawMoney(acc,sc);
                       break;
                   case 4:
   //                   转账
                       transferMoney(accounts,acc,sc);
                       break;
                   case 5:
   //                   修改密码
                       /*
                       * 修改密码要知道账户
                       * */
                       UpdatePassword(acc,sc);
                       return;
                   case 6:
   //                   退出
                       System.out.println("欢迎下次光临!!");
                       /*
                       * 退出也就是回到首页,使用return不是break表示结束当前的方法
                       * */
                       return;
                   case 7:
   //                   注销账户
                       /*
                       * 直接从当前集合中删掉当前账户
                       * */
                       accounts.remove(acc);
                       System.out.println("销户成功");
                       /*
                       * return表示退出当前方法,回到首页
                       * */
                       return;
                   default:
                       System.out.println("输入不正确,请重新输入!");
              }
          }
      }
  }

   /**
    * 修改密码功能
    * @param acc
    */
   private static void UpdatePassword(Account acc,Scanner sc) {
       System.out.println("===================修改密码======================");
       while (true) {
           System.out.println("请您输入正确的密码:");
           String okpassword=sc.next();
           if (acc.getPassWord().equals(okpassword)){
               while (true) {
                   System.out.println("密码输入正确!");
                   System.out.println("请输入新密码:");
                   String newpassword = sc.next();
                   System.out.println("请再次输入新的密码:");
                   String oknewpassword = sc.next();
                   /*两次输入的密码一致
                   * */
                   if (oknewpassword.equals(newpassword)){
                       /*进入到修改密码
                       *覆盖就行*/
                       acc.setPassWord(newpassword);
                       return;
                  }else{
                       System.out.println("对不起,您输入的密码不一致");
                  }
              }


          }else{
               System.out.println("当前输入密码不对!");
          }
      }


  }

   /**
    * 转账功能
    * @param accounts
    * @param acc
    * @param sc
    */
   private static void transferMoney(ArrayList<Account> accounts, Account acc, Scanner sc) {
       /*
       * 1.判断系统中是否又两个以上的账户
       * */
       if(accounts.size()<2){
           System.out.println("对不起,系统中没有其他账户,您不可以转账");
           return;
      }
           /*2.判断自己的账户中是否有钱
           * */
        if(acc.getMoney()==0){
            System.out.println("对不起,您的系统中没有钱!");
            return;
        }
        /*开始转账逻辑
        * */
       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.getUsername().substring(1);
                   System.out.println("请您确认【"+name+"】的姓名");
                   /*
                   * 输入的姓名的姓
                   * */
                   String prename=sc.next();
                   /*
                   *
                   * 判断如果两个相同
                   * */
                   if(account.getUsername().startsWith(prename)){
                       /*
                       *
                       * 可以转账了
                       * */
                       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("恭喜转账成功,已经为"+account.getUsername()+"转账了"+money);
                           /*
                           * 看一下自己的账户里面的钱
                           * */
                           showaccount(acc);
                           return;
                      }
                  }else{
                       System.out.println("对不起,您的姓名输入有问题");
                  }
              }
          }else{
               System.out.println("对不起,您输入的卡号有问题!");
          }
      }
  }
   /**
    * 取款功能
    * @param acc
    * @param sc
    */
   private static void drawMoney(Account acc, Scanner sc) {
       System.out.println("=================取款功能=======================");
       double money = acc.getMoney();
       /*
       * 大于100才能取钱
       * */
       if (money<100){
           return;
      }else{
           while (true) {
               System.out.println("请输入要取款的金额:");
               double money1= sc.nextDouble();
               /*
               * 如果要取款的金额大于当前用户的当次限额,
               * 或者取款的金额大于当前账户的余额
               * 那么就不能进行取款
               * */
               if (money1>acc.getMoney()||money1> acc.getQuotemoney()){
                   System.out.println("对不起,您输入的金额超出了当前账户的余额或取款的金额大于当前账户的余额");
              }else{
                   /*
                   * 执行取款操作
                   * */
                 acc.setMoney(acc.getMoney()-money1);
                   System.out.println("取款操作已经完成!当前账户还剩:"+acc.getMoney());
                   /*
                    * 展示一下当前改完之后的用户信息,调用方法就可以了
                    * */
                   showaccount(acc);
              }
          }
      }
  }
   /**
    * 存款功能
    * @param acc
    */
   private static void depositMoney(Account acc,Scanner sc) {
       System.out.println("=============存钱操作====================");
       System.out.println("请您输入存入的金额:");
       /*
        * 这里看出需要键盘输入金额,所以需要一个扫描器,所以需要传入参数
        * */
       double money = sc.nextDouble();
       /*
       * 把金额修改到账户对象的money中去
       * */
       double money1 = acc.getMoney();
       acc.setMoney(money1+money);
       System.out.println("存款已经完成了!");
       /*
       * 展示一下当前改完之后的用户信息,调用方法就可以了
       * */
       showaccount(acc);
  }
   /**
    * 展示用户信息
    * @param acc
    */
   private static void showaccount(Account acc) {
       System.out.println("==============当前账户详情==================");
       /*
       *取出当前用户的情况,使用get方法
       * */
       System.out.println("当前账户卡号:"+acc.getCardId());
       System.out.println("当前账户姓名:"+acc.getUsername());
       System.out.println("当前账户余额:"+acc.getMoney());
       System.out.println("当前账户当次限额:"+acc.getQuotemoney());
  }
   /**
    * 用户开户功能的实现
    *
    * @param accounts 接收用户集合
    */
   private static void register(ArrayList<Account> accounts, Scanner sc) {
       System.out.println("=================系统开户操作====================");
//       创建一个账户对象,用于后期封装账户1信息
       Account account = new Account();
       /*
        * 录入当前的账户的信息到集合中去
        *
        * */
       System.out.println("情输入您的用户名:");
       String Username = sc.next();
       /*将键盘输入的username注入到account对象中去
        * 通过set方法注入
        * */
       account.setUsername(Username);
       /*
        * 因为不一致要重新来,所以需要死循环
        * */
       while (true) {
           System.out.println("请输入您的密码:");
           String password = sc.next();
           System.out.println("请再次输入您的密码:");
           String okpassword = sc.next();
           /*
            * 二次密码比较使用equals
            * 二次密码相等就可以注入给用户对象了
            * */
           if (password.equals(okpassword)) {
               account.setPassWord(password);
               break;//密码成功录入,所以跳出死循环
          } else {
               /*
                * 因为不一致要重新来,所以需要死循环
                * */
               System.out.println("对不起,您输入的两次密码不一致,请重新确认");
          }
      }
       System.out.println("请输入用户当前限额");
       double quotamoney = sc.nextDouble();
       account.setQuotemoney(quotamoney);
       /*
        * 为账户随机一个8位且与其他账户卡号不一样的号码
        *
        * */
       String cardId = getRandomCardId(accounts);
//       将卡号添加到开户账户中去
       account.setCardId(cardId);
       /*
       *
       * 把账户对象添加到账户集合中去,这样开户就完成了
       * */
       accounts.add(account);
       System.out.println("恭喜你,"+Username+"先生/女士您开户成功,您的卡号是:"+cardId+",请您妥善保管");
  }
   /**
    * 为账户随机一个8位且与其他账户卡号不一样的号码
    * 要保证不一样就是看这个账户有没有这个卡号
    *
    * @return 号码
    * 要保证不一样就是看这个账户有没有这个卡号
    */
   private static String getRandomCardId(ArrayList<Account> accounts) {
//       先生成8位数
       /*
       * 当没有进入到if语句时候,说明卡号是重复的,所以要重新生成卡号,所以要死循环
       * */
       while (true) {
           String cardId = "";
           Random r = new Random();
           for (int i = 0; i < 8; i++) {
               /*
                * 10表示0——9
                * */
               cardId += r.nextInt(10);
          }
//           判断这个8位的卡号是否与其他账户的卡号重复了
           /*
            * 拿着卡号去账户集合中查卡号,如果没有就是唯一的
            * 独立成一个方法
            * */
           Account acc = getAccountByCardId(cardId, accounts);
           if (acc == null) {
   //             说明没有重复,这个是新的卡号,可以使用这个卡号
               return cardId;
          }
      }
  }
   /**
    * 根据卡号查出账户
    * @return
    */
   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;//查无词账号
  }
}

 

 

 

posted @ 2022-04-03 09:40  学技术的小凯  阅读(20)  评论(0编辑  收藏  举报