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>
效果:
结尾
🎉🎉🎉在结束这篇关于随机题库系统前后端思路与代码实现的博文之际,我们不难发现,构建一个高效、灵活的随机题库系统不仅需要对前后端技术有深入的理解,更需要细致的规划与不断的优化。通过本文的探讨,我们从需求分析、后端逻辑处理到前端交互展示,全方位地剖析了随机题库系统的构建过程。希望读者能够从中获得启发,无论是对于个人学习项目还是企业应用开发,都能有所裨益。
未来,随着教育技术的不断进步和用户需求的日益多样化,随机题库系统也将不断进化,融入更多智能化、个性化的元素。我们期待看到更多创新性的解决方案涌现,为教育学习带来更加便捷、高效的体验。同时,也鼓励大家继续探索和实践,共同推动教育科技领域的繁荣发展。感谢阅读,期待与您在下一个技术探索的旅程中再次相遇!🎉🎉🎉
上一篇: RAX3000M openwrt 校园网web认证+断网切换随身WiFi
本文标签
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。