IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 【Java基础笔记】第十三章 【综合项目】ATM系统模拟 -> 正文阅读

[开发测试]【Java基础笔记】第十三章 【综合项目】ATM系统模拟

前言

  • 该文章为Java基础自学笔记
  • 其他内容:Java基础学习笔记目录
  • 学习用书:
    《Java核心技术 卷Ⅰ 基础知识(第10版)》
    《Java经典编程300例》

第十三章 【综合项目】ATM系统模拟

13.1 ATM系统技术点分析

13.1.1 面向对象编程

  • 每个用户账户都是一个对象:需要设计账户类Account用于创建账户对象封装账户信息

13.1.2 程序流程控制

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

13.1.3 集合容器

  • 系统需要提供一个容器用于存储这些账户对象的信息(ArrayList集合)

13.1.4 使用常见API

  • 登录信息的内容比较,业务数据的分析、处理都需要用到String等常用API来解决

13.2 系统准备

  • 分析:
    • 每个用户的账户信息都是一个对象,需要提供账户类
  • 实现步骤:
    • 定义账户类,用于后期创建账户对象封装用户的账户信息
    • 账户类中的信息至少需要包含(卡号、姓名、密码、余额、取现额度)

系统准备代码

  • Account类:
/**
 * 账户类
 */
public class Account {
    // 账户ID
    private String userId;
    // 用户名称
    private String userName;
    // 用户密码
    private String password;
    // 账户余额
    private double balance;
    // 单次取现限额
    private double quota;

    public Account() {
    }

    public Account(String userId, String userName, String password, double quota) {
        this.userId = userId;
        this.userName = userName;
        this.password = password;
        this.quota = quota;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    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 getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }

    public double getQuota() {
        return quota;
    }

    public void setQuota(double quota) {
        this.quota = quota;
    }
}

13.3 首页设计

  • 分析:
    • 需要准备一个容器,用于存储系统全部账户对象信息
    • 首页只需要包含:登录和注册两个功能
  • 实现步骤:
    • 需要准备一个ArrayList集合,用于存储系统用户的账户对象
    • 需要展示欢迎页包含两个功能:用户注册、登录账户

首页设计代码

  • main方法:
	public static void main(String[] args) {
        // 创建账户集合对象
        ArrayList<Account> accounts = new ArrayList<>();
        // 创建扫描器对象
        Scanner sc = new Scanner(System.in);
        // 调用首页
        showMain(accounts, sc);
    }
  • 首页展示方法:
	/**
     * 首页
     * @param accounts 账户集合对象
     * @param sc       扫描器对象
     */
    private static void showMain(ArrayList<Account> accounts, Scanner sc) {
        while (true) {
            System.out.println("================欢迎进入ATM系统首页================");
            System.out.println("1.登录账户");
            System.out.println("2.注册账户");
            System.out.println("0.退出系统");
            System.out.print("请输入您的操作:");
            String command = sc.next();
            switch (command) {
                case "1":
                    // 登录账户
                    login(accounts, sc);
                    break;
                case "2":
                    // 注册账户
                    register(accounts, sc);
                    break;
                case "0":
                    // 退出系统
                    System.exit(1);
                default:
                    System.out.println("您输入的操作指令有误!请重新输入");
            }
        }
    }

首页设计测试

================欢迎进入ATM系统首页================
1.登录账户
2.注册账户
0.退出系统
请输入您的操作:

13.4 用户开户功能实现

  • 分析:
    • 开户功能是往系统的集合容器中存入一个新的账户对象的信息
  • 实现步骤:
    • 定义方法完成开户
    • 键盘录入姓名、密码、确认密码(保证两次密码一致)
    • 生成账户卡号,卡号由系统自动生成的以01开头的8位数字(保证卡号唯一)
    • 创建Account账户类对象用于封装账户信息(姓名、密码、卡号、限额)
    • 把Account账户类对象存入到集合accounts中

用户开户功能代码

  • 注册账户方法:
	/**
     * 注册账户
     * @param accounts 账户集合对象
     * @param sc       扫描器对象
     */
    private static void register(ArrayList<Account> accounts, Scanner sc) {
        System.out.println("==============欢迎进入ATM账户注册界面==============");
        System.out.print("请输入账户名称:");
        String userName = sc.next();
        String password;
        while (true) {
            System.out.print("请输入账户密码:");
            password = sc.next();
            if (password.length() < 6) {
                System.out.println("密码不得少于6位!");
                continue;
            }
            System.out.print("请输入确认密码:");
            String confirmPassword = sc.next();
            if (password.equals(confirmPassword)) {
                break;
            } else {
                System.out.println("两次输入的密码不一致!");
            }
        }
        System.out.print("请设置单次取现额度:");
        double quota = sc.nextDouble();
        // 随机生成10开头的8位用户ID
        String userId = creatUserId(accounts);
        // 将新创建的账户对象添加到账户集合中
        accounts.add(new Account(userId, userName, password, quota));
        System.out.println("恭喜您," + userName + "先生/女士,开户已完成,您的卡号是:" + userId);
    }   
  • 创建不重复的用户ID方法:
	/**
     * 创建不重复的用户ID
     * @param accounts 账户集合对象
     * @return
     */
    private static String creatUserId(ArrayList<Account> accounts) {
        Random r = new Random();
        while (true) {
            // 所有账户以10开头
            String userId = "10";
            // 随机生成后六位
            for (int i = 0; i < 6; i++) {
                userId += r.nextInt(10);
            }
            // 校验ID是否重复
            if (getAccountByUserId(userId, accounts) == null) {
                return userId;
            }
        }
    }
  • 通过用户ID查找账户方法:
	/**
     * 通过用户ID查找账户
     * @param userId   用户ID
     * @param accounts 账户集合对象
     * @return 账户对象
     */
    private static Account getAccountByUserId(String userId, ArrayList<Account> accounts) {
        for (Account account : accounts) {
            if (account.getUserId().equals(userId)) {
                return account;
            }
        }
        // 未找到返回full
        return null;
    }

用户开户功能测试

==============欢迎进入ATM账户注册界面==============
请输入账户名称:马云
请输入账户密码:123456
请输入确认密码:123456
请设置单次取现额度:5000
恭喜您,马云先生/女士,开户已完成,您的卡号是:10473645
  • 密码少于6位
请输入账户密码:12345
密码不得少于6位!
  • 第二次密码与第一次不一致
请输入账户密码:123456
请输入确认密码:123455
两次输入的密码不一致!

13.5 用户登录功能实现

  • 实现步骤:
    • 定义方法完成登录
    • 让用户键盘录入卡号,根据卡号查询账户对象
    • 如果没有找到账户对象,说明卡号不存在,提示继续输入卡号
    • 如果找到账户对象,说明卡号存在,继续输入密码
    • 如果密码不正确,提示继续输入密码
    • 如果密码正确,提示登录成功并进入用户操作页面

用户登录功能代码

  • 登录账户方法:
	/**
     * 登录账户
     * @param accounts 账户集合对象
     * @param sc       扫描器对象
     */
    private static void login(ArrayList<Account> accounts, Scanner sc) {
        // 无账户判断
        if (accounts.size() == 0) {
            System.out.println("当前系统无任何账户,请先注册再登录!");
            // 直接跳转注册界面
            register(accounts, sc);
            // 注册完可继续登录
        }
        System.out.println("==============欢迎进入ATM账户登录界面==============");
        // 输入卡号循环
        while (true) {
            System.out.print("请输入用户卡号:");
            String userId = sc.next();
            Account account = getAccountByUserId(userId, accounts);
            // 判断用户ID是否存在
            if (account == null) {
                System.out.println("卡号" + userId + "不存在,请确认卡号!");
                continue;
            }
            // 输入密码循环
            while (true) {
                System.out.print("请输入用户密码:");
                String password = sc.next();
                // 校验密码
                if (!password.equals(account.getPassword())) {
                    System.out.println("密码输入有误,请确认密码!");
                    continue;
                }
                System.out.println("登陆成功!欢迎" + account.getUserName() + "先生/女士进入系统!");
                // 进入用户操作界面
                showUserCommand(account, accounts, sc);
                // 从操作界面返回后直接跳出登录界面,返回系统首页
                return;
            }
        }
    }

用户登录功能测试

==============欢迎进入ATM账户登录界面==============
请输入用户卡号:10473645
请输入用户密码:123456
登陆成功!欢迎马云先生/女士进入系统!
  • 系统中未注册任何账户
当前系统无任何账户,请先注册再登录!
==============欢迎进入ATM账户注册界面==============
请输入账户名称:
  • 登录卡号错误
请输入用户卡号:123456
卡号123456不存在,请确认卡号!
  • 登录密码错误
请输入用户卡号:10473645
请输入用户密码:123455
密码输入有误,请确认密码!

13.6 用户操作页设计

用户操作页代码

 	/**
     * 用户操作界面
     * @param account  该用户账户对象
     * @param accounts 账户集合对象
     * @param sc       扫描器对象
     */
    private static void showUserCommand(Account account, ArrayList<Account> accounts, Scanner sc) {
        while (true) {
            System.out.println("==============欢迎进入ATM用户操作界面==============");
            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("0.退出登录");
            System.out.print("请输入您的操作:");
            String command = sc.next();
            switch (command) {
                case "1":
                    // 查询账户信息
                    showAccount(account);
                    break;
                case "2":
                    // 存款
                    deposit(account, sc);
                    break;
                case "3":
                    // 取款
                    withdrawal(account, sc);
                    break;
                case "4":
                    //  转账
                    transfer(account, accounts, sc);
                    break;
                case "5":
                    // 修改密码
                    changePassword(account, sc);
                    // 修改密码后可继续操作,无需退出重新登录
                    break;
                case "6":
                    // 销户
                    delAccount(account, accounts);
                    // 销户完成直接返回首页
                    return;
                case "0":
                    // 退出登录
                    System.out.println("您已退出登录!");
                    return;
                default:
                    System.out.println("您输入的操作指令有误!请重新输入");
            }
        }
    }

用户操作页测试

==============欢迎进入ATM用户操作界面==============
1.查询账户信息
2.存款
3.取款
4.转账
5.修改密码
6.销户
0.退出登录
请输入您的操作:

13.7 查询账户

查询账户代码

	/**
     * 用户详情界面
     * @param account 当前用户账户对象
     */
    private static void showAccount(Account account) {
        System.out.println("==============欢迎进入ATM用户详情界面==============");
        System.out.println("您的账户信息如下:");
        System.out.println("卡号:" + account.getUserId());
        System.out.println("姓名:" + account.getUserName());
        System.out.println("余额:" + account.getBalance());
        System.out.println("单次限额:" + account.getQuota());
    }

查询账户测试

==============欢迎进入ATM用户详情界面==============
您的账户信息如下:
卡号:10473645
姓名:马云
余额:0.0
单次限额:5000.0

13.8 存款功能

  • 存款功能分析:
    • 获取当前账户对象
    • 用户输入存款金额
    • 调用账户对象的setMoney方法将账户余额修改成存款后的余额
    • 存款后需要查询一下账户信息,确认存款已成功

存款功能代码

/**
     * 存款界面
     * @param account 当前用户账户对象
     * @param sc      扫描器对象
     */
    private static void deposit(Account account, Scanner sc) {
        System.out.println("==============欢迎进入ATM用户存款界面==============");
        System.out.print("请输入存款金额:");
        double money = sc.nextDouble();
        account.setBalance(account.getBalance() + money);
        System.out.println("存款成功!");
        // 存款成功后,直接调查询界面
        showAccount(account);
    }

存款功能测试

==============欢迎进入ATM用户存款界面==============
请输入存款金额:6000
存款成功!
==============欢迎进入ATM用户详情界面==============
您的账户信息如下:
卡号:10473645
姓名:马云
余额:6000.0
单次限额:5000.0

13.9 取款功能

  • 取款功能分析:
    • 取款需要先判断账户是否有钱
    • 有钱则获取账户对象
    • 用户输入取款金额
    • 判断取款金额是否超过了单次限额,以及余额是否充足
    • 满足要求则调用账户对象的setMoney方法完成金额的修改

取款功能代码

	/**
     * 取款界面
     * @param account 当前用户账户对象
     * @param sc      扫描器对象
     */
    private static void withdrawal(Account account, Scanner sc) {
        System.out.println("==============欢迎进入ATM用户取款界面==============");
        // 判断当前账户余额是否大于100元
        if (account.getBalance() < 100) {
            System.out.println("余额不足100元,无法取款!");
            return;
        }
        while (true) {
            System.out.print("请输入取款的金额:");
            double money = sc.nextDouble();
            // 检验取款金额是否大于余额
            if (money > account.getBalance()) {
                System.out.println("您的余额不足!");
                continue;
            }
            // 校验取款金额是否大于单次取款限额
            if (money > account.getQuota()) {
                System.out.println("您当前取款超过了单次限额!单次限额:" + account.getQuota());
                continue;
            }
            account.setBalance(account.getBalance() - money);
            System.out.println("取款成功!余额:" + account.getBalance());
            return;
        }
    }

取款功能测试

==============欢迎进入ATM用户取款界面==============
请输入取款的金额:5000
取款成功!余额:1000.0
  • 取款金额超过单次限额
请输入取款的金额:6000
您当前取款超过了单次限额!单次限额:5000.0
  • 取款金额超过余额
请输入取款的金额:5000
您的余额不足!
  • 余额小于100
=============欢迎进入ATM用户取款界面==============
余额不足100元,无法取款!

13.10 转账功能

  • 转账功能分析:
    • 判断系统中是否有大于2个账户对象
    • 判断当前账户是否有钱
    • 输入对方卡号,判断对方账户是否存在
    • 对方账户存在还需要认证对方户主的姓氏
    • 满足要求则修改当前账户对象和对方账户对象的金额

转账功能代码

 	/**
     * 转账
     * @param account  当前用户账户对象
     * @param accounts 账户集合对象
     * @param sc       扫描器对象
     */
    private static void transfer(Account account, ArrayList<Account> accounts, Scanner sc) {
        System.out.println("==============欢迎进入ATM用户转账界面==============");
        // 判断系统中的账户个数
        if (accounts.size() < 2) {
            System.out.println("当前系统中账户不足2个,无法转账");
            return;
        }
        // 判断当前账户余额
        if (account.getBalance() == 0) {
            System.out.println("余额不足,无法转账");
            return;
        }
        while (true) {
            System.out.print("请输入转账的账户卡号:");
            String transId = sc.next();
            // 获取通过ID找到的账户对象
            Account transAccount = getAccountByUserId(transId, accounts);
            // 判断转账账户是否存在
            if (transAccount == null) {
                System.out.println("账户不存在,请重新确认!");
                continue;
            }
            // 判断是否给自己转账
            if (transAccount == account) {
                System.out.println("无法为自己转账!");
                continue;
            }
            // 隐藏转账账户的姓名首位
            String transName = "*" + transAccount.getUserName().substring(1);
            while (true) {
                System.out.println("您当前要为【" + transName + "】转账!");
                System.out.print("请输入姓氏确认:");
                String firstName = sc.next();
                // 判断输入的姓氏是否正确
                if (!firstName.equals(transAccount.getUserName().substring(0, 1))) {
                    System.out.println("您输入的姓氏有误!");
                    continue;
                }
                while (true) {
                    System.out.print("请输入转账金额:");
                    double money = sc.nextDouble();
                    // TODO 转账单次限额校验
                    // 判断账户余额是否可以转账
                    if (money > account.getBalance()) {
                        System.out.println("您的余额不足,无法转账!余额为:" + account.getBalance());
                        continue;
                    }
                    // 当前账户资金转出
                    account.setBalance(account.getBalance() - money);
                    // 转账账户资金转入
                    transAccount.setBalance(transAccount.getBalance() + money);
                    System.out.println("转账完成!当前余额为:" + account.getBalance());
                    return;
                }
            }
        }
    }

转账功能测试

==============欢迎进入ATM用户详情界面==============
您的账户信息如下:
卡号:10753979
姓名:马化腾
余额:0.0
单次限额:3000.0

==============欢迎进入ATM用户转账界面==============
请输入转账的账户卡号:123456
账户不存在,请重新确认!
请输入转账的账户卡号:10753979
您当前要为【*化腾】转账!
请输入姓氏确认:马
请输入转账金额:3000
转账完成!当前余额为:2000.0

==============欢迎进入ATM用户详情界面==============
您的账户信息如下:
卡号:10753979
姓名:马化腾
余额:3000.0
单次限额:3000.0
  • 系统中的账户小于2
==============欢迎进入ATM用户转账界面==============
当前系统中账户不足2个,无法转账
  • 当前账户余额为0
==============欢迎进入ATM用户转账界面==============
余额不足,无法转账
  • 转账时输入当前账户卡号
请输入转账的账户卡号:10473645
无法为自己转账!
  • 输入错误的卡号
==============欢迎进入ATM用户转账界面==============
请输入转账的账户卡号:123456
账户不存在,请重新确认!
  • 输入错误的姓氏
您当前要为【*化腾】转账!
请输入姓氏确认:牛
您输入的姓氏有误!
  • 转账金额大于余额
请输入转账金额:3000
您的余额不足,无法转账!余额为:2000.0

13.11 修改密码功能

修改密码功能代码

	/**
     * 修改密码
     * @param account 当前用户账户对象
     * @param sc      扫描器对象
     */
    private static void changePassword(Account account, Scanner sc) {
        System.out.println("=============欢迎进入ATM用户修改密码界面=============");
        while (true) {
            System.out.print("请输入原密码:");
            String oldPassword = sc.next();
            // 校验原密码
            if (!oldPassword.equals(account.getPassword())) {
                System.out.println("原密码输入错误!请重新输入");
                continue;
            }
            while (true) {
                System.out.print("请输入新密码:");
                String newPassword = sc.next();
                // 校验密码长度
                if (newPassword.length() < 6) {
                    System.out.println("密码不得少于6位!");
                    continue;
                }
                System.out.print("请确认新密码:");
                String newConfirmPassword = sc.next();
                // 校验两次输入密码是否一致
                if (!newPassword.equals(newConfirmPassword)) {
                    System.out.println("两次输入的密码不一致!");
                    continue;
                }
                // 重置密码
                account.setPassword(newPassword);
                System.out.println("密码已修改!");
                return;
            }
        }
    }

修改密码功能测试

=============欢迎进入ATM用户修改密码界面=============
请输入原密码:123456
请输入新密码:111111
请确认新密码:111111
密码已修改!
  • 原密码输入错误
请输入原密码:12345
原密码输入错误!请重新输入
  • 新密码少于6位
请输入新密码:11111
密码不得少于6位!
  • 新密码两次输入不一致
请输入新密码:111111
请确认新密码:222222
两次输入的密码不一致!

13.12 销户功能

销户功能代码

	/**
     * 销户
     * @param account  当前用户账户对象
     * @param accounts 账户集合对象
     */
    private static void delAccount(Account account, ArrayList<Account> accounts) {
        accounts.remove(account);
        System.out.println("卡号" + account.getUserId() + "已销户");
    }

销户功能测试

请输入您的操作:6
卡号10473645已销户
================欢迎进入ATM系统首页================
1.登录账户
2.注册账户
0.退出系统
请输入您的操作:1
==============欢迎进入ATM账户登录界面==============
请输入用户卡号:10473645
卡号10473645不存在,请确认卡号!
  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-01-14 02:17:03  更:2022-01-14 02:18:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 4:48:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码