银行测试项目

在这里插入图片描述
在这里插入图片描述

1. 项目要求

在这里插入图片描述

2. Java代码

package testbank;

import java.util.ArrayList; // 引入ArrayList类,用于存储用户信息
import java.util.List;      // 引入List接口
import java.util.Scanner;   // 引入Scanner类,用于获取用户输入

// 主类
class TestBank {
    
    
    public static void main(String[] args) {
    
    
        Bank bank = new Bank(); // 创建Bank对象
        bank.login();           // 调用登录方法
    }
}

// 银行类
class Bank {
    
    
    Scanner input = new Scanner(System.in); // 创建Scanner对象用于获取输入

    List<User> users = new ArrayList<>();   // 创建List集合users存储用户User信息
    int post = -1;               // 存储当前操作账户的下标(索引)

    // 构造函数,初始化用户信息
    public Bank() {
    
    
        initial(); // 调用初始化用户信息的方法
    }

    // 初始化用户信息的方法
    private void initial() {
    
    
        // 添加三个用户信息到用户列表
        users.add(new User("6222020200001234567", "123456", "13900000000", "11010119910203", 2000.0));
        users.add(new User("6222020200001237777", "123456", "13900000123", "11010119914567", 3000.0));
        users.add(new User("6222020200001238888", "123456", "13900055667", "11010119914321", 4000.0));
    }

    // 登录方法(登录成功-进入操作界面;不成功,提示用户名不存在或是密码错误)
    public void login() {
    
    
        System.out.println("-----欢迎使用百知ATM自助终端-----");
        System.out.println("-------根据提示请先登录---------");
        System.out.print("请输入卡号:");
        String acc = input.next(); // 获取用户输入的卡号
        System.out.print("请输入密码:");
        String pwd = input.next(); // 获取用户输入的密码

        // 判断:卡号和密码是否正确
        for (int i = 0; i < users.size(); i++) {
    
    
            User user = users.get(i);
            // String类型的数据的比较不能用==,而是应用 equals
            if (user.getAccount().equals(acc) && user.getPassword().equals(pwd)) {
    
    
                post = i; // 记录当前用户的下标(索引)
                System.out.println("登录成功!"); // 显示登录成功信息
                showMenu(); // 调用显示菜单的方法
                return; // 登录成功后退出方法
            }
        }
        System.out.println("用户名不存在或密码错误!"); // 登录失败提示
    }

    // 显示操作菜单
    public void showMenu() {
    
    
        int choice; // 用户选择的操作编号
        do {
    
    
            System.out.println("-----------欢迎使用XXXATM自助终端操作界面--------");
            System.out.println("1.查询余额 2.修改密码 3.存款 4.取款  5.转账 6.退出");
            System.out.println("---------------根据提示进行操作-------------------");

            System.out.print("请输入操作编号:");
            choice = input.nextInt(); // 获取用户输入的操作编号

            switch (choice) {
    
    
                case 1:
                    System.out.println("查询余额");
                    this.queryBalance(); // 调用查询余额的方法
                    break; // 添加break语句以防止fall-through
                case 2:
                    System.out.println("修改密码");
                    this.updatePassword(); // 调用修改密码的方法
                    break; // 添加break语句
                case 3:
                    System.out.println("存款");
                    this.save(); // 调用存款的方法
                    break;
                case 4:
                    System.out.println("取款");
                    this.take(); // 调用取款的方法
                    break;
                case 5:
                    System.out.println("转账");
                    this.transfer(); // 调用转账的方法
                    break;
                case 6:
                    System.out.println("退出"); // 显示退出信息
                    break;
                default:
                    System.out.println("输入错误,请重新输入!"); // 提示用户输入错误
                    break;
            }
        } while (choice != 6); // 循环条件修正,当选择6时退出循环
    }

    // 查询余额方法
    public void queryBalance() {
    
    
        User user = users.get(post); // 获取当前用户信息
        System.out.println("当前余额:" + user.getBalance() + "元"); // 显示余额
    }

    // 修改密码方法(重新输入密码进行校验,正确之后再修改,修改时有二次确认)
    public void updatePassword() {
    
    
        User user = users.get(post); // 获取当前用户信息
        System.out.print("请输入原始密码:");
        String originalPassword = input.next(); // 获取原始密码输入
        // 校验原始密码是否正确
        if (user.getPassword().equals(originalPassword)) {
    
    
            System.out.print("请输入新密码:");
            String newPassword = input.next(); // 获取新密码输入
            System.out.print("请再次输入新密码:");
            String confirmPassword = input.next(); // 获取确认密码输入

            // 校验新密码与确认密码是否一致
            if (newPassword.equals(confirmPassword)) {
    
    
                user.setPassword(newPassword); // 更新密码
                System.out.println("密码修改成功!"); // 修改成功提示
            } else {
    
    
                System.out.println("两次输入的密码不一致!"); // 提示密码不一致
            }
        } else {
    
    
            System.out.println("原始密码错误!"); // 提示原始密码错误
        }
    }

    // 存款方法
    public void save() {
    
    
        User user = users.get(post); // 获取当前用户信息
        System.out.print("请输入存款金额:");
        double amount = input.nextDouble(); // 获取存款金额输入

        // 校验存款金额的合理性
        if (amount > 0) {
    
    
            user.setBalance(user.getBalance() + amount); // 更新余额
            System.out.println("存款成功!当前余额:" + user.getBalance() + "元"); // 显示当前余额
        } else {
    
    
            System.out.println("存款金额不合理!"); // 提示存款金额不合理
        }
    }

    // 取款方法
    public void take() {
    
    
        User user = users.get(post); // 获取当前用户信息
        System.out.print("请输入取款金额:");
        double amount = input.nextDouble(); // 获取取款金额输入

        // 校验取款金额的合理性
        if (amount > 0 && amount <= user.getBalance()) {
    
    
            user.setBalance(user.getBalance() - amount); // 更新余额
            System.out.println("取款成功!当前余额:" + user.getBalance() + "元"); // 显示当前余额
        } else {
    
    
            System.out.println("取款金额不合理!"); // 提示取款金额不合理
        }
    }

    // 转账方法
    public void transfer() {
    
    
        User user = users.get(post); // 获取当前用户信息
        System.out.print("请输入转账账户:");
        String targetAccount = input.next(); // 获取转账账户输入
        User targetUser = null; // 定义目标用户

        // 查找目标用户
        for (User u : users) {
    
    
            if (u.getAccount().equals(targetAccount)) {
    
    
                targetUser = u; // 找到目标用户
                break; // 找到后退出循环
            }
        }

        // 校验目标用户是否存在
        if (targetUser != null) {
    
    
            System.out.print("请输入转账金额:");
            double amount = input.nextDouble(); // 获取转账金额输入

            // 校验转账金额的合理性
            if (amount > 0 && amount <= user.getBalance()) {
    
    
                user.setBalance(user.getBalance() - amount); // 更新当前用户余额
                targetUser.setBalance(targetUser.getBalance() + amount); // 更新目标用户余额
                System.out.println("转账成功!当前余额:" + user.getBalance() + "元"); // 显示当前余额
            } else {
    
    
                System.out.println("转账金额不合理!"); // 提示转账金额不合理
            }
        } else {
    
    
            System.out.println("目标账户不存在!"); // 提示目标账户不存在
        }
    }
}

// 注意:需要对 User类完成封装!!!!!!!!!!!!!!!!!
// 用户类
class User {
    
    
    String account;        // 账户
    String password;       // 密码
    String phone;          // 电话
    String idCard;         // 身份证
    double balance;        // 余额

    // 默认构造函数
    public User() {
    
    
    }

    // 带参数的构造函数
    public User(String account, String password, String phone, String idCard, double balance) {
    
    
        this.account = account; // 初始化账户
        this.password = password; // 初始化密码
        this.phone = phone; // 初始化电话
        this.idCard = idCard; // 初始化身份证
        this.balance = balance; // 初始化余额
    }

    // Getter和Setter方法
    public String getAccount() {
    
    
        return account; // 获取账户
    }

    public void setAccount(String account) {
    
    
        this.account = account; // 设置账户
    }

    public String getPassword() {
    
    
        return password; // 获取密码
    }

    public void setPassword(String password) {
    
    
        this.password = password; // 设置密码
    }

    public String getPhone() {
    
    
        return phone; // 获取电话
    }

    public void setPhone(String phone) {
    
    
        this.phone = phone; // 设置电话
    }

    public String getIdCard() {
    
    
        return idCard; // 获取身份证
    }

    public void setIdCard(String idCard) {
    
    
        this.idCard = idCard; // 设置身份证
    }

    public double getBalance() {
    
    
        return balance; // 获取余额
    }

    public void setBalance(double balance) {
    
    
        this.balance = balance; // 设置余额
    }

    // 重写toString方法
    @Override
    public String toString() {
    
    
        return "User{" +
                "account='" + account + '\'' +
                ", password='" + password + '\'' +
                ", phone='" + phone + '\'' +
                ", idCard='" + idCard + '\'' +
                ", balance=" + balance +
                '}'; // 返回用户信息的字符串表示
    }
}

3. 优化

package testbank;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class MyTestBank {
    
    
    public static void main(String[] args) {
    
    
        Bank bank = new Bank();
        bank.L(); // 调用登录方法 L (Login)
    }
}

class Bank {
    
    
    Scanner input = new Scanner(System.in); // 用于接收用户输入的Scanner对象

    // 创建集合 us 存储 User信息
    List<User> us = new ArrayList<>(); // 用于存储用户信息的集合

    int post; // 存储当前操作账户的下标

    // 初始化方法,初始化用户信息
    public void I() {
    
     // 方法名 I (Initialize)
        // 添加预设的用户信息到集合中
        us.add(new User("6222020200001234567", "123456", "13900000000", "11010119910203", 2000.0, "张三"));
        us.add(new User("6222020200001237777", "123456", "13900000123", "11010119914567", 3000.0, "李四"));
        us.add(new User("6222020200001238888", "123456", "13900055667", "11010119914321", 4000.0, "王五"));
    }

    // 登录方法,用户通过输入卡号和密码进行登录
    public void L() {
    
     // 方法名 L (Login)
        this.I(); // 初始化用户信息
        System.out.println("========================================================================");
        System.out.println("                      欢迎使用 百知银行 ATM自助终端           ");
        System.out.println("========================================================================");
        System.out.println("   百知银行始终秉承以客户为中心的服务理念,为您提供安全、便捷、专业的金融服务。");
        System.out.println("      我们致力于让每一位客户享受到贴心的金融体验,感谢您的信赖与支持!");
        System.out.println("========================================================================");
        System.out.println("                         请根据提示进行登录                ");
        System.out.println("========================================================================");
        int attempts = 3; // 登录尝试次数
        while (attempts > 0) {
    
    
            System.out.print("请输入卡号:");
            String acc = input.next(); // 获取用户输入的卡号
            System.out.print("请输入密码:");
            String pwd = input.next(); // 获取用户输入的密码

            // 验证卡号和密码是否正确
            for (int i = 0; i < us.size(); i++) {
    
    
                User user = us.get(i); // 获取集合中的用户信息
                if (user.getAccount().equals(acc) && user.getPassword().equals(pwd)) {
    
     // 验证卡号和密码是否匹配
                    post = i; // 保存当前操作的用户下标
                    SM(); // 显示操作菜单
                    return;
                }
            }
            attempts--; // 减少一次尝试机会
            System.out.println("卡号或密码错误,您还有 " + attempts + " 次机会。");
        }

        // 尝试次数为0,进行身份验证
        System.out.println("您已连续三次输入错误,请进行身份验证。");
        System.out.print("请输入您的身份证号码:");
        String idCard = input.next(); // 获取用户输入的身份证号码
        System.out.print("请输入您的电话号码:");
        String phone = input.next(); // 获取用户输入的电话号码
        System.out.print("请输入您的姓名:");
        String name = input.next(); // 获取用户输入的姓名

        // 遍历用户集合,验证身份证、电话和姓名是否匹配
        for (int i = 0; i < us.size(); i++) {
    
    
            User user = us.get(i);
            if (user.getIdentityCard().equals(idCard) && user.getPhone().equals(phone) && user.getName().equals(name)) {
    
    
                post = i;
                System.out.println("身份验证成功,请重新输入密码。");
                LWA(user.getAccount()); // 重新输入密码登录,调用方法 LWA (Login With Account)
                return;
            }
        }
        System.out.println("身份验证失败,账户已锁定。请联系客户服务。");
    }

    // 重新登录方法,用户通过输入密码进行登录
    private void LWA(String account) {
    
     // 方法名 LWA (Login With Account)
        int attempts = 3; // 登录尝试次数
        while (attempts > 0) {
    
    
            System.out.print("请输入密码:");
            String pwd = input.next(); // 获取用户输入的密码

            User user = us.get(post); // 获取当前操作的用户信息
            if (user.getAccount().equals(account) && user.getPassword().equals(pwd)) {
    
     // 验证账户和密码是否匹配
                System.out.println("登录成功!");
                SM(); // 显示操作菜单,调用方法 SM (Show Menu)
                return;
            }
            attempts--; // 减少一次尝试机会
            System.out.println("密码错误,您还有 " + attempts + " 次机会。");
        }
        System.out.println("连续三次输入密码错误,账户已锁定。请联系客户服务。");
    }

    // 显示ATM操作菜单
    public void SM() {
    
     // 方法名 SM (Show Menu)
        int choice; // 用户的操作选择
        do {
    
    
            System.out.println("=======================================");
            System.out.println("      欢迎使用 百知银行 ATM自助终端操作界面     ");
            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("=======================================");
            System.out.print("请输入操作编号:");
            while (!input.hasNextInt()) {
    
     // 检查输入是否为整数
                System.out.println("输入错误,请重新输入!");
                input.next(); // 清除错误输入
                System.out.print("请输入操作编号:");
            }
            choice = input.nextInt(); // 获取用户的选择
            switch (choice) {
    
    
                case 1:
                    QB(); // 查询余额,调用方法 QB (Query Balance)
                    break;
                case 2:
                    UP(); // 修改密码,调用方法 UP (Update Password)
                    break;
                case 3:
                    S(); // 存款,调用方法 S (Save)
                    break;
                case 4:
                    T(); // 取款,调用方法 T (Take)
                    break;
                case 5:
                    TR(); // 转账,调用方法 TR (Transfer)
                    break;
                case 6:
                    System.out.println("感谢您的使用,百知银行祝您生活愉快!"); // 退出系统
                    break;
                default:
                    System.out.println("输入错误,请重新输入!"); // 提示输入错误
                    break;
            }
        } while (choice != 6); // 如果选择不为6,则继续显示菜单
    }

    // 查询余额方法
    public void QB() {
    
     // 方法名 QB (Query Balance)
        User user = us.get(post); // 获取当前操作的用户信息
        System.out.println("当前余额为:" + user.getBalance() + "元"); // 输出用户余额
        System.out.println("请按任意键继续...");
        input.nextLine(); // 等待用户按键
        input.nextLine(); // 防止回车被误读
    }

    // 修改密码方法,重新输入密码进行校验,修改时有二次确认
    public void UP() {
    
     // 方法名 UP (Update Password)
        System.out.print("请输入当前密码:");
        String currentPwd = input.next(); // 获取用户输入的当前密码
        User user = us.get(post); // 获取当前操作的用户信息
        if (user.getPassword().equals(currentPwd)) {
    
     // 验证当前密码是否正确
            System.out.print("请输入新密码:");
            String newPwd = input.next(); // 获取用户输入的新密码
            if (newPwd.equals(currentPwd)) {
    
     // 检查新密码是否与旧密码一致
                System.out.println("新密码不能与旧密码一致,是否重新修改?(1:是 2:否)");
                int retryChoice = getValidChoice(); // 获取用户选择
                if (retryChoice == 1) {
    
    
                    UP(); // 重新调用修改密码方法
                } else {
    
    
                    System.out.println("已取消修改密码。");
                }
                return;
            }
            System.out.print("请再次输入新密码:");
            String confirmPwd = input.next(); // 再次确认新密码
            if (newPwd.equals(confirmPwd)) {
    
     // 验证两次输入的新密码是否一致
                user.setPassword(newPwd); // 设置新密码
                System.out.println("密码修改成功!"); // 提示密码修改成功
            } else {
    
    
                System.out.println("两次输入的密码不一致,是否重新修改?(1:是 2:否)");
                int retryChoice = getValidChoice(); // 获取用户选择
                if (retryChoice == 1) {
    
    
                    UP(); // 重新调用修改密码方法
                } else {
    
    
                    System.out.println("已取消修改密码。");
                }
            }
        } else {
    
    
            System.out.println("当前密码错误,是否重新尝试?(1:是 2:否)");
            int retryChoice = getValidChoice(); // 获取用户选择
            if (retryChoice == 1) {
    
    
                UP(); // 重新调用修改密码方法
            } else {
    
    
                System.out.println("已取消修改密码。");
            }
        }
    }

    // 获取有效的选择输入(仅限于1和2)
    private int getValidChoice() {
    
    
        int choice;
        while (true) {
    
    
            while (!input.hasNextInt()) {
    
     // 检查输入是否为整数
                System.out.println("输入无效,请输入1或2。");
                input.next(); // 清除错误输入
            }
            choice = input.nextInt();
            if (choice == 1 || choice == 2) {
    
     // 只接受1或2作为有效输入
                return choice;
            } else {
    
    
                System.out.println("输入无效,请输入1或2。");
            }
        }
    }

    // 存款方法,校验金额是否大于0
    public void S() {
    
     // 方法名 S (Save)
        System.out.print("请输入存入金额:");
        double amount = input.nextDouble(); // 获取用户输入的存款金额
        if (amount > 0) {
    
     // 判断金额是否大于0
            User user = us.get(post); // 获取当前操作的用户信息
            user.setBalance(user.getBalance() + amount); // 更新用户余额
            System.out.println("存款成功!"); // 提示存款成功
            QB(); // 显示存款后的余额
        } else {
    
    
            System.out.println("输入金额无效,请重新输入!"); // 提示输入金额无效
            S(); // 重新调用存款方法
        }
    }

    // 取款方法,校验金额是否大于0且余额充足
    public void T() {
    
     // 方法名 T (Take)
        System.out.print("请输入取款金额:");
        double amount = input.nextDouble(); // 获取用户输入的取款金额
        User user = us.get(post); // 获取当前操作的用户信息
        if (amount > 0 && amount <= user.getBalance()) {
    
     // 判断金额是否大于0且小于等于余额
            user.setBalance(user.getBalance() - amount); // 更新用户余额
            System.out.println("取款成功!"); // 提示取款成功
            QB(); // 显示取款后的余额
        } else {
    
    
            System.out.println("输入金额无效或余额不足,是否重新取款?(1:是 2:否)");
            int retryChoice = getValidChoice(); // 获取用户选择
            if (retryChoice == 1) {
    
    
                T(); // 重新调用取款方法
            } else {
    
    
                System.out.println("已取消取款。");
            }
        }
    }

    // 转账方法,校验转账金额和目标账户是否存在
    public void TR() {
    
     // 方法名 TR (Transfer)
        System.out.print("请输入目标账户:");
        String targetAccount = input.next(); // 获取用户输入的目标账户
        System.out.print("请输入目标账户的电话:");
        String targetPhone = input.next(); // 获取用户输入的目标账户的电话
        System.out.print("请输入目标账户的姓名:");
        String targetName = input.next(); // 获取用户输入的目标账户的姓名
        User targetUser = null; // 存储目标用户信息
        for (User user : us) {
    
     // 遍历用户集合查找目标账户
            if (user.getAccount().equals(targetAccount) && user.getPhone().equals(targetPhone) && user.getName().equals(targetName)) {
    
     // 判断目标账户、电话和姓名是否匹配
                targetUser = user; // 保存目标用户信息
                break; // 找到目标账户后退出循环
            }
        }
        if (targetUser != null) {
    
     // 判断目标用户是否存在
            System.out.print("请输入转账金额:");
            double amount = input.nextDouble(); // 获取用户输入的转账金额
            User currentUser = us.get(post); // 获取当前操作的用户信息
            if (amount > 0 && amount <= currentUser.getBalance()) {
    
     // 判断金额是否大于0且小于等于当前用户余额
                currentUser.setBalance(currentUser.getBalance() - amount); // 更新当前用户余额
                targetUser.setBalance(targetUser.getBalance() + amount); // 更新目标用户余额
                System.out.println("转账成功!"); // 提示转账成功
                QB(); // 显示转账后的余额
            } else {
    
    
                System.out.println("输入金额无效或余额不足,是否重新转账?(1:是 2:否)");
                int retryChoice = getValidChoice(); // 获取用户选择
                if (retryChoice == 1) {
    
    
                    TR(); // 重新调用转账方法
                } else {
    
    
                    System.out.println("已取消转账。");
                }
            }
        } else {
    
    
            System.out.println("目标账户、电话或姓名信息错误,是否重新转账?(1:是 2:否)");
            int retryChoice = getValidChoice(); // 获取用户选择
            if (retryChoice == 1) {
    
    
                TR(); // 重新调用转账方法
            } else {
    
    
                System.out.println("已取消转账。");
            }
        }
    }
}

class User {
    
    

    private String account; // 账户
    private String password; // 密码
    private String phone; // 电话
    private String identityCard; // 身份证
    private double balance; // 余额
    private String name; // 姓名

    // 用户类的构造方法,初始化用户信息
    public User(String account, String password, String phone, String identityCard, double balance, String name) {
    
    
        this.account = account; // 设置账户
        this.password = password; // 设置密码
        this.phone = phone; // 设置电话
        this.identityCard = identityCard; // 设置身份证
        this.balance = balance; // 设置余额
        this.name = name; // 设置姓名
    }

    // 获取账户信息
    public String getAccount() {
    
    
        return account; // 返回账户
    }

    // 获取密码信息
    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 String getIdentityCard() {
    
    
        return identityCard; // 返回身份证
    }

    // 获取电话信息
    public String getPhone() {
    
    
        return phone; // 返回电话
    }

    // 获取姓名信息
    public String getName() {
    
    
        return name; // 返回姓名
    }
}

最后,感谢您的阅读,期待您的一键三连!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/2302_80269373/article/details/142900410