首页 > 基础资料 博客日记

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

2024-08-17 14:00:05基础资料围观171

文章Java实现随机题库-全站最呆瓜思想,保证你能学会分享给大家,欢迎收藏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>


效果:

 

结尾 

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

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


文章来源:https://blog.csdn.net/m0_75148088/article/details/140606385
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云