Springboot+vue前后端分离考试系统
作者主页:
简介:Java领域优质创作者、CSDN博客专家 Java项目、简历模板、学习资料、面试题库、技术互助
文末获取源码
项目编号:BS-XX-104
指南针考试系统是一个多角色在线培训考试系统,系统集成了用户管理、角色管理、题库管理、试题管理、考试管理、在线考试等功能,考试流程完善。实现一整套完整体系的考试系统,方便用户在此系统中进行练习并不断提升自己,在考试中不断进步。本系统采用前后端分离方式进行开发实现,使用springboot+vue来进行开发.
技术栈
SpringBoot
Mybatis-plus
MySQL 5.7
Vue全家桶
ElementUI
Redis
Swagger
阿里云OSS
Log4j
主要功能
1. 权限控制
本系统存在三个不同的角色,教师,管理员,学生三种用户,此系统是基于vue+springboot实现的前后端分离,用户权限校验通过JWT生成token令牌发放到用户,并根据令牌对用户的身份合法性进行校验。
2. 在线考试
学生用户在注册登录之后,可以在本系统进行在线的考试,考试可由教师和管理员进行布置并设置考试权限(公开,密码),考试题型分为 单选、多选、判断、简答题,并支持题目附带配图。考试过程中需开启摄像头进行考试,系统会自动抓拍考生实时考试状态。
3. 成绩模块
参加考试后的学生用户,在提交试卷后进入考试结果页面,页面会自动核对学生用户的逻辑题的对错,对于简答题需要老师或者超级管理员进行批阅。对于学生用户参与的考试,学生用户可以查看到考试的详情并可以查看到自己所错的逻辑题。
4. 题库模块
学生用户在题库模块中可以进行题目的功能训练,训练模式分为,顺序练习,随机练习,也可以根据题型练习(单选,多选,判断)。用户答题时会实时判断正确与否,并有错题解析功能。
5. 题库管理
超级管理员和教师可以对本考试系统已有的题库进行管理,实现对题库信息的CRUD操作
6. 试题管理
教师和系统管理员用户有权限对本系统的所有试题进行操作,本系统试题支持复杂类型的题目,考试题目支持多插图,选项答案支持单插图功能。
7. 考试管理
教师和系统管理员用户有权限对系统存在的考试进行操作,本系统考试支持公开考试和密码口令考试,并可以对考试进行禁用也可以在设置考试时间段,对于考试可以进行很便利的进行组卷,系统内置两种组卷模式,题库组卷和自由选题组卷。
8. 考卷批阅
对于本系统中存在的复杂考试的题目,可以又对应的老师进行批阅,此系统的逻辑题无需老师用户进行批阅,老师的工作仅仅是批阅简答题这种无准确答案类型的题目,极大地减轻了老师用户的工作量
9. 考试统计
本系统针对每一次考试进行数据统计和报表,让使用本系统的老师用户能够直观的了解到每一次考试人员的进步。
10. 用户管理
超级管理员可以对注册本系统用户的进行授权,并拥有操作一切用户的权限。
下面展示一下系统的主要功能:
登陆:
后台管理首页

题库管理

试题管理

考试管理

阅卷管理


考试统计

公告管理

用户管理

教师登陆


学生登陆

在线考试:考试时要调出摄相头进行监控


查看个人成绩和错题:并为通过考试的生成证书


日常题库训练

部门核心代码:
package com.wzz.controller;import com.wzz.dto.AddUserDto;import com.wzz.entity.Notice;import com.wzz.entity.UserRole;import com.wzz.service.NoticeService;import com.wzz.service.UserRoleService;import com.wzz.service.UserService;import com.wzz.vo.CommonResult;import com.wzz.vo.PageResponse;import com.wzz.vo.UserInfoVo;import io.swagger.annotations.Api;import io.swagger.annotations.ApiImplicitParam;import io.swagger.annotations.ApiImplicitParams;import io.swagger.annotations.ApiOperation;import lombok.RequiredArgsConstructor;import org.springframework.validation.annotation.Validated;import org.springframework.web.bind.annotation.*;import javax.validation.Valid;import java.util.List;/**
* @author by znz
* @implNote 2021/10/20 19:07
*/public class AdminController { private final UserService userService; private final UserRoleService userRoleService; private final NoticeService noticeService;
public CommonResult<PageResponse<UserInfoVo>> getUser( { String loginName, String trueName,
Integer pageNo, Integer pageSize)return CommonResult.<PageResponse<UserInfoVo>>builder()
.data(userService.getUser(loginName, trueName, pageNo, pageSize))
.build();
}
public CommonResult<Void> handleUser( {
userService.handlerUser(type, userIds); Integer type, String userIds)return CommonResult.<Void>builder().build();
}
public CommonResult<Void> addUser( {
userService.addUser(userDto); AddUserDto userDto)return CommonResult.<Void>builder().build();
}
public CommonResult<List<UserRole>> getRole() { return CommonResult.<List<UserRole>>builder()
.data(userRoleService.getUserRole())
.build();
}
public CommonResult<PageResponse<Notice>> getAllNotice( { String content,
Integer pageNo, Integer pageSize)return CommonResult.<PageResponse<Notice>>builder()
.data(noticeService.getAllNotices(content, pageNo, pageSize))
.build();
}
public CommonResult<Void> publishNotice( {
noticeService.publishNotice(notice); Notice notice)return CommonResult.<Void>builder()
.build();
}
public CommonResult<Void> deleteNotice( {
noticeService.deleteNoticeByIds(noticeIds); String noticeIds)return CommonResult.<Void>builder().build();
}
public CommonResult<Void> updateNotice( {
noticeService.updateNotice(notice); Notice notice)return CommonResult.<Void>builder().build();
}
}
package com.wzz.controller;import com.wzz.entity.ExamQuestion;import com.wzz.entity.ExamRecord;import com.wzz.service.ExamQuestionService;import com.wzz.service.QuestionService;import com.wzz.service.impl.ExamRecordServiceImpl;import com.wzz.vo.CommonResult;import com.wzz.vo.PageResponse;import com.wzz.vo.QuestionVo;import io.swagger.annotations.Api;import io.swagger.annotations.ApiImplicitParam;import io.swagger.annotations.ApiImplicitParams;import io.swagger.annotations.ApiOperation;import lombok.RequiredArgsConstructor;import lombok.extern.slf4j.Slf4j;import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/**
* @author by znz
* @implNote 2021/11/7 19:44
*/public class StudentController { private final ExamRecordServiceImpl examRecordService; private final QuestionService questionService; private final ExamQuestionService examQuestionService;
public CommonResult<PageResponse<ExamRecord>> getMyGrade(String username, Integer pageNo, Integer pageSize, { Integer examId)return CommonResult.<PageResponse<ExamRecord>>builder().data(examRecordService.getUserGrade(username, examId, pageNo, pageSize)).build();
}
public void getCertificate(HttpServletResponse response, {
examRecordService.createExamCertificate(response, examName, examRecordId);
} String examName, Integer examRecordId)
public CommonResult<Integer> addExamRecord( { ExamRecord examRecord, HttpServletRequest request)return CommonResult.<Integer>builder().data(examRecordService.addExamRecord(examRecord, request)).build();
} // TODO 优化成多id一次查询
public CommonResult<QuestionVo> getQuestionById( { Integer id)return CommonResult.<QuestionVo>builder()
.data(questionService.getQuestionVoById(id))
.build();
}
public CommonResult<ExamRecord> getExamRecordById( { Integer recordId)return CommonResult.<ExamRecord>builder()
.data(examRecordService.getExamRecordById(recordId))
.build();
}
public CommonResult<ExamQuestion> getExamQuestionByExamId( { Integer examId)return CommonResult.<ExamQuestion>builder()
.data(examQuestionService.getExamQuestionByExamId(examId))
.build();
}
}
package com.wzz.controller;import com.wzz.entity.ExamRecord;import com.wzz.entity.Question;import com.wzz.entity.QuestionBank;import com.wzz.service.*;import com.wzz.utils.OSSUtil;import com.wzz.vo.*;import io.swagger.annotations.Api;import io.swagger.annotations.ApiImplicitParam;import io.swagger.annotations.ApiImplicitParams;import io.swagger.annotations.ApiOperation;import lombok.RequiredArgsConstructor;import lombok.extern.slf4j.Slf4j;import org.springframework.validation.annotation.Validated;import org.springframework.web.bind.annotation.*;import org.springframework.web.multipart.MultipartFile;import javax.validation.Valid;import java.util.List;/**
* @author wzz
* @implNote 2021/10/24 15:42
*/public class TeacherController { private final ExamService examService; private final UserService userService; private final QuestionService questionService; private final ExamRecordService examRecordService; private final QuestionBankService questionBankService;
public CommonResult<List<QuestionBank>> getQuestionBank() { return CommonResult.<List<QuestionBank>>builder()
.data(questionBankService.getAllQuestionBanks())
.build();
}
public CommonResult<PageResponse<Question>> getQuestion( { String questionType, String questionBank, String questionContent,
Integer pageNo, Integer pageSize)return CommonResult.<PageResponse<Question>>builder()
.data(questionService.getQuestion(questionType, questionBank, questionContent, pageNo, pageSize))
.build();
}
public CommonResult<Void> deleteQuestion(String questionIds) {
questionService.deleteQuestionByIds(questionIds); return CommonResult.<Void>builder()
.build();
}
public CommonResult<String> addBankQuestion(String questionIds, String banks) {
questionBankService.addQuestionToBank(questionIds, banks); return CommonResult.<String>builder()
.build();
}
public CommonResult<Void> removeBankQuestion(String questionIds, String banks) {
questionBankService.removeBankQuestion(questionIds, banks); return CommonResult.<Void>builder()
.build();
}
public CommonResult<String> uploadQuestionImage(MultipartFile file) throws Exception {
log.info("开始上传文件: {}", file.getOriginalFilename()); return CommonResult.<String>builder()
.data(OSSUtil.picOSS(file))
.message("上传成功")
.build();
}
public CommonResult<Void> addQuestion( {
questionService.addQuestion(questionVo); QuestionVo questionVo)return CommonResult.<Void>builder().build();
}
public CommonResult<Void> updateQuestion( {
questionService.updateQuestion(questionVo); QuestionVo questionVo)return CommonResult.<Void>builder()
.build();
}
public CommonResult<Void> deleteQuestionBank(String ids) {
questionBankService.deleteQuestionBank(ids); return CommonResult.<Void>builder()
.build();
}
public CommonResult<Void> addQuestionBank( {
questionBankService.addQuestionBank(questionBank); QuestionBank questionBank)return CommonResult.<Void>builder()
.build();
}
public CommonResult<Void> operationExam( {
examService.operationExam(type, ids); Integer type, String ids)return CommonResult.<Void>builder()
.build();
}
public CommonResult<Void> addExamByBank( {
examService.addExamByBank(addExamByBankVo); AddExamByBankVo addExamByBankVo)return CommonResult.<Void>builder()
.build();
}
public CommonResult<Void> addExamByQuestionList( {
examService.addExamByQuestionList(addExamByQuestionVo); AddExamByQuestionVo addExamByQuestionVo)return CommonResult.<Void>builder()
.build();
}
public CommonResult<Void> updateExamInfo( {
examService.updateExamInfo(addExamByQuestionVo); AddExamByQuestionVo addExamByQuestionVo)return CommonResult.<Void>builder()
.build();
}
public CommonResult<PageResponse<ExamRecord>> getExamRecord( { Integer examId, Integer pageNo, Integer pageSize)return CommonResult.<PageResponse<ExamRecord>>builder()
.data(examRecordService.getExamRecord(examId, pageNo, pageSize))
.build();
} // TODO 改成ids查询
public CommonResult<UserInfoVo> getUserById( { Integer userId)return CommonResult.<UserInfoVo>builder()
.data(userService.getUserInfoById(userId))
.build();
}
public CommonResult<Void> setObjectQuestionScore(Integer totalScore, Integer examRecordId) {
examRecordService.setObjectQuestionScore(totalScore, examRecordId); return CommonResult.<Void>builder()
.build();
}
public CommonResult<List<String>> getExamPassRate() { return CommonResult.<List<String>>builder()
.data(examService.getExamPassRateEchartData())
.build();
}
public CommonResult<List<String>> getExamNumbers() { return CommonResult.<List<String>>builder()
.data(examService.getExamNumbersEchartData())
.build();
}
}
package com.wzz.controller;import com.wzz.entity.Exam;import com.wzz.service.ExamService;import com.wzz.service.NoticeService;import com.wzz.service.QuestionBankService;import com.wzz.vo.*;import io.swagger.annotations.Api;import io.swagger.annotations.ApiImplicitParam;import io.swagger.annotations.ApiImplicitParams;import io.swagger.annotations.ApiOperation;import lombok.RequiredArgsConstructor;import org.springframework.web.bind.annotation.*;import java.util.List;public class PublicController { private final NoticeService noticeService; private final ExamService examService; private final QuestionBankService questionBankService;
public CommonResult<PageResponse<Exam>> getExamInfo( { ExamQueryVo examQueryVo)return CommonResult.<PageResponse<Exam>>builder()
.data(examService.getExamPage(examQueryVo))
.build();
}
public CommonResult<AddExamByQuestionVo> getExamInfoById( { Integer examId)return CommonResult.<AddExamByQuestionVo>builder()
.data(examService.getExamInfoById(examId))
.build();
}
public CommonResult<List<Exam>> allExamInfo() { return CommonResult.<List<Exam>>builder()
.data(examService.list(null))
.build();
}
public CommonResult<PageResponse<BankHaveQuestionSum>> getBankHaveQuestionSumByType( { String bankName,
Integer pageNo, Integer pageSize)return CommonResult.<PageResponse<BankHaveQuestionSum>>builder()
.data(questionBankService.getBankHaveQuestionSumByType(bankName, pageNo, pageSize))
.build();
}
public CommonResult<List<QuestionVo>> getQuestionByBankIdAndType(Integer bankId, Integer type) { return CommonResult.<List<QuestionVo>>builder()
.data(questionBankService.getQuestionByBankIdAndType(bankId, type))
.build();
}
public CommonResult<List<QuestionVo>> getQuestionByBank(Integer bankId) { return CommonResult.<List<QuestionVo>>builder()
.data(questionBankService.getQuestionsByBankId(bankId))
.build();
}
public CommonResult<String> getCurrentNewNotice() { return CommonResult.<String>builder()
.data(noticeService.getCurrentNotice())
.build();
}
}