从0到1,实现Java控制台版本的ATM管理系统

发布时间 2023-09-24 12:41:36作者: 奋斗的软件工程师

从0到1,实现Java控制台版本的ATM管理系统

​ 其实作为一名Java的程序猿,无论你是初学也好,大神也罢,管理系统一直都是一个非常好的例子,初学者主要是用数组、List等等来写出一个简易的管理系统.牛逼一点的大神则用数据库+swing来做一个有界面的管理系统,其实都并不会太难。

​ 今天我就先写一个简单的管理系统:用List来实现银行的ATM管理系统

1.ATM系统技术选型分析

技术点分析

1.1 面向对象编程

每个用户对象要对应一个账户对象,所以需要设计账户类Account

1.2 程序流程控制

需要结合分支、循环、跳转等相关操作控制程序的业务逻辑

1.3 使用集合容器

系统需要提供一一个容器用于存储这些账户对象的信息,我们选ArrayList集合,因为ArrayList底层是可变的数组,操作起来相比于数组较为方便一些

1.4 使用常见API

内容比较,分析,数据处理等需要用到String等常用API

2.学习收获

2.1 优秀的面向对象编程能力,清晰、缜密的业务、数据分析能力

2.2 形成良好的编码习惯,获得一定的编码经验

2.3 熟练使用程序流程技术来控制计算机完成自己的想法

2.4 形成Java编程的业务思维,和解决问题的能力,让基础知识形成体系,为后续学习Java高级技术做有
力支撑

3.功能分析

3.1 账户类、首页设计

分析:

①每个用户一个账户对象,需要设计账户类,账户类至少包含(卡号、用户名、余额、取现额度、密码)

1、用户的账户信息,系统如何表示的?

  • 定义账户类Account, 定义系统关心的属性信息。

一个标准类的书写应当包括如下细节:

  • 成员属性私有化

  • 提供空参/满参的构造方法

  • 提供get/set方法


public class Account {
  //成员属性

  //卡号
  private String cardID;

  //用户名
  private String userName;

  //密码
  private String passWord;

  //余额
  private double money;

  //取现额度
  private double quotaMoney;

  //提供空参/满参的构造方法

  public Account() {
  }

  public Account(String cardID, String username, String password, double money, double quotaMoney) {
    this.cardID = cardID;
    this.userName = username;
    this.passWord = password;
    this.money = money;
    this.quotaMoney = quotaMoney;
  }

  //提供get/和set方法


  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 getQuotaMoney() {
    return quotaMoney;
  }

  public void setQuotaMoney(double quotaMoney) {
    this.quotaMoney = quotaMoney;
  }
}

②系统采用什么来存储账户对象?

  • 需要定义一个ArrayList的集合用于存储账户对象。
//定义集合对象,存储所有账户信息
ArrayList<Account> accountList = new ArrayList<>();

③需要展示欢迎页包含2个功能:注册开户、登录账户。

==========欢迎您进入黑马银行ATM系统==========

1. 登录账户.

2. 注册账户.

3. 退出.

===========================================

3.2 用户开户功能实现

开户功能的实现需要哪几步操作,需要注意什么问题?

  • 开户功能 应该独立定义成方法,并传入当前集合对象给该方法。
  • 卡号 是通过设计的方法随机返回8个数字代表卡号,注意:卡号不能重复
  • 把开户的信 息封装成Account对象,存入到集合中。

分析

①开户功能应该独立定义成方法,并传入当前集合对象给该方法。

private static boolean registerAccount(ArrayList<Account> accountList, Scanner scanner)

②需要提示用户输入个人信息,开户的卡号是系统自动生成的8位数。

private static String createCardID(ArrayList<Account> accountList)

③注意:自动生成的卡号不能与其他用户的卡号重复。

private static Account isCardIDExisting(ArrayList<Account> accountList, String cardID)

④最终把用户开户的信息封装成Account对象,存入到集合中。

Account account = new Account(cardID, userName, passWord, 0.0, quotaMoney);//满参构造,初始化数据
accountList.add(account);

运行效果

==========欢迎您进入黑马银行ATM系统==========

1. 登录账户.

2. 注册账户.

3. 退出.

===========================================

请输入命令1、2、3. 选择对应的操作: 2

==========欢迎您进入黑马银行用户办卡界面==========

请输入您的姓名: 常州陪彭于晏

请输入您的密码: 9527

请再次输入您的密码: 9527

请设置当次取现额度: 15000

尊敬的常州陪彭于晏贵宾先生/女士,您的账户已经开卡成功,您的卡号是: 65301297.

注册成功~~~

3.3 用户登录功能实现

1、登录功能如何实现的?

  • 根据卡号去集合中查询对应的账户对象。
  • 如果找到了账户对象, 说明卡号存在,继续输入密码。
  • 如果密码也正确, 则登录成功。

分析
①需要根据卡号去集合中查询对应的账户对象。

private static Account isCardIDExisting(ArrayList<Account> accountList, String cardID) 

②如果找到了账户对象,说明卡号存在,继续输入密码。
③如果密码也正确,则登录成功。

运行效果

==========欢迎您进入黑马银行ATM系统==========

1. 登录账户.

2. 注册账户.

3. 退出.

=========================================

请输入命令1、2、3. 选择对应的操作: 1

==========黑马银行ATM系统登录界面==========

请输入您的卡号: 77711112

请输入您的密码: 9527

登录成功~~~

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

分析
①用户登录成功后,需要进入用户操作页。

 private static void showCommand(Account account, ArrayList<Account> accountList, Scanner scanner) 

②查询就是直接展示当前登录成功的账户对象的信息。

 private static void showAccountInfo(Account account) 

③退出账户是需要回到首页的。

运行效果

==========黑马银行ATM系统登录界面==========

请输入您的卡号: 37682957

请输入您的密码: 9527

登录成功~~~

尊敬的常州彭于晏贵宾先生/女士,您可以办理如下业务,您的卡号是37682957~~~

==========欢迎您进入黑马银行用户操作界面==========

1.查询.

2.存款.

3.取款.

4.转账.

5.修改密码.

6.退出.

7.注销当前账户.

============================================

请选择相关操作数:6

成功退出黑马银行用户操作界面~~~

==========欢迎您进入黑马银行ATM系统==========

1. 登录账户.

2. 注册账户.

3. 退出.

=========================================

请输入命令1、2、3. 选择对应的操作: 

3.5 用户存款、取款功能设计

分析
①存款和取款都是拿到当前用户的账户对象。

②通过调用账户对象的set方法修改其余额。

运行效果

尊敬的常州彭于晏贵宾先生/女士,您可以办理如下业务,您的卡号是18209986~~~

==========欢迎您进入黑马银行用户操作界面==========

1.查询.

2.存款.

3.取款.

4.转账.

5.修改密码.

6.退出.

7.注销当前账户.

============================================

请选择相关操作数:2

==========欢迎您进入黑马银行用户存款界面==========

请输入存款的金额:15000

==========欢迎您进入黑马银行用户详情界面==========

您的账户信息如下: 

卡号: 18209986

姓名: 常州彭于晏

余额: 15000.0元

当次取现额度: 15000.0元

===========================================

您已经存款成功~~~
    
==========欢迎您进入黑马银行用户取款界面==========

请输入取款的金额:26000

此次取款金额超出了当次取现额度~~~

请输入取款的金额:1000

==========欢迎您进入黑马银行用户详情界面==========

您的账户信息如下: 

卡号: 18209986

姓名: 常州彭于晏

余额: 14000.0元

当次取现额度: 15000.0元

===========================================

您已经取款成功~~~

3.6 用户转账功能设计

分析
①转账功能要分析对方账户是否存在的问题。
②还要分析自己的余额是否足够的问题。

3.7 用户密码修改功能、销户功能

分析
①修改密码就是把当前对象的密码属性使用set方法进行更新。
②销户是从集合对象中删除当前对象,并回到首页。

至此,ATM管理系统就在这里,是不是很简单呢?

4.部分源码展示

public class ATMSystem {

  public static void main(String[] args) {

    //定义集合对象,存储所有账户信息
    ArrayList<Account> accountList = new ArrayList<>();

    //键盘录入的对象
    Scanner scanner = new Scanner(System.in);


    //操作数
    int keyWord = 0;

    //循环标志
    boolean runningFlag = true;

    //登录/注册操作的返回值 成功/失败
    boolean status = true;

    while (runningFlag) {

      System.out.println("==========欢迎您进入黑马银行ATM系统==========\n");
      System.out.println("1. 登录账户.\n");
      System.out.println("2. 注册账户.\n");
      System.out.println("3. 退出.\n");
      System.out.println("=========================================\n");
      System.out.print("请输入命令1、2、3. 选择对应的操作: ");
      keyWord = scanner.nextInt();
      System.out.println();


      switch (keyWord) {
        case 1:
          //1. 登录 待实现
          //System.out.println("登录 待实现\n");
          status = loginAccount(accountList, scanner);
          if (status) {
            //System.out.println("登陆成功~~~\n");
          } else
            System.out.println("登录失败~~~\n");
          break;
        case 2:
          //2. 注册 待实现
          //System.out.println("注册 待实现\n");
          status = registerAccount(accountList, scanner);
          if (status)
            System.out.println("注册成功~~~\n");
          else
            System.out.println("注册失败~~~\n");
          break;
        case 3:
          runningFlag = false;
          System.out.println("成功退出黑马银行ATM系统,欢迎您下次使用~~~\n");
          break;
        default:
          System.out.println("\n您当前输入的命令不合法,请重新输入~~~\n");
          break;
      }
    }
  }

注册

  private static boolean registerAccount(ArrayList<Account> accountList, Scanner scanner) {
    System.out.println("==========欢迎您进入黑马银行用户办卡界面==========\n");

    System.out.print("请输入您的姓名: ");
    scanner.nextLine();
    String userName = scanner.nextLine();

    System.out.println();


    String passWord = "", rePassWord = "";

    while (true) {
      System.out.print("请输入您的密码: ");
      passWord = scanner.nextLine(); // 读取用户输入的密码
      System.out.println();

      System.out.print("请再次输入您的密码: "); // 再次确认密码
      rePassWord = scanner.nextLine(); // 读取用户再次输入的密码
      System.out.println();

      //检验用户两次输入的密码是否相同
      if (passWord.equals(rePassWord)) {
        break;
      } else {
        System.out.println("您2次输入的密码不一致,请核对后重新输入~~~\n");
      }
    }

    //银行系统生成银行卡号,开户的卡号是系统自动生成的8位数
    String cardID = createCardID(accountList);


    //现阶段还未学到日期类,没法统计每天取多少钱,本次只作当次取现额度,等日后学习至日期类,再作变更
    System.out.print("请设置当次取现额度: ");//一次最多取多少钱
    double quotaMoney = scanner.nextDouble();
    System.out.println();

    Account account = new Account(cardID, userName, passWord, 0.0, quotaMoney);//满参构造,初始化数据

    accountList.add(account);

    System.out.println("尊敬的" + account.getUsername() + "贵宾先生/女士,您的账户已经开卡成功,您的卡号是: " + account.getCardID() + ".\n");

    return true;
  }

完整代码详见:https://gitee.com/AIITCherry/to-do-list

程序运行演示视频详见:https://www.bilibili.com/video/BV1J84y1D75i/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=2b0d1f971a9cdc1466c16aeece19350d