【前端学java】java基础练习缺少项目?看这篇文章就够了!(完结)

简介: 【8月更文挑战第11天】java基础练习缺少项目?看这篇文章就够了!(完结)

回顾

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

    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();
        }
    }

GIF 2023-11-2 10-21-59.gif
现在,我们要实现另一个核心功能:用户登录。登录后,用户还可以进行转账等一些列操作,这也是我们要完善的功能。

用户登录

我们先来看一下用户登录的login功能
GIF 2023-11-2 11-48-43.gif
登录的流程大致如下:

  • 如果系统没有任何账户对象,则不允许登录
  • 让用户输入登录的卡号,先判断卡号是否正确,如果不正确要给出提示
  • 如果卡号正确,再让用户输入账户密码,如果密码不正确要给出提示;如果密码也正确,则给出登录成功的提示

    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中执行这个方法即可

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

    账户操作

    框架搭建

    用户登录成功,我们需要进入账户处理界面
    image.png
    我们定义一个showUserCommand方法来实现

    // 登录成功后的操作
    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是我们储存的用户登录成功后的账户信息,详细的代码如下:

    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对象中储存的信息

    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()方法中执行下

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

    GIF 2023-11-2 14-55-17.gif

    退出操作

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

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

    注意,当用户输出6后,break会结束switch语句,但无法跳出while循环,switch会重新执行。
    所以,我们需要把break改成return结束当前程序。

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

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

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

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

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

    我们测试下:
    GIF 2023-11-2 15-09-23.gif

    存款及取款

    存款

    我们定义depositMoney的存款方法,在showUserCommand()的switch 中执行。
    这次骚一点,我们用编译器的快捷键帮我们生成方法。在switch中直接执行depositMoney,然后点击【alt+enter】键就可以自动帮我们创建好这个方法了!
    GIF 2023-11-2 15-33-52.gif

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

    取款

    private void showUserCommand(){
         
         
          while (true) {
         
         
              // ...
              int command = sc.nextInt();
              switch (command){
         
         
                  case 1:
                      //查询操作
                      showLoginAccount();
                      break;
                  case 2:
                      //存款
                      depositMoney();
                      break;
                  case 3:
                      //取款
                      drawMoney();
                      break;
                  // ...
              }
          }
      }
    
      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());
              }
          }
      }
    

    GIF 2023-11-2 16-05-33.gif

    转账

    private void showUserCommand(){
         
         
          while (true) {
         
         
              // ...
              int command = sc.nextInt();
              switch (command){
         
         
                  // ...
                  case 4:
                      //转账
                      transferMoney();
                      break;
                  // ...
              }
          }
      }
    
    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("输入的姓名有有误");
                  }
              }
          }
      }
    
相关文章
|
9天前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
89 1
|
1月前
|
前端开发 Java API
2025 年 Java 全栈从环境搭建到项目上线实操全流程指南:Java 全栈最新实操指南(2025 版)
本指南涵盖2025年Java全栈开发核心技术,从JDK 21环境搭建、Spring Boot 3.3实战、React前端集成到Docker容器化部署,结合最新特性与实操流程,助力构建高效企业级应用。
431 1
|
1月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
305 63
|
7天前
|
IDE 安全 Java
Lombok 在企业级 Java 项目中的隐性成本:便利背后的取舍之道
Lombok虽能简化Java代码,但其“魔法”特性易破坏封装、影响可维护性,隐藏调试难题,且与JPA等框架存在兼容风险。企业级项目应优先考虑IDE生成、Java Records或MapStruct等更透明、稳健的替代方案,平衡开发效率与系统长期稳定性。
55 1
|
8天前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
2月前
|
存储 Java 程序员
Java 基础知识点全面梳理包含核心要点及难点解析 Java 基础知识点
本文档系统梳理了Java基础知识点,涵盖核心特性、语法基础、面向对象编程、数组字符串、集合框架、异常处理及应用实例,帮助初学者全面掌握Java入门知识,提升编程实践能力。附示例代码下载链接。
121 1
|
2月前
|
安全 Java 测试技术
Java 大学期末实操项目在线图书管理系统开发实例及关键技术解析实操项目
本项目基于Spring Boot 3.0与Java 17,实现在线图书管理系统,涵盖CRUD操作、RESTful API、安全认证及单元测试,助力学生掌握现代Java开发核心技能。
105 0
|
2月前
|
安全 JavaScript Java
java Web 项目完整案例实操指南包含从搭建到部署的详细步骤及热门长尾关键词解析的实操指南
本项目为一个完整的JavaWeb应用案例,采用Spring Boot 3、Vue 3、MySQL、Redis等最新技术栈,涵盖前后端分离架构设计、RESTful API开发、JWT安全认证、Docker容器化部署等内容,适合掌握企业级Web项目全流程开发与部署。
145 0
|
2月前
|
缓存 Java 数据库
Java 项目分层架构实操指南及长尾关键词优化方案
本指南详解基于Spring Boot与Spring Cloud的Java微服务分层架构,以用户管理系统为例,涵盖技术选型、核心代码实现、服务治理及部署实践,助力掌握现代化Java企业级开发方案。
143 2