Java Online Exam在線考試系統(tǒng)的實(shí)現(xiàn)
一、項(xiàng)目簡(jiǎn)述
本系統(tǒng)主要實(shí)現(xiàn)的功能有: 學(xué)生以及老師的注冊(cè)登錄,在線考試,錯(cuò)題查詢,學(xué)生管理,問題管理,錯(cuò)題管理,錯(cuò)題查詢,分?jǐn)?shù)查詢,試卷管 理,人工組卷。自動(dòng)組卷,教師,班級(jí),統(tǒng)計(jì)等等管理功能。
二、項(xiàng)目運(yùn)行
環(huán)境配置: Jdk1.8 + Tomcat8.5 + mysql + Eclispe (IntelliJ IDEA,Eclispe,MyEclispe,Sts 都支持)
項(xiàng)目技術(shù): VUE+Springboot+ SpringMVC + MyBatis + ThymeLeaf + JavaScript + JQuery + Ajax + maven等等





課程信息控制器:
/**
* yy
*/
@RestController
@RequestMapping(value = "/v1/subjects")
public class SubjectController {
private static Logger logger = LoggerFactory.getLogger(SubjectController.class);
@Autowired
SubjectService subjectService;
@ApiOperation(value = "獲取科目列表", notes = "")
@RequestMapping(value = "", method = RequestMethod.GET)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "')")
public PageInfo<Subject> getSubjectList(@RequestParam(required = false) Integer pageIndex,
@RequestParam(required = false) Integer pageSize,
@RequestParam(required = false) Integer limit,
@RequestParam(required = false) Integer offset) {
if(pageIndex != null && pageSize != null) {
PageHelper.startPage(pageIndex, pageSize);
}
List<Subject> subjects = subjectService.getSubjectList();
PageInfo pageInfo = new PageInfo(subjects);
return pageInfo;
}
@ApiOperation(value = "根據(jù)名字獲取科目信息", notes = "根據(jù)科目名稱獲取科目詳細(xì)信息")
@ApiImplicitParam(name = "name", value = "科目名稱", required = true, dataType = "String", paramType = "path")
@RequestMapping(value = "/{name}/name", method = RequestMethod.GET)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "')")
public List<Subject> getSubjectByName(@PathVariable String name) {
return subjectService.getSubjectFuzzy(name);
}
@ApiOperation(value = "獲取課程信息", notes = "根據(jù)課程id獲取課程詳細(xì)信息")
@ApiImplicitParam(name = "idOrName", value = "課程ID或名稱", required = true, dataType = "String", paramType = "path")
@RequestMapping(value = "/search/{idOrName}", method = RequestMethod.GET)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "')")
public List<Subject> getSubjectForSearch(@PathVariable String idOrName) {
List<Subject> subjects = new ArrayList<Subject>();
Subject subject = subjectService.getSubjectByName(idOrName);
if (subject == null) {
try {
subject = subjectService.getSubjectById(idOrName);
} catch (Exception e) {
}
}
if (subject != null) {
subjects.add(subject);
}
return subjects;
}
@ApiOperation(value = "創(chuàng)建課程", notes = "創(chuàng)建課程")
@ApiImplicitParam(name = "subject", value = "課程實(shí)體Subject", required = true, dataType = "Subject")
@RequestMapping(value = "", method = RequestMethod.POST)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "')")
public ResponseEntity<?> postSubject(@RequestBody Subject subject) {
if(subjectService.getSubjectByName(subject.getName()) != null) {
return new ResponseEntity<Object>(new Dto("課程已存在!"), HttpStatus.INTERNAL_SERVER_ERROR);
}
subjectService.saveSubject(subject);
return new ResponseEntity(HttpStatus.CREATED);
}
@ApiOperation(value = "獲取課程信息", notes = "根據(jù)課程id獲取課程詳細(xì)信息")
@ApiImplicitParam(name = "id", value = "課程ID", required = true, dataType = "String", paramType = "path")
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "')")
public Subject getSubject(@PathVariable String id) {
return subjectService.getSubjectById(id);
}
@ApiOperation(value = "更新課程信息", notes = "根據(jù)課程id更新用戶信息")
@ApiImplicitParam(name = "subject", value = "課程實(shí)體", required = true, dataType = "Subject")
@RequestMapping(value = "", method = RequestMethod.PUT)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "')")
public ResponseEntity<?> putSubject(@RequestBody Subject subject) {
subjectService.updateSubject(subject);
return new ResponseEntity(HttpStatus.OK);
}
@ApiOperation(value = "刪除課程", notes = "根據(jù)課程id刪除課程")
@ApiImplicitParam(name = "id", value = "課程ID", required = true, dataType = "Long", paramType = "path")
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "')")
public ResponseEntity<?> deleteSubject(@PathVariable String id) {
try {
subjectService.deleteSubject(id);
}catch (RuntimeException e) {
return new ResponseEntity(new Dto("該課程包含有考試,不能刪除"), HttpStatus.INTERNAL_SERVER_ERROR);
}
return new ResponseEntity(HttpStatus.OK);
}
}
題目信息控制器:
/**
* yy
*/
@RestController
@RequestMapping(value = "/v1/questions")
public class QuestionController {
private static Logger logger = LoggerFactory.getLogger(QuestionController.class);
@Autowired
QuestionService questionService;
@Autowired
PaperAnswerPaperService paperAnswerPaperService;
@ApiOperation(value = "獲取題目分頁列表", notes = "")
@RequestMapping(value = "", method = RequestMethod.GET)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "')")
public PageInfo<Question> getQuestionListByPage(@RequestParam(required = false) Integer pageIndex,
@RequestParam(required = false) Integer pageSize,
@RequestParam(required = false) Integer limit,
@RequestParam(required = false) Integer offset) {
if(pageIndex != null && pageSize != null) {
PageHelper.startPage(pageIndex, pageSize);
}
List<Question> questions = questionService.getQuestionList();
PageInfo pageInfo = new PageInfo(questions);
return pageInfo;
}
@ApiOperation(value = "獲取試卷題目分頁列表", notes = "")
@RequestMapping(value = "/papers/{paperId}", method = RequestMethod.GET)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "')")
public PageInfo<Question> getQuestionListByPaper(@PathVariable String paperId,
@RequestParam(required = false) Integer pageIndex,
@RequestParam(required = false) Integer pageSize,
@RequestParam(required = false) Integer limit,
@RequestParam(required = false) Integer offset) {
if(pageIndex != null && pageSize != null) {
PageHelper.startPage(pageIndex, pageSize);
}
List<Question> questions = questionService.getQuestionListByPaper(paperId);
PageInfo pageInfo = new PageInfo(questions);
return pageInfo;
}
@ApiOperation(value = "獲取試卷題目數(shù)量", notes = "")
@RequestMapping(value = "/papers/{paperId}/count", method = RequestMethod.GET)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
public ResponseEntity<?> getQuestionCountByPaper(@PathVariable String paperId) {
Integer count = questionService.countByPaperId(paperId);
return new ResponseEntity<Object>(count, HttpStatus.OK);
}
@ApiOperation(value = "創(chuàng)建題目", notes = "創(chuàng)建題目")
@ApiImplicitParams({
@ApiImplicitParam(name = "question", value = "題目實(shí)體Question", required = true, dataType = "Question"),
@ApiImplicitParam(name = "id", value = "試卷id", required = true, dataType = "String", paramType = "path")
})
@RequestMapping(value = "/{id}", method = RequestMethod.POST)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "')")
public ResponseEntity<?> postQuestion(@PathVariable("id") String id, @RequestBody Question question) {
questionService.saveQuestion(id, question);
return new ResponseEntity(HttpStatus.CREATED);
}
@ApiOperation(value = "獲取題目信息", notes = "根據(jù)題目id獲取題目詳細(xì)信息")
@ApiImplicitParam(name = "id", value = "題目ID", required = true, dataType = "String", paramType = "path")
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
public Question getQuestion(@PathVariable String id) {
return questionService.getQuestion(id);
}
@ApiOperation(value = "根據(jù)試卷id和題目編號(hào)獲取題目信息", notes = "根據(jù)題目id獲取題目詳細(xì)信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "paperId", value = "試卷ID", required = true, dataType = "String", paramType = "path"),
@ApiImplicitParam(name = "number", value = "題目編號(hào)", required = true, dataType = "String", paramType = "path")
})
@RequestMapping(value = "/papers/{paperId}/questions/{number}", method = RequestMethod.GET)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
public Question getQuestionByPaperIdAndQuestionId(@PathVariable String paperId,
@PathVariable Integer number,
@RequestParam(required = false) String answerPaperId) {
PaperAnswerPaper paperAnswerPaper = null;
//傳入的是答卷Id
if(answerPaperId != null) {
// TODO: 2017-04-17
paperAnswerPaper = paperAnswerPaperService.getByAnswerPaperId(answerPaperId);
if(paperAnswerPaper != null) {
return questionService.getQuestionByPaperIdAndQuestionNumber(paperAnswerPaper.getPaperId(), number);
}else {
logger.error("根據(jù)答卷id獲取答卷失敗");
}
}
return questionService.getQuestionByPaperIdAndQuestionNumber(paperId, number);
}
@ApiOperation(value = "獲取題目信息", notes = "根據(jù)題目name獲取題目詳細(xì)信息")
@ApiImplicitParam(name = "name", value = "試卷name", required = true, dataType = "String", paramType = "path")
@RequestMapping(value = "/name/{name}", method = RequestMethod.GET)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
public List<Question> getQuestionByName(@PathVariable String name) {
//模糊查詢
return questionService.getQuestionFuzzy(name);
}
@ApiOperation(value = "獲取題目信息", notes = "根據(jù)試卷id獲取所有題目")
@ApiImplicitParam(name = "paperId", value = "試卷ID", required = true, dataType = "String", paramType = "path")
@RequestMapping(value = "/papers/{paperId}/questions", method = RequestMethod.GET)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
public List<Question> getQuestionByPaperId(@PathVariable String paperId) {
return questionService.getQuestionByPaperId(paperId);
}
@ApiOperation(value = "獲取題目信息", notes = "根據(jù)試卷id獲取所有題目,但不返回答案")
@ApiImplicitParam(name = "paperId", value = "試卷ID", required = true, dataType = "String", paramType = "path")
@RequestMapping(value = "/papers/{paperId}/ignore", method = RequestMethod.GET)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
public List<Question> getQuestionByPaperIdIgnoreAnswer(@PathVariable String paperId) {
return questionService.getQuestionByPaperIdIgnoreAnswer(paperId);
}
@ApiOperation(value = "更新題目信息", notes = "根據(jù)題目id更新題目信息")
@ApiImplicitParam(name = "question", value = "題目實(shí)體", required = true, dataType = "Question")
@RequestMapping(value = "", method = RequestMethod.PUT)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "')")
public ResponseEntity<?> putQuestion(@RequestBody Question question) {
questionService.updateQuestion(question);
return new ResponseEntity(HttpStatus.OK);
}
@ApiOperation(value = "刪除題目", notes = "根據(jù)題目id刪除試卷")
@ApiImplicitParam(name = "id", value = "題目ID", required = true, dataType = "String", paramType = "path")
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "')")
public ResponseEntity<?> deleteQuestion(@PathVariable String id) {
questionService.deleteQuestion(id);
return new ResponseEntity(HttpStatus.OK);
}
}
考試控制層,負(fù)責(zé)試卷提交等:
/**
* 考試控制層,負(fù)責(zé)試卷提交等
*/
@RestController
@RequestMapping("/v1/exam")
public class ExamController {
@Autowired
ExamService examService;
@Autowired
AnswerPaperService answerPaperService;
@Autowired
AnswerQuestionService answerQuestionService;
@Autowired
AnswerPaperQuestionService answerPaperQuestionService;
@Autowired
QuestionService questionService;
@Autowired
PaperService paperService;
@Autowired
WrongQuestionService wrongQuestionService;
@Autowired
PaperAnswerPaperService paperAnswerPaperService;
@ApiOperation(value = "根據(jù)試卷id和題目編號(hào)獲取題目信息", notes = "根據(jù)題目id獲取題目詳細(xì)信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "paperId", value = "試卷ID", required = true, dataType = "String", paramType = "path"),
@ApiImplicitParam(name = "number", value = "題目編號(hào)", required = true, dataType = "String", paramType = "path")
})
@RequestMapping(value = "/questions/{number}", method = RequestMethod.GET)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
public Question getQuestionByPaperIdAndQuestionId(@RequestParam String paperId,
@RequestParam String username,
@RequestParam(required = false) String answerPaperId,
@PathVariable Integer number) {
Question question = null;
AnswerQuestion answerQuestion = null;
if(answerPaperId == null) {
Paper paper = paperService.getPaperById(paperId);
if(paper != null) {
AnswerPaper answerPaper = answerPaperService.findByAnswerUserAndPaperName(username, paper.getName());
if(answerPaper != null) {
answerQuestion = answerQuestionService.getAnswerQuestionByPaperIdAndQuestionNumber(answerPaper.getId(), number);
}
}
}else {
answerQuestion = answerQuestionService.getAnswerQuestionByPaperIdAndQuestionNumber(answerPaperId, number);
}
if(answerQuestion == null) {
question = questionService.getQuestionByPaperIdAndQuestionNumber(paperId, number);
if(question != null) {
//答案不返回
question.setAnswer("");
}
} else {
question = new Question();
question.setId(answerQuestion.getId());
question.setNumber(answerQuestion.getNumber());
question.setTitle(answerQuestion.getTitle());
question.setScore(answerQuestion.getScore());
question.setType(answerQuestion.getType());
question.setOptionA(answerQuestion.getOptionA());
question.setOptionB(answerQuestion.getOptionB());
question.setOptionC(answerQuestion.getOptionC());
question.setOptionD(answerQuestion.getOptionD());
question.setAnswer(answerQuestion.getAnswer());
}
return question;
}
@RequestMapping(value = "/submit/{type}/{username}", method = RequestMethod.POST)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
public ResponseEntity<?> submit(@RequestBody Paper paper, @PathVariable String type,
@PathVariable String username,
@RequestParam(required = false) String answerPaperId) {
/**
* 更改試卷狀態(tài),finished:true
*/
if(type.equals("official")) {
/**
* 正式考試
*/
AnswerPaper answerPaper = new AnswerPaper();
if(answerPaperId != null) {
answerPaper.setId(answerPaperId);
}else {
return new ResponseEntity<Object>(HttpStatus.INTERNAL_SERVER_ERROR);
}
answerPaper.setAnswerTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
answerPaper.setPaperName(paper.getName());
answerPaper.setAnswerUser(username);
answerPaper.setChecked("false");
answerPaper.setFinished("true");
answerPaper.setType("official");
examService.updateAnswerPaper(answerPaper);
} else if(type.equals("simulate")) {
/**
* 模擬考試
*/
AnswerPaper answerPaper = new AnswerPaper();
if(answerPaperId != null) {
answerPaper.setId(answerPaperId);
}else {
return new ResponseEntity<Object>(HttpStatus.INTERNAL_SERVER_ERROR);
}
answerPaper.setAnswerTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
answerPaper.setPaperName(paper.getName());
answerPaper.setAnswerUser(username);
answerPaper.setChecked("false");
answerPaper.setFinished("true");
answerPaper.setType("simulate");
examService.updateAnswerPaper(answerPaper);
}else if(type.equals("practice")) {
/**
* 1.接收提交的試卷
* 2.計(jì)算成績(jī)
* 3.記錄考試記錄
* 4.返回計(jì)算結(jié)果
*/
int score = 0;
//正確題目數(shù)
double right = 0.0;
//錯(cuò)誤題目數(shù)
double wrong = 0.0;
double correctRate = 0.0;
List<Question> questions = questionService.getQuestionByPaperId(paper.getId());
AnswerPaper answerPaper = answerPaperService.findByAnswerUserAndPaperName(username, paper.getName());
List<AnswerQuestion> answerQuestions = answerQuestionService.findByAnswerPaperId(answerPaper.getId());
/*保存題目信息,返回給前端*/
List<DtoRightAndWrong> results = new ArrayList<DtoRightAndWrong>();
DtoRightAndWrong dtoRightAndWrong = null;
//遍歷提交的試卷的題目
for(AnswerQuestion answerQuestion : answerQuestions) {
//遍歷包含正確答案的題目
for(Question question : questions) {
/**
* 1.題目序號(hào)相同
* 2.結(jié)果與答案相同
*/
if(answerQuestion.getNumber().equals(question.getNumber())) {
if(answerQuestion.getAnswer().equals(question.getAnswer())) {
/*累計(jì)得分*/
score += Integer.parseInt(question.getScore());
right ++;
}else {
wrong ++;
//記錄錯(cuò)題
dtoRightAndWrong = new DtoRightAndWrong();
dtoRightAndWrong.setQuestion(question);
dtoRightAndWrong.setAnswerQuestion(answerQuestion);
results.add(dtoRightAndWrong);
//保存錯(cuò)題
WrongQuestion wrongQuestion = new WrongQuestion();
try{
BeanUtils.copyProperties(wrongQuestion, answerQuestion);
wrongQuestion.setUsername(username);
wrongQuestion.setRightAnswer(question.getAnswer());
wrongQuestion.setAnalysis(question.getAnalysis());
if(wrongQuestionService.getWrongQuestion(wrongQuestion.getId()) == null) {
wrongQuestionService.saveQuestion(wrongQuestion);
}
}catch (Exception e) {
System.out.println(wrongQuestion.toString());
}
}
}
}
}
//計(jì)算正確率
correctRate = (right/(right + wrong)) * 100;
DtoResult result = new DtoResult();
result.setScore(score);
result.setRight(right);
result.setWrong(wrong);
result.setCorrectRate(correctRate);
result.setResults(results);
Paper paper1 = paperService.getPaperById(paper.getId());
//更新參與人數(shù)
paper1.setPeoples(String.valueOf(Integer.parseInt(paper1.getPeoples()) + 1));
paperService.updatePaper(paper1);
return new ResponseEntity<Object>(result, HttpStatus.OK);
}
Paper paper1 = paperService.getPaperById(paper.getId());
//更新參與人數(shù)
paper1.setPeoples(String.valueOf(Integer.parseInt(paper1.getPeoples() + 1)));
paperService.updatePaper(paper1);
return new ResponseEntity<Object>(HttpStatus.OK);
}
/**
* 提交題目
* @param username
* @param dtoAnswerPaper
* @return
*/
@RequestMapping(value = "/submit/one/{username}", method = RequestMethod.POST)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
public ResponseEntity<?> submitOne(@PathVariable String username, @RequestBody DtoAnswerPaper dtoAnswerPaper) {
Paper paper = dtoAnswerPaper.getPaper();
Question question = dtoAnswerPaper.getQuestion();
//判斷數(shù)據(jù)庫是否保存了這次答卷
AnswerPaper answerPaper = answerPaperService.getAnswerPaperByNameAndUser(paper.getName(), username);
AnswerQuestion answerQuestion = null;
AnswerPaperQuestion answerPaperQuestion = null;
List<AnswerQuestion> answerQuestions = null;
//重新生成id
String answerPaperId = IdGen.uuid();
String answerQuestionId = IdGen.uuid();
//答卷為空,則執(zhí)行保存
if(answerPaper == null) {
answerPaper = new AnswerPaper();
answerPaper.setId(answerPaperId);
answerPaper.setAnswerTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
answerPaper.setPaperName(paper.getName());
answerPaper.setType(paper.getType());
answerPaper.setAnswerUser(username);
answerPaper.setChecked("false");
answerPaper.setFinished("false");
//保存答卷
answerPaperService.saveAnswerPaper(answerPaper);
// TODO: 2017-04-17 保存試卷答卷
PaperAnswerPaper paperAnswerPaper = new PaperAnswerPaper();
paperAnswerPaper.setPaperId(paper.getId());
paperAnswerPaper.setAnswerPaperId(answerPaperId);
paperAnswerPaperService.save(paperAnswerPaper);
//新記錄
answerQuestion = new AnswerQuestion();
//初始化信息
answerQuestion.setId(answerQuestionId);
answerQuestion.setTitle(question.getTitle());
answerQuestion.setType(question.getType());
answerQuestion.setNumber(question.getNumber());
answerQuestion.setOptionA(question.getOptionA());
answerQuestion.setOptionB(question.getOptionB());
answerQuestion.setOptionC(question.getOptionC());
answerQuestion.setOptionD(question.getOptionD());
answerQuestion.setContent(question.getContent());
answerQuestion.setScore(question.getScore());
answerQuestion.setAnalysis(question.getAnalysis());
answerQuestion.setAnswer(question.getAnswer());
answerPaperQuestion = new AnswerPaperQuestion();
answerPaperQuestion.setAnswerPaperId(answerPaper.getId());
answerPaperQuestion.setAnswerQuestionId(answerQuestionId);
//保存
answerQuestionService.saveAnswerQuestion(answerQuestion);
answerPaperQuestionService.saveAnswerPaperQuestion(answerPaperQuestion);
return new ResponseEntity<Object>(answerPaper, HttpStatus.OK);
} else {
answerQuestions = answerQuestionService.findByAnswerPaperId(answerPaper.getId());
if(answerQuestions != null && answerQuestions.size() > 0) {
int count = 0;
AnswerQuestion existAnswerQuestion = null;
for(AnswerQuestion question1 : answerQuestions) {
if (question1.getNumber().equals(question.getNumber())) {
count++;
existAnswerQuestion = question1;//保存當(dāng)前存在的記錄
}
}
//記錄不存在
if(count == 0) {
//新記錄
answerQuestion = new AnswerQuestion();
answerPaperQuestion = new AnswerPaperQuestion();
answerQuestion = new AnswerQuestion();
//初始化信息
answerQuestion.setId(answerQuestionId);
answerQuestion.setTitle(question.getTitle());
answerQuestion.setType(question.getType());
answerQuestion.setNumber(question.getNumber());
answerQuestion.setOptionA(question.getOptionA());
answerQuestion.setOptionB(question.getOptionB());
answerQuestion.setOptionC(question.getOptionC());
answerQuestion.setOptionD(question.getOptionD());
answerQuestion.setContent(question.getContent());
answerQuestion.setScore(question.getScore());
answerQuestion.setAnalysis(question.getAnalysis());
answerQuestion.setAnswer(question.getAnswer());
answerPaperQuestion = new AnswerPaperQuestion();
answerPaperQuestion.setAnswerPaperId(answerPaper.getId());
answerPaperQuestion.setAnswerQuestionId(answerQuestionId);
//保存
answerQuestionService.saveAnswerQuestion(answerQuestion);
answerPaperQuestionService.saveAnswerPaperQuestion(answerPaperQuestion);
} else {
//記錄存在,則執(zhí)行更新
// TODO: 2017/3/30
//更新當(dāng)前存在的記錄
existAnswerQuestion.setAnswer(question.getAnswer());
answerQuestionService.updateAnswerQuestion(existAnswerQuestion);
}
}
}
return new ResponseEntity<Object>(answerPaper, HttpStatus.OK);
}
}
答卷控制層,用于獲取已經(jīng)提交的答卷:
/**
* 答卷控制層,用于獲取已經(jīng)提交的答卷
*/
@RestController
@RequestMapping("/v1/answer-papers")
public class AnswerPaperController {
@Autowired
AnswerPaperService answerPaperService;
@Autowired
AnswerQuestionService answerQuestionService;
/**
* 根據(jù)ID查找
* @param id
* @return
*/
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
public AnswerPaper getAnswerPaper(@PathVariable String id) {
return answerPaperService.getAnswerPaperById(id);
}
/**
* 根據(jù)name查找
* @param name
* @return
*/
@RequestMapping(value = "/name/{name}", method = RequestMethod.GET)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "')")
public List<AnswerPaper> getAnswerPaperByName(@PathVariable String name) {
return answerPaperService.getAnswerPaperFuzzy(name);
}
/**
* 根據(jù)答卷id和題目編號(hào)獲取題目信息
* @param paperId
* @param number
* @return
*/
@RequestMapping(value = "/papers/{paperId}/questions/{number}", method = RequestMethod.GET)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
public AnswerQuestion getQuestionByPaperIdAndQuestionId(@PathVariable String paperId, @PathVariable Integer number) {
AnswerQuestion answerQuestion = answerQuestionService.getAnswerQuestionByPaperIdAndQuestionNumber(paperId, number);
return answerQuestion;
}
/**
* 已分頁方式獲取數(shù)據(jù)
* @param username
* @param pageIndex
* @param pageSize
* @param limit
* @param offset
* @return
*/
@RequestMapping(value = "/users/{username}", method = RequestMethod.GET)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
public PageInfo<AnswerPaper> getListByUser(@PathVariable("username") String username,
@RequestParam(required = false) Integer pageIndex,
@RequestParam(required = false) Integer pageSize,
@RequestParam(required = false) Integer limit,
@RequestParam(required = false) Integer offset) {
if(pageIndex != null && pageSize != null) {
PageHelper.startPage(pageIndex, pageSize);
}
List<AnswerPaper> answerPapers = answerPaperService.getAnswerPaperListByAnswerUser(username);
PageInfo pageInfo = new PageInfo(answerPapers);
return pageInfo;
}
@RequestMapping(value = "/users/{username}/type/{type}", method = RequestMethod.GET)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
public PageInfo<AnswerPaper> getListByUserAndType(@PathVariable("username") String username,
@PathVariable("type") String type,
@RequestParam(required = false) Integer pageIndex,
@RequestParam(required = false) Integer pageSize,
@RequestParam(required = false) Integer limit,
@RequestParam(required = false) Integer offset) {
if(pageIndex != null && pageSize != null) {
PageHelper.startPage(pageIndex, pageSize);
}
List<AnswerPaper> answerPapers = answerPaperService.getAnswerPaperListByAnswerUserAndType(username, type);
PageInfo pageInfo = new PageInfo(answerPapers);
return pageInfo;
}
/**
* 獲取未批改或已批改的答卷數(shù)量,
* @return
*/
@RequestMapping("/check")
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "')")
public DtoTask countUnCheckAnswerPaper() {
DtoTask dtoTask = new DtoTask();
Integer checked = answerPaperService.countCheck("true");
Integer unChecked = answerPaperService.countCheck("false");
dtoTask.setChecked(checked);
dtoTask.setUnChecked(unChecked);
return dtoTask;
}
/**
* 以分頁方式獲取數(shù)據(jù)
* @param pageIndex
* @param pageSize
* @param limit
* @param offset
* @return
*/
@RequestMapping(value = "", method = RequestMethod.GET)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "')")
public PageInfo<AnswerPaper> getListByUser(@RequestParam(required = false) Integer pageIndex,
@RequestParam(required = false) Integer pageSize,
@RequestParam(required = false) Integer limit,
@RequestParam(required = false) Integer offset) {
if(pageIndex != null && pageSize != null) {
PageHelper.startPage(pageIndex, pageSize);
}
List<AnswerPaper> answerPapers = answerPaperService.getAnswerPaperList();
PageInfo pageInfo = new PageInfo(answerPapers);
return pageInfo;
}
/**
* 更新
* @param answerPaper
* @return
*/
@RequestMapping(value = "", method = RequestMethod.PUT)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "')")
public ResponseEntity<?> putPaper(@RequestBody AnswerPaper answerPaper) {
answerPaperService.updatePaper(answerPaper);
return new ResponseEntity(HttpStatus.OK);
}
/**
* 計(jì)算考試成績(jī)
* @param id
* @return
*/
@RequestMapping(value = "/{id}/calculate", method = RequestMethod.PUT)
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "') or hasAuthority('" + Role.ROLE_STUDENT + "')")
public ResponseEntity<?> CalculationScore(@PathVariable String id) {
/**
* 計(jì)算成績(jī)
*/
List<AnswerQuestion> questions = answerQuestionService.findByAnswerPaperId(id);
if(questions != null && questions.size() > 0) {
int score = 0;
try {
for(AnswerQuestion question : questions) {
score += Integer.parseInt(question.getMarkScore());
}
} catch (Exception e) {
// TODO: 2017/4/1
}
/**
* 保存成績(jī)
*/
AnswerPaper answerPaper = new AnswerPaper();
answerPaper.setId(id);
answerPaper.setScore(Integer.toString(score));
answerPaper.setChecked("true");
answerPaperService.updatePaper(answerPaper);
} else {
// TODO: 2017/4/1
}
return new ResponseEntity<Object>(HttpStatus.OK);
}
@RequestMapping(value = "/analysis/paper")
@PreAuthorize("hasAuthority('" + Role.ROLE_TEACHER + "') or hasAuthority('" + Role.ROLE_ADMIN + "')")
public List<PaperAnalysis> analysisPaper() {
return answerPaperService.analysisPaper();
}
}
以上就是Java Online Exam在線考試系統(tǒng)的實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于Java 在線考試系統(tǒng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解JAVA 設(shè)計(jì)模式之狀態(tài)模式
這篇文章主要介紹了JAVA 狀態(tài)模式的的相關(guān)資料,文中講解的非常細(xì)致,幫助大家更好的學(xué)習(xí)理解JAVA 設(shè)計(jì)模式,感興趣的朋友可以了解下2020-06-06
Java實(shí)現(xiàn)操作JSON的便捷工具類完整實(shí)例【重寫Google的Gson】
這篇文章主要介紹了Java實(shí)現(xiàn)操作JSON的便捷工具類,基于重寫Google的Gson實(shí)現(xiàn),涉及java針對(duì)json數(shù)據(jù)的各種常見轉(zhuǎn)換操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-10-10
SpringCloudAlibaba整合Feign實(shí)現(xiàn)遠(yuǎn)程HTTP調(diào)用的簡(jiǎn)單示例
這篇文章主要介紹了SpringCloudAlibaba 整合 Feign 實(shí)現(xiàn)遠(yuǎn)程 HTTP 調(diào)用,文章中使用的是OpenFeign,是Spring社區(qū)開發(fā)的組件,需要的朋友可以參考下2021-09-09
教你用Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的代碼生成器
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著如何用Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的代碼生成器展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
Java實(shí)現(xiàn)定時(shí)任務(wù)的方法詳解
大家都用過鬧鐘,鬧鐘可以說是一種定時(shí)任務(wù)。那么,在?Java?中,如何實(shí)現(xiàn)這樣的功能呢?即如何實(shí)現(xiàn)定時(shí)任務(wù)呢?本文就來詳細(xì)和大家聊聊2022-10-10
Java動(dòng)態(tài)數(shù)組ArrayList實(shí)現(xiàn)動(dòng)態(tài)原理
ArrayList是一種動(dòng)態(tài)數(shù)組,它可以在運(yùn)行時(shí)自動(dòng)調(diào)整大小以適應(yīng)元素的添加和刪除,在Java中,你可以使用ArrayList類來實(shí)現(xiàn)動(dòng)態(tài)數(shù)組,本文將給大家介紹一下ArrayList動(dòng)態(tài)數(shù)組,是怎么實(shí)現(xiàn)動(dòng)態(tài)的2023-08-08
Spring為singleton?bean注入prototype?bean
這篇文章主要介紹了Spring為singleton?bean注入prototype?bean,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07
Java實(shí)戰(zhàn)寵物醫(yī)院預(yù)約掛號(hào)系統(tǒng)的實(shí)現(xiàn)流程
只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+JSP+Spring+SpringBoot+MyBatis+html+layui+maven+Mysql實(shí)現(xiàn)一個(gè)寵物醫(yī)院預(yù)約掛號(hào)系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2022-01-01

