作者主页:编程指南针
作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师
主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助
文末获取源码
项目编号:BS-XX-105
互联网的普及给人们带来的便利不需多说。因此如果把题库及试卷管理系统与互联网结合起来,利用My Eclipse编程软件建设题库及试卷管理系统,实现题库及试卷管理系统的网络化。则对于进一步提高教学发展定能起到不少的促进作用。
题库及试卷管理系统能够通过互联网得到广泛的、全面的宣传,让尽可能多的学校了解和熟知学校的题库及试卷管理系统服务等,不仅为学校提供了服务,而且也推广了自己,让更多的学生了解自己。对于学校而言,若拥有自己的题库及试卷管理系统,通过题库及试卷管理系统让学校的宣传、营销提上一个新台阶,同时提升了学校形象。
根据本系统的研究现状和发展趋势,系统从需求分析、结构设计、数据库设计,在到系统实现,分别为前端实现和后端实现。论文内容从系统描述、系统分析、系统设计、系统实现、系统测试来阐述系统的开发过程。本系统力求结合实际找出一种切实可行的开发方案,经过反复研究和学习,借助My Eclipse编程软件、SSM技术、MySQL数据库和Tomcat服务器来完成系统的所有功能,最后进行系统测试,来检测系统的权限和漏洞,从而将系统完善,达到符合标准。
本项目主要实现SSM开发框架实现在线考试管理系统,采用前后端分离的方式开发实现,基于接口实现前后端开发对接,后端服务系统主要实现的管理功能有:试题管理、试卷管理、考试管理、用户管理、数据字典管理、系统设置管理。前端用户服务实现的功能有:试题练习、在线考试、会员中心、统计知识掌握情况、统计分析各种考试数据等功能。整体功能比较强大,也比较完整。
根据前面的各项设计分析,按照系统开发的基本理念对系统进行分解,从模块上主要可分为用户模块和管理员模块。
用户模块只要是让普通用户使用,包括题库及试卷管理,成绩查询等功能,管理员模块只要是让管理员使用,包括学生信息管理、教师信息管理、试卷管理等功能,可以对数据进行添加、删除、修改及查询等操作。
系统总体功能结构图如下图所示。
根据前面的各项设计分析,按照系统开发的基本理念对系统进行分解,从模块上主要可分为用户模块和管理员模块。
用户模块只要是让普通用户使用,包括题库及试卷管理,成绩查询等功能,管理员模块只要是让管理员使用,包括学生信息管理、教师信息管理、试卷管理等功能,可以对数据进行添加、删除、修改及查询等操作。
系统总体功能结构图如下图所示。
语言环境:Java: jdk1.8
数据库:Mysql: mysql5.7
应用服务器:Tomcat: tomcat8.5.31
开发工具:IDEA或eclipse
后台开发技术:SSM框架+SpringSecurity安全框架
前台开发技术:Bootstrap+Ajax
后台管理界面:
管理首页
试题管理
试题添加
试卷管理
创建试卷
考试管理
用户管理
通用数据管理
系统设置
教师登陆系统
试卷管理
前端用户服务系统
试题练习
答题模式
背题模式
在线考试
在线考试
会员中心
个人设置
- package com.examstack.management.controller.action;
-
- import java.util.ArrayList;
- import java.util.List;
-
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.security.core.context.SecurityContextHolder;
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.Model;
- import org.springframework.web.bind.annotation.PathVariable;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
- import org.springframework.web.bind.annotation.ResponseBody;
-
- import com.examstack.common.domain.exam.ExamHistory;
- import com.examstack.common.domain.exam.ExamPaper;
- import com.examstack.common.domain.question.PointStatistic;
- import com.examstack.common.domain.question.Question;
- import com.examstack.common.domain.question.QuestionFilter;
- import com.examstack.common.domain.user.User;
- import com.examstack.common.util.Page;
- import com.examstack.management.security.UserInfo;
- import com.examstack.management.service.ExamPaperService;
- import com.examstack.management.service.ExamService;
- import com.examstack.management.service.QuestionService;
- import com.examstack.management.service.UserService;
-
- @Controller
- public class DashBoardAction {
-
- @Autowired
- private QuestionService questionService;
- @Autowired
- private UserService userService;
- @Autowired
- private ExamPaperService examPaperService;
- @Autowired
- private ExamService examService;
- @RequestMapping(value = "/secure/dashboard/baseinfo", method = RequestMethod.GET)
- public @ResponseBody List
baseInfo(Model model) { -
- UserInfo userInfo = (UserInfo) SecurityContextHolder.getContext()
- .getAuthentication()
- .getPrincipal();
- Page
pageUser = new Page(); - pageUser.setPageNo(1);
- pageUser.setPageSize(1);
- userService.getUserListByRoleId(userInfo.getRoleMap().get("ROLE_STUDENT").getRoleId(), pageUser);
-
- Page
pageQuestion = new Page(); - pageQuestion.setPageNo(1);
- pageQuestion.setPageSize(1);
- QuestionFilter qf = new QuestionFilter();
- qf.setFieldId(0);
- qf.setKnowledge(0);
- qf.setQuestionType(0);
- qf.setTag(0);
- qf.setSearchParam("-1");
- questionService.getQuestionList(pageQuestion, qf);
-
- Page
pageExamPaper = new Page(); - pageExamPaper.setPageNo(1);
- pageExamPaper.setPageSize(1);
- examPaperService.getEnabledExamPaperList(userInfo.getUsername(), pageExamPaper);
- List
l = new ArrayList(); - l.add(pageQuestion.getTotalRecord());
- l.add(pageExamPaper.getTotalRecord());
- l.add(pageUser.getTotalRecord());
- return l;
- }
-
- @RequestMapping(value = "/secure/dashboard/studentApprovedList", method = RequestMethod.GET)
- public @ResponseBody List
studentApprovedList(Model model) { - Page
page = new Page(); - page.setPageNo(1);
- page.setPageSize(4);
- List
histList = examService.getUserExamHistList(page, 0); -
- return histList;
- }
-
- @RequestMapping(value = "/secure/dashboard/StudentMarkList", method = RequestMethod.GET)
- public @ResponseBody List
studentMarkList(Model model) { - Page
page = new Page(); - page.setPageNo(1);
- page.setPageSize(4);
- List
histList = examService.getUserExamHistList(page, 2); -
- return histList;
- }
-
- @RequestMapping(value = "/secure/dashboard/chartinfo/{fieldId}", method = RequestMethod.GET)
- public @ResponseBody List
chartInfo(Model model,@PathVariable("fieldId") int fieldId) { -
- List
pointStatisticList = questionService.getPointCount(fieldId, null); - List
l = new ArrayList(); -
- for(PointStatistic ps : pointStatisticList){
- FieldNumber fieldNumber = new FieldNumber();
- fieldNumber.name = ps.getPointName();
- fieldNumber.amount = ps.getAmount();
- l.add(fieldNumber);
- }
-
- return l;
- }
-
-
- class FieldNumber{
- private String name;
- private int amount;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAmount() {
- return amount;
- }
- public void setAmount(int amount) {
- this.amount = amount;
- }
-
- }
-
- }
- package com.examstack.management.controller.action;
-
- import java.util.List;
-
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.PathVariable;
- import org.springframework.web.bind.annotation.RequestBody;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
- import org.springframework.web.bind.annotation.ResponseBody;
-
- import com.examstack.common.domain.exam.AnswerSheet;
- import com.examstack.common.domain.exam.AnswerSheetItem;
- import com.examstack.common.domain.exam.ExamPaper;
- import com.examstack.common.domain.exam.Message;
- import com.examstack.management.service.ExamPaperService;
- import com.examstack.management.service.ExamService;
- import com.google.gson.Gson;
-
- @Controller
- public class ExamAction {
- @Autowired
- private ExamPaperService examPaperService;
- @Autowired
- private ExamService examService;
- @RequestMapping(value = "/api/exampaper/{id}", method = RequestMethod.GET)
- public @ResponseBody ExamPaper getExamPaper(@PathVariable("id") int id){
- ExamPaper paper = examPaperService.getExamPaperById(id);
- return paper;
- }
-
- @RequestMapping(value = "/api/answersheet", method = RequestMethod.POST)
- public @ResponseBody Message submitAnswerSheet(@RequestBody AnswerSheet answerSheet){
-
- List
itemList = answerSheet.getAnswerSheetItems(); -
- //全部是客观题,则状态更改为已阅卷
- int approved = 3;
- for(AnswerSheetItem item : itemList){
- if(item.getQuestionTypeId() != 1 && item.getQuestionTypeId() != 2 && item.getQuestionTypeId() != 3){
- approved = 2;
- break;
- }
- }
- Gson gson = new Gson();
- examService.updateUserExamHist(answerSheet, gson.toJson(answerSheet),approved);
-
- return new Message();
- }
-
- }
- package com.examstack.management.controller.action;
-
- import java.io.FileNotFoundException;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.List;
-
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
-
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.security.core.context.SecurityContextHolder;
- import org.springframework.security.core.userdetails.UserDetails;
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.Model;
- import org.springframework.web.bind.annotation.PathVariable;
- import org.springframework.web.bind.annotation.RequestBody;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
- import org.springframework.web.bind.annotation.ResponseBody;
-
- import com.examstack.common.domain.exam.Message;
- import com.examstack.common.domain.question.KnowledgePoint;
- import com.examstack.common.domain.question.Question;
- import com.examstack.common.domain.question.QuestionTag;
- import com.examstack.common.util.file.FileUploadUtil;
- import com.examstack.management.security.UserInfo;
- import com.examstack.management.service.QuestionService;
- import com.google.gson.Gson;
- import com.google.gson.JsonElement;
- import com.google.gson.JsonParser;
- import com.google.gson.reflect.TypeToken;
-
- @Controller
- public class QuestionAction {
-
- @Autowired
- private QuestionService questionService;
-
- /**
- * 添加试题
- *
- * @param question
- * @return
- */
- @RequestMapping(value = "/secure/question/question-add", method = RequestMethod.POST)
- public @ResponseBody Message addQuestion(@RequestBody Question question) {
-
- UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
- Message message = new Message();
- Gson gson = new Gson();
- question.setContent(gson.toJson(question.getQuestionContent()));
- question.setCreate_time(new Date());
- question.setCreator(userDetails.getUsername());
- try {
- questionService.addQuestion(question);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- message.setResult("error");
- message.setMessageInfo(e.getClass().getName());
- e.printStackTrace();
- }
-
- return message;
- }
-
- /**
- * 获取试题的标签列表
- *
- * @param questionId
- * @return
- */
- @RequestMapping(value = "/secure/question/question-tag/{questionId}", method = RequestMethod.GET)
- public @ResponseBody Message getQuestionTag(@PathVariable("questionId") int questionId) {
- Message message = new Message();
- UserInfo userInfo = (UserInfo) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
- List
tagList = questionService.getQuestionTagByQuestionIdAndUserId(questionId, - userInfo.getUserid(), null);
- message.setObject(tagList);
- return message;
- }
-
- /**
- * 为试题添加标签
- *
- * @param questionId
- * @param questionTagList
- * @return
- */
- @RequestMapping(value = "/secure/question/add-question-tag", method = RequestMethod.POST)
- public @ResponseBody Message addQuestionTag(@RequestBody int questionId,
- @RequestBody List
questionTagList) { - Message message = new Message();
- UserInfo userInfo = (UserInfo) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
- try {
- questionService.addQuestionTag(questionId, userInfo.getUserid(), questionTagList);
- } catch (Exception e) {
- e.printStackTrace();
- message.setResult(e.getClass().getName());
- }
-
- return message;
- }
-
- /**
- * 获取试题详细信息
- * @param questionId
- * @return
- */
- @RequestMapping(value = "/secure/question/question-detail/{questionId}", method = RequestMethod.GET)
- public @ResponseBody Message getQuestionDetail(@PathVariable("questionId") int questionId) {
- Message message = new Message();
- //UserInfo userInfo = (UserInfo) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
- try {
- Question question = questionService.getQuestionDetail(questionId, 0);
- message.setObject(question);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- message.setResult(e.getCause().getMessage());
- }
- return message;
- }
- /**
- * 修改试题知识点
- *
- * @param questionId
- * @param pointId
- * @param questionTagList
- * @return
- */
- @RequestMapping(value = "/secure/question/question-update/{questionId}/{pointId}", method = RequestMethod.POST)
- public @ResponseBody Message updateQuestionKnowledge(@PathVariable int questionId, @PathVariable int pointId,
- @RequestBody List
questionTagList) { -
- Message message = new Message();
- UserInfo userInfo = (UserInfo) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
- Question question = new Question();
- question.setId(questionId);
- List
pointIdList = new ArrayList(); - pointIdList.add(pointId);
- question.setPointList(pointIdList);
- try {
- questionService.updateQuestionPoint(question, userInfo.getUserid(), questionTagList);
- } catch (Exception e) {
- message.setResult(e.getClass().getName());
- }
-
- return message;
- }
-
- @RequestMapping(value = "/secure/question/question-update", method = RequestMethod.POST)
- public @ResponseBody Message updateQuestion(@RequestBody String jsonStr){
- Message msg = new Message();
- Gson gson = new Gson();
- JsonParser parser = new JsonParser();
- JsonElement element = parser.parse(jsonStr);
- List
questionTagList = gson.fromJson(element.getAsJsonObject().get("tags"), new TypeToken>(){}.getType()); - Question question = gson.fromJson(element.getAsJsonObject().get("question"), Question.class);
- try {
- questionService.updateQuestion(question, questionTagList);
-
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- msg.setResult(e.getCause().getMessage());
- }
- //TO-DO:需要提交到数据库,保证在事务中提交
- return msg;
- }
-
- @RequestMapping(value = "/secure/question/get-knowledge-point/{fieldId}", method = RequestMethod.GET)
- public @ResponseBody Message getQuestionPointByFieldId(@PathVariable int fieldId) {
- Message message = new Message();
- HashMap
pointMap = new HashMap(); - List
pointList = questionService.getKnowledgePointByFieldId(fieldId, null); - for (KnowledgePoint point : pointList) {
- pointMap.put(point.getPointId(), point.getPointName());
- }
- message.setObject(pointMap);
- return message;
- }
-
- @RequestMapping(value = "/secure/question/delete-question/{questionId}", method = RequestMethod.GET)
- public @ResponseBody Message deleteQuestion(Model model, @PathVariable("questionId") int questionId) {
-
- // UserDetails userDetails = (UserDetails)
- // SecurityContextHolder.getContext().getAuthentication().getPrincipal();
- Message message = new Message();
- try {
- questionService.deleteQuestionByQuestionId(questionId);
- } catch (Exception ex) {
- message.setResult(ex.getClass().getName());
- }
-
- return message;
- }
-
- @RequestMapping(value = "/secure/upload-uploadify-img", method = RequestMethod.POST)
- public @ResponseBody String uploadImg(HttpServletRequest request, HttpServletResponse response) {
- UserInfo userInfo = (UserInfo) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
- List
filePathList = new ArrayList(); - try {
- filePathList = FileUploadUtil.uploadImg(request, response, userInfo.getUsername());
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (Exception ex) {
- ex.printStackTrace();
- }
-
- if (filePathList.size() == 0) {
- return "系统错误";
- }
-
- return filePathList.get(0);
- }
-
- @RequestMapping(value = "/secure/upload-uploadify", method = RequestMethod.POST)
- public @ResponseBody String uploadFile(HttpServletRequest request, HttpServletResponse response) {
- UserInfo userInfo = (UserInfo) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
- List
filePathList = new ArrayList(); - try {
- filePathList = FileUploadUtil.uploadFile(request, response, userInfo.getUsername());
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (Exception ex) {
- ex.printStackTrace();
- }
-
- if (filePathList.size() == 0) {
- return "系统错误";
- }
-
- return filePathList.get(0);
- }
-
- @RequestMapping(value = "/secure/question-import/{id}", method = RequestMethod.POST)
- public @ResponseBody Message courseImport(@RequestBody String filePath, @PathVariable("id") int id) {
- Message message = new Message();
- UserInfo userInfo = (UserInfo) SecurityContextHolder.getContext()
- .getAuthentication().getPrincipal();
- if(id == 0){
- message.setResult("error");
- message.setMessageInfo("请选择题库");
- return message;
- }
- try{
- questionService.uploadQuestions(filePath, userInfo.getUsername(),id);
- }catch(RuntimeException e){
- message.setResult(e.getClass().getName() + ":" + e.getMessage());
- message.setMessageInfo(e.getMessage());
- }
-
- return message;
- }
- }