【前端学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("输入的姓名有有误");
                  }
              }
          }
      }
    
相关文章
|
7天前
|
Java Maven
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
在Java项目中,启动jar包时遇到“no main manifest attribute”错误,且打包大小明显偏小。常见原因包括:1) Maven配置中跳过主程序打包;2) 缺少Manifest文件或Main-Class属性。解决方案如下:
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
|
4天前
|
存储 Java BI
java怎么统计每个项目下的每个类别的数据
通过本文,我们详细介绍了如何在Java中统计每个项目下的每个类别的数据,包括数据模型设计、数据存储和统计方法。通过定义 `Category`和 `Project`类,并使用 `ProjectManager`类进行管理,可以轻松实现项目和类别的数据统计。希望本文能够帮助您理解和实现类似的统计需求。
40 17
|
26天前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
119 26
|
2月前
|
监控 前端开发 数据可视化
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
@icraft/player-react 是 iCraft Editor 推出的 React 组件库,旨在简化3D数字孪生场景的前端集成。它支持零配置快速接入、自定义插件、丰富的事件和方法、动画控制及实时数据接入,帮助开发者轻松实现3D场景与React项目的无缝融合。
179 8
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
|
2月前
|
XML Java 测试技术
从零开始学 Maven:简化 Java 项目的构建与管理
Maven 是一个由 Apache 软件基金会开发的项目管理和构建自动化工具。它主要用在 Java 项目中,但也可以用于其他类型的项目。
61 1
从零开始学 Maven:简化 Java 项目的构建与管理
|
2月前
|
Java
Java项目中高精度数值计算:为何BigDecimal优于Double
在Java项目开发中,涉及金额计算、面积计算等高精度数值操作时,应选择 `BigDecimal` 而非 `Double`。`BigDecimal` 提供任意精度的小数运算、多种舍入模式和良好的可读性,确保计算结果的准确性和可靠性。例如,在金额计算中,`BigDecimal` 可以精确到小数点后两位,而 `Double` 可能因精度问题导致结果不准确。
|
2月前
|
前端开发 测试技术
前端工程化的分支策略要如何与项目的具体情况相结合?
前端工程化的分支策略要紧密结合项目的实际情况,以实现高效的开发、稳定的版本控制和顺利的发布流程。
30 1
|
2月前
|
Java Android开发
Eclipse 创建 Java 项目
Eclipse 创建 Java 项目
51 4
|
2月前
|
SQL Java 数据库连接
从理论到实践:Hibernate与JPA在Java项目中的实际应用
本文介绍了Java持久层框架Hibernate和JPA的基本概念及其在具体项目中的应用。通过一个在线书店系统的实例,展示了如何使用@Entity注解定义实体类、通过Spring Data JPA定义仓库接口、在服务层调用方法进行数据库操作,以及使用JPQL编写自定义查询和管理事务。这些技术不仅简化了数据库操作,还显著提升了开发效率。
50 3
|
JavaScript 前端开发 Java