SpringBoot +Vue开发考试系统的教程

一、前言

SpringBoot+Vue开发考试系统是一个基于Java语言和Vue框架的在线考试系统,采用前后端分离模式进行开发设计,前端部分使用Vue实现,后端部分使用SpringBoot实现,使用Maven进行项目管理,数据库采用MySQL,实现了在线考试、成绩查询、试卷管理等基本功能。

二、创建SpringBoot项目

1.在IDEA中创建SpringBoot项目,选择Spring initializr并添加所需依赖。

<!-- 添加SpringBoot、MySQL等依赖 -->
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

2.创建数据库及表

在MySQL中创建数据库exam,然后创建user表和exam_info表。

-- 创建user表
CREATE TABLE `user` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `username` varchar(50) NOT NULL UNIQUE,
    `password` varchar(50) NOT NULL,
    `role` int(1) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 创建exam_info表
CREATE TABLE `exam_info` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `title` varchar(50) NOT NULL,
    `create_time` datetime NOT NULL,
    `update_time` datetime NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3.实现SpringBoot后端功能

在SpringBoot项目中,主要需要实现登录、考试、试卷管理、成绩查询等功能。具体实现细节可以查看开源项目:https://github.com/Davina2020/OnlineExam

三、创建Vue项目

1.使用Vue CLI创建项目

使用Vue CLI创建项目,选择手动配置,添加需要的依赖。

// 添加element-ui等依赖
"dependencies": {
  "vue": "^2.6.10",
  "element-ui": "^2.12.0",
  "axios": "^0.19.2",
  "vue-router": "^3.1.3"
},
"devDependencies": {
  "@vue/cli-plugin-babel": "^4.2.0",
  "@vue/cli-plugin-eslint": "^4.2.0",
  "@vue/cli-service": "^4.2.0",
  "babel-eslint": "^10.0.3",
  "eslint": "^6.7.2",
  "eslint-plugin-vue": "^6.1.2",
  "sass": "^1.26.0",
  "sass-loader": "^8.0.2",
  "vue-template-compiler": "^2.6.10"
}

2.编写Vue前端代码

在Vue项目中,主要需要实现登录、考试、试卷管理、成绩查询等功能。具体实现细节可以查看开源项目:https://github.com/Davina2020/OnlineExam_vue

四、整合SpringBoot和Vue项目

1.启动后端SpringBoot项目

在IDEA中启动SpringBoot项目,访问http://localhost:8080/,可看到接口信息。

2.启动前端Vue项目

在命令行中输入npm run serve启动Vue项目,访问 http://localhost:8081/,可看到登录页面。

3.配置Webpack打包和跨域设置

在Vue项目中,通过Webpack打包为静态资源文件,然后将打包文件放到SpringBoot项目的/resources/static/目录下。同时,在SpringBoot项目的application.properties中添加跨域配置。

# 增加Cors跨域配置
spring.security.cors.allow-credentials=true
spring.security.cors.allowed-headers=Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With, Origin, Accept
spring.security.cors.allowed-methods=POST, GET, PUT, DELETE
spring.security.cors.allowed-origins=*

4.整合Vue和SpringBoot

在Vue项目中,修改访问路径为后端接口地址。

// 在Vue项目中修改axios请求路径
axios.defaults.baseURL = 'http://localhost:8080/api/';

完成整合后,运行SpringBoot项目并访问http://localhost:8080/,即可看到前端Vue页面。

五、示例说明

以下是开源项目OnlineExam中的代码,展示了如何实现在线考试功能。

1.前端页面

考试页面Exam.vue实现了试卷题目的展示和答题功能,同时有计时器和交卷功能。

<template>
  <div class="exam">
    <div class="exam-header">
      <el-row>
        <el-col :span="12">
          <h2>{{ examName }}</h2>
        </el-col>
        <el-col :span="12">
          <h2>倒计时:{{ time }}分钟</h2>
        </el-col>
      </el-row>
    </div>
    <div class="exam-body">
      <div v-for="(question,index) in questions" :key="index">
        <h3>{{index+1}}、{{question.title}} ({{question.score}}分)</h3>
        <el-radio-group v-model="answers[index]" :disabled="time<=0">
          <el-radio v-for="(option, key) in question.options" :key="key" :label="key" :disabled="time<=0">{{option}}</el-radio>
        </el-radio-group>
      </div>
    </div>
    <div class="exam-footer">
      <el-row>
        <el-col :span="12">
          <el-button type="danger" @click="submit" :disabled="time<=0">交卷</el-button>
        </el-col>
        <el-col :span="12">
          <h2>总分:{{score}}分</h2>
        </el-col>
      </el-row>
    </div>
  </div>
</template>

<script>
import axios from 'axios'
import { mapState } from 'vuex'
export default {
  data() {
    return {
      examId: '',
      examName: '',
      time: '',
      questions: [],
      answers: [],
      score: 0
    }
  },
  computed: {
    ...mapState(['user'])
  },
  methods: {
    getQuestions() {
      axios.get('/exam/questions', {
        params: {
          examId: this.examId
        }
      }).then(res => {
        this.questions = res.data
        for (let i = 0; i < this.questions.length; i++) {
          this.answers.push('')
        }
      })
    },
    submit() {
      axios.post('/exam/submit', {
        userId: this.user.id,
        examId: this.examId,
        answers: this.answers
      }).then(res => {
        this.$message({
          message: '交卷成功',
          type: 'success'
        })
        this.score = res.data
      })
    }
  },
  created() {
    this.examId = this.$route.query.id
    axios.get('/exam/info', {
      params: {
        id: this.examId
      }
    }).then(res => {
      this.examName = res.data.title
      this.time = res.data.time
    })
    this.getQuestions()
    setInterval(() => {
      this.$http.post('/exam/time', {
        examId: this.examId
      }).then(res => {
        this.time = res.data
        if (this.time <= 0) {
          this.submit()
        }
      })
    }, 1000 * 60)
  }
}
</script>

2.后端代码

在后端接口ExamController中,实现获取试卷题目和提交试卷答案功能。

@RestController
@RequestMapping("/exam")
public class ExamController {
    @Autowired
    ExamService examService;
    @Autowired
    AnswerService answerService;

    @GetMapping("/info")
    public ExamInfoVO getExamInfo(@RequestParam("id") int id) {
        return examService.getExamInfo(id);
    }

    @GetMapping("/questions")
    public List<QuestionVO> getQuestions(@RequestParam("examId") int examId) {
        return examService.getQuestions(examId);
    }

    @PostMapping("/submit")
    public double submitExam(@RequestBody AnswerForm answerForm) {
        return answerService.submitAnswer(answerForm);
    }
}

以上就是SpringBoot+Vue开发考试系统的教程,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot +Vue开发考试系统的教程 - Python技术站

(0)
上一篇 2023年5月13日
下一篇 2023年5月13日

相关文章

  • Python中最大递归深度值的探讨

    单独讨论 Python 中最大递归深度的问题不太有意义。对于这个问题需要从 Python 如何处理递归函数开始,以及递归深度和计算机内存容量有何关系等方面来进行探讨。 Python 如何处理递归函数 Python 中的递归函数和其他语言一样,也是直接或间接调用自身。在一个递归函数中,每一次调用该函数都会在内存中产生一个对应的栈帧。一个栈帧包含这个函数的所有局…

    python 2023年6月3日
    00
  • 基于Python编写一个微博抽奖小程序

    下文为您介绍“基于Python编写一个微博抽奖小程序”的完整攻略,包括环境配置、模块安装、编写代码等。 环境配置 首先,需要在计算机上安装Python环境。打开Python官方网站 https://www.python.org/downloads/ ,下载对应版本的Python安装包,并安装。 在安装完成后,需要添加Python环境变量。将Python的安装…

    python 2023年5月23日
    00
  • Python和Java对比,全面解读哪个语言最赚钱,前景最好?

    Python和Java对比,全面解读哪个语言最赚钱,前景最好? 简介 在当今计算机行业中,Python和Java是两个备受瞩目的编程语言。虽然两者有各自的特点和应用场景,但是大多数程序员和企业都面临着一个共同的问题:如何选择适合自己或企业发展的编程语言,能赚到最多的钱和最好的前景? 本篇文章将从多个方面对Python和Java进行对比,探讨它们的优缺点、应用…

    python 2023年6月5日
    00
  • 使用Python文件读写,自定义分隔符(custom delimiter)

    当需要对大批量文本数据进行处理时,使用Python编程语言进行文件读写操作是非常便捷且高效的选择。Python中内置了用于读写文件的函数、模块和类,可以轻松地完成对文件的读取、写入、追加等操作。而自定义分隔符则可以帮助我们更好地处理数据,并快速解析文件中的数据。 以下是使用Python文件读写,自定义分隔符的攻略指南: 准备工作 在开始文件读写的操作前,需要…

    python 2023年6月3日
    00
  • 使用Python实现音频双通道分离

    题目要求是使用Python实现音频双通道分离,我们需要采取以下步骤: 1. 导入必要的库 首先,我们需要导入必要的库。这里我们需要使用到numpy和librosa库。 import numpy as np import librosa 2. 读取音频文件 接下来,我们需要读取音频文件。这里我们以读取wav格式的音频文件为例,需要用到librosa库中的loa…

    python 2023年5月19日
    00
  • Odoo – 在python中减去2个“时间”字段

    【问题标题】:Odoo – Subtract 2 “time” fields in pythonOdoo – 在python中减去2个“时间”字段 【发布时间】:2023-04-07 00:54:01 【问题描述】: for emp in employee: contract_id = contract_pool.search(cr, uid, [(’emp…

    Python开发 2023年4月7日
    00
  • Python3 执行系统命令并获取实时回显功能

    以下是 Python3 执行系统命令并获取实时回显功能的完整攻略: 1. 使用 Python 的 subprocess 模块 在 Python 中要执行系统命令并获取实时回显,常用的方法是使用 subprocess 模块。下面是一个简单的示例: import subprocess cmd = "ping www.baidu.com" p …

    python 2023年5月30日
    00
  • 带有 python api 的 Elasticsearch Percolator

    【问题标题】:Elasticsearch Percolator with python api带有 python api 的 Elasticsearch Percolator 【发布时间】:2023-04-01 20:30:01 【问题描述】: 您好,我正在尝试使用“elasticsearch.py​​”api 进行渗透索引。但我什至没有得到任何结果。 AP…

    Python开发 2023年4月8日
    00
合作推广
合作推广
分享本页
返回顶部