java基础练习缺少项目?看这篇文章就够了(下)!

公众号:全干开发 。 专注分享简洁但高质量的动图技术文章!

回顾

在上节内容中,我们实现了用户开户的功能createAccount

java 复制代码
    public void start(){
        System.out.println("===欢迎您进入到了ATM系统===");
        System.out.println("1、用户登录");
        System.out.println("2、用户开户");
        System.out.println("请选择:");
        int command = sc.nextInt();
        switch (command) {
            case 1:
                //用户登录  TODO
                // login()  等待开发的功能!
                break;
            case 2:
                //用户开户
                createAccount();
                start();
                break;
            default:
                System.out.println("操作错误!");
                start();
        }
    }

现在,我们要实现另一个核心功能:用户登录。登录后,用户还可以进行转账等一些列操作,这也是我们要完善的功能。

用户登录

我们先来看一下用户登录的login功能

登录的流程大致如下:

  • 如果系统没有任何账户对象,则不允许登录
  • 让用户输入登录的卡号,先判断卡号是否正确,如果不正确要给出提示
  • 如果卡号正确,再让用户输入账户密码,如果密码不正确要给出提示;如果密码也正确,则给出登录成功的提示
java 复制代码
private void login(){
    System.out.println("===欢迎您登录系统===");
    // 如果系统中没有账户,直接退出
    if(accounts.size()==0){
        System.out.println("抱歉,当前系统没有账户,请先创建!");
        return;
    }
    // 系统中存在账户,开始进行登录操作
    while (true) {
        System.out.println("请您输入卡号!");
        String cardId = sc.next();
        // 根据卡号获取用户对象
        Account acc = getAccountByCardId(cardId);
        if(acc == null){
            System.out.println("卡号输入错误!请重新输入");
        }else{
            // 卡号存在,输入密码
            while (true) {
                System.out.println("请输入密码");
                String password = sc.next();
                // 判断用户输入的密码与账户对象中储存的密码是否一致
                if(password.equals(acc.getPassWord())){
                    System.out.println("恭喜您"+acc.getUserName()+"您登录成功!您的卡号是:" + cardId);
                    // TODO: 登录后的其他操作,如转账等等....
                }else {
                    System.out.println("密码输入错误");
                }
            }
        }
    }
}

现在,我们在start中执行这个方法即可

java 复制代码
 public void start(){
    // ...省略...
    switch (command) {
        case 1:
            //用户登录
            login();
            // 用户操作完,重新进入系统首页
            start();
            break;
        case 2:
            //用户开户
            createAccount();
            // 开户完,重新进入系统首页
            start();
            break;
        default:
            System.out.println("操作错误!");
            // 输入错误重新进入开始页
            start();
    }
}

账户操作

框架搭建

用户登录成功,我们需要进入账户处理界面

我们定义一个showUserCommand方法来实现

java 复制代码
// 登录成功后的操作
private void showUserCommand(){
    while (true) {
        System.out.println(loginAcc.getUserName() + "您可以选择如下功能进行账户处理========");
        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、注销账户");
        int command = sc.nextInt();
        switch (command){
            case 1:
                //查询操作
                break;
            case 2:
                //存款
                break;
            case 3:
                //取款
                break;
            case 4:
                //转账
                break;
            case 5:
                //密码修改
                break;
            case 6:
                //退出
                break;
            case 7:
                //注销账户
                break;
            default:
                System.out.println("您的操作有误!请重新输入");
        }
    }
}

这里的loginAcc是我们储存的用户登录成功后的账户信息,详细的代码如下:

java 复制代码
public class ATM {
    private ArrayList<Account> accounts = new ArrayList<>();

    private Account loginAcc; // 储存登录成功后的用户信息

    // .....
    // 用戶登录
    private void login(){
        // .....
                 
        // 判断用户输入的密码与账户对象中储存的密码是否一致
        if(password.equals(acc.getPassWord())){
            loginAcc = acc;
            System.out.println("恭喜您"+acc.getUserName()+"您登录成功!您的卡号是:" + cardId);
            // 登录后的其他操作,如转账等等....
            // 展示用户操作界面
            showUserCommand();
        }else {
            System.out.println("密码输入错误");
        }

        // .....
    }
    // 登录成功后的操作
    private void showUserCommand(){
        while (true) {
            System.out.println(loginAcc.getUserName() + "您可以选择如下功能进行账户处理========");
            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、注销账户");
            int command = sc.nextInt();
            switch (command){
                case 1:
                    //查询操作
                    break;
                case 2:
                    //存款
                    break;
                case 3:
                    //取款
                    break;
                case 4:
                    //转账
                    break;
                case 5:
                    //密码修改
                    break;
                case 6:
                    //退出
                    break;
                case 7:
                    //注销账户
                    break;
                default:
                    System.out.println("您的操作有误!请重新输入");
            }
        }
    }
}

现在,我们逐个完善showUserCommand中的方法即可

查询操作

在上述代码中,我们使用了loginAcc储存了登录用户的信息,我们创建个query方法,用于展示loginAcc对象中储存的信息

csharp 复制代码
private void showLoginAccount(){
    System.out.println("卡号:" + loginAcc.getCardId());
    System.out.println("姓名:" + loginAcc.getUserName());
    System.out.println("性别:" + loginAcc.getSex());
    System.out.println("余额:" + loginAcc.getMoney());
    System.out.println("每次取现额度:" + loginAcc.getLimit());
}

我们在showUserCommand()方法中执行下

java 复制代码
 private void showUserCommand(){
        while (true) {
            // ....
            int command = sc.nextInt();
            switch (command){
                case 1:
                    //查询操作
                    showLoginAccount();
                    break;
                // ....
                case 7:
                    //注销账户
                    break;
                default:
                    System.out.println("您的操作有误!请重新输入");
            }
        }
    }

退出操作

退出操作,不需要执行额外的方法,我们只要能回到登录页即可。退出前我们进行简单的提示即可

java 复制代码
 private void showUserCommand(){
    while (true) {
        // ...
        switch (command){
            // ...
            case 6:
                //退出
                System.out.println(loginAcc.getUserName() + "您已经成功退出");
                break;
            // ...
        }
    }
 }

注意,当用户输出6后,break会结束switch语句,但无法跳出while循环,switch会重新执行。

所以,我们需要把break改成return结束当前程序。

java 复制代码
 private void showUserCommand(){
    while (true) {
        // ...
        switch (command){
            // ...
            case 6:
                //退出
                System.out.println(loginAcc.getUserName() + "您已经成功退出");
                breturn;
            // ...
        }
    }
 }

现在,我们就跳出了showUserCommand()程序,回到了login方法里。

java 复制代码
private void login(){
    // ...
    // 系统中存在账户,开始进行登录操作
    while (true) {
        // ...
        if(acc == null){
            System.out.println("卡号输入错误!请重新输入");
        }else{
            // 卡号存在,输入密码
            while (true) {
               // ...
               showUserCommand();
               // ...
            }
        }
    }
}

同样的,我们需要结束login方法中的while循环,回到start方法中

java 复制代码
private void login(){
    // ...
    // 系统中存在账户,开始进行登录操作
    while (true) {
        // ...
        if(acc == null){
            System.out.println("卡号输入错误!请重新输入");
        }else{
            // 卡号存在,输入密码
            while (true) {
               // ...
               showUserCommand();
               // ...
               return;
            }
        }
    }
}

我们测试下:

存款及取款

存款

我们定义depositMoney的存款方法,在showUserCommand()的switch 中执行。

这次骚一点,我们用编译器的快捷键帮我们生成方法。在switch中直接执行depositMoney,然后点击【alt+enter】键就可以自动帮我们创建好这个方法了!

java 复制代码
  private void depositMoney() {
        System.out.println("==存钱操作==");
        System.out.println("请您输入存款金额:");
        double money = sc.nextDouble();
        loginAcc.setMoney( loginAcc.getMoney()+ money);
        System.out.println("您已经存入"+money + "元,当前账户余额" + loginAcc.getMoney());
    }

取款

java 复制代码
private void showUserCommand(){
        while (true) {
            // ...
            int command = sc.nextInt();
            switch (command){
                case 1:
                    //查询操作
                    showLoginAccount();
                    break;
                case 2:
                    //存款
                    depositMoney();
                    break;
                case 3:
                    //取款
                    drawMoney();
                    break;
                // ...
            }
        }
    }
java 复制代码
    private void drawMoney() {
        System.out.println("==取钱操作==");
        // 1、判断账户余额是否达到了100元,如果不够100,不让用户取钱
        if(loginAcc.getMoney() < 100){
            System.out.println("您的账户不足100,不能取钱");
            return;
        }
        // 2、让用户输入金额
        while (true) {
            System.out.println("请输入取款金额");
            double money = sc.nextDouble();
            // 3.判断账户余额是否足够
            if(loginAcc.getMoney()>= money){
                // 钱是足够的
                // 判断当前取款金额是否超出了限额
                if(money>loginAcc.getLimit()){
                    System.out.println("超出限额!");
                }else {
                    loginAcc.setMoney(loginAcc.getMoney()-money);
                    System.out.println("取款成功!剩余:" + loginAcc.getMoney());
                    break;
                }
            }else {
                System.out.println("账户余额不足!您的余额是:" + loginAcc.getMoney());
            }
        }
    }

转账

java 复制代码
private void showUserCommand(){
        while (true) {
            // ...
            int command = sc.nextInt();
            switch (command){
                // ...
                case 4:
                    //转账
                    transferMoney();
                    break;
                // ...
            }
        }
    }
java 复制代码
private void transferMoney() {
        System.out.println("==用户转账==");
        // 1 系统中是否存在其他账户
        if(accounts.size() < 2){
            System.out.println("当前系统只有一个账户,无法转账");
            return;
        }
        // 2 判断自己的账户是否有钱
        if(loginAcc.getMoney() == 0){
            System.out.println("您没钱!别转了!");
            return;
        }
        while (true) {
            // 3 开始转账
            System.out.println("请输出对方卡号");
            String cardId = sc.next();

            // 4 判断账号是否正确
            Account acc = getAccountByCardId(cardId);
            if(acc==null){
                System.out.println("输入的卡号不对");
            }else {
                //5 账户存在,确认姓名
                String name = "*" + acc.getUserName().substring(1);
                System.out.println("请输入:"+name+"的姓氏");
                String preName = sc.next();
                // 判断姓氏是否正确
                if(acc.getUserName().startsWith(preName)){
                    // 认证通过,开始转账
                    System.out.println("请输入转账金额");
                    double money = sc.nextDouble();
                    // 6 判断是否超出自己的金额
                    if(loginAcc.getMoney() >=money){
                        //转给对方了
                        //变更自己的账户余额
                        loginAcc.setMoney(loginAcc.getMoney()-money);
                        //更新对方的余额
                        acc.setMoney(acc.getMoney() + money);
                        return;
                    }else {
                        System.out.println("账户余额不足");
                    }
                }else {
                    System.out.println("输入的姓名有有误");
                }
            }
        }
    }
相关推荐
追逐时光者44 分钟前
推荐 12 款开源美观、简单易用的 WPF UI 控件库,让 WPF 应用界面焕然一新!
后端·.net
Jagger_44 分钟前
敏捷开发流程-精简版
前端·后端
苏打水com2 小时前
数据库进阶实战:从性能优化到分布式架构的核心突破
数据库·后端
间彧3 小时前
Spring Cloud Gateway与Kong或Nginx等API网关相比有哪些优劣势?
后端
间彧3 小时前
如何基于Spring Cloud Gateway实现灰度发布的具体配置示例?
后端
间彧3 小时前
在实际项目中如何设计一个高可用的Spring Cloud Gateway集群?
后端
间彧3 小时前
如何为Spring Cloud Gateway配置具体的负载均衡策略?
后端
间彧3 小时前
Spring Cloud Gateway详解与应用实战
后端
EnCi Zheng4 小时前
SpringBoot 配置文件完全指南-从入门到精通
java·spring boot·后端
烙印6014 小时前
Spring容器的心脏:深度解析refresh()方法(上)
java·后端·spring