Merge branch 'develop' into educoder

dev_bj
daiao 6 years ago
commit 8bb477ce1e

@ -3389,7 +3389,7 @@ end
@is_remote = true @is_remote = true
@users_pages = Paginator.new @users_count, @limit, params['page'] || 1 @users_pages = Paginator.new @users_count, @limit, params['page'] || 1
@offset ||= @users_pages.offset @offset ||= @users_pages.offset
@users = paginateHelper users.includes(:real_name_authentication_apply, :professional_authentication_apply, @users = paginateHelper users.preload(:real_name_authentication_apply, :professional_authentication_apply,
user_extensions: [:department, :school]), @limit user_extensions: [:department, :school]), @limit
respond_to do |format| respond_to do |format|

@ -333,7 +333,7 @@ class MyshixunsController < ApplicationController
shixun_tomcat = Redmine::Configuration['shixun_tomcat'] shixun_tomcat = Redmine::Configuration['shixun_tomcat']
uri = "#{shixun_tomcat}/bridge/webssh/getConnectInfo" uri = "#{shixun_tomcat}/bridge/webssh/getConnectInfo"
user_id = User.current.id user_id = User.current.id
params = {tpiID:@myshixun.id, podType:@myshixun.shixun.try(:webssh), containers:(Base64.urlsafe_encode64(container_limit @myshixun.shixun.mirror_repositories))} params = {tpiID:@myshixun.id, podType:@myshixun.shixun.try(:webssh), containers:(Base64.urlsafe_encode64(shixun_container_limit @myshixun.shixun))}
res = uri_exec uri, params res = uri_exec uri, params
if res && res['code'].to_i != 0 if res && res['code'].to_i != 0
raise("实训云平台繁忙繁忙等级92") raise("实训云平台繁忙繁忙等级92")
@ -362,7 +362,7 @@ class MyshixunsController < ApplicationController
begin begin
uri = "#{shixun_tomcat}/bridge/vnc/getvnc" uri = "#{shixun_tomcat}/bridge/vnc/getvnc"
shixun = @myshixun.shixun shixun = @myshixun.shixun
params = {tpiID: @myshixun.id, :containers => "#{Base64.urlsafe_encode64(container_limit(shixun.mirror_repositories))}"} params = {tpiID: @myshixun.id, :containers => "#{Base64.urlsafe_encode64(shixun_container_limit(shixun))}"}
res = uri_exec uri, params res = uri_exec uri, params
if res && res['code'].to_i != 0 if res && res['code'].to_i != 0
raise("实训云平台繁忙繁忙等级99") raise("实训云平台繁忙繁忙等级99")

@ -791,7 +791,7 @@ class ShixunsController < ApplicationController
shixun_script = modify_shixun_script @shixun, shixun_script shixun_script = modify_shixun_script @shixun, shixun_script
end end
end end
@shixun.evaluate_script = shixun_script #@shixun.evaluate_script = shixun_script
ActiveRecord::Base.transaction do ActiveRecord::Base.transaction do
begin begin
@ -808,10 +808,13 @@ class ShixunsController < ApplicationController
@shixun.shixun_members << m @shixun.shixun_members << m
# 镜像-实训关联表 # 镜像-实训关联表
ShixunMirrorRepository.create!(:shixun_id => @shixun.id, :mirror_repository_id => main_type.to_i) if main_type.present? ShixunMirrorRepository.create!(:shixun_id => @shixun.id, :mirror_repository_id => main_type.to_i) if main_type.present?
# 创建Pod配置信息
ShixunServiceConfig.create!(:shixun_id => @shixun.id, :mirror_repository_id => main_type.to_i)
if sub_type.present? if sub_type.present?
sub_mirrors = sub_type.split(",").map(&:to_i) sub_mirrors = sub_type.split(",").map(&:to_i)
sub_mirrors.each do |mirror| sub_mirrors.each do |mirror|
ShixunMirrorRepository.create!(:shixun_id => @shixun.id, :mirror_repository_id => mirror) ShixunMirrorRepository.create!(:shixun_id => @shixun.id, :mirror_repository_id => mirror)
ShixunServiceConfig.create!(:shixun_id => @shixun.id, :mirror_repository_id => mirror)
end end
end end
# 自动构建版本库 # 自动构建版本库
@ -1025,6 +1028,7 @@ class ShixunsController < ApplicationController
end end
def update def update
logger.info("#######-----#{params[:config]}")
@shixun.attributes = params[:shixun] @shixun.attributes = params[:shixun]
#@shixun.language = params[:language] #@shixun.language = params[:language]
@shixun.trainee = params[:trainee] @shixun.trainee = params[:trainee]
@ -1058,6 +1062,19 @@ class ShixunsController < ApplicationController
end end
end end
# 超级管理员才能保存 中间层服务器pod信息的配置
if User.current.admin? || User.current.business?
@shixun.shixun_service_configs.each_with_index do |config, index|
config.update_attributes(:cpu_limit => params[:cpu_limit][index],
:lower_cpu_limit => params[:lower_cpu_limit][index],
:memory_limit => params[:memory_limit][index],
# :resource_limit => params[:resource_limit][index],
:request_limit => params[:request_limit][index],
:mirror_repository_id => params[:mirror_id][index])
end
end
ActiveRecord::Base.transaction do ActiveRecord::Base.transaction do
begin begin

@ -268,6 +268,24 @@ module ApplicationHelper
return container.to_json return container.to_json
end end
def shixun_container_limit shixun
container = []
shixun.shixun_service_configs.each do |config|
mirror = config.mirror_repository
if mirror.name.present?
container << {:image => mirror.name,
:cpuLimit => config.cpu_limit,
:cpuRequest => config.lower_cpu_limit,
:memoryLimit => "#{config.memory_limit}M",
:memoryRequest => "#{config.request_limit}",
:resourceLimit => "#{config.resource_limit}K",
:type => mirror.try(:main_type) == "1" ? "main" : "sub"}
end
end
Rails.logger.info("#########container: #{container.to_json}")
return container.to_json
end
# 实训作品列表的提交状态 # 实训作品列表的提交状态
def list_work_status work, homework, course_group_id def list_work_status work, homework, course_group_id
if work.work_status == 0 if work.work_status == 0

@ -20,7 +20,7 @@ class Challenge < ActiveRecord::Base
# validates_presence_of :score # validates_presence_of :score
validates_presence_of :task_pass validates_presence_of :task_pass
validates_length_of :subject, :maximum => 255 validates_length_of :subject, :maximum => 255
scope :min, lambda { select([:id, :subject, :position, :shixun_id, :st, :score, :path, :task_pass, :modify_time, :web_route, :answer]) } scope :min, lambda { select([:id, :subject, :position, :shixun_id, :st, :score, :exec_time, :path, :task_pass, :modify_time, :web_route, :answer]) }
scope :choose_type, lambda{where(st: 1)} scope :choose_type, lambda{where(st: 1)}
scope :practice_type, lambda{where(st: 0)} scope :practice_type, lambda{where(st: 0)}

@ -52,10 +52,10 @@ class Shixun < ActiveRecord::Base
has_many :exercise_bank_shixun_challenges, :dependent => :destroy has_many :exercise_bank_shixun_challenges, :dependent => :destroy
has_many :tag_repertoires, :through => :shixun_tag_repertoires has_many :tag_repertoires, :through => :shixun_tag_repertoires
has_many :shixun_tag_repertoires, :dependent => :destroy has_many :shixun_tag_repertoires, :dependent => :destroy
has_many :shixun_service_configs, :dependent => :destroy
scope :visible, lambda{where(status: [2,3])} scope :visible, lambda{where(status: [2,3])}
scope :min, lambda { select([:id, :name, :gpid, :modify_time, :reset_time, :language, :propaedeutics, :status, :identifier, scope :min, lambda { select([:id, :name, :gpid, :modify_time, :reset_time, :language, :status, :identifier,
:test_set_permission, :hide_code, :forbid_copy, :hidden, :webssh, :user_id, :code_hidden, :test_set_permission, :hide_code, :forbid_copy, :hidden, :webssh, :user_id, :code_hidden,
:task_pass, :exec_time, :multi_webssh, :vnc]) } :task_pass, :exec_time, :multi_webssh, :vnc]) }
scope :published, lambda{where(status: 2)} scope :published, lambda{where(status: 2)}
@ -66,6 +66,18 @@ class Shixun < ActiveRecord::Base
#scope :visible, -> { where(status: -1) } #scope :visible, -> { where(status: -1) }
after_create :send_tiding after_create :send_tiding
def description
self.has_attribute?(:description) ? self[:description] : ""
end
def propaedeutics
self.has_attribute?(:propaedeutics) ? self[:propaedeutics] : ""
end
def evaluate_script
self.has_attribute?(:evaluate_script) ? self[:evaluate_script] : ""
end
def should_compile? def should_compile?
self.mirror_repositories.published_main_mirror.first.try(:should_compile) self.mirror_repositories.published_main_mirror.first.try(:should_compile)
end end

@ -0,0 +1,7 @@
class ShixunServiceConfig < ActiveRecord::Base
# attr_accessible :title, :body
# image_type: 镜像类型: 1 主镜像、2子镜像
belongs_to :shixun
belongs_to :mirror_repository
end

@ -42,7 +42,7 @@ class GamesService
is_teacher = (user.user_extensions.identity == 0) is_teacher = (user.user_extensions.identity == 0)
tpm_identifier = shixun.try(:identifier) tpm_identifier = shixun.try(:identifier)
# 实训超时设置 # 实训超时设置
time_limit = shixun.exec_time time_limit = game_challenge.exec_time
# 高性能取上一关、下一关 # 高性能取上一关、下一关
prev_game = Game.prev_identifier(shixun.id, game.myshixun_id, game_challenge.position) prev_game = Game.prev_identifier(shixun.id, game.myshixun_id, game_challenge.position)
@ -82,7 +82,7 @@ class GamesService
shixun_tomcat = Redmine::Configuration['shixun_tomcat'] shixun_tomcat = Redmine::Configuration['shixun_tomcat']
service_host = Redmine::Configuration['vnc_url'] service_host = Redmine::Configuration['vnc_url']
uri = "#{shixun_tomcat}/bridge/vnc/getvnc" uri = "#{shixun_tomcat}/bridge/vnc/getvnc"
params = {tpiID: myshixun.id, :containers => "#{Base64.urlsafe_encode64(container_limit(shixun.mirror_repositories))}"} params = {tpiID: myshixun.id, :containers => "#{Base64.urlsafe_encode64(shixun_container_limit(shixun))}"}
res = uri_exec uri, params res = uri_exec uri, params
if res && res['code'].to_i != 0 if res && res['code'].to_i != 0
raise("实训云平台繁忙繁忙等级99") raise("实训云平台繁忙繁忙等级99")
@ -573,7 +573,7 @@ class GamesService
content_modified = params[:content_modified] # 决定文件内容是否有修改有修改如果中间成pull没有更新则轮询等待更新 content_modified = params[:content_modified] # 决定文件内容是否有修改有修改如果中间成pull没有更新则轮询等待更新
params = {:tpiID => "#{myshixun.id}", :tpiGitURL => "#{gitUrl}", :buildID => "#{taskId}",:instanceChallenge => "#{step}", params = {:tpiID => "#{myshixun.id}", :tpiGitURL => "#{gitUrl}", :buildID => "#{taskId}",:instanceChallenge => "#{step}",
:testCases => "#{testCases}", :resubmit => "#{resubmit}", :times => params[:first].to_i, :podType => shixun.webssh, :testCases => "#{testCases}", :resubmit => "#{resubmit}", :times => params[:first].to_i, :podType => shixun.webssh,
:containers => "#{Base64.urlsafe_encode64(container_limit(shixun.mirror_repositories))}", :tpmScript => "#{tpmScript}", :containers => "#{Base64.urlsafe_encode64(shixun_container_limit(shixun))}", :tpmScript => "#{tpmScript}",
:timeLimit => "#{shixun.exec_time}", :content_modified => content_modified, :persistenceName => shixun.identifier, :timeLimit => "#{shixun.exec_time}", :content_modified => content_modified, :persistenceName => shixun.identifier,
:isPublished => (shixun.status < 2 ? 0 : 1), :sec_key => params[:sec_key]} :isPublished => (shixun.status < 2 ? 0 : 1), :sec_key => params[:sec_key]}

@ -82,6 +82,52 @@
<span class="color-orange mt7 fl ml20 none" id="stage_name_notice"><i class="fa fa-exclamation-circle mr3"></i>必填项</span> <span class="color-orange mt7 fl ml20 none" id="stage_name_notice"><i class="fa fa-exclamation-circle mr3"></i>必填项</span>
</div> </div>
</div> </div>
<div class="edu-back-white padding40-20 mb20">
<p class="color-grey-6 font-16 mb30">服务配置</p>
<div class="clearfix mb5">
<label class="panel-form-label fl">评测时限(S)</label>
<div class="pr fl with80 status_con">
<input type="text" name="challenge[exec_time]" value="<%= @challenge.exec_time %>" class="panel-box-sizing task-form-100 task-height-40"
placeholder="请输入类别名称"/>
</div>
<div class="cl"></div>
</div>
<%# if User.current.admin? %>
<!-- <div class="clearfix mb5">-->
<!-- <label class="panel-form-label fl">CPU(核)</label>-->
<!-- <div class="pr fl with80 status_con">-->
<!-- <input type="text" name="challenge[cpu_limit]" value="<%#= @challenge.cpu_limit %>" class="panel-box-sizing task-form-100 task-height-40"-->
<!-- placeholder="请输入类别名称"/>-->
<!-- </div>-->
<!-- <div class="cl"></div>-->
<!-- </div>-->
<!-- <div class="clearfix mb5">-->
<!-- <label class="panel-form-label fl">最低CPU(核)</label>-->
<!-- <div class="pr fl with80 status_con">-->
<!-- <input type="text" name="challenge[lower_cpu_limit]" value="<%#= @challenge.lower_cpu_limit %>" class="panel-box-sizing task-form-100 task-height-40"-->
<!-- placeholder="请输入类别名称"/>-->
<!-- </div>-->
<!-- <div class="cl"></div>-->
<!-- </div>-->
<!-- <div class="clearfix mb5">-->
<!-- <label class="panel-form-label fl">内存限制(M)</label>-->
<!-- <div class="pr fl with80 status_con">-->
<!-- <input type="text" name="challenge[memory_limit]" value="<%#= @challenge.memory_limit %>" class="panel-box-sizing task-form-100 task-height-40"-->
<!-- placeholder="请输入类别名称"/>-->
<!-- </div>-->
<!-- <div class="cl"></div>-->
<!-- </div>-->
<!-- <div class="clearfix mb5">-->
<!-- <label class="panel-form-label fl">内存要求(M)</label>-->
<!-- <div class="pr fl with80 status_con">-->
<!-- <input type="text" name="challenge[request_limit]" value="<%#= @challenge.request_limit %>" class="panel-box-sizing task-form-100 task-height-40"-->
<!-- placeholder="请输入类别名称"/>-->
<!-- </div>-->
<!-- <div class="cl"></div>-->
<!-- </div>-->
<%# end %>
</div>
<% end %> <% end %>
<div class="clearfix mt30"> <div class="clearfix mt30">
<a href="javascript:void(0)" class="defalutSubmitbtn fl mr20" onclick="challenge_update()">提交</a> <a href="javascript:void(0)" class="defalutSubmitbtn fl mr20" onclick="challenge_update()">提交</a>

@ -55,6 +55,20 @@
<% end %> <% end %>
</div> </div>
</div> </div>
<div class="edu-back-white padding40-20 mb20">
<p class="color-grey-6 font-16 ">评测时限(S)</p>
<input type="text" value="<%= @challenge.exec_time %>" class="winput-240-40" disabled/>
<%# if User.current.admin? %>
<!-- <p class="color-grey-6 font-16 mt10">CPU(核)</p>-->
<!-- <input type="text" value="<%#= @challenge.cpu_limit %>" class="winput-240-40" disabled/>-->
<!-- <p class="color-grey-6 font-16 mt10">最低CPU(核)</p>-->
<!-- <input type="text" value="<%#= @challenge.lower_cpu_limit %>" class="winput-240-40" disabled/>-->
<!-- <p class="color-grey-6 font-16 mt10">内存限制(M)</p>-->
<!-- <input type="text" value="<%#= @challenge.memory_limit %>" class="winput-240-40" disabled/>-->
<!-- <p class="color-grey-6 font-16 mt10">内存要求(M)</p>-->
<!-- <input type="text" value="<%#= @challenge.request_limit %>" class="winput-240-40" disabled/>-->
<%# end %>
</div>
<% end %> <% end %>
<script> <script>
$(document).ready(function() { $(document).ready(function() {

@ -1,6 +1,11 @@
<style> <style>
.down-select .magic-radio + label:before, .down-select .magic-checkbox + label:before {top: 10px !important;} .down-select .magic-radio + label:before, .down-select .magic-checkbox + label:before {
.down-select .magic-checkbox + label:after {top: 10px !important} top: 10px !important;
}
.down-select .magic-checkbox + label:after {
top: 10px !important
}
</style> </style>
<div class="educontent mt30 mb80"> <div class="educontent mt30 mb80">
<%= form_for(@shixun) do |f| %> <%= form_for(@shixun) do |f| %>
@ -53,7 +58,7 @@
<input type="text" class="input-100-40 pr20 color-grey-3 font-14 pointer" id="tech_platform_list" readonly value="<%= @shixun.shixun_main_name %>" placeholder="请选择主类别"/> <input type="text" class="input-100-40 pr20 color-grey-3 font-14 pointer" id="tech_platform_list" readonly value="<%= @shixun.shixun_main_name %>" placeholder="请选择主类别"/>
<div class="down-select" id="shixun_language_option"> <div class="down-select" id="shixun_language_option">
<% @main_type.try(:each) do |type| %> <% @main_type.try(:each) do |type| %>
<p data-shixun-value="<%= type.id %>" title="<%= type.description.blank? ? "无描述" : type.description %>"><%= type.type_name %></p> <p data-shixun-value="<%= type.id %>" title="<%= type.description.blank? ? "无描述" : type.description %>"><%= type.type_name %></p>
<% end %> <% end %>
</div> </div>
</div> </div>
@ -65,10 +70,10 @@
<input type="text" class="input-100-40 pr20 color-grey-3 font-14 pointer" readonly value="<%= @shixun.shixun_child_name %>" placeholder="请选择小类别"/> <input type="text" class="input-100-40 pr20 color-grey-3 font-14 pointer" readonly value="<%= @shixun.shixun_child_name %>" placeholder="请选择小类别"/>
<div class="down-select" id="shixun_small_language_option" style="padding: 2px 0px"> <div class="down-select" id="shixun_small_language_option" style="padding: 2px 0px">
<% @small_type.try(:each) do |type| %> <% @small_type.try(:each) do |type| %>
<p data-shixun-value="<%= type.id %>"> <p data-shixun-value="<%= type.id %>">
<input type="checkbox" class="magic-checkbox" id="mirror_<%= type.id %>" value="<%= type.type_name %>"/> <input type="checkbox" class="magic-checkbox" id="mirror_<%= type.id %>" value="<%= type.type_name %>"/>
<label style="top:0px" for="mirror_<%= type.id %>"><%= type.type_name %></label> <label style="top:0px" for="mirror_<%= type.id %>"><%= type.type_name %></label>
</p> </p>
<% end %> <% end %>
</div> </div>
</div> </div>
@ -85,16 +90,16 @@
<div class="clearfix"> <div class="clearfix">
<div class="with15 pr fl" <%= @power ? "select-for" : "" %>> <div class="with15 pr fl" <%= @power ? "select-for" : "" %>>
<input type="hidden" name="mirror_script" id="shixun_scenario" value="<%= @shixun.script_tag.try(:id) %>"> <input type="hidden" name="mirror_script" id="shixun_scenario" value="<%= @shixun.script_tag.try(:id) %>">
<input type="text" id="shixun_scenario_name" class="task-height-40 task-form-100 panel-box-sizing pr20 color-grey3 font-14" readonly placeholder="请选择脚本" value="<%= @shixun.script_tag.try(:script_type) ? @shixun.script_tag.try(:script_type) : "无" %>"/> <input type="text" id="shixun_scenario_name" class="task-height-40 task-form-100 panel-box-sizing pr20 color-grey3 font-14" readonly placeholder="请选择脚本" value="<%= @shixun.script_tag.try(:script_type) ? @shixun.script_tag.try(:script_type) : "无" %>"/>
<div class="down-select bor-grey-e user_bg_shadow" id="shixun_scenario_option"> <div class="down-select bor-grey-e user_bg_shadow" id="shixun_scenario_option">
<p data-shixun-value="-1" title="无">无</p> <p data-shixun-value="-1" title="无">无</p>
<% @shixun.standrad_script.each do |script| %> <% @shixun.standrad_script.each do |script| %>
<p data-shixun-value="<%= script.id %>" title="<%= script.script_type %>"><%= script.script_type %></p> <p data-shixun-value="<%= script.id %>" title="<%= script.script_type %>"><%= script.script_type %></p>
<% end %> <% end %>
</div> </div>
</div> </div>
<% if @power %> <% if @power %>
<a href="javascript:void(0)" onclick="define_temp();" id="define_template" class="color-orange-tip mt7 ml20 fl">使用自定义脚本</a> <a href="javascript:void(0)" onclick="define_temp();" id="define_template" class="color-orange-tip mt7 ml20 fl">使用自定义脚本</a>
<% end %> <% end %>
<div class="cl"></div> <div class="cl"></div>
<p class="clearfix mt10" id="script_description"><%= @shixun.script_tag.try(:description) %></p> <p class="clearfix mt10" id="script_description"><%= @shixun.script_tag.try(:description) %></p>
@ -138,42 +143,42 @@
其它参数可按实际需求定制 其它参数可按实际需求定制
</p> </p>
</div> </div>
<p class="inviteTipbtn with100 fl"><a href="javascript:void(0);" onclick="$('#test_script_tip').hide();">知道了</a></p> <p class="inviteTipbtn with100 fl">
<a href="javascript:void(0);" onclick="$('#test_script_tip').hide();">知道了</a></p>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="mb10 edu-back-white padding40-20"> <div class="mb10 edu-back-white padding40-20">
<div class="clearfix mb20"> <div class="clearfix mb20">
<p class="color-grey-6 font-16 mb30 fl">发布信息</p> <p class="color-grey-6 font-16 mb30 fl">发布信息</p>
<div class="clearfix"> <div class="clearfix">
<span class="color-grey-6 mt5 fl" style="min-width: 95px;"><span class="color-orange fl mr5 mt3">*</span>面向学员:</span> <span class="color-grey-6 mt5 fl" style="min-width: 95px;"><span class="color-orange fl mr5 mt3">*</span>面向学员:</span>
<div class="with15 fl pr" select-for> <div class="with15 fl pr" select-for>
<input type="hidden" name="trainee" id="shixun_trainee" value="<%= @shixun.trainee %>"> <input type="hidden" name="trainee" id="shixun_trainee" value="<%= @shixun.trainee %>">
<input type="text" class="task-height-40 task-form-100 panel-box-sizing pr20 color-grey3 font-14" placeholder="面向学员" readonly value="<%= @shixun.shixun_trainee %>"/> <input type="text" class="task-height-40 task-form-100 panel-box-sizing pr20 color-grey3 font-14" placeholder="面向学员" readonly value="<%= @shixun.shixun_trainee %>"/>
<div class="down-select bor-grey-e user_bg_shadow" id="shixun_trainee_option"> <div class="down-select bor-grey-e user_bg_shadow" id="shixun_trainee_option">
<p data-shixun-value="1">初级学员</p> <p data-shixun-value="1">初级学员</p>
<p data-shixun-value="2">中级学员</p> <p data-shixun-value="2">中级学员</p>
<p data-shixun-value="3">高级学员</p> <p data-shixun-value="3">高级学员</p>
<p data-shixun-value="3">顶级学员</p> <p data-shixun-value="3">顶级学员</p>
</div>
</div> </div>
<span class="fl ml10 mt6 color-grey">标签,不限定用户群体</span>
</div> </div>
<span class="fl ml10 mt6 color-grey">标签,不限定用户群体</span>
</div>
</div> </div>
<div class="clearfix mt20"> <div class="clearfix mt20">
<span class="color-grey-6 mt5 fl" style="min-width: 95px;">复制:</span> <span class="color-grey-6 mt5 fl" style="min-width: 95px;">复制:</span>
<span class="fl"> <span class="fl">
<input type="checkbox" <%= @shixun.can_copy ? 'checked' : "" %> name="can_copy" value="<%= @shixun.can_copy ? 1 : 0 %>" id="can_copy" class="ml5 mr5 magic-checkbox"> <input type="checkbox" <%= @shixun.can_copy ? 'checked' : "" %> name="can_copy" value="<%= @shixun.can_copy ? 1 : 0 %>" id="can_copy" class="ml5 mr5 magic-checkbox">
<label style="top:6px" class="color-grey-6" for="can_copy">勾选则平台所有已职业认证的教师可以复制</label> <label style="top:6px" class="color-grey-6" for="can_copy">勾选则平台所有已职业认证的教师可以复制</label>
</span> </span>
</div> </div>
<div class="clearfix mt20"> <div class="clearfix mt20">
<span class="color-grey-6 mt5 fl" style="min-width: 95px;">跳关:</span> <span class="color-grey-6 mt5 fl" style="min-width: 95px;">跳关:</span>
<span class="fl"> <span class="fl">
<input type="checkbox" <%= @shixun.task_pass ? 'checked' : "" %> name="task_pass" value="<%= @shixun.task_pass ? 1 : 0 %>" id="task_pass" class="ml5 mr5 magic-checkbox"> <input type="checkbox" <%= @shixun.task_pass ? 'checked' : "" %> name="task_pass" value="<%= @shixun.task_pass ? 1 : 0 %>" id="task_pass" class="ml5 mr5 magic-checkbox">
<label style="top:6px" class="color-grey-6" for="task_pass">勾选则允许学员跳关挑战实训</label> <label style="top:6px" class="color-grey-6" for="task_pass">勾选则允许学员跳关挑战实训</label>
</span> </span>
@ -197,7 +202,7 @@
<div class="clearfix mt20"> <div class="clearfix mt20">
<span class="color-grey-6 mt5 fl" style="min-width: 95px;">代码目录隐藏:</span> <span class="color-grey-6 mt5 fl" style="min-width: 95px;">代码目录隐藏:</span>
<span class="fl"> <span class="fl">
<input type="checkbox" <%= @shixun.code_hidden ? 'checked' : "" %> name="code_hidden" value="<%= @shixun.code_hidden ? 1 : 0 %>" id="code_hidden" class="ml5 mr5 magic-checkbox"> <input type="checkbox" <%= @shixun.code_hidden ? 'checked' : "" %> name="code_hidden" value="<%= @shixun.code_hidden ? 1 : 0 %>" id="code_hidden" class="ml5 mr5 magic-checkbox">
<label style="top:6px" class="color-grey-6" for="code_hidden">勾选则对学员隐藏版本库目录</label> <label style="top:6px" class="color-grey-6" for="code_hidden">勾选则对学员隐藏版本库目录</label>
</span> </span>
@ -212,13 +217,13 @@
</div> </div>
<% if User.current.admin? %> <% if User.current.admin? %>
<div class="clearfix mt20"> <div class="clearfix mt20">
<span class="color-grey-6 mt5 fl" style="min-width: 95px;">VNC图形化:</span> <span class="color-grey-6 mt5 fl" style="min-width: 95px;">VNC图形化:</span>
<span class="fl"> <span class="fl">
<input type="checkbox" <%= @shixun.vnc ? 'checked' : "" %> name="vnc" value="<%= @shixun.vnc ? 1 : 0 %>" id="vnc" class="ml5 mr5 magic-checkbox"> <input type="checkbox" <%= @shixun.vnc ? 'checked' : "" %> name="vnc" value="<%= @shixun.vnc ? 1 : 0 %>" id="vnc" class="ml5 mr5 magic-checkbox">
<label style="top:6px" class="color-grey-6" for="vnc">勾选则给学员的实践任务提供Ubuntu系统图形化实践窗口否则不提供</label> <label style="top:6px" class="color-grey-6" for="vnc">勾选则给学员的实践任务提供Ubuntu系统图形化实践窗口否则不提供</label>
</span> </span>
</div> </div>
<% end %> <% end %>
</div> </div>
@ -227,7 +232,7 @@
<div class="df"> <div class="df">
<span class="mr30 color-orange pt10">*</span> <span class="mr30 color-orange pt10">*</span>
<div class="flex1 mr20"> <div class="flex1 mr20">
<%= f.text_field :exec_time, :class => "fl input-48-45 width20 greyInput", :placeholder => "请输入程序执行时间" %> <%= f.text_field :exec_time, :class => "fl input-48-45 width20 greyInput", :placeholder => "请输入程序执行时间" %>
<span class="fl ml10 mt6 color-grey">秒</span> <span class="fl ml10 mt6 color-grey">秒</span>
</div> </div>
<div style="width: 57px;"> <div style="width: 57px;">
@ -282,290 +287,342 @@
<%= render_shixun_departments %> <%= render_shixun_departments %>
</ul> </ul>
</div> </div>
<a class="edu-default-btn edu-blueline-btn fl mt1" href="javascript:void(0)" onclick="$('#person-unit').show();$('#person-unit').find('input').val('');$('#scope-down-list').hide();">+ 添加</a> <a class="edu-default-btn edu-blueline-btn fl mt1" href="javascript:void(0)" onclick="$('#person-unit').show();$('#person-unit').find('input').val('');$('#scope-down-list').hide();">+
添加</a>
</div> </div>
<span class="color-orange ml20 fl none" id="public_unit_notice"><i class="fa fa-exclamation-circle mr3"></i>请选择需要公开的单位</span> <span class="color-orange ml20 fl none" id="public_unit_notice"><i class="fa fa-exclamation-circle mr3"></i>请选择需要公开的单位</span>
</div> </div>
</div> </div>
<% end %> <% end %>
<% if User.current.admin? || User.cuurent.business? %>
<div class="edu-back-white padding40-20 mb20">
<p class="color-grey-6 font-16 mb30">服务配置</p>
<% @shixun.shixun_service_configs.each do |config| %>
<p class="color-grey-6 font-16 mt30"><%= config.mirror_repository.try(:type_name) %></p>
<input type="hidden" name="mirror_id[]" value="<%= config.mirror_repository.try(:id) %>'">
<div class="clearfix mb5">
<label class="panel-form-label fl">CPU(核)</label>
<div class="pr fl with80 status_con">
<input type="text" name="cpu_limit[]" value="<%= config.cpu_limit %>" class="panel-box-sizing task-form-100 task-height-40"
placeholder="请输入类别名称"/>
</div>
<div class="cl"></div>
</div>
<div class="clearfix mb5">
<label class="panel-form-label fl">最低CPU(核)</label>
<div class="pr fl with80 status_con">
<input type="text" name="lower_cpu_limit[]" value="<%= config.lower_cpu_limit %>" class="panel-box-sizing task-form-100 task-height-40"
placeholder="请输入类别名称"/>
</div>
<div class="cl"></div>
</div>
<div class="clearfix mb5">
<label class="panel-form-label fl">内存限制(M)</label>
<div class="pr fl with80 status_con">
<input type="text" name="memory_limit[]" value="<%= config.memory_limit %>" class="panel-box-sizing task-form-100 task-height-40"
placeholder="请输入类别名称"/>
</div>
<div class="cl"></div>
</div>
<div class="clearfix mb5">
<label class="panel-form-label fl">内存要求(M)</label>
<div class="pr fl with20 status_con">
<input type="text" name="request_limit[]" value="<%= config.request_limit %>" class="panel-box-sizing task-form-100 task-height-40"
placeholder="请输入类别名称"/>
</div>
<label class="panel-form-label fl" style="width: 48%">温馨提示纯编程类型实训建议使用默认值对于大数据等建议使用最大内存的30%</label>
<div class="cl"></div>
</div>
<div class="clearfix mt30">
<a href="javascript:void(0)" class="defalutSubmitbtn fl mr20" onclick="submit_edit_shixun(<%= @shixun.id %>);">保存</a> <!-- <div class="clearfix mb5">-->
<%= link_to "取消", settings_shixun_path(@shixun), :class => "defalutCancelbtn fl" %> <!-- <label class="panel-form-label fl">磁盘限制(K)</label>-->
</div> <!-- <div class="pr fl with80 status_con">-->
<!-- <input type="text" name="resource_limit[]" value="<%#= config.resource_limit %>" class="panel-box-sizing task-form-100 task-height-40"-->
<!-- placeholder="请输入类别名称"/>-->
<!-- </div>-->
<!-- <div class="cl"></div>-->
<!-- </div>-->
<% end %>
</div>
<% end %>
<div class="clearfix mt30">
<a href="javascript:void(0)" class="defalutSubmitbtn fl mr20" onclick="submit_edit_shixun(<%= @shixun.id %>);">保存</a>
<%= link_to "取消", settings_shixun_path(@shixun), :class => "defalutCancelbtn fl" %>
</div>
<% end %> <% end %>
</div> </div>
<script> <script>
//配置-信息提交 //配置-信息提交
function submit_edit_shixun(id) { function submit_edit_shixun(id) {
if (regex_shixun_name() && regex_public_unit() && regex_tech_platform()) { if (regex_shixun_name() && regex_public_unit() && regex_tech_platform()) {
if(script_Codemirror.getValue().trim() == ""){ if (script_Codemirror.getValue().trim() == "") {
$("#test_script_code").show(); $("#test_script_code").show();
$(document).scrollTop(parseInt($("#test_script_code").offset().top)-150); $(document).scrollTop(parseInt($("#test_script_code").offset().top) - 150);
return; return;
}else{ } else {
$("#test_script_code").hide(); $("#test_script_code").hide();
} }
if($("#shixun_exec_time").val() == "") if ($("#shixun_exec_time").val() == "")
return; return;
$("#edit_shixun_" + id).submit(); $("#edit_shixun_" + id).submit();
} }
} }
function get_mirror_script(){ function get_mirror_script() {
$select.siblings("input[type=hidden]").attr("value", hideValue); $select.siblings("input[type=hidden]").attr("value", hideValue);
$select.siblings("input[type=text]").attr("value", textValue); $select.siblings("input[type=text]").attr("value", textValue);
$parent.hide(); $parent.hide();
var script_id = $("#shixun_scenario").val(); var script_id = $("#shixun_scenario").val();
$.ajax({ $.ajax({
url: "<%= get_script_contents_shixun_path(@shixun) %>", url: "<%= get_script_contents_shixun_path(@shixun) %>",
data: {script_id: script_id}, data: {script_id: script_id},
success: function(data){ success: function (data) {
script_Codemirror.setValue(data.contents); script_Codemirror.setValue(data.contents);
$("#script_description").html(data.description); $("#script_description").html(data.description);
notice_box("评测脚本生成成功!"); notice_box("评测脚本生成成功!");
}, },
error: function(){ error: function () {
notice_box("获取脚本失败!") notice_box("获取脚本失败!")
} }
}) })
} }
//自定义模板弹框 //自定义模板弹框
function define_temp(){ function define_temp() {
var html = "<%= j(render :partial => 'define_scenario') %>"; var html = "<%= j(render :partial => 'define_scenario') %>";
pop_box_new(html,400,400); pop_box_new(html, 400, 400);
} }
//下拉框 //下拉框
$("[select-for]").append("<i class='fa fa-sort-desc lesson_img color-grey-8'></i>"); $("[select-for]").append("<i class='fa fa-sort-desc lesson_img color-grey-8'></i>");
$("[select-for]").hover(function(){ $("[select-for]").hover(function () {
$(this).find(".down-select").show(); $(this).find(".down-select").show();
},function(){ }, function () {
$(this).find(".down-select").hide(); $(this).find(".down-select").hide();
}); });
var $select, hideValue, textValue, $parent; var $select, hideValue, textValue, $parent;
$("[select-for] .down-select p").live("click",function(){ $("[select-for] .down-select p").live("click", function () {
$select = $(this).parents(".down-select"); $select = $(this).parents(".down-select");
hideValue = $(this).attr("data-shixun-value"); hideValue = $(this).attr("data-shixun-value");
textValue = $(this).html().trim(); textValue = $(this).html().trim();
$parent = $(this).parent(); $parent = $(this).parent();
var parentId = $(this).parent().attr("id"); var parentId = $(this).parent().attr("id");
if(parentId != "shixun_scenario_option"){ if (parentId != "shixun_scenario_option") {
$select.siblings("input[type=hidden]").attr("value", hideValue); $select.siblings("input[type=hidden]").attr("value", hideValue);
$select.siblings("input[type=text]").attr("value", textValue); $select.siblings("input[type=text]").attr("value", textValue);
$parent.hide(); $parent.hide();
} }
if(parentId == "shixun_language_option"){ if (parentId == "shixun_language_option") {
var mirror_id = $("#shixun_main_language").val(); var mirror_id = $("#shixun_main_language").val();
$.ajax({ $.ajax({
url: "<%= get_mirror_script_shixuns_path %>", url: "<%= get_mirror_script_shixuns_path %>",
data: { mirror_id: mirror_id}, data: {mirror_id: mirror_id},
success: function(data){ success: function (data) {
var lens = data.length; var lens = data.length;
var htmlContents = ""; var htmlContents = "";
$("#shixun_scenario").val(""); $("#shixun_scenario").val("");
$("#shixun_scenario_name").val(""); $("#shixun_scenario_name").val("");
for(var i = 0; i < lens; i++){ for (var i = 0; i < lens; i++) {
htmlContents += "<p data-shixun-value=\"" + data[i].mirror_script.id + "\" " + "title=\"" + data[i].mirror_script.script_type +"\">"+ data[i].mirror_script.script_type +"</p>" htmlContents += "<p data-shixun-value=\"" + data[i].mirror_script.id + "\" " + "title=\"" + data[i].mirror_script.script_type + "\">" + data[i].mirror_script.script_type + "</p>"
} }
$("#shixun_scenario_option").html(htmlContents); $("#shixun_scenario_option").html(htmlContents);
}, },
error: function(){ error: function () {
notice_box("获取技术平台失败!") notice_box("获取技术平台失败!")
} }
}); });
} }
if(parentId == "shixun_scenario_option"){ if (parentId == "shixun_scenario_option") {
op_confirm_tip("原有脚本将被新的脚本覆盖,无法撤销<br/>是否确认执行覆盖操作","get_mirror_script"); op_confirm_tip("原有脚本将被新的脚本覆盖,无法撤销<br/>是否确认执行覆盖操作", "get_mirror_script");
} }
}); });
$("input[name='webssh']").on("click", function(){ $("input[name='webssh']").on("click", function () {
if($(this).val() == 2){ if ($(this).val() == 2) {
$("#multi_webssh").parent().show(); $("#multi_webssh").parent().show();
} else{ } else {
$("#multi_webssh").parent().hide(); $("#multi_webssh").parent().hide();
$("#multi_webssh").attr("checked", false); $("#multi_webssh").attr("checked", false);
} }
}); });
/*----------------------------选择镜像小类别--------------*/ /*----------------------------选择镜像小类别--------------*/
$("[select-more]").append("<i class='fa fa-sort-desc lesson_img color-grey-8'></i>"); $("[select-more]").append("<i class='fa fa-sort-desc lesson_img color-grey-8'></i>");
$("[select-more]").hover(function () { $("[select-more]").hover(function () {
$(this).find(".down-select").show(); $(this).find(".down-select").show();
}, function () { }, function () {
$(this).find(".down-select").hide(); $(this).find(".down-select").hide();
}); });
$("[select-more] .down-select p input").bind("click", function () { $("[select-more] .down-select p input").bind("click", function () {
var all = $(this).parents(".down-select"); var all = $(this).parents(".down-select");
var arr = ""; var arr = "";
var idarr = []; var idarr = [];
for (var i = 0; i < all.find("input").length; i++) { for (var i = 0; i < all.find("input").length; i++) {
if (all.find("input").eq(i).is(':checked')) { if (all.find("input").eq(i).is(':checked')) {
arr += ";" + (all.find("input").eq(i).attr("value")); arr += ";" + (all.find("input").eq(i).attr("value"));
idarr.push(all.find("input").eq(i).parents("p").attr("data-shixun-value")); idarr.push(all.find("input").eq(i).parents("p").attr("data-shixun-value"));
} }
} }
$("input[name='small_type']").val(idarr); $("input[name='small_type']").val(idarr);
$(this).parents().prev("input").val(arr.substring(1)); $(this).parents().prev("input").val(arr.substring(1));
//$(this).parents(".down-select").hide(); //$(this).parents(".down-select").hide();
}); });
$(function () { $(function () {
//选择自定义脚本 //选择自定义脚本
$("#diy_script").click(function(){ $("#diy_script").click(function () {
var html = "<%= j(render :partial => 'define_scenario') %>"; var html = "<%= j(render :partial => 'define_scenario') %>";
pop_box_new(html,400,400); pop_box_new(html, 400, 400);
}); });
$("#webssh").on("click", function(){ $("#webssh").on("click", function () {
$(this).val() == '0' ? $(this).val('1') : $(this).val("0"); $(this).val() == '0' ? $(this).val('1') : $(this).val("0");
}); });
$("#vnc").on("click", function(){ $("#vnc").on("click", function () {
$(this).val() == '0' ? $(this).val('1') : $(this).val("0"); $(this).val() == '0' ? $(this).val('1') : $(this).val("0");
}); });
$("#can_copy").on("click", function(){ $("#can_copy").on("click", function () {
$(this).val() == '0' ? $(this).val('1') : $(this).val("0"); $(this).val() == '0' ? $(this).val('1') : $(this).val("0");
}); });
$("#unlock_test_set").on("click", function(){ $("#unlock_test_set").on("click", function () {
$(this).val() == '0' ? $(this).val('1') : $(this).val("0"); $(this).val() == '0' ? $(this).val('1') : $(this).val("0");
}); });
$("#code_hidden").on("click", function(){ $("#code_hidden").on("click", function () {
$(this).val() == '0' ? $(this).val('1') : $(this).val("0"); $(this).val() == '0' ? $(this).val('1') : $(this).val("0");
}); });
$("#forbid_copy").on("click", function(){ $("#forbid_copy").on("click", function () {
$(this).val() == '0' ? $(this).val('1') : $(this).val("0"); $(this).val() == '0' ? $(this).val('1') : $(this).val("0");
}); });
$("#hide_code").on("click", function(){ $("#hide_code").on("click", function () {
$(this).val() == '0' ? $(this).val('1') : $(this).val("0"); $(this).val() == '0' ? $(this).val('1') : $(this).val("0");
}); });
$("#task_pass").on("click", function(){ $("#task_pass").on("click", function () {
$(this).val() == '0' ? $(this).val('1') : $(this).val("0"); $(this).val() == '0' ? $(this).val('1') : $(this).val("0");
}); });
$("#scope-down-list").find("li").live("click",function(){ $("#scope-down-list").find("li").live("click", function () {
var ul=$(this).parent("ul"); var ul = $(this).parent("ul");
var div=$(this).parents("#unit-input-part"); var div = $(this).parents("#unit-input-part");
var value=$(this).html(); var value = $(this).html();
ul.siblings("#for_part_search").val(value); ul.siblings("#for_part_search").val(value);
var width=value.length*2; var width = value.length * 2;
var label="<label class=\"fl unit-part mb10\"><input type='text' size='" + width + "' id='scope_partment' name='scope_partment[]' readonly value='"+value+"'><span class=\"color-orange03 ml5 eud-pointer\">×</span></label>"; var label = "<label class=\"fl unit-part mb10\"><input type='text' size='" + width + "' id='scope_partment' name='scope_partment[]' readonly value='" + value + "'><span class=\"color-orange03 ml5 eud-pointer\">×</span></label>";
div.before(label); div.before(label);
ul.siblings("#for_part_search").attr("data-value-was",value); ul.siblings("#for_part_search").attr("data-value-was", value);
$("#person-unit").hide(); $("#person-unit").hide();
$("#scope-down-list").hide(); $("#scope-down-list").hide();
}); });
$(".unit-part").find("span").live("click",function(){ $(".unit-part").find("span").live("click", function () {
$(this).parents(".unit-part").remove(); $(this).parents(".unit-part").remove();
}); });
if($("#public-part").is(":checked")){ if ($("#public-part").is(":checked")) {
$("#person-unit").show(); $("#person-unit").show();
$("#person-unit").find("input").val(""); $("#person-unit").find("input").val("");
// $(".unit-part").remove(); // $(".unit-part").remove();
$("#unit-all").show(); $("#unit-all").show();
} }
$("input[name='public_degree']").live("click",function(){ $("input[name='public_degree']").live("click", function () {
var item=$(this).attr("id"); var item = $(this).attr("id");
if($(this).is(":checked") && item == "public-part"){ if ($(this).is(":checked") && item == "public-part") {
$("#person-unit").show(); $("#person-unit").show();
$("#person-unit").find("input").val(""); $("#person-unit").find("input").val("");
//$(".unit-part").remove(); //$(".unit-part").remove();
$("#unit-all").show(); $("#unit-all").show();
}else{ } else {
$("#unit-all").hide(); $("#unit-all").hide();
} }
}); });
$("body").on("click",function(e){ $("body").on("click", function (e) {
//alert($(e.target).attr("id")); //alert($(e.target).attr("id"));
if($(e.target).attr("id") != "person-unit"){ if ($(e.target).attr("id") != "person-unit") {
$("#scope-down-list").hide(); $("#scope-down-list").hide();
} }
}); });
//设置编辑时显示的单位 //设置编辑时显示的单位
$(".unit-part input").each(function(){ $(".unit-part input").each(function () {
$(this).attr("size",parseInt($(this).val().length)*2); $(this).attr("size", parseInt($(this).val().length) * 2);
}) })
}); });
//申请新建 //申请新建
function post_apply() { function post_apply() {
var html = "<%= escape_javascript(render :partial => 'shixuns/apply_setnew') %>"; var html = "<%= escape_javascript(render :partial => 'shixuns/apply_setnew') %>";
pop_box_new(html, 460, 416); pop_box_new(html, 460, 416);
} }
var setting_editormd = editormd("setting_introduction", { var setting_editormd = editormd("setting_introduction", {
width : "100%", width: "100%",
height : 210, height: 210,
syncScrolling : "single", syncScrolling: "single",
//你的lib目录的路径我这边用JSP做测试的 //你的lib目录的路径我这边用JSP做测试的
path : "/editormd/lib/", path: "/editormd/lib/",
tex : true, tex: true,
toolbarIcons : function() { toolbarIcons: function () {
// Or return editormd.toolbarModes[name]; // full, simple, mini // Or return editormd.toolbarModes[name]; // full, simple, mini
// Using "||" set icons align right. // Using "||" set icons align right.
return ["bold", "italic", "|", "list-ul", "list-ol", "|", "code", "code-block", "|", "testIcon", "testIcon1", '|', "image", "table", '|', "watch", "clear" ] return ["bold", "italic", "|", "list-ul", "list-ol", "|", "code", "code-block", "|", "testIcon", "testIcon1", '|', "image", "table", '|', "watch", "clear"]
}, },
toolbarCustomIcons : { toolbarCustomIcons: {
testIcon : "<a type=\"inline\" class=\"latex\" ><div class='zbg'></div></a>", testIcon: "<a type=\"inline\" class=\"latex\" ><div class='zbg'></div></a>",
testIcon1 : "<a type=\"latex\" class=\"latex\" ><div class='zbg_latex'></div></a>" testIcon1: "<a type=\"latex\" class=\"latex\" ><div class='zbg_latex'></div></a>"
}, },
onload: function(){ onload: function () {
$("#setting_introduction [type=\"latex\"]").bind("click", function(){ $("#setting_introduction [type=\"latex\"]").bind("click", function () {
setting_editormd.cm.replaceSelection("```latex"); setting_editormd.cm.replaceSelection("```latex");
setting_editormd.cm.replaceSelection("\n"); setting_editormd.cm.replaceSelection("\n");
setting_editormd.cm.replaceSelection("\n"); setting_editormd.cm.replaceSelection("\n");
setting_editormd.cm.replaceSelection("```"); setting_editormd.cm.replaceSelection("```");
var __Cursor = setting_editormd.cm.getDoc().getCursor(); var __Cursor = setting_editormd.cm.getDoc().getCursor();
setting_editormd.cm.setCursor(__Cursor.line-1, 0); setting_editormd.cm.setCursor(__Cursor.line - 1, 0);
}); });
$("#setting_introduction [type=\"inline\"]").bind("click", function(){ $("#setting_introduction [type=\"inline\"]").bind("click", function () {
setting_editormd.cm.replaceSelection("$$$$"); setting_editormd.cm.replaceSelection("$$$$");
var __Cursor = setting_editormd.cm.getDoc().getCursor(); var __Cursor = setting_editormd.cm.getDoc().getCursor();
setting_editormd.cm.setCursor(__Cursor.line, __Cursor.ch-2); setting_editormd.cm.setCursor(__Cursor.line, __Cursor.ch - 2);
setting_editormd.cm.focus(); setting_editormd.cm.focus();
}); });
$("[type=\"inline\"]").attr("title", "行内公式"); $("[type=\"inline\"]").attr("title", "行内公式");
$("[type=\"latex\"]").attr("title", "多行公式"); $("[type=\"latex\"]").attr("title", "多行公式");
}, },
//这个配置在simple.html中并没有但是为了能够提交表单使用这个配置可以让构造出来的HTML代码直接在第二个隐藏的textarea域中方便post提交表单。 //这个配置在simple.html中并没有但是为了能够提交表单使用这个配置可以让构造出来的HTML代码直接在第二个隐藏的textarea域中方便post提交表单。
saveHTMLToTextarea : true, saveHTMLToTextarea: true,
autoFocus: false, autoFocus: false,
// 用于增加自定义工具栏的功能可以直接插入HTML标签不使用默认的元素创建图标 // 用于增加自定义工具栏的功能可以直接插入HTML标签不使用默认的元素创建图标
dialogMaskOpacity : 0.6, dialogMaskOpacity: 0.6,
placeholder: "请输入完成当前任务依赖的知识点或者其它相关信息", placeholder: "请输入完成当前任务依赖的知识点或者其它相关信息",
imageUpload : true, imageUpload: true,
imageFormats : ["jpg", "jpeg", "gif", "png", "bmp", "webp", "JPG", "JPEG", "GIF", "PNG", "BMP", "WEBP"], imageFormats: ["jpg", "jpeg", "gif", "png", "bmp", "webp", "JPG", "JPEG", "GIF", "PNG", "BMP", "WEBP"],
imageUploadURL : "<%= upload_with_markdown_path(:container_id => @shixun.id, :container_type => @shixun.class) %>" //url imageUploadURL: "<%= upload_with_markdown_path(:container_id => @shixun.id, :container_type => @shixun.class) %>" //url
}); });
md_elocalStorage(setting_editormd, "shixun_edit_<%= User.current.id %>", "in"); md_elocalStorage(setting_editormd, "shixun_edit_<%= User.current.id %>", "in");
var script_Codemirror = CodeMirror.fromTextArea(document.getElementById("shixun_script"), { var script_Codemirror = CodeMirror.fromTextArea(document.getElementById("shixun_script"), {
lineNumbers: true, lineNumbers: true,
theme: "default", theme: "default",
// extraKeys: {"Ctrl-Q": "autocomplete"}, // 快捷键 // extraKeys: {"Ctrl-Q": "autocomplete"}, // 快捷键
indentUnit: 4, //代码缩进为一个tab的距离 indentUnit: 4, //代码缩进为一个tab的距离
matchBrackets: true, matchBrackets: true,
autoRefresh: true, autoRefresh: true,
smartIndent: true,//智能换行 smartIndent: true,//智能换行
styleActiveLine: true, styleActiveLine: true,
lint: true lint: true
}); });
script_Codemirror.setSize("auto","600px"); script_Codemirror.setSize("auto", "600px");
// 非管理员只能查看 // 非管理员只能查看
</script> </script>

@ -0,0 +1,14 @@
class CreateShixunServiceConfigs < ActiveRecord::Migration
def change
create_table :shixun_service_configs do |t|
t.references :shixun
t.integer :cpu_limit, :default => 1
t.integer :memory_limit, :default => 1024
t.integer :request_limit, :default => 10
t.float :lower_cpu_limit, :default => 0.1
t.integer :resource_limit, :default => 10000
t.references :mirror_repository
t.timestamps
end
end
end

@ -0,0 +1,19 @@
class AddLimitForShixuns < ActiveRecord::Migration
def up
Shixun.find_each do |shixun|
shixun.challenges.update_all(:exec_time => shixun.exec_time)
shixun.mirror_repositories.each do |mirror|
ShixunServiceConfig.create!(:shixun_id => shixun.id,
:cpu_limit => mirror.cpu_limit,
:memory_limit => mirror.memory_limit,
:request_limit => mirror.memory_limit / 3,
:mirror_repository_id => mirror.id)
end
end
end
def down
end
end

@ -0,0 +1,5 @@
FactoryGirl.define do
factory :shixun_service_config do
end
end

@ -0,0 +1,5 @@
require 'rails_helper'
RSpec.describe ShixunServiceConfig, :type => :model do
pending "add some examples to (or delete) #{__FILE__}"
end
Loading…
Cancel
Save