Merge branch 'dev_shixun_project' of https://git.trustie.net/jacknudt/trustieforge into dev_shixun_project

This commit is contained in:
huang 2017-03-15 17:58:22 +08:00
commit 6f49950caa
4 changed files with 293 additions and 262 deletions

View File

@ -1,111 +1,140 @@
<li class="clearfix">
<label class=" panel-form-label fl"><span class="c_red mr5">*</span>名称:</label>
<%= f.text_field :subject, :class => "panel-form-width-690 panel-form-height-30 fl", :no_label => true, :placeholder => "请输入当前任务的名称(此信息将提前泄露给学员)" %>
</li>
<li class="clearfix">
<label class=" panel-form-label fl">预备知识:</label>
<%= f.text_area :ready_knowledge, :class => "panel-form-width-690 panel-form-height-150 fl task-textarea-pd", :no_label => true, :placeholder => "请输入完成当前任务依赖的知识点或者其它相关信息,指导学员完成任务" %>
</li>
<li class="clearfix">
<label class=" panel-form-label fl"><span class="c_red mr5">*</span>过关任务:</label>
<%= f.text_area :task_pass, :class => "panel-form-width-690 panel-form-height-150 fl task-textarea-pd", :no_label => true %>
</li>
<li class="clearfix">
<label class=" panel-form-label fl">样例设置:</label>
<ul class="fl task-bg-grey ">
<li class="clearfix">
<p class="clearfix">
<span class="color-green fb fl">样例1</span>
<span class="color-grey fr" style="font-size:12px;">温馨提示:输入样例供学员参考。</span>
</p>
<input type="text" class="panel-form-width-670 panel-form-height-30 mb10" placeholder="样例输入" />
<input type="text" class="panel-form-width-670 panel-form-height-30 " placeholder="样例输出" />
</li>
<li class="clearfix">
<p class="clearfix">
<span class="color-green fb fl">样例2</span>
<a href="#" title="增加"><i class="fa fa-plus-circle color-grey font-16 ml10 fl mt12"></i></a>
<a href="#" title="删除"><i class="fa fa-times-circle color-grey font-16 ml10 fl mt12"></i></a>
</p>
<input type="text" class="panel-form-width-670 panel-form-height-30 mb10" placeholder="样例输入" />
<input type="text" class="panel-form-width-670 panel-form-height-30 " placeholder="样例输出" />
</li>
</ul>
</li>
<li class="clearfix">
<label class=" panel-form-label fl">测试集设置:</label>
<ul class="fl task-bg-grey ">
<li class="clearfix">
<p class="clearfix">
<span class="color-green fb fl">测试1</span>
<span class="color-grey fr" style="font-size:12px;">温馨提示:在学员"提交评测"时进行自动检测。</span>
</p>
<input type="text" class="panel-form-width-670 panel-form-height-30 mb10" placeholder="测试输入" />
<input type="text" class="panel-form-width-670 panel-form-height-30 " placeholder="测试输出" />
</li>
<li class="clearfix">
<p class="clearfix">
<span class="color-green fb fl">测试2</span>
<a href="#" title="增加"><i class="fa fa-plus-circle color-grey font-16 ml10 fl mt12"></i></a>
<a href="#" title="删除"><i class="fa fa-times-circle color-grey font-16 ml10 fl mt12"></i></a>
</p>
<input type="text" class="panel-form-width-670 panel-form-height-30 mb10" placeholder="测试输入" />
<input type="text" class="panel-form-width-670 panel-form-height-30 " placeholder="测试输出" />
</li>
</ul>
</li>
<li class="clearfix">
<label class=" panel-form-label fl"> 知识/技能点:</label>
<div class="fl task-bd-grey">
<div class="task-tag tag-grey mb10 mr10 fl">
<button data-dismiss="alert" class="close fr mt3 ml5" type="button">×</button>
使用交互模式的 Python3 解释器
<%= javascript_include_tag 'homework', 'baiduTemplate', 'jquery.datetimepicker.js' %>
<script id="t:sample-answer-list" type="text/html">
<li class="clearfix">
<p class="clearfix">
<span class="color-green fb fl" name="sample_inputs_label"></span>
<a href="javascript:void(0)" title="增加" class="test_icon_add"><i class="fa fa-plus-circle color-grey font-16 ml10 fl mt12"></i></a>
<a href="javascript:void(0)" title="删除" class="test_icon_remove"><i class="fa fa-times-circle color-grey font-16 ml10 fl mt12"></i></a>
</p>
<input type="text" class="panel-form-width-670 panel-form-height-30 mb10" name="program[input][]" id="textarea_input_test" placeholder="样例输入" />
<input type="text" class="panel-form-width-670 panel-form-height-30" name="program[output][]" id="textarea_output_test" placeholder="样例输出" />
</li>
</script>
<div id="shixun_form">
<li class="clearfix">
<label class=" panel-form-label fl"><span class="c_red mr5">*</span>名称:</label>
<%= f.text_field :subject, :class => "panel-form-width-690 panel-form-height-30 fl", :no_label => true, :placeholder => "请输入当前任务的名称(此信息将提前泄露给学员)" %>
</li>
<li class="clearfix">
<label class=" panel-form-label fl">预备知识:</label>
<%= f.text_area :ready_knowledge, :class => "panel-form-width-690 panel-form-height-150 fl task-textarea-pd", :no_label => true, :placeholder => "请输入完成当前任务依赖的知识点或者其它相关信息,指导学员完成任务" %>
</li>
<li class="clearfix">
<label class=" panel-form-label fl"><span class="c_red mr5">*</span>过关任务:</label>
<%= f.text_area :task_pass, :class => "panel-form-width-690 panel-form-height-150 fl task-textarea-pd", :no_label => true %>
</li>
<li class="clearfix">
<label class=" panel-form-label fl">样例设置:</label>
<ul class="fl task-bg-grey">
<li class="clearfix">
<p class="clearfix">
<span class="color-green fb fl" name="sample_inputs_label">样例1</span>
<span class="color-grey fr" style="font-size:12px;">温馨提示:输入样例供学员参考。</span>
<a href="javascript:void(0)" title="增加" class="test_icon_add"><i class="fa fa-plus-circle color-grey font-16 ml10 fl mt12"></i></a>
</p>
<input type="text" class="panel-form-width-670 panel-form-height-30 mb10" name="program[input][]" id="textarea_input_test" placeholder="样例输入" />
<input type="text" class="panel-form-width-670 panel-form-height-30" name="program[output][]" id="textarea_output_test" placeholder="样例输出" />
</li>
</ul>
</li>
<li class="clearfix">
<label class=" panel-form-label fl">测试集设置:</label>
<ul class="fl task-bg-grey ">
<li class="clearfix">
<p class="clearfix">
<span class="color-green fb fl">测试1</span>
<span class="color-grey fr" style="font-size:12px;">温馨提示:在学员"提交评测"时进行自动检测。</span>
<a href="#" title="增加"><i class="fa fa-plus-circle color-grey font-16 ml10 fl mt12"></i></a>
<a href="#" title="删除"><i class="fa fa-times-circle color-grey font-16 ml10 fl mt12"></i></a>
</p>
<input type="text" class="panel-form-width-670 panel-form-height-30 mb10" placeholder="测试输入" />
<input type="text" class="panel-form-width-670 panel-form-height-30 " placeholder="测试输出" />
</li>
</ul>
</li>
<li class="clearfix">
<label class=" panel-form-label fl"> 知识/技能点:</label>
<div class="fl task-bd-grey">
<div class="task-tag tag-grey mb10 mr10 fl">
<button data-dismiss="alert" class="close fr mt3 ml5" type="button">×</button>
使用交互模式的 Python3 解释器
</div>
<div class="task-tag tag-grey mb10 mr10 fl">
<button data-dismiss="alert" class="close fr mt3 ml5" type="button">×</button>
简单使用 vim 编写脚本文件并执行这个脚本文件
</div>
<div class="task-tag tag-grey mb10 mr10 fl">
<button data-dismiss="alert" class="close fr mt3 ml5" type="button">×</button>
Python 语法:缩进
</div>
<div class="task-tag tag-grey mb10 mr10 fl">
<button data-dismiss="alert" class="close fr mt3 ml5" type="button">×</button>
规范代码风格和注释
</div>
<div class="task-tag tag-grey mb10 mr10 fl">
<button data-dismiss="alert" class="close fr mt3 ml5" type="button">×</button>
<input type="text" class=" task-tag-input" placeholder="请输入完成本任务得到的技能1个" />
</div>
<button class="close fl mt3 " type="button">+</button>
</div>
<div class="task-tag tag-grey mb10 mr10 fl">
<button data-dismiss="alert" class="close fr mt3 ml5" type="button">×</button>
简单使用 vim 编写脚本文件并执行这个脚本文件
</div>
<div class="task-tag tag-grey mb10 mr10 fl">
<button data-dismiss="alert" class="close fr mt3 ml5" type="button">×</button>
Python 语法:缩进
</div>
<div class="task-tag tag-grey mb10 mr10 fl">
<button data-dismiss="alert" class="close fr mt3 ml5" type="button">×</button>
规范代码风格和注释
</div>
<div class="task-tag tag-grey mb10 mr10 fl">
<button data-dismiss="alert" class="close fr mt3 ml5" type="button">×</button>
<input type="text" class=" task-tag-input" placeholder="请输入完成本任务得到的技能1个" />
</div>
<button class="close fl mt3 " type="button">+</button>
</div>
</li>
<li class="clearfix">
<label class=" panel-form-label fl"> 参考答案:</label>
<%= f.text_area :answer, :class => "panel-form-width-690 panel-form-height-150 fl task-textarea-pd", :no_label => true %>
</li>
<li class="clearfix">
<label class=" panel-form-label fl"><span class="c_red mr5">*</span>分值设定:</label>
<%= f.text_field :score, :class => "panel-form-height-30 fl", :no_label => true, :style => "padding:5px;" %>
<!--<input type="text" class=" panel-form-height-30 fl " placeholder="25" style="padding:5px;" />-->
<span class="fl ml5">分</span>
</li>
<li class="clearfix">
<a class=" task-btn task-btn-green fr mr10" onclick="challenge_create()">保存</a>
<a href="#" class=" task-btn fr mr10">取消</a>
</li>
</li>
<li class="clearfix">
<label class=" panel-form-label fl"> 参考答案:</label>
<%= f.text_area :answer, :class => "panel-form-width-690 panel-form-height-150 fl task-textarea-pd", :no_label => true %>
</li>
<li class="clearfix">
<label class=" panel-form-label fl"><span class="c_red mr5">*</span>分值设定:</label>
<%= f.text_field :score, :class => "panel-form-height-30 fl", :no_label => true, :style => "padding:5px;" %>
<!--<input type="text" class=" panel-form-height-30 fl " placeholder="25" style="padding:5px;" />-->
<span class="fl ml5">分</span>
</li>
<li class="clearfix">
<a class=" task-btn task-btn-green fr mr10" onclick="challenge_create()">保存</a>
<a href="#" class=" task-btn fr mr10">取消</a>
</li>
</div>
<script type="text/javascript">
$(function () {
var bt = baidu.template;
bt.LEFT_DELIMITER = '<!';
bt.RIGHT_DELIMITER = '!>';
$("#shixun_form").on('click', 'a.test_icon_add', function () {
var html = bt('t:sample-answer-list', null);
$(this).parent().parent('.clearfix').after(html);
var inputs = document.getElementsByName("sample[input][]");
var outputs = document.getElementsByName("sample[output][]");
var inputs_labels = document.getElementsByName("sample_inputs_label");
for (var j = 0; j < inputs_labels.length; j++) {
$(inputs_labels[j]).html("样例" + (j + 1));
}
if (inputs.length == outputs.length) {
for (var i = 0; i < inputs.length; i++) {
autoTextarea(inputs[i], 0, 140);
autoTextarea(outputs[i], 0, 140);
}
}
$(inputs[inputs.length - 1]).focus();
});
$("#shixun_form").on('click', 'a.test_icon_remove', function () {
$(this).parent().parent('.clearfix').remove();
var inputs_labels = document.getElementsByName("sample_inputs_label");
for (var j = 0; j < inputs_labels.length; j++) {
$(inputs_labels[j]).html("样例" + (j + 1));
}
});
});
var text1 = document.getElementById("textarea_sample_input_test");
var text2 = document.getElementById("textarea_sample_output_test");
autoTextarea(text1, 0, 140);
autoTextarea(text2, 0, 140);
var text3 = document.getElementById("textarea_input_test");
var text4 = document.getElementById("textarea_output_test");
autoTextarea2(text3, text4, 0, 140);
autoTextarea2(text4, text3, 0, 140);
function challenge_create(){
$('#new_challenge').submit();
}
$(function(){
$("#training_task_position").bind('keyup', function (){
this.value=this.value.replace(/\D/g,'')
});
$("#training_task_position").bind('afterpaste',function(){
this.value=this.value.replace(/\D/g,'')
});
});
</script>

View File

@ -19,7 +19,7 @@
<%= javascript_heads %>
<%= heads_for_theme %>
<%= call_hook :view_layouts_base_html_head %>
<%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2','css/common','css/public', 'css/structure','prettify', 'css/courses','css/popup','sy_public','syllabus', 'css/moduel', 'css/font-awesome','css/contest' %>
<%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2','css/common','css/public', 'css/structure','prettify', 'css/courses','css/popup','sy_public','css/syllabus', 'css/moduel', 'css/font-awesome','css/contest','css/font-awesome' %>
<%= javascript_include_tag "course","avatars","header","attachments",'prettify' %>
<!-- page specific tags -->
<%= yield :header_tags -%>

View File

@ -1046,6 +1046,165 @@ $(function(){
});
});
//textarea自适应高度 纯js写的 有浏览器判断
/**
* 文本框根据输入内容自适应高度
* @param {HTMLElement} 输入框元素
* @param {Number} 设置光标与输入框保持的距离(默认0)
* @param {Number} 设置最大高度(可选)
*/
var autoTextarea = function (elem, extra, maxHeight) {
extra = extra || 0;
var isFirefox = !!document.getBoxObjectFor || 'mozInnerScreenX' in window,
isOpera = !!window.opera && !!window.opera.toString().indexOf('Opera'),
addEvent = function (type, callback) {
elem.addEventListener ?
elem.addEventListener(type, callback, false) :
elem.attachEvent('on' + type, callback);
},
getStyle = elem.currentStyle ? function (name) {
var val = elem.currentStyle[name];
if (name === 'height' && val.search(/px/i) !== 1) {
var rect = elem.getBoundingClientRect();
return rect.bottom - rect.top -
parseFloat(getStyle('paddingTop')) -
parseFloat(getStyle('paddingBottom')) + 'px';
};
return val;
} : function (name) {
return getComputedStyle(elem, null)[name];
},
minHeight = parseFloat(getStyle('height'));
elem.style.resize = 'none';
var change = function () {
var scrollTop, height,
padding = 0,
style = elem.style;
if (elem._length === elem.value.length) return;
elem._length = elem.value.length;
if (!isFirefox && !isOpera) {
padding = parseInt(getStyle('paddingTop')) + parseInt(getStyle('paddingBottom'));
};
scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
elem.style.height = minHeight + 'px';
if (elem.scrollHeight > minHeight) {
if (maxHeight && elem.scrollHeight > maxHeight) {
height = maxHeight - padding;
style.overflowY = 'auto';
} else {
height = elem.scrollHeight - padding;
style.overflowY = 'hidden';
};
style.height = height + extra + 'px';
scrollTop += parseInt(style.height) - elem.currHeight;
document.body.scrollTop = scrollTop;
document.documentElement.scrollTop = scrollTop;
elem.currHeight = parseInt(style.height);
};
};
addEvent('propertychange', change);
addEvent('input', change);
addEvent('focus', change);
change();
};
/////////////////////////////////////////////////////////////////////////////////////////
var autoTextarea2 = function (elem,elem2, extra, maxHeight) {
extra = extra || 0;
var isFirefox = !!document.getBoxObjectFor || 'mozInnerScreenX' in window,
isOpera = !!window.opera && !!window.opera.toString().indexOf('Opera'),
addEvent = function (element, type, callback) {
element.addEventListener ?
element.addEventListener(type, callback, false) :
element.attachEvent('on' + type, callback);
},
getFirstStyle = elem.currentStyle ? function (name) {
var val = elem.currentStyle[name];
if (name === 'height' && val.search(/px/i) !== 1) {
var rect = elem.getBoundingClientRect();
return rect.bottom - rect.top -
parseFloat(getFirstStyle('paddingTop')) -
parseFloat(getFirstStyle('paddingBottom')) + 'px';
};
return val;
} : function (name) {
return getComputedStyle(elem, null)[name];
},
minHeight = parseFloat(getFirstStyle('height'));
elem.style.resize = 'none';
elem2.style.resize = 'none';
var change = function () {
var scrollTop, height,
padding = 0,
style = elem.style,
style2 = elem2.style;
if (elem._length === elem.value.length) return;
elem._length = elem.value.length;
elem2._length = elem._length;
if (!isFirefox && !isOpera) {
padding = parseInt(getFirstStyle('paddingTop')) + parseInt(getFirstStyle('paddingBottom'));
};
scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
elem.style.height = minHeight + 'px';
elem2.style.height = minHeight + 'px';
if (elem.scrollHeight > minHeight) {
if (maxHeight && elem.scrollHeight > maxHeight) {
height = maxHeight - padding;
style.overflowY = 'auto';
style2.overflowY = 'auto';
} else {
height = elem.scrollHeight - padding;
};
style.height = height + extra + 'px';
style2.height = height + extra + 'px';
scrollTop += parseInt(style.height) - elem.currHeight;
document.body.scrollTop = scrollTop;
document.documentElement.scrollTop = scrollTop;
elem.currHeight = parseInt(style.height);
};
if (elem2.scrollHeight > minHeight) {
if (maxHeight && elem2.scrollHeight > maxHeight) {
height = maxHeight - padding;
style.overflowY = 'auto';
style2.overflowY = 'auto';
} else {
height = elem2.scrollHeight - padding;
};
style.height = height + extra + 'px';
style2.height = height + extra + 'px';
scrollTop += parseInt(style2.height) - elem2.currHeight;
document.body.scrollTop = scrollTop;
document.documentElement.scrollTop = scrollTop;
elem2.currHeight = parseInt(style2.height);
};
};
addEvent(elem, 'propertychange', change);
addEvent(elem, 'input', change);
addEvent(elem, 'focus', change);
addEvent(elem2, 'propertychange', change);
addEvent(elem2, 'input', change);
addEvent(elem2, 'focus', change);
change();
};
//firefox的pre标签换行
$(document).ready(function () {

View File

@ -1479,163 +1479,6 @@ function show_student_work(url){
);
}
//textarea自适应高度 纯js写的 有浏览器判断
/**
* 文本框根据输入内容自适应高度
* @param {HTMLElement} 输入框元素
* @param {Number} 设置光标与输入框保持的距离(默认0)
* @param {Number} 设置最大高度(可选)
*/
var autoTextarea = function (elem, extra, maxHeight) {
extra = extra || 0;
var isFirefox = !!document.getBoxObjectFor || 'mozInnerScreenX' in window,
isOpera = !!window.opera && !!window.opera.toString().indexOf('Opera'),
addEvent = function (type, callback) {
elem.addEventListener ?
elem.addEventListener(type, callback, false) :
elem.attachEvent('on' + type, callback);
},
getStyle = elem.currentStyle ? function (name) {
var val = elem.currentStyle[name];
if (name === 'height' && val.search(/px/i) !== 1) {
var rect = elem.getBoundingClientRect();
return rect.bottom - rect.top -
parseFloat(getStyle('paddingTop')) -
parseFloat(getStyle('paddingBottom')) + 'px';
};
return val;
} : function (name) {
return getComputedStyle(elem, null)[name];
},
minHeight = parseFloat(getStyle('height'));
elem.style.resize = 'none';
var change = function () {
var scrollTop, height,
padding = 0,
style = elem.style;
if (elem._length === elem.value.length) return;
elem._length = elem.value.length;
if (!isFirefox && !isOpera) {
padding = parseInt(getStyle('paddingTop')) + parseInt(getStyle('paddingBottom'));
};
scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
elem.style.height = minHeight + 'px';
if (elem.scrollHeight > minHeight) {
if (maxHeight && elem.scrollHeight > maxHeight) {
height = maxHeight - padding;
style.overflowY = 'auto';
} else {
height = elem.scrollHeight - padding;
style.overflowY = 'hidden';
};
style.height = height + extra + 'px';
scrollTop += parseInt(style.height) - elem.currHeight;
document.body.scrollTop = scrollTop;
document.documentElement.scrollTop = scrollTop;
elem.currHeight = parseInt(style.height);
};
};
addEvent('propertychange', change);
addEvent('input', change);
addEvent('focus', change);
change();
};
/////////////////////////////////////////////////////////////////////////////////////////
var autoTextarea2 = function (elem,elem2, extra, maxHeight) {
extra = extra || 0;
var isFirefox = !!document.getBoxObjectFor || 'mozInnerScreenX' in window,
isOpera = !!window.opera && !!window.opera.toString().indexOf('Opera'),
addEvent = function (element, type, callback) {
element.addEventListener ?
element.addEventListener(type, callback, false) :
element.attachEvent('on' + type, callback);
},
getFirstStyle = elem.currentStyle ? function (name) {
var val = elem.currentStyle[name];
if (name === 'height' && val.search(/px/i) !== 1) {
var rect = elem.getBoundingClientRect();
return rect.bottom - rect.top -
parseFloat(getFirstStyle('paddingTop')) -
parseFloat(getFirstStyle('paddingBottom')) + 'px';
};
return val;
} : function (name) {
return getComputedStyle(elem, null)[name];
},
minHeight = parseFloat(getFirstStyle('height'));
elem.style.resize = 'none';
elem2.style.resize = 'none';
var change = function () {
var scrollTop, height,
padding = 0,
style = elem.style,
style2 = elem2.style;
if (elem._length === elem.value.length) return;
elem._length = elem.value.length;
elem2._length = elem._length;
if (!isFirefox && !isOpera) {
padding = parseInt(getFirstStyle('paddingTop')) + parseInt(getFirstStyle('paddingBottom'));
};
scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
elem.style.height = minHeight + 'px';
elem2.style.height = minHeight + 'px';
if (elem.scrollHeight > minHeight) {
if (maxHeight && elem.scrollHeight > maxHeight) {
height = maxHeight - padding;
style.overflowY = 'auto';
style2.overflowY = 'auto';
} else {
height = elem.scrollHeight - padding;
};
style.height = height + extra + 'px';
style2.height = height + extra + 'px';
scrollTop += parseInt(style.height) - elem.currHeight;
document.body.scrollTop = scrollTop;
document.documentElement.scrollTop = scrollTop;
elem.currHeight = parseInt(style.height);
};
if (elem2.scrollHeight > minHeight) {
if (maxHeight && elem2.scrollHeight > maxHeight) {
height = maxHeight - padding;
style.overflowY = 'auto';
style2.overflowY = 'auto';
} else {
height = elem2.scrollHeight - padding;
};
style.height = height + extra + 'px';
style2.height = height + extra + 'px';
scrollTop += parseInt(style2.height) - elem2.currHeight;
document.body.scrollTop = scrollTop;
document.documentElement.scrollTop = scrollTop;
elem2.currHeight = parseInt(style2.height);
};
};
addEvent(elem, 'propertychange', change);
addEvent(elem, 'input', change);
addEvent(elem, 'focus', change);
addEvent(elem2, 'propertychange', change);
addEvent(elem2, 'input', change);
addEvent(elem2, 'focus', change);
change();
};
//课程大纲选择请求,第二个参数是可选的,判断当前页面是大纲显示页面还是 课程首页
function course_outline(id){