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

news2024/12/23 17:52:39

  

目录

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>


效果:

 

结尾 

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python应用开发——30天学习Streamlit Python包进行APP的构建(18):定制组件

Custom components定制组件 st.components.v1.declare_component 创建自定义组件,并在有 ScriptRunContext 的情况下进行注册。 如果没有 ScriptRunContext,则不会注册该组件。当自定义组件作为独立命令执行时(如用于测试),可能会出现这种情况。 要使用该函数,请从 s…

网络安全常用易混术语定义与解读(Top 20)

没有网络安全就没有国家安全&#xff0c;网络安全已成为每个人都重视的话题。随着技术的飞速发展&#xff0c;各种网络攻击手段层出不穷&#xff0c;保护个人和企业的信息安全显得尤为重要。然而&#xff0c;在这个复杂的领域中&#xff0c;许多专业术语往往让人感到困惑。为了…

分布式系列之ID生成器

背景 在分布式系统中&#xff0c;当数据库数据量达到一定量级后&#xff0c;需要进行数据拆分、分库分表操作&#xff0c;传统使用方式的数据库自有的自增特性产生的主键ID已不能满足拆分的需求&#xff0c;它只能保证在单个表中唯一&#xff0c;所以需要一个在分布式环境下都…

JavaScript进阶之作用域解构箭头函数

目录 一、作用域1.1 局部作用域1.2 全局作用域1.3 作用域链1.4 垃圾回收机制1.5 闭包1.6 变量提升 二、函数进阶2.1 函数提升2.2 函数参数2.3 箭头函数&#xff08;重要&#xff09; 三、解构赋值3.1 数组解构3.2 对象解构&#xff08;重要重要&#xff09; 一、作用域 1.1 局…

全自动蛋托清洗机介绍:

全自动蛋托清洗机&#xff0c;作为现代蛋品处理设备的杰出代表&#xff0c;凭借其高效、智能、环保的特性&#xff0c;正逐步成为蛋品加工行业的得力助手。 这款清洗机采用了先进的自动化设计理念&#xff0c;从进料、清洗到出料&#xff0c;全程无需人工干预&#xff0c;极大…

SpringCloud---服务注册(Eureka)

目录 前言 一.注册中心 二.CAP理论 三.常见的注册中心 四.Eureka 4.1搭建Eueka Server 4.2服务注册 4.3发现服务 4.4小结 学习专栏&#xff1a;http://t.csdnimg.cn/tntwg 前言 在SpringCloud里&#xff0c;我们可以发现一个巨大的问题&#xff0c;就是url是写死的&am…

如何在 Android 中删除和恢复照片

对于智能手机用户来说&#xff0c;相机几乎已经成为一种条件反射&#xff1a;你看到值得注意的东西&#xff0c;就拍下来&#xff0c;然后永远保留这段记忆。但如果那张照片不值得永远保留怎么办&#xff1f;众所周知&#xff0c;纸质快照拿在手里很难舍弃&#xff0c;而 Andro…

grafana大坑,es找不到时间戳 | No date field named timestamp found

grafana大坑&#xff0c;es找不到时间戳。最近我这边的es重新装了一遍&#xff0c;结果发现grafana连不上elasticsearch了&#xff08;以下简称es&#xff09;&#xff0c;排查问题查了好久一直以为是es没有装成功或者两边的版本不兼容&#xff0c;最后才发现是数值类型问题 一…

一天搞定React(3)——Hoots组件

Hello&#xff01;大家好&#xff0c;今天带来的是React前端JS库的学习&#xff0c;课程来自黑马的往期课程&#xff0c;具体连接地址我也没有找到&#xff0c;大家可以广搜巡查一下&#xff0c;但是总体来说&#xff0c;这套课程教学质量非常高&#xff0c;每个知识点都有一个…

【Node】npm i --legacy-peer-deps,解决依赖冲突问题

文章目录 &#x1f356; 前言&#x1f3b6; 一、问题描述✨二、代码展示&#x1f3c0;三、运行结果&#x1f3c6;四、知识点提示 &#x1f356; 前言 npm i --legacy-peer-deps&#xff0c;解决依赖冲突问题 &#x1f3b6; 一、问题描述 node执行安装指令时出现报错&#xff…

【QT】label适应图片(QImage)大小;图片适应label大小

目录 0.简介 1.详细代码 1&#xff09;label适应img大小 2&#xff09;img适应label大小 0.简介 一个小demo &#xff0c;想在QLabel中放一张QImage的图片&#xff0c;我有一张图片叫【bird.jpg】&#xff0c;是提前放在资源文件中的&#xff0c;直接显示在label上后&#…

【网络】网络聊天室udp

网络聊天室udp 一、低耦合度代码1、代码2、测试结果 二、高耦合度代码1、服务端小改&#xff08;1&#xff09;维护一个unordered_map用户列表&#xff08;2&#xff09;服务端代码&#xff08;3&#xff09;客户端不改的情况下结果展示 2、大改客户端&#xff08;udp全双工用多…

通过QT进行服务器和客户端之间的网络通信

客户端 client.pro #------------------------------------------------- # # Project created by QtCreator 2024-07-02T14:11:20 # #-------------------------------------------------QT core gui network #网络通信greaterThan(QT_MAJOR_VERSION, 4): QT widg…

饥荒dst联机服务器搭建基于Ubuntu

目录 一、服务器配置选择 二、项目 1、下载到服务器 2、解压 3、环境 4、启动面板 一、服务器配置选择 首先服务器配置需要2核心4G&#xff0c;4G内存森林加洞穴大概就占75% 之后进行服务器端口的开放&#xff1a; tcp:8082 tcp:8080 UDP:10888 UDP:10998 UDP:10999 共…

套接字编程一(简单的UDP网络程序)

文章目录 一、 理解源IP地址和目的IP地址二、 认识端口号1. 理解 "端口号" 和 "进程ID"2. 理解源端口号和目的端口号 三、 认识协议1. 认识TCP协议2. 认识UDP协议 四、 网络字节序五、 socket编程接口1. socket 常见API2. sockaddr结构&#xff08;1&#…

输入设备应用编程-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

输入设备应用编程 输入类设备编程介绍 什么是输入设备 输入设备&#xff08;input 设备&#xff09;&#xff0c;如鼠标、键盘、触摸屏等&#xff0c;允许用户与系统交互 input 子系统 Linux系统通过input子系统管理多种输入设备 Input子系统提供统一的框架和接口&#xff…

网络编程之LINUX信号

注意发送信号是给进程&#xff0c;不是线程&#xff0c;调用的是KILL函数&#xff0c;SIG是信号种类。pid0是本进程的其他的进程。 可以通过设置ERRNO来查看返回的错误&#xff0c;如下&#xff1a; 当目标进程收到信号后&#xff0c;要对信号进行一些执行操作&#xff1a; 定义…

[每周一更]-(第106期):DNS和SSL协作模式

文章目录 什么是DNS&#xff1f;DNS解析过程DNS解析的底层逻辑 什么是SSL&#xff1f;SSL证书SSL握手过程SSL的底层逻辑 DNS与SSL的协同工作过程 什么是DNS&#xff1f; DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;是互联网的重要组成部分&#xff0c…

黑马程序员MySQL基础学习,精细点复习【持续更新】

文章目录 数据库Mysql基础一、数据库1.数据库2.数据库管理系统3.SQL4.Mysql目录结构5.关系型数据库6.SQL基础概念 mysql高级一、数据库备份和还原1.图形化界面备份与还原 二、约束1.分类&#xff1a;2.主键约束3.唯一约束4.非空约束5.默认值约束6.外键约束 三、表关系1.概述2.一…

《Windows API每日一练》13.1 打印基础

在Windows中使用打印机时&#xff0c;在调用一系列与打印相关的GDI绘图函数的背后&#xff0c;实际上启动了一系列模块之间复杂的交互过程&#xff0c;包括 GDI32库模块、打印机设备驱动程序库模块&#xff08;带.DRV后缀的文件&#xff09;、Windows后台打印处理程序&#xff…