mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2025-11-04 14:49:58 +08:00
增加Special Judge的基础配置和创建Special Judge题目的逻辑
This commit is contained in:
parent
416c2b1b32
commit
d7532ad446
30
contest/migrations/0014_auto_20160404_1509.py
Normal file
30
contest/migrations/0014_auto_20160404_1509.py
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.9.1 on 2016-04-04 07:09
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('contest', '0013_auto_20151017_1511'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='contestproblem',
|
||||||
|
name='spj',
|
||||||
|
field=models.BooleanField(default=False),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='contestproblem',
|
||||||
|
name='spj_code',
|
||||||
|
field=models.TextField(blank=True, null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='contestproblem',
|
||||||
|
name='spj_code_language',
|
||||||
|
field=models.IntegerField(blank=True, null=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
20
contest/migrations/0015_auto_20160404_1641.py
Normal file
20
contest/migrations/0015_auto_20160404_1641.py
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.9.1 on 2016-04-04 08:41
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('contest', '0014_auto_20160404_1509'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='contestproblem',
|
||||||
|
old_name='spj_code_language',
|
||||||
|
new_name='spj_language',
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -73,6 +73,9 @@ class CreateContestProblemSerializer(serializers.Serializer):
|
|||||||
test_case_id = serializers.CharField(max_length=40)
|
test_case_id = serializers.CharField(max_length=40)
|
||||||
time_limit = serializers.IntegerField()
|
time_limit = serializers.IntegerField()
|
||||||
memory_limit = serializers.IntegerField()
|
memory_limit = serializers.IntegerField()
|
||||||
|
spj = serializers.BooleanField()
|
||||||
|
spj_language = serializers.IntegerField(required=False, default=None)
|
||||||
|
spj_code = serializers.CharField(max_length=10000, required=False, default=None)
|
||||||
hint = serializers.CharField(max_length=3000, allow_blank=True)
|
hint = serializers.CharField(max_length=3000, allow_blank=True)
|
||||||
score = serializers.IntegerField(required=False, default=0)
|
score = serializers.IntegerField(required=False, default=0)
|
||||||
sort_index = serializers.CharField(max_length=30)
|
sort_index = serializers.CharField(max_length=30)
|
||||||
@ -101,6 +104,9 @@ class EditContestProblemSerializer(serializers.Serializer):
|
|||||||
test_case_id = serializers.CharField(max_length=40)
|
test_case_id = serializers.CharField(max_length=40)
|
||||||
time_limit = serializers.IntegerField()
|
time_limit = serializers.IntegerField()
|
||||||
memory_limit = serializers.IntegerField()
|
memory_limit = serializers.IntegerField()
|
||||||
|
spj = serializers.BooleanField()
|
||||||
|
spj_language = serializers.IntegerField(required=False, default=None)
|
||||||
|
spj_code = serializers.CharField(max_length=10000, required=False, default=None)
|
||||||
samples = ContestProblemSampleSerializer()
|
samples = ContestProblemSampleSerializer()
|
||||||
hint = serializers.CharField(max_length=3000, allow_blank=True)
|
hint = serializers.CharField(max_length=3000, allow_blank=True)
|
||||||
visible = serializers.BooleanField()
|
visible = serializers.BooleanField()
|
||||||
|
|||||||
30
problem/migrations/0012_auto_20160404_1509.py
Normal file
30
problem/migrations/0012_auto_20160404_1509.py
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.9.1 on 2016-04-04 07:09
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('problem', '0011_auto_20151017_1227'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='problem',
|
||||||
|
name='spj',
|
||||||
|
field=models.BooleanField(default=False),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='problem',
|
||||||
|
name='spj_code',
|
||||||
|
field=models.TextField(blank=True, null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='problem',
|
||||||
|
name='spj_code_language',
|
||||||
|
field=models.IntegerField(blank=True, null=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
20
problem/migrations/0013_auto_20160404_1641.py
Normal file
20
problem/migrations/0013_auto_20160404_1641.py
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.9.1 on 2016-04-04 08:41
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('problem', '0012_auto_20160404_1509'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='problem',
|
||||||
|
old_name='spj_code_language',
|
||||||
|
new_name='spj_language',
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -38,6 +38,10 @@ class AbstractProblem(models.Model):
|
|||||||
time_limit = models.IntegerField()
|
time_limit = models.IntegerField()
|
||||||
# 内存限制 单位是MB
|
# 内存限制 单位是MB
|
||||||
memory_limit = models.IntegerField()
|
memory_limit = models.IntegerField()
|
||||||
|
# special judge
|
||||||
|
spj = models.BooleanField(default=False)
|
||||||
|
spj_language = models.IntegerField(blank=True, null=True)
|
||||||
|
spj_code = models.TextField(blank=True, null=True)
|
||||||
# 是否可见 false的话相当于删除
|
# 是否可见 false的话相当于删除
|
||||||
visible = models.BooleanField(default=True)
|
visible = models.BooleanField(default=True)
|
||||||
# 总共提交数量
|
# 总共提交数量
|
||||||
|
|||||||
@ -27,6 +27,9 @@ class CreateProblemSerializer(serializers.Serializer):
|
|||||||
test_case_id = serializers.CharField(max_length=40)
|
test_case_id = serializers.CharField(max_length=40)
|
||||||
time_limit = serializers.IntegerField(min_value=1, max_value=10000)
|
time_limit = serializers.IntegerField(min_value=1, max_value=10000)
|
||||||
memory_limit = serializers.IntegerField(min_value=16)
|
memory_limit = serializers.IntegerField(min_value=16)
|
||||||
|
spj = serializers.BooleanField()
|
||||||
|
spj_language = serializers.IntegerField(required=False, default=None)
|
||||||
|
spj_code = serializers.CharField(max_length=10000, required=False, default=None)
|
||||||
difficulty = serializers.IntegerField()
|
difficulty = serializers.IntegerField()
|
||||||
tags = serializers.ListField(child=serializers.CharField(max_length=10))
|
tags = serializers.ListField(child=serializers.CharField(max_length=10))
|
||||||
hint = serializers.CharField(max_length=3000, allow_blank=True)
|
hint = serializers.CharField(max_length=3000, allow_blank=True)
|
||||||
@ -73,6 +76,9 @@ class EditProblemSerializer(serializers.Serializer):
|
|||||||
source = serializers.CharField(max_length=100)
|
source = serializers.CharField(max_length=100)
|
||||||
time_limit = serializers.IntegerField(min_value=1)
|
time_limit = serializers.IntegerField(min_value=1)
|
||||||
memory_limit = serializers.IntegerField(min_value=1)
|
memory_limit = serializers.IntegerField(min_value=1)
|
||||||
|
spj = serializers.BooleanField()
|
||||||
|
spj_language = serializers.IntegerField(required=False, default=None)
|
||||||
|
spj_code = serializers.CharField(max_length=10000, required=False, default=None)
|
||||||
difficulty = serializers.IntegerField()
|
difficulty = serializers.IntegerField()
|
||||||
tags = serializers.ListField(child=serializers.CharField(max_length=20))
|
tags = serializers.ListField(child=serializers.CharField(max_length=20))
|
||||||
samples = ProblemSampleSerializer()
|
samples = ProblemSampleSerializer()
|
||||||
|
|||||||
@ -91,6 +91,9 @@ class ProblemAdminAPIView(APIView):
|
|||||||
samples=json.dumps(data["samples"]),
|
samples=json.dumps(data["samples"]),
|
||||||
time_limit=data["time_limit"],
|
time_limit=data["time_limit"],
|
||||||
memory_limit=data["memory_limit"],
|
memory_limit=data["memory_limit"],
|
||||||
|
spj=data["spj"],
|
||||||
|
spj_language=data["spj_language"],
|
||||||
|
spj_code=data["spj_code"],
|
||||||
difficulty=data["difficulty"],
|
difficulty=data["difficulty"],
|
||||||
created_by=request.user,
|
created_by=request.user,
|
||||||
hint=data["hint"],
|
hint=data["hint"],
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
require(["jquery", "avalon", "editor", "uploader", "bsAlert",
|
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) {
|
function ($, avalon, editor, uploader, bsAlert, csrfTokenHeader) {
|
||||||
avalon.ready(function () {
|
avalon.ready(function () {
|
||||||
|
|
||||||
@ -37,6 +37,11 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert",
|
|||||||
bsAlert("请至少添加一个标签,这将有利于用户发现你的题目!");
|
bsAlert("请至少添加一个标签,这将有利于用户发现你的题目!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
var spjVM = avalon.vmodels.spjConfig;
|
||||||
|
if (spjVM.spj && spjVM.spjCode == ""){
|
||||||
|
bsAlert("请填写Special Judge的代码");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
var ajaxData = {
|
var ajaxData = {
|
||||||
id: avalon.vmodels.admin.problemId,
|
id: avalon.vmodels.admin.problemId,
|
||||||
title: vm.title,
|
title: vm.title,
|
||||||
@ -51,8 +56,13 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert",
|
|||||||
tags: tags,
|
tags: tags,
|
||||||
input_description: vm.inputDescription,
|
input_description: vm.inputDescription,
|
||||||
output_description: vm.outputDescription,
|
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++) {
|
for (var i = 0; i < vm.samples.$model.length; i++) {
|
||||||
ajaxData.samples.push({
|
ajaxData.samples.push({
|
||||||
|
|||||||
30
static/src/js/components/spj.js
Normal file
30
static/src/js/components/spj.js
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
define("spj", ["avalon"], function (avalon) {
|
||||||
|
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">'+
|
||||||
|
'<small> Special Judge用于答案不唯一的情况,需要自己上传判题代码。'+
|
||||||
|
'<a href="#" 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: "",
|
||||||
|
$ready: function (vm, el) {
|
||||||
|
el.msRetain = true;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
@ -7,7 +7,7 @@ define("testCaseUploader", ["avalon", "uploader", "bsAlert", "jquery"], function
|
|||||||
'请将所有测试用例打包在一个文件中上传,' +
|
'请将所有测试用例打包在一个文件中上传,' +
|
||||||
'所有文件要在压缩包的根目录,' +
|
'所有文件要在压缩包的根目录,' +
|
||||||
'且输入输出文件名要以从1开始连续数字标识要对应例如:' +
|
'且输入输出文件名要以从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> ' +
|
'<p>上传进度<span ms-text="uploadProgress"></span>%</p> ' +
|
||||||
'<table class="table table-striped" ms-visible="uploaded"> ' +
|
'<table class="table table-striped" ms-visible="uploaded"> ' +
|
||||||
'<tr> <td>编号</td> <td>输入文件名</td> <td>输出文件名</td> </tr> ' +
|
'<tr> <td>编号</td> <td>输入文件名</td> <td>输出文件名</td> </tr> ' +
|
||||||
|
|||||||
@ -28,6 +28,7 @@ var require = {
|
|||||||
pager: "components/pager",
|
pager: "components/pager",
|
||||||
editorComponent: "components/editorComponent",
|
editorComponent: "components/editorComponent",
|
||||||
testCaseUploader: "components/testCaseUploader",
|
testCaseUploader: "components/testCaseUploader",
|
||||||
|
spj: "components/spj",
|
||||||
|
|
||||||
|
|
||||||
// ------ 下面写的都不要直接用,而是使用上面的封装版本 ------
|
// ------ 下面写的都不要直接用,而是使用上面的封装版本 ------
|
||||||
|
|||||||
@ -13,7 +13,6 @@
|
|||||||
<ms:editor $id="problemDescriptionEditor" config="problemDescriptionEditor"></ms:editor>
|
<ms:editor $id="problemDescriptionEditor" config="problemDescriptionEditor"></ms:editor>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<div class="form-group"><label>时间限制(ms, 范围1-10000ms)</label>
|
<div class="form-group"><label>时间限制(ms, 范围1-10000ms)</label>
|
||||||
<input type="number" name="timeLimit" class="form-control" ms-duplex="timeLimit"
|
<input type="number" name="timeLimit" class="form-control" ms-duplex="timeLimit"
|
||||||
@ -99,6 +98,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<ms:spj $id="spjConfig"></ms:spj>
|
||||||
<ms:testcaseuploader $id="testCaseUploader"></ms:testcaseuploader>
|
<ms:testcaseuploader $id="testCaseUploader"></ms:testcaseuploader>
|
||||||
<div class="form-group col-md-12">
|
<div class="form-group col-md-12">
|
||||||
<label>提示</label>
|
<label>提示</label>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user