diff --git a/app/controllers/concerns/git_helper.rb b/app/controllers/concerns/git_helper.rb
index c19c6fdd6..9242b87ac 100644
--- a/app/controllers/concerns/git_helper.rb
+++ b/app/controllers/concerns/git_helper.rb
@@ -23,7 +23,7 @@ module GitHelper
Rails.logger.info "encoding: #{cd['encoding']} confidence: #{cd['confidence']}"
# 字符编码问题,GB18030编码识别率不行
decode_content =
- if cd["encoding"] == 'GB18030' && cd['confidence'] == 1.0
+ if cd["encoding"] == 'GB18030' && cd['confidence'] > 0.8
content.encode('UTF-8', 'GBK', {:invalid => :replace, :undef => :replace, :replace => ' '})
else
content.force_encoding('UTF-8')
diff --git a/app/controllers/ecs/ec_graduation_requirements_controller.rb b/app/controllers/ecs/ec_graduation_requirements_controller.rb
index 95dafdb3c..0647a7914 100644
--- a/app/controllers/ecs/ec_graduation_requirements_controller.rb
+++ b/app/controllers/ecs/ec_graduation_requirements_controller.rb
@@ -15,19 +15,31 @@ class Ecs::EcGraduationRequirementsController < Ecs::BaseController
end
def create
- graduation_requirement = current_year.graduation_requirements.new
+ graduation_requirement = current_year.ec_graduation_requirements.new
@graduation_requirement = Ecs::SaveGraduationRequirementeService.call(graduation_requirement, create_params)
render 'show'
end
def update
- graduation_requirement = current_year.graduation_requirements.find(params[:id])
- @graduation_requirement = Ecs::SaveGraduationRequirementeService.call(graduation_requirement, update_params)
+ @graduation_requirement = Ecs::SaveGraduationRequirementeService.call(current_graduation_requirement, update_params)
render 'show'
end
+ def destroy
+ ActiveRecord::Base.transaction do
+ current_graduation_requirement.destroy!
+ current_year.ec_graduation_requirements.where('position > ?', current_graduation_requirement.position)
+ .update_all('position = position - 1')
+ end
+ render_ok
+ end
+
private
+ def current_graduation_requirement
+ @_current_graduation_requirement ||= current_year.ec_graduation_requirements.find(params[:id])
+ end
+
def create_params
params.permit(:position, :content, graduation_subitems: [:content])
end
diff --git a/app/controllers/exercise_questions_controller.rb b/app/controllers/exercise_questions_controller.rb
index 57116a9e5..bb28fff54 100644
--- a/app/controllers/exercise_questions_controller.rb
+++ b/app/controllers/exercise_questions_controller.rb
@@ -494,20 +494,88 @@ class ExerciseQuestionsController < ApplicationController
def adjust_score
ActiveRecord::Base.transaction do
begin
+ ex_all_scores = @exercise.exercise_questions.pluck(:question_score).sum
ex_obj_score = @exercise_current_user.objective_score #全部客观题得分
ex_subj_score = @exercise_current_user.subjective_score < 0.0 ? 0.0 : @exercise_current_user.subjective_score #全部主观题得分
ex_answers = @exercise_question.exercise_answers.search_answer_users("user_id",@user_id) #当前用户答案的得分
- if @exercise_question.question_type == Exercise::COMPLETION #当为填空题,更新问题的总分,
- ex_answer_old = ex_answers.score_reviewed.pluck(:score).sum #每一关的得分总和
- each_right_score = (@c_score / ex_answers.count.to_f) #调分后,平均每关的分数
- new_obj_score = ex_obj_score - ex_answer_old + @c_score
+ if @exercise_question.question_type == Exercise::MULTIPLE
+ if ex_answers.present? #学生有回答时 取学生的答题得分,否则0分
+ answer_choice_array = []
+ ex_answers.each do |a|
+ if a.try(:exercise_choice).try(:choice_position).present?
+ answer_choice_array.push(a&.exercise_choice&.choice_position) #学生答案的位置
+ end
+ end
+ user_answer_content = answer_choice_array.reject(&:blank?).sort
+ standard_answer = @exercise_question.exercise_standard_answers.pluck(:exercise_choice_id).sort
+ if standard_answer.size == 1 # 老数据需要判断学生答题是否正确, 正确取原题得分,否则是0分
+ standard_answer = standard_answer.first.to_s.split("").map(&:to_i).sort
+ if user_answer_content == standard_answer
+ ex_answer_old = @exercise_question.question_score
+ else
+ ex_answer_old = 0
+ end
+ else # 新多选题只需取第一条答题记录的得分
+ ex_answer_old = ex_answers.first.score > 0 ? ex_answers.first.score : 0
+ end
+ ex_answers.update_all(:score => @c_score) #所有的正确选项需重新更新
+ else
+ answer_option = {
+ :user_id => @user_id,
+ :exercise_question_id => @exercise_question.id,
+ :score => @c_score,
+ :answer_text => ""
+ }
+ ExerciseAnswer.create(answer_option)
+ ex_answer_old = 0
+ end
+ if ex_obj_score <= 0.0
+ new_obj_score = @c_score
+ else
+ new_obj_score = ex_obj_score - ex_answer_old + @c_score
+ end
+
total_scores = new_obj_score + ex_subj_score
+ if total_scores < 0.0
+ total_scores = 0.0
+ elsif total_scores > ex_all_scores
+ total_scores = ex_all_scores
+ end
+ ex_scores = {
+ :objective_score => new_obj_score,
+ :score => total_scores
+ }
+ @exercise_current_user.update_attributes(ex_scores)
+
+ elsif @exercise_question.question_type == Exercise::COMPLETION #当为填空题,更新问题的总分,
+
+ if ex_answers.exists?
+ ex_answer_old = ex_answers.score_reviewed.pluck(:score).sum #每一关的得分总和
+ each_right_score = (@c_score / ex_answers.count.to_f) #调分后,平均每关的分数
+ new_obj_score = ex_obj_score - ex_answer_old + @c_score
+ ex_answers.update_all(:score => each_right_score) #所有的正确选项需重新更新
+ else #如果学生未答,则创建新的答题记录
+ answer_option = {
+ :user_id => @user_id,
+ :exercise_question_id => @exercise_question.id,
+ :score => @c_score,
+ :answer_text => ""
+ }
+ ExerciseAnswer.create(answer_option)
+ new_obj_score = ex_obj_score + @c_score
+ end
+
+ total_scores = new_obj_score + ex_subj_score
+ if total_scores < 0.0
+ total_scores = 0.0
+ elsif total_scores > ex_all_scores
+ total_scores = ex_all_scores
+ end
ex_scores = {
:objective_score => new_obj_score,
:score => total_scores
}
@exercise_current_user.update_attributes(ex_scores)
- ex_answers.update_all(:score => each_right_score) #所有的正确选项需重新更新
elsif @exercise_question.question_type == Exercise::SUBJECTIVE #当为主观题时
if ex_answers.exists?
ex_answers_old_score = ex_answers.first.score > 0.0 ? ex_answers.first.score : 0.0 #原分数小于0,取0
@@ -524,6 +592,11 @@ class ExerciseQuestionsController < ApplicationController
new_sub_score = ex_subj_score + @c_score
end
total_scores = ex_obj_score + new_sub_score
+ if total_scores < 0.0
+ total_scores = 0.0
+ elsif total_scores > ex_all_scores
+ total_scores = ex_all_scores
+ end
ex_scores = {
:subjective_score => new_sub_score,
:score => total_scores
@@ -549,6 +622,11 @@ class ExerciseQuestionsController < ApplicationController
new_obj_score = @c_score
end
total_scores = new_obj_score + ex_subj_score
+ if total_scores < 0.0
+ total_scores = 0.0
+ elsif total_scores > ex_all_scores
+ total_scores = ex_all_scores
+ end
ex_scores = {
:objective_score => new_obj_score,
:score => total_scores
@@ -556,30 +634,33 @@ class ExerciseQuestionsController < ApplicationController
@exercise_current_user.update_attributes(ex_scores)
end
comments = params[:comment]
- question_comment = @exercise_question.exercise_answer_comments.first
+ question_comment = @exercise_question.exercise_answer_comments&.first
+
if question_comment.present?
comment_option = {
- :comment => comments.present? ? comments : question_comment.comment,
+ :comment => comments,
:score => @c_score,
- :exercise_answer_id => ex_answers.present? ? ex_answers.first.id : nil
+ :exercise_answer_id => ex_answers.present? ? ex_answers.first.id : nil,
+ :user_id => current_user.id
}
question_comment.update_attributes(comment_option)
@exercise_comments = question_comment
else
+ ex_answer_comment_id = @exercise_question.exercise_answers.find_by(user_id: @user_id).try(:id)
comment_option = {
:user_id => current_user.id,
:comment => comments,
:score => @c_score,
:exercise_question_id => @exercise_question.id,
:exercise_shixun_answer_id => @shixun_a_id.present? ? @shixun_a_id : nil,
- :exercise_answer_id => ex_answers.present? ? ex_answers.first.id : nil
+ :exercise_answer_id => ex_answer_comment_id
}
@exercise_comments = ExerciseAnswerComment.new(comment_option)
@exercise_comments.save
end
rescue Exception => e
uid_logger_error(e.message)
- tip_exception("没有权限")
+ tip_exception(e.message)
raise ActiveRecord::Rollback
end
end
@@ -703,8 +784,8 @@ class ExerciseQuestionsController < ApplicationController
normal_status(-1,"用户不存在!")
elsif @c_score.blank?
normal_status(-1,"分数不能为空!")
- elsif @exercise_question.question_type <= Exercise::JUDGMENT
- normal_status(-1,"选择题/判断题不能调分!")
+ elsif @exercise_question.question_type == Exercise::SINGLE || @exercise_question.question_type == Exercise::JUDGMENT
+ normal_status(-1,"单选题/判断题不能调分!")
elsif params[:comment].present? && params[:comment].length > 100
normal_status(-1,"评语不能超过100个字符!")
else
diff --git a/app/controllers/graduation_tasks_controller.rb b/app/controllers/graduation_tasks_controller.rb
index a159cff59..841b516bb 100644
--- a/app/controllers/graduation_tasks_controller.rb
+++ b/app/controllers/graduation_tasks_controller.rb
@@ -324,7 +324,7 @@ class GraduationTasksController < ApplicationController
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] > @course.end_date.end_of_day
+ @course.end_date.present? && params[:end_time] > strf_time(@course.end_date.end_of_day)
# ActiveRecord::Base.transaction do
begin
@@ -401,7 +401,7 @@ class GraduationTasksController < ApplicationController
tip_exception("截止时间不能早于当前时间") if params[:end_time] <= Time.now.strftime("%Y-%m-%d %H:%M:%S")
tip_exception("截止时间不能早于发布时间") if params[:publish_time] > params[:end_time]
tip_exception("截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if
- @course.end_date.present? && params[:end_time] > @course.end_date.end_of_day
+ @course.end_date.present? && params[:end_time] > strf_time(@course.end_date.end_of_day)
@task.publish_time = params[:publish_time]
@task.end_time = params[:end_time]
@@ -414,7 +414,7 @@ class GraduationTasksController < ApplicationController
tip_exception("截止时间不能为空") if params[:end_time].blank?
tip_exception("截止时间不能早于当前时间") if params[:end_time] <= Time.now.strftime("%Y-%m-%d %H:%M:%S")
tip_exception("截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if
- @course.end_date.present? && params[:end_time] > @course.end_date.end_of_day
+ @course.end_date.present? && params[:end_time] > strf_time(@course.end_date.end_of_day)
@task.end_time = params[:end_time]
end
@@ -426,7 +426,7 @@ class GraduationTasksController < ApplicationController
tip_exception("补交结束时间不能为空") if params[:late_time].blank?
tip_exception("补交结束时间不能早于截止时间") if params[:late_time] <= @task.end_time
tip_exception("补交结束时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if
- @course.end_date.present? && params[:late_time] > @course.end_date.end_of_day
+ @course.end_date.present? && params[:late_time] > strf_time(@course.end_date.end_of_day)
tip_exception("迟交扣分应为正整数") if params[:late_penalty] && params[:late_penalty].to_i < 0
@task.allow_late = true
diff --git a/app/controllers/myshixuns_controller.rb b/app/controllers/myshixuns_controller.rb
index fc5db713f..bf067b389 100644
--- a/app/controllers/myshixuns_controller.rb
+++ b/app/controllers/myshixuns_controller.rb
@@ -271,7 +271,11 @@ class MyshixunsController < ApplicationController
unless @hide_code || @myshixun.shixun&.vnc_evaluate
# 远程版本库文件内容
last_content = GitService.file_content(repo_path: @repo_path, path: path)["content"]
- content = params[:content]
+ content = if @myshixun.mirror_name.select {|a| a.include?("MachineLearning") || a.include?("Python")}.present? && params[:content].present?
+ params[:content].gsub(/\t/, ' ').gsub(/ /, ' ') # 这个不是空格,在windows机器上带来的问题
+ else
+ params[:content]
+ end
Rails.logger.info("###11222333####{content}")
Rails.logger.info("###222333####{last_content}")
diff --git a/app/controllers/question_banks_controller.rb b/app/controllers/question_banks_controller.rb
index b4e98e05f..60b9a807c 100644
--- a/app/controllers/question_banks_controller.rb
+++ b/app/controllers/question_banks_controller.rb
@@ -264,8 +264,9 @@ class QuestionBanksController < ApplicationController
# new_exercise.create_exercise_list
# exercise.update_column(:quotes, exercise.quotes+1)
# end
- new_exercise if new_exercise.save!
+ new_exercise.save!
exercise.update_column(:quotes, exercise.quotes+1)
+ new_exercise
end
end
@@ -292,8 +293,9 @@ class QuestionBanksController < ApplicationController
# new_poll.create_polls_list
# poll.update_column(:quotes, poll.quotes+1)
# end
- new_poll if new_poll.save!
+ new_poll.save!
poll.update_column(:quotes, poll.quotes+1)
+ new_poll
end
end
diff --git a/app/controllers/shixun_lists_controller.rb b/app/controllers/shixun_lists_controller.rb
new file mode 100644
index 000000000..e92e857ad
--- /dev/null
+++ b/app/controllers/shixun_lists_controller.rb
@@ -0,0 +1,10 @@
+class ShixunListsController < ApplicationController
+ def index
+ @results = ShixunSearchService.call(search_params)
+ end
+
+ private
+ def search_params
+ params.permit(:keyword, :type, :page, :limit, :order, :type, :status, :diff)
+ end
+end
\ No newline at end of file
diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb
index 490b9e970..8a120d6bd 100644
--- a/app/controllers/shixuns_controller.rb
+++ b/app/controllers/shixuns_controller.rb
@@ -1,6 +1,7 @@
class ShixunsController < ApplicationController
include ShixunsHelper
include ApplicationHelper
+ include ElasticsearchAble
before_action :require_login, :check_auth, except: [:download_file, :index, :menus, :show, :show_right, :ranking_list,
:discusses, :collaborators, :fork_list, :propaedeutics]
@@ -131,8 +132,16 @@ class ShixunsController < ApplicationController
offset = (page.to_i - 1) * (limit.to_i)
order = params[:order] || "desc"
## 搜索关键字创建者、实训名称、院校名称
- keyword = params[:search].blank? ? "*" : params[:search]
- @shixuns = Shixun.search keyword, where: {id: @shixuns.pluck(:id)}, order: {"myshixuns_count" => order}, limit: limit, offset: offset
+ keyword = params[:keyword].to_s.strip.presence || '*'
+
+ model_options = {
+ index_name: [Shixun],
+ model_includes: Shixun.searchable_includes
+ }
+ model_options.merge(where: { id: @shixuns.pluck(:id) }).merge(order: {"myshixuns_count" => order}).merge(limit: limit, offset: offset)
+ model_options.merge(default_options)
+ @shixuns = Searchkick.search(keyword, model_options)
+ # @shixuns = Shixun.search keyword, where: {id: @shixuns.pluck(:id)}, order: {"myshixuns_count" => order}, limit: limit, offset: offset
@total_count = @shixuns.total_count
end
diff --git a/app/helpers/exercises_helper.rb b/app/helpers/exercises_helper.rb
index 2c417ea74..98a580ecc 100644
--- a/app/helpers/exercises_helper.rb
+++ b/app/helpers/exercises_helper.rb
@@ -16,18 +16,26 @@ module ExercisesHelper
end
if q_type <= Exercise::JUDGMENT
- if answers_content.present? #学生有回答时
- answer_choice_array = []
- answers_content.each do |a|
- answer_choice_array.push(a.exercise_choice.choice_position) #学生答案的位置
- end
- user_answer_content = answer_choice_array.sort
- standard_answer = q.exercise_standard_answers.pluck(:exercise_choice_id).sort #该问题的标准答案,可能有多个
- if user_answer_content == standard_answer #答案一致,多选或单选才给分,答案不对不给分
- ques_score = q.question_score
- else
- ques_score = 0.0
- end
+ if answers_content.present? #学生有回答时,分数已经全部存到exercise_answer 表,所以可以直接取第一个值
+ ques_score = answers_content.first.score
+ ques_score = ques_score < 0 ? 0.0 : ques_score
+ # answer_choice_array = []
+ # answers_content.each do |a|
+ # answer_choice_array.push(a.exercise_choice.choice_position) #学生答案的位置
+ # end
+ # user_answer_content = answer_choice_array.sort
+ # standard_answer = q.exercise_standard_answers.pluck(:exercise_choice_id).sort #该问题的标准答案,可能有多个
+ # if q_type == Exercise::MULTIPLE && standard_answer.size == 1 # 老数据的问题
+ # ques_score = answers_content.first.score
+ # else
+ #
+ # end
+
+ # if user_answer_content == standard_answer #答案一致,多选或单选才给分,答案不对不给分
+ # ques_score = q.question_score
+ # else
+ # ques_score = 0.0
+ # end
else
ques_score = 0.0
end
@@ -58,7 +66,6 @@ module ExercisesHelper
exercise_sub_status.each do |s|
sub_answer = s.exercise_answers.search_answer_users("user_id",user_id) #主观题只有一个回答
if sub_answer.present? && sub_answer.first.score >= 0.0
-
if s.question_score <= sub_answer.first.score
stand_status = 1
else
@@ -775,22 +782,24 @@ module ExercisesHelper
user_score = user_score_pre.present? ? user_score_pre.pluck(:score).sum : nil
elsif ques_type == 5 || ques_type == 3
user_score = user_score_pre.present? ? user_score_pre.pluck(:score).sum : 0.0
- else
- if exercise_answers.present? #判断题和选择题时,
- answer_choice_array = []
- exercise_answers.each do |a|
- answer_choice_array.push(a.exercise_choice.choice_position) #学生答案的位置
- end
- user_answer_content = answer_choice_array.sort
- standard_answer = q.exercise_standard_answers.pluck(:exercise_choice_id).sort #该问题的标准答案,可能有多个
- if user_answer_content == standard_answer #答案一致,多选或单选才给分,答案不对不给分
- user_score = q.question_score
- else
- user_score = 0.0
- end
- else
- user_score = 0.0
- end
+ else #选择题,判断题根据第一个记录查分
+ user_score = user_score_pre.present? ? user_score_pre.first.score : 0.0
+
+ # if exercise_answers.present? #判断题和选择题时,
+ # answer_choice_array = []
+ # exercise_answers.each do |a|
+ # answer_choice_array.push(a.exercise_choice.choice_position) #学生答案的位置
+ # end
+ # user_answer_content = answer_choice_array.sort
+ # standard_answer = q.exercise_standard_answers.pluck(:exercise_choice_id).sort #该问题的标准答案,可能有多个
+ # if user_answer_content == standard_answer #答案一致,多选或单选才给分,答案不对不给分
+ # user_score = q.question_score
+ # else
+ # user_score = 0.0
+ # end
+ # else
+ # user_score = 0.0
+ # end
end
end
diff --git a/app/models/ec_graduation_requirement.rb b/app/models/ec_graduation_requirement.rb
index d0f4195d0..f9c65e28e 100644
--- a/app/models/ec_graduation_requirement.rb
+++ b/app/models/ec_graduation_requirement.rb
@@ -1,4 +1,6 @@
class EcGraduationRequirement < ApplicationRecord
+ default_scope { order(position: :asc) }
+
belongs_to :ec_year
has_many :ec_graduation_subitems, dependent: :destroy
@@ -7,5 +9,5 @@ class EcGraduationRequirement < ApplicationRecord
validates :position, presence: true, numericality: { only_integer: true, greater_than: 0 }
validates :content, presence: true
- default_scope { order(position: :asc) }
+ accepts_nested_attributes_for :ec_graduation_subitems, allow_destroy: true
end
diff --git a/app/models/exercise_answer_comment.rb b/app/models/exercise_answer_comment.rb
index 7da0ec4c7..4279ba445 100644
--- a/app/models/exercise_answer_comment.rb
+++ b/app/models/exercise_answer_comment.rb
@@ -3,7 +3,7 @@ class ExerciseAnswerComment < ApplicationRecord
belongs_to :user
belongs_to :exercise_question
belongs_to :exercise_shixun_answer, optional: true
- belongs_to :exercise_answer,optional: true
+ belongs_to :exercise_answer, optional: true
scope :search_answer_comments, lambda {|name,ids| where("#{name}":ids)}
end
diff --git a/app/models/searchable/shixun.rb b/app/models/searchable/shixun.rb
index c1584829d..41bc94b04 100644
--- a/app/models/searchable/shixun.rb
+++ b/app/models/searchable/shixun.rb
@@ -51,13 +51,12 @@ module Searchable::Shixun
visits_count: visits,
challenges_count: challenges_count,
study_count: myshixuns_count,
- description: description
}
end
module ClassMethods
def searchable_includes
- { user: { user_extension: :school } }
+ [ :shixun_info, user: { user_extension: :school } ]
end
end
end
diff --git a/app/models/subject.rb b/app/models/subject.rb
index 6ecb5ed18..d5ea3f433 100644
--- a/app/models/subject.rb
+++ b/app/models/subject.rb
@@ -46,8 +46,7 @@ class Subject < ApplicationRecord
# 挑战过路径的成员数(金课统计去重后的报名人数)
def member_count
- excellent && CourseMember.where(role: 4, course_id: courses.pluck(:id)).pluck(:user_id).length > shixuns.pluck(:myshixuns_count).sum ?
- CourseMember.where(role: 4, course_id: courses.pluck(:id)).pluck(:user_id).length : shixuns.pluck(:myshixuns_count).sum
+ excellent ? CourseMember.where(role: 4, course_id: courses.pluck(:id)).pluck(:user_id).length : shixuns.pluck(:myshixuns_count).sum
end
def all_score
diff --git a/app/models/tiding.rb b/app/models/tiding.rb
index d885f93fd..02692085a 100644
--- a/app/models/tiding.rb
+++ b/app/models/tiding.rb
@@ -22,4 +22,9 @@ class Tiding < ApplicationRecord
value
end
+
+ def anonymous?
+ (container_type == 'StudentWorksScore' && extra.to_i == 3) ||
+ (container_type == 'StudentWorksScoresAppeal' && parent_container_type == 'StudentWork' && tiding_type == 'System')
+ end
end
\ No newline at end of file
diff --git a/app/services/concerns/elasticsearch_able.rb b/app/services/concerns/elasticsearch_able.rb
index 80ca5467e..015aac29b 100644
--- a/app/services/concerns/elasticsearch_able.rb
+++ b/app/services/concerns/elasticsearch_able.rb
@@ -28,9 +28,11 @@ module ElasticsearchAble
end
def body_options
- {
- min_score: EduSetting.get('es_min_score') || 10
- }
+ hash = {}
+
+ hash[:min_score] = (EduSetting.get('es_min_score') || 10) if keyword != '*'
+
+ hash
end
def per_page
diff --git a/app/services/shixun_search_service.rb b/app/services/shixun_search_service.rb
new file mode 100644
index 000000000..911f341f8
--- /dev/null
+++ b/app/services/shixun_search_service.rb
@@ -0,0 +1,56 @@
+class ShixunSearchService < ApplicationService
+ include ElasticsearchAble
+
+ attr_reader :params
+
+ def initialize(params)
+ @params = params
+ end
+
+ def call
+ # 全部实训/我的实训
+ type = params[:type] || "all"
+ # 状态:已发布/未发布
+ status = params[:status] || "all"
+
+ # 超级管理员用户显示所有未隐藏的实训、非管理员显示所有已发布的实训(对本单位公开且未隐藏未关闭)
+ if type == "mine"
+ @shixuns = User.current.shixuns.none_closed
+ else
+ if User.current.admin? || User.current.business?
+ @shixuns = Shixun.none_closed.where(hidden: 0)
+ else
+ none_shixun_ids = ShixunSchool.where("school_id != #{User.current.school_id}").pluck(:shixun_id)
+
+ @shixuns = Shixun.where.not(id: none_shixun_ids).none_closed.where(hidden: 0)
+ end
+ end
+
+ unless status == "all"
+ @shixuns = status == "published" ? @shixuns.where(status: 2) : @shixuns.where(status: [0, 1])
+ end
+
+ ## 筛选 难度
+ if params[:diff].present? && params[:diff].to_i != 0
+ @shixuns = @shixuns.where(trainee: params[:diff])
+ end
+
+ Shixun.search(keyword, search_options)
+ end
+
+ private
+
+ def search_options
+ model_options = {
+ includes: [ :shixun_info, :challenges, :subjects, user: { user_extension: :school } ]
+ }
+ model_options.merge!(where: { id: @shixuns.pluck(:id) })
+ model_options.merge!(order: {"myshixuns_count" => sort_str})
+ model_options.merge!(default_options)
+ model_options
+ end
+
+ def sort_str
+ params[:order] || "desc"
+ end
+end
\ No newline at end of file
diff --git a/app/views/ecs/course_evaluations/average_score_import_template.xlsx.axlsx b/app/views/ecs/course_evaluations/average_score_import_template.xlsx.axlsx
index 900ff5888..934e1c4be 100644
--- a/app/views/ecs/course_evaluations/average_score_import_template.xlsx.axlsx
+++ b/app/views/ecs/course_evaluations/average_score_import_template.xlsx.axlsx
@@ -13,7 +13,7 @@ wb.styles do |style|
name = course_evaluation.name
items_size = course_evaluation.ec_course_evaluation_subitems.count
- sheet.add_row name, style: bg_style
+ sheet.add_row [name], style: bg_style
sheet.merge_cells wb.rows.first.cells[(1..(items_size * course_evaluation.evaluation_count))]
data = []
diff --git a/app/views/ecs/course_evaluations/index.json.jbuilder b/app/views/ecs/course_evaluations/index.json.jbuilder
index e1c63d44d..b120bccc2 100644
--- a/app/views/ecs/course_evaluations/index.json.jbuilder
+++ b/app/views/ecs/course_evaluations/index.json.jbuilder
@@ -1 +1 @@
-json.course_evaluations @course_evaluations, partial: 'shared/ec_course_evaluation', as: :ec_course_evaluation
+json.course_evaluations @course_evaluations, partial: 'ecs/course_evaluations/shared/ec_course_evaluation', as: :ec_course_evaluation
diff --git a/app/views/ecs/course_evaluations/show.json.jbuilder b/app/views/ecs/course_evaluations/show.json.jbuilder
index b03ddc076..f67053183 100644
--- a/app/views/ecs/course_evaluations/show.json.jbuilder
+++ b/app/views/ecs/course_evaluations/show.json.jbuilder
@@ -1 +1 @@
-json.partial! 'shared/ec_course_evaluation', ec_course_evaluation: @course_evaluation
+json.partial! 'ecs/course_evaluations/shared/ec_course_evaluation', ec_course_evaluation: @course_evaluation
diff --git a/app/views/ecs/course_evaluations/slimmer.json.jbuilder b/app/views/ecs/course_evaluations/slimmer.json.jbuilder
index 929cfe7be..6e0faef3e 100644
--- a/app/views/ecs/course_evaluations/slimmer.json.jbuilder
+++ b/app/views/ecs/course_evaluations/slimmer.json.jbuilder
@@ -1 +1 @@
-json.course_evaluations @course_evaluations, partial: 'shared/ec_course_evaluation_slim', as: :ec_course_evaluation
+json.course_evaluations @course_evaluations, partial: 'ecs/course_evaluations/shared/ec_course_evaluation_slim', as: :ec_course_evaluation
diff --git a/app/views/ecs/course_targets/index.json.jbuilder b/app/views/ecs/course_targets/index.json.jbuilder
index 6590ecc10..9ec4af823 100644
--- a/app/views/ecs/course_targets/index.json.jbuilder
+++ b/app/views/ecs/course_targets/index.json.jbuilder
@@ -1,2 +1,2 @@
-json.course_targets @course_targets, partial: 'shared/course_target', as: :ec_course_target
+json.course_targets @course_targets, partial: 'ecs/course_targets/shared/course_target', as: :ec_course_target
diff --git a/app/views/ecs/course_targets/index.xlsx.axlsx b/app/views/ecs/course_targets/index.xlsx.axlsx
index a188ad95c..ef4215b03 100644
--- a/app/views/ecs/course_targets/index.xlsx.axlsx
+++ b/app/views/ecs/course_targets/index.xlsx.axlsx
@@ -15,7 +15,7 @@ wb.styles do |style|
name = "#{@_current_course.name}课程目标"
wb.add_worksheet(name: name) do |sheet|
- sheet.add_row name, style: title_style
+ sheet.add_row [name], style: title_style
sheet.add_row []
sheet.add_row []
diff --git a/app/views/ecs/ec_courses/search.json.jbuilder b/app/views/ecs/ec_courses/search.json.jbuilder
index fc22586d7..cf00a2b98 100644
--- a/app/views/ecs/ec_courses/search.json.jbuilder
+++ b/app/views/ecs/ec_courses/search.json.jbuilder
@@ -1,2 +1,2 @@
json.count @count
-json.ec_courses @ec_courses, partial: 'shared/ec_course_slim', as: :ec_course
\ No newline at end of file
+json.ec_courses @ec_courses, partial: 'ecs/ec_courses/shared/ec_course_slim', as: :ec_course
\ No newline at end of file
diff --git a/app/views/ecs/ec_graduation_requirements/index.json.jbuilder b/app/views/ecs/ec_graduation_requirements/index.json.jbuilder
index 6fbbf249b..ffb83ed23 100644
--- a/app/views/ecs/ec_graduation_requirements/index.json.jbuilder
+++ b/app/views/ecs/ec_graduation_requirements/index.json.jbuilder
@@ -1,3 +1,3 @@
json.count @graduation_requirements.size
-json.graduation_requirements @graduation_requirements, partial: 'shared/ec_graduation_requirement', as: :ec_graduation_requirement
+json.graduation_requirements @graduation_requirements, partial: '/ecs/ec_graduation_requirements/shared/ec_graduation_requirement', as: :ec_graduation_requirement
diff --git a/app/views/ecs/ec_graduation_requirements/index.xlsx.axlsx b/app/views/ecs/ec_graduation_requirements/index.xlsx.axlsx
index aeb802329..9a2081861 100644
--- a/app/views/ecs/ec_graduation_requirements/index.xlsx.axlsx
+++ b/app/views/ecs/ec_graduation_requirements/index.xlsx.axlsx
@@ -6,15 +6,15 @@ wb = xlsx_package.workbook
wb.styles do |style|
title_style = style.add_style(sz: 16, height: 20, b: true)
ec_year_style = style.add_style(sz: 10, height: 14)
- label_style = style.add_style(sz: 11, b: true, bg_color: '90EE90', alignment: { horizontal: :center })
+ label_style = style.add_style(sz: 11, b: true, bg_color: '90EE90', alignment: { horizontal: :center, vertical: :center })
content_style = style.add_style(sz: 11, height: 16, border: { style: :thin, color: '000000' })
wb.add_worksheet(:name => '毕业要求及指标点') do |sheet|
- sheet.add_row '毕业要求及指标点', style: title_style
+ sheet.add_row ['毕业要求及指标点'], style: title_style
sheet.add_row []
- sheet.add_row ['专业代码', major.code], style: ec_year_style
+ sheet.add_row ['专业代码', major.code.to_s + ' '], style: ec_year_style
sheet.add_row ['专业名称', major.name], style: ec_year_style
sheet.add_row ['学年', "#{ec_year.year}学年"], style: ec_year_style
@@ -32,12 +32,15 @@ wb.styles do |style|
end
items_size = requirement.ec_graduation_subitems.size
- sheet.merge_cells("A#{index}:A#{index + items_size}")
- sheet.merge_cells("B#{index}:B#{index + items_size}")
+ if items_size.zero?
+ sheet.add_row [requirement_content, ''], style: content_style
+ else
+ sheet.merge_cells("A#{index + 1}:A#{index + items_size}")
+ end
index += items_size
end
- sheet.column_widths [400, 400]
+ sheet.column_widths 100, 100
end
end
\ No newline at end of file
diff --git a/app/views/ecs/ec_graduation_requirements/show.json.jbuilder b/app/views/ecs/ec_graduation_requirements/show.json.jbuilder
index 562c255a9..d3a8db1fc 100644
--- a/app/views/ecs/ec_graduation_requirements/show.json.jbuilder
+++ b/app/views/ecs/ec_graduation_requirements/show.json.jbuilder
@@ -1,2 +1,2 @@
-json.partial! 'shared/ec_graduation_requirement', ec_graduation_requirement: @graduation_requirement
+json.partial! 'ecs/ec_graduation_requirements/shared/ec_graduation_requirement', ec_graduation_requirement: @graduation_requirement
diff --git a/app/views/ecs/graduation_course_supports/create.json.jbuilder b/app/views/ecs/graduation_course_supports/create.json.jbuilder
index c05024911..d8749a5dc 100644
--- a/app/views/ecs/graduation_course_supports/create.json.jbuilder
+++ b/app/views/ecs/graduation_course_supports/create.json.jbuilder
@@ -1 +1 @@
-json.partial! 'shared/ec_graduation_subitem', ec_graduation_subitem: @graduation_subitem
+json.partial! 'ecs/graduation_course_supports/shared/ec_graduation_subitem', ec_graduation_subitem: @graduation_subitem
diff --git a/app/views/ecs/graduation_course_supports/show.json.jbuilder b/app/views/ecs/graduation_course_supports/show.json.jbuilder
index a9e4bdc22..495f9c6a9 100644
--- a/app/views/ecs/graduation_course_supports/show.json.jbuilder
+++ b/app/views/ecs/graduation_course_supports/show.json.jbuilder
@@ -1,3 +1,3 @@
json.course_count @course_count
-json.graduation_subitems @graduation_subitems, partial: 'shared/ec_graduation_subitem', as: :ec_graduation_subitem
+json.graduation_subitems @graduation_subitems, partial: 'ecs/graduation_course_supports/shared/ec_graduation_subitem', as: :ec_graduation_subitem
json.count @graduation_subitems.size
diff --git a/app/views/ecs/graduation_course_supports/show.xlsx.axlsx b/app/views/ecs/graduation_course_supports/show.xlsx.axlsx
index fd1a44935..e2c2599ec 100644
--- a/app/views/ecs/graduation_course_supports/show.xlsx.axlsx
+++ b/app/views/ecs/graduation_course_supports/show.xlsx.axlsx
@@ -14,7 +14,7 @@ wb.styles do |style|
tip_style = style.add_style(sz: 11, height: 16, color: 'FFA07A')
wb.add_worksheet(:name => '课程体系对毕业要求的支撑') do |sheet|
- sheet.add_row '课程体系VS毕业要求', style: title_style
+ sheet.add_row ['课程体系VS毕业要求'], style: title_style
sheet.merge_cells wb.rows.first.cells[(1..(3 + max_support_length - 1))]
sheet.add_row []
diff --git a/app/views/ecs/reach_evaluations/show.xlsx.axlsx b/app/views/ecs/reach_evaluations/show.xlsx.axlsx
index a62e4f6c2..a79d059a3 100644
--- a/app/views/ecs/reach_evaluations/show.xlsx.axlsx
+++ b/app/views/ecs/reach_evaluations/show.xlsx.axlsx
@@ -10,7 +10,7 @@ wb.styles do |style|
content_style = style.add_style(sz: 11, height: 16, border: { style: :thin, color: '000000' })
wb.add_worksheet(name: '达成度-毕业要求综合评价报表') do |sheet|
- sheet.add_row '培养目标及目标分解', style: title_style
+ sheet.add_row ['达成度-毕业要求综合评价报表'], style: title_style
sheet.merge_cells("A1:D1")
sheet.add_row []
diff --git a/app/views/ecs/requirement_support_objectives/show.json.jbuilder b/app/views/ecs/requirement_support_objectives/show.json.jbuilder
index 1ba783304..642a5f10c 100644
--- a/app/views/ecs/requirement_support_objectives/show.json.jbuilder
+++ b/app/views/ecs/requirement_support_objectives/show.json.jbuilder
@@ -1,4 +1,4 @@
json.graduation_requirements @graduation_requirements, partial: 'ecs/ec_graduation_requirements/shared/ec_graduation_requirement', as: :ec_graduation_requirement
json.training_subitems @training_subitems, partial: 'ecs/ec_training_subitems/shared/ec_training_subitem', as: :ec_training_subitem
-json.requirement_support_objectives @requirement_support_objectives, partial: 'shared/requirement_support_objective', as: :requirement_support_objective
+json.requirement_support_objectives @requirement_support_objectives, partial: 'ecs/requirement_support_objectives/shared/requirement_support_objective', as: :requirement_support_objective
diff --git a/app/views/ecs/requirement_support_objectives/show.xlsx.axlsx b/app/views/ecs/requirement_support_objectives/show.xlsx.axlsx
index 934ad2941..6534ce36a 100644
--- a/app/views/ecs/requirement_support_objectives/show.xlsx.axlsx
+++ b/app/views/ecs/requirement_support_objectives/show.xlsx.axlsx
@@ -16,7 +16,7 @@ wb.styles do |style|
content_style = style.add_style(sz: 11, height: 16, border: { style: :thin, color: '000000' })
wb.add_worksheet(:name => '毕业要求对培养目标的支撑') do |sheet|
- sheet.add_row '毕业要求 vs 培养目标矩阵', style: title_style
+ sheet.add_row ['毕业要求 vs 培养目标矩阵'], style: title_style
sheet.merge_cells wb.rows.first.cells[(1..subitem_size)]
diff --git a/app/views/ecs/score_levels/show.json.jbuilder b/app/views/ecs/score_levels/show.json.jbuilder
index 0c8b76d86..dcdf63cdc 100644
--- a/app/views/ecs/score_levels/show.json.jbuilder
+++ b/app/views/ecs/score_levels/show.json.jbuilder
@@ -1 +1 @@
-json.score_levels @score_levels, partial: 'shared/ec_score_level', as: :ec_score_level
+json.score_levels @score_levels, partial: 'ecs/score_levels/shared/ec_score_level', as: :ec_score_level
diff --git a/app/views/ecs/students/show.json.jbuilder b/app/views/ecs/students/show.json.jbuilder
index 352970055..468a1cfe3 100644
--- a/app/views/ecs/students/show.json.jbuilder
+++ b/app/views/ecs/students/show.json.jbuilder
@@ -1,2 +1,2 @@
json.count @count
-json.students @students, partial: 'shared/ec_year_student', as: :ec_year_student
\ No newline at end of file
+json.students @students, partial: 'ecs/students/shared/ec_year_student', as: :ec_year_student
\ No newline at end of file
diff --git a/app/views/ecs/subitem_support_standards/show.json.jbuilder b/app/views/ecs/subitem_support_standards/show.json.jbuilder
index 94fd6c5a0..a92fe7000 100644
--- a/app/views/ecs/subitem_support_standards/show.json.jbuilder
+++ b/app/views/ecs/subitem_support_standards/show.json.jbuilder
@@ -1,4 +1,4 @@
json.graduation_standards @graduation_standards, partial: 'ecs/shared/ec_graduation_standard', as: :ec_graduation_standard
json.graduation_subitems @graduation_subitems, partial: 'ecs/shared/ec_graduation_subitem', as: :ec_graduation_subitem
-json.subitem_support_standards @subitem_support_standards, partial: 'shared/subitem_support_standard', as: :subitem_support_standard
+json.subitem_support_standards @subitem_support_standards, partial: 'ecs/subitem_support_standards/shared/subitem_support_standard', as: :subitem_support_standard
diff --git a/app/views/ecs/subitem_support_standards/show.xlsx.axlsx b/app/views/ecs/subitem_support_standards/show.xlsx.axlsx
index e12f517f3..8329a27ee 100644
--- a/app/views/ecs/subitem_support_standards/show.xlsx.axlsx
+++ b/app/views/ecs/subitem_support_standards/show.xlsx.axlsx
@@ -17,7 +17,7 @@ wb.styles do |style|
content_style = style.add_style(sz: 11, height: 16, border: { style: :thin, color: '000000' })
wb.add_worksheet(:name => '毕业要求对通用标准的支撑') do |sheet|
- sheet.add_row '毕业要求 vs 通用标准矩阵', style: title_style
+ sheet.add_row ['毕业要求 vs 通用标准矩阵'], style: title_style
sheet.merge_cells wb.rows.first.cells[(1..standards_size)]
diff --git a/app/views/homework_commons/shixuns.json.jbuilder b/app/views/homework_commons/shixuns.json.jbuilder
index bd97f5e8d..79f22e42a 100644
--- a/app/views/homework_commons/shixuns.json.jbuilder
+++ b/app/views/homework_commons/shixuns.json.jbuilder
@@ -1,4 +1,4 @@
-# json.shixun_list @shixuns do |shixun|
+# json.shixun_lists @shixuns do |shixun|
# json.shixun_identifier shixun.identifier
# json.name shixun.name
# json.creator shixun.user&.full_name
diff --git a/app/views/shixun_lists/index.json.jbuilder b/app/views/shixun_lists/index.json.jbuilder
new file mode 100644
index 000000000..d6c651743
--- /dev/null
+++ b/app/views/shixun_lists/index.json.jbuilder
@@ -0,0 +1,22 @@
+json.shixuns_count @results.total_count
+
+json.shixun_list do
+ json.array! @results.with_highlights(multiple: true) do |obj, highlights|
+ json.merge! obj.to_searchable_json
+ json.challenge_names obj.challenges.pluck(:subject)
+
+ # 去除开头标点符号
+ reg = /^[,。?:;‘’!“”—……、]/
+ highlights[:description]&.first&.sub!(reg, '')
+ highlights[:content]&.first&.sub!(reg, '')
+
+ json.title highlights.delete(:name)&.join('...') || obj.searchable_title
+ json.description highlights[:description]&.join('...') || Util.extract_content(obj.description)[0..300]
+
+ json.content highlights
+ json.level level_to_s(obj.trainee)
+ json.subjects obj.subjects.uniq do |subject|
+ json.(subject, :id, :name)
+ end
+ end
+end
\ No newline at end of file
diff --git a/app/views/shixuns/shixun_list.json.jbuilder b/app/views/shixuns/shixun_list.json.jbuilder
index 54ac65a0a..2f1d4905c 100644
--- a/app/views/shixuns/shixun_list.json.jbuilder
+++ b/app/views/shixuns/shixun_list.json.jbuilder
@@ -10,7 +10,7 @@ json.shixun_list do
# json.description highlights.values[0,5].each { |arr| arr.is_a?(Array) ? arr.join('...') : arr }.join(' "+text+"
')
json.content highlights
json.level level_to_s(obj.trainee)
- json.subjects obj.subjects do |subject|
+ json.subjects obj.subjects.uniq do |subject|
json.(subject, :id, :name)
end
end
diff --git a/app/views/tidings/_tiding.json.jbuilder b/app/views/tidings/_tiding.json.jbuilder
index 959a96ebd..210e5c8f8 100644
--- a/app/views/tidings/_tiding.json.jbuilder
+++ b/app/views/tidings/_tiding.json.jbuilder
@@ -17,8 +17,13 @@ json.homework_type homework_type
json.time tiding.how_long_time
json.new_tiding tiding.unread?(@onclick_time)
+# 需要系统头像
+show_system_user = tiding.trigger_user_id.zero? ||
+ (tiding.trigger_user_id == 1 && tiding.tiding_type == 'System') ||
+ tiding.anonymous?
+
json.trigger_user do
- if tiding.trigger_user_id.zero? || (tiding.trigger_user_id == 1 && tiding.tiding_type == 'System')
+ if show_system_user
json.id 0
json.name "系统"
json.login ""
diff --git a/config/locales/tidings/zh-CN.yml b/config/locales/tidings/zh-CN.yml
index e6e8e676d..21c020d04 100644
--- a/config/locales/tidings/zh-CN.yml
+++ b/config/locales/tidings/zh-CN.yml
@@ -202,6 +202,7 @@
2_end: "别人对你的匿评发起的申诉申请:%s,审核未通过"
StudentWork:
Apply_end: "发起了匿评申诉申请:%s"
+ HomeworkCommon_end: "发起了匿评申诉申请:%s"
System_end: "有人对你的匿评发起了申诉:%s"
Department_end: "你选填的二级单位:%s(%s)因不符合规范,已被系统删除.请重新选择"
Library:
diff --git a/config/routes.rb b/config/routes.rb
index 8098d03c9..b786862ce 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -174,7 +174,10 @@ Rails.application.routes.draw do
end
end
+ resources :shixun_lists
+
resources :shixuns, param: :identifier do
+
collection do
get :menus
get :get_recommend_shixuns
@@ -182,7 +185,7 @@ Rails.application.routes.draw do
get :get_mirror_script
post :apply_shixun_mirror
get :download_file
- get :shixun_list
+ get :shixun_lists
end
member do
@@ -715,7 +718,7 @@ Rails.application.routes.draw do
resources :ec_years, only: [] do
resource :ec_training_objectives, only: [:show, :create]
- resources :ec_graduation_requirements, only: [:index, :create]
+ resources :ec_graduation_requirements, only: [:index, :create, :update, :destroy]
resource :requirement_support_objectives, only: [:show, :create, :destroy]
resource :subitem_support_standards, only: [:show, :create, :destroy]
resource :students, only: [:show, :destroy] do
diff --git a/dump.rdb b/dump.rdb
index bcf064366..9f62f75c7 100644
Binary files a/dump.rdb and b/dump.rdb differ
diff --git a/lib/tasks/public_course_sync.rake b/lib/tasks/public_course_sync.rake
index a22a9f1f8..c26090e81 100644
--- a/lib/tasks/public_course_sync.rake
+++ b/lib/tasks/public_course_sync.rake
@@ -81,8 +81,10 @@ namespace :public_classes do
homework.update_columns(publish_time: publish_time, end_time: end_time, created_at: created_at, updated_at: updated_at)
homework.homework_detail_manual.update_columns(comment_status: 6, created_at: created_at, updated_at: updated_at)
+ homework.update_homework_work_score
+ homework.update_attribute('calculation_time', end_time)
- homework.student_works.where("work_status !=0 and update_time > '#{end_time}'").update_all(update_time: end_time)
+ # homework.student_works.where("work_status !=0 and update_time > '#{end_time}'").update_all(update_time: end_time)
end
when 3
# 试卷
diff --git a/public/editormd/lib/marked.min.js b/public/editormd/lib/marked.min.js
index 4db085adb..88ec3e856 100644
--- a/public/editormd/lib/marked.min.js
+++ b/public/editormd/lib/marked.min.js
@@ -10,7 +10,5 @@
out+=this.renderer.em(this.output(cap[2]||cap[1])) -->
out+=this.renderer.em(this.output(cap[2]||cap[1]), cap.input)
*/
-(function(){var block={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:noop,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:noop,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:noop,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};block.bullet=/(?:[*+-]|\d+\.)/;block.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;block.item=replace(block.item,"gm")(/bull/g,block.bullet)();block.list=replace(block.list)(/bull/g,block.bullet)("hr","\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))")("def","\\n+(?="+block.def.source+")")();block.blockquote=replace(block.blockquote)("def",block.def)();block._tag="(?!(?:"+"a|em|strong|small|s|cite|q|dfn|abbr|data|time|code"+"|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo"+"|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b";block.html=replace(block.html)("comment",//)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/
"}return'"+(escaped?code:escape(code,true))+"\n
\n"};Renderer.prototype.blockquote=function(quote){return"'+(escaped?code:escape(code,true))+"\n
\n"+quote+"
\n"};Renderer.prototype.html=function(html){return html};Renderer.prototype.heading=function(text,level,raw){return"
\n":"
\n"};Renderer.prototype.list=function(body,ordered){var type=ordered?"ol":"ul";return"<"+type+">\n"+body+""+type+">\n"};Renderer.prototype.listitem=function(text){return"\n"+"\n"+header+"\n"+"\n"+body+"\n"+"
\n"};Renderer.prototype.tablerow=function(content){return"\n"+content+" \n"};Renderer.prototype.tablecell=function(content,flags){var type=flags.header?"th":"td";var tag=flags.align?"<"+type+' style="text-align:'+flags.align+'">':"<"+type+">";return tag+content+""+type+">\n"};Renderer.prototype.strong=function(text){return""+text+""};Renderer.prototype.em=function(text){return""+text+""};Renderer.prototype.codespan=function(text){return""+text+"
"};Renderer.prototype.br=function(){return this.options.xhtml?"
":"
"};Renderer.prototype.del=function(text){return""+text+""};Renderer.prototype.link=function(href,title,text){if(this.options.sanitize){try{var prot=decodeURIComponent(unescape(href)).replace(/[^\w:]/g,"").toLowerCase()}catch(e){return""}if(prot.indexOf("javascript:")===0||prot.indexOf("vbscript:")===0){return""}}var out='"+text+"";return out};Renderer.prototype.image=function(href,title,text){var out='":">";return out};function Parser(options){this.tokens=[];this.token=null;this.options=options||marked.defaults;this.options.renderer=this.options.renderer||new Renderer;this.renderer=this.options.renderer;this.renderer.options=this.options}Parser.parse=function(src,options,renderer){var parser=new Parser(options,renderer);return parser.parse(src)};Parser.prototype.parse=function(src){this.inline=new InlineLexer(src.links,this.options,this.renderer);this.tokens=src.reverse();var out="";while(this.next()){out+=this.tok()}return out};Parser.prototype.next=function(){return this.token=this.tokens.pop()};Parser.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0};Parser.prototype.parseText=function(){var body=this.token.text;while(this.peek().type==="text"){body+="\n"+this.next().text}return this.inline.output(body)};Parser.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var header="",body="",i,row,cell,flags,j;cell="";for(i=0;i
"+escape(e.message+"",true)+""}throw e}}marked.options=marked.setOptions=function(opt){merge(marked.defaults,opt);return marked};marked.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,smartLists:false,silent:false,highlight:null,langPrefix:"lang-",smartypants:false,headerPrefix:"",renderer:new Renderer,xhtml:false};marked.Parser=Parser;marked.parser=Parser.parse;marked.Renderer=Renderer;marked.Lexer=Lexer;marked.lexer=Lexer.lex;marked.InlineLexer=InlineLexer;marked.inlineLexer=InlineLexer.output;marked.parse=marked;if(typeof module!=="undefined"&&typeof exports==="object"){module.exports=marked}else{if(typeof define==="function"&&define.amd){define(function(){return marked})}else{this.marked=marked}}}).call(function(){return this||(typeof window!=="undefined"?window:global)}()); +// 0.4.0 /^ *(#{1,6}) ——》/^ *(#{1,6}) 去掉了一个空格 TODO 行内公式带_ +!function(e){"use strict";var t={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:d,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ *(#{1,6})*([^\n]+?) *(?:#+ *)?(?:\n+|$)/,nptable:d,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?\\?>\\n*|\\n*|\\n*|?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)|(?!script|pre|style)[a-z][\\w-]*\\s*>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,table:d,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,text:/^[^\n]+/};function n(e){this.tokens=[],this.tokens.links={},this.options=e||m.defaults,this.rules=t.normal,this.options.pedantic?this.rules=t.pedantic:this.options.gfm&&(this.options.tables?this.rules=t.tables:this.rules=t.gfm)}t._label=/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,t._title=/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/,t.def=p(t.def).replace("label",t._label).replace("title",t._title).getRegex(),t.bullet=/(?:[*+-]|\d+\.)/,t.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/,t.item=p(t.item,"gm").replace(/bull/g,t.bullet).getRegex(),t.list=p(t.list).replace(/bull/g,t.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+t.def.source+")").getRegex(),t._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",t._comment=//,t.html=p(t.html,"i").replace("comment",t._comment).replace("tag",t._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),t.paragraph=p(t.paragraph).replace("hr",t.hr).replace("heading",t.heading).replace("lheading",t.lheading).replace("tag",t._tag).getRegex(),t.blockquote=p(t.blockquote).replace("paragraph",t.paragraph).getRegex(),t.normal=f({},t),t.gfm=f({},t.normal,{fences:/^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\n? *\1 *(?:\n+|$)/,paragraph:/^/,heading:/^ *(#{1,6})+([^\n]+?) *#* *(?:\n+|$)/}),t.gfm.paragraph=p(t.paragraph).replace("(?!","(?!"+t.gfm.fences.source.replace("\\1","\\2")+"|"+t.list.source.replace("\\1","\\3")+"|").getRegex(),t.tables=f({},t.gfm,{nptable:/^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,table:/^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/}),t.pedantic=f({},t.normal,{html:p("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?\\1> *(?:\\n{2,}|\\s*$)|
'+(n?e:a(e,!0))+"
\n":""+(n?e:a(e,!0))+"
"},i.prototype.blockquote=function(e){return"\n"+e+"\n"},i.prototype.html=function(e){return e},i.prototype.heading=function(e,t,n){return this.options.headerIds?"
"+e+"
\n"},i.prototype.table=function(e,t){return t&&(t=""+t+""),""+e+"
"},i.prototype.br=function(){return this.options.xhtml?""+a(e.message+"",!0)+"";throw e}}d.exec=d,m.options=m.setOptions=function(e){return f(m.defaults,e),m},m.getDefaults=function(){return{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:new i,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tables:!0,xhtml:!1}},m.defaults=m.getDefaults(),m.Parser=o,m.parser=o.parse,m.Renderer=i,m.TextRenderer=l,m.Lexer=n,m.lexer=n.lex,m.InlineLexer=s,m.inlineLexer=s.output,m.parse=m,"undefined"!=typeof module&&"object"==typeof exports?module.exports=m:"function"==typeof define&&define.amd?define(function(){return m}):e.marked=m}(this||("undefined"!=typeof window?window:global)); diff --git a/public/react/public/index.html b/public/react/public/index.html index 166760eab..4fd2c4356 100755 --- a/public/react/public/index.html +++ b/public/react/public/index.html @@ -34,8 +34,9 @@ // location.href = './compatibility' location.href = '/compatibility.html' } - const isMobile = (/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase())); - if (isMobile) { + // const isMobile = (/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase())); + const isWeiXin = (/MicroMessenger/i.test(navigator.userAgent.toLowerCase())); + if (isWeiXin) { document.write(' diff --git a/public/react/src/App.js b/public/react/src/App.js index ddb8de809..9b85acfa8 100644 --- a/public/react/src/App.js +++ b/public/react/src/App.js @@ -9,7 +9,7 @@ import { Route, Switch } from 'react-router-dom'; -import axios from 'axios'; + import '@icedesign/base/dist/ICEDesignBase.css'; import '@icedesign/base/index.scss'; @@ -37,7 +37,7 @@ import {MuiThemeProvider, createMuiTheme} from 'material-ui/styles'; import history from './history'; -import {SnackbarHOC, configShareForIndex} from 'educoder' +import {SnackbarHOC} from 'educoder' import {initAxiosInterceptors} from './AppConfig' @@ -303,47 +303,7 @@ class App extends Component { mydisplay:true, }) }; - initWXShare = () => { - if (window.wx) { - const wx = window.wx - const url = '/wechats/js_sdk_signature.json' - const currentUrl = window.location.href.split('#')[0] - // window.encodeURIComponent() - axios.post(url, { - url: window.__testUrl || currentUrl, - }).then((response) => { - console.log('got res') - const data = response.data; - wx.config({ - debug: false, - appId: data.appid, - timestamp: data.timestamp, - nonceStr: data.noncestr, - signature: data.signature, - jsApiList: [ - 'onMenuShareTimeline',// - 'onMenuShareAppMessage', - 'onMenuShareQQ', - 'onMenuShareWeibo', - 'onMenuShareQZone' - ] - }); - wx.ready(function () { - console.log('wx is ready') - configShareForIndex('/') - }); - wx.error(function (res) { - console.log('wx is error') - console.log(res) - //alert(res.errMsg);//错误提示 - - }); - }).catch((error) => { - console.log(error) - }) - } - } disableVideoContextMenu = () => { window.$( "body" ).on( "mousedown", "video", function(event) { if(event.which === 3) { @@ -365,7 +325,6 @@ class App extends Component { }); initAxiosInterceptors(this.props) - this.initWXShare() // // axios.interceptors.response.use((response) => { // // console.log("response"+response); diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index b90a527ef..20d34e841 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -10,7 +10,7 @@ broadcastChannelOnmessage('refreshPage', () => { }) function locationurl(list){ - debugger + if (window.location.port === "3007") { } else { diff --git a/public/react/src/common/Env.js b/public/react/src/common/Env.js index 283e82c48..c80497509 100644 --- a/public/react/src/common/Env.js +++ b/public/react/src/common/Env.js @@ -3,4 +3,6 @@ export function isDev() { } // const isMobile -export const isMobile = (/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase())); \ No newline at end of file +export const isMobile = (/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase())); + +// const isWeiXin = (/MicroMessenger/i.test(navigator.userAgent.toLowerCase())); diff --git a/public/react/src/common/util/ShareUtil.js b/public/react/src/common/util/ShareUtil.js index 24fffbf15..e591effaf 100644 --- a/public/react/src/common/util/ShareUtil.js +++ b/public/react/src/common/util/ShareUtil.js @@ -1,4 +1,5 @@ -const host = window.location.host +import axios from 'axios' +const host = window.location.protocol + '//' + window.location.host const wx = window.wx function share(shareData) { try { @@ -11,7 +12,47 @@ function share(shareData) { console.log(e) } } +const urlDoneMap = {} +function requestForSignatrue (callback) { + const currentUrl = window.location.href.split('#')[0] + if (window.wx && !urlDoneMap[currentUrl]) { + const wx = window.wx + const url = '/wechats/js_sdk_signature.json' + urlDoneMap[currentUrl] = true + // window.encodeURIComponent() + axios.post(url, { + url: window.__testUrl || currentUrl, + }).then((response) => { + console.log('got res') + const data = response.data; + wx.config({ + debug: false, + appId: data.appid, + timestamp: data.timestamp, + nonceStr: data.noncestr, + signature: data.signature, + jsApiList: [ + 'onMenuShareTimeline',// + 'onMenuShareAppMessage', + 'onMenuShareQQ', + 'onMenuShareWeibo', + 'onMenuShareQZone' + ] + }); + wx.ready(function () { + callback && callback() + }); + wx.error(function (res) { + console.log('wx is error') + console.log(res) + //alert(res.errMsg);//错误提示 + }); + }).catch((error) => { + console.log(error) + }) + } +} /** 实践课程 平台提供涵盖基础入门、案例实践和创新应用的完整实训项目体系,通过由浅入深的实训路径,帮助学生快速提升实战能力。 实训项目 覆盖不同专业的IT实验和实训,每周更新,无需配置本机实验环境,随时随地开启企业级真实实训。 @@ -19,60 +60,72 @@ function share(shareData) { 单个课程和实训 获取课程/实训的简介 该课程或者实训展示的缩略图 */ -export function configShareForIndex (path) { - if (!wx) return; - var shareData = { - title: 'EduCoder - 首页', - desc: 'Educoder是一个面向计算机类的互联网IT教育和实战平台,提供企业级工程实训,以实现工程化专业教学的自动化和智能化。高校和企业人员可以在此开展计算机实践性教学活动,将传统的知识传授和时兴的工程实战一体化。', - link: host + (path || ''), - imgUrl: window.__testImageUrl - || host + '/react/build/images/share_logo_icon.jpg' - }; - share(shareData) +export function configShareForIndex (path) { + requestForSignatrue(() => { + var shareData = { + title: 'EduCoder - 首页', + desc: 'Educoder是一个面向计算机类的互联网IT教育和实战平台,提供企业级工程实训,以实现工程化专业教学的自动化和智能化。高校和企业人员可以在此开展计算机实践性教学活动,将传统的知识传授和时兴的工程实战一体化。', + link: host + (path || ''), + imgUrl: window.__testImageUrl + || host + '/react/build/images/share_logo_icon.jpg' + }; + share(shareData) + }) } export function configShareForPaths () { - if (!wx) return; - var shareData = { - title: 'EduCoder - 实践课程', - desc: '平台提供涵盖基础入门、案例实践和创新应用的完整实训项目体系,通过由浅入深的实训路径,帮助学生快速提升实战能力。', - link: `${host}/paths`, - imgUrl: window.__testImageUrl - || host + '/react/build/images/share_logo_icon.jpg' - }; - share(shareData) + requestForSignatrue(() => { + console.log('configShareForPaths', host) + var shareData = { + title: 'EduCoder - 实践课程', + desc: '平台提供涵盖基础入门、案例实践和创新应用的完整实训项目体系,通过由浅入深的实训路径,帮助学生快速提升实战能力。', + link: `${host}/paths`, + imgUrl: window.__testImageUrl + || host + '/react/build/images/share_logo_icon.jpg' + }; + share(shareData) + }) } export function configShareForShixuns () { - if (!wx) return; - var shareData = { - title: 'EduCoder - 实训项目', - desc: '覆盖不同专业的IT实验和实训,每周更新,无需配置本机实验环境,随时随地开启企业级真实实训。', - link: `${host}/shixuns`, - imgUrl: window.__testImageUrl - || host + '/react/build/images/share_logo_icon.jpg' - }; - share(shareData) + requestForSignatrue(() => { + console.log('configShareForShixuns', host) + + var shareData = { + title: 'EduCoder - 实训项目', + desc: '覆盖不同专业的IT实验和实训,每周更新,无需配置本机实验环境,随时随地开启企业级真实实训。', + link: `${host}/shixuns`, + imgUrl: window.__testImageUrl + || host + '/react/build/images/share_logo_icon.jpg' + }; + share(shareData) + }) } export function configShareForCourses () { - if (!wx) return; - var shareData = { - title: 'EduCoder - 翻转课堂', - desc: '自动评测实训任务,支持技能统计,提供教学活动分析报告,减轻教师和助教的辅导压力,免去作业发布和批改的困扰,实时了解学生学习情况,全面提升教师施教效率和水平。', - link: `${host}/courses`, - imgUrl: window.__testImageUrl - || host + '/react/build/images/share_logo_icon.jpg' - }; - share(shareData) + requestForSignatrue(() => { + console.log('configShareForCourses', host) + + var shareData = { + title: 'EduCoder - 翻转课堂', + desc: '自动评测实训任务,支持技能统计,提供教学活动分析报告,减轻教师和助教的辅导压力,免去作业发布和批改的困扰,实时了解学生学习情况,全面提升教师施教效率和水平。', + link: `${host}/courses`, + imgUrl: window.__testImageUrl + || host + '/react/build/images/share_logo_icon.jpg' + }; + share(shareData) + }) } // detail export function configShareForCustom (title, desc, path, imgUrl) { - if (!wx) return; - var shareData = { - title: title, - desc: desc, - link: `${host}/${path}`, - imgUrl: imgUrl || window.__testImageUrl - || host + '/react/build/images/share_logo_icon.jpg' - }; - share(shareData) + requestForSignatrue(() => { + console.log('configShareForCustom', host) + + var shareData = { + title: title, + desc: desc, + link: `${host}/${path}`, + imgUrl: imgUrl || window.__testImageUrl + || host + '/react/build/images/share_logo_icon.jpg' + }; + share(shareData) + }) } diff --git a/public/react/src/context/TPIContextProvider.js b/public/react/src/context/TPIContextProvider.js index 2d58140e6..ee01c3c72 100644 --- a/public/react/src/context/TPIContextProvider.js +++ b/public/react/src/context/TPIContextProvider.js @@ -174,7 +174,7 @@ class TPIContextProvider extends Component { } let testPath = '' if (window.location.port == 3007) { - testPath = 'http://pre-newweb.educoder.net' + testPath = 'http://test-newweb.educoder.net' } // var url = `${testPath}/api/v1/games/${ game.identifier }/cost_time` var url = `${testPath}/api/tasks/${ game.identifier }/cost_time` diff --git a/public/react/src/modules/courses/ListPageIndex.js b/public/react/src/modules/courses/ListPageIndex.js index e025004e0..c16959ab9 100644 --- a/public/react/src/modules/courses/ListPageIndex.js +++ b/public/react/src/modules/courses/ListPageIndex.js @@ -93,13 +93,13 @@ class ListPageIndex extends Component{ } componentDidMount(){ - console.log("77"); + // console.log("77"); var yslGuideone = window.localStorage.getItem('yslGuideone'); - console.log("78"); - console.log(yslGuideone); + // console.log("78"); + // console.log(yslGuideone); try { if (yslGuideone === "true") { - console.log("true 字符串"); + // console.log("true 字符串"); this.setState({ yslGuideone:true, }) @@ -107,7 +107,7 @@ class ListPageIndex extends Component{ this.setState({ yslGuideone:false, }); - console.log("false 字符串"); + // console.log("false 字符串"); } }catch (e) { console.log(e); @@ -133,8 +133,7 @@ class ListPageIndex extends Component{ window.localStorage.setItem('yslGuideone', bool); try { if (bool === "true") { - console.log("115"); - console.log("true 字符串"); + this.setState({ yslGuideone:true, }) @@ -142,11 +141,10 @@ class ListPageIndex extends Component{ this.setState({ yslGuideone:false, }); - console.log("124"); - console.log("false 字符串"); + } }catch (e) { - console.log(e); + // console.log(e); this.setState({ yslGuideone:false, }); diff --git a/public/react/src/modules/courses/coursesPublic/NewShixunModel.js b/public/react/src/modules/courses/coursesPublic/NewShixunModel.js new file mode 100644 index 000000000..fbb97cbb5 --- /dev/null +++ b/public/react/src/modules/courses/coursesPublic/NewShixunModel.js @@ -0,0 +1,555 @@ +import React,{Component} from 'react'; +import { Modal,Checkbox,Select,Input,Tooltip,Spin,Icon,Drawer,Dropdown,Menu,Breadcrumb,Pagination,Button,notification} from "antd"; +import axios from'axios'; +import NoneData from "../coursesPublic/NoneData"; +import './Newshixunmodel.css'; +const Search = Input.Search; +class NewShixunModel extends Component{ + constructor(props){ + super(props) + this.state={ + shixun_list:undefined, + shixuns_count:undefined, + Grouplist:[], + allGrouplist:[{page:1,list:[]}], + page:1, + type:'all', + status:'all', + keyword:undefined, + order:'desc', + diff:0, + limit:15, + } + } + componentDidMount() { + let{page,type,keyword,order,diff,limit,status}=this.state; + this.getdatalist(page,type,status,keyword,order,diff,limit) + } + + getdatalist=(page,type,newstatus,keyword,order,diff,limit,pagetype)=>{ + this.setState({ + isspinning:true + }) + let status=this.props.statustype===undefined?newstatus:'published'; + let url="/shixun_lists.json" + axios.get(url,{params:{ + page, + type, + status, + keyword, + order, + diff, + limit + }}).then((response) => { + if(response.data){ + if(pagetype===undefined){ + this.setState({ + shixun_list:response.data.shixun_list, + shixuns_count:response.data.shixuns_count, + Grouplist:[], + isspinning:false + }) + }else if(pagetype==="pagetype"){ + this.setState({ + shixun_list:response.data.shixun_list, + shixuns_count:response.data.shixuns_count, + isspinning:false + }) + } + + } + }).catch((error) => { + this.setState({ + isspinning:false + }) + }) + } + + DropdownClick=(diff)=>{ + this.setState({ + diff:diff + }) + let{page,type,status,keyword,order,limit}=this.state; + this.getdatalist(page,type,status,keyword,order,diff,limit) + } + + ItsCourse=(item)=>{ + return + } + + getGrouplist=(Grouplist)=>{ + let {page,allGrouplist}=this.state; + let newallGrouplist=allGrouplist; + var a=newallGrouplist.find((value,index,arr)=>{ + return value.page==page + }); + + if(a!=undefined){ + newallGrouplist.map((item,key)=>{ + if(item.page===page){ + item.list=Grouplist + } + }) + } + + + let newGrouplist=[]; + + newallGrouplist.map((item,key)=>{ + item.list.map((items,ke)=>{ + newGrouplist.push(items) + }) + }) + + + this.setState({ + Grouplist: newGrouplist, + allGrouplist:newallGrouplist + }) + } + + PaginationCourse=(pageNumber)=>{ + let {allGrouplist}=this.state; + let newallGrouplist=allGrouplist; + var v=newallGrouplist.find((value,index,arr)=>{ + return value.page==pageNumber + }); + + if(v===undefined){ + newallGrouplist.push({page:pageNumber,list:[]}) + } + + let{type,status,keyword,order,diff,limit}=this.state; + this.getdatalist(pageNumber,type,status,keyword,order,diff,limit,"pagetype") + this.setState({ + page:pageNumber, + allGrouplist:newallGrouplist + }) + + } + + belongto=(value)=>{ + this.setState({ + type:value, + keyword:undefined, + page:1 + }) + let{status,order,diff,limit}=this.state; + this.getdatalist(1,value,status,undefined,order,diff,limit) + } + + updatedlist=(order)=>{ + + if(order==="desc"){ + this.setState({ + order:"asc" + }) + let{type,page,status,keyword,diff,limit}=this.state; + this.getdatalist(page,type,status,keyword,"asc",diff,limit) + }else{ + this.setState({ + order:"desc" + }) + let{type,page,status,keyword,diff,limit}=this.state; + this.getdatalist(page,type,status,keyword,"desc",diff,limit) + } + + } + + setdatafunsval=(e)=>{ + this.setState({ + keyword:e.target.value + }) + } + + setdatafuns=(value)=>{ + + this.setState({ + keyword:value, + type:undefined, + page:1, + status:'all', + order:'desc', + diff:0, + limit:15, + }) + this.getdatalist(1,undefined,'all',value,'desc',0,15) + } + + showNotification = (description, message = "提示", icon) => { + const data = { + message, + description + } + if (icon) { + data.icon = icon; + } + notification.open(data); + } + savecouseShixunModal=()=>{ + + this.setState({ + hometypepvisible:true + }) + let {coursesId}=this.props; + let{Grouplist}=this.state; + if(Grouplist.length===0){ + this.setState({ + hometypepvisible:false + }) + this.showNotification("请先选择实训") + return + } + + if (this.props.chooseShixun) { + if(Grouplist.length>1){ + this.setState({ + hometypepvisible:false + }) + this.showNotification("试卷选择的实训数不能大于1") + return + } + this.props.chooseShixun(Grouplist) + this.setState({ + hometypepvisible:false + }) + return; + } + + if (this.props.pathShixun) { + this.setState({ + hometypepvisible:false + }) + this.props.pathShixun(Grouplist) + return; + } + let url="/courses/"+coursesId+"/homework_commons/create_shixun_homework.json"; + axios.post(url, { + category_id:this.props.category_id===null||this.props.category_id===undefined?undefined:parseInt(this.props.category_id), + shixun_ids:Grouplist, + } + ).then((response) => { + if(response.data.status===-1){ + // this.props.showNotification(response.data.message) + + }else{ + // this.props.courseshomeworkstart(response.data.category_id,response.data.homework_ids) + this.showNotification("操作成功") + this.props.homeworkupdatalists(this.props.Coursename,this.props.page,this.props.order); + this.props.hideNewShixunModelType() + + } + this.setState({ + hometypepvisible:false + }) + // category_id: 3 + // homework_ids: (5) [9171, 9172, 9173, 9174, 9175] + }).catch((error) => { + console.log(error) + this.setState({ + hometypepvisible:false + }) + }) + } + + poststatus=(status)=>{ + this.setState({ + status:status + }) + let{page,type,keyword,order,diff,limit}=this.state; + this.getdatalist(page,type,status,keyword,order,diff,limit) + } + + render() { + + let {diff,Grouplist,status,shixun_list,shixuns_count,page,type,order}=this.state; + // let {visible,patheditarry}=this.props; + // console.log(Grouplist) + // console.log(allGrouplist) + const statusmenus=( + + ); + const menus = ( + + ); + + + + return( + +
@@ -716,32 +794,32 @@ class ExerciseReviewAndAnswer extends Component{
{
// 填空(一直都有调分),和简答题调分:老师身份 已经评分的才能出现调分按钮
- isAdmin && ((parseInt(item.answer_status) != 0 && item.question_type == 4) || item.question_type == 3) ?
-
{setTip}
:"" + list && list.length > 0 && list[0].setTip !="" ?{ list[0].setTip }
:"" }