diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 59ec88fc7..15e795bdb 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -95,13 +95,13 @@ class ApplicationController < ActionController::Base check_account tip_exception(@course.excellent ? 410 : 409, "您没有权限进入") end - if @user_course_identity > Course::CREATOR && @user_course_identity <= Course::STUDENT && @course.tea_id != current_user.id - # 实名认证和职业认证的身份判断 - tip_exception(411, "你的实名认证和职业认证审核未通过") if @course.authentication && - @course.professional_certification && (!current_user.authentication && !current_user.professional_certification) - tip_exception(411, "你的实名认证审核未通过") if @course.authentication && !current_user.authentication - tip_exception(411, "你的职业认证审核未通过") if @course.professional_certification && !current_user.professional_certification - end + # if @user_course_identity > Course::CREATOR && @user_course_identity <= Course::STUDENT && @course.tea_id != current_user.id + # # 实名认证和职业认证的身份判断 + # tip_exception(411, "你的实名认证和职业认证审核未通过") if @course.authentication && + # @course.professional_certification && (!current_user.authentication && !current_user.professional_certification) + # tip_exception(411, "你的实名认证审核未通过") if @course.authentication && !current_user.authentication + # tip_exception(411, "你的职业认证审核未通过") if @course.professional_certification && !current_user.professional_certification + # end uid_logger("###############user_course_identity:#{@user_course_identity}") end diff --git a/app/controllers/concerns/git_helper.rb b/app/controllers/concerns/git_helper.rb index db99f9da5..f97a137bb 100644 --- a/app/controllers/concerns/git_helper.rb +++ b/app/controllers/concerns/git_helper.rb @@ -25,7 +25,7 @@ module GitHelper decode_content = if cd["encoding"] == 'GB18030' && cd['confidence'] > 0.8 content.encode('UTF-8', 'GBK', {:invalid => :replace, :undef => :replace, :replace => ' '}) - elsif cd['encoding'].blank? + elsif cd['encoding'].blank? && !content.blank? raise("ERROR_UTF8") else content.force_encoding('UTF-8') @@ -36,7 +36,7 @@ module GitHelper rescue Exception => e Rails.logger.error(e.message) - error_msg = e.message == "ERROR_UTF8" ? "文件无法预览" : "文档内容获取异常" + error_msg = e.message == "ERROR_UTF8" ? "文件编码异常,请将文件编码设置为UTF-8" : "文档内容获取异常" error_status = e.message == "ERROR_UTF8" ? -2 : -1 raise Educoder::TipException.new(error_status, error_msg) end diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index f82775235..3283595e5 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -153,8 +153,8 @@ class CoursesController < ApplicationController begin ActiveRecord::Base.transaction do @course = Course.new(name: params[:name], class_period: params[:class_period], credit: params[:credit], - end_date: params[:end_date], is_public: params[:is_public], school_id: @school.id, - authentication: params[:authentication], professional_certification: params[:professional_certification]) + end_date: params[:end_date], is_public: params[:is_public], school_id: @school.id) + # authentication: params[:authentication], professional_certification: params[:professional_certification]) @course.tea_id = current_user.id if params[:subject_id].blank? @@ -219,8 +219,8 @@ class CoursesController < ApplicationController extra_params[:is_end] = 1 end - extra_params[:authentication] = params[:authentication] - extra_params[:professional_certification] = params[:professional_certification] + # extra_params[:authentication] = params[:authentication] + # extra_params[:professional_certification] = params[:professional_certification] if @course.subject @course.start_date = params[:start_date] @@ -1157,10 +1157,10 @@ class CoursesController < ApplicationController return normal_status(-1, "课堂已结束,无法加入") if course.is_end # 实名认证和职业认证的身份判断 - return normal_status(-2, "该课堂要求成员完成实名和职业认证") if course.authentication && - course.professional_certification && (!current_user.authentication && !current_user.professional_certification) - return normal_status(-2, "该课堂要求成员完成实名认证") if course.authentication && !current_user.authentication - return normal_status(-2, "该课堂要求成员完成职业认证") if course.professional_certification && !current_user.professional_certification + # return normal_status(-2, "该课堂要求成员完成实名和职业认证") if course.authentication && + # course.professional_certification && (!current_user.authentication && !current_user.professional_certification) + # return normal_status(-2, "该课堂要求成员完成实名认证") if course.authentication && !current_user.authentication + # return normal_status(-2, "该课堂要求成员完成职业认证") if course.professional_certification && !current_user.professional_certification # 身份验证 if params[:professor].blank? && params[:assistant_professor].blank? && params[:student].blank? @@ -1452,6 +1452,7 @@ class CoursesController < ApplicationController # Never trust parameters from the scary internet, only allow the white list through. def course_params params.require(:course).permit(:name, :class_period, :credit, :end_date, :is_public, :authentication, :professional_certification) + # params.require(:course).permit(:name, :class_period, :credit, :end_date, :is_public, :authentication, :professional_certification) end def validate_course_name diff --git a/app/controllers/examination_banks_controller.rb b/app/controllers/examination_banks_controller.rb index cc34d9fea..3df11a432 100644 --- a/app/controllers/examination_banks_controller.rb +++ b/app/controllers/examination_banks_controller.rb @@ -36,8 +36,8 @@ class ExaminationBanksController < ApplicationController end current_user.item_baskets.destroy_all + render_ok({exam_id: exam.id}) end - render_ok rescue ApplicationService::Error => ex render_error(ex.message) end diff --git a/app/controllers/homework_commons_controller.rb b/app/controllers/homework_commons_controller.rb index d4e7ae4a3..415207707 100644 --- a/app/controllers/homework_commons_controller.rb +++ b/app/controllers/homework_commons_controller.rb @@ -58,7 +58,7 @@ class HomeworkCommonsController < ApplicationController end @published_count = @user_course_identity < Course::STUDENT ? @homework_commons.homework_published.size : - @homework_commons.size + @homework_commons.size unless search.blank? @homework_commons = @homework_commons.where("homework_commons.name like ?", "%#{search}%") @@ -110,7 +110,7 @@ class HomeworkCommonsController < ApplicationController if @homework_type == 4 @homework_commons = @homework_commons.includes(:homework_detail_manual, :published_settings, :homework_group_settings, :shixuns, :course_second_category, user: :user_extension) elsif @homework_type == 3 - @homework_commons = @homework_commons.includes(:homework_detail_manual, :published_settings, :homework_group_settings, :homework_detail_group, :course_second_category, user: :user_extension) + @homework_commons = @homework_commons.includes(:homework_detail_manual, :published_settings, :homework_group_settings, :homework_detail_group, :course_second_category, user: :user_extension) else @homework_commons = @homework_commons.includes(:homework_detail_manual, :published_settings, :homework_group_settings, :course_second_category, user: :user_extension) end @@ -128,7 +128,7 @@ class HomeworkCommonsController < ApplicationController if @homework.publish_time.blank? || (@homework.publish_time > Time.now) @student_works = [] if (params[:format] == "xlsx") || (params[:format] == "zip") - normal_status(-1,"作业未发布") + normal_status(-1, "作业未发布") end else if @user_course_identity == Course::STUDENT @@ -145,14 +145,14 @@ class HomeworkCommonsController < ApplicationController # 学生已提交作品且补交(提交)已截止、作品公开、非匿评阶段 if @work&.work_status.to_i > 0 && (@homework.work_public || @homework.score_open) && - ((!@homework.anonymous_comment && @homework.end_or_late) || (@homework_detail_manual.comment_status > 4 && @homework.end_or_late)) + ((!@homework.anonymous_comment && @homework.end_or_late) || (@homework_detail_manual.comment_status > 4 && @homework.end_or_late)) @student_works = student_works.where("student_works.user_id != #{@work.user_id}") # 匿评、申诉阶段只能看到分配给自己的匿评作品 elsif @work&.work_status.to_i > 0 && @homework.anonymous_comment && @homework_detail_manual.comment_status > 2 && @homework_detail_manual.comment_status <= 4 @is_evaluation = true @student_works = student_works.joins(:student_works_evaluation_distributions).where( - "student_works_evaluation_distributions.user_id = #{@current_user.id}") + "student_works_evaluation_distributions.user_id = #{@current_user.id}") else @student_works = [] end @@ -173,7 +173,7 @@ class HomeworkCommonsController < ApplicationController unless params[:teacher_comment].blank? student_work_ids = StudentWorksScore.where(student_work_id: @student_works.map(&:id)).pluck(:student_work_id) if params[:teacher_comment].to_i == 0 - @student_works = @student_works.where.not(id: student_work_ids) + @student_works = @student_works.where.not(id: student_work_ids) elsif params[:teacher_comment].to_i == 1 @student_works = @student_works.where(id: student_work_ids) end @@ -182,7 +182,7 @@ class HomeworkCommonsController < ApplicationController # 作品状态 0: 未提交, 1 按时提交, 2 延迟提交 if params[:work_status].present? params_work_status = params[:work_status] - work_status = params_work_status.map{|status| status.to_i} + work_status = params_work_status.map {|status| status.to_i} if @homework.homework_type == "practice" @student_works = @student_works.where(compelete_status: work_status) else @@ -241,17 +241,17 @@ class HomeworkCommonsController < ApplicationController if @user_course_identity >= Course::STUDENT tip_exception(403, "无权限操作") elsif @work_excel.blank? || @work_excel.size == 0 - normal_status(-1,"暂无用户提交!") + normal_status(-1, "暂无用户提交!") elsif params[:export].present? && params[:export] - normal_status(0,"正在下载中") + normal_status(0, "正在下载中") else respond_to do |format| - format.xlsx{ + format.xlsx { set_export_cookies - student_work_to_xlsx(@work_excel,@homework) + student_work_to_xlsx(@work_excel, @homework) exercise_export_name = "#{current_user.real_name}_#{@course.name}_#{@homework.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" - render xlsx: "#{exercise_export_name.strip}",template: "homework_commons/works_list.xlsx.axlsx",locals: - {table_columns: @work_head_cells,task_users: @work_cells_column} + render xlsx: "#{exercise_export_name.strip}", template: "homework_commons/works_list.xlsx.axlsx", locals: + {table_columns: @work_head_cells, task_users: @work_cells_column} } end end @@ -268,10 +268,10 @@ class HomeworkCommonsController < ApplicationController if status == 0 if params[:export].present? && params[:export] - normal_status(0,"正在下载中") + normal_status(0, "正在下载中") else respond_to do |format| - format.zip{ + format.zip { set_export_cookies zipfile = zip_homework_common @homework, zip_works file = decode64(zipfile[0][:base64file]) @@ -289,33 +289,21 @@ class HomeworkCommonsController < ApplicationController def update_score tip_exception("作业还未发布,暂不能计算成绩") if @homework.publish_time.nil? || @homework.publish_time > Time.now - begin - @homework.update_homework_work_score - normal_status("更新成功") - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback - end + @homework.update_homework_work_score + normal_status("更新成功") end def update_student_score work = @homework.student_works.find_by(user_id: current_user.id) myshixun = Myshixun.find_by(shixun_id: params[:shixun_id], user_id: current_user.id) ActiveRecord::Base.transaction do - begin - if work && myshixun - challenge_settings = @homework.homework_challenge_settings - games = myshixun.games.where(challenge_id: challenge_settings.pluck(:challenge_id)) - HomeworksService.new.update_myshixun_work_score work, myshixun, games, @homework, challenge_settings - normal_status("更新成功") - else - normal_status("还未开启挑战,暂不能更新成绩") - end - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback + if work && myshixun + challenge_settings = @homework.homework_challenge_settings + games = myshixun.games.where(challenge_id: challenge_settings.pluck(:challenge_id)) + HomeworksService.new.update_myshixun_work_score work, myshixun, games, @homework, challenge_settings + normal_status("更新成功") + else + normal_status("还未开启挑战,暂不能更新成绩") end end end @@ -382,41 +370,35 @@ class HomeworkCommonsController < ApplicationController end ActiveRecord::Base.transaction do - begin - @homework = HomeworkCommon.new(homework_params) - @homework.reference_answer = params[:reference_answer].to_s.strip - @homework.homework_type = @homework_type - @homework.user_id = current_user.id - @homework.course_id = @course.id - - homework_detail_manual = HomeworkDetailManual.new - @homework.homework_detail_manual = homework_detail_manual - homework_detail_manual.te_proportion = 0.7 - homework_detail_manual.ta_proportion = 0.3 - - if @homework_type == 3 - homework_detail_group = HomeworkDetailGroup.new(min_num: params[:min_num].to_i, max_num: params[:max_num].to_i, - base_on_project: params[:base_on_project]) - @homework.homework_detail_group = homework_detail_group - end + @homework = HomeworkCommon.new(homework_params) + @homework.reference_answer = params[:reference_answer].to_s.strip + @homework.homework_type = @homework_type + @homework.user_id = current_user.id + @homework.course_id = @course.id + + homework_detail_manual = HomeworkDetailManual.new + @homework.homework_detail_manual = homework_detail_manual + homework_detail_manual.te_proportion = 0.7 + homework_detail_manual.ta_proportion = 0.3 + + if @homework_type == 3 + homework_detail_group = HomeworkDetailGroup.new(min_num: params[:min_num].to_i, max_num: params[:max_num].to_i, + base_on_project: params[:base_on_project]) + @homework.homework_detail_group = homework_detail_group + end - if @homework.save! - homework_detail_manual.save! if homework_detail_manual - homework_detail_group.save! if homework_detail_group + if @homework.save! + homework_detail_manual.save! if homework_detail_manual + homework_detail_group.save! if homework_detail_group - # 作业描述的附件 - Attachment.associate_container(params[:attachment_ids], @homework.id, @homework.class) if params[:attachment_ids] - # 作业参考答案的附件 - Attachment.associate_container(params[:reference_attachment_ids], @homework.id, @homework.class, 2) if params[:reference_attachment_ids] + # 作业描述的附件 + Attachment.associate_container(params[:attachment_ids], @homework.id, @homework.class) if params[:attachment_ids] + # 作业参考答案的附件 + Attachment.associate_container(params[:reference_attachment_ids], @homework.id, @homework.class, 2) if params[:reference_attachment_ids] - HomeworksService.new.create_works_list(@homework, @course) - else - tip_exception("创建失败") - end - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback + HomeworksService.new.create_works_list(@homework, @course) + else + tip_exception("创建失败") end end end @@ -432,30 +414,25 @@ class HomeworkCommonsController < ApplicationController end ActiveRecord::Base.transaction do - begin - @homework.update_attributes!(homework_params) - @homework.reference_answer = params[:reference_answer].to_s.strip - - if @homework.homework_type == "group" - homework_detail_group = @homework.homework_detail_group - param_min = params[:min_num].to_i - param_max = params[:max_num].to_i - homework_detail_group.min_num = @homework.has_commit_work ? [param_min, homework_detail_group.min_num].min : param_min - homework_detail_group.max_num = @homework.has_commit_work ? [param_max, homework_detail_group.max_num].max : param_max - homework_detail_group.base_on_project = params[:base_on_project] unless @homework.has_relate_project - homework_detail_group.save! - end - # 作业描述的附件 - Attachment.associate_container(params[:attachment_ids], @homework.id, @homework.class) if params[:attachment_ids] - # 作业参考答案的附件 - Attachment.associate_container(params[:reference_attachment_ids], @homework.id, @homework.class, 2) if params[:reference_attachment_ids] - - normal_status(0, "更新成功") - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback + @homework.update_attributes!(homework_params) + @homework.reference_answer = params[:reference_answer].to_s.strip + + if @homework.homework_type == "group" + homework_detail_group = @homework.homework_detail_group + param_min = params[:min_num].to_i + param_max = params[:max_num].to_i + homework_detail_group.min_num = @homework.has_commit_work ? [param_min, homework_detail_group.min_num].min : param_min + homework_detail_group.max_num = @homework.has_commit_work ? [param_max, homework_detail_group.max_num].max : param_max + homework_detail_group.base_on_project = params[:base_on_project] unless @homework.has_relate_project + homework_detail_group.save! end + # 作业描述的附件 + Attachment.associate_container(params[:attachment_ids], @homework.id, @homework.class) if params[:attachment_ids] + # 作业参考答案的附件 + Attachment.associate_container(params[:reference_attachment_ids], @homework.id, @homework.class, 2) if params[:reference_attachment_ids] + + normal_status(0, "更新成功") + end end @@ -467,304 +444,298 @@ class HomeworkCommonsController < ApplicationController end def update_settings - begin - # 课堂结束后不能再更新 - unless @course.is_end - - # 发布设置 - UpdateHomeworkPublishSettingService.call(@homework, publish_params) - - # 补交设置 - tip_exception("缺少allow_late参数") if params[:allow_late].nil? - tip_exception("缺少late_penalty参数") if params[:allow_late] && params[:late_penalty].blank? - tip_exception("缺少late_time参数") if params[:allow_late] && params[:late_time].blank? - - current_late_penalty = @homework.late_penalty - if params[:allow_late] - tip_exception("补交结束时间必须晚于截止时间") if params[:late_time] <= strf_time(@homework.end_time) - tip_exception("补交结束时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if @course.end_date.present? && params[:late_time] > - strf_time(@course.end_date.end_of_day) - tip_exception("迟交扣分不能小于0") if params[:late_penalty] && params[:late_penalty].to_i < 0 + # 课堂结束后不能再更新 + unless @course.is_end + + # 发布设置 + UpdateHomeworkPublishSettingService.call(@homework, publish_params) + + # 补交设置 + tip_exception("缺少allow_late参数") if params[:allow_late].nil? + tip_exception("缺少late_penalty参数") if params[:allow_late] && params[:late_penalty].blank? + tip_exception("缺少late_time参数") if params[:allow_late] && params[:late_time].blank? + + current_late_penalty = @homework.late_penalty + if params[:allow_late] + tip_exception("补交结束时间必须晚于截止时间") if params[:late_time] <= strf_time(@homework.end_time) + tip_exception("补交结束时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if @course.end_date.present? && params[:late_time] > + strf_time(@course.end_date.end_of_day) + tip_exception("迟交扣分不能小于0") if params[:late_penalty] && params[:late_penalty].to_i < 0 + + @homework.allow_late = true + @homework.late_time = params[:late_time] + @homework.late_penalty = params[:late_penalty].to_i + else + @homework.allow_late = false + @homework.late_penalty = 0 + @homework.late_time = nil + end - @homework.allow_late = true - @homework.late_time = params[:late_time] - @homework.late_penalty = params[:late_penalty].to_i - else - @homework.allow_late = false - @homework.late_penalty = 0 - @homework.late_time = nil + # 迟交扣分有变动则更新迟交学生的成绩 + late_penalty_change = @homework.late_penalty != current_late_penalty + + if @homework.homework_type == "practice" + + # 实训作业的评分设置 + tip_exception("总分值不能为空") if params[:total_score].blank? + tip_exception("总分值不能小于0") if params[:total_score].to_i < 0 + tip_exception("缺少answer_open_evaluation参数") if params[:answer_open_evaluation].nil? + tip_exception("缺少work_efficiency参数") if params[:work_efficiency].nil? + tip_exception("缺少eff_score参数") if params[:work_efficiency] && params[:eff_score].blank? + tip_exception("效率分不能小于等于0") if params[:work_efficiency] && params[:eff_score] && params[:eff_score].to_f <= 0 + tip_exception("效率分不能大于总分值") if params[:work_efficiency] && params[:eff_score] && params[:eff_score].to_f.round(2) > params[:total_score].to_f.round(2) + tip_exception("缺少shixun_evaluation参数") if params[:shixun_evaluation].blank? + tip_exception("缺少challenge_settings参数") if params[:challenge_settings].blank? + # tip_exception("缺少challenge_id参数") if params[:challenge_settings][:challenge_id].blank? + # tip_exception("缺少challenge_score参数") if params[:challenge_settings][:challenge_score].blank? + # tip_exception("challenge_id参数的长度与challenge_score参数的长度不匹配") if + # params[:challenge_settings][:challenge_score].length != params[:challenge_settings][:challenge_id].length + + sum_challenge_score = params[:challenge_settings].pluck(:challenge_score).reject(&:blank?)&.map {|score| score.to_f}.sum + total_score = params[:work_efficiency] ? (params[:eff_score].to_f + sum_challenge_score) : sum_challenge_score + tip_exception("分值之和必须等于总分值:#{params[:total_score]}分") if params[:total_score].to_f.round(2) != total_score.to_f.round(2) + + current_eff_score = @homework.eff_score.to_f.round(2) + @homework.total_score = params[:total_score] + @homework.work_efficiency = params[:work_efficiency] + @homework.eff_score = params[:work_efficiency] ? params[:eff_score].to_f.round(2) : 0 + + update_eff_score = current_eff_score.round(2) != @homework.eff_score.round(2) + + if @homework_detail_manual.answer_open_evaluation != params[:answer_open_evaluation] + @homework_detail_manual.answer_open_evaluation = params[:answer_open_evaluation] + score_change = true end - # 迟交扣分有变动则更新迟交学生的成绩 - late_penalty_change = @homework.late_penalty != current_late_penalty - - if @homework.homework_type == "practice" - - # 实训作业的评分设置 - tip_exception("总分值不能为空") if params[:total_score].blank? - tip_exception("总分值不能小于0") if params[:total_score].to_i < 0 - tip_exception("缺少answer_open_evaluation参数") if params[:answer_open_evaluation].nil? - tip_exception("缺少work_efficiency参数") if params[:work_efficiency].nil? - tip_exception("缺少eff_score参数") if params[:work_efficiency] && params[:eff_score].blank? - tip_exception("效率分不能小于等于0") if params[:work_efficiency] && params[:eff_score] && params[:eff_score].to_f <= 0 - tip_exception("效率分不能大于总分值") if params[:work_efficiency] && params[:eff_score] && params[:eff_score].to_f.round(2) > params[:total_score].to_f.round(2) - tip_exception("缺少shixun_evaluation参数") if params[:shixun_evaluation].blank? - tip_exception("缺少challenge_settings参数") if params[:challenge_settings].blank? - # tip_exception("缺少challenge_id参数") if params[:challenge_settings][:challenge_id].blank? - # tip_exception("缺少challenge_score参数") if params[:challenge_settings][:challenge_score].blank? - # tip_exception("challenge_id参数的长度与challenge_score参数的长度不匹配") if - # params[:challenge_settings][:challenge_score].length != params[:challenge_settings][:challenge_id].length - - sum_challenge_score = params[:challenge_settings].pluck(:challenge_score).reject(&:blank?)&.map{|score| score.to_f}.sum - total_score = params[:work_efficiency] ? (params[:eff_score].to_f + sum_challenge_score) : sum_challenge_score - tip_exception("分值之和必须等于总分值:#{params[:total_score]}分") if params[:total_score].to_f.round(2) != total_score.to_f.round(2) - - current_eff_score = @homework.eff_score.to_f.round(2) - @homework.total_score = params[:total_score] - @homework.work_efficiency = params[:work_efficiency] - @homework.eff_score = params[:work_efficiency] ? params[:eff_score].to_f.round(2) : 0 - - update_eff_score = current_eff_score.round(2) != @homework.eff_score.round(2) - - if @homework_detail_manual.answer_open_evaluation != params[:answer_open_evaluation] - @homework_detail_manual.answer_open_evaluation = params[:answer_open_evaluation] - score_change = true - end - - @homework_detail_manual.shixun_evaluation = params[:shixun_evaluation].to_i - - if params[:challenge_settings] - params[:challenge_settings].each do |challenge| - setting = @homework.homework_challenge_settings.find_by(challenge_id: challenge[:challenge_id]) - score = challenge[:challenge_score] - if setting && setting.score != score - score_change = true - setting.update_attributes!(score: score) - elsif setting.blank? - score_change = true - HomeworkChallengeSetting.create!(homework_common_id: @homework.id, challenge_id: challenge[:challenge_id], - shixun_id: @homework.homework_commons_shixun.try(:shixun_id), score: score) - end - end + @homework_detail_manual.shixun_evaluation = params[:shixun_evaluation].to_i - if @homework.homework_challenge_settings.where.not(challenge_id: params[:challenge_settings].pluck(:challenge_id)).count > 0 + if params[:challenge_settings] + params[:challenge_settings].each do |challenge| + setting = @homework.homework_challenge_settings.find_by(challenge_id: challenge[:challenge_id]) + score = challenge[:challenge_score] + if setting && setting.score != score score_change = true - @homework.homework_challenge_settings.where.not(challenge_id: params[:challenge_settings].pluck(:challenge_id)).destroy_all + setting.update_attributes!(score: score) + elsif setting.blank? + score_change = true + HomeworkChallengeSetting.create!(homework_common_id: @homework.id, challenge_id: challenge[:challenge_id], + shixun_id: @homework.homework_commons_shixun.try(:shixun_id), score: score) end end - # 公开设置 - tip_exception("缺少score_open参数") if params[:score_open].nil? - @homework.score_open = params[:score_open] - - @homework.save! - if score_change && @homework.end_or_late_none_group - UpdateShixunWorkScoreJob.perform_later(@homework.id) - elsif update_eff_score && (@homework.end_or_late_none_group || @homework.max_efficiency > 0) - # 更新所有学生的效率分(作业允许补交且补交已截止 或者 作业不允许补交且提交已截止 或者作业已计算过效率分) - HomeworksService.new.update_student_eff_score HomeworkCommon.find_by(id: @homework.id) + if @homework.homework_challenge_settings.where.not(challenge_id: params[:challenge_settings].pluck(:challenge_id)).count > 0 + score_change = true + @homework.homework_challenge_settings.where.not(challenge_id: params[:challenge_settings].pluck(:challenge_id)).destroy_all end + end - # 更新迟交扣分 - if !(score_change || update_eff_score) && late_penalty_change - @homework.student_works.where(work_status: 2).each do |work| - work.late_penalty = @homework.late_penalty - work.save! - end - end + # 公开设置 + tip_exception("缺少score_open参数") if params[:score_open].nil? + @homework.score_open = params[:score_open] - unless @homework.allow_late - @homework.student_works.where(work_status: 2).update_all(work_status: 1) - end + @homework.save! + if score_change && @homework.end_or_late_none_group + UpdateShixunWorkScoreJob.perform_later(@homework.id) + elsif update_eff_score && (@homework.end_or_late_none_group || @homework.max_efficiency > 0) + # 更新所有学生的效率分(作业允许补交且补交已截止 或者 作业不允许补交且提交已截止 或者作业已计算过效率分) + HomeworksService.new.update_student_eff_score HomeworkCommon.find_by(id: @homework.id) + end - @homework_detail_manual.save! - @homework.save! - else + # 更新迟交扣分 + if !(score_change || update_eff_score) && late_penalty_change + @homework.student_works.where(work_status: 2).each do |work| + work.late_penalty = @homework.late_penalty + work.save! + end + end - # 普通和分组作业的匿评设置 - current_absence_penalty = @homework_detail_manual.absence_penalty - current_appeal_penalty = @homework_detail_manual.appeal_penalty - - # 匿评未开启前可以更新:是否开启匿评、匿评开始时间、匿评数 - if @homework_detail_manual.comment_status < 3 - tip_exception("缺少anonymous_comment参数") if params[:anonymous_comment].nil? - # anonymous_comment :true 是启用,false 是不启用 - if params[:anonymous_comment] - tip_exception("匿评开启时间不能为空") if params[:evaluation_start].blank? - tip_exception("匿评开启时间不能早于截止时间") if params[:evaluation_start] < strf_time(@homework.end_time) - tip_exception("匿评结束时间不能为空") if params[:evaluation_end].blank? - tip_exception("匿评截止时间必须晚于匿评开启时间") if params[:evaluation_end] <= params[:evaluation_start] - tip_exception("匿评截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if @course.end_date.present? && params[:evaluation_end] > - strf_time(@course.end_date.end_of_day) - tip_exception("匿评数必须为正整数") if params[:evaluation_num].blank? || params[:evaluation_num].to_i < 1 - tip_exception("缺评扣分不能为空") if params[:absence_penalty].blank? - tip_exception("缺评扣分不能小于0") if params[:absence_penalty].to_i < 0 - tip_exception("缺评扣分不能大于100") if params[:absence_penalty].to_i > 100 - end + unless @homework.allow_late + @homework.student_works.where(work_status: 2).update_all(work_status: 1) + end - @homework.anonymous_comment = params[:anonymous_comment] - @homework_detail_manual.evaluation_start = !@homework.anonymous_comment ? nil : params[:evaluation_start] - @homework_detail_manual.evaluation_num = !@homework.anonymous_comment ? 0 : params[:evaluation_num] - - # 不启用匿评时还原申诉设置和教师、助教的评分比例 - unless @homework.anonymous_comment - @homework.anonymous_appeal = false - @homework_detail_manual.appeal_time = nil - @homework_detail_manual.appeal_penalty = 0 - @homework_detail_manual.te_proportion = 1 - @homework_detail_manual.ta_proportion = 0 - end + @homework_detail_manual.save! + @homework.save! + else + # 普通和分组作业的匿评设置 + current_absence_penalty = @homework_detail_manual.absence_penalty + current_appeal_penalty = @homework_detail_manual.appeal_penalty + + # 匿评未开启前可以更新:是否开启匿评、匿评开始时间、匿评数 + if @homework_detail_manual.comment_status < 3 + tip_exception("缺少anonymous_comment参数") if params[:anonymous_comment].nil? + # anonymous_comment :true 是启用,false 是不启用 + if params[:anonymous_comment] + tip_exception("匿评开启时间不能为空") if params[:evaluation_start].blank? + tip_exception("匿评开启时间不能早于截止时间") if params[:evaluation_start] < strf_time(@homework.end_time) + tip_exception("匿评结束时间不能为空") if params[:evaluation_end].blank? + tip_exception("匿评截止时间必须晚于匿评开启时间") if params[:evaluation_end] <= params[:evaluation_start] + tip_exception("匿评截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if @course.end_date.present? && params[:evaluation_end] > + strf_time(@course.end_date.end_of_day) + tip_exception("匿评数必须为正整数") if params[:evaluation_num].blank? || params[:evaluation_num].to_i < 1 + tip_exception("缺评扣分不能为空") if params[:absence_penalty].blank? + tip_exception("缺评扣分不能小于0") if params[:absence_penalty].to_i < 0 + tip_exception("缺评扣分不能大于100") if params[:absence_penalty].to_i > 100 end - # 匿评未截止时可以更新匿评结束时间 - if @homework_detail_manual.comment_status < 4 - tip_exception("匿评结束时间不能为空") if @homework.anonymous_comment && params[:evaluation_end].blank? - tip_exception("匿评截止时间必须晚于匿评开启时间") if @homework.anonymous_comment && - params[:evaluation_end] <= strf_time(@homework_detail_manual.evaluation_start) - tip_exception("匿评截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if @homework.anonymous_comment && - @course.end_date.present? && params[:evaluation_end] > strf_time(@course.end_date.end_of_day) + @homework.anonymous_comment = params[:anonymous_comment] + @homework_detail_manual.evaluation_start = !@homework.anonymous_comment ? nil : params[:evaluation_start] + @homework_detail_manual.evaluation_num = !@homework.anonymous_comment ? 0 : params[:evaluation_num] - @homework_detail_manual.evaluation_end = !@homework.anonymous_comment ? nil : params[:evaluation_end] + # 不启用匿评时还原申诉设置和教师、助教的评分比例 + unless @homework.anonymous_comment + @homework.anonymous_appeal = false + @homework_detail_manual.appeal_time = nil + @homework_detail_manual.appeal_penalty = 0 + @homework_detail_manual.te_proportion = 1 + @homework_detail_manual.ta_proportion = 0 end - # 作业未结束可以更新缺评扣分 - tip_exception("缺评扣分不能为空") if @homework.anonymous_comment && params[:absence_penalty].blank? - tip_exception("缺评扣分不能小于0") if @homework.anonymous_comment && params[:absence_penalty].to_i < 0 - tip_exception("缺评扣分不能大于100") if @homework.anonymous_comment && params[:absence_penalty].to_i > 100 - @homework_detail_manual.absence_penalty = !@homework.anonymous_comment ? 0 : params[:absence_penalty].to_i + end + # 匿评未截止时可以更新匿评结束时间 + if @homework_detail_manual.comment_status < 4 + tip_exception("匿评结束时间不能为空") if @homework.anonymous_comment && params[:evaluation_end].blank? + tip_exception("匿评截止时间必须晚于匿评开启时间") if @homework.anonymous_comment && + params[:evaluation_end] <= strf_time(@homework_detail_manual.evaluation_start) + tip_exception("匿评截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if @homework.anonymous_comment && + @course.end_date.present? && params[:evaluation_end] > strf_time(@course.end_date.end_of_day) - # 匿评申诉设置 - # 匿评申诉未开启前可以更新:是否启用匿评申诉 - if @homework_detail_manual.comment_status < 4 && @homework.anonymous_comment - tip_exception("缺少anonymous_appeal参数") if params[:anonymous_appeal].nil? - @homework.anonymous_appeal = params[:anonymous_appeal] - end + @homework_detail_manual.evaluation_end = !@homework.anonymous_comment ? nil : params[:evaluation_end] + end + # 作业未结束可以更新缺评扣分 + tip_exception("缺评扣分不能为空") if @homework.anonymous_comment && params[:absence_penalty].blank? + tip_exception("缺评扣分不能小于0") if @homework.anonymous_comment && params[:absence_penalty].to_i < 0 + tip_exception("缺评扣分不能大于100") if @homework.anonymous_comment && params[:absence_penalty].to_i > 100 + @homework_detail_manual.absence_penalty = !@homework.anonymous_comment ? 0 : params[:absence_penalty].to_i - # 匿评申诉未结束前可以更新:匿评申诉结束时间 - if @homework_detail_manual.comment_status < 5 - tip_exception("匿评申诉结束时间不能为空") if @homework.anonymous_appeal && params[:appeal_time].blank? - tip_exception("匿评开启时间不能早于匿评截止时间") if @homework.anonymous_appeal && - params[:appeal_time] <= strf_time(@homework_detail_manual.evaluation_end) - tip_exception("匿评申诉结束不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if @homework.anonymous_appeal && - @course.end_date.present? && params[:appeal_time] > strf_time(@course.end_date.end_of_day) - @homework_detail_manual.appeal_time = @homework.anonymous_appeal ? params[:appeal_time] : nil - end + # 匿评申诉设置 + # 匿评申诉未开启前可以更新:是否启用匿评申诉 + if @homework_detail_manual.comment_status < 4 && @homework.anonymous_comment + tip_exception("缺少anonymous_appeal参数") if params[:anonymous_appeal].nil? + @homework.anonymous_appeal = params[:anonymous_appeal] + end - # 作业未结束可以更新违规匿评扣分 - tip_exception("违规匿评扣分不能为空") if @homework.anonymous_appeal && params[:appeal_penalty].blank? - tip_exception("违规匿评扣分不能小于0") if @homework.anonymous_appeal && params[:appeal_penalty].to_i < 0 - tip_exception("违规匿评扣分不能大于100") if @homework.anonymous_appeal && params[:appeal_penalty].to_i > 100 - @homework_detail_manual.appeal_penalty = @homework.anonymous_appeal ? params[:appeal_penalty].to_i : 0 - - # 如果缺评扣分的设置有变更且匿评已截止 - absence_penalty_change = current_absence_penalty != @homework_detail_manual.absence_penalty && - @homework_detail_manual.comment_status >= 4 - # 如果违规匿评扣分的设置有变更且匿评已截止 - appeal_penalty_change = current_appeal_penalty != @homework_detail_manual.appeal_penalty && - @homework_detail_manual.comment_status >= 4 - - # 评分设置 - tip_exception("助教评分模式不能为空") if params[:ta_mode].blank? - - # 助教评分模式的变更 - ta_mode_change = @homework_detail_manual.ta_mode != params[:ta_mode].to_i - @homework_detail_manual.ta_mode = params[:ta_mode].to_i - - # 最终成绩组成 - tip_exception("最终成绩组成模式不能为空") if params[:final_mode].nil? - - final_mode_change = @homework_detail_manual.final_mode != params[:final_mode] - @homework_detail_manual.final_mode = params[:final_mode] - if !@homework_detail_manual.final_mode - tip_exception("教师评分比例不能为空") if params[:te_proportion].blank? - te_proportion = params[:te_proportion].to_f.round(2) - tip_exception("教师评分比例不能小于0") if te_proportion < 0 - tip_exception("助教评分比例不能为空") if params[:ta_proportion].blank? - ta_proportion = params[:ta_proportion].to_f.round(2) - tip_exception("助教评分比例不能小于0") if ta_proportion < 0 - if !@homework.anonymous_comment - tip_exception("评分比例之和不能大于100") if (te_proportion + ta_proportion) > 1.0 - else - tip_exception("学生评分比例不能为空") if params[:st_proportion].blank? - st_proportion = params[:st_proportion].to_f.round(2) - tip_exception("学生评分比例不能小于0") if st_proportion < 0 - tip_exception("评分比例之和不能大于100") if (te_proportion + ta_proportion + st_proportion) > 1.0 - end - proportion_change = @homework_detail_manual.te_proportion.round(2) != te_proportion || - @homework_detail_manual.ta_proportion.round(2) != ta_proportion - @homework_detail_manual.te_proportion = te_proportion - @homework_detail_manual.ta_proportion = ta_proportion + # 匿评申诉未结束前可以更新:匿评申诉结束时间 + if @homework_detail_manual.comment_status < 5 + tip_exception("匿评申诉结束时间不能为空") if @homework.anonymous_appeal && params[:appeal_time].blank? + tip_exception("匿评开启时间不能早于匿评截止时间") if @homework.anonymous_appeal && + params[:appeal_time] <= strf_time(@homework_detail_manual.evaluation_end) + tip_exception("匿评申诉结束不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if @homework.anonymous_appeal && + @course.end_date.present? && params[:appeal_time] > strf_time(@course.end_date.end_of_day) + + @homework_detail_manual.appeal_time = @homework.anonymous_appeal ? params[:appeal_time] : nil + end + + # 作业未结束可以更新违规匿评扣分 + tip_exception("违规匿评扣分不能为空") if @homework.anonymous_appeal && params[:appeal_penalty].blank? + tip_exception("违规匿评扣分不能小于0") if @homework.anonymous_appeal && params[:appeal_penalty].to_i < 0 + tip_exception("违规匿评扣分不能大于100") if @homework.anonymous_appeal && params[:appeal_penalty].to_i > 100 + @homework_detail_manual.appeal_penalty = @homework.anonymous_appeal ? params[:appeal_penalty].to_i : 0 + + # 如果缺评扣分的设置有变更且匿评已截止 + absence_penalty_change = current_absence_penalty != @homework_detail_manual.absence_penalty && + @homework_detail_manual.comment_status >= 4 + # 如果违规匿评扣分的设置有变更且匿评已截止 + appeal_penalty_change = current_appeal_penalty != @homework_detail_manual.appeal_penalty && + @homework_detail_manual.comment_status >= 4 + + # 评分设置 + tip_exception("助教评分模式不能为空") if params[:ta_mode].blank? + + # 助教评分模式的变更 + ta_mode_change = @homework_detail_manual.ta_mode != params[:ta_mode].to_i + @homework_detail_manual.ta_mode = params[:ta_mode].to_i + + # 最终成绩组成 + tip_exception("最终成绩组成模式不能为空") if params[:final_mode].nil? + + final_mode_change = @homework_detail_manual.final_mode != params[:final_mode] + @homework_detail_manual.final_mode = params[:final_mode] + if !@homework_detail_manual.final_mode + tip_exception("教师评分比例不能为空") if params[:te_proportion].blank? + te_proportion = params[:te_proportion].to_f.round(2) + tip_exception("教师评分比例不能小于0") if te_proportion < 0 + tip_exception("助教评分比例不能为空") if params[:ta_proportion].blank? + ta_proportion = params[:ta_proportion].to_f.round(2) + tip_exception("助教评分比例不能小于0") if ta_proportion < 0 + if !@homework.anonymous_comment + tip_exception("评分比例之和不能大于100") if (te_proportion + ta_proportion) > 1.0 else - @homework_detail_manual.te_proportion = 1 - @homework_detail_manual.ta_proportion = 0 + tip_exception("学生评分比例不能为空") if params[:st_proportion].blank? + st_proportion = params[:st_proportion].to_f.round(2) + tip_exception("学生评分比例不能小于0") if st_proportion < 0 + tip_exception("评分比例之和不能大于100") if (te_proportion + ta_proportion + st_proportion) > 1.0 end - # 公开属性设置 - tip_exception("缺少work_public参数") if params[:work_public].nil? - tip_exception("缺少score_open参数") if params[:score_open].nil? - tip_exception("缺少answer_public参数") if params[:answer_public].nil? - @homework.work_public = params[:work_public] - @homework.score_open = params[:score_open] - @homework.answer_public = params[:answer_public] - - @homework_detail_manual.save! - @homework.save! - - # 迟交扣分、缺评扣分、违规匿评扣分、助教评分模式变更、最终成绩组成、评分比例变更都需要更新学生成绩 - if late_penalty_change || absence_penalty_change || appeal_penalty_change || ta_mode_change || - final_mode_change || proportion_change - - student_works = @homework.student_works.has_committed - work_ids = student_works.pluck(:id) - - student_works.each do |student_work| - # 迟交扣分 - student_work.late_penalty = student_work.work_status == 1 ? 0 : @homework.late_penalty - - # 缺评扣分的更新 如果之前的作业缺评扣分为0,则需重新计算缺评次数 - if absence_penalty_change - absence_penalty_count = current_absence_penalty == 0 ? student_work.absence_count : - (student_work.absence_penalty / current_absence_penalty).to_i - student_work.absence_penalty = absence_penalty_count * @homework_detail_manual.absence_penalty - end + proportion_change = @homework_detail_manual.te_proportion.round(2) != te_proportion || + @homework_detail_manual.ta_proportion.round(2) != ta_proportion + @homework_detail_manual.te_proportion = te_proportion + @homework_detail_manual.ta_proportion = ta_proportion + else + @homework_detail_manual.te_proportion = 1 + @homework_detail_manual.ta_proportion = 0 + end - # 违规匿评扣分 如果之前的作业违规扣分为0,则需重新计算违规匿评次数 - if appeal_penalty_change - appeal_penalty_count = current_appeal_penalty == 0 ? student_work.appeal_count : - (student_work.appeal_penalty / current_appeal_penalty).to_i - student_work.appeal_penalty = appeal_penalty_count * @homework_detail_manual.appeal_penalty - end + # 公开属性设置 + tip_exception("缺少work_public参数") if params[:work_public].nil? + tip_exception("缺少score_open参数") if params[:score_open].nil? + tip_exception("缺少answer_public参数") if params[:answer_public].nil? + @homework.work_public = params[:work_public] + @homework.score_open = params[:score_open] + @homework.answer_public = params[:answer_public] + + @homework_detail_manual.save! + @homework.save! + + # 迟交扣分、缺评扣分、违规匿评扣分、助教评分模式变更、最终成绩组成、评分比例变更都需要更新学生成绩 + if late_penalty_change || absence_penalty_change || appeal_penalty_change || ta_mode_change || + final_mode_change || proportion_change + + student_works = @homework.student_works.has_committed + work_ids = student_works.pluck(:id) + + student_works.each do |student_work| + # 迟交扣分 + student_work.late_penalty = student_work.work_status == 1 ? 0 : @homework.late_penalty + + # 缺评扣分的更新 如果之前的作业缺评扣分为0,则需重新计算缺评次数 + if absence_penalty_change + absence_penalty_count = current_absence_penalty == 0 ? student_work.absence_count : + (student_work.absence_penalty / current_absence_penalty).to_i + student_work.absence_penalty = absence_penalty_count * @homework_detail_manual.absence_penalty + end - # 助教模式变更且有助教评分记录时才更新 - if ta_mode_change && student_work.student_works_scores.where("reviewer_role = 2 AND score IS NOT NULL").count > 0 - student_work.teaching_asistant_score = student_work.ta_score @homework_detail_manual.ta_mode - end + # 违规匿评扣分 如果之前的作业违规扣分为0,则需重新计算违规匿评次数 + if appeal_penalty_change + appeal_penalty_count = current_appeal_penalty == 0 ? student_work.appeal_count : + (student_work.appeal_penalty / current_appeal_penalty).to_i + student_work.appeal_penalty = appeal_penalty_count * @homework_detail_manual.appeal_penalty + end - student_work.save! + # 助教模式变更且有助教评分记录时才更新 + if ta_mode_change && student_work.student_works_scores.where("reviewer_role = 2 AND score IS NOT NULL").count > 0 + student_work.teaching_asistant_score = student_work.ta_score @homework_detail_manual.ta_mode end - end + student_work.save! + end end - normal_status(0, "更新成功") - else - tip_exception("课堂已结束不能再更新") + end + normal_status(0, "更新成功") + else + tip_exception("课堂已结束不能再更新") + end # rescue ActiveRecord::RecordInvalid # render_error("保存失败") # rescue ApplicationService::Error => ex # uid_logger(ex.message) # render_error(ex.message) # raise ActiveRecord::Rollback - rescue Exception => e - uid_logger(e.backtrace) - tip_exception(e.message) - raise ActiveRecord::Rollback - end end # 选用实训 @@ -799,7 +770,7 @@ class HomeworkCommonsController < ApplicationController @total_count = @shixuns.size ## 分页参数 - page = params[:page] || 1 + page = params[:page] || 1 @shixuns = @shixuns.reorder("shixuns.created_at desc").includes(:challenges, user: [user_extension: :school]).page(page).per(10) end @@ -822,15 +793,15 @@ class HomeworkCommonsController < ApplicationController def subjects @tags = Repertoire.where(nil).order("updated_at desc") # select = params[:select] # 路径导航类型 - select = params[:type] # 路径导航类型 + select = params[:type] # 路径导航类型 reorder = params[:order] || "myshixun_count" sort = params[:sort] || "desc" search = params[:search] ## 分页参数 - page = params[:page] || 1 + page = params[:page] || 1 limit = params[:limit] || 15 - offset = (page.to_i-1) * limit + offset = (page.to_i - 1) * limit # 最热排序 if reorder == "myshixun_count" @@ -903,8 +874,8 @@ class HomeworkCommonsController < ApplicationController # 为实训作业创建与stage同名的子目录 category = CourseSecondCategory.find_by(name: stage.name, course_id: @course.id, category_type: "shixun_homework") || - CourseSecondCategory.create!(name: stage.name, course_id: @course.id, category_type: "shixun_homework", - course_module_id: course_module.id, position: course_module.course_second_categories.count + 1) + CourseSecondCategory.create!(name: stage.name, course_id: @course.id, category_type: "shixun_homework", + course_module_id: course_module.id, position: course_module.course_second_categories.count + 1) # 去掉不对当前用户的单位公开的实训,已发布的实训 stage.shixuns.no_jupyter.where(id: shixun_ids).unhidden.each do |shixun| @@ -935,16 +906,14 @@ class HomeworkCommonsController < ApplicationController if params[:detail].blank? tip_exception("缺少截止时间参数") if params[:end_time].blank? tip_exception("截止时间不能早于当前时间") if params[:end_time] <= strf_time(Time.now) - tip_exception("截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if - @course.end_date.present? && params[:end_time] > strf_time(@course.end_date.end_of_day) + tip_exception("截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if @course.end_date.present? && params[:end_time] > strf_time(@course.end_date.end_of_day) else tip_exception("缺少分班截止时间参数") if params[:group_end_times].blank? - group_end_times = params[:group_end_times].reject(&:blank?)&.map{|time| time.to_time} + group_end_times = params[:group_end_times].reject(&:blank?)&.map {|time| time.to_time} tip_exception("截止时间和分班参数的个数不一致") if group_end_times.length != group_ids.length group_end_times.each do |time| tip_exception("分班截止时间不能早于当前时间") if time <= Time.now - tip_exception("分班截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if - @course.end_date.present? && time > @course.end_date.end_of_day + tip_exception("分班截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if @course.end_date.present? && time > @course.end_date.end_of_day end end @@ -955,94 +924,89 @@ class HomeworkCommonsController < ApplicationController publish_groups = charge_group_ids & group_ids if group_ids # ActiveRecord::Base.transaction do - begin - homeworks.each do |homework| - # 作业未发布时 - if homework.homework_detail_manual.try(:comment_status) == 0 - if !params[:group_ids].blank? - - # 全选即统一设置,unified_setting为true - if @course.course_groups.where(id: publish_groups).size == @course.course_groups.size && - ((params[:detail] && group_end_times.min == group_end_times.max) || params[:detail].blank?) - homework.homework_group_settings.destroy_all - homework.unified_setting = true - homework.end_time = params[:detail] ? group_end_times.max : params[:end_time] - else - homework.unified_setting = false - # 创建作业分班设置:homework_group_setting - homework.create_homework_group_settings - - # 选中的分班设置的发布时间改为当前时间,截止时间改为传的截止时间参数 - if params[:detail] - group_ids.each_with_index do |group_id, index| - homework.homework_group_settings.find_by(course_group_id: group_id)&.update_attributes!(publish_time: Time.now, - end_time: group_end_times[index]) - end - else - homework.homework_group_settings.where(course_group_id: publish_groups).update_all(publish_time: Time.now, - end_time: params[:end_time]) - end - # 发消息 - tiding_group_ids = publish_groups - end - else - homework.homework_group_settings.destroy_all - # students = @course.students - end - - homework.publish_time = Time.now - - # 截止时间的处理 - if homework.end_time.nil? - homework.end_time = params[:detail] ? group_end_times.max : params[:end_time] - elsif homework.max_group_end_time - homework.end_time = homework.max_group_end_time - end - homework.homework_detail_manual.update_attributes!(comment_status: 1) - - if homework.course_act.blank? - CourseActivity.create!(user_id: homework.user_id, course_id: homework.course_id, course_act: homework) - end - # 发消息 - HomeworkCommonPushNotifyJob.perform_later(homework.id, tiding_group_ids) + homeworks.each do |homework| + # 作业未发布时 + if homework.homework_detail_manual.try(:comment_status) == 0 + if !params[:group_ids].blank? + + # 全选即统一设置,unified_setting为true + if @course.course_groups.where(id: publish_groups).size == @course.course_groups.size && + ((params[:detail] && group_end_times.min == group_end_times.max) || params[:detail].blank?) + homework.homework_group_settings.destroy_all + homework.unified_setting = true + homework.end_time = params[:detail] ? group_end_times.max : params[:end_time] else + homework.unified_setting = false + # 创建作业分班设置:homework_group_setting homework.create_homework_group_settings - none_publish_settings = homework.homework_group_settings.where(course_group_id: publish_groups).none_published + # 选中的分班设置的发布时间改为当前时间,截止时间改为传的截止时间参数 if params[:detail] group_ids.each_with_index do |group_id, index| - none_publish_settings.find_by(course_group_id: group_id)&.update_attributes!(publish_time: Time.now, - end_time: group_end_times[index]) + homework.homework_group_settings.find_by(course_group_id: group_id)&.update_attributes!(publish_time: Time.now, + end_time: group_end_times[index]) end else - none_publish_settings.update_all(publish_time: Time.now, end_time: params[:end_time]) + homework.homework_group_settings.where(course_group_id: publish_groups).update_all(publish_time: Time.now, + end_time: params[:end_time]) end - - if homework.max_group_end_time - homework.end_time = homework.max_group_end_time - end - HomeworkCommonPushNotifyJob.perform_later(homework.id, none_publish_settings.pluck(:course_group_id)) + # 发消息 + tiding_group_ids = publish_groups end + else + homework.homework_group_settings.destroy_all + # students = @course.students + end + homework.publish_time = Time.now - if homework.end_time > Time.now && homework.homework_detail_manual.try(:comment_status) > 1 - homework.homework_detail_manual.update_attributes!(comment_status: 1) - end + # 截止时间的处理 + if homework.end_time.nil? + homework.end_time = params[:detail] ? group_end_times.max : params[:end_time] + elsif homework.max_group_end_time + homework.end_time = homework.max_group_end_time + end + homework.homework_detail_manual.update_attributes!(comment_status: 1) - # 补交结束时间 - homework.late_time = Time.at(homework.end_time.to_i + 30*24*3600) if homework.allow_late && homework.late_time.nil? + if homework.course_act.blank? + CourseActivity.create!(user_id: homework.user_id, course_id: homework.course_id, course_act: homework) + end + # 发消息 + HomeworkCommonPushNotifyJob.perform_later(homework.id, tiding_group_ids) + else + homework.create_homework_group_settings - homework.save! + none_publish_settings = homework.homework_group_settings.where(course_group_id: publish_groups).none_published + if params[:detail] + group_ids.each_with_index do |group_id, index| + none_publish_settings.find_by(course_group_id: group_id)&.update_attributes!(publish_time: Time.now, + end_time: group_end_times[index]) + end + else + none_publish_settings.update_all(publish_time: Time.now, end_time: params[:end_time]) + end - # 更新学生状态及成绩(手动点击计算) - # HomeworkPublishUpdateWorkStatusJob.perform_later(tiding_group_ids, homework.id) + if homework.max_group_end_time + homework.end_time = homework.max_group_end_time end - normal_status(0, "发布成功") - rescue Exception => e - uid_logger(e.message) - tip_exception("发布失败") - raise ActiveRecord::Rollback + HomeworkCommonPushNotifyJob.perform_later(homework.id, none_publish_settings.pluck(:course_group_id)) end + + + if homework.end_time > Time.now && homework.homework_detail_manual.try(:comment_status) > 1 + homework.homework_detail_manual.update_attributes!(comment_status: 1) + end + + # 补交结束时间 + homework.late_time = Time.at(homework.end_time.to_i + 30 * 24 * 3600) if homework.allow_late && homework.late_time.nil? + + homework.save! + + # 更新学生状态及成绩(手动点击计算) + # HomeworkPublishUpdateWorkStatusJob.perform_later(tiding_group_ids, homework.id) + end + normal_status(0, "发布成功") + # end end @@ -1051,9 +1015,9 @@ class HomeworkCommonsController < ApplicationController charge_ids = @course.charge_group_ids(@current_user) if @homework.end_immediately charge_ids # 可立即截止的分班:统一设置则是用户管理的所有分班,否则是当前用户管理的分班中已发布且未截止的 - charge_group_ids = @course.charge_group_ids(@current_user) # 当前用户管理的分班 + charge_group_ids = @course.charge_group_ids(@current_user) # 当前用户管理的分班 group_ids = @homework.unified_setting ? charge_group_ids : - @homework.homework_group_settings.where(course_group_id: charge_group_ids).published_no_end.pluck(:course_group_id) + @homework.homework_group_settings.where(course_group_id: charge_group_ids).published_no_end.pluck(:course_group_id) @course_groups = @course.course_groups.where(id: group_ids) else tip_exception("没有可截止的分班") @@ -1074,56 +1038,50 @@ class HomeworkCommonsController < ApplicationController group_ids = params[:group_ids]&.reject(&:blank?)&.map(&:to_i) end_groups = charge_group_ids & group_ids if group_ids - begin - homeworks.each do |homework| - ActiveRecord::Base.transaction do - homework_detail_manual = homework.homework_detail_manual - - # 分组设置 - if !params[:group_ids].blank? - # 确保之前是统一设置或者有新创建的分班的数据一致性 - homework.create_homework_group_settings + homeworks.each do |homework| + ActiveRecord::Base.transaction do + homework_detail_manual = homework.homework_detail_manual - homework.unified_setting = false if homework.unified_setting && end_groups.length != @course.course_groups_count + # 分组设置 + if !params[:group_ids].blank? + # 确保之前是统一设置或者有新创建的分班的数据一致性 + homework.create_homework_group_settings - # 已发布且未截止的分班 - none_end_settings = homework.homework_group_settings.where(course_group_id: end_groups).published_no_end + homework.unified_setting = false if homework.unified_setting && end_groups.length != @course.course_groups_count - none_end_settings.update_all(end_time: time) - student_works = homework.student_works.where(user_id: course_students.where(course_group_id: none_end_settings. - pluck(:course_group_id)).pluck(:user_id)).has_committed if homework.homework_type == "practice" + # 已发布且未截止的分班 + none_end_settings = homework.homework_group_settings.where(course_group_id: end_groups).published_no_end - homework.end_time = homework.max_group_end_time - if homework.end_time > time && homework_detail_manual.try(:comment_status) > 1 - homework_detail_manual.update_attributes!(comment_status: 1) - end + none_end_settings.update_all(end_time: time) + student_works = homework.student_works.where(user_id: course_students.where(course_group_id: none_end_settings. + pluck(:course_group_id)).pluck(:user_id)).has_committed if homework.homework_type == "practice" - # 统一设置 - elsif homework.unified_setting - student_works = homework.student_works.has_committed if homework.homework_type == "practice" - homework.end_time = time + homework.end_time = homework.max_group_end_time + if homework.end_time > time && homework_detail_manual.try(:comment_status) > 1 + homework_detail_manual.update_attributes!(comment_status: 1) end - # homework_detail_manual.update_attributes!(comment_status: 2) if homework.end_time <= time + # 统一设置 + elsif homework.unified_setting + student_works = homework.student_works.has_committed if homework.homework_type == "practice" + homework.end_time = time + end + + # homework_detail_manual.update_attributes!(comment_status: 2) if homework.end_time <= time - # 实训作业的作品需要计算是否迟交 - if homework.homework_type == "practice" - # shixun = homework.shixuns.first - # homework_challenge_settings = homework.homework_challenge_settings - unless student_works.blank? - student_works.joins(:myshixun).where("myshixuns.status != 1").update_all(late_penalty: homework.late_penalty) if homework.allow_late - end + # 实训作业的作品需要计算是否迟交 + if homework.homework_type == "practice" + # shixun = homework.shixuns.first + # homework_challenge_settings = homework.homework_challenge_settings + unless student_works.blank? + student_works.joins(:myshixun).where("myshixuns.status != 1").update_all(late_penalty: homework.late_penalty) if homework.allow_late end - homework.save! end - HomeworkEndUpdateScoreJob.perform_later(homework.id) if !homework.allow_late && homework.end_time <= time + homework.save! end - normal_status(0, "更新成功") - rescue Exception => e - uid_logger(e.message) - tip_exception("操作失败") - raise ActiveRecord::Rollback + HomeworkEndUpdateScoreJob.perform_later(homework.id) if !homework.allow_late && homework.end_time <= time end + normal_status(0, "更新成功") end def set_public @@ -1156,19 +1114,13 @@ class HomeworkCommonsController < ApplicationController # 删除多个作业 def multi_destroy ActiveRecord::Base.transaction do - begin - homeworks = @course.homework_commons.where(id: params[:homework_ids]) - homeworks.destroy_all - - # 这些写是因为model中的关联删除无法删除is_delete=0的作品 - StudentWork.where(homework_common_id: homeworks.pluck(:id)).destroy_all - normal_status(0, "删除成功") - - rescue Exception => e - uid_logger(e.message) - tip_exception("删除失败") - raise ActiveRecord::Rollback - end + homeworks = @course.homework_commons.where(id: params[:homework_ids]) + homeworks.destroy_all + + # 这些写是因为model中的关联删除无法删除is_delete=0的作品 + StudentWork.where(homework_common_id: homeworks.pluck(:id)).destroy_all + normal_status(0, "删除成功") + end end @@ -1178,41 +1130,35 @@ class HomeworkCommonsController < ApplicationController homeworks.each do |homework| ActiveRecord::Base.transaction do - begin - homework_bank = current_user.homework_banks.find_by(homework_common_id: homework.id) - if homework_bank.present? - # 如果作业加入过题库则更新参数 - if homework_bank.homework_type == 1 - homework_bank.update_attributes!(name: homework.name, description: homework.description, - reference_answer: homework.reference_answer, course_list_id: @course.course_list_id) - elsif homework_bank.homework_type == 3 - homework_detail_group = homework.homework_detail_group - homework_bank.update_attributes!(name: homework.name, description: homework.description, - reference_answer: homework.reference_answer, course_list_id: @course.course_list_id, - min_num: homework_detail_group.min_num, max_num: homework_detail_group.max_num, - base_on_project: homework_detail_group.base_on_project) - end - - # 附件的更新 - homework_bank.attachments.destroy_all - homework.attachments.each do |attachment| - att = attachment.copy - att.author_id = homework_bank.user_id - att.copy_from = attachment.id - homework_bank.attachments << att - end - else - new_homework_bank = add_to_homework_bank_f homework - new_homework_bank.save! + homework_bank = current_user.homework_banks.find_by(homework_common_id: homework.id) + if homework_bank.present? + # 如果作业加入过题库则更新参数 + if homework_bank.homework_type == 1 + homework_bank.update_attributes!(name: homework.name, description: homework.description, + reference_answer: homework.reference_answer, course_list_id: @course.course_list_id) + elsif homework_bank.homework_type == 3 + homework_detail_group = homework.homework_detail_group + homework_bank.update_attributes!(name: homework.name, description: homework.description, + reference_answer: homework.reference_answer, course_list_id: @course.course_list_id, + min_num: homework_detail_group.min_num, max_num: homework_detail_group.max_num, + base_on_project: homework_detail_group.base_on_project) + end - homework.update_attributes!(homework_bank_id: new_homework_bank.id) + # 附件的更新 + homework_bank.attachments.destroy_all + homework.attachments.each do |attachment| + att = attachment.copy + att.author_id = homework_bank.user_id + att.copy_from = attachment.id + homework_bank.attachments << att end + else + new_homework_bank = add_to_homework_bank_f homework + new_homework_bank.save! - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback + homework.update_attributes!(homework_bank_id: new_homework_bank.id) end + end end normal_status(0, "加入成功") @@ -1229,7 +1175,7 @@ class HomeworkCommonsController < ApplicationController # 班级作品查重 def homework_code_repeat - tip_exception(-1,"分班id不能为空!") if params[:group_ids].nil? + tip_exception(-1, "分班id不能为空!") if params[:group_ids].nil? shixun = @homework.shixuns.take # 通过代码文件来判断语言 language = shixun.challenges.practice_type.pluck(:path).first @@ -1247,16 +1193,16 @@ class HomeworkCommonsController < ApplicationController games.each do |game| game.game_codes.each do |game_code| code_infos << { - path: game_code.path, - content: Base64.urlsafe_encode64(game_code.new_code.to_s, padding: false), - passed_time: game.end_time.try(:strftime, '%Y-%m-%d %H:%M:%S') + path: game_code.path, + content: Base64.urlsafe_encode64(game_code.new_code.to_s, padding: false), + passed_time: game.end_time.try(:strftime, '%Y-%m-%d %H:%M:%S') } end end if code_infos.size != 0 user_lists << { - user_id: user_id, - code_info: code_infos + user_id: user_id, + code_info: code_infos } end end @@ -1270,13 +1216,13 @@ class HomeworkCommonsController < ApplicationController normal_status("代码查重成功") else if result.status == 1 - tip_exception(-4,"代码查重异常,请稍后重试") + tip_exception(-4, "代码查重异常,请稍后重试") else - tip_exception(-3,"正在查重,请在几分钟后刷新页面查看结果") + tip_exception(-3, "正在查重,请在几分钟后刷新页面查看结果") end end else - tip_exception(-2,"平台目前支持java、python语言的查重
其他语言正在规划中,敬请期待") + tip_exception(-2, "平台目前支持java、python语言的查重
其他语言正在规划中,敬请期待") end end @@ -1295,23 +1241,23 @@ class HomeworkCommonsController < ApplicationController student_works = @homework.student_works.where("work_status > 0") # 按分班id搜索 user_ids = - if params[:group_ids] - # 筛选了分班 - group_student_ids = @course.course_members.where(course_group_id: params[:group_ids]).pluck(:user_id) - student_works.where(:user_id => group_student_ids).pluck(:user_id) + if params[:group_ids] + # 筛选了分班 + group_student_ids = @course.course_members.where(course_group_id: params[:group_ids]).pluck(:user_id) + student_works.where(:user_id => group_student_ids).pluck(:user_id) + else + # 如果当前用户有分班 显示分班内的学生,没有则显示全部 + user_ids = @course.user_group_students(current_user.id).pluck(:user_id) + if user_ids.present? + student_works.where(:user_id => user_ids).pluck(:user_id) else - # 如果当前用户有分班 显示分班内的学生,没有则显示全部 - user_ids = @course.user_group_students(current_user.id).pluck(:user_id) - if user_ids.present? - student_works.where(:user_id => user_ids).pluck(:user_id) - else - student_works.pluck(:user_id) - end + student_works.pluck(:user_id) end + end # 查询作品数总数 @all_reviews_count = user_ids.count @users_reviews = @homework.homework_review_results.where("code_rate >= 50.0") - .where(:user_id => user_ids).joins(user: :user_extension) + .where(:user_id => user_ids).joins(user: :user_extension) # 按学号和姓名搜索 if params[:search] @users_reviews = @users_reviews.where("concat(lastname, firstname) like :keyword or student_id like :keyword", keyword: "%#{params[:search]}%") @@ -1325,9 +1271,9 @@ class HomeworkCommonsController < ApplicationController # 如果未分班被查重过,则显示未分班列 @non_course_group = - if @homework.homework_group_reviews.where(course_group_id: 0).count > 0 - @course.course_members.where(role: 4, course_group_id: 0).count - end + if @homework.homework_group_reviews.where(course_group_id: 0).count > 0 + @course.course_members.where(role: 4, course_group_id: 0).count + end # 最新一次的查重时间 @last_review_time = format_time @homework.homework_group_reviews.last.try(:created_at) @@ -1353,38 +1299,38 @@ class HomeworkCommonsController < ApplicationController homework_challenge_settings = @homework.homework_challenge_settings @challenges = @shixun.challenges.where(id: homework_challenge_settings.pluck(:challenge_id), st: 0) @challenges = - @challenges.map do |challenge| - code_rate = 0 - game_codes = results.code_info.select {|info| challenge.path.split(";").include?(info.origin_path)} - # 先判断用户该关卡是否查重了 取多个待补充文件的平均值 - if game_codes.count > 0 - code_rate += game_codes.map(&:rate).sum / challenge.path.split(";").length - end - logger.info("#####game_codes: #{game_codes}") - #target = game_codes.count > 0 ? game_codes[0].target_user_id : nil - # 作品完成时间 - game = challenge.games.find_by(user_id: @user.id) - end_time = game.end_time - # 用户关卡的得分 - all_score = homework_challenge_settings.find_by(challenge_id: challenge.id).try(:score).to_f - final_score = @student_work.work_challenge_score game, all_score, challenge.id - # 抄袭用户 - copy_user = User.find_by_id(game_codes[0].try(:target_user_id)) - copy_end_time = copy_user.games.find_by(challenge_id: challenge.id).try(:end_time) if copy_user.present? - # 代码部分 - code_list = [] - challenge.path.split(";").each do |path| - if code_info.select{|info| path == info.origin_path}.size > 0 - info = code_info.select{|info| path == info.origin_path}[0] - code_list << {path: path, origin_content: info.origin_content, target_content: info.target_content} - end + @challenges.map do |challenge| + code_rate = 0 + game_codes = results.code_info.select {|info| challenge.path.split(";").include?(info.origin_path)} + # 先判断用户该关卡是否查重了 取多个待补充文件的平均值 + if game_codes.count > 0 + code_rate += game_codes.map(&:rate).sum / challenge.path.split(";").length + end + logger.info("#####game_codes: #{game_codes}") + #target = game_codes.count > 0 ? game_codes[0].target_user_id : nil + # 作品完成时间 + game = challenge.games.find_by(user_id: @user.id) + end_time = game.end_time + # 用户关卡的得分 + all_score = homework_challenge_settings.find_by(challenge_id: challenge.id).try(:score).to_f + final_score = @student_work.work_challenge_score game, all_score, challenge.id + # 抄袭用户 + copy_user = User.find_by_id(game_codes[0].try(:target_user_id)) + copy_end_time = copy_user.games.find_by(challenge_id: challenge.id).try(:end_time) if copy_user.present? + # 代码部分 + code_list = [] + challenge.path.split(";").each do |path| + if code_info.select {|info| path == info.origin_path}.size > 0 + info = code_info.select {|info| path == info.origin_path}[0] + code_list << {path: path, origin_content: info.origin_content, target_content: info.target_content} end - # TODO: 这里本来应该前端做的,但是现在页面已经刷不开了。 - {code_rate: code_rate, copy_user_id: copy_user.try(:id), end_time: end_time, final_score: final_score, - all_score: all_score, copy_end_time: copy_end_time, copy_username: copy_user.try(:full_name), - username: game.user.full_name, code_list: code_list, subject: challenge.subject, position: challenge.position, - id: challenge.id} end + # TODO: 这里本来应该前端做的,但是现在页面已经刷不开了。 + {code_rate: code_rate, copy_user_id: copy_user.try(:id), end_time: end_time, final_score: final_score, + all_score: all_score, copy_end_time: copy_end_time, copy_username: copy_user.try(:full_name), + username: game.user.full_name, code_list: code_list, subject: challenge.subject, position: challenge.position, + id: challenge.id} + end else if results.status == 1 @@ -1461,8 +1407,8 @@ class HomeworkCommonsController < ApplicationController user_rate = 0 # 计算每个关卡的相似度 challenges.each do |challenge| - game_codes = results.user_lists.select{|user_list| user_list.user_id == user && - challenge.path.split(";").include?(user_list.origin_path)} + game_codes = results.user_lists.select {|user_list| user_list.user_id == user && + challenge.path.split(";").include?(user_list.origin_path)} # 先判断用户该关卡是否查重了 取多个待补充文件的平均值 if game_codes.count > 0 user_rate += game_codes.map(&:rate).sum / challenge.path.split(";").length diff --git a/app/controllers/polls_controller.rb b/app/controllers/polls_controller.rb index 21a919efd..edb3fba00 100644 --- a/app/controllers/polls_controller.rb +++ b/app/controllers/polls_controller.rb @@ -135,6 +135,7 @@ class PollsController < ApplicationController :course_id => @course.id, :polls_status => 1, :polls_type => "Course", + :un_anonymous => true } @poll = Poll.create!(poll_options) end diff --git a/app/controllers/weapps/attendances_controller.rb b/app/controllers/weapps/attendances_controller.rb index d584072c2..3f0eec248 100644 --- a/app/controllers/weapps/attendances_controller.rb +++ b/app/controllers/weapps/attendances_controller.rb @@ -27,7 +27,7 @@ class Weapps::AttendancesController < ApplicationController tip_exception(403) if @user_course_identity >= Course::STUDENT current_date = Date.current current_end_time = Time.current.strftime("%H:%M:%S") - @current_attendance = @course.course_attendances.where("attendance_date = '#{current_date}' and end_time > '#{current_end_time}'") + @current_attendance = @course.course_attendances.where("attendance_date > '#{current_date}' or (attendance_date = '#{current_date}' and end_time > '#{current_end_time}')") .order("attendance_date asc, start_time asc") all_attendances = @course.course_attendances.where("attendance_date < '#{current_date}' or (attendance_date = '#{current_date}' and end_time < '#{current_end_time}')") diff --git a/app/models/hack_set.rb b/app/models/hack_set.rb index 2c21c3c22..3349b0ae6 100644 --- a/app/models/hack_set.rb +++ b/app/models/hack_set.rb @@ -1,8 +1,8 @@ class HackSet < ApplicationRecord validates_length_of :input, maximum: 1000, message: "不能超过1000个字符" validates_length_of :output, maximum: 1000, message: "不能超过1000个字符" - validates :input, presence: { message: "测试集输入不能为空" } - validates :output, presence: { message: "测试集输出不能为空" } + #validates :input, presence: { message: "测试集输入不能为空" } + validates_presence_of :output, message: "不能为空" validates_uniqueness_of :input, scope: [:hack_id, :input], message: "多个测试集的输入不能相同" # 编程题测试集 belongs_to :hack diff --git a/app/services/schools/school_statistic_service.rb b/app/services/schools/school_statistic_service.rb index a5082108d..5d8a30141 100644 --- a/app/services/schools/school_statistic_service.rb +++ b/app/services/schools/school_statistic_service.rb @@ -2,7 +2,7 @@ class Schools::SchoolStatisticService < ApplicationService attr_reader :school def initialize(school) - @school = school.includes(:courses, user_extensions: :user) + @school = school @user_extensions = school.user_extensions end @@ -26,14 +26,14 @@ class Schools::SchoolStatisticService < ApplicationService @user_extensions.map{|ue| ue.user.last_login_on&.between?(1.weeks.ago, Time.now)}.size end - # 活跃用户(近3个月有登录) + # 活跃用户(近1个月有登录) def acitve_user_1_months_count - @user_extensions.map{|ue| ue.user.last_login_on&.between?(1.months.ago, Time.now)}.size + @user_extensions.joins(:user).map{|ue| ue.user.last_login_on&.between?(1.months.ago, Time.now)}.size end # 活跃用户(近3个月有登录) def acitve_user_3_months_count - @user_extensions.map{|ue| ue.user.last_login_on&.between?(3.months.ago, Time.now)}.size + @user_extensions.map{|ue| ue.user&.last_login_on&.between?(3.months.ago, Time.now)}.size end # 活跃用户(进半年有登录记录) @@ -52,10 +52,15 @@ class Schools::SchoolStatisticService < ApplicationService end # 实训作业数目 - def hom_shixuns_count + def homw_shixuns_count @school.courses.joins(:homework_commons).where(homework_commons: {homework_type: 'practice'}).size end + # 其他类型作业 + def homw_other_count + @school.courses.joins(:homework_commons).where.not(homework_commons: {homework_type: 'practice'}).size + end + # 资源数 def sources_count @school.courses.joins(:attachments).size @@ -67,7 +72,7 @@ class Schools::SchoolStatisticService < ApplicationService end # 制作实训数 - def shixun_count + def shixuns_count @user_extensions.joins(user: :shixuns).size end @@ -83,17 +88,17 @@ class Schools::SchoolStatisticService < ApplicationService # 挑战的关卡数 def games_count - @user_extensions.joins("join games on games.user_id = user_extensions.user_id").where(games: {status: 0..2}) + @user_extensions.joins("join games on games.user_id = user_extensions.user_id").where(games: {status: 0..2}).size end # 通关的关卡数 def pass_games_count - @user_extensions.joins("join games on games.user_id = user_extensions.user_id").where(games: {status: 2}) + @user_extensions.joins("join games on games.user_id = user_extensions.user_id").where(games: {status: 2}).size end # 评测总数 - def evalute_count - @user_extensions.joins("join games on games.user_id = user_extensions.user_id").sum(:evalute_count) + def evaluate_count + @user_extensions.joins("join games on games.user_id = user_extensions.user_id").sum(:evaluate_count).to_i end diff --git a/db/migrate/20200306072044_add_index_for_sta_all.rb b/db/migrate/20200306072044_add_index_for_sta_all.rb new file mode 100644 index 000000000..f4e62c8a9 --- /dev/null +++ b/db/migrate/20200306072044_add_index_for_sta_all.rb @@ -0,0 +1,5 @@ +class AddIndexForStaAll < ActiveRecord::Migration[5.2] + def change + add_index :sta_alls, :school_id, :unique => true + end +end diff --git a/db/migrate/20200306131654_add_user_id_index_for_games.rb b/db/migrate/20200306131654_add_user_id_index_for_games.rb new file mode 100644 index 000000000..ec92a1a08 --- /dev/null +++ b/db/migrate/20200306131654_add_user_id_index_for_games.rb @@ -0,0 +1,5 @@ +class AddUserIdIndexForGames < ActiveRecord::Migration[5.2] + def change + add_index :games, :user_id + end +end diff --git a/et --hard 8e0cf37 b/et --hard 8e0cf37 new file mode 100644 index 000000000..95a171a18 --- /dev/null +++ b/et --hard 8e0cf37 @@ -0,0 +1,274 @@ +commit 8e0cf3730ba50f5fb95773d7ed3bfeab51cff640 (HEAD -> forge) +Author: dingyongkang <837816638@qq.com> +Date: Tue Feb 25 17:14:50 2020 +0800 + + 合并请求模块 + +commit b0d10c14dd86c0db5bfa37da24587687e7570b60 +Merge: ba41688b4 8a3afcbf0 +Author: dingyongkang <837816638@qq.com> +Date: Wed Feb 19 20:02:46 2020 +0800 + + 工单模块 + +commit ba41688b4b6116d677585a826e53ee0a7c3c3f7d +Author: dingyongkang <837816638@qq.com> +Date: Wed Feb 19 19:33:48 2020 +0800 + + 工单部分 + +commit 8a3afcbf00835d67725ea9464b9abac16eb2a89c +Merge: 57415df2a 30ef541d4 +Author: sylor_huang@126.com +Date: Wed Feb 19 19:12:18 2020 +0800 + + Merge branch 'forge' of https://bdgit.educoder.net/Hjqreturn/educoder into forge + +commit 57415df2aa48aebc0b29a3d4725a06dcdb63d742 +Author: sylor_huang@126.com +Date: Wed Feb 19 19:11:50 2020 +0800 + + issue的问题修复及pull_request的问题修复 + +commit 30ef541d40a1c7063a20423e3b95c73da8e9bf8c +Merge: 21ce82e9c ded428147 +Author: caicai8 <1149225589@qq.com> +Date: Wed Feb 19 17:38:45 2020 +0800 + + Merge branch 'forge' of https://bdgit.educoder.net/Hjqreturn/educoder into forge + +commit 21ce82e9c15724fc3b10c02ab3d0b5ed6670e86e +Author: caicai8 <1149225589@qq.com> +Date: Wed Feb 19 17:38:41 2020 +0800 + + 动态列表 + +commit ded4281470613992a416be8b383e863136e2cd81 +Author: sylor_huang@126.com +Date: Wed Feb 19 17:30:53 2020 +0800 + + 修改csv的乱码问题 + +commit a5a5add7d662377ebd0a8b3796b761f043232f4a +Merge: d4132a802 b435933a5 +Author: sylor_huang@126.com +Date: Wed Feb 19 15:12:01 2020 +0800 + + Merge branch 'forge' of https://bdgit.educoder.net/Hjqreturn/educoder into forge + +commit d4132a802e5afa2d5f79d4540827348b8395edb1 +Author: sylor_huang@126.com +Date: Wed Feb 19 15:10:56 2020 +0800 + + 分支切换添加loading + +commit b435933a54709da3ab4e167d1657348cea359de1 +Author: caicai8 <1149225589@qq.com> +Date: Wed Feb 19 15:04:46 2020 +0800 + + 动态-分页 + +commit b10091130e3bea8ff989ccd018505d19eb4dec29 +Merge: 92fea708c 0d060af2f +Author: caicai8 <1149225589@qq.com> +Date: Wed Feb 19 11:59:48 2020 +0800 + + Merge branch 'forge' of https://bdgit.educoder.net/Hjqreturn/educoder into forge + +commit 92fea708c48a27cd2fddb7ebb096dddc248129ca +Author: caicai8 <1149225589@qq.com> +Date: Wed Feb 19 11:59:45 2020 +0800 + + 文件 + +commit a93837a062dacec33a277d50f504de9bf037f687 +Author: caicai8 <1149225589@qq.com> +Date: Wed Feb 19 11:59:35 2020 +0800 + + 动态 + +commit 0d060af2f926dc92482a76346abfc94d09cd32d1 +Author: sylor_huang@126.com +Date: Tue Feb 18 18:43:56 2020 +0800 + + 前端bug修复和后端问题 + +commit 42e8a78477525c32d98d2299c3826f0dc4f6e38f +Merge: 64d920039 d9e89e6fb +Author: sylor_huang@126.com +Date: Tue Feb 18 16:16:49 2020 +0800 + + Merge branch 'forge' of https://bdgit.educoder.net/Hjqreturn/educoder into forge + +commit 64d920039a51196fff20b813938969e3c326e1c6 +Author: sylor_huang@126.com +Date: Tue Feb 18 16:16:24 2020 +0800 + + 一些bug修改 + +commit d9e89e6fb7934d9e215dc1e7c7d1f61093154b9a +Author: caicai8 <1149225589@qq.com> +Date: Tue Feb 18 16:12:18 2020 +0800 + + branch + +commit 43e9c90439890056c94a2265296bda2626aef447 +Author: caicai8 <1149225589@qq.com> +Date: Tue Feb 18 14:56:09 2020 +0800 + + 从分支页面跳转到分支提交页面 + +commit 2e42ad82cafa3c3a96813e517253d825dddf8e27 +Merge: 9a2dd0456 d3a9af7bb +Author: caicai8 <1149225589@qq.com> +Date: Tue Feb 18 13:34:48 2020 +0800 + + Merge branch 'forge' of https://bdgit.educoder.net/Hjqreturn/educoder into forge + +commit 9a2dd0456eb2e25490d697ad539ac0ccf7a047cf +Author: caicai8 <1149225589@qq.com> +Date: Tue Feb 18 13:34:43 2020 +0800 + + package + +commit d3a9af7bb3b4e0600f5bb7a26a349fe87eb49bc5 +Author: sylor_huang@126.com +Date: Tue Feb 18 10:54:38 2020 +0800 + + 前端样式修改 + +commit 5feb1f6e53b325822d305bbfcd4a6c644d9039dd +Author: caicai8 <1149225589@qq.com> +Date: Mon Feb 17 16:38:53 2020 +0800 + + clone_url + +commit 2eefb0ed381211ec250470202e686c2465807c7d +Author: sylor_huang@126.com +Date: Fri Feb 14 19:03:58 2020 +0800 + + 前端部分修改 + +commit 9990e3b5c50aa0c9a2c1e9f7442fa85208fa6211 +Merge: 0f97b2edd 6a41049e1 +Author: sylor_huang@126.com +Date: Fri Feb 14 14:46:52 2020 +0800 + + Merge branch 'forge' of https://bdgit.educoder.net/Hjqreturn/educoder into forge + +commit 0f97b2eddae2551be9c155adf318d800f5dd8e58 +Author: sylor_huang@126.com +Date: Fri Feb 14 14:46:17 2020 +0800 + + 前端样式修复 + +commit 6a41049e1de36eda58d728e7eba2285db2ac68fa +Author: Jasder <2053003901@@qq.com> +Date: Thu Feb 13 22:48:40 2020 +0800 + + ADD some count + +commit 36860fe5c2995331e87d6437c48cacd9155f3a16 +Merge: 1f2a0c0e6 00cb5c061 +Author: Jasder <2053003901@@qq.com> +Date: Thu Feb 13 22:44:17 2020 +0800 + + Merge branch 'forge' of http://bdgit.educoder.net/Hjqreturn/educoder into forge + +commit 00cb5c0610f63eae6d4139a9cf1c536f5e048833 +Author: sylor_huang@126.com +Date: Thu Feb 13 18:53:01 2020 +0800 + + 修改entry的错误 + +commit 1f2a0c0e61ad320d6c54de0721c46c02677c43b6 +Merge: a72b4f682 5a8fcf994 +Author: Jasder <2053003901@@qq.com> +Date: Thu Feb 13 18:51:14 2020 +0800 + + fic bug + +commit 5a8fcf994fcce0829e620cb5dd507de93606ee33 +Author: sylor_huang@126.com +Date: Thu Feb 13 18:09:10 2020 +0800 + + 修改 + +commit a72b4f68276babbf6c65ea877266af4251ba3410 +Merge: 9a2ff48de 36ccf249b +Author: Jasder <2053003901@@qq.com> +Date: Thu Feb 13 18:01:51 2020 +0800 + + FIC merge bug + +commit 9a2ff48de8c3a3f9f9958489bbe235b1f72319f7 +Author: Jasder <2053003901@@qq.com> +Date: Thu Feb 13 17:59:20 2020 +0800 + + FIX 404 page bug + +commit 36ccf249bf68542b4b9324d89c478789db12887b +Author: sylor_huang@126.com +Date: Thu Feb 13 17:53:16 2020 +0800 + + 注释current_laboratory + +commit adc7da1a3c541ed263daf8793bdb9af1e736900c +Author: sylor_huang@126.com +Date: Thu Feb 13 17:47:49 2020 +0800 + + 修改appconfig.js + +commit 6e6649aa096921a994bed0119eafc288d5ac5a29 +Author: sylor_huang@126.com +Date: Thu Feb 13 17:40:39 2020 +0800 + + 注释get_user_info里的current_laboratory + +commit a447a0d10229275ad6c51903762c2175b2afb743 +Author: sylor_huang@126.com +Date: Thu Feb 13 17:23:57 2020 +0800 + + change current_laboratory is nill error + +commit 567d20caea58782d1e99058cb76fb1e1307f7b09 +Merge: d66c0c2f3 0408f89cb +Author: sylor_huang@126.com +Date: Thu Feb 13 17:15:29 2020 +0800 + + Merge branch 'forge' of https://bdgit.educoder.net/Hjqreturn/educoder into forge + +commit d66c0c2f31b717ed3fed6bcff74318a682768635 +Author: sylor_huang@126.com +Date: Thu Feb 13 17:14:59 2020 +0800 + + 修改settings/show.json + +commit 0408f89cb37041a92deea969619873849198d99c +Merge: ef807c8ec 8933a1a91 +Author: Jasder <2053003901@@qq.com> +Date: Thu Feb 13 17:12:02 2020 +0800 + + Merge branch 'forge' of http://bdgit.educoder.net/Hjqreturn/educoder into forge + +commit ef807c8ecfc5fd5f1129d6ab4d2f1a6c16333dbd +Author: Jasder <2053003901@@qq.com> +Date: Thu Feb 13 17:10:23 2020 +0800 + + ADD 工单,pull_requests 数据统计 + +commit 8933a1a916baa4805ac45c1970542d25a447f703 +Author: sylor_huang@126.com +Date: Thu Feb 13 16:45:27 2020 +0800 + + build + +commit 05266a3c3ff2e03573337965c4580d7cc771e4fb +Author: sylor_huang@126.com +Date: Thu Feb 13 16:33:23 2020 +0800 + + issue标签和里程碑 + +commit e2550b9d741835e1e59eed25a17e004d62dd0919 +Author: dingyongkang <837816638@qq.com> +Date: T \ No newline at end of file diff --git a/lib/tasks/school_statistic.rake b/lib/tasks/school_statistic.rake deleted file mode 100644 index 3d017ad17..000000000 --- a/lib/tasks/school_statistic.rake +++ /dev/null @@ -1,8 +0,0 @@ -#coding=utf-8 - -desc "同步高校数据" -namespace :school_statistic do - task sync_records: :environment do - - end -end diff --git a/lib/tasks/static_all.rake b/lib/tasks/static_all.rake index 4c878841e..4db09001e 100644 --- a/lib/tasks/static_all.rake +++ b/lib/tasks/static_all.rake @@ -2,15 +2,24 @@ desc "统计每个学校使用数据" namespace :static_all do task :repo => :environment do - School.find_each(batch_size: 100) do |school| - User.joins(:user_extension).where(school_id: school.id) - - - report = StaAll.find_or_initialize_by(school_id: school.id) - - report.shixun_evaluate_count = evaluate_count - - report.save + school_alls = School.includes(courses: [:homework_commons, :attachments, :course_videos], user_extensions: :user).all + proc_num = ENV['processes'].blank? ? 5 : ENV['processes'].to_i + school_alls.find_in_batches(batch_size: 50) do |schools| + Parallel.each(schools, in_processes: proc_num) do |school| + puts("school_id: #{school.id}") + data = Schools::SchoolStatisticService.new(school) + sta_all = StaAll.find_or_initialize_by(school_id: school.id) + attrs = {tea_count: data.teacher_count, stu_count: data.student_count, courses_count: data.courses_count, + active_users_count: data.acitve_user_3_months_count, curr_courses_count: data.curr_courses_count, + homw_shixuns_count: data.homw_shixuns_count, homw_other_count: data.homw_other_count, + sources_count: data.sources_count, videos_count: data.videos_count, shixuns_count: data.shixuns_count, + myshixuns_count: data.myshixuns_count, mys_passed_count: data.pass_myshixun_count, + games_count: data.games_count, games_passed_count: data.pass_games_count, build_count: data.evaluate_count} + puts "sta_all: #{attrs}" + sta_all.assign_attributes(attrs) + sta_all.save! + end end + end end \ No newline at end of file diff --git a/public/react/scripts/build.js b/public/react/scripts/build.js index e1ba02ef3..f8cec6702 100644 --- a/public/react/scripts/build.js +++ b/public/react/scripts/build.js @@ -221,12 +221,12 @@ function generateNewIndexJsp() { // var result = data .replace(jsMinAllRegex, code) + .replace(flvMinAllRegex,'') // .replace('/js/js_min_all.js', `${cdnHost}/react/build/js/js_min_all.js?v=${newVersion}`) // .replace('/js/js_min_all_2.js', `${cdnHost}/react/build/js/js_min_all_2.js?v=${newVersion}`) // ${cdnHost} 加了cdn后,这个文件里的字体文件加载会有跨域的报错 ../fonts/fontawesome-webfont.eot // TODO tpi 评测结果关闭也使用了fontawesome - .replace(flvMinAllRegex,``) .replace('/css/css_min_all.css', `${cdnHost}/react/build/css/css_min_all.css?v=${newVersion}`) .replace('/css/iconfont.css', `${cdnHost}/react/build/css/iconfont.css?v=${newVersion}`) .replace(/\/js\/create_kindeditor.js/g, `${cdnHost}/react/build/js/create_kindeditor.js?v=${newVersion}`) diff --git a/public/react/src/App.js b/public/react/src/App.js index 288afcb10..1bb859b5e 100644 --- a/public/react/src/App.js +++ b/public/react/src/App.js @@ -1,8 +1,7 @@ -import React, {Component} from 'react'; +import React, { Component } from 'react'; import './public-path'; -import logo from './logo.svg'; import './App.css'; -import {ConfigProvider} from 'antd' +import { ConfigProvider } from 'antd' import zhCN from 'antd/lib/locale-provider/zh_CN'; import { BrowserRouter as Router, @@ -21,9 +20,7 @@ import Trialapplicationreview from './modules/user/Trialapplicationreview'; import Addcourses from "./modules/courses/coursesPublic/Addcourses"; import AccountProfile from "./modules/user/AccountProfile"; import Accountnewprofile from './modules/user/Accountnewprofile'; -import Trialapplication from './modules/login/Trialapplication'; import Certifiedprofessional from './modules/modals/Certifiedprofessional'; -import NotFoundPage from './NotFoundPage' import Loading from './Loading' @@ -32,18 +29,18 @@ import Loadable from 'react-loadable'; import moment from 'moment' -import {MuiThemeProvider, createMuiTheme} from 'material-ui/styles'; +import { MuiThemeProvider, createMuiTheme } from 'material-ui/styles'; // import './AppConfig' import history from './history'; -import {SnackbarHOC} from 'educoder' -import {initAxiosInterceptors} from './AppConfig' +import { SnackbarHOC } from 'educoder' +import { initAxiosInterceptors } from './AppConfig' import { Provider } from 'react-redux'; import configureStore from './redux/stores/configureStore'; // !!!tpi需要这个来加载css -import {TPMIndexHOC} from './modules/tpm/TPMIndexHOC'; +import { TPMIndexHOC } from './modules/tpm/TPMIndexHOC'; const store = configureStore(); const theme = createMuiTheme({ @@ -52,7 +49,7 @@ const theme = createMuiTheme({ main: '#4CACFF', contrastText: 'rgba(255, 255, 255, 0.87)' }, - secondary: {main: '#4CACFF'}, // #11cb5f This is just green.A700 as hex. + secondary: { main: '#4CACFF' }, // #11cb5f This is just green.A700 as hex. }, }); // @@ -68,23 +65,23 @@ const EducoderLogin = Loadable({ //微信登录 -const Otherlogin=Loadable({ +const Otherlogin = Loadable({ loader: () => import('./modules/login/Otherlogin'), loading: Loading, }) //微信登录 -const Loginqq=Loadable({ +const Loginqq = Loadable({ loader: () => import('./modules/login/Loginqq'), loading: Loading, }) -const Otherloginstart=Loadable({ +const Otherloginstart = Loadable({ loader: () => import('./modules/login/Otherloginstart'), loading: Loading, }) -const Otherloginsqq=Loadable({ +const Otherloginsqq = Loadable({ loader: () => import('./modules/login/Otherloginqq'), loading: Loading, }) @@ -103,24 +100,6 @@ const CommentComponent = Loadable({ loading: Loading, }) -// const TestMaterialDesignComponent = Loadable({ -// loader: () => import('./modules/test/md/TestMaterialDesign'), -// loading: Loading, -// }) -// const TestCodeMirrorComponent = Loadable({ -// loader: () => import('./modules/test/codemirror/TestCodeMirror'), -// loading: Loading, -// }) - -// const TestComponent = Loadable({ -// loader: () => import('./modules/test/TestRC'), -// loading: Loading, -// }) -// const TestUrlQueryComponent = Loadable({ -// loader: () => import('./modules/test/urlquery/TestUrlQuery'), -// loading: Loading, -// }) - const TPMIndexComponent = Loadable({ loader: () => import('./modules/tpm/TPMIndex'), loading: Loading, @@ -254,7 +233,7 @@ const BanksIndex = Loadable({ // 教学案例 -const MoopCases = Loadable({ +const MoopCases = Loadable({ loader: () => import('./modules/moop_cases/index'), loading: Loading, }) @@ -272,23 +251,23 @@ const Interestpage = Loadable({ // }) //竞赛 -const NewCompetitions=Loadable({ +const NewCompetitions = Loadable({ loader: () => import('./modules/competitions/Competitions'), loading: Loading, }) //黑客松定制竞赛 -const Osshackathon=Loadable({ +const Osshackathon = Loadable({ loader: () => import('./modules/osshackathon/Osshackathon'), loading: Loading, }) -const Messagerouting= Loadable({ +const Messagerouting = Loadable({ loader: () => import('./modules/message/js/Messagerouting'), loading: Loading, }) -const Topicbank= Loadable({ +const Topicbank = Loadable({ loader: () => import('./modules/topic_bank/Topic_bank'), loading: Loading, }) @@ -321,28 +300,28 @@ const Questionitem_banks = Loadable({ }) //试卷库 -const Testpaperlibrary= Loadable({ +const Testpaperlibrary = Loadable({ loader: () => import('./modules/testpaper/Testpaperlibrary'), loading: Loading }) //试卷编辑 -const Paperlibraryeditid= Loadable({ +const Paperlibraryeditid = Loadable({ loader: () => import('./modules/testpaper/Paperlibraryeditid'), loading: Loading }) //试卷查看 -const Paperlibraryseeid= Loadable({ +const Paperlibraryseeid = Loadable({ loader: () => import('./modules/testpaper/Paperlibraryseeid'), loading: Loading }) //人工组卷 -const Paperreview= Loadable({ +const Paperreview = Loadable({ loader: () => import('./modules/question/Paperreview'), loading: Loading }) //智能组卷 -const Integeneration= Loadable({ +const Integeneration = Loadable({ loader: () => import('./modules/testpaper/Intecomponents'), loading: Loading }) @@ -387,44 +366,44 @@ class App extends Component { constructor(props) { super(props) this.state = { - Addcoursestype:false, - Addcoursestypes:false, - mydisplay:false, - occupation:0, + Addcoursestype: false, + Addcoursestypes: false, + mydisplay: false, + occupation: 0, mygetHelmetapi: null, } } - HideAddcoursestypess=(i)=>{ + HideAddcoursestypess = (i) => { console.log("调用了"); this.setState({ - Addcoursestype:false, - Addcoursestypes:false, - mydisplay:true, - occupation:i, + Addcoursestype: false, + Addcoursestypes: false, + mydisplay: true, + occupation: i, }) }; - hideAddcoursestypes=()=>{ + hideAddcoursestypes = () => { this.setState({ - Addcoursestypes:false + Addcoursestypes: false }) }; - ModalCancelsy=()=>{ + ModalCancelsy = () => { this.setState({ - mydisplay:false, + mydisplay: false, }) window.location.href = "/"; }; - ModalshowCancelsy=()=>{ + ModalshowCancelsy = () => { this.setState({ - mydisplay:true, + mydisplay: true, }) }; disableVideoContextMenu = () => { - window.$( "body" ).on( "mousedown", "video", function(event) { - if(event.which === 3) { - window.$('video').bind('contextmenu',function () { return false; }); + window.$("body").on("mousedown", "video", function (event) { + if (event.which === 3) { + window.$('video').bind('contextmenu', function () { return false; }); } else { window.$('video').unbind('contextmenu'); } @@ -442,7 +421,7 @@ class App extends Component { }); initAxiosInterceptors(this.props); - this.getAppdata(); + this.getAppdata(); // // axios.interceptors.response.use((response) => { // // console.log("response"+response); @@ -464,9 +443,9 @@ class App extends Component { }); } //修改登录方法 - Modifyloginvalue=()=>{ + Modifyloginvalue = () => { this.setState({ - isRender:false, + isRender: false, }) }; @@ -500,20 +479,20 @@ class App extends Component { } document.head.appendChild(link); } - //获取当前定制信息 - getAppdata=()=>{ + //获取当前定制信息 + getAppdata = () => { let url = "/setting.json"; axios.get(url).then((response) => { // console.log("app.js开始请求/setting.json"); // console.log("获取当前定制信息"); - if(response){ - if(response.data){ + if (response) { + if (response.data) { this.setState({ - mygetHelmetapi:response.data.setting + mygetHelmetapi: response.data.setting }); //存储配置到游览器 - localStorage.setItem('chromesetting',JSON.stringify(response.data.setting)); - localStorage.setItem('chromesettingresponse',JSON.stringify(response)); + localStorage.setItem('chromesetting', JSON.stringify(response.data.setting)); + localStorage.setItem('chromesettingresponse', JSON.stringify(response)); try { if (response.data.setting.tab_logo_url) { this.gettablogourldata(response); @@ -543,57 +522,57 @@ class App extends Component { }; render() { - let{mygetHelmetapi}=this.state; + let { mygetHelmetapi } = this.state; // console.log("appappapp"); // console.log(mygetHelmetapi); return ( - - this.Modifyloginvalue()}> + + this.Modifyloginvalue()}> - this.HideAddcoursestypess(i)}/> - - + this.HideAddcoursestypess(i)} /> + + {/*题库*/} { + render={ + (props) => { - return () - } - }> + return () + } + }> {/*题库*/} { + render={ + (props) => { - return () - } - }> + return () + } + }> {/*/!*众包创新*!/*/} {/**/} {/*竞赛*/} { + render={ + (props) => { - return () - } - }> + return () + } + }> {/*黑客松定制竞赛*/} { - return( + (props) => { + return ( ) } @@ -601,17 +580,17 @@ class App extends Component { /> {/*认证*/} - + {/*403*/} - + - + {/*404*/} - + - + ) } - }> + }> { return () } - }> + }> {/* ()*/} - {/*}*/} + {/*path="/personalcompetit"*/} + {/*render={*/} + {/*(props) => ()*/} + {/*}*/} {/*/>*/} () - }/> + render={ + (props) => () + } /> {/* jupyter */} { - return () + return () } } /> - + {/**/} {/**/} () - } + render={ + (props) => () + } > - {/*列表页 实训项目列表*/} - {/**/} - - () - } + render={ + (props) => () + } > - - - - - {/*实训课程(原实训路径)*/} - () - } + render={ + (props) => () + } > - {/*课堂*/} {/* */} {/* 教学案例 */} - () - }/> + () + } /> () + (props) => () } > - + {/**/} {/**/} {/**/} {/**/} {/**/} {/* ()*/} - {/*}*/} + {/*path="/registration"*/} + {/*render={*/} + {/*(props) => ()*/} + {/*}*/} {/*/>*/} () - } + render={ + (props) => () + } > () - }/> + render={ + (props) => () + } /> () - }/> + render={ + (props) => () + } /> () - } + render={ + (props) => () + } /> () } /> () - }/> + render={ + (props) => () + } /> () - }/> - {/* ()*/} - {/* }/>*/} - - {/* ()*/} - {/* }/>*/} + render={ + (props) => () + } /> + () + } /> + + () + } /> () - } /> - {/* ()*/} - {/* } />*/} - - {/* ()*/} - {/* } />*/} - {/* ()*/} - {/* } />*/} - {/* ()*/} - {/* }/>*/} + render={ + (props) => () + } /> + () + } /> + + () + } /> + () + } /> + () + } /> () - }/> + render={ + (props) => () + } /> () - }/> - - {/* ()*/} - {/* }/>*/} - - + render={ + (props) => () + } /> + () + } /> {/*()*/} {/* }*/} {/*/>*/} - () - } + // component={ShixunsHome} + render={ + (props) => () + } /> - + @@ -976,4 +940,4 @@ moment.defineLocale('zh-cn', { doy: 4 // The week that contains Jan 4th is the first week of the year. } }); -export default SnackbarHOC()(App) ; +export default SnackbarHOC()(App); diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index 9f37e7ead..f5510a039 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -258,16 +258,10 @@ export function initAxiosInterceptors(props) { } // // console.log(config); - if (config.method === "post") { - if (requestMap[config.url] === true) { // 避免重复的请求 导致页面f5刷新 也会被阻止 显示这个方法会影响到定制信息 - // console.log(config); - // console.log(JSON.parse(config)); - // console.log(config.url); - // console.log("被阻止了是重复请求================================="); + if (requestMap[config.url] === true) { return false; } - } - // 非file_update请求 + // // 非file_update请求 if (config.url.indexOf('update_file') === -1) { requestMap[config.url] = true; diff --git a/public/react/src/common/quillForEditor/font.css b/public/react/src/common/quillForEditor/font.css new file mode 100644 index 000000000..08e78a5a2 --- /dev/null +++ b/public/react/src/common/quillForEditor/font.css @@ -0,0 +1,66 @@ +@charset "utf-8"; +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=SimSun]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=SimSun]::before { + content: "宋体"; + font-family:SimSun !important; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=SimHei]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=SimHei]::before { + content: "黑体"; + font-family:SimHei !important; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=Microsoft-YaHei]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=Microsoft-YaHei]::before { + content: "微软雅黑"; + font-family:Microsoft YaHei !important; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=KaiTi]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=KaiTi]::before { + content: "楷体"; + font-family:KaiTi !important; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=FangSong]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=FangSong]::before { + content: "仿宋"; + font-family:FangSong !important; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=Arial]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=Arial]::before { + content: "Arial"; + font-family:Arial !important; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=Times-New-Roman]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=Times-New-Roman]::before { + content: "Times New Roman"; + font-family:Times New Roman !important; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=sans-serif]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=sans-serif]::before { + content: "sans-serif"; + font-family:sans-serif !important; +} + +.ql-font-SimSun { + font-family:SimSun !important; +} +.ql-font-SimHei { + font-family:SimHei !important; +} +.ql-font-Microsoft-YaHei { + font-family:Microsoft YaHei !important; +} +.ql-font-KaiTi { + font-family:KaiTi !important; +} +.ql-font-FangSong { + font-family:FangSong !important; +} +.ql-font-Arial { + font-family:Arial !important; +} +.ql-font-Times-New-Roman { + font-family:Times New Roman !important; +} +.ql-font-sans-serif { + font-family:sans-serif !important; +} diff --git a/public/react/src/common/quillForEditor/index.js b/public/react/src/common/quillForEditor/index.js index 89a4f6224..ba37059ba 100644 --- a/public/react/src/common/quillForEditor/index.js +++ b/public/react/src/common/quillForEditor/index.js @@ -11,6 +11,7 @@ import 'quill/dist/quill.core.css'; // 核心样式 import 'quill/dist/quill.snow.css'; // 有工具栏 import 'quill/dist/quill.bubble.css'; // 无工具栏 import 'katex/dist/katex.min.css'; // katex 表达式样式 +import './font.css' import React, { useState, useRef, useEffect } from 'react'; import Quill from 'quill'; import katex from 'katex'; @@ -19,12 +20,12 @@ import { fetchUploadImage } from '../../services/ojService.js'; import { getImageUrl } from 'educoder' import ImageBlot from './ImageBlot'; import FillBlot from './FillBlot'; -const Size = Quill.import('attributors/style/size'); -const Font = Quill.import('formats/font'); +var Size = Quill.import('attributors/style/size'); // const Color = Quill.import('attributes/style/color'); Size.whitelist = ['14px', '16px', '18px', '20px', false]; -Font.whitelist = ['Microsoft-YaHei','SimSun', 'SimHei','KaiTi','FangSong','Arial','Times-New-Roman','sans-serif']; - +var fonts = ['Microsoft-YaHei','SimSun', 'SimHei','KaiTi','FangSong']; +var Font = Quill.import('formats/font'); +Font.whitelist = fonts; //将字体加入到白名单 window.Quill = Quill; window.katex = katex; Quill.register(ImageBlot); @@ -59,7 +60,7 @@ function QuillForEditor ({ {align: []}, {list: 'ordered'}, {list: 'bullet'}, // 列表 {script: 'sub'}, {script: 'super'}, { 'color': [] }, { 'background': [] }, - { 'font': ['Microsoft-YaHei','SimSun', 'SimHei','KaiTi','FangSong','Arial','Times-New-Roman','sans-serif']}, + { 'font': []}, {header: [1,2,3,4,5,false]}, 'blockquote', 'code-block', 'link', 'image', 'video', diff --git a/public/react/src/common/quillForEditor/quill.core.css b/public/react/src/common/quillForEditor/quill.core.css new file mode 100644 index 000000000..516e388b6 --- /dev/null +++ b/public/react/src/common/quillForEditor/quill.core.css @@ -0,0 +1,18 @@ +.ql-editor .ql-font-Microsoft-YaHei { + font-family: "Microsoft YaHei"; +} +.ql-editor .ql-font-SimSun { + font-family: "SimSun"; +} +.ql-editor .ql-font-SimHei { + font-family: "SimHei"; +} +.ql-editor .ql-font-KaiTi { + font-family: "KaiTi"; +} +.ql-editor .ql-font-Arial { + font-family: "Arial"; +} +.ql-editor .Times-New-Roman { + font-family: "Times New Roman"; +} diff --git a/public/react/src/common/quillForEditor/quill.snow.css b/public/react/src/common/quillForEditor/quill.snow.css new file mode 100644 index 000000000..962b40f99 --- /dev/null +++ b/public/react/src/common/quillForEditor/quill.snow.css @@ -0,0 +1,28 @@ +.ql-snow .ql-picker.ql-font .ql-picker-label::before, +.ql-snow .ql-picker.ql-font .ql-picker-item::before { + content: '微软雅黑'; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=Microsoft-YaHei]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=Microsoft-YaHei]::before { + content: "微软雅黑"; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=SimSun]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=SimSun]::before { + content: "宋体"; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=SimHei]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=SimHei]::before { + content: "黑体"; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=KaiTi]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=KaiTi]::before { + content: "楷体"; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=Arial]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=Arial]::before { + content: "Arial"; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=Times-New-Roman]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=Times-New-Roman]::before { + content: "Times New Roman"; +} diff --git a/public/react/src/modal/GotoQQgroup.js b/public/react/src/modal/GotoQQgroup.js index 0ac34da65..bab39b08f 100644 --- a/public/react/src/modal/GotoQQgroup.js +++ b/public/react/src/modal/GotoQQgroup.js @@ -1,31 +1,25 @@ import React, { Component } from 'react'; -import {getImageUrl} from 'educoder'; -import { Modal} from 'antd'; -import axios from 'axios'; +import { getImageUrl } from 'educoder'; +import { Modal } from 'antd'; import '../modules/user/account/common.css'; import './gotoqqgroup.css' class GotoQQgroup extends Component { constructor(props) { super(props); - this.state={ - - } } - modalCancel=()=>{ + modalCancel = () => { try { this.props.setgoshowqqgtounp(false); - }catch (e) { - + } catch (e) { } } - setDownload=()=>{ - //立即联系 + setDownload = () => { try { this.props.setgoshowqqgtounp(false); - }catch (e) { + } catch (e) { } } @@ -33,7 +27,7 @@ class GotoQQgroup extends Component { render() { - return( + return (

您可以在QQ服务群向管理员申请,获得继续操作的权限

- +

群号:612934990

diff --git a/public/react/src/modules/courses/boards/index.js b/public/react/src/modules/courses/boards/index.js index ea49e862b..9c18313fe 100644 --- a/public/react/src/modules/courses/boards/index.js +++ b/public/react/src/modules/courses/boards/index.js @@ -98,12 +98,12 @@ class Boards extends Component{ this.fetchBoards() this.fetchAll() - on('updateNavSuccess', this.updateNavSuccess) + // on('updateNavSuccess', this.updateNavSuccess) } - componentWillUnmount() { - off('updateNavSuccess', this.updateNavSuccess) - } + // componentWillUnmount() { + // off('updateNavSuccess', this.updateNavSuccess) + // } updateNavSuccess = () => { this.fetchBoards() if (this.props.match.params.boardId == this.state.boardid) { @@ -112,7 +112,7 @@ class Boards extends Component{ } componentDidUpdate = (prevProps) => { - if ( prevProps.match.params.boardId != this.props.match.params.boardId ) { + if ( prevProps.match.params.boardId !== this.props.match.params.boardId ) { this.setState({ isSpin:true }) diff --git a/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js b/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js index 80c250134..999ae4e15 100644 --- a/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js +++ b/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js @@ -499,7 +499,6 @@ class Coursesleftnav extends Component{ } cannerNavmoda=()=>{ - this.setState({ Navmodalnametype:false, NavmodalValuetype:false, @@ -525,6 +524,7 @@ class Coursesleftnav extends Component{ } saveNavmodapost=(url,value,positiontype,coursesId)=>{ + axios.post(url, {name:value}).then((result)=>{ if(result!=undefined){ @@ -539,13 +539,13 @@ class Coursesleftnav extends Component{ if(positiontype==="files"){ this.updasaveNavmoda() trigger('updateNavSuccess') - window.location.href=`/courses/${coursesId}/file/${result.data.category_id}`; + this.props.history.push(`/courses/${coursesId}/file/${result.data.category_id}`); } if(positiontype==="boards"){ this.updasaveNavmoda() trigger('updateNavSuccess') - window.location.href=`/courses/${coursesId}/boards/${result.data.category_id}`; + this.props.history.push(`/courses/${coursesId}/boards/${result.data.category_id}`); } if(positiontype!="course_groups"){ @@ -585,7 +585,6 @@ class Coursesleftnav extends Component{ } saveNavmoda=()=>{ - debugger; let {Navmodaltypename,setnavid,NavmodalValue}=this.state; let id =setnavid; @@ -950,17 +949,15 @@ class Coursesleftnav extends Component{ {/* ""*/} {/*}*/} - { - Navmodalnametype===true?:"" - } + { @@ -313,8 +313,8 @@ class CoursesNew extends Component { end_date: datatime===undefined?"":datatime, is_public: is_public === true || is_public === 1 ? 1 : 0, course_module_types: values.checkboxgroup, - authentication: this.state.Realnamecertification, - professional_certification: this.state.Professionalcertification, + // authentication: this.state.Realnamecertification, + // professional_certification: this.state.Professionalcertification, school:values.school } ).then((response) => { @@ -953,7 +953,7 @@ class CoursesNew extends Component { )} -
+ {/*
-
+
*/}
{ - const { + const { publishLoading, handlePublish, // testCases = [], @@ -41,7 +41,7 @@ const NewOrEditTask = (props) => { courseQuestions // updateTestAndValidate, } = props; - + // 表单提交 const handleSubmitForm = () => { // 改变loading状态 @@ -53,7 +53,7 @@ const NewOrEditTask = (props) => { props.handleFormSubmit(props); // 提交表单 } }; - + useEffect(() => { // 获取用户信息 getUserInfoForNew(); @@ -121,7 +121,7 @@ const NewOrEditTask = (props) => { // 清空描述信息 toStore('oj_description', ''); // props.history.push('/problems'); - props.history.push(`/question?${props.searchParams}`); + props.history.push(`/problemset?${props.searchParams}`); } // 发布 @@ -163,8 +163,8 @@ const NewOrEditTask = (props) => { onClick={handleClickCancel} style={{ background: '#666666', color: '#fff', border: 'none' }} >取消 - @@ -174,14 +174,14 @@ const NewOrEditTask = (props) => { // 发布/模拟挑战 const renderPubOrFight = () => { const pubButton = isPublish - ? () - : (); @@ -191,13 +191,13 @@ const NewOrEditTask = (props) => { ) : ( ); - + if (isPublish) { return ( {pubButton} - @@ -207,8 +207,8 @@ const NewOrEditTask = (props) => { } else { return ( - @@ -217,7 +217,7 @@ const NewOrEditTask = (props) => { ); } - + } // 渲染退出 @@ -296,7 +296,7 @@ const mapDispatchToProps = (dispatch) => ({ clearOJFormStore: () => dispatch(actions.clearOJFormStore()), // 按钮状态 changeSubmitLoadingStatus: (flag) => dispatch(actions.changeSubmitLoadingStatus(flag)), - // 发布按钮状态 + // 发布按钮状态 changePublishLoadingStatus: (flag) => dispatch(actions.changePublishLoadingStatus(flag)), // 测试用例及验证 updateTestAndValidate: (obj) => dispatch(actions.updateTestAndValidate(obj)), diff --git a/public/react/src/modules/developer/newOrEditTask/leftpane/editorTab/AddTestDemo.js b/public/react/src/modules/developer/newOrEditTask/leftpane/editorTab/AddTestDemo.js index a16f30c18..0e2203de0 100644 --- a/public/react/src/modules/developer/newOrEditTask/leftpane/editorTab/AddTestDemo.js +++ b/public/react/src/modules/developer/newOrEditTask/leftpane/editorTab/AddTestDemo.js @@ -1,7 +1,7 @@ /* * @Description: 添加测试用例 * @Author: tangjiang - * @Github: + * @Github: * @Date: 2019-11-21 09:19:38 * @LastEditors : tangjiang * @LastEditTime : 2019-12-27 10:37:41 @@ -19,14 +19,14 @@ const AddTestDemo = (props) => { const { // key, // onSubmitTest, - onDeleteTest, + onDeleteTest, testCase, testCaseValidate, isOpen } = props; // const [isEditor, setIsEditor] = useState(false); // 是否是编辑 - + // 删除操作 const handleDeletePanel = (e) => { // console.log('点击的删除按钮') @@ -63,7 +63,7 @@ const AddTestDemo = (props) => { const value = e.target.value; testCaseOutputChange(value, index); } - + // 右侧删除图标 const genExtra = () => ( { * 文本输入框可编辑的情况 * 1. 新增时 * 2. isAdd 为 false 且 isEditor 为true 时 - * @param {*} testCase + * @param {*} testCase */ // const isDisabled = (testCase) => { // return !testCase.isAdd && !isEditor; @@ -138,21 +138,19 @@ const AddTestDemo = (props) => { // defaultActiveKey: [isOpen ? '1' : ''] // }; // console.log(activePane); - + // 切换手风琴 const handleChangeCollapse = () => { const {index, updateOpenTestCaseIndex} = props; updateOpenTestCaseIndex(index); } - + return ( handleChangeCollapse()}>
输入} - validateStatus={testCaseValidate.input.validateStatus} - help={testCaseValidate.input.errMsg} colon={ false } >