文末获取源码
项目编号: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<Integer> baseInfo(Model model) {
UserInfo userInfo = (UserInfo) SecurityContextHolder.getContext()
.getAuthentication()
.getPrincipal();
Page<User> pageUser = new Page<User>();
pageUser.setPageNo(1);
pageUser.setPageSize(1);
userService.getUserListByRoleId(userInfo.getRoleMap().get("ROLE_STUDENT").getRoleId(), pageUser);
Page<Question> pageQuestion = new Page<Question>();
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<ExamPaper> pageExamPaper = new Page<ExamPaper>();
pageExamPaper.setPageNo(1);
pageExamPaper.setPageSize(1);
examPaperService.getEnabledExamPaperList(userInfo.getUsername(), pageExamPaper);
List<Integer> l = new ArrayList<Integer>();
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<ExamHistory> studentApprovedList(Model model) {
Page<ExamHistory> page = new Page<ExamHistory>();
page.setPageNo(1);
page.setPageSize(4);
List<ExamHistory> histList = examService.getUserExamHistList(page, 0);
return histList;
}
@RequestMapping(value = "/secure/dashboard/StudentMarkList", method = RequestMethod.GET)
public @ResponseBody List<ExamHistory> studentMarkList(Model model) {
Page<ExamHistory> page = new Page<ExamHistory>();
page.setPageNo(1);
page.setPageSize(4);
List<ExamHistory> histList = examService.getUserExamHistList(page, 2);
return histList;
}
@RequestMapping(value = "/secure/dashboard/chartinfo/{fieldId}", method = RequestMethod.GET)
public @ResponseBody List<FieldNumber> chartInfo(Model model,@PathVariable("fieldId") int fieldId) {
List<PointStatistic> pointStatisticList = questionService.getPointCount(fieldId, null);
List<FieldNumber> l = new ArrayList<FieldNumber>();
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<AnswerSheetItem> 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<QuestionTag> 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<QuestionTag> 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<QuestionTag> questionTagList) {
Message message = new Message();
UserInfo userInfo = (UserInfo) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
Question question = new Question();
question.setId(questionId);
List<Integer> pointIdList = new ArrayList<Integer>();
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<QuestionTag> questionTagList = gson.fromJson(element.getAsJsonObject().get("tags"), new TypeToken<ArrayList<QuestionTag>>(){}.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<Integer, String> pointMap = new HashMap<Integer, String>();
List<KnowledgePoint> 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<String> filePathList = new ArrayList<String>();
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<String> filePathList = new ArrayList<String>();
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;
}
}
五,项目总结