【前端学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("输入的姓名有有误");
                  }
              }
          }
      }
    
相关文章
|
1月前
|
Java 开发者
重学Java基础篇—Java类加载顺序深度解析
本文全面解析Java类的生命周期与加载顺序,涵盖从加载到卸载的七个阶段,并深入探讨初始化阶段的执行规则。通过单类、继承体系的实例分析,明确静态与实例初始化的顺序。同时,列举六种触发初始化的场景及特殊场景处理(如接口初始化)。提供类加载完整流程图与记忆口诀,助于理解复杂初始化逻辑。此外,针对空指针异常等问题提出排查方案,并给出最佳实践建议,帮助开发者优化程序设计、定位BUG及理解框架机制。最后扩展讲解类加载器层次与双亲委派机制,为深入研究奠定基础。
59 0
|
1月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
141 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
2月前
|
JavaScript NoSQL Java
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
224 96
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
|
1月前
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
83 23
|
1月前
|
设计模式 缓存 Java
重学Java基础篇—Java对象创建的7种核心方式详解
本文全面解析了Java中对象的创建方式,涵盖基础到高级技术。包括`new关键字`直接实例化、反射机制动态创建、克隆与反序列化复用对象,以及工厂方法和建造者模式等设计模式的应用。同时探讨了Spring IOC容器等框架级创建方式,并对比各类方法的适用场景与优缺点。此外,还深入分析了动态代理、Unsafe类等扩展知识及注意事项。最后总结最佳实践,建议根据业务需求选择合适方式,在灵活性与性能间取得平衡。
73 3
|
1月前
|
安全 IDE Java
重学Java基础篇—Java泛型深度使用指南
本内容系统介绍了Java泛型的核心价值、用法及高级技巧。首先阐述了泛型在**类型安全**与**代码复用**中的平衡作用,解决强制类型转换错误等问题。接着详细讲解了泛型类定义、方法实现、类型参数约束(如边界限定和多重边界)、通配符应用(PECS原则)以及类型擦除的应对策略。此外,还展示了泛型在通用DAO接口、事件总线等实际场景的应用,并总结了命名规范、边界控制等最佳实践。最后探讨了扩展知识,如通过反射获取泛型参数类型。合理运用泛型可大幅提升代码健壮性和可维护性,建议结合IDE工具和单元测试优化使用。
26 1
|
1月前
|
安全 IDE Java
重学Java基础篇—Java Object类常用方法深度解析
Java中,Object类作为所有类的超类,提供了多个核心方法以支持对象的基本行为。其中,`toString()`用于对象的字符串表示,重写时应包含关键信息;`equals()`与`hashCode()`需成对重写,确保对象等价判断的一致性;`getClass()`用于运行时类型识别;`clone()`实现对象复制,需区分浅拷贝与深拷贝;`wait()/notify()`支持线程协作。此外,`finalize()`已过时,建议使用更安全的资源管理方式。合理运用这些方法,并遵循最佳实践,可提升代码质量与健壮性。
45 1
|
2月前
|
安全 前端开发 开发工具
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
108 5
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
|
1月前
|
人工智能 JavaScript 前端开发
Vue 性能革命:揭秘前端优化的终极技巧;Vue优化技巧,解决Vue项目卡顿问题
Vue在处理少量数据和有限dom的情况下技术已经非常成熟了,但现在随着AI时代的到来,海量数据场景会越来越多,Vue优化技巧也是必备技能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
2月前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
96 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡