【前端学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("输入的姓名有有误");
                  }
              }
          }
      }
    
相关文章
|
5天前
|
XML Java 测试技术
从零开始学 Maven:简化 Java 项目的构建与管理
Maven 是一个由 Apache 软件基金会开发的项目管理和构建自动化工具。它主要用在 Java 项目中,但也可以用于其他类型的项目。
21 1
从零开始学 Maven:简化 Java 项目的构建与管理
|
2月前
|
JavaScript 前端开发 Docker
前端全栈之路Deno篇(二):几行代码打包后接近100M?别慌,带你掌握Deno2.0的安装到项目构建全流程、剖析构建物并了解其好处
在使用 Deno 构建项目时,生成的可执行文件体积较大,通常接近 100 MB,而 Node.js 构建的项目体积则要小得多。这是由于 Deno 包含了完整的 V8 引擎和运行时,使其能够在目标设备上独立运行,无需额外安装依赖。尽管体积较大,但 Deno 提供了更好的安全性和部署便利性。通过裁剪功能、使用压缩工具等方法,可以优化可执行文件的体积。
126 3
前端全栈之路Deno篇(二):几行代码打包后接近100M?别慌,带你掌握Deno2.0的安装到项目构建全流程、剖析构建物并了解其好处
|
15天前
|
Java Android开发
Eclipse 创建 Java 项目
Eclipse 创建 Java 项目
35 4
|
20天前
|
SQL Java 数据库连接
从理论到实践:Hibernate与JPA在Java项目中的实际应用
本文介绍了Java持久层框架Hibernate和JPA的基本概念及其在具体项目中的应用。通过一个在线书店系统的实例,展示了如何使用@Entity注解定义实体类、通过Spring Data JPA定义仓库接口、在服务层调用方法进行数据库操作,以及使用JPQL编写自定义查询和管理事务。这些技术不仅简化了数据库操作,还显著提升了开发效率。
33 3
|
22天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
23天前
|
前端开发 Java 数据库
如何实现一个项目,小白做项目-java
本教程涵盖了从数据库到AJAX的多个知识点,并详细介绍了项目实现过程,包括静态页面分析、数据库创建、项目结构搭建、JSP转换及各层代码编写。最后,通过通用分页和优化Servlet来提升代码质量。
40 1
|
24天前
|
前端开发 Unix 测试技术
揭秘!前端大牛们如何高效管理项目,确保按时交付高质量作品!
【10月更文挑战第30天】前端开发项目涉及从需求分析到最终交付的多个环节。本文解答了如何制定合理项目计划、提高团队协作效率、确保代码质量和应对项目风险等问题,帮助你学习前端大牛们的项目管理技巧,确保按时交付高质量的作品。
33 2
|
1月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
2月前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第19天】本文介绍了Java编程中重要的数据结构——Map,通过问答形式讲解了Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的使用和性能优化技巧,适合初学者和进阶者学习。
56 4
|
2月前
|
缓存 前端开发 JavaScript
前端架构思考:代码复用带来的隐形耦合,可能让大模型造轮子是更好的选择-从 CDN 依赖包被删导致个站打不开到数年前因11 行代码导致上千项目崩溃谈谈npm黑洞 - 统计下你的项目有多少个依赖吧!
最近,我的个人网站因免费CDN上的Vue.js包路径变更导致无法访问,引发了我对前端依赖管理的深刻反思。文章探讨了NPM依赖陷阱、开源库所有权与维护压力、NPM生态问题,并提出减少不必要的依赖、重视模块设计等建议,以提升前端项目的稳定性和可控性。通过“left_pad”事件及个人经历,强调了依赖管理的重要性和让大模型代替人造轮子的潜在收益