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

前端 0

  

目录

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;@RestControllerpublic 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>
效果:

 

结尾 

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

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

也许您对下面的内容还感兴趣: