mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2024-09-21 08:23:20 +00:00
Merge branch 'dev' into virusdefender-dev
* dev: 修改后端problem中的的命名规范 前端创建题目界面增加输入描述和输出描述 后端增加输入描述与输出描述两个字段,并修改其相关的后端内容
This commit is contained in:
commit
ad160b171f
26
problem/migrations/0004_auto_20150813_1459.py
Normal file
26
problem/migrations/0004_auto_20150813_1459.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import models, migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('problem', '0003_auto_20150810_2233'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='problem',
|
||||||
|
name='description_input',
|
||||||
|
field=models.CharField(default='hello', max_length=10000),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='problem',
|
||||||
|
name='description_output',
|
||||||
|
field=models.CharField(default='hello', max_length=10000),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
24
problem/migrations/0005_auto_20150813_1807.py
Normal file
24
problem/migrations/0005_auto_20150813_1807.py
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import models, migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('problem', '0004_auto_20150813_1459'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='problem',
|
||||||
|
old_name='description_input',
|
||||||
|
new_name='input_description',
|
||||||
|
),
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='problem',
|
||||||
|
old_name='description_output',
|
||||||
|
new_name='output_description',
|
||||||
|
),
|
||||||
|
]
|
@ -16,6 +16,10 @@ class AbstractProblem(models.Model):
|
|||||||
title = models.CharField(max_length=50)
|
title = models.CharField(max_length=50)
|
||||||
# 问题描述 HTML 格式
|
# 问题描述 HTML 格式
|
||||||
description = models.TextField()
|
description = models.TextField()
|
||||||
|
# 输入描述
|
||||||
|
input_description = models.CharField(max_length=10000)
|
||||||
|
# 输出描述
|
||||||
|
output_description = models.CharField(max_length=10000)
|
||||||
# 样例输入 可能会存储 json 格式的数据
|
# 样例输入 可能会存储 json 格式的数据
|
||||||
samples = models.TextField(blank=True)
|
samples = models.TextField(blank=True)
|
||||||
# 测试用例id 这个id 可以用来拼接得到测试用例的文件存储位置
|
# 测试用例id 这个id 可以用来拼接得到测试用例的文件存储位置
|
||||||
|
@ -20,6 +20,8 @@ class JSONField(serializers.Field):
|
|||||||
class CreateProblemSerializer(serializers.Serializer):
|
class CreateProblemSerializer(serializers.Serializer):
|
||||||
title = serializers.CharField(max_length=50)
|
title = serializers.CharField(max_length=50)
|
||||||
description = serializers.CharField(max_length=10000)
|
description = serializers.CharField(max_length=10000)
|
||||||
|
input_description = serializers.CharField(max_length=10000)
|
||||||
|
output_description = serializers.CharField(max_length=10000)
|
||||||
# [{"input": "1 1", "output": "2"}]
|
# [{"input": "1 1", "output": "2"}]
|
||||||
samples = ProblemSampleSerializer()
|
samples = ProblemSampleSerializer()
|
||||||
test_case_id = serializers.CharField(max_length=40)
|
test_case_id = serializers.CharField(max_length=40)
|
||||||
@ -49,6 +51,8 @@ class EditProblemSerializer(serializers.Serializer):
|
|||||||
id = serializers.IntegerField()
|
id = serializers.IntegerField()
|
||||||
title = serializers.CharField(max_length=50)
|
title = serializers.CharField(max_length=50)
|
||||||
description = serializers.CharField(max_length=10000)
|
description = serializers.CharField(max_length=10000)
|
||||||
|
input_description = serializers.CharField(max_length=10000)
|
||||||
|
output_description = serializers.CharField(max_length=10000)
|
||||||
test_case_id = serializers.CharField(max_length=40)
|
test_case_id = serializers.CharField(max_length=40)
|
||||||
source = serializers.CharField(max_length=30)
|
source = serializers.CharField(max_length=30)
|
||||||
time_limit = serializers.IntegerField()
|
time_limit = serializers.IntegerField()
|
||||||
|
@ -17,8 +17,10 @@ class ProblemPageTest(TestCase):
|
|||||||
class ProblemAdminTest(APITestCase):
|
class ProblemAdminTest(APITestCase):
|
||||||
def _create_data(self, problem_id, visible, tags):
|
def _create_data(self, problem_id, visible, tags):
|
||||||
data = {"id": problem_id,
|
data = {"id": problem_id,
|
||||||
"title": "title1",
|
"title": "title0",
|
||||||
"description": "des1",
|
"description": "description0",
|
||||||
|
"input_description": "input_description0",
|
||||||
|
"output_description": "output_description0",
|
||||||
"test_case_id": "1",
|
"test_case_id": "1",
|
||||||
"source": "source1",
|
"source": "source1",
|
||||||
"samples": [{"input": "1 1", "output": "2"}],
|
"samples": [{"input": "1 1", "output": "2"}],
|
||||||
@ -40,7 +42,9 @@ class ProblemAdminTest(APITestCase):
|
|||||||
ProblemTag.objects.create(name="tag1")
|
ProblemTag.objects.create(name="tag1")
|
||||||
ProblemTag.objects.create(name="tag2")
|
ProblemTag.objects.create(name="tag2")
|
||||||
self.problem = Problem.objects.create(title="title1",
|
self.problem = Problem.objects.create(title="title1",
|
||||||
description="des1",
|
description="description1",
|
||||||
|
input_description="input1_description",
|
||||||
|
output_description="output1_description",
|
||||||
test_case_id="1",
|
test_case_id="1",
|
||||||
source="source1",
|
source="source1",
|
||||||
samples=[{"input": "1 1", "output": "2"}],
|
samples=[{"input": "1 1", "output": "2"}],
|
||||||
@ -57,8 +61,10 @@ class ProblemAdminTest(APITestCase):
|
|||||||
self.assertEqual(response.data["code"], 1)
|
self.assertEqual(response.data["code"], 1)
|
||||||
|
|
||||||
def test_release_problem_successfully(self):
|
def test_release_problem_successfully(self):
|
||||||
data = {"title": "title1",
|
data = {"title": "title2",
|
||||||
"description": "des1",
|
"description": "description2",
|
||||||
|
"input_description": "input_description2",
|
||||||
|
"output_description": "output_description2",
|
||||||
"test_case_id": "1",
|
"test_case_id": "1",
|
||||||
"source": "source1",
|
"source": "source1",
|
||||||
"samples": [{"input": "1 1", "output": "2"}],
|
"samples": [{"input": "1 1", "output": "2"}],
|
||||||
|
@ -69,6 +69,8 @@ class ProblemAdminAPIView(APIView):
|
|||||||
data = serializer.data
|
data = serializer.data
|
||||||
problem = Problem.objects.create(title=data["title"],
|
problem = Problem.objects.create(title=data["title"],
|
||||||
description=data["description"],
|
description=data["description"],
|
||||||
|
input_description=data["input_description"],
|
||||||
|
output_description=data["output_description"],
|
||||||
test_case_id=data["test_case_id"],
|
test_case_id=data["test_case_id"],
|
||||||
source=data["source"],
|
source=data["source"],
|
||||||
samples=json.dumps(data["samples"]),
|
samples=json.dumps(data["samples"]),
|
||||||
@ -105,6 +107,8 @@ class ProblemAdminAPIView(APIView):
|
|||||||
|
|
||||||
problem.title = data["title"]
|
problem.title = data["title"]
|
||||||
problem.description = data["description"]
|
problem.description = data["description"]
|
||||||
|
problem.input_description = data["input_description"]
|
||||||
|
problem.output_description = data["output_description"]
|
||||||
problem.test_case_id = data["test_case_id"]
|
problem.test_case_id = data["test_case_id"]
|
||||||
problem.source = data["source"]
|
problem.source = data["source"]
|
||||||
problem.time_limit = data["time_limit"]
|
problem.time_limit = data["time_limit"]
|
||||||
|
@ -53,10 +53,17 @@ require(["jquery", "avalon", "editor", "uploader", "bs_alert", "csrf", "tagEdito
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
source: {
|
input_description: {
|
||||||
validators: {
|
validators: {
|
||||||
notEmpty: {
|
notEmpty: {
|
||||||
message: "请输入题目来源"
|
message: "请填写输入描述"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
output_description: {
|
||||||
|
validators: {
|
||||||
|
notEmpty: {
|
||||||
|
message: "请填写输出描述"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -72,10 +79,6 @@ require(["jquery", "avalon", "editor", "uploader", "bs_alert", "csrf", "tagEdito
|
|||||||
bs_alert("题目描述不能为空!");
|
bs_alert("题目描述不能为空!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (vm.hint == '') {
|
|
||||||
bs_alert("提示不能为空!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var ajaxData = {
|
var ajaxData = {
|
||||||
title: vm.title,
|
title: vm.title,
|
||||||
description: vm.description,
|
description: vm.description,
|
||||||
@ -86,6 +89,8 @@ require(["jquery", "avalon", "editor", "uploader", "bs_alert", "csrf", "tagEdito
|
|||||||
hint: vm.hint,
|
hint: vm.hint,
|
||||||
source: vm.source,
|
source: vm.source,
|
||||||
tags: $("#tags").tagEditor("getTags")[0].tags,
|
tags: $("#tags").tagEditor("getTags")[0].tags,
|
||||||
|
input_description: vm.input_description,
|
||||||
|
output_description: vm.output_description,
|
||||||
difficulty: vm.difficulty
|
difficulty: vm.difficulty
|
||||||
};
|
};
|
||||||
if (vm.samples.length == 0) {
|
if (vm.samples.length == 0) {
|
||||||
@ -93,6 +98,13 @@ require(["jquery", "avalon", "editor", "uploader", "bs_alert", "csrf", "tagEdito
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(var i = 0; i < vm.samples.length; i++){
|
||||||
|
if (vm.samples[i].input == "" || vm.samples[i].output == ""){
|
||||||
|
bs_alert("样例输入与样例输出不能为空!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (tags.length == 0) {
|
if (tags.length == 0) {
|
||||||
bs_alert("请至少添加一个标签,这将有利于用户发现你的题目!");
|
bs_alert("请至少添加一个标签,这将有利于用户发现你的题目!");
|
||||||
return;
|
return;
|
||||||
@ -147,12 +159,14 @@ require(["jquery", "avalon", "editor", "uploader", "bs_alert", "csrf", "tagEdito
|
|||||||
description: "",
|
description: "",
|
||||||
cpu: 1000,
|
cpu: 1000,
|
||||||
memory: 256,
|
memory: 256,
|
||||||
samples: [],
|
samples: [{input: "", output: "", "visible": true}],
|
||||||
hint: "",
|
hint: "",
|
||||||
visible: true,
|
visible: true,
|
||||||
difficulty: 0,
|
difficulty: 0,
|
||||||
tags: [],
|
tags: [],
|
||||||
tag: "",
|
tag: "",
|
||||||
|
input_description: "",
|
||||||
|
output_description: "",
|
||||||
test_case_id: "",
|
test_case_id: "",
|
||||||
testCaseList: [],
|
testCaseList: [],
|
||||||
uploadSuccess: false,
|
uploadSuccess: false,
|
||||||
|
@ -3,12 +3,12 @@
|
|||||||
|
|
||||||
<div class="form-group col-md-12">
|
<div class="form-group col-md-12">
|
||||||
<label>题目标题</label>
|
<label>题目标题</label>
|
||||||
<input type="text" name="title" class="form-control" ms-duplex="title">
|
<input type="text" name="title" autofocus class="form-control" ms-duplex="title">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group col-md-12">
|
<div class="form-group col-md-12">
|
||||||
<label>题目描述</label>
|
<label>题目描述</label>
|
||||||
<textarea id="problemDescription" placeholder="这里输入内容" autofocus ms-duplex="description"></textarea>
|
<textarea id="problemDescription" placeholder="这里输入内容(此内容不能为空)" ms-duplex="description"></textarea>
|
||||||
<small ms-visible="description==''" style="color:red">请填写题目描述</small>
|
<small ms-visible="description==''" style="color:red">请填写题目描述</small>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -38,6 +38,16 @@
|
|||||||
<label>标签</label><br>
|
<label>标签</label><br>
|
||||||
<input type="text" id="tags">
|
<input type="text" id="tags">
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-md-12 form-group">
|
||||||
|
<label>输入描述</label><br>
|
||||||
|
<textarea class="form-control" rows="5" name="input_description"
|
||||||
|
ms-duplex="input_description"></textarea>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-12 form-group">
|
||||||
|
<label>输出描述</label><br>
|
||||||
|
<textarea class="form-control" rows="5" name="output_description"
|
||||||
|
ms-duplex="output_description"></textarea>
|
||||||
|
</div>
|
||||||
<div class="col-md-12"><br>
|
<div class="col-md-12"><br>
|
||||||
<label>样例</label>
|
<label>样例</label>
|
||||||
<a href="javascript:void(0)" class="btn btn-primary btn-sm" ms-click="add_sample()">添加</a>
|
<a href="javascript:void(0)" class="btn btn-primary btn-sm" ms-click="add_sample()">添加</a>
|
||||||
|
Loading…
Reference in New Issue
Block a user