diff --git a/app/controllers/games_controller.rb b/app/controllers/games_controller.rb
index c2f02c6ed..828198def 100644
--- a/app/controllers/games_controller.rb
+++ b/app/controllers/games_controller.rb
@@ -494,17 +494,10 @@ class GamesController < ApplicationController
path = path.try(:strip)
uid_logger("--rep_content: path is #{path}")
begin
- if @myshixun.repo_name.nil?
- g = Gitlab.client
- repo_name = g.project(@myshixun.gpid).path_with_namespace
- @myshixun.update_column(:repo_name, repo_name)
- @content = git_fle_content("#{repo_name}.git", path) || ""
- else
- @content = git_fle_content(@myshixun.repo_path, path) || ""
- end
-
+ @content = git_fle_content(@myshixun.repo_path, path) || ""
rescue Exception => e
# 思路: 异常首先应该考虑去恢复
+ # retry为1表示已经轮训完成后还没有解决问题,这个时候需要检测异常
if params[:retry].to_i == 1
begin
# 如果模板没有问题,则通过中间层检测实训仓库是否异常
@@ -542,7 +535,7 @@ class GamesController < ApplicationController
end
end
end
- # 有异常,版本库获取不到代码,前端轮训30S后,调用retry == 1
+ # 有异常,版本库获取不到代码,前端轮训15S后,调用retry == 1
tip_exception(0, e.message)
end
end
diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb
index a707536bb..07ad71ec1 100644
--- a/app/controllers/shixuns_controller.rb
+++ b/app/controllers/shixuns_controller.rb
@@ -514,6 +514,103 @@ class ShixunsController < ApplicationController
# 以前在开启挑战的时候检测实训是否更新,更新则重置,觉得应该放在TPI更好
# 中间需要一个过渡动画
# TODO: 第一次开启实训都会去判断是否是纯选择题类型,感觉做成在创建关卡的时候就判断该实训是否是纯选择题更加合适
+ def shixun_exec
+ if is_shixun_opening?
+ tip_show_exception(-3, "#{@shixun.opening_time.strftime('%Y-%m-%d %H:%M:%S')}")
+ end
+ current_myshixun = @shixun.current_myshixun(current_user.id)
+
+ min_challenges = @shixun.challenges.pluck(:id , :st)
+
+ Rails.logger.info("11111111112#{current_myshixun.try(:id)}")
+ Rails.logger.info("111111111102#{params[:reset] != 1}")
+
+ # 因为读写分离有延迟,所以如果是重置来的请求可以先跳过,重置过来的params[:reset]为1
+ if current_myshixun && params[:reset] != "1"
+ games = current_myshixun.games
+ # 如果TPM和TPI的管卡数不相等或者关卡顺序错了,说明实训被极大的改动,需要重置,实训发布前打过的实训都需要重置
+ if is_shixun_reset?(games, min_challenges, current_myshixun)
+ # 这里页面弹框要收到 当前用户myshixun的identifier.
+ tip_show_exception("/myshixuns/#{current_myshixun.try(:identifier)}/reset_my_game")
+ end
+
+ # 如果存在实训,则直接进入实训
+ # 如果实训允许跳关,传参params[:challenge_id]跳入具体的关卡
+ @current_task =
+ if params[:challenge_id]
+ game = games.where(challenge_id: params[:challenge_id]).take
+ if @shixun.task_pass || game.status != 3
+ game
+ else
+ current_myshixun.current_task(games)
+ end
+ else
+ current_myshixun.current_task(games)
+ end
+ else
+ # 如果未创建关卡一定不能开启实训,否则TPI没法找到当前的关卡
+ if @shixun.challenges_count == 0
+ tip_exception("开启实战前请先创建实训关卡")
+ end
+
+ # 判断实训是否全为选择题
+ is_choice_type = (min_challenges.size == min_challenges.select{|challenge| challenge.last == 1}.count)
+ if !is_choice_type
+ commit = GitService.commits(repo_path: @repo_path).try(:first)
+ uid_logger("First comit########{commit}")
+ tip_exception("开启实战前请先在版本库中提交代码") if commit.blank?
+ commit_id = commit["id"]
+ end
+
+ ActiveRecord::Base.transaction do
+ begin
+ cloud_bridge = edu_setting('cloud_bridge')
+ myshixun_identifier = generate_identifier Myshixun, 10
+ myshixun = @shixun.myshixuns.create!(user_id: current_user.id, identifier: myshixun_identifier,
+ modify_time: @shixun.modify_time, reset_time: @shixun.reset_time,
+ onclick_time: Time.now, commit_id: commit_id, repo_name: (is_choice_type ? "-1" : nil))
+ uid_logger("myshixun_id is #{myshixun.id}")
+
+
+ # 其它创建关卡等操作
+ challenges = @shixun.challenges
+ # 之所以增加user_id是为了方便统计查询性能
+ game_attrs = %i[challenge_id myshixun_id status user_id open_time identifier modify_time created_at updated_at]
+ Game.bulk_insert(*game_attrs) do |worker|
+ base_attr = { myshixun_id: myshixun.id, user_id: myshixun.user_id }
+ challenges.each_with_index do |challenge, index|
+ status = (index == 0 ? 0 : 3)
+ game_identifier = generate_identifier(Game, 12)
+ worker.add(base_attr.merge(challenge_id: challenge.id, status: status, open_time: Time.now,
+ identifier: game_identifier, modify_time: challenge.modify_time))
+ end
+ end
+
+ # 如果实训是纯选择题,则不需要去fork仓库以及中间层的相关操作了
+ unless is_choice_type
+ # fork仓库
+ project_fork(myshixun, @repo_path, current_user.login)
+
+ rep_url = Base64.urlsafe_encode64(repo_ip_url @repo_path )
+ uid_logger("start openGameInstance")
+ uri = "#{cloud_bridge}/bridge/game/openGameInstance"
+ logger.info("end openGameInstance")
+ params = {tpiID: "#{myshixun.id}", tpmGitURL:rep_url, tpiRepoName: myshixun.repo_name.split("/").last}
+ uid_logger("openGameInstance params is #{params}")
+ interface_post uri, params, 83, "实训云平台繁忙(繁忙等级:83)"
+ end
+
+ @current_task = myshixun.current_task(myshixun.games)
+ uid_logger("## shixun exec: myshixun id is #{myshixun.id}")
+ rescue Exception => e
+ uid_logger_error(e.message)
+ tip_exception("实训云平台繁忙(繁忙等级:81)")
+ raise ActiveRecord::Rollback
+ end
+ end
+ end
+ end
+
# def shixun_exec
# if is_shixun_opening?
# tip_show_exception(-3, "#{@shixun.opening_time.strftime('%Y-%m-%d %H:%M:%S')}")
@@ -521,10 +618,6 @@ class ShixunsController < ApplicationController
# current_myshixun = @shixun.current_myshixun(current_user.id)
#
# min_challenges = @shixun.challenges.pluck(:id , :st)
- #
- # Rails.logger.info("11111111112#{current_myshixun.try(:id)}")
- # Rails.logger.info("111111111102#{params[:reset] != 1}")
- #
# # 因为读写分离有延迟,所以如果是重置来的请求可以先跳过,重置过来的params[:reset]为1
# if current_myshixun && params[:reset] != "1"
# games = current_myshixun.games
@@ -541,7 +634,6 @@ class ShixunsController < ApplicationController
# current_myshixun.update_column(:repo_name, repo_name)
# end
#
- #
# # 如果存在实训,则直接进入实训
# # 如果实训允许跳关,传参params[:challenge_id]跳入具体的关卡
# @current_task =
@@ -570,159 +662,59 @@ class ShixunsController < ApplicationController
# commit_id = commit["id"]
# end
#
- # ActiveRecord::Base.transaction do
- # begin
- # cloud_bridge = edu_setting('cloud_bridge')
- # myshixun_identifier = generate_identifier Myshixun, 10
- # myshixun = @shixun.myshixuns.create!(user_id: current_user.id, identifier: myshixun_identifier,
- # modify_time: @shixun.modify_time, reset_time: @shixun.reset_time,
- # onclick_time: Time.now, commit_id: commit_id)
- # uid_logger("myshixun_id is #{myshixun.id}")
- #
- #
- # # 其它创建关卡等操作
- # challenges = @shixun.challenges
- # # 之所以增加user_id是为了方便统计查询性能
- # game_attrs = %i[challenge_id myshixun_id status user_id open_time identifier modify_time created_at updated_at]
- # Game.bulk_insert(*game_attrs) do |worker|
- # base_attr = { myshixun_id: myshixun.id, user_id: myshixun.user_id }
- # challenges.each_with_index do |challenge, index|
- # status = (index == 0 ? 0 : 3)
- # game_identifier = generate_identifier(Game, 12)
- # worker.add(base_attr.merge(challenge_id: challenge.id, status: status, open_time: Time.now,
- # identifier: game_identifier, modify_time: challenge.modify_time))
+ # begin
+ # ActiveRecord::Base.transaction do
+ # begin
+ # myshixun_identifier = generate_identifier Myshixun, 10
+ # myshixun_params = {user_id: current_user.id, identifier: myshixun_identifier,
+ # modify_time: @shixun.modify_time, reset_time: @shixun.reset_time,
+ # onclick_time: Time.now, commit_id: commit_id}
+ # @myshixun = @shixun.myshixuns.create!(myshixun_params)
+ # # 其它创建关卡等操作
+ # challenges = @shixun.challenges
+ # # 之所以增加user_id是为了方便统计查询性能
+ # game_attrs = %i[challenge_id myshixun_id status user_id open_time identifier modify_time created_at updated_at]
+ # Game.bulk_insert(*game_attrs) do |worker|
+ # base_attr = {myshixun_id: @myshixun.id, user_id: @myshixun.user_id}
+ # challenges.each_with_index do |challenge, index|
+ # status = (index == 0 ? 0 : 3)
+ # game_identifier = generate_identifier(Game, 12)
+ # worker.add(base_attr.merge(challenge_id: challenge.id, status: status, open_time: Time.now,
+ # identifier: game_identifier, modify_time: challenge.modify_time))
+ # end
# end
+ # @current_task = @myshixun.current_task(@myshixun.games)
+ # rescue Exception => e
+ # logger.error("------ActiveRecord::RecordInvalid: #{e.message}")
+ # raise("ActiveRecord::RecordInvalid")
# end
- #
- # # 如果实训是纯选择题,则不需要去fork仓库以及中间层的相关操作了
+ # end
+ # # 如果实训是纯选择题,则不需要去fork仓库以及中间层的相关操作了
+ # ActiveRecord::Base.transaction do
# unless is_choice_type
# # fork仓库
- # project_fork(myshixun, @repo_path, current_user.login)
- #
- # rep_url = Base64.urlsafe_encode64(repo_ip_url @repo_path )
+ # cloud_bridge = edu_setting('cloud_bridge')
+ # project_fork(@myshixun, @repo_path, current_user.login)
+ # rep_url = Base64.urlsafe_encode64(repo_ip_url @repo_path)
# uid_logger("start openGameInstance")
# uri = "#{cloud_bridge}/bridge/game/openGameInstance"
# logger.info("end openGameInstance")
- # params = {tpiID: "#{myshixun.id}", tpmGitURL:rep_url, tpiRepoName: myshixun.repo_name.split("/").last}
+ # params = {tpiID: "#{@myshixun.id}", tpmGitURL: rep_url, tpiRepoName: @myshixun.repo_name.split("/").last}
# uid_logger("openGameInstance params is #{params}")
# interface_post uri, params, 83, "实训云平台繁忙(繁忙等级:83)"
# end
- #
- # @current_task = myshixun.current_task(myshixun.games)
- # uid_logger("## shixun exec: myshixun id is #{myshixun.id}")
- # rescue Exception => e
- # uid_logger_error(e.message)
- # tip_exception("实训云平台繁忙(繁忙等级:81)")
- # raise ActiveRecord::Rollback
# end
+ # rescue Exception => e
+ # logger.info("shixun_exec error: #{e.message}")
+ # if e.message != "ActiveRecord::RecordInvalid"
+ # logger.error("##########project_fork error #{e.message}")
+ # @myshixun.destroy!
+ # end
+ # raise "实训云平台繁忙(繁忙等级:81)"
# end
# end
# end
- def shixun_exec
- if is_shixun_opening?
- tip_show_exception(-3, "#{@shixun.opening_time.strftime('%Y-%m-%d %H:%M:%S')}")
- end
- current_myshixun = @shixun.current_myshixun(current_user.id)
-
- min_challenges = @shixun.challenges.pluck(:id , :st)
- # 因为读写分离有延迟,所以如果是重置来的请求可以先跳过,重置过来的params[:reset]为1
- if current_myshixun && params[:reset] != "1"
- games = current_myshixun.games
- # 如果TPM和TPI的管卡数不相等或者关卡顺序错了,说明实训被极大的改动,需要重置,实训发布前打过的实训都需要重置
- if is_shixun_reset?(games, min_challenges, current_myshixun)
- # 这里页面弹框要收到 当前用户myshixun的identifier.
- tip_show_exception("/myshixuns/#{current_myshixun.try(:identifier)}/reset_my_game")
- end
-
-
- if current_myshixun.repo_name.nil?
- g = Gitlab.client
- repo_name = g.project(current_myshixun.gpid).try(:path_with_namespace)
- current_myshixun.update_column(:repo_name, repo_name)
- end
-
- # 如果存在实训,则直接进入实训
- # 如果实训允许跳关,传参params[:challenge_id]跳入具体的关卡
- @current_task =
- if params[:challenge_id]
- game = games.where(challenge_id: params[:challenge_id]).take
- if @shixun.task_pass || game.status != 3
- game
- else
- current_myshixun.current_task(games)
- end
- else
- current_myshixun.current_task(games)
- end
- else
- # 如果未创建关卡一定不能开启实训,否则TPI没法找到当前的关卡
- if @shixun.challenges_count == 0
- tip_exception("开启实战前请先创建实训关卡")
- end
-
- # 判断实训是否全为选择题
- is_choice_type = (min_challenges.size == min_challenges.select{|challenge| challenge.last == 1}.count)
- if !is_choice_type
- commit = GitService.commits(repo_path: @repo_path).try(:first)
- uid_logger("First comit########{commit}")
- tip_exception("开启实战前请先在版本库中提交代码") if commit.blank?
- commit_id = commit["id"]
- end
-
- begin
- ActiveRecord::Base.transaction do
- begin
- myshixun_identifier = generate_identifier Myshixun, 10
- myshixun_params = {user_id: current_user.id, identifier: myshixun_identifier,
- modify_time: @shixun.modify_time, reset_time: @shixun.reset_time,
- onclick_time: Time.now, commit_id: commit_id}
- @myshixun = @shixun.myshixuns.create!(myshixun_params)
- # 其它创建关卡等操作
- challenges = @shixun.challenges
- # 之所以增加user_id是为了方便统计查询性能
- game_attrs = %i[challenge_id myshixun_id status user_id open_time identifier modify_time created_at updated_at]
- Game.bulk_insert(*game_attrs) do |worker|
- base_attr = {myshixun_id: @myshixun.id, user_id: @myshixun.user_id}
- challenges.each_with_index do |challenge, index|
- status = (index == 0 ? 0 : 3)
- game_identifier = generate_identifier(Game, 12)
- worker.add(base_attr.merge(challenge_id: challenge.id, status: status, open_time: Time.now,
- identifier: game_identifier, modify_time: challenge.modify_time))
- end
- end
- @current_task = @myshixun.current_task(@myshixun.games)
- rescue Exception => e
- logger.error("------ActiveRecord::RecordInvalid: #{e.message}")
- raise("ActiveRecord::RecordInvalid")
- end
- end
- # 如果实训是纯选择题,则不需要去fork仓库以及中间层的相关操作了
- ActiveRecord::Base.transaction do
- unless is_choice_type
- # fork仓库
- cloud_bridge = edu_setting('cloud_bridge')
- project_fork(@myshixun, @repo_path, current_user.login)
- rep_url = Base64.urlsafe_encode64(repo_ip_url @repo_path)
- uid_logger("start openGameInstance")
- uri = "#{cloud_bridge}/bridge/game/openGameInstance"
- logger.info("end openGameInstance")
- params = {tpiID: "#{@myshixun.id}", tpmGitURL: rep_url, tpiRepoName: @myshixun.repo_name.split("/").last}
- uid_logger("openGameInstance params is #{params}")
- interface_post uri, params, 83, "实训云平台繁忙(繁忙等级:83)"
- end
- end
- rescue Exception => e
- logger.info("shixun_exec error: #{e.message}")
- if e.message != "ActiveRecord::RecordInvalid"
- logger.error("##########project_fork error #{e.message}")
- @myshixun.destroy!
- end
- raise "实训云平台繁忙(繁忙等级:81)"
- end
- end
- end
-
# gameID 及实训ID
# status: 0 , 1 申请过, 2,实训关卡路径未填, 3 实训标签未填, 4 实训未创建关卡
def publish
diff --git a/app/views/shixuns/index.json.jbuilder b/app/views/shixuns/index.json.jbuilder
index 8e5d49a34..d6cf7f4d1 100644
--- a/app/views/shixuns/index.json.jbuilder
+++ b/app/views/shixuns/index.json.jbuilder
@@ -7,4 +7,4 @@ json.pagination @total_count > 16 ? true : false
json.search_tags @search_tags
json.shixuns do
json.partial! 'shixun', locals: {shixuns: @shixuns}
-end
+end
\ No newline at end of file
diff --git a/db/migrate/20190805010546_modify_ke_contents_for_markdown.rb b/db/migrate/20190805010553_modify_ke_contents_for_markdown.rb
similarity index 62%
rename from db/migrate/20190805010546_modify_ke_contents_for_markdown.rb
rename to db/migrate/20190805010553_modify_ke_contents_for_markdown.rb
index 3d993cfb8..3460f2101 100644
--- a/db/migrate/20190805010546_modify_ke_contents_for_markdown.rb
+++ b/db/migrate/20190805010553_modify_ke_contents_for_markdown.rb
@@ -1,43 +1,43 @@
class ModifyKeContentsForMarkdown < ActiveRecord::Migration[5.2]
include ActionView::Helpers::SanitizeHelper
def change
- # def ke_transform_to_md content
- # return content if content.blank?
- # s_contents = sanitize(content, tags: %w(img a span table td tr tbody pre), attributes: %w(src href target style))
- # s_contents.gsub(/^(\n)/, "").gsub(/(\n)+/, "
").gsub(/$(\n)/, "")
- # .gsub(/(\n)+/, "
").gsub("\t", " ")
- # end
+ def ke_transform_to_md content
+ return content if content.blank?
+ s_contents = sanitize(content, tags: %w(img a span table td tr tbody pre), attributes: %w(src href target style))
+ s_contents.gsub(">\n<", "><").gsub(/^\n/, "").gsub(" ", "").gsub(/(\n)+/, "
")
+ .gsub("\t", "").gsub("\n", "").gsub(" ", " ").gsub(/(
)+/, "
")
+ end
#
# # 课程讨论区
# MessageDetail.find_each do |m|
# content = ke_transform_to_md m.content
# m.update_column(:content, content)
# end
- #
- # # 试卷的标题
+
+ #试卷的标题
# ExerciseQuestion.find_each do |eq|
# question_title = ke_transform_to_md eq.question_title
# eq.update_column(:question_title, question_title)
# end
- #
+
# # 试卷的答案
# ExerciseStandardAnswer.find_each do |esa|
# answer_text = ke_transform_to_md esa.answer_text
# esa.update_column(:answer_text, answer_text)
# end
#
- # # 试卷题库的问题标题
- # ExerciseBankQuestion.find_each do |ebq|
- # question_title = ke_transform_to_md ebq.question_title
- # ebq.update_column(:question_title, question_title)
- # end
+ # 试卷题库的问题标题
+ ExerciseBankQuestion.find_each do |ebq|
+ question_title = ke_transform_to_md ebq.question_title
+ ebq.update_column(:question_title, question_title)
+ end
#
# # 试卷答案
# ExerciseBankStandardAnswer.find_each do |ebsa|
# answer_text = ke_transform_to_md ebsa.answer_text
# ebsa.update_column(:answer_text, answer_text)
# end
- #
+
# # 问卷的标题
# PollQuestion.find_each do |pq|
# question_title = ke_transform_to_md pq.question_title
diff --git a/db/migrate/20190806062209_second_mofidy_ke_contents_for_md.rb b/db/migrate/20190806062209_second_mofidy_ke_contents_for_md.rb
index 044e6c0dd..3ba6f67f5 100644
--- a/db/migrate/20190806062209_second_mofidy_ke_contents_for_md.rb
+++ b/db/migrate/20190806062209_second_mofidy_ke_contents_for_md.rb
@@ -1,63 +1,64 @@
class SecondMofidyKeContentsForMd < ActiveRecord::Migration[5.2]
include ActionView::Helpers::SanitizeHelper
def change
- # def ke_transform_to_md content
- # return content if content.blank?
- # s_contents = sanitize(content, tags: %w(img a span table td tr tbody pre), attributes: %w(src href target style))
- # s_contents.gsub(/^(\n)/, "").gsub(/(\n)+/, "
").gsub(/$(\n)/, "")
- # .gsub(/(\n)+/, "
").gsub("\t", " ")
- # end
- #
- # # 作业
- # HomeworkCommon.find_each do |hc|
- # description = ke_transform_to_md hc.description
- # reference_answer = ke_transform_to_md hc.reference_answer
- # explanation = ke_transform_to_md hc.explanation
- # hc.update_attributes(description: description, reference_answer: reference_answer, explanation: explanation)
- # end
- #
- # # 作业题库
- # HomeworkBank.find_each do |hb|
- # description = ke_transform_to_md hb.description
- # reference_answer = ke_transform_to_md hb.reference_answer
- # hb.update_attributes(description: description, reference_answer: reference_answer)
- # end
- #
- # # 毕业任务
- # GraduationTask.find_each do |gt|
- # description = ke_transform_to_md gt.description
- # gt.update_column(:description, description)
- # end
- #
- # # 毕设选题
- # GraduationTopic.find_each do |gt|
- # description = ke_transform_to_md gt.description
- # gt.update_column(:description, description)
- # end
- #
- # # 毕设作品
- # GraduationWork.find_each do |gw|
- # description = ke_transform_to_md gw.description
- # gw.update_column(:description, description)
- # end
- #
- # # 毕设任务题库
- # GtaskBank.find_each do |gb|
- # description = ke_transform_to_md gb.description
- # gb.update_column(:description, description)
- # end
- #
- # # 毕设选题题库
- # GtopicBank.find_each do |gb|
- # description = ke_transform_to_md gb.description
- # gb.update_column(:description, description)
- # end
- #
- # # 交流问答
- # Memo.find_each do |m|
- # content = ke_transform_to_md m.content
- # m.update_column(:content, content)
- # end
+ def ke_transform_to_md content
+ return content if content.blank?
+ s_contents = sanitize(content, tags: %w(img a span table td tr tbody pre), attributes: %w(src href target style))
+ s_contents.gsub(">\n<", "><").gsub(/^\n/, "").gsub(" ", " ").gsub(/(\n)+/, "
")
+ .gsub("\t", " ").gsub("\n", "").gsub(" ", " ").gsub(/(
)+/, "
")
+
+ end
+
+ # 作业
+ HomeworkCommon.find_each do |hc|
+ description = ke_transform_to_md hc.description
+ reference_answer = ke_transform_to_md hc.reference_answer
+ explanation = ke_transform_to_md hc.explanation
+ hc.update_attributes(description: description, reference_answer: reference_answer, explanation: explanation)
+ end
+
+ # 作业题库
+ HomeworkBank.find_each do |hb|
+ description = ke_transform_to_md hb.description
+ reference_answer = ke_transform_to_md hb.reference_answer
+ hb.update_attributes(description: description, reference_answer: reference_answer)
+ end
+
+ # 毕业任务
+ GraduationTask.find_each do |gt|
+ description = ke_transform_to_md gt.description
+ gt.update_column(:description, description)
+ end
+
+ # 毕设选题
+ GraduationTopic.find_each do |gt|
+ description = ke_transform_to_md gt.description
+ gt.update_column(:description, description)
+ end
+
+ # 毕设作品
+ GraduationWork.find_each do |gw|
+ description = ke_transform_to_md gw.description
+ gw.update_column(:description, description)
+ end
+
+ # 毕设任务题库
+ GtaskBank.find_each do |gb|
+ description = ke_transform_to_md gb.description
+ gb.update_column(:description, description)
+ end
+
+ # 毕设选题题库
+ GtopicBank.find_each do |gb|
+ description = ke_transform_to_md gb.description
+ gb.update_column(:description, description)
+ end
+
+ # 交流问答
+ Memo.find_each do |m|
+ content = ke_transform_to_md m.content
+ m.update_column(:content, content)
+ end
end
end
diff --git a/db/migrate/20190806063903_third_modify_ke_for_student_work.rb b/db/migrate/20190806063903_third_modify_ke_for_student_work.rb
index 8c7fb0b29..7af64bac1 100644
--- a/db/migrate/20190806063903_third_modify_ke_for_student_work.rb
+++ b/db/migrate/20190806063903_third_modify_ke_for_student_work.rb
@@ -1,17 +1,17 @@
class ThirdModifyKeForStudentWork < ActiveRecord::Migration[5.2]
include ActionView::Helpers::SanitizeHelper
def change
- # def ke_transform_to_md content
- # return content if content.blank?
- # s_contents = sanitize(content, tags: %w(img a span table td tr tbody pre), attributes: %w(src href target style))
- # s_contents.gsub(/^(\n)/, "").gsub(/(\n)+/, "
").gsub(/$(\n)/, "")
- # .gsub(/(\n)+/, "
").gsub("\t", " ")
- # end
- #
- # # 学生的作品 过滤掉一些描述的ke图片的作品
- # StudentWork.where("description is not null and LENGTH(description) < 1000000").find_each do |sw|
- # description = ke_transform_to_md sw.description
- # sw.update_column(:description, description)
- # end
+ def ke_transform_to_md content
+ return content if content.blank?
+ s_contents = sanitize(content, tags: %w(img a span table td tr tbody pre), attributes: %w(src href target style))
+ s_contents.gsub(">\n<", "><").gsub(/^\n/, "").gsub(" ", " ").gsub(/(\n)+/, "
")
+ .gsub("\t", " ").gsub("\n", "").gsub(" ", " ").gsub(/(
)+/, "
")
+ end
+
+ # 学生的作品 过滤掉一些描述的ke图片的作品
+ StudentWork.where("description is not null and LENGTH(description) < 1000000").find_each do |sw|
+ description = ke_transform_to_md sw.description
+ sw.update_column(:description, description)
+ end
end
end
diff --git a/lib/tasks/check_reponame.rake b/lib/tasks/check_reponame.rake
index e00846aeb..35ca56ad4 100644
--- a/lib/tasks/check_reponame.rake
+++ b/lib/tasks/check_reponame.rake
@@ -19,7 +19,7 @@ namespace :myshixun do
challenges = shixun.challenges
# 如果是选择题,则把myshixuns表的repo_name改成-1
if challenges.select{|challenge| challenge.st.to_i == 1}.size == challenges.count
- puts myshixun.games.first.try(:identifier)
+ myshixun.update_attributes(:repo_name => "-1")
end
end
end
diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js
index 97cfa8eeb..c7bd7d307 100644
--- a/public/react/src/AppConfig.js
+++ b/public/react/src/AppConfig.js
@@ -17,6 +17,7 @@ function locationurl(list){
window.location.replace(list)
}
}
+let hashTimeout
// TODO 开发期多个身份切换
let debugType =""
@@ -137,6 +138,18 @@ export function initAxiosInterceptors(props) {
}
throw new axios.Cancel('Operation canceled by the user.');
+ } else {
+ // hash跳转
+ var hash = window.location.hash;
+ if (hash) {
+ hashTimeout && window.clearTimeout(hashTimeout)
+ hashTimeout = setTimeout(() => {
+ var element = document.querySelector(hash);
+ if (element) {
+ element.scrollIntoView();
+ }
+ }, 400)
+ }
}
// if(response.data.status === 401){
// console.log("401401401")
diff --git a/public/react/src/modules/forums/MemoDetail.js b/public/react/src/modules/forums/MemoDetail.js
index e08f321a4..78242866e 100644
--- a/public/react/src/modules/forums/MemoDetail.js
+++ b/public/react/src/modules/forums/MemoDetail.js
@@ -189,7 +189,7 @@ class MemoDetail extends Component {
let filesize = item.filesize
attachments.push(
-