From 81e9f680b513a27cb7d21d0b506c817b68fc4177 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Thu, 26 Mar 2020 21:57:08 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=AD=A6=E7=94=9F=E7=AD=94=E9=A2=98?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=92=8C=E6=95=99=E5=B8=88=E8=AF=84=E9=98=85?= =?UTF-8?q?=E9=A1=B5=E7=9A=84=E6=8E=A5=E5=8F=A3=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exercise_questions_controller.rb | 27 ++++++++++++++ app/controllers/exercises_controller.rb | 9 ++++- app/helpers/exercise_questions_helper.rb | 4 +- app/helpers/exercises_helper.rb | 37 +++++++++++++++++-- app/models/exercise_question.rb | 4 ++ .../_exercise_questions.json.jbuilder | 14 +++++++ 6 files changed, 87 insertions(+), 8 deletions(-) diff --git a/app/controllers/exercise_questions_controller.rb b/app/controllers/exercise_questions_controller.rb index 61a1386fc..5f59c3cab 100644 --- a/app/controllers/exercise_questions_controller.rb +++ b/app/controllers/exercise_questions_controller.rb @@ -605,6 +605,33 @@ class ExerciseQuestionsController < ApplicationController ExerciseShixunAnswer.create!(ex_shixun_option) new_obj_score = ex_obj_score + @c_score end + total_scores = new_obj_score + ex_subj_score + if total_scores < 0.0 + total_scores = 0.0 + elsif total_scores > ex_all_scores + total_scores = ex_all_scores + end + ex_scores = { + :objective_score => new_obj_score, + :score => total_scores + } + @exercise_current_user.update!(ex_scores) + elsif @exercise_question.question_type == Exercise::PROGRAM + if ex_answers.exists? + ex_pro_old_score = ex_answers.first.score > 0.0 ? ex_answers.first.score : 0.0 + new_obj_score = ex_obj_score - ex_pro_old_score + @c_score + ex_answers.first.update_attribute("score", @c_score) + else #如果学生未答,则创建新的答题记录 + answer_option = { + :user_id => @user_id, + :exercise_question_id => @exercise_question.id, + :score => @c_score, + :answer_text => "" + } + ExerciseAnswer.create!(answer_option) + new_obj_score = ex_obj_score + @c_score + end + total_scores = new_obj_score + ex_subj_score if total_scores < 0.0 total_scores = 0.0 diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index 4247a0619..b96ab0d4b 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -1623,7 +1623,7 @@ class ExercisesController < ApplicationController ques_number = q.question_number end ques_status = 0 - if q.question_type != Exercise::PRACTICAL + if q.question_type < Exercise::PRACTICAL ques_vote = q.exercise_answers.select {|answer| answer.user_id == user_id} if ques_vote.present? @@ -1642,11 +1642,16 @@ class ExercisesController < ApplicationController end end end - else + elsif q.question_type == Exercise::PRACTICAL if Myshixun.exists?(user_id: user_id, shixun_id: q.shixun_id) ques_status = 1 question_answered += 1 end + else + if HackUserLastestCode.exists?(user_id: user_id, hack_id: q.hack_id) + ques_status = 1 + question_answered += 1 + end end question_status = { :ques_id => q.id, diff --git a/app/helpers/exercise_questions_helper.rb b/app/helpers/exercise_questions_helper.rb index 1cc613bc6..8315e2895 100644 --- a/app/helpers/exercise_questions_helper.rb +++ b/app/helpers/exercise_questions_helper.rb @@ -14,10 +14,10 @@ module ExerciseQuestionsHelper } answered_content.push(u_answer) end - elsif question.question_type == Exercise::SUBJECTIVE + elsif question.question_type == Exercise::SUBJECTIVE || question.question_type == Exercise::PROGRAM answered_content = exercise_answers.pluck(:answer_text) end - if question.question_type == Exercise::PRACTICAL && ex_user.present? && ex_user.commit_status == 1 #存在实训题,且用户已提交了的,如果实训题只做了一半就关闭,则相当于不要了 + if (question.question_type == Exercise::PRACTICAL || question.question_type == Exercise::PROGRAM) && ex_user.present? && ex_user.commit_status == 1 #存在实训题,且用户已提交了的,如果实训题只做了一半就关闭,则相当于不要了 if exercise.exercise_status == 3 #如果试卷已截止,则可以看到分数,否则不能查看分数 shixun_type = 2 else diff --git a/app/helpers/exercises_helper.rb b/app/helpers/exercises_helper.rb index d36f0dd3d..fc380a28d 100644 --- a/app/helpers/exercises_helper.rb +++ b/app/helpers/exercises_helper.rb @@ -15,7 +15,7 @@ module ExercisesHelper answers_content = q.exercise_answers.select{|answer| answer.user_id == user_id} end - if q_type <= Exercise::JUDGMENT + if q_type <= Exercise::JUDGMENT || q_type == Exercise::PROGRAM if answers_content.present? #学生有回答时,分数已经全部存到exercise_answer 表,多选题直接取第一个值,单选题和判断题选最后一个值(考虑并发) ques_score = q_type == Exercise::MULTIPLE ? answers_content.first.score : answers_content.last.score ques_score = ques_score < 0 ? 0.0 : ques_score @@ -454,6 +454,7 @@ module ExercisesHelper score1 = 0.0 #选择题/判断题 score2 = 0.0 #填空题 score5 = 0.0 #实训题 + score6 = 0.0 #编程题 ques_stand = [] #问题是否正确 exercise_end_time = end_time || Time.now exercise_questions = exercise.exercise_questions.includes(:exercise_standard_answers,:exercise_shixun_challenges) @@ -608,6 +609,34 @@ module ExercisesHelper end end end + elsif q.question_type == 6 #编程题 + if answers_content.present? + score6 += answers_content.first.score + else + hack = q.hack + hack_user = hack&.hack_user_lastest_codes&.find_by(user_id: user.id) + if hack_user.present? + last_passed_code = hack_user.hack_user_codes.where("status = 0 and created_at < '#{exercise_end_time}'").last + if last_passed_code.present? + pro_score = q.question_score + code_content = last_passed_code.code + else + pro_score = 0 + code_content = hack_user.hack_user_codes.where("created_at < '#{exercise_end_time}'").last&.code + end + else + pro_score = 0 + code_content = nil + end + pro_option = { + :exercise_question_id => q.id, + :user_id => user.id, + :score => pro_score.round(1), + :answer_text => code_content + } + ExerciseAnswer.create(pro_option) + score6 += pro_score + end end user_scores = answers_content.blank? ? 0.0 : answers_content.score_reviewed.pluck(:score).sum if user_scores > 0.0 @@ -629,7 +658,7 @@ module ExercisesHelper end end - total_score = score1 + score2 + score5 + total_score = score1 + score2 + score5 + score6 { "total_score":total_score.round(1), "stand_status":ques_stand @@ -923,10 +952,10 @@ module ExercisesHelper elsif ques_type == 4 answered_content = exercise_answers&.pluck(:answer_text) end - if ques_type == 5 #存在实训题,及已经做了实训题的 + if ques_type == 5 || ques_type == 6 #存在实训题,及已经做了实训题的 if ex_status == 3 || is_teacher_or == 1 #如果试卷已截止,则可以看到分数,否则不能查看分数 shixun_type = 2 - elsif ex_status == 2 && q.exercise_shixun_answers.present? #试卷未截止,且用户已回答的,则能看到答题的状态 + elsif ex_status == 2 && (q.exercise_shixun_answers.present? || q.exercise_answers.present?) #试卷未截止,且用户已回答的,则能看到答题的状态 shixun_type =1 end end diff --git a/app/models/exercise_question.rb b/app/models/exercise_question.rb index 47dea1175..de4a55d3a 100644 --- a/app/models/exercise_question.rb +++ b/app/models/exercise_question.rb @@ -48,4 +48,8 @@ class ExerciseQuestion < ApplicationRecord exercise_standard_answers.pluck(:answer_text) end + def hack_user user_id + hack_user = hack&.hack_user_lastest_codes&.find_by(user_id: user_id) + end + end diff --git a/app/views/exercise_questions/_exercise_questions.json.jbuilder b/app/views/exercise_questions/_exercise_questions.json.jbuilder index 043dede07..32e6a6ee3 100644 --- a/app/views/exercise_questions/_exercise_questions.json.jbuilder +++ b/app/views/exercise_questions/_exercise_questions.json.jbuilder @@ -125,4 +125,18 @@ elsif question.question_type == 6 json.hack_identifier hack.identifier json.description hack.description json.hack_id hack.id + if exercise_type == 3 || exercise_type == 4 + json.user_answer user_answer + end + + if (exercise_type == 3 || exercise_type == 4) && (shixun_type.present? && shixun_type > 0 ) #教师评阅/试卷截止后,答案公开/试卷未截止,但学生已做了实训题 + hack_user = question.hack_user(ex_answerer.id) + if hack_user.present? + evaluate_codes = hack_user.hack_user_codes.where("created_at < '#{@exercise_user_current&.end_at}'") + json.evaluate_codes evaluate_codes do |code| + json.(code, :status, :error_msg, :error_line, :expected_output, :input, :output, :execute_time, :execute_memory) + json.created_at code.created_at.strftime('%Y-%m-%d %H:%M:%S') + end + end + end end \ No newline at end of file From 46e0134433c2b13696923b864ae6b1ff24ca1fdc Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Thu, 26 Mar 2020 22:16:43 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/exercises/exercise_result.json.jbuilder | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/exercises/exercise_result.json.jbuilder b/app/views/exercises/exercise_result.json.jbuilder index 1ceb8209d..ed8035ca1 100644 --- a/app/views/exercises/exercise_result.json.jbuilder +++ b/app/views/exercises/exercise_result.json.jbuilder @@ -1,3 +1,4 @@ +json.is_md @exercise.is_md if @exercise_course_groups.present? && @exercise_course_groups.count > 0 json.course_groups do json.array! @exercise_course_groups do |group| From cd48b6dd6e8000ed9477889834359e327ef5ac09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Thu, 26 Mar 2020 22:47:12 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../react/src/common/quillForEditor/index.js | 16 ++- .../exercise/ExerciseReviewAndAnswer.js | 17 +++ .../courses/exercise/question/Progques.js | 103 ++++++++++++++++++ 3 files changed, 130 insertions(+), 6 deletions(-) create mode 100644 public/react/src/modules/courses/exercise/question/Progques.js diff --git a/public/react/src/common/quillForEditor/index.js b/public/react/src/common/quillForEditor/index.js index 46b02b94e..7f0e56e86 100644 --- a/public/react/src/common/quillForEditor/index.js +++ b/public/react/src/common/quillForEditor/index.js @@ -209,12 +209,16 @@ function QuillForEditor({ if (value && value.hasOwnProperty('ops')) { // console.log(value.ops); - const ops = value.ops || []; - ops.forEach((item, i) => { - if (item.insert['image']) { - item.insert['image'] = Object.assign({}, item.insert['image'], { style: { cursor: 'pointer' }, onclick: (url) => showUploadImage(url) }); - } - }); + try { + const ops = value.ops || []; + ops.forEach((item, i) => { + if (item.insert['image']) { + item.insert['image'] = Object.assign({}, item.insert['image'], { style: { cursor: 'pointer' }, onclick: (url) => showUploadImage(url) }); + } + }); + }catch (e) { + + } } const current = value diff --git a/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js b/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js index 9f60b3481..483769f62 100644 --- a/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js +++ b/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js @@ -13,6 +13,7 @@ import CoursesListType from '../coursesPublic/CoursesListType'; import QuillForEditor from "../../../common/quillForEditor"; import Multiple from './question/multiple'; import Single from './question/single'; +import Progques from './question/Progques'; import FillEmpty from './question/fillEmpty'; import SimpleAnswer from './question/simpleAnswer'; import ShixunAnswer from './question/shixunAnswer'; @@ -1014,6 +1015,22 @@ class ExerciseReviewAndAnswer extends Component{ handleShowUploadImage={(u)=>this.handleShowUploadImage(u)} > } + { + //编程题 + item.question_type == 6 && + this.handleShowUploadImage(u)} + > + + } { //调分理由部分 diff --git a/public/react/src/modules/courses/exercise/question/Progques.js b/public/react/src/modules/courses/exercise/question/Progques.js new file mode 100644 index 000000000..7a0c7660b --- /dev/null +++ b/public/react/src/modules/courses/exercise/question/Progques.js @@ -0,0 +1,103 @@ +import React,{ Component } from "react"; +import {Checkbox,Radio, Input} from "antd"; +import {DMDEditor,markdownToHTML, MarkdownToHtml } from 'educoder' +import QuillForEditor from "../../../../common/quillForEditor"; + +import axios from 'axios' + +const tagArray = [ + // 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', + // 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', + // 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' +] +class Progques extends Component{ + constructor(props){ + super(props); + + } + + + toMDMode = (that) => { + + + } + + onOptionContentChange = (value, index) => { + + } + + onBlurEmpty=(index,number)=>{ + + } + + render(){ + let { + questionType , + exercise , + user_exercise_status, + is_md + }=this.props + let isAdmin = this.props.isAdmin(); + let isStudent = this.props.isStudent(); + let item=questionType; + let titename=""; + if(item){ + if(is_md===true){ + titename=item.description; + }else{ + try { + titename = JSON.parse(item.description); + }catch (e) { + titename={"ops":[{"insert":item.description}]}; + } + // JSON.parse 有些异常数据是undefined + if(titename===undefined){ + titename={"ops":[{"insert":item.description}]}; + } + try { + // JSON.parse 转换的时候如果是数字字符串就转成整数了 + if(titename>=0){ + titename={"ops":[{"insert":item.description}]}; + } + }catch (e) { + + } + } + } + + return( +
+ +
  • + +
  • +
    + ) + } +} +export default Progques From cea66cbe1bab2123ed7d8785c88539033a3afcfa Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Thu, 26 Mar 2020 22:53:28 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E7=B4=AF=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/games_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/games_controller.rb b/app/controllers/games_controller.rb index 614008112..75e2827a2 100644 --- a/app/controllers/games_controller.rb +++ b/app/controllers/games_controller.rb @@ -785,7 +785,7 @@ class GamesController < ApplicationController # REDO:需要添加详细的说明 def cost_time #return if @game.status >= 2 - cost_time = params[:time].to_i < @game.cost_time.to_i ? (@game.cost_time.to_i + params[:time].to_i) : params[:time].to_i + cost_time = params[:time].to_i < @game.cost_time.to_i ? (@game.cost_time.to_i) : params[:time].to_i @game.update_attribute(:cost_time, cost_time) end From 03d1fab1132be9ca9898a8c494251532f9dc87ec Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Thu, 26 Mar 2020 22:55:25 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=B8=8D=E8=83=BD=E5=8E=BB=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/games_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/games_controller.rb b/app/controllers/games_controller.rb index 75e2827a2..614008112 100644 --- a/app/controllers/games_controller.rb +++ b/app/controllers/games_controller.rb @@ -785,7 +785,7 @@ class GamesController < ApplicationController # REDO:需要添加详细的说明 def cost_time #return if @game.status >= 2 - cost_time = params[:time].to_i < @game.cost_time.to_i ? (@game.cost_time.to_i) : params[:time].to_i + cost_time = params[:time].to_i < @game.cost_time.to_i ? (@game.cost_time.to_i + params[:time].to_i) : params[:time].to_i @game.update_attribute(:cost_time, cost_time) end