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

Blue的成长日记 2024-08-16 11:03:07 阅读 78

  

目录

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、引入依赖

<code><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

<code>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()

<code> 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";//相对路径code>

//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集合中随机抽出来几条数据再放进其他集合中 

<code> //生成随机数

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类代码:

<code>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";code>

//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、整体代码

代码:

<code><template>

<div>

<button @click="map()">测试题库</button> -->code>

<div v-if="y()">code>

<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>code>

<button @click="syz()">下一道题</button>code>

<button @click="ly()">提交</button>code>

</div>

<div v-if="k()">code>

<div>题目:{ -- -->{tablepanudan[panudannumber1].topic}}</div>

<div>正确</div>

<div>错误</div>

<div><input v-model="input"></div>code>

<button @click="syk()">下一道题</button>code>

<button @click="lk()">提交</button>code>

</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=''code>

} else {

alert("错误")

this.input=''code>

}

},

lk() {

if (this.input == this.tablepanudan[this.panudannumber1].anser) {

alert("正确")

this.input=''code>

} else {

alert("错误")

this.input=''code>

}

},

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>

效果:

 

结尾 

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

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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。