Java实现随机题库-全站最呆瓜思想,保证你能学会

  

目录

Blue留言 :

学本篇文章之前所需掌握技能 

推荐视频: 

代码逻辑思想

步骤: 

 1、引入依赖

2、做一个excel表格 

3、java实现从excel表中取数据

第一步:根据excel上面的字段名(如下图),我们创建一个类,该成员变量和字段名一一对应

第二步:利用Easyexcel取excel中的数据 

第三步:利用Random与for循环从list1集合中随机抽出来几条数据再放进其他集合中 

 第四步:按照举例的步骤(步骤3的前三步)自己动手实现一下吧

第五步:写接口传递给前端(这步将会把前三部的所有代码展示出来)

第六步:前端渲染(并非重点)

Blue留言 :

🎉🎉🎉Hello,Hello!这里是Blue,一位发誓要成为很厉害的全栈的博主,今天俺带来的文章是利用Excel表格结合Java去实现类似出题软件的效果。在这篇文章中,我将会通过图文形式,会把所有的代码全给列举出来,保证看完这篇文章的各位宝子们能学会。那么,废话不多说我们开始接下来的编程之旅吧!!!🎉🎉🎉

学本篇文章之前所需掌握技能 

  • 1、会java语言基础
  • 2、会代建springboot框架

推荐视频: 

http://【使用Java语言操作Excel表格全攻略】https://www.bilibili.com/video/BV1Ff4y1U7Qc?p=18&vd_source=bb412cc25ca27e171f8e17085daad038

视频主要讲解如何实现用java去对excel进行读写,实际上我们做简单的题库,并不需要去进行写操作,能够从excel读便就达到我们的目的了。

代码逻辑思想

代码逻辑很简单,搭建springboot框架,利用Easyexcel这个开源的库,对Excel表格里面的数据取出来,存储在一个集合中,再利用随机数Random和for循环对该集合进行二次开发(利用随机数生成索引,从集合里面取出来数据再组合成另一个集合),最后将该集合转成json格式传递给前端进行渲染。

步骤: 

 1、引入依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.2.3</version>
</dependency>

注意:若做项目时候所使用过poi依赖,请导入的下面依赖

  <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel-core</artifactId>
            <version>3.2.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.poi</groupId>
                    <artifactId>poi-ooxml</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.poi</groupId>
                    <artifactId>poi</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.poi</groupId>
                    <artifactId>poi-ooxml-schemas</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

2、做一个excel表格 

 如图:

接下来我分析一下该excel需要形成的样子如下图:

3、java实现从excel表中取数据

 利用Easyexcel这个开源库,我们很容易就能实现该功能,废话不多说,直接上教程!!!!

第一步:根据excel上面的字段名(如下图),我们创建一个类,该成员变量和字段名一一对应

画红线的则为字段名,拿选择题、题目1、答案11、答案12、答案14、答案14、正确答案举例 

我们创建一个类,类名为selectquestion

mport com.alibaba.excel.annotation.ExcelProperty;

public class selectquestion {
    @ExcelProperty("选择题")
    private int num;
    @ExcelProperty("题目1")
    private String topic;
    @ExcelProperty("答案11")
    private String anserA;
    @ExcelProperty("答案12")
    private String anserrB;
    @ExcelProperty("答案13")
    private String anserC;
    @ExcelProperty("答案14")
    private String anserD;
    @ExcelProperty("正确答案")
    private String success;


    public selectquestion() {
    }

    public selectquestion(int num, String topic, String anserA, String anserrB, String anserC, String anserD, String success) {
        this.num = num;
        this.topic = topic;
        this.anserA = anserA;
        this.anserrB = anserrB;
        this.anserC = anserC;
        this.anserD = anserD;
        this.success = success;
    }

    /**
     * 获取
     * @return num
     */
    public int getNum() {
        return num;
    }

    /**
     * 设置
     * @param num
     */
    public void setNum(int num) {
        this.num = num;
    }

    /**
     * 获取
     * @return topic
     */
    public String getTopic() {
        return topic;
    }

    /**
     * 设置
     * @param topic
     */
    public void setTopic(String topic) {
        this.topic = topic;
    }

    /**
     * 获取
     * @return anserA
     */
    public String getAnserA() {
        return anserA;
    }

    /**
     * 设置
     * @param anserA
     */
    public void setAnserA(String anserA) {
        this.anserA = anserA;
    }

    /**
     * 获取
     * @return anserrB
     */
    public String getAnserrB() {
        return anserrB;
    }

    /**
     * 设置
     * @param anserrB
     */
    public void setAnserrB(String anserrB) {
        this.anserrB = anserrB;
    }

    /**
     * 获取
     * @return anserC
     */
    public String getAnserC() {
        return anserC;
    }

    /**
     * 设置
     * @param anserC
     */
    public void setAnserC(String anserC) {
        this.anserC = anserC;
    }

    /**
     * 获取
     * @return anserD
     */
    public String getAnserD() {
        return anserD;
    }

    /**
     * 设置
     * @param anserD
     */
    public void setAnserD(String anserD) {
        this.anserD = anserD;
    }

    /**
     * 获取
     * @return success
     */
    public String getSuccess() {
        return success;
    }

    /**
     * 设置
     * @param success
     */
    public void setSuccess(String success) {
        this.success = success;
    }

    public String toString() {
        return "selectquestion{num = " + num + ", topic = " + topic + ", anserA = " + anserA + ", anserrB = " + anserrB + ", anserC = " + anserC + ", anserD = " + anserD + ", success = " + success + "}";
    }
}

根据我写的代码,我简要分析一下,方便大家理解:

@ExcelProperty("选择题")
private int num;

 这个注解是用来指名,num这个变量是去和excel表中选择题下面的每一行对应的(如图)

 

同理其余六个成员变量如此,剩下的就是生成get、set、toString、有参无参构造方法了

第二步:利用Easyexcel取excel中的数据 

 我们建立一个类test,该类有一个该方法xyh()

 public void xyh() {
        //整体数组
        ArrayList<selectquestion> list1 = new ArrayList<>();
        ArrayList<panduan> list2 = new ArrayList<>();
        ArrayList<zhuguanti> list3 = new ArrayList<>();
       
        //路径
        String fileName="src/main/resources/doc/测试.xlsx";//相对路径

        //1、取选择题
        EasyExcel.read(fileName, selectquestion.class, new AnalysisEventListener<selectquestion>() {

//每取excel中的一行,调用一次该函数
            @Override
            public void invoke(selectquestion selectquestion, AnalysisContext analysisContext) {
                list1.add(selectquestion);
            }

//将所有行取完,调用一次该函数
            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {

            }
        }).sheet().doRead();
}

这里强调一下这几个地方:

fileName:这里,是因为我在springboot下的resources文件夹下建立了一个doc文件夹,将步骤2的excel表放入该地方,用的是相对路径。

EasyExcel.read()参数 :

  • 参数一:路径
  • 参数二:所取excel表中字段要对齐,这里字段对齐用的是类(详见步骤3中第一步),所以使用类.class
  • 参数三:固定写法,注意泛型是类名

看看效果:

利用xyh()函数中的list1集合和invoke()函数//该函数作用上面代码有注释,将取出每一条信息add进集合,再利用for循环打印出来

第三步:利用Random与for循环从list1集合中随机抽出来几条数据再放进其他集合中 

  //生成随机数
       Random random = new Random();
       ArrayList<selectquestion> selerandom = new ArrayList<>();
        //制作随机选择集合
        for (int i=0;i<3;i++){
          int j = random.nextInt(0,4);
            selerandom.add(list1.get(j));
        }
        for (int i =0;i<selerandom.size();i++){
            System.out.println(selerandom.get(i));
        }

看看效果:  blue:可能这里大家会有点乱了,没事,我下面会把这一整代码放出来,不要害怕

 第四步:按照举例的步骤(步骤3的前三步)自己动手实现一下吧

Blue:加油加油!!!

第五步:写接口传递给前端(这步将会把前三部的所有代码展示出来)

  • 建立:text类
  • 代码:
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

@RestController
public class text {
   @PostMapping("xyh")
    public Map<String, Object> xyh() {
        //整体数组
        ArrayList<selectquestion> list1 = new ArrayList<>();
        ArrayList<panduan> list2 = new ArrayList<>();
        ArrayList<zhuguanti> list3 = new ArrayList<>();
        //随机数组
        ArrayList<selectquestion> selerandom = new ArrayList<>();
        ArrayList<panduan> panduanrandom=new ArrayList<>();
        ArrayList<zhuguanti> zhuguantirandom = new ArrayList<>();

        //路径
        String fileName="src/main/resources/doc/测试.xlsx";
        //1、取选择题
        EasyExcel.read(fileName, selectquestion.class, new AnalysisEventListener<selectquestion>() {

            @Override
            public void invoke(selectquestion selectquestion, AnalysisContext analysisContext) {
                list1.add(selectquestion);
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {

            }
        }).sheet().doRead();

       //生成随机数
        Random random = new Random();

        //制作随机选择集合
        for (int i=0;i<3;i++){
          int j = random.nextInt(0,4);
            selerandom.add(list1.get(j));
        }
        for (int i =0;i<selerandom.size();i++){
            System.out.println(selerandom.get(i));
        }

        System.out.println("----------------------------------------------------------------------");

       //2、判断
        EasyExcel.read(fileName, panduan.class, new AnalysisEventListener<panduan>() {

            @Override
            public void invoke(panduan panduan, AnalysisContext analysisContext) {
                list2.add(panduan);
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {

            }
        }).sheet().doRead();

        //制作随机选择集合
        for (int i=0;i<3;i++){
            int j = random.nextInt(0,4);
            panduanrandom.add(list2.get(j));
        }
        for (int i =0;i<panduanrandom.size();i++){
            System.out.println(panduanrandom.get(i));
        }

        System.out.println("-----------------------------------------------------");

        //3、主观题
        EasyExcel.read(fileName, zhuguanti.class, new AnalysisEventListener<zhuguanti>() {

            @Override
            public void invoke(zhuguanti zhuguanti, AnalysisContext analysisContext) {
                list3.add(zhuguanti);
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {

            }
        }).sheet().doRead();

        //制作随机主观题
        for (int i=0;i<2;i++){
            int j = random.nextInt(0,2);
            zhuguantirandom.add(list3.get(j));
        }
        for (int i =0;i<zhuguantirandom.size();i++){
            System.out.println(zhuguantirandom.get(i));
        }

        //打包发给前端
       Map<String, Object> map = new HashMap<>();
        map.put("选择题",selerandom);
        map.put("判断题",panduanrandom);
        map.put("主观题",zhuguantirandom);

return map;

   }

}

前端接受到的效果:

  

第六步:前端渲染(并非重点)

思路:
  • 1、搭建vue2框架
  • 2、引入axios依赖
  • 3、整体代码
代码:
<template>
  <div>
<button @click="map()">测试题库</button> -->
<div v-if="y()">
<div>题目:{{ tableselect[selectnumber1].topic}}</div>
<div><span>选择A:  {{tableselect[selectnumber1].anserA}}</span></div>
<div><span>选择B:  {{tableselect[selectnumber1].anserrB}}</span></div>
<div><span>选择C:  {{tableselect[selectnumber1].anserC}}</span></div>
<div><span>选择D:  {{tableselect[selectnumber1].anserD}}</span></div>
<div><input v-model="input"></div>
<button @click="syz()">下一道题</button>
<button @click="ly()">提交</button>
</div>

<div v-if="k()">
<div>题目:{{tablepanudan[panudannumber1].topic}}</div>
<div>正确</div>
<div>错误</div>
<div><input v-model="input"></div>
<button @click="syk()">下一道题</button>
<button @click="lk()">提交</button>
</div>

  </div>
</template>

<script>
import axios from 'axios'
export default {
  data() {
    return {
      tableselect: [],
      tablepanudan: [],
      tablezhuguan: [],
      selectnumber: null,
      selectnumber1: 0,
      panduannumer: null,
      panudannumber1:0,
      input: '',
      
    }
  },
  methods: {
    ly() {
      if (this.input == this.tableselect[this.selectnumber1].success) {
        alert("正确")
        this.input=''
      } else {
        alert("错误")
        this.input=''
      }
    },
    lk() {
      if (this.input == this.tablepanudan[this.panudannumber1].anser) {
        alert("正确")
         this.input=''
      } else {
        alert("错误")
         this.input=''
      }
    },
    y() {
      if (this.selectnumber>0) {
        return true;
      } else {
        this.panduannumer=this.tablepanudan.length
        return false;
     }
    },
    k() {
      if (this.panduannumer > 0) {
        return true;
      } else {
        return false;
     }
    },
    syz() {
      if (this.selectnumber > 0) {
        this.selectnumber1 = this.selectnumber1 + 1;
        this.selectnumber = this.selectnumber - 1;
        console.log(this.selectnumber); 
      }
      
    },
    syk() {
      if (this.panduannumer > 0) {
        this.panudannumber1 = this.panudannumber1 + 1;
        this.panduannumer = this.panduannumer - 1;
        console.log(this.panudannumber1);
      } 
    },
    map() {
      axios.post("http://localhost:8081/xyh").then(e => {
        const data = e.data;
        console.log(data);
        this.tableselect = data.选择题;
        this.tablepanudan = data.判断题;
        this.tablezhuguan = data.主观题;
        console.log(this.tableselect);
        console.log(this.tablepanudan);
        console.log(this.tablezhuguan); 
        this.selectnumber = this.tableselect.length;
        console.log(this.selectnumber);
      })
    },

    },
  mounted() {
    this.map();

  }
}
</script>


效果:

 

结尾 

🎉🎉🎉在结束这篇关于随机题库系统前后端思路与代码实现的博文之际,我们不难发现,构建一个高效、灵活的随机题库系统不仅需要对前后端技术有深入的理解,更需要细致的规划与不断的优化。通过本文的探讨,我们从需求分析、后端逻辑处理到前端交互展示,全方位地剖析了随机题库系统的构建过程。希望读者能够从中获得启发,无论是对于个人学习项目还是企业应用开发,都能有所裨益。

未来,随着教育技术的不断进步和用户需求的日益多样化,随机题库系统也将不断进化,融入更多智能化、个性化的元素。我们期待看到更多创新性的解决方案涌现,为教育学习带来更加便捷、高效的体验。同时,也鼓励大家继续探索和实践,共同推动教育科技领域的繁荣发展。感谢阅读,期待与您在下一个技术探索的旅程中再次相遇!🎉🎉🎉 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/843194.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Boost搜索引擎项目相关介绍

Boost搜索引擎相关介绍&#xff1a; 首先&#xff0c;Boost库不具备搜索条件&#xff0c;所以我们这个项目借此实现搜索功能。 项目的核心就是以用户搜索的相关内容在目标数据中进行查找。 首先&#xff0c;我们面临的第一大难题就是目标数据&#xff0c;在这里目标数据就是Boo…

如何学习Spark:糙快猛的大数据之旅

作为一名大数据开发者,我深知学习Spark的重要性。今天,我想和大家分享一下我的Spark学习心得,希望能够帮助到正在学习或准备学习Spark的朋友们。 目录 Spark是什么?学习Spark的"糙快猛"之道1. 不要追求完美,在实践中学习2. 利用大模型作为24小时助教3. 根据自己的节…

51单片机学习(4)

一、串口通信 1.串口通信介绍 写完串口函数时进行模块化编程&#xff0c;模块化编程之后要对其进行注释&#xff0c;以便之后使用模块化函数&#xff0c;对模块化.c文件中的每一个函数进行注释。 注意&#xff1a;一个函数不能既在主函数又在中断函数中 模式1最常用&#xf…

《Towards Black-Box Membership Inference Attack for Diffusion Models》论文笔记

《Towards Black-Box Membership Inference Attack for Diffusion Models》 Abstract 识别艺术品是否用于训练扩散模型的挑战&#xff0c;重点是人工智能生成的艺术品中的成员推断攻击——copyright protection不需要访问内部模型组件的新型黑盒攻击方法展示了在评估 DALL-E …

二、GD32F407VET6使用定时器点灯

零、所需文件及环境&#xff1a; 1、第一章建立好的LED灯闪烁程序 2、编译环境MDK5(KEIL5) 3、一个GD32F407VET6硬件 4、一个下载器j-link 或 st-link等 5.代码编辑器 Notepad &#xff08;可以不要 用记事本也能编译 都是习惯的问题 壹、复制LED灯闪烁程序 1.1 复制le…

25w的理想L6简约民宿,15W的哪吒L拎包入住

文 | AUTO芯球 作者 | 谦行 25w买理想L6 &#xff1f; 踩坑咯&#xff01;你是没看哪吒L吧&#xff01; 哪吒是杂牌&#xff1f;兄弟&#xff01;买车要动脑子&#xff01; 你先去哪吒店里体验一下&#xff01;肠子都给你悔青&#xff01; 上有老下有小&#xff0c;要精打…

MongoDB教程(十七):MongoDB主键类型ObjectId

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、Object…

Spring AOP(2)原理(代理模式和源码解析)

目录 一、代理模式 二、静态代理 三、动态代理 1、JDK动态代理 &#xff08;1&#xff09;JDK动态代理实现步骤 &#xff08;2&#xff09;定义JDK动态代理类 &#xff08;3&#xff09;代码简单讲解 2、CGLIB动态代理 &#xff08;1&#xff09;CGLIB 动态代理类实现…

Spring系列-04-事件机制,监听器,模块/条件装配

事件机制&监听器 SpringFramework中设计的观察者模式-掌握 SpringFramework 中, 体现观察者模式的特性就是事件驱动和监听器。监听器充当订阅者, 监听特定的事件&#xff1b;事件源充当被观察的主题, 用来发布事件&#xff1b;IOC 容器本身也是事件广播器, 可以理解成观察…

ArcGIS Pro不能编辑ArcGIS10.X的注记的解决办法

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 一、问题 我们利用ArcGIS Pro编辑ArcGIS10.X系列软件生成的注记要素类的时候&#xff0c;会提示不…

FinClip 率先入驻 AWS Marketplace,加速全球市场布局

近日&#xff0c;凡泰极客旗下的小程序数字管理平台 FinClip 已成功上线亚马逊云科技&#xff08;AWS&#xff09;Marketplace。未来&#xff0c;FinClip 将主要服务于海外市场的开放银行、超级钱包、财富管理、社交电商、智慧城市解决方案等领域。 在全球市场的多样性需求推动…

KAFKA搭建教程

KAFKA搭建教程 期待您的关注 KAFKA学习笔记 帮助更多人 目录 KAFKA搭建教程 1.下载Kafka并解压 2.添加环境变量 3.修改 server.properties 文件 4.将kafka复制到其它节点 5.修改node1、node2节点的broker.id 6.将master的环境变量同步到node1、 node2 7.启动zookeeper…

Elasticsearch:评估搜索相关性 - 第 1 部分

作者&#xff1a;来自 Elastic Thanos Papaoikonomou, Thomas Veasey 这是一系列博客文章中的第一篇&#xff0c;讨论如何在更好地理解 BEIR 基准的背景下考虑评估你自己的搜索系统。我们将介绍具体的技巧和技术&#xff0c;以便在更好地理解 BEIR 的背景下改进你的搜索评估流程…

17_高级进程间通信 UNIX域套接字1

非命名的UNIX域套接字 第1个参数domain&#xff0c;表示协议族&#xff0c;只能为AF_LOCAL或者AF_UNIX&#xff1b; 第2个参数type&#xff0c;表示类型&#xff0c;只能为0。 第3个参数protocol&#xff0c;表示协议&#xff0c;可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STR…

视觉巡线小车——STM32+OpenMV(三)

目录 前言 一、OpenMV代码 二、STM32端接收数据 1.配置串口 2.接收数据并解析 总结 前言 通过视觉巡线小车——STM32OpenMV&#xff08;二&#xff09;&#xff0c;已基本实现了减速电机的速度闭环控制。要使小车能够自主巡线&#xff0c;除了能够精准的控制速度之外&#xff0…

【BUG】已解决:raise KeyError(key) from err KeyError: (‘name‘, ‘age‘)

已解决&#xff1a;raise KeyError(key) from err KeyError: (‘name‘, ‘age‘) 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xf…

第十课:telnet(远程登入)

如何远程管理网络设备&#xff1f; 只要保证PC和路由器的ip是互通的&#xff0c;那么PC就可以远程管理路由器&#xff08;用telnet技术管理&#xff09;。 我们搭建一个下面这样的简单的拓扑图进行介绍 首先我们点击云&#xff0c;把云打开&#xff0c;点击增加 我们绑定vmn…

idea如何让包结构分层

文章目录 前言1.选中前项目包结构2.取消后项目包结构3.情况二 前言 在大型项目中&#xff0c;代码的分层管理至关重要。IDEA编辑器提供了强大的package分层结构功能&#xff0c;帮助开发者更好地组织和管理代码。通过合理配置&#xff0c;我们可以清晰地看到各个package之间的…

【BUG】已解决:java.lang.reflect.InvocationTargetException

已解决&#xff1a;java.lang.reflect.InvocationTargetException 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发…

Mysql-索引结构

一.什么是索引&#xff1f; 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引 二.无索引的情况 找到…