Merge branch 'spj'

* spj:
  SPJ程序warning as error
  增加部分logger配置
  完成对SPJ的支持
  增加测试用例版本号,用于judger重新编译spj程序
  增加admin页面SPJ的帮助链接
  增加比赛题目SPJ的设置
  完善SPJ测试用例的上传
  题目页面增加SPJ标识
  增加编辑题目spj相关的逻辑
  增加Special Judge的基础配置和创建Special Judge题目的逻辑
This commit is contained in:
virusdefender
2016-04-07 16:44:51 +08:00
32 changed files with 489 additions and 89 deletions

View File

@@ -1,5 +1,5 @@
require(["jquery", "avalon", "editor", "uploader", "bsAlert",
"csrfToken", "tagEditor", "validator", "editorComponent", "testCaseUploader"],
"csrfToken", "tagEditor", "validator", "editorComponent", "testCaseUploader", "spj"],
function ($, avalon, editor, uploader, bsAlert, csrfTokenHeader) {
avalon.ready(function () {
@@ -34,6 +34,11 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert",
return false;
}
}
var spjVM = avalon.vmodels.spjConfig;
if (spjVM.spj && !spjVM.spjCode){
bsAlert("请填写Special Judge的代码");
return false;
}
var ajaxData = {
title: vm.title,
description: avalon.vmodels.contestProblemDescriptionEditor.content,
@@ -46,8 +51,13 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert",
contest_id: avalon.vmodels.admin.contestId,
input_description: vm.inputDescription,
output_description: vm.outputDescription,
sort_index: vm.sortIndex
sort_index: vm.sortIndex,
spj: spjVM.spj
};
if (spjVM.spj) {
ajaxData.spj_language = spjVM.spjLanguage;
ajaxData.spj_code = spjVM.spjCode;
}
if (avalon.vmodels.admin.contestProblemStatus == "edit") {
var method = "put";
@@ -185,6 +195,11 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert",
})
}
avalon.vmodels.contestProblemHintEditor.content = problem.hint;
var spjVM = avalon.vmodels.spjConfig;
spjVM.spj = problem.spj;
// spjLanguage可能是null
spjVM.spjLanguage = problem.spj_language=="2"?"2":"1";
spjVM.spjCode = problem.spj_code;
}
}
});

View File

@@ -1,5 +1,5 @@
require(["jquery", "avalon", "editor", "uploader", "bsAlert",
"csrfToken", "tagEditor", "validator", "jqueryUI", "editorComponent", "testCaseUploader"],
"csrfToken", "tagEditor", "validator", "jqueryUI", "editorComponent", "testCaseUploader", "spj"],
function ($, avalon, editor, uploader, bsAlert, csrfTokenHeader) {
avalon.ready(function () {
@@ -37,6 +37,11 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert",
bsAlert("请至少添加一个标签,这将有利于用户发现你的题目!");
return false;
}
var spjVM = avalon.vmodels.spjConfig;
if (spjVM.spj && !spjVM.spjCode){
bsAlert("请填写Special Judge的代码");
return false;
}
var ajaxData = {
id: avalon.vmodels.admin.problemId,
title: vm.title,
@@ -51,8 +56,13 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert",
tags: tags,
input_description: vm.inputDescription,
output_description: vm.outputDescription,
difficulty: vm.difficulty
difficulty: vm.difficulty,
spj: spjVM.spj
};
if (spjVM.spj) {
ajaxData.spj_language = spjVM.spjLanguage;
ajaxData.spj_code = spjVM.spjCode;
}
for (var i = 0; i < vm.samples.$model.length; i++) {
ajaxData.samples.push({
@@ -99,7 +109,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert",
vm.source = "";
vm.uploadProgress = 0;
}
else
else {
var vm = avalon.define({
$id: "addProblem",
title: "",
@@ -143,6 +153,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert",
return "展开";
}
});
}
var tagAutoCompleteList = [];

View File

@@ -1,5 +1,5 @@
require(["jquery", "avalon", "editor", "uploader", "bsAlert",
"csrfToken", "tagEditor", "validator", "jqueryUI", "editorComponent", "testCaseUploader"],
"csrfToken", "tagEditor", "validator", "jqueryUI", "editorComponent", "testCaseUploader", "spj"],
function ($, avalon, editor, uploader, bsAlert, csrfTokenHeader) {
avalon.ready(function () {
@@ -38,6 +38,11 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert",
bsAlert("请至少添加一个标签,这将有利于用户发现你的题目!");
return false;
}
var spjVM = avalon.vmodels.spjConfig;
if (spjVM.spj && !spjVM.spjCode){
bsAlert("请填写Special Judge的代码");
return false;
}
var ajaxData = {
id: avalon.vmodels.admin.problemId,
title: vm.title,
@@ -52,8 +57,13 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert",
tags: tags,
input_description: vm.inputDescription,
output_description: vm.outputDescription,
difficulty: vm.difficulty
difficulty: vm.difficulty,
spj: spjVM.spj
};
if (spjVM.spj) {
ajaxData.spj_language = spjVM.spjLanguage;
ajaxData.spj_code = spjVM.spjCode;
}
for (var i = 0; i < vm.samples.$model.length; i++) {
ajaxData.samples.push({
@@ -86,7 +96,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert",
if (avalon.vmodels.editProblem) {
var vm = avalon.vmodels.editProblem;
}
else
else {
var vm = avalon.define({
$id: "editProblem",
title: "",
@@ -132,6 +142,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert",
avalon.vmodels.admin.template_url = "template/problem/problem_list.html";
}
});
}
$.ajax({
url: "/api/admin/problem/?problem_id=" + avalon.vmodels.admin.problemId,
@@ -161,6 +172,12 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert",
vm.inputDescription = problem.input_description;
vm.outputDescription = problem.output_description;
avalon.vmodels.testCaseUploader.setTestCase(problem.test_case_id);
var spjVM = avalon.vmodels.spjConfig;
spjVM.spj = problem.spj;
// spjLanguage可能是null
spjVM.spjLanguage = problem.spj_language=="2"?"2":"1";
spjVM.spjCode = problem.spj_code;
vm.source = problem.source;
var problemTags = problem.tags;
$.ajax({

View File

@@ -27,6 +27,7 @@
pager: "components/pager",
editorComponent: "components/editorComponent",
testCaseUploader: "components/testCaseUploader",
spj: "components/spj",
// ------ 下面写的都不要直接用,而是使用上面的封装版本 ------
//富文本编辑器simditor -> editor

View File

@@ -0,0 +1,38 @@
define("spj", ["avalon", "bsAlert"], function (avalon, bsAlert) {
avalon.component("ms:spj", {
$template: '<div class="col-md-6">' +
'<label>Special Judge</label>' +
'<div class="form-group">' +
'<label class="text"><input type="checkbox" ms-duplex-checked="spj" ms-attr-disabled="checkboxDisabled">' +
'<small> Special Judge用于答案不唯一的情况,需要自己上传判题代码。上传测试用后如需要修改, 必须重新上传对应类型的新测试用例。' +
'<a href="https://github.com/QingdaoU/OnlineJudge/wiki/SpecialJudge" target="_blank">帮助和示例</a></small>' +
'</label></div></div>' +
'<div class="col-md-6" ms-if="spj">' +
'<label>SPJ代码语言</label>' +
'<div class="form-group">' +
'<label class="text">' +
'<input type="radio" name="spjLanguage" value="1" ms-duplex-string="spjLanguage"> C ' +
'<input type="radio" name="spjLanguage" value="2" ms-duplex-string="spjLanguage"> C++' +
'</label>' +
'</div>' +
'</div>' +
'<div class="col-md-12" ms-if="spj">' +
'<label>SPJ代码</label>' +
'<textarea class="form-control" rows="5" ms-duplex="spjCode"></textarea>' +
'</div>',
spj: false,
spjLanguage: 1,
spjCode: "",
checkboxDisabled: false,
$init: function(vm, el) {
vm.$watch("testCaseUploadFinished", function (spj) {
vm.spj = spj;
vm.checkboxDisabled = true;
});
},
$ready: function (vm, el) {
el.msRetain = true;
}
})
});

View File

@@ -7,7 +7,7 @@ define("testCaseUploader", ["avalon", "uploader", "bsAlert", "jquery"], function
'请将所有测试用例打包在一个文件中上传,' +
'所有文件要在压缩包的根目录,' +
'且输入输出文件名要以从1开始连续数字标识要对应例如' +
'<br>1.in 1.out 2.in 2.out </small> ' +
'<br>1.in 1.out 2.in 2.out(普通题目)或者1.in 2.in 3.in(Special Judge) </small> ' +
'<p>上传进度<span ms-text="uploadProgress"></span>%</p> ' +
'<table class="table table-striped" ms-visible="uploaded"> ' +
'<tr> <td>编号</td> <td>输入文件名</td> <td>输出文件名</td> </tr> ' +
@@ -48,6 +48,7 @@ define("testCaseUploader", ["avalon", "uploader", "bsAlert", "jquery"], function
}
vm.uploaded = true;
vm.uploadProgress = 100;
vm.$fire("all!testCaseUploadFinished", data.data.spj);
}
}
});
@@ -72,7 +73,7 @@ define("testCaseUploader", ["avalon", "uploader", "bsAlert", "jquery"], function
output: response.data.file_list[key].output_name
})
}
bsAlert("测试数据添加成功!共添加" + vm.testCaseList.length + "组测试数据");
vm.$fire("all!testCaseUploadFinished", response.data.spj);
}
},
function (file, percentage) {

View File

@@ -28,6 +28,7 @@ var require = {
pager: "components/pager",
editorComponent: "components/editorComponent",
testCaseUploader: "components/testCaseUploader",
spj: "components/spj",
// ------ 下面写的都不要直接用,而是使用上面的封装版本 ------