Java實(shí)現(xiàn)在線考試系統(tǒng)與設(shè)計(學(xué)生功能)
學(xué)生模塊功能比較少,就是進(jìn)行考試和查看自己成績兩個大的功能。
學(xué)生進(jìn)行考試的功能比較復(fù)雜(首先做了校驗(yàn),不在考試時間范圍內(nèi),不能進(jìn)行考試)
考試試題是數(shù)據(jù)庫根據(jù)發(fā)布考試時的條件隨機(jī)產(chǎn)生的一套試題。因?yàn)槊看慰荚囶}型題量都是不同的,因此我們繼續(xù)采用JSON的格式去保存數(shù)據(jù),當(dāng)狀態(tài)為1:表示正在考試;狀態(tài)為2:表示已經(jīng)考試結(jié)束;狀態(tài)為3:表示老師已經(jīng)閱完試卷
(1)當(dāng)考試考試的時候,會給考上隨機(jī)產(chǎn)生一套試題,并存儲到數(shù)據(jù)庫中,如果考試中電腦突然壞了可以保證重新打開還是之前的試題
(2)考試時間結(jié)束會自動提交考試,此時會將有學(xué)生成績的試題保存到數(shù)據(jù)庫中,老師批閱試卷就是從該JSON中讀取出來的
(3)老師批閱完試卷以后,狀態(tài)會變?yōu)?,JSON中會加上考生每道題的得分情況(考試倒計時根據(jù)考試考試時間和考試時間長度進(jìn)行計算出來的,如果下午四點(diǎn)考試結(jié)束,學(xué)生三點(diǎn)半登錄系統(tǒng),就只有半個小時時間進(jìn)行考試)
@InitBinder public void initBinder(WebDataBinder binder) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); } @RequestMapping("/list") public String showExam(HttpServletRequest request,Integer curr, Model model){ if (curr == null){ curr = 1; } HttpSession session = request.getSession(); Student student = (Student) session.getAttribute("studentInfo"); Integer classesid = student.getClassesid(); if (classesid != null){ PageInfo<Publishexam> publishexamList = publishExamService.selectAll(classesid, curr, 5); model.addAttribute("publishexamList", publishexamList); } model.addAttribute("studentInfo", student); return "/exam/list"; } //進(jìn)入考試頁面,初始化數(shù)據(jù) @SuppressWarnings("unchecked") @RequestMapping("/exam") public String exam(HttpServletRequest request,int id,Model model){ //0表示0.5小時,1表示1小時,2表示1.5小時,3表示2小時,4表示2.5小時,5表示3小時 //考試時間所對應(yīng)的毫秒數(shù) long[] dateLong = {30*60*1000, 60*60*1000, 90*60*1000, 120*60*1000, 150*60*1000, 180*60*1000}; PublishexamWithBLOBs publishexam = publishExamService.selectByKey(id); HttpSession session = request.getSession(); Student student = (Student) session.getAttribute("studentInfo"); //在考試記錄表中添加一條考試信息 Examhis examhis = examhisService.studentIsNotExam(student.getId(), publishexam.getSubjectId(), publishexam.getExamtime()); List<Text> textList = null; ArrayList<TextModel> list = JsonUtils.toBean(publishexam.getExam(), ArrayList.class, TextModel.class); Date date = new Date(); Date date2 = new Date(); date2.setTime(publishexam.getExamtime().getTime() + dateLong[publishexam.getExamlength()]); //當(dāng)前時間如果在考試時間之前,考試還未開始 if (date.compareTo(publishexam.getExamtime()) <= 0){ model.addAttribute("message", "對不起當(dāng)前考試還未開始!"); return "/message"; } /*1.當(dāng)前時間>考試時間+考試時長,考試已經(jīng)結(jié)束 2.examhis=null,則證明作者第一次點(diǎn)擊開始考試 如果examhis不為空 狀態(tài)為1:表示正在考試 狀態(tài)為2:表示已經(jīng)考試結(jié)束, 狀態(tài)為3:表示老師已經(jīng)閱完試卷 */ if (date.compareTo(date2) >= 0 || (examhis != null && examhis.getStatus() != 1)){ model.addAttribute("message", "對不起當(dāng)前考試已經(jīng)結(jié)束!"); return "/message"; } if (examhis == null){ examhis = new Examhis(); examhis.setStudentid(student.getId()); examhis.setStudentname(student.getName()); examhis.setSubjectid(publishexam.getSubjectId()); examhis.setSubjectname(publishexam.getSubjectName()); examhis.setClassesid(student.getClassesid()); examhis.setClassesname(student.getClassesname()); examhis.setPublishexamid(id); examhis.setExamtime(publishexam.getExamtime()); examhis.setStatus(1); textList = new ArrayList<Text>(); for (TextModel textModel : list) { List<Text> text = textService.beginExam(textModel,publishexam.getSubjectId()); for (Text text2 : text) { text2.setTexId(textModel.getTextModelId()); } textList.addAll(text); } String json = JsonUtils.toJson(textList); examhis.setExamtest(json); examhisService.insert(examhis); }else{ textList = JsonUtils.toBean(examhis.getExamtest(), ArrayList.class, Text.class); } int sum = 0; for (TextModel textModel : list) { sum += textModel.getGrade()*textModel.getTextCount(); } List<Textmodel> textModelList = textModelService.selectTextModel(list); model.addAttribute("textModelList", textModelList); model.addAttribute("studentInfo", student); model.addAttribute("textList", textList); model.addAttribute("publishexam", publishexam); model.addAttribute("sum", sum); model.addAttribute("examTimeLength", dateLong[publishexam.getExamlength()]/1000); model.addAttribute("examTime", (date2.getTime() - date.getTime())/1000); return "/exam/exam"; } //提交考試方法 @RequestMapping(value="/examEnd", method=RequestMethod.POST) @ResponseBody public AjaxResult examEnd(HttpServletRequest request, ExamList examList, int id){ PublishexamWithBLOBs publishexam = publishExamService.selectByKey(id); HttpSession session = request.getSession(); Student student = (Student) session.getAttribute("studentInfo"); //將考試信息轉(zhuǎn)成json,改變考試狀態(tài),更新到考試歷史記錄表中 Examhis examhis = examhisService.studentIsNotExam(student.getId(), publishexam.getSubjectId(), publishexam.getExamtime()); List<Exam> list = examList.getExamList(); list.remove(0); for (Exam exam : list) { exam.setText(textService.selectOne(exam.getTextId())); if (exam.getAnswer() == null){ exam.setAnswer(" "); } } String json = JsonUtils.toJson(list); examhis.setExamtest(json); examhis.setStatus(2); examhisService.update(examhis); return AjaxResult.successInstance("您已成功提交考試"); }
<script type="text/javascript"> //JS實(shí)現(xiàn)倒計時,考試結(jié)束提交試卷 function startTime(){ //定義考試剩余時間,時間為毫秒數(shù) //examTime = "${examTime}";//對考試剩余時間賦值 //var exam = parseInt("${examTime}"); var examTime = parseInt(examTimes.innerHTML); var examTimeLength;//考試時長 examTimeLength = "${examTimeLength}"; if ((examTime)<0){ alert("考試時間到!\n即將提交試卷!"); document.forms[0].submit(); }else{ //var lm = Math.floor((examTimeLength - examTime) / 60000); var lh = Math.floor(((examTimeLength - examTime) / 3600) % 60) var lm = Math.floor(((examTimeLength - examTime) / 60) % 60); var ls = (examTimeLength - examTime) % 60; var yh = Math.floor((examTime / 3600) % 60); var ym = Math.floor((examTime / 60) % 60); var ys = examTime % 60; document.getElementById("tTime").innerHTML = "考試已經(jīng)開始了" + lh + "時" + lm + "分" + ls + "秒" + ",剩余" + yh + "時" + ym + "分" + ys + "秒"; } examTime--; examTimes.innerHTML=examTime; setTimeout(startTime,1000); } var timer=null; //當(dāng)頁面加載后,啟動周期性定時器,每過1秒執(zhí)行startTime window.onload=function(){ startTime(); } </script>
因?yàn)椴樵兂煽儽容^簡單,就是查詢出學(xué)生成績,顯示到頁面上而已,正在進(jìn)行的考試成績?yōu)榭铡?/p>
總結(jié)
以上所述是小編給大家介紹的Java實(shí)現(xiàn)在線考試系統(tǒng)與設(shè)計(學(xué)生功能),希望對大家有所幫助!
相關(guān)文章
springmvc實(shí)現(xiàn)跨服務(wù)器文件上傳功能
這篇文章主要為大家詳細(xì)介紹了springmvc實(shí)現(xiàn)跨服務(wù)器文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-08-08javaweb servlet中使用請求轉(zhuǎn)發(fā)亂碼的實(shí)現(xiàn)
下面小編就為大家?guī)硪黄猨avaweb servlet中使用請求轉(zhuǎn)發(fā)亂碼的實(shí)現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08Java基礎(chǔ)之FileInputStream和FileOutputStream流詳解
這篇文章主要介紹了Java基礎(chǔ)之FileInputStream和FileOutputStream流詳解,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04springboot項(xiàng)目mapper無法自動裝配未找到?UserMapper?類型的Bean解決辦法
這篇文章給大家介紹了springboot項(xiàng)目mapper無法自動裝配,未找到?‘userMapper‘?類型的?Bean解決辦法(含報錯原因),文章通過圖文結(jié)合的方式介紹的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下2024-02-02java實(shí)現(xiàn)微信公眾號消息推送的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何利用java實(shí)現(xiàn)微信公眾號消息推送的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10詳解Spring boot+CXF開發(fā)WebService Demo
這篇文章主要介紹了詳解Spring boot+CXF開發(fā)WebService Demo,非常具有實(shí)用價值,需要的朋友可以參考下2017-05-05Java實(shí)現(xiàn)簡易版猜燈謎游戲的示例代碼
燈謎是中秋節(jié)傳統(tǒng)的活動之一,而現(xiàn)代化的方式則是將其制作成一個小游戲,讓用戶在游戲的過程中猜燈謎,互動體驗(yàn)更佳,所以本文小編就用Java制作一款猜燈謎小游戲吧2023-09-09