From cca4bb38524fb826594be23ea4dcfc864e3f19e2 Mon Sep 17 00:00:00 2001 From: esp Date: Sun, 23 Aug 2015 17:34:27 +0800 Subject: [PATCH 01/21] =?UTF-8?q?[=E5=90=8E=E7=AB=AF]=E4=BF=AE=E6=94=B9GET?= =?UTF-8?q?=E6=AF=94=E8=B5=9B=E5=88=86=E9=A1=B5API,=E5=AF=B9=E6=99=AE?= =?UTF-8?q?=E9=80=9A=E7=AE=A1=E7=90=86=E5=91=98=E4=BB=85=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E8=87=AA=E5=B7=B1=E5=88=9B=E5=BB=BA=E7=9A=84=E6=AF=94=E8=B5=9B?= =?UTF-8?q?,=E4=BD=86=E5=9C=A8=E5=A4=9A=E7=94=A8=E6=88=B7=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E8=BF=87=E6=AF=94=E8=B5=9B=E6=98=AF(=E5=8F=AA?= =?UTF-8?q?=E8=A6=81=E5=BD=93=E5=89=8D=E7=94=A8=E6=88=B7=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E7=94=A8=E6=88=B7=E7=9A=84=E6=AF=94=E8=B5=9B?= =?UTF-8?q?=E6=98=AF=E5=B0=B1=E4=BC=9A=E4=BA=A7=E7=94=9F=E9=94=99=E8=AF=AF?= =?UTF-8?q?,=E8=BF=99=E6=98=AF=E5=8E=9F=E6=9D=A5=E5=B0=B1=E6=9C=89?= =?UTF-8?q?=E7=9A=84BUG),=E8=BF=98=E6=9C=AA=E5=86=99=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest/views.py | 12 +++++++++++- static/src/css/contest/add_contest.css | 5 +++++ static/src/js/app/admin/contest/edit_problem.js | 0 template/admin/contest/edit_problem.html | 0 4 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 static/src/css/contest/add_contest.css create mode 100644 static/src/js/app/admin/contest/edit_problem.js create mode 100644 template/admin/contest/edit_problem.html diff --git a/contest/views.py b/contest/views.py index bc9eb353..7ad58b36 100644 --- a/contest/views.py +++ b/contest/views.py @@ -126,7 +126,10 @@ class ContestAdminAPIView(APIView): --- response_serializer: ContestSerializer """ - contest = Contest.objects.all().order_by("-last_updated_time") + if request.user.admin_type == SUPER_ADMIN: + contest = Contest.objects.all().order_by("-last_update_time") + else: + contest = Contest.objects.filter(created_by=request.user).order_by("-last_updated_time") visible = request.GET.get("visible", None) if visible: contest = contest.filter(visible=(visible == "true")) @@ -219,5 +222,12 @@ class ContestProblemAdminAPIView(APIView): if keyword: contest_problem = contest_problem.filter(Q(title__contains=keyword) | Q(description__contains=keyword)) + contest_id = request.GET.get("contest_id", None) + if contest_id: + try: + contest = Contest.objects.get(id=contest_id,created_by=request.user) + except Contest.DoesNotExist: + return error_response(u"非法的比赛ID") + contest_problem = contest_problem.filter(contest=contest).order_by("sort_index") return paginate(request, contest_problem, ContestProblemSerializer) \ No newline at end of file diff --git a/static/src/css/contest/add_contest.css b/static/src/css/contest/add_contest.css new file mode 100644 index 00000000..af9ee386 --- /dev/null +++ b/static/src/css/contest/add_contest.css @@ -0,0 +1,5 @@ +.group-tag { + padding-left: 5px; color: #46799b; background: #e0eaf1; white-space: nowrap; + overflow: hidden; cursor: pointer; border-radius: 2px 0 0 2px; + float: left; padding: 0 4px;box-sizing: border-box;list-style-type: none; margin: 5px; +} diff --git a/static/src/js/app/admin/contest/edit_problem.js b/static/src/js/app/admin/contest/edit_problem.js new file mode 100644 index 00000000..e69de29b diff --git a/template/admin/contest/edit_problem.html b/template/admin/contest/edit_problem.html new file mode 100644 index 00000000..e69de29b From b5313ce908494ff22dd8cb909e98b025ce7a40cf Mon Sep 17 00:00:00 2001 From: esp Date: Sun, 23 Aug 2015 17:36:35 +0800 Subject: [PATCH 02/21] =?UTF-8?q?[=E5=89=8D=E7=AB=AF]=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BA=86=E5=90=8E=E5=8F=B0=E6=AF=94=E8=B5=9B=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E5=AF=B9=E9=97=AE=E9=A2=98=E7=9A=84=E6=B7=BB=E5=8A=A0=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E9=A1=B5=E9=9D=A2[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/js/app/admin/admin.js | 11 ++ .../src/js/app/admin/contest/edit_problem.js | 176 ++++++++++++++++++ template/admin/contest/edit_problem.html | 133 +++++++++++++ 3 files changed, 320 insertions(+) diff --git a/static/src/js/app/admin/admin.js b/static/src/js/app/admin/admin.js index 989cbf76..ac2d6841 100644 --- a/static/src/js/app/admin/admin.js +++ b/static/src/js/app/admin/admin.js @@ -123,6 +123,17 @@ define("admin", ["jquery", "avalon"], function ($, avalon) { vm.template_url = "template/problem/submission_list.html"; }); + vm.$watch("showContestProblemPage", function (problemId, contestId) { + vm.problemId = problemId; + vm.contestId = contestId; + vm.template_url = "template/contest/edit_problem.html"; + }); + + vm.$watch("showContestListPage", function (problemId) { + vm.problemId = problemId; + vm.template_url = "template/contest/contest_list.html"; + }); + avalon.scan(); window.onhashchange = function () { diff --git a/static/src/js/app/admin/contest/edit_problem.js b/static/src/js/app/admin/contest/edit_problem.js index e69de29b..5e03f27c 100644 --- a/static/src/js/app/admin/contest/edit_problem.js +++ b/static/src/js/app/admin/contest/edit_problem.js @@ -0,0 +1,176 @@ +require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagEditor", "validator", "jqueryUI"], + function ($, avalon, editor, uploader, bsAlert, csrfTokenHeader) { + + avalon.ready(function () { + avalon.vmodels.editProblem = null; + $("#edit-problem-form").validator() + .on('submit', function (e) { + if (!e.isDefaultPrevented()){ + e.preventDefault(); + if (vm.testCaseId == "") { + bsAlert("你还没有上传测试数据!"); + return false; + } + if (vm.description == "") { + bsAlert("题目描述不能为空!"); + return false; + } + if (vm.timeLimit < 1000 || vm.timeLimit > 5000) { + bsAlert("保证时间限制是一个1000-5000的合法整数"); + return false; + } + if (vm.samples.length == 0) { + bsAlert("请至少添加一组样例!"); + return false; + } + for (var i = 0; i < vm.samples.length; i++) { + if (vm.samples[i].input == "" || vm.samples[i].output == "") { + bsAlert("样例输入与样例输出不能为空!"); + return false; + } + } + var ajaxData = { + title: vm.title, + description: vm.description, + time_limit: vm.timeLimit, + memory_limit: vm.memoryLimit, + samples: [], + test_case_id: vm.testCaseId, + hint: vm.hint, + visible: vm.visible, + contest_id: avalon.vmodels.admin.contestId, + input_description: vm.inputDescription, + output_description: vm.outputDescription, + sort_index: vm.sortIndex, + }; + var method = "post"; + if (avalon.vmodels.admin.problemId) { + method = "put"; + ajaxData.id = avalon.vmodels.admin.problemId; + } + + for (var i = 0; i < vm.samples.$model.length; i++) { + ajaxData.samples.push({input: vm.samples.$model[i].input, output: vm.samples.$model[i].output}); + } + + $.ajax({ + beforeSend: csrfTokenHeader, + url: "/api/admin/contest_problem/", + dataType: "json", + data: JSON.stringify(ajaxData), + method: method, + contentType: "application/json", + success: function (data) { + if (!data.code) { + bsAlert("题目编辑成功!"); + vm.goBack(true); + } + else { + bsAlert(data.data); + } + } + + }); + return false; + } + }); + + var vm = avalon.define({ + $id: "editProblem", + title: "", + description: "", + timeLimit: 0, + memoryLimit: 0, + samples: [], + hint: "", + sortIndex: "", + visible: true, + //difficulty: 0, + inputDescription: "", + outputDescription: "", + testCaseIdd: "", + uploadSuccess: false, + //source: "", + testCaseList: [], + addSample: function () { + vm.samples.push({input: "", output: "", "visible": true}); + }, + delSample: function (sample) { + if (confirm("你确定要删除么?")) { + vm.samples.remove(sample); + } + }, + toggleSample: function (sample) { + sample.visible = !sample.visible; + }, + getBtnContent: function (item) { + if (item.visible) + return "折叠"; + return "展开"; + }, + goBack: function(check){ + if (check||confirm("这将丢失所有的改动,确定要继续么?")) { + vm.$fire("up!showContestListPage"); + } + } + }); + var hintEditor = editor("#hint"); + var descriptionEditor = editor("#problemDescription"); + var testCaseUploader = uploader("#testCaseFile", "/api/admin/test_case_upload/", function (file, response) { + if (response.code) + bsAlert(response.data); + else { + vm.testCaseId = response.data.test_case_id; + vm.uploadSuccess = true; + vm.testCaseList = []; + for (var i = 0; i < response.data.file_list.input.length; i++) { + vm.testCaseList.push({ + input: response.data.file_list.input[i], + output: response.data.file_list.output[i] + }); + } + bsAlert("测试数据添加成功!共添加" + vm.testCaseList.length + "组测试数据"); + } + }); + + + if (avalon.vmodels.admin.problemId){ + $.ajax({ + url: "/api/admin/contest_problem/?contest_problem_id=" + avalon.vmodels.admin.problemId, + method: "get", + dataType: "json", + success: function (data) { + if (data.code) { + bsAlert(data.data); + } + else { + var problem = data.data; + console.log(problem); + vm.sortIndex = problem.sort_index; + vm.title = problem.title; + vm.description = problem.description; + vm.timeLimit = problem.time_limit; + vm.memoryLimit = problem.memory_limit; + for (var i = 0; i < problem.samples.length; i++) { + vm.samples.push({ + input: problem.samples[i].input, + output: problem.samples[i].output, + visible: false + }) + } + vm.hint = problem.hint; + vm.visible = problem.visible; + vm.inputDescription = problem.input_description; + vm.outputDescription = problem.output_description; + vm.testCaseId = problem.test_case_id; + vm.source = problem.source; + hintEditor.setValue(vm.hint); + descriptionEditor.setValue(vm.description); + } + } + }); + } + }); + avalon.scan(); + + }); diff --git a/template/admin/contest/edit_problem.html b/template/admin/contest/edit_problem.html index e69de29b..f6bea35d 100644 --- a/template/admin/contest/edit_problem.html +++ b/template/admin/contest/edit_problem.html @@ -0,0 +1,133 @@ +
+
+ + +
+ + +
+
+
+ + +
+
+ +
+ + + 请填写题目描述 +
+ + +
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+
+ +
+
+

+ + 添加 + +
+
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+

+
+ 请将所有测试用例打包在一个文件中上传,所有文件要在压缩包的根目录,且输入输出文件名要以从1开始连续数字标识要对应例如:
+ 1.in 1.out 2.in 2.out +
+ + + + + + + + + + + +
编号输入文件名输出文件名
{{ $index + 1 }}{{ el.input }}{{ el.output }}
+
+
+
+
选择文件
+
+
+
+ + +
+
+ +
+
+
+ + From 018727ffbc8acd6f0feb8feb7c77494f397f1e78 Mon Sep 17 00:00:00 2001 From: esp Date: Sun, 23 Aug 2015 17:41:33 +0800 Subject: [PATCH 03/21] =?UTF-8?q?[=E5=89=8D=E7=AB=AF]=E6=8A=8A=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=AF=94=E8=B5=9B=E5=92=8C=E6=B7=BB=E5=8A=A0=E6=AF=94?= =?UTF-8?q?=E8=B5=9B=E9=97=AE=E9=A2=98=E5=88=86=E5=BC=80=E4=BA=86,?= =?UTF-8?q?=E5=B0=B1=E6=98=AF=E6=8A=8A=E6=B7=BB=E5=8A=A0=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E4=BB=8E=E6=B7=BB=E5=8A=A0=E6=AF=94=E8=B5=9B?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=88=A0=E9=99=A4=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/js/app/admin/contest/add_contest.js | 189 ++++++------------ template/admin/contest/add_contest.html | 173 +++------------- 2 files changed, 79 insertions(+), 283 deletions(-) diff --git a/static/src/js/app/admin/contest/add_contest.js b/static/src/js/app/admin/contest/add_contest.js index dfa8d603..f15d50aa 100644 --- a/static/src/js/app/admin/contest/add_contest.js +++ b/static/src/js/app/admin/contest/add_contest.js @@ -1,6 +1,8 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "datetimePicker", "validator"], function ($, avalon, editor, uploader, bsAlert, csrfTokenHeader) { + + avalon.vmodels.add_contest = null; $("#add-contest-form").validator().on('submit', function (e) { if (!e.isDefaultPrevented()){ @@ -12,12 +14,15 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "date contest_type: 0, show_rank: vm.showRank, show_user_submission: vm.showSubmission, - //password: vm.password, start_time: vm.startTime, end_time: vm.endTime, - visible: true + visible: false }; - if (vm.choseGroupList[0].id == 0) //everyone | public contest + if (vm.choseGroupsList.length == 0) { + bsAlert("你没有选择参赛用户!"); + return false; + } + if (vm.choseGroupsList[0].id == 0) //everyone | public contest if (vm.password == "") ajaxData.contest_type = 1; else{ @@ -25,13 +30,12 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "date } else { // Add groups info ajaxData.groups = []; - for (var i = 0; vm.choseGroupList[i]; i++) - ajaxData.groups.push(parseInt(vm.choseGroupList[i].id)) + for (var i = 0; vm.choseGroupsList[i]; i++) + ajaxData.groups.push(parseInt(vm.choseGroupsList[i].id)) } - console.log(ajaxData); - $.ajax({ + $.ajax({ // Add contest beforeSend: csrfTokenHeader, url: "/api/admin/contest/", dataType: "json", @@ -41,7 +45,8 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "date contentType: "application/json", success: function (data) { if (!data.code) { - bsAlert("添加成功!"); + bsAlert("添加成功!将转到比赛列表页以便为比赛添加问题(注意比赛当前状态为:隐藏)"); + location.hash = "#contest/contest_list"; console.log(data); } else { @@ -56,8 +61,6 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "date }); editor("#editor"); - editor("#problemDescriptionEditor"); - editor("#problemHintEditor"); var vm = avalon.define({ $id: "add_contest", @@ -69,151 +72,71 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "date mode: "", showRank: false, showSubmission: false, - problems: [], - editingProblemId: 0, - editSamples: [], - editTestCaseList: [], group: "-1", groupList: [], - choseGroupList: [], - showProblemEditArea: function (problemIndex) { - if (vm.editingProblemId == problemIndex){ - vm.problems[vm.editingProblemId-1].samples = vm.editSamples; - vm.editingProblemId = 0; - } - else { - if (vm.editingProblemId) - { - vm.problems[vm.editingProblemId-1].samples = vm.editSamples; - vm.problems[vm.editingProblemId-1].testCaseList = vm.editTestCaseList; - } - vm.editingProblemId = problemIndex; - vm.editSamples = []; - vm.editSamples = vm.problems[vm.editingProblemId-1].samples; - vm.editTestCaseList = []; - vm.editTestCaseList = vm.problems[vm.editingProblemId-1].testCaseList; - } - }, + choseGroupsList: [], passwordUsable: false, - add_problem: function () { - var problem = { - title: "", - timeLimit: 1000, - memoryLimit: 256, - description: "", - samples: [], - visible: true, - test_case_id: "", - testCaseList: [], - hint: "", - score: 0, - uploadSuccess: false, - }; - vm.problems.push(problem); - vm.showProblemEditArea(vm.problems.length); - }, - del_problem: function (problemIndex) { - if (confirm("你确定要删除么?")) { - vm.editingProblemId = 0; - vm.problems.remove(vm.problems[problemIndex-1]); - } - }, - hidden: function () { - vm.problems[vm.editingProblemId-1].samples = editSamples; - vm.problems[vm.editingProblemId-1].testCaseList = editTestCaseList; - vm.editingProblemId = 0; - }, - toggle: function (item) { - item.visible = !item.visible; - }, - add_sample: function () { - vm.editSamples.push({visible: true, input: "", output: ""}); - }, - del_sample: function (sample) { - if (confirm("你确定要删除么?")) { - editSamples.remove(sample); - } - }, - getBtnContent: function (item) { - if (item.visible) - return "折叠"; - return "展开"; - }, addGroup: function() { if (vm.group == -1) return; if (vm.groupList[vm.group].id == 0){ vm.passwordUsable = true; - vm.choseGroupList = []; + vm.choseGroupsList = []; for (var key in vm.groupList){ vm.groupList[key].chose = true; } } vm.groupList[vm.group]. chose = true; - vm.choseGroupList.push({name:vm.groupList[vm.group].name, index:vm.group, id:vm.groupList[vm.group].id}); + vm.choseGroupsList.push({name:vm.groupList[vm.group].name, index:vm.group, id:vm.groupList[vm.group].id}); + vm.group = -1; }, - unchose: function(groupIndex){ - if (vm.groupList[vm.choseGroupList[groupIndex].index].id == 0){ + removeGroup: function(groupIndex){ + if (vm.groupList[vm.choseGroupsList[groupIndex].index].id == 0){ vm.passwordUsable = false; for (key in vm.groupList){ vm.groupList[key].chose = false; } } - vm.groupList[vm.choseGroupList[groupIndex].index].chose = false; - vm.choseGroupList.remove(vm.choseGroupList[groupIndex]); + vm.groupList[vm.choseGroupsList[groupIndex].index].chose = false; + vm.choseGroupsList.remove(vm.choseGroupsList[groupIndex]); } }); - var isSuperAdmin = true; - $.ajax({ //用于获取该用户创建的所有小组的ajax请求 - beforeSend: csrfTokenHeader, - url: "/api/admin/group/?my_group=true", - dataType: "json", - method: "get", - contentType: "application/json", - success: function (data) { - if (!data.code) { - if (isSuperAdmin) - vm.groupList.push({id:0, name:"所有人", chose: false}); - for (var key in data.data) { - data.data[key].chose = false; - vm.groupList.push(data.data[key]); - } - } - else { - bsAlert(data.data); - console.log(data); - } - } - }); + $.ajax({ // Get current user type + url: "/api/user/", + method: "get", + dataType: "json", + success: function (data) { + if (!data.code) { + if (data.data.admin_type == 2) { // Is super user + vm.isGlobal = true; + vm.groupList.push({id:0,name:"所有人",chose:false}); + } + $.ajax({ // Get the group list of current user + beforeSend: csrfTokenHeader, + url: "/api/admin/group/", + method: "get", + dataType: "json", + success: function (data) { + if (!data.code) { + if (!data.data.length) { + bsAlert("您的用户权限只能创建组内比赛,但是您还没有创建过小组"); + return; + } + for (var i = 0; i < data.data.length; i++) { + var item = data.data[i]; + item["chose"] = false; + vm.groupList.push(item); + } + } + else { + bsAlert(data.data); + } + } + }); + } + } + }); - - - uploader("#uploader", "/api/admin/test_case_upload/", function (file, respond) { - if (respond.code) - bsAlert(respond.data); - else { - vm.problems[vm.editingProblemId-1].test_case_id = respond.data.test_case_id; - vm.problems[vm.editingProblemId-1].uploadSuccess = true; - vm.editTestCaseList = []; - for (var i = 0; i < respond.data.file_list.input.length; i++) { - vm.editTestCaseList.push({ - input: respond.data.file_list.input[i], - output: respond.data.file_list.output[i] - }); - } - vm.problems[vm.editingProblemId-1].testCaseList = vm.editTestCaseList; - bsAlert("测试数据添加成功!共添加"+vm.editTestCaseList.length +"组测试数据"); - } - }, - function(){ - if (vm.editingProblemId == 0) - { - bsAlert("你还未指定一道题目!"); - return false; - } - } - ); - avalon.scan(); $("#contest_start_time").datetimepicker({ diff --git a/template/admin/contest/add_contest.html b/template/admin/contest/add_contest.html index 44ae98ac..de33f23a 100644 --- a/template/admin/contest/add_contest.html +++ b/template/admin/contest/add_contest.html @@ -6,8 +6,9 @@
- + +
@@ -17,51 +18,46 @@
+
请填写比赛描述
-
-
- -
-
+ ms-duplex="startTime" data-error="请填写比赛开始时间" required> +
+
-
-
-
-
- -
-
- -
-
-
- + ms-duplex="endTime" data-error="请填写比赛结束时间" required> + +
+
- + +
+
+
+ +
+
-
{{el.name}}
+
{{el.name}}
@@ -94,135 +90,12 @@
-
- - 添加 - - - - - - - - - - - - - -
编号题目测试数据
题目{{ $index+1 }}{{ el.title }}{{ el.testCaseList.length }}组 - 编辑 - 删除 -
- -
-
- -
-
-
- 题目{{editingProblemId}} - 隐藏 - 删除 -
-
-
- - -
-
-
- - - 请填写题目描述 -
-
- - -
-
- - -
-
-
- - -
-
-
- - -
-
-
- - 添加 -
-
-
- 样例{{$index + 1}} - {{ getBtnContent(sample)}} - 删除 -
-
-
-
- - -
-
-
-
- - -
-
-
-
-
-
-
- - - - - - - - - - - - - -
编号输入文件名输出文件名
{{$index}}{{ el.input }}{{ el.output }}
-
-
-
-
-
-
- -
-
选择文件
-
- 请将所有测试用例打包在一个文件中上传,所有文件要在压缩包的根目录,且输入输出文件名要以从1开始连续数字标识要对应例如:
- 1.in 1.out 2.in 2.out -

-
From 2411968962096577dcde31b3208712ef19574a39 Mon Sep 17 00:00:00 2001 From: esp Date: Sun, 23 Aug 2015 17:44:52 +0800 Subject: [PATCH 04/21] =?UTF-8?q?[=E5=89=8D=E7=AB=AF]=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=AF=94=E8=B5=9B=E5=88=97=E8=A1=A8=E9=A1=B5=E9=9D=A2,?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E7=BC=96=E8=BE=91=E6=AF=94=E8=B5=9B?= =?UTF-8?q?,=E7=BC=96=E8=BE=91=E6=AF=94=E8=B5=9B=E9=A2=98=E7=9B=AE[CI=20SK?= =?UTF-8?q?IP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/js/app/admin/contest/contest_list.js | 363 ++++++++++++------ template/admin/contest/contest_list.html | 265 +++++++------ 2 files changed, 380 insertions(+), 248 deletions(-) diff --git a/static/src/js/app/admin/contest/contest_list.js b/static/src/js/app/admin/contest/contest_list.js index 0be9cfb9..b6efbd79 100644 --- a/static/src/js/app/admin/contest/contest_list.js +++ b/static/src/js/app/admin/contest/contest_list.js @@ -1,93 +1,220 @@ -require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker"], function ($, avalon, csrfTokenHeader, bsAlert, editor) { +require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", "validator"], function ($, avalon, csrfTokenHeader, bsAlert, editor) { avalon.ready(function () { - if(avalon.vmodels.contestList){ - vm = avalon.vmodels.contestList; - vm.editingContest = 0; - } - else { - var vm = avalon.define({ - $id: "contestList", - contestList: [], - previousPage: 0, - nextPage: 0, - page: 1, - totalPage: 1, - group: "-1", - groupList: [], - keyword: "", - editingContestId: 0, - editTitle: "", - editProblemList: [], - editPassword: "", - editStartTime: "", - editEndTime: "", - editMode: "", - editShowRank: false, - editShowSubmission: false, - editProblemList: [], - editingProblemId: 0, - editSamples: [], - editTestCaseList: [], - editChoseGroupList: [], - modelNameList: ["ACM", "AC总数", "分数"], - contestTypeNameList: ["小组赛", "公开赛", "有密码保护的公开赛"], - getNext: function () { - if (!vm.nextPage) - return; - getPageData(vm.page + 1); - }, - getPrevious: function () { - if (!vm.previousPage) - return; - getPageData(vm.page - 1); - }, - getBtnClass: function (btn) { - if (btn == "next") { - return vm.nextPage ? "btn btn-primary" : "btn btn-primary disabled"; - } - else { - return vm.previousPage ? "btn btn-primary" : "btn btn-primary disabled"; - } - }, - getPage: function (page_index) { - getPageData(page_index); - }, - showEditContestArea: function (contestId) { - if (contestId == vm.editingContestId) - vm.editingContestId = 0; - else { - vm.editingContestId = contestId; - vm.editTitle = vm.contestList[contestId-1].title; - vm.editEndTime = vm.contestList[contestId-1].end_time; - vm.editPassword = vm.contestList[contestId-1].password; - vm.editStartTime = vm.contestList[contestId-1].start_time; - vm.editMode = vm.contestList[contestId-1].mode; - vm.editChoseGroupList = []; - //= vm.contestList[contestId-1].group;// - /*for (var key in vm.contestList[contestId-1].groups){ - var id = parseInt(vm.contestList[contestId-1].groups); - for () - vm.editChoseGroupList.push({ - name:vm.groupList[vm.group].name, - index:index, - id:parseInt(vm.contestList[contestId-1].groups) - }); - }*/ - vm.editShowRank = vm.contestList[contestId-1].show_rank; - vm.editShowSubmission = vm.contestList[contestId-1].show_user_submission; - //vm.editProblemList = vm.contestList[contestId-1].problems - editor("#editor").setValue(vm.contestList[contestId-1].description); - vm.editingProblemList = vm.contestList[contestId-1].problemList; - } - } - }); - getPageData(1); - } + avalon.vmodels.contestList=null; + + $("#edit-contest-form").validator().on('submit', function (e) { + if (!e.isDefaultPrevented()){ + e.preventDefault(); + var ajaxData = { + id: vm.contestList[vm.editingContestId-1].id, + title: vm.editTitle, + description: vm.editDescription, + mode: vm.editMode, + contest_type: 0, + show_rank: vm.editShowRank, + show_user_submission: vm.editShowSubmission, + start_time: vm.editStartTime, + end_time: vm.editEndTime, + visible: vm.editVisible + }; + if (vm.choseGroupList.length == 0) { + bsAlert("你没有选择参赛用户!"); + return false; + } + if (vm.choseGroupList[0].id == 0) //everyone | public contest + if (vm.password == "") + ajaxData.contest_type = 1; + else{ + ajaxData.password = vm.password; + } + else { // Add groups info + ajaxData.groups = []; + for (var i = 0; vm.choseGroupList[i]; i++) + ajaxData.groups.push(parseInt(vm.choseGroupList[i].id)) + } + + console.log(ajaxData); + $.ajax({ // Add contest + beforeSend: csrfTokenHeader, + url: "/api/admin/contest/", + dataType: "json", + contentType: "application/json", + data: JSON.stringify(ajaxData), + method: "put", + contentType: "application/json", + success: function (data) { + if (!data.code) { + bsAlert("修改成功!"); + console.log(data); + vm.getPage(1); + } + else { + bsAlert(data.data); + console.log(data); + } + } + }); + console.log(JSON.stringify(ajaxData)); + } + return false; + }); + + var vm = avalon.define({ + $id: "contestList", + contestList: [], + previousPage: 0, + nextPage: 0, + page: 1, + totalPage: 1, + group: "-1", + groupList: [], + choseGroupList: [], + passwordUsable: false, + keyword: "", + editingContestId: 0, + editTitle: "", + editDescription: "", + editProblemList: [], + editPassword: "", + editStartTime: "", + editEndTime: "", + editMode: "", + editShowRank: false, + editShowSubmission: false, + editProblemList: [], + editVisible: false, + editChoseGroupList: [], + editingProblemContestIndex: 0, + getNext: function () { + if (!vm.nextPage) + return; + getPageData(vm.page + 1); + }, + getPrevious: function () { + if (!vm.previousPage) + return; + getPageData(vm.page - 1); + }, + getBtnClass: function (btn) { + if (btn == "next") { + return vm.nextPage ? "btn btn-primary" : "btn btn-primary disabled"; + } + else { + return vm.previousPage ? "btn btn-primary" : "btn btn-primary disabled"; + } + }, + getPage: function (page_index) { + getPageData(page_index); + }, + showEditContestArea: function (contestId) { + if (contestId == vm.editingContestId) + vm.editingContestId = 0; + else { + vm.editingContestId = contestId; + vm.editTitle = vm.contestList[contestId-1].title; + vm.editPassword = vm.contestList[contestId-1].password; + vm.editStartTime = vm.contestList[contestId-1].start_time.substring(0,16).replace("T"," "); + vm.editEndTime = vm.contestList[contestId-1].end_time.substring(0,16).replace("T"," "); + vm.editMode = vm.contestList[contestId-1].mode; + editVisible = vm.contestList[contestId-1].visible; + vm.editChoseGroupList = []; + for (var i = 0; i < vm.contestList[contestId-1].groups.length; i++){ + var id = parseInt(vm.contestList[contestId-1].groups[i]); + var index = 0; + for (; vm.groupList[index]; index++) { + if (vm.groupList[index].id == id) + break; + } + vm.groupList[index].chose = true; + vm.choseGroupList.push({ + name:vm.groupList[i].name, + index:index, + id:id + }); + } + vm.editShowRank = vm.contestList[contestId-1].show_rank; + vm.editShowSubmission = vm.contestList[contestId-1].show_user_submission; + editor("#editor").setValue(vm.contestList[contestId-1].description); + vm.editingProblemContestIndex = 0; + } + }, + showEditProblemArea: function(contestId) { + if (vm.editingProblemContestIndex == contestId) { + vm.editingProblemContestIndex = 0; + return; + } + if (vm.editingContestId&&!confirm("如果继续将丢失为保存的信息,是否继续?")){ + return; + } + $.ajax({ // Get the problem list of current contest + beforeSend: csrfTokenHeader, + url: "/api/admin/contest_problem/?contest_id=" + vm.contestList[contestId-1].id, + method: "get", + dataType: "json", + success: function (data) { + if (!data.code) { + vm.editProblemList = data.data; + } + else { + bsAlert(data.data); + } + } + }); + vm.editingContestId = 0; + vm.editingProblemContestIndex = contestId; + }, + addGroup: function() { + if (vm.group == -1) return; + if (vm.groupList[vm.group].id == 0){ + vm.passwordUsable = true; + vm.choseGroupList = []; + for (var key in vm.groupList){ + vm.groupList[key].chose = true; + } + } + vm.groupList[vm.group]. chose = true; + vm.choseGroupList.push({name:vm.groupList[vm.group].name, index:vm.group, id:vm.groupList[vm.group].id}); + vm.group = -1; + }, + removeGroup: function(groupIndex){ + if (vm.groupList[vm.choseGroupList[groupIndex].index].id == 0){ + vm.passwordUsable = false; + for (key in vm.groupList){ + vm.groupList[key].chose = false; + } + } + vm.groupList[vm.choseGroupList[groupIndex].index].chose = false; + vm.choseGroupList.remove(vm.choseGroupList[groupIndex]); + }, + add_problem: function () { + vm.$fire("up!showContestProblemPage", 0, vm.contestList[vm.editingProblemContestIndex-1].id); + }, + showProblemEditor: function(el) { + console.log(el); + vm.$fire("up!showContestProblemPage", el.id, vm.contestList[vm.editingProblemContestIndex-1].id); + } + }); + getPageData(1); + vm.editingContestId = 0; + vm.editingProblemContestIndex = 0; + + //init time picker + $("#contest_start_time").datetimepicker({ + format: "yyyy-mm-dd hh:ii", + minuteStep: 5, + weekStart: 1, + language: "zh-CN" + }); + $("#contest_end_time").datetimepicker({ + format: "yyyy-mm-dd hh:ii", + minuteStep: 5, + weekStart: 1, + language: "zh-CN" + }); function getPageData(page) { - var url = "/api/admin/contest/?paging=true&page=" + page + "&page_size=10"; if (vm.keyword != "") url += "&keyword=" + vm.keyword; @@ -109,52 +236,44 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker"] } }); } - - var isSuperAdmin = true; - - $.ajax({ //用于获取该用户创建的所有小组的ajax请求 - - url: "/api/admin/group/", + // Get group list + $.ajax({ // Get current user type + url: "/api/user/", method: "get", dataType: "json", success: function (data) { if (!data.code) { - if (!data.data.length) { - bsAlert("您的用户权限只能创建组内比赛,但是您还没有创建过小组"); - return; + if (data.data.admin_type == 2) { // Is super user + vm.isGlobal = true; + vm.groupList.push({id:0,name:"所有人",chose:false}); } - for (var i = 0; i < data.data.length; i++) { - var item = data.data[i]; - item["chose"] = false; - vm.groupList.push(item); + $.ajax({ // Get the group list of current user + beforeSend: csrfTokenHeader, + url: "/api/admin/group/", + method: "get", + dataType: "json", + success: function (data) { + if (!data.code) { + if (!data.data.length) { + //bsAlert("您的用户权限只能创建组内比赛,但是您还没有创建过小组"); + return; + } + for (var i = 0; i < data.data.length; i++) { + var item = data.data[i]; + item["chose"] = false; + vm.groupList.push(item); + } + } + else { + bsAlert(data.data); + } } - } - else { - bsAlert(data.data); - } + }); } + } + }); - beforeSend: csrfTokenHeader, - url: url, - dataType: "json", - method: "get", - contentType: "application/json", - success: function (data) { - if (!data.code) { - if (isSuperAdmin) - vm.groupList.push({id:0, name:"所有人", chose: false}); - for (var key in data.data) { - data.data[key].chose = false; - vm.groupList.push(data.data[key]); - } - } - else { - bsAlert(data.data); - console.log(data); - } - } - }); }); avalon.scan(); }); diff --git a/template/admin/contest/contest_list.html b/template/admin/contest/contest_list.html index ab878ae5..76daa48f 100644 --- a/template/admin/contest/contest_list.html +++ b/template/admin/contest/contest_list.html @@ -15,22 +15,23 @@ ID 比赛 - 比赛类型 公开排名 - 开始时间 - 结束时间 + 可见 创建时间 创建者 + - + {{ el.id }} {{ el.title }} - {{ contestTypeNameList[el.contest_type] }} {{ el.show_rank }} - {{ el.start_time|date("yyyy-MM-dd HH:mm:ss")}} - {{ el.end_time|date("yyyy-MM-dd HH:mm:ss")}} + {{ el.visible }} {{ el.create_time|date("yyyy-MM-dd HH:mm:ss")}} {{ el.created_by.username }} + + 编辑 + 编辑问题 +
@@ -39,130 +40,142 @@
-
- -
-
-
- +
+
+ +
+
+
+ -
+
+
-
-
- -
-
-
- -
- 请填写比赛描述 +
+
-
-
- -
-
- -
-
-
- -
-
-
-
-
- -
-
-
-
- -
-
- -
-
-
- -
-
-
-
- -
-
-
-
{{el.name}}
-
-
- -
-
- -
-
- -
-
-
- - - -
-
-
-
- -
-
-
-
- -
-
-
- - 添加 - - - - - - - - - - - - - -
编号题目测试数据
题目{{ $index+1 }}{{ el.title }}{{ el.testCaseList.length }}组 - 编辑 - 删除 -
+
+
+ -
+
+ 请填写比赛描述 +
+
+
+ + +
+ + +
+
+
+
+ + +
+ + +
+
+
+
+ + +
+ +
+
+
+ + +
+
+
{{el.name}}
+
+
+ +
+
+ +
+
+ +
+
+ + +
+ + + +
+
+
+
+ +
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ +
+
+
+ + 添加 + + + + + + + + + + + + + +
编号题目创建时间
{{ el.sort_index }}{{ el.title }}{{ el.create_time|date("yyyy-MM-dd HH:mm:ss") }} + 编辑 +
+ +
+
From ae45d79e8a3c6cea67b6f9c58fc8289667f1804a Mon Sep 17 00:00:00 2001 From: esp Date: Sun, 23 Aug 2015 21:11:01 +0800 Subject: [PATCH 05/21] =?UTF-8?q?[=E5=90=8E=E7=AB=AF]=E4=BF=AE=E5=A4=8Dtyp?= =?UTF-8?q?o,=E5=B7=A5=E4=BD=9C=E6=AD=A3=E5=B8=B8,=E6=B2=A1=E5=86=99?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E8=BF=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest/views.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/contest/views.py b/contest/views.py index 6d78456e..df8acb0c 100644 --- a/contest/views.py +++ b/contest/views.py @@ -132,7 +132,7 @@ class ContestAdminAPIView(APIView): response_serializer: ContestSerializer """ if request.user.admin_type == SUPER_ADMIN: - contest = Contest.objects.all().order_by("-last_update_time") + contest = Contest.objects.all().order_by("-last_updated_time") else: contest = Contest.objects.filter(created_by=request.user).order_by("-last_updated_time") visible = request.GET.get("visible", None) @@ -219,7 +219,10 @@ class ContestProblemAdminAPIView(APIView): return success_response(ContestProblemSerializer(contest_problem).data) except ContestProblem.DoesNotExist: return error_response(u"比赛题目不存在") - contest_problem = ContestProblem.objects.all().order_by("sort_index") + if request.user.admin_type == SUPER_ADMIN: + contest_problem = ContestProblem.objects.all().order_by("sort_index") + else: + contest_problem = ContestProblem.objects.filter(created_by=request.user).order_by("sort_index") visible = request.GET.get("visible", None) if visible: contest_problem = contest_problem.filter(visible=(visible == "true")) @@ -230,9 +233,9 @@ class ContestProblemAdminAPIView(APIView): contest_id = request.GET.get("contest_id", None) if contest_id: try: - contest = Contest.objects.get(id=contest_id,created_by=request.user) + contest = Contest.objects.get(id=contest_id) except Contest.DoesNotExist: - return error_response(u"非法的比赛ID") + return error_response(u"该比赛不存在!") contest_problem = contest_problem.filter(contest=contest).order_by("sort_index") return paginate(request, contest_problem, ContestProblemSerializer) From f723aa91adead0ffbc5bdb12b29ba1c28263d812 Mon Sep 17 00:00:00 2001 From: esp Date: Mon, 24 Aug 2015 12:21:46 +0800 Subject: [PATCH 06/21] =?UTF-8?q?[=E5=90=8E=E7=AB=AF]=E4=B8=BA=E6=AF=94?= =?UTF-8?q?=E8=B5=9Bproblem=20model=E6=B7=BB=E5=8A=A0=E5=88=86=E6=95=B0(sc?= =?UTF-8?q?ore)=E5=AD=97=E6=AE=B5,=E7=94=A8=E4=BA=8E=E8=AE=B0=E5=88=86?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E7=9A=84=E6=AF=94=E8=B5=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest/models.py | 1 + contest/serializers.py | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contest/models.py b/contest/models.py index 3611c3af..ef984d06 100644 --- a/contest/models.py +++ b/contest/models.py @@ -42,6 +42,7 @@ class ContestProblem(AbstractProblem): contest = models.ForeignKey(Contest) # 比如A B 或者1 2 或者 a b 将按照这个排序 sort_index = models.CharField(max_length=30) + score = models.IntegerField(default=0) class Meta: db_table = "contest_problem" diff --git a/contest/serializers.py b/contest/serializers.py index 23d84742..a9f33ee4 100644 --- a/contest/serializers.py +++ b/contest/serializers.py @@ -70,11 +70,11 @@ class CreateContestProblemSerializer(serializers.Serializer): time_limit = serializers.IntegerField() memory_limit = serializers.IntegerField() hint = serializers.CharField(max_length=3000, allow_blank=True) + score = serializers.IntegerField(required=False, default=0) sort_index = serializers.CharField(max_length=30) class ContestProblemSerializer(serializers.ModelSerializer): - class ContestSerializer(serializers.ModelSerializer): class Meta: model = Contest @@ -101,10 +101,9 @@ class EditContestProblemSerializer(serializers.Serializer): hint = serializers.CharField(max_length=3000, allow_blank=True) visible = serializers.BooleanField() sort_index = serializers.CharField(max_length=30) + score = serializers.IntegerField(required=False, default=0) class ContestPasswordVerifySerializer(serializers.Serializer): contest_id = serializers.IntegerField() password = serializers.CharField(max_length=30) - - From eb073c8ac94b898f3d5f333e9fc3ac99dc8a287b Mon Sep 17 00:00:00 2001 From: esp Date: Mon, 24 Aug 2015 12:31:20 +0800 Subject: [PATCH 07/21] =?UTF-8?q?[=E5=90=8E=E7=AB=AF]=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=AF=94=E8=B5=9B=E9=A2=98=E7=9B=AE=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=AF=B9=E9=A2=98=E7=9B=AE=E5=88=86=E6=95=B0=E7=9A=84?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest/views.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/contest/views.py b/contest/views.py index df8acb0c..402b7a74 100644 --- a/contest/views.py +++ b/contest/views.py @@ -171,7 +171,8 @@ class ContestProblemAdminAPIView(APIView): created_by=request.user, hint=data["hint"], contest=contest, - sort_index=data["sort_index"]) + sort_index=data["sort_index"], + score=data["score"]) return success_response(ContestProblemSerializer(contest_problem).data) else: return serializer_invalid_response(serializer) @@ -201,6 +202,7 @@ class ContestProblemAdminAPIView(APIView): contest_problem.hint = data["hint"] contest_problem.visible = data["visible"] contest_problem.sort_index = data["sort_index"] + contest_problem.score = data["score"] contest_problem.save() return success_response(ContestProblemSerializer(contest_problem).data) else: From e40f9deccf577e4949d01f03ffed0e8960e93551 Mon Sep 17 00:00:00 2001 From: esp Date: Mon, 24 Aug 2015 12:36:08 +0800 Subject: [PATCH 08/21] =?UTF-8?q?[=E5=89=8D=E7=AB=AF-=E5=90=8E=E5=8F=B0]?= =?UTF-8?q?=E6=AF=94=E8=B5=9B=E7=AE=A1=E7=90=86,=E5=AF=B9=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0,=E7=BC=96=E8=BE=91,=E5=88=97=E8=A1=A8=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E7=9A=84avalon=E4=BD=BF=E7=94=A8=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E5=81=9A=E4=BA=86=E7=BB=9F=E4=B8=80=E7=9A=84=E6=94=B9=E5=8F=98?= =?UTF-8?q?,=E9=98=B2=E6=AD=A2=E5=87=BA=E7=8E=B0=E9=A1=B5=E5=86=85?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E6=94=B9=E5=8F=98=E4=BD=86=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E4=B8=8D=E5=88=B7=E6=96=B0=E7=9A=84=E6=83=85=E5=86=B5=E4=B8=8B?= =?UTF-8?q?=E5=AF=BC=E8=87=B4avalon=E5=8A=9F=E8=83=BD=E9=97=B4=E6=AD=87?= =?UTF-8?q?=E6=80=A7=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98,?= =?UTF-8?q?=E4=BD=86=E6=98=AF=E4=BB=A3=E7=A0=81=E9=87=8F=E5=8F=98=E5=A4=A7?= =?UTF-8?q?=E4=BA=86=E4=B8=80=E4=BA=9B,=E8=BF=98=E7=AE=97=E6=98=AF?= =?UTF-8?q?=E6=95=B4=E6=B4=81.=E5=85=B7=E4=BD=93=E6=98=AF=E6=89=80?= =?UTF-8?q?=E6=9C=89=E9=A1=B5=E9=9D=A2=E7=9A=84avalon=E5=8F=AA=E5=9C=A8?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E7=AC=AC=E4=B8=80=E6=AC=A1=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E5=80=99=E5=88=9D=E5=A7=8B=E5=8C=96,?= =?UTF-8?q?=E5=86=8D=E6=AC=A1=E5=8A=A0=E8=BD=BD=E6=97=B6=E5=8F=AA=E5=AF=B9?= =?UTF-8?q?vm=E5=86=85=E9=83=A8=E5=8F=98=E9=87=8F=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96,=E8=80=8C=E4=B8=8D=E8=B0=83?= =?UTF-8?q?=E7=94=A8avalon.define=E4=BA=86[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/js/app/admin/admin.js | 10 +- .../src/js/app/admin/contest/add_contest.js | 139 ++++++++++-------- .../src/js/app/admin/contest/contest_list.js | 101 +++++++++---- .../src/js/app/admin/contest/edit_problem.js | 71 ++++++--- template/admin/contest/add_contest.html | 2 +- template/admin/contest/contest_list.html | 6 +- template/admin/contest/edit_problem.html | 5 + 7 files changed, 217 insertions(+), 117 deletions(-) diff --git a/static/src/js/app/admin/admin.js b/static/src/js/app/admin/admin.js index ac2d6841..bd0d51e2 100644 --- a/static/src/js/app/admin/admin.js +++ b/static/src/js/app/admin/admin.js @@ -75,6 +75,9 @@ define("admin", ["jquery", "avalon"], function ($, avalon) { groupId: -1, problemId: -1, adminNavList: [], + $contestMode: -1, + $problemId: -1, + $contestId: -1, hide_loading: function () { $("#loading-gif").hide(); }, @@ -123,9 +126,10 @@ define("admin", ["jquery", "avalon"], function ($, avalon) { vm.template_url = "template/problem/submission_list.html"; }); - vm.$watch("showContestProblemPage", function (problemId, contestId) { - vm.problemId = problemId; - vm.contestId = contestId; + vm.$watch("showContestProblemPage", function (problemId, contestId, contestMode) { + vm.$problemId = problemId; + vm.$contestId = contestId; + vm.$contestMode = contestMode vm.template_url = "template/contest/edit_problem.html"; }); diff --git a/static/src/js/app/admin/contest/add_contest.js b/static/src/js/app/admin/contest/add_contest.js index f15d50aa..d62ddad3 100644 --- a/static/src/js/app/admin/contest/add_contest.js +++ b/static/src/js/app/admin/contest/add_contest.js @@ -2,66 +2,81 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "date "validator"], function ($, avalon, editor, uploader, bsAlert, csrfTokenHeader) { - - avalon.vmodels.add_contest = null; + //avalon.vmodels.add_contest = null; $("#add-contest-form").validator().on('submit', function (e) { if (!e.isDefaultPrevented()){ e.preventDefault(); - var ajaxData = { - title: vm.title, - description: vm.description, - mode: vm.mode, - contest_type: 0, - show_rank: vm.showRank, - show_user_submission: vm.showSubmission, - start_time: vm.startTime, - end_time: vm.endTime, - visible: false - }; - if (vm.choseGroupsList.length == 0) { - bsAlert("你没有选择参赛用户!"); - return false; - } - if (vm.choseGroupsList[0].id == 0) //everyone | public contest - if (vm.password == "") - ajaxData.contest_type = 1; - else{ - ajaxData.password = vm.password; - } - else { // Add groups info - ajaxData.groups = []; - for (var i = 0; vm.choseGroupsList[i]; i++) - ajaxData.groups.push(parseInt(vm.choseGroupsList[i].id)) - } + var ajaxData = { + title: vm.title, + description: vm.description, + mode: vm.mode, + contest_type: 0, + show_rank: vm.showRank, + show_user_submission: vm.showSubmission, + start_time: vm.startTime, + end_time: vm.endTime, + visible: false + }; + if (vm.choseGroupList.length == 0) { + bsAlert("你没有选择参赛用户!"); + return false; + } + if (vm.choseGroupList[0].id == 0) { //everyone | public contest + if (vm.password) { + ajaxData.password = vm.password; + ajaxData.contest_type = 2; + } + else{ + ajaxData.contest_type = 1; + } + } + else { // Add groups info + ajaxData.groups = []; + for (var i = 0; vm.choseGroupList[i]; i++) + ajaxData.groups.push(parseInt(vm.choseGroupList[i].id)) + } - console.log(ajaxData); - $.ajax({ // Add contest - beforeSend: csrfTokenHeader, - url: "/api/admin/contest/", - dataType: "json", - contentType: "application/json", - data: JSON.stringify(ajaxData), - method: "post", - contentType: "application/json", - success: function (data) { - if (!data.code) { - bsAlert("添加成功!将转到比赛列表页以便为比赛添加问题(注意比赛当前状态为:隐藏)"); - location.hash = "#contest/contest_list"; - console.log(data); - } - else { - bsAlert(data.data); - console.log(data); - } + console.log(ajaxData); + $.ajax({ // Add contest + beforeSend: csrfTokenHeader, + url: "/api/admin/contest/", + dataType: "json", + contentType: "application/json", + data: JSON.stringify(ajaxData), + method: "post", + contentType: "application/json", + success: function (data) { + if (!data.code) { + bsAlert("添加成功!将转到比赛列表页以便为比赛添加问题(注意比赛当前状态为:隐藏)"); + vm.title = ""; + vm.description = ""; + vm.startTime = ""; + vm.endTime = ""; + vm.password = ""; + vm.mode = ""; + vm.showRank = false; + vm.showSubmission = false; + vm.group = "-1"; + vm.groupList = []; + vm.choseGroupList = []; + vm.passwordUsable = false; + location.hash = "#contest/contest_list"; + } + else { + bsAlert(data.data); + console.log(data); + } } - }); - console.log(JSON.stringify(ajaxData)); - } - return false; - }); + }); + console.log(JSON.stringify(ajaxData)); + } + return false; + }); editor("#editor"); - + if (avalon.vmodels.add_contest) + var vm = avalon.vmodels.add_contest; + else var vm = avalon.define({ $id: "add_contest", title: "", @@ -74,34 +89,34 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "date showSubmission: false, group: "-1", groupList: [], - choseGroupsList: [], + choseGroupList: [], passwordUsable: false, addGroup: function() { if (vm.group == -1) return; if (vm.groupList[vm.group].id == 0){ vm.passwordUsable = true; - vm.choseGroupsList = []; + vm.choseGroupList = []; for (var key in vm.groupList){ vm.groupList[key].chose = true; } } vm.groupList[vm.group]. chose = true; - vm.choseGroupsList.push({name:vm.groupList[vm.group].name, index:vm.group, id:vm.groupList[vm.group].id}); + vm.choseGroupList.push({name:vm.groupList[vm.group].name, index:vm.group, id:vm.groupList[vm.group].id}); vm.group = -1; }, removeGroup: function(groupIndex){ - if (vm.groupList[vm.choseGroupsList[groupIndex].index].id == 0){ + if (vm.groupList[vm.choseGroupList[groupIndex].index].id == 0){ vm.passwordUsable = false; for (key in vm.groupList){ vm.groupList[key].chose = false; } } - vm.groupList[vm.choseGroupsList[groupIndex].index].chose = false; - vm.choseGroupsList.remove(vm.choseGroupsList[groupIndex]); + vm.groupList[vm.choseGroupList[groupIndex].index].chose = false; + vm.choseGroupList.remove(vm.choseGroupList[groupIndex]); } }); - $.ajax({ // Get current user type + $.ajax({ // Get current user type url: "/api/user/", method: "get", dataType: "json", @@ -109,7 +124,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "date if (!data.code) { if (data.data.admin_type == 2) { // Is super user vm.isGlobal = true; - vm.groupList.push({id:0,name:"所有人",chose:false}); + vm.groupList.push({id:0,name:"所有人",chose:false}); } $.ajax({ // Get the group list of current user beforeSend: csrfTokenHeader, @@ -151,4 +166,4 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "date weekStart: 1, language: "zh-CN" }); - }); + }); \ No newline at end of file diff --git a/static/src/js/app/admin/contest/contest_list.js b/static/src/js/app/admin/contest/contest_list.js index fa7cf4df..6e0467f6 100644 --- a/static/src/js/app/admin/contest/contest_list.js +++ b/static/src/js/app/admin/contest/contest_list.js @@ -2,8 +2,6 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", avalon.ready(function () { - avalon.vmodels.contestList=null; - $("#edit-contest-form").validator().on('submit', function (e) { if (!e.isDefaultPrevented()){ e.preventDefault(); @@ -23,12 +21,15 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", bsAlert("你没有选择参赛用户!"); return false; } - if (vm.choseGroupList[0].id == 0) //everyone | public contest - if (vm.password == "") - ajaxData.contest_type = 1; - else{ + if (vm.choseGroupList[0].id == 0) { //everyone | public contest + if (vm.password) { ajaxData.password = vm.password; + ajaxData.contest_type = 2; } + else{ + ajaxData.contest_type = 1; + } + } else { // Add groups info ajaxData.groups = []; for (var i = 0; vm.choseGroupList[i]; i++) @@ -61,6 +62,35 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", return false; }); + if(avalon.vmodels.contestList){ + // this page has been loaded before, so set the default value + var vm = avalon.vmodels.contestList; + vm.contestList= []; + vm.previousPage= 0; + vm.nextPage= 0; + vm.page= 1; + vm.totalPage= 1; + vm.group= "-1"; + vm.groupList= []; + vm.choseGroupList= []; + vm.passwordUsable= false; + vm.keyword= ""; + vm.editingContestId= 0; + vm.editTitle= ""; + vm.editDescription= ""; + vm.editProblemList= []; + vm.editPassword= ""; + vm.editStartTime= ""; + vm.editEndTime= ""; + vm.editMode= ""; + vm.editShowRank= false; + vm.editShowSubmission= false; + vm.editProblemList= []; + vm.editVisible= false; + vm.editChoseGroupList= []; + vm.editingProblemContestIndex= 0; + } + else var vm = avalon.define({ $id: "contestList", contestList: [], @@ -119,20 +149,34 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", vm.editEndTime = vm.contestList[contestId-1].end_time.substring(0,16).replace("T"," "); vm.editMode = vm.contestList[contestId-1].mode; editVisible = vm.contestList[contestId-1].visible; - vm.editChoseGroupList = []; - for (var i = 0; i < vm.contestList[contestId-1].groups.length; i++){ - var id = parseInt(vm.contestList[contestId-1].groups[i]); - var index = 0; - for (; vm.groupList[index]; index++) { - if (vm.groupList[index].id == id) - break; + if (vm.contestList[contestId-1].contest_type == 0) { //contest type == 0, contest in group + //Clear the choseGroupList + var stack = [], sp; + for (sp = 0; i < vm.editChoseGroupList.length; sp++){ + stack.push(vm.editChoseGroupList[i].index); } - vm.groupList[index].chose = true; - vm.choseGroupList.push({ - name:vm.groupList[i].name, - index:index, - id:id - }); + while (sp--){ + vm.removeGroup(stack[sp]); + } + + for (var i = 0; i < vm.contestList[contestId-1].groups.length; i++){ + var id = parseInt(vm.contestList[contestId-1].groups[i]); + var index = 0; + for (; vm.groupList[index]; index++) { + if (vm.groupList[index].id == id) + break; + } + vm.groupList[index].chose = true; + vm.choseGroupList.push({ + name:vm.groupList[index].name, + index:index, + id:id + }); + } + } + else{ + vm.group = "0"; + vm.addGroup()//vm.editChoseGroupList = [0]; id 0 is for the group of everyone~ } vm.editShowRank = vm.contestList[contestId-1].show_rank; vm.editShowSubmission = vm.contestList[contestId-1].show_user_submission; @@ -145,7 +189,7 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", vm.editingProblemContestIndex = 0; return; } - if (vm.editingContestId&&!confirm("如果继续将丢失为保存的信息,是否继续?")){ + if (vm.editingContestId&&!confirm("如果继续将丢失未保存的信息,是否继续?")){ return; } $.ajax({ // Get the problem list of current contest @@ -164,6 +208,7 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", }); vm.editingContestId = 0; vm.editingProblemContestIndex = contestId; + vm.editMode = vm.contestList[contestId-1].mode; }, addGroup: function() { if (vm.group == -1) return; @@ -175,9 +220,10 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", } } vm.groupList[vm.group]. chose = true; + // index of the group is relative. It is related to user vm.choseGroupList.push({name:vm.groupList[vm.group].name, index:vm.group, id:vm.groupList[vm.group].id}); vm.group = -1; - }, + }, removeGroup: function(groupIndex){ if (vm.groupList[vm.choseGroupList[groupIndex].index].id == 0){ vm.passwordUsable = false; @@ -189,16 +235,18 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", vm.choseGroupList.remove(vm.choseGroupList[groupIndex]); }, add_problem: function () { - vm.$fire("up!showContestProblemPage", 0, vm.contestList[vm.editingProblemContestIndex-1].id); + vm.$fire("up!showContestProblemPage", 0, vm.contestList[vm.editingProblemContestIndex-1].id, vm.editMode); }, showProblemEditor: function(el) { console.log(el); - vm.$fire("up!showContestProblemPage", el.id, vm.contestList[vm.editingProblemContestIndex-1].id); + vm.$fire("up!showContestProblemPage", el.id, vm.contestList[vm.editingProblemContestIndex-1].id, vm.editMode); + }, + getYesOrNo: function(yORn) { + if (yORn) return "是"; + return "否"; } }); getPageData(1); - vm.editingContestId = 0; - vm.editingProblemContestIndex = 0; //init time picker $("#contest_start_time").datetimepicker({ @@ -255,7 +303,7 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", success: function (data) { if (!data.code) { if (!data.data.length) { - //bsAlert("您的用户权限只能创建组内比赛,但是您还没有创建过小组"); + //this user have no group can use return; } for (var i = 0; i < data.data.length; i++) { @@ -273,7 +321,6 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", } }); - }); avalon.scan(); }); diff --git a/static/src/js/app/admin/contest/edit_problem.js b/static/src/js/app/admin/contest/edit_problem.js index 5e03f27c..51a668d1 100644 --- a/static/src/js/app/admin/contest/edit_problem.js +++ b/static/src/js/app/admin/contest/edit_problem.js @@ -2,7 +2,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE function ($, avalon, editor, uploader, bsAlert, csrfTokenHeader) { avalon.ready(function () { - avalon.vmodels.editProblem = null; + $("#edit-problem-form").validator() .on('submit', function (e) { if (!e.isDefaultPrevented()){ @@ -38,15 +38,22 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE test_case_id: vm.testCaseId, hint: vm.hint, visible: vm.visible, - contest_id: avalon.vmodels.admin.contestId, + contest_id: avalon.vmodels.admin.$contestId, input_description: vm.inputDescription, output_description: vm.outputDescription, sort_index: vm.sortIndex, }; + if (vm.contestMode == '2') { + if (!vm.score) { + bsAlert("请输入有效的分值!") + return false; + } + ajaxData.score = vm.score; + } var method = "post"; - if (avalon.vmodels.admin.problemId) { + if (avalon.vmodels.admin.$problemId) { method = "put"; - ajaxData.id = avalon.vmodels.admin.problemId; + ajaxData.id = avalon.vmodels.admin.$problemId; } for (var i = 0; i < vm.samples.$model.length; i++) { @@ -75,6 +82,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE } }); + if (!avalon.vmodels.editProblem) var vm = avalon.define({ $id: "editProblem", title: "", @@ -85,12 +93,12 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE hint: "", sortIndex: "", visible: true, - //difficulty: 0, inputDescription: "", outputDescription: "", testCaseIdd: "", + contestMode: 0, + score: 1, uploadSuccess: false, - //source: "", testCaseList: [], addSample: function () { vm.samples.push({input: "", output: "", "visible": true}); @@ -114,6 +122,9 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE } } }); + else + vm = avalon.vmodels.editProblem; + var hintEditor = editor("#hint"); var descriptionEditor = editor("#problemDescription"); var testCaseUploader = uploader("#testCaseFile", "/api/admin/test_case_upload/", function (file, response) { @@ -133,24 +144,31 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE } }); - - if (avalon.vmodels.admin.problemId){ + vm.contestMode = avalon.vmodels.admin.$contestMode; + if (avalon.vmodels.admin.$problemId){ $.ajax({ - url: "/api/admin/contest_problem/?contest_problem_id=" + avalon.vmodels.admin.problemId, + url: "/api/admin/contest_problem/?contest_problem_id=" + avalon.vmodels.admin.$problemId, method: "get", dataType: "json", success: function (data) { if (data.code) { bsAlert(data.data); } - else { + else { // Edit mode load the problem data var problem = data.data; - console.log(problem); - vm.sortIndex = problem.sort_index; - vm.title = problem.title; - vm.description = problem.description; - vm.timeLimit = problem.time_limit; - vm.memoryLimit = problem.memory_limit; + vm.testCaseList = []; + vm.sortIndex = problem.sort_index; + vm.title = problem.title; + vm.description = problem.description; + vm.timeLimit = problem.time_limit; + vm.memoryLimit = problem.memory_limit; + vm.hint = problem.hint; + vm.visible = problem.visible; + vm.inputDescription = problem.input_description; + vm.outputDescription = problem.output_description; + vm.score = problem.score; + vm.samples = []; + vm.testCaseId = problem.test_case_id; for (var i = 0; i < problem.samples.length; i++) { vm.samples.push({ input: problem.samples[i].input, @@ -158,18 +176,27 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE visible: false }) } - vm.hint = problem.hint; - vm.visible = problem.visible; - vm.inputDescription = problem.input_description; - vm.outputDescription = problem.output_description; - vm.testCaseId = problem.test_case_id; - vm.source = problem.source; hintEditor.setValue(vm.hint); descriptionEditor.setValue(vm.description); } } }); } + else { //Create new problem Set default values + vm.testCaseList = []; + vm.title = ""; + vm.timeLimit = 1000; + vm.memoryLimit = 256; + vm.samples = []; + vm.visible = true; + vm.inputDescription = ""; + vm.outputDescription = ""; + vm.testCaseId = ""; + vm.sortIndex = ""; + vm.score = 0; + hintEditor.setValue(""); + descriptionEditor.setValue(""); + } }); avalon.scan(); diff --git a/template/admin/contest/add_contest.html b/template/admin/contest/add_contest.html index de33f23a..1433e273 100644 --- a/template/admin/contest/add_contest.html +++ b/template/admin/contest/add_contest.html @@ -57,7 +57,7 @@
-
{{el.name}}
+
{{el.name}}
diff --git a/template/admin/contest/contest_list.html b/template/admin/contest/contest_list.html index 76daa48f..77a71c6e 100644 --- a/template/admin/contest/contest_list.html +++ b/template/admin/contest/contest_list.html @@ -24,8 +24,8 @@ {{ el.id }} {{ el.title }} - {{ el.show_rank }} - {{ el.visible }} + {{ getYesOrNo(el.show_rank) }} + {{ getYesOrNo(el.visible) }} {{ el.create_time|date("yyyy-MM-dd HH:mm:ss")}} {{ el.created_by.username }} @@ -160,12 +160,14 @@ 编号 题目 + 分值 创建时间 {{ el.sort_index }} {{ el.title }} + {{ el.score}} {{ el.create_time|date("yyyy-MM-dd HH:mm:ss") }}
+
+
+ +
+

- diff --git a/template/admin/contest/contest_list.html b/template/admin/contest/contest_list.html index 77a71c6e..09f9ffcc 100644 --- a/template/admin/contest/contest_list.html +++ b/template/admin/contest/contest_list.html @@ -87,7 +87,7 @@
- From 2ed22c3bce56d2a0eeb186ceea439d4e7f7bab19 Mon Sep 17 00:00:00 2001 From: esp Date: Mon, 24 Aug 2015 18:39:11 +0800 Subject: [PATCH 12/21] =?UTF-8?q?[=E5=89=8D=E7=AB=AF]=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E7=AE=A1=E7=90=86(=E5=90=8E=E5=8F=B0)?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E7=9A=84avalon=E9=87=8D=E5=A4=8D=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E7=9A=84=E9=97=AE=E9=A2=98[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/js/app/admin/problem/add_problem.js | 91 ++++++++++++------- .../src/js/app/admin/problem/edit_problem.js | 21 ++++- static/src/js/app/admin/problem/problem.js | 4 +- 3 files changed, 76 insertions(+), 40 deletions(-) diff --git a/static/src/js/app/admin/problem/add_problem.js b/static/src/js/app/admin/problem/add_problem.js index 7331a8af..d34cd9ac 100644 --- a/static/src/js/app/admin/problem/add_problem.js +++ b/static/src/js/app/admin/problem/add_problem.js @@ -1,7 +1,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagEditor", "validator", "jqueryUI"], function ($, avalon, editor, uploader, bsAlert, csrfTokenHeader) { avalon.ready(function () { - avalon.vmodels.addProblem = null; + $("#add-problem-form").validator() .on('submit', function (e) { if (!e.isDefaultPrevented()){ @@ -63,6 +63,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE success: function (data) { if (!data.code) { bsAlert("题目添加成功!"); + location.hash = "problem/problem_list"; } else { bsAlert(data.data); @@ -92,41 +93,61 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE var hintEditor = editor("#hint"); var problemDescription = editor("#problemDescription"); - - var vm = avalon.define({ - $id: "addProblem", - title: "", - description: "", - timeLimit: 1000, - memoryLimit: 256, - samples: [{input: "", output: "", "visible": true}], - hint: "", - visible: true, - difficulty: 0, - tags: [], - inputDescription: "", - outputDescription: "", - testCaseId: "", - testCaseList: [], - uploadSuccess: false, - source: "", - addSample: function () { - vm.samples.push({input: "", output: "", "visible": true}); - }, - delSample: function (sample) { - if (confirm("你确定要删除么?")) { - vm.samples.remove(sample); + if (avalon.vmodels.addProblem) { + var vm = avalon.vmodels.addProblem; + vm.title = ""; + vm.description = ""; + vm.timeLimit = 1000; + vm.memoryLimit = 256; + vm.samples = [{input: "", output: "", "visible": true}]; + vm.hint = ""; + vm.visible = true; + vm.difficulty = 0; + vm.tags = []; + vm.inputDescription = ""; + vm.outputDescription = ""; + vm.testCaseId = ""; + vm.testCaseList = []; + vm.uploadSuccess = false; + vm.source = ""; + hintEditor.setValue(""); + problemDescription.setValue(""); + } + else + var vm = avalon.define({ + $id: "addProblem", + title: "", + description: "", + timeLimit: 1000, + memoryLimit: 256, + samples: [{input: "", output: "", "visible": true}], + hint: "", + visible: true, + difficulty: 0, + tags: [], + inputDescription: "", + outputDescription: "", + testCaseId: "", + testCaseList: [], + uploadSuccess: false, + source: "", + addSample: function () { + vm.samples.push({input: "", output: "", "visible": true}); + }, + delSample: function (sample) { + if (confirm("你确定要删除么?")) { + vm.samples.remove(sample); + } + }, + toggleSample: function (sample) { + sample.visible = !sample.visible; + }, + getBtnContent: function (item) { + if (item.visible) + return "折叠"; + return "展开"; } - }, - toggleSample: function (sample) { - sample.visible = !sample.visible; - }, - getBtnContent: function (item) { - if (item.visible) - return "折叠"; - return "展开"; - } - }); + }); var tagAutoCompleteList = []; diff --git a/static/src/js/app/admin/problem/edit_problem.js b/static/src/js/app/admin/problem/edit_problem.js index 26ab7944..88055198 100644 --- a/static/src/js/app/admin/problem/edit_problem.js +++ b/static/src/js/app/admin/problem/edit_problem.js @@ -2,7 +2,6 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE function ($, avalon, editor, uploader, bsAlert, csrfTokenHeader) { avalon.ready(function () { - avalon.vmodels.editProblem = null; $("#edit-problem-form").validator() .on('submit', function (e) { @@ -65,6 +64,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE success: function (data) { if (!data.code) { bsAlert("题目编辑成功!"); + vm.showProblemListPage(); } else { bsAlert(data.data); @@ -75,7 +75,24 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE return false; } }); - + if (avalon.vmodels.editProblem) { + var vm = avalon.vmodels.editProblem; + title: "", + description= ""; + timeLimit= -1; + memoryLimit= -1; + samples= []; + hint= ""; + visible= true; + difficulty= 0; + inputDescription= ""; + outputDescription= ""; + testCaseIdd= ""; + uploadSuccess= false; + source= ""; + testCaseList= []; + } + else var vm = avalon.define({ $id: "editProblem", title: "", diff --git a/static/src/js/app/admin/problem/problem.js b/static/src/js/app/admin/problem/problem.js index cb1a0f04..2632ebf5 100644 --- a/static/src/js/app/admin/problem/problem.js +++ b/static/src/js/app/admin/problem/problem.js @@ -41,10 +41,8 @@ require(["jquery", "avalon", "csrfToken", "bsAlert"], function ($, avalon, csrfT vm.$fire("up!showProblemSubmissionPage", problemId); } }); - - getPageData(1); } - + getPageData(1); function getPageData(page) { var url = "/api/admin/problem/?paging=true&page=" + page + "&page_size=10"; if (vm.keyword != "") From 876af8d2330a835dd76dec86b4bfb062b0795ad6 Mon Sep 17 00:00:00 2001 From: esp Date: Tue, 25 Aug 2015 09:27:46 +0800 Subject: [PATCH 13/21] =?UTF-8?q?[=E5=89=8D=E7=AB=AF]=E4=BF=AE=E5=A4=8Duse?= =?UTF-8?q?rList=E9=A1=B5=E9=9D=A2avalon=E9=87=8D=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E9=97=AE=E9=A2=98[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/js/app/admin/user/userList.js | 112 ++++++++++++----------- 1 file changed, 61 insertions(+), 51 deletions(-) diff --git a/static/src/js/app/admin/user/userList.js b/static/src/js/app/admin/user/userList.js index 0842dc55..3a525b83 100644 --- a/static/src/js/app/admin/user/userList.js +++ b/static/src/js/app/admin/user/userList.js @@ -3,58 +3,68 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "validator"], function ($, // avalon:定义模式 userList avalon.ready(function () { - avalon.vmodels.userList = null; - var vm = avalon.define({ - $id: "userList", - //通用变量 - userList: [], - previousPage: 0, - nextPage: 0, - page: 1, - editingUserId: 0, - totalPage: 1, - userType: ["一般用户", "管理员", "超级管理员"], - keyword: "", - showAdminOnly: false, - //编辑区域同步变量 - username: "", - realName: "", - email: "", - adminType: 0, - id: 0, - getNext: function () { - if (!vm.nextPage) - return; - getPageData(vm.page + 1); - }, - getPrevious: function () { - if (!vm.previousPage) - return; - getPageData(vm.page - 1); - }, - getBtnClass: function (btn) { //上一页/下一页按钮启用禁用逻辑 - if (btn) { - return vm.nextPage ? "btn btn-primary" : "btn btn-primary disabled"; + //avalon.vmodels.userList = null; + if (avalon.vmodels.userList) { + var vm = avalon.vmodels.userList; + // initialize avalon object + userList= [], previousPage= 0, nextPage= 0, page= 1, + editingUserId= 0, totalPage: 1, keyword: "", showAdminOnly: false, + //user editor fields + username: "", realName: "", email: "", adminType: 0, id: 0, + } + else { + var vm = avalon.define({ + $id: "userList", + //通用变量 + userList: [], + previousPage: 0, + nextPage: 0, + page: 1, + editingUserId: 0, + totalPage: 1, + userType: ["一般用户", "管理员", "超级管理员"], + keyword: "", + showAdminOnly: false, + //编辑区域同步变量 + username: "", + realName: "", + email: "", + adminType: 0, + id: 0, + getNext: function () { + if (!vm.nextPage) + return; + getPageData(vm.page + 1); + }, + getPrevious: function () { + if (!vm.previousPage) + return; + getPageData(vm.page - 1); + }, + getBtnClass: function (btn) { //上一页/下一页按钮启用禁用逻辑 + if (btn) { + return vm.nextPage ? "btn btn-primary" : "btn btn-primary disabled"; + } + else { + return vm.previousPage ? "btn btn-primary" : "btn btn-primary disabled"; + } + }, + editUser: function (user) { //点击编辑按钮的事件,显示/隐藏编辑区 + vm.username = user.username; + vm.realName = user.real_name; + vm.adminType = user.admin_type; + vm.email = user.email; + vm.id = user.id; + if (vm.editingUserId == user.id) + vm.editingUserId = 0; + else + vm.editingUserId = user.id; + }, + search: function () { + getPageData(1); } - else { - return vm.previousPage ? "btn btn-primary" : "btn btn-primary disabled"; - } - }, - editUser: function (user) { //点击编辑按钮的事件,显示/隐藏编辑区 - vm.username = user.username; - vm.realName = user.real_name; - vm.adminType = user.admin_type; - vm.email = user.email; - vm.id = user.id; - if (vm.editingUserId == user.id) - vm.editingUserId = 0; - else - vm.editingUserId = user.id; - }, - search: function () { - getPageData(1); - } - }); + }); + } vm.$watch("showAdminOnly", function () { getPageData(1); }); From 6767f2b54b0ca1274769774c81716e297c4134a9 Mon Sep 17 00:00:00 2001 From: esp Date: Tue, 25 Aug 2015 10:09:21 +0800 Subject: [PATCH 14/21] =?UTF-8?q?[=E5=89=8D=E7=AB=AF]=E4=BF=AE=E5=A4=8Duse?= =?UTF-8?q?rList.js=E4=B8=AD=E5=85=B3=E4=BA=8E=E7=BF=BB=E9=A1=B5=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E7=8A=B6=E6=80=81=E6=8E=A7=E5=88=B6=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E7=9A=84=E9=94=99=E8=AF=AF.=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=88=9A=E5=88=9A=E6=8F=90=E4=BA=A4=E7=9A=84bug[CI=20?= =?UTF-8?q?SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/js/app/admin/user/userList.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/static/src/js/app/admin/user/userList.js b/static/src/js/app/admin/user/userList.js index 3a525b83..3f80c89d 100644 --- a/static/src/js/app/admin/user/userList.js +++ b/static/src/js/app/admin/user/userList.js @@ -7,10 +7,10 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "validator"], function ($, if (avalon.vmodels.userList) { var vm = avalon.vmodels.userList; // initialize avalon object - userList= [], previousPage= 0, nextPage= 0, page= 1, - editingUserId= 0, totalPage: 1, keyword: "", showAdminOnly: false, + userList = []; previousPage= 0; nextPage= 0; page = 1; + editingUserId= 0; totalPage = 1; keyword= ""; showAdminOnly= false; //user editor fields - username: "", realName: "", email: "", adminType: 0, id: 0, + username= ""; realName= ""; email= ""; adminType= 0; id= 0; } else { var vm = avalon.define({ @@ -42,7 +42,7 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "validator"], function ($, getPageData(vm.page - 1); }, getBtnClass: function (btn) { //上一页/下一页按钮启用禁用逻辑 - if (btn) { + if (btn == "next") { return vm.nextPage ? "btn btn-primary" : "btn btn-primary disabled"; } else { From d490d89dcd5cfcea63ecbad04c6293aa24df33f8 Mon Sep 17 00:00:00 2001 From: esp Date: Tue, 25 Aug 2015 10:20:58 +0800 Subject: [PATCH 15/21] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dtypo=20in=20submission/?= =?UTF-8?q?views.py=20=20=20Swagger=20UI=20docs=E4=B8=AD=E7=9A=84=E6=8B=BC?= =?UTF-8?q?=E5=86=99=E9=94=99=E8=AF=AF[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- submission/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submission/views.py b/submission/views.py index 6399e22b..d9a63778 100644 --- a/submission/views.py +++ b/submission/views.py @@ -164,7 +164,7 @@ class ContestSubmissionAPIView(APIView): """ 创建比赛的提交 --- - request_serializer: ConestSubmissionSerializer + request_serializer: CreateContestSubmissionSerializer """ serializer = CreateContestSubmissionSerializer(data=request.data) if serializer.is_valid(): From ae64944449a8acf5e14fa16480afdf61d0d27f88 Mon Sep 17 00:00:00 2001 From: esp Date: Tue, 25 Aug 2015 10:47:53 +0800 Subject: [PATCH 16/21] =?UTF-8?q?[BUG-fix]=E8=BF=94=E5=9B=9E=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E6=8F=90=E7=A4=BA=E7=A1=AE=E8=AE=A4,=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E4=B8=8D=E8=83=BD=E5=BC=B9=E5=87=BA=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/admin/contest/edit_problem.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/admin/contest/edit_problem.html b/template/admin/contest/edit_problem.html index 6402f04d..43070362 100644 --- a/template/admin/contest/edit_problem.html +++ b/template/admin/contest/edit_problem.html @@ -2,7 +2,7 @@
From 0ab2583dc8195af1585619e92e6a7f2e36bc6b70 Mon Sep 17 00:00:00 2001 From: esp Date: Tue, 25 Aug 2015 10:55:43 +0800 Subject: [PATCH 17/21] =?UTF-8?q?[=E5=89=8D=E7=AB=AF]=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=AF=94=E8=B5=9B=E9=A2=98=E7=9B=AE=E5=88=97=E8=A1=A8=E5=8F=AF?= =?UTF-8?q?=E8=A7=81=E5=AD=97=E6=AE=B5=E7=9A=84=E6=98=BE=E7=A4=BA,?= =?UTF-8?q?=E6=96=B9=E4=BE=BF=E6=AF=94=E8=B5=9B=E7=AE=A1=E7=90=86[CI=20SKI?= =?UTF-8?q?P]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/admin/contest/contest_list.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/template/admin/contest/contest_list.html b/template/admin/contest/contest_list.html index 09f9ffcc..4c6adab7 100644 --- a/template/admin/contest/contest_list.html +++ b/template/admin/contest/contest_list.html @@ -161,6 +161,7 @@ 编号 题目 分值 + 可见 创建时间 @@ -168,6 +169,7 @@ {{ el.sort_index }} {{ el.title }} {{ el.score}} + {{ getYesOrNo(el.visible) }} {{ el.create_time|date("yyyy-MM-dd HH:mm:ss") }} Date: Tue, 25 Aug 2015 10:58:14 +0800 Subject: [PATCH 18/21] =?UTF-8?q?[=E5=89=8D=E7=AB=AF-BUG]=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=AF=94=E8=B5=9B=E7=BC=96=E8=BE=91=E5=8C=BA=E5=8F=AF?= =?UTF-8?q?=E8=A7=81=E7=8A=B6=E6=80=81=E6=98=BE=E7=A4=BA=E9=94=99=E8=AF=AF?= =?UTF-8?q?,(=E5=BF=98=E8=AE=B0=E5=8A=A0vm.),=E5=A2=9E=E5=8A=A0=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E6=88=90=E5=8A=9F=E9=9A=90=E8=97=8F=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E6=A1=86=E7=9A=84=E8=A1=8C=E4=B8=BA,=E6=9B=B4=E5=8A=A0?= =?UTF-8?q?=E6=96=B9=E4=BE=BF[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/js/app/admin/contest/contest_list.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/static/src/js/app/admin/contest/contest_list.js b/static/src/js/app/admin/contest/contest_list.js index 30f8678b..f978f76c 100644 --- a/static/src/js/app/admin/contest/contest_list.js +++ b/static/src/js/app/admin/contest/contest_list.js @@ -21,6 +21,10 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", bsAlert("你没有选择参赛用户!"); return false; } + if (vm.editDescription == "") { + bsAlert("比赛描述不能为空!"); + return false; + } if (vm.choseGroupList[0].id == 0) { //everyone | public contest if (vm.editPassword) { ajaxData.password = vm.editPassword; @@ -48,8 +52,8 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", success: function (data) { if (!data.code) { bsAlert("修改成功!"); - console.log(data); - vm.getPage(1); + vm.editingContestId = 0; // Hide the editor + vm.getPage(1); // Refresh the contest list } else { bsAlert(data.data); @@ -148,7 +152,7 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", vm.editStartTime = vm.contestList[contestId-1].start_time.substring(0,16).replace("T"," "); vm.editEndTime = vm.contestList[contestId-1].end_time.substring(0,16).replace("T"," "); vm.editMode = vm.contestList[contestId-1].mode; - editVisible = vm.contestList[contestId-1].visible; + vm.editVisible = vm.contestList[contestId-1].visible; if (vm.contestList[contestId-1].contest_type == 0) { //contest type == 0, contest in group //Clear the choseGroupList var stack = [], sp; From f1802b0ced6595ede6b682cd0738eec787587b5f Mon Sep 17 00:00:00 2001 From: esp Date: Tue, 25 Aug 2015 12:03:06 +0800 Subject: [PATCH 19/21] =?UTF-8?q?[=E5=89=8D=E7=AB=AF]=E4=BF=AE=E5=A4=8Dbug?= =?UTF-8?q?,=E6=9B=B4=E6=AD=A3=E4=BA=86=E4=B8=8D=E6=81=B0=E5=BD=93?= =?UTF-8?q?=E7=9A=84foreach=E5=BE=AA=E7=8E=AF,(js=E9=87=8Cfor(var=20key=20?= =?UTF-8?q?in=20array)=E4=B8=8D=E4=BB=85=E9=81=8D=E5=8E=86=E4=BA=86?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E5=85=83=E7=B4=A0,=E8=BF=98=E5=B0=86?= =?UTF-8?q?=E9=81=8D=E5=8E=86=E6=95=B0=E7=BB=84=E5=85=B6=E4=BB=96=E7=9A=84?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E4=BB=A5=E5=8F=8A=E6=88=90=E5=91=98=E6=96=B9?= =?UTF-8?q?=E6=B3=95),=E4=BF=AE=E5=A4=8D=E4=BA=86=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=8C=BA=E5=87=BD=E6=95=B0=E5=AF=B9=E9=80=89?= =?UTF-8?q?=E4=B8=AD=E5=B0=8F=E7=BB=84=E9=94=99=E8=AF=AF=E7=9A=84=E6=B8=85?= =?UTF-8?q?=E9=99=A4=E6=96=B9=E6=B3=95.(=E5=8E=9F=E6=9D=A5=E7=9A=84?= =?UTF-8?q?=E5=81=9A=E6=B3=95=E5=B0=86=E5=AF=BC=E8=87=B4=E6=9F=90=E4=BA=9B?= =?UTF-8?q?=E6=83=85=E5=86=B5=E4=B8=8B=E6=97=A7=E7=9A=84=E5=B0=8F=E7=BB=84?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E7=A7=BB=E9=99=A4=E7=BC=96=E8=BE=91=E5=8C=BA?= =?UTF-8?q?=E5=9F=9F.=20=20=E5=A2=9E=E6=B7=BB=E4=BA=86=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E6=AF=94=E8=B5=9B=E7=9A=84=E6=8F=90=E7=A4=BA?= =?UTF-8?q?,=E9=98=B2=E6=AD=A2=E7=94=A8=E6=88=B7=E4=B8=A2=E5=A4=B1?= =?UTF-8?q?=E4=B8=BA=E4=BF=9D=E5=AD=98=E7=9A=84=E4=BF=A1=E6=81=AF.=20=20?= =?UTF-8?q?=20=20=E6=B7=BB=E5=8A=A0=E9=97=AE=E9=A2=98=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E5=AF=B9=E5=8F=AF=E8=A7=81=E6=AF=94=E8=B5=9B=E7=9A=84=E7=AD=9B?= =?UTF-8?q?=E9=80=89[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/js/app/admin/contest/contest_list.js | 28 +++++++++++-------- template/admin/contest/contest_list.html | 3 ++ 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/static/src/js/app/admin/contest/contest_list.js b/static/src/js/app/admin/contest/contest_list.js index f978f76c..b9dbd3d2 100644 --- a/static/src/js/app/admin/contest/contest_list.js +++ b/static/src/js/app/admin/contest/contest_list.js @@ -94,7 +94,7 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", vm.editChoseGroupList= []; vm.editingProblemContestIndex= 0; } - else + else { var vm = avalon.define({ $id: "contestList", contestList: [], @@ -102,6 +102,7 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", nextPage: 0, page: 1, totalPage: 1, + showVisibleOnly: false, group: "-1", groupList: [], choseGroupList: [], @@ -143,6 +144,8 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", getPageData(page_index); }, showEditContestArea: function (contestId) { + if (vm.editingContestId && !confirm("如果继续将丢失未保存的信息,是否继续?")) + return; if (contestId == vm.editingContestId) vm.editingContestId = 0; else { @@ -155,12 +158,8 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", vm.editVisible = vm.contestList[contestId-1].visible; if (vm.contestList[contestId-1].contest_type == 0) { //contest type == 0, contest in group //Clear the choseGroupList - var stack = [], sp; - for (sp = 0; sp < vm.choseGroupList.length; sp++){ - stack. push(vm.choseGroupList[sp].index); - } - while (sp--){ - vm.removeGroup(stack[sp]); + while (vm.choseGroupList.length) { + vm.removeGroup(0); } for (var i = 0; i < vm.contestList[contestId-1].groups.length; i++){ @@ -219,8 +218,8 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", if (vm.groupList[vm.group].id == 0){ vm.passwordUsable = true; vm.choseGroupList = []; - for (var key in vm.groupList){ - vm.groupList[key].chose = true; + for (var i = 0; i < vm.groupList.length; i++) { + vm.groupList[i].chose = true; } } vm.groupList[vm.group]. chose = true; @@ -229,10 +228,11 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", vm.group = -1; }, removeGroup: function(groupIndex){ + console.log(groupIndex); if (vm.groupList[vm.choseGroupList[groupIndex].index].id == 0){ vm.passwordUsable = false; - for (key in vm.groupList){ - vm.groupList[key].chose = false; + for (var i = 0; i < vm.groupList.length; i++) { + vm.groupList[i].chose = false; } } vm.groupList[vm.choseGroupList[groupIndex].index].chose = false; @@ -250,6 +250,10 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", return "否"; } }); + vm.$watch("showVisibleOnly", function() { + getPageData(1); + }) + } getPageData(1); //init time picker @@ -268,6 +272,8 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", function getPageData(page) { var url = "/api/admin/contest/?paging=true&page=" + page + "&page_size=10"; + if (vm.showVisibleOnly) + url += "&visible=true" if (vm.keyword != "") url += "&keyword=" + vm.keyword; $.ajax({ diff --git a/template/admin/contest/contest_list.html b/template/admin/contest/contest_list.html index 4c6adab7..8163ad32 100644 --- a/template/admin/contest/contest_list.html +++ b/template/admin/contest/contest_list.html @@ -34,6 +34,9 @@ +
+ +
页数:{{ page }}/{{ totalPage }}   From 4881637c791667556af09da626d104574f24b268 Mon Sep 17 00:00:00 2001 From: esp Date: Tue, 25 Aug 2015 12:21:31 +0800 Subject: [PATCH 20/21] =?UTF-8?q?[=E5=89=8D=E7=AB=AF]=E7=BB=9F=E4=B8=80adm?= =?UTF-8?q?in=E4=B8=ADjs=E5=91=BD=E5=90=8D=E6=96=B9=E5=BC=8F.=20=20?= =?UTF-8?q?=E4=B8=BA=E6=8F=90=E4=BA=A4=E5=88=97=E8=A1=A8=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E6=8C=89=E9=92=AE[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/admin/contest/{add_contest.js => addContest.js} | 0 .../app/admin/contest/{contest_list.js => contestList.js} | 0 .../app/admin/contest/{edit_problem.js => editProblem.js} | 0 .../app/admin/problem/{add_problem.js => addProblem.js} | 0 .../app/admin/problem/{edit_problem.js => editProblem.js} | 0 .../problem/{submission_list.js => submissionList.js} | 6 ++++-- template/admin/contest/add_contest.html | 2 +- template/admin/contest/contest_list.html | 2 +- template/admin/contest/edit_problem.html | 2 +- template/admin/problem/add_problem.html | 2 +- template/admin/problem/edit_problem.html | 2 +- template/admin/problem/submission_list.html | 8 +++++++- 12 files changed, 16 insertions(+), 8 deletions(-) rename static/src/js/app/admin/contest/{add_contest.js => addContest.js} (100%) rename static/src/js/app/admin/contest/{contest_list.js => contestList.js} (100%) rename static/src/js/app/admin/contest/{edit_problem.js => editProblem.js} (100%) rename static/src/js/app/admin/problem/{add_problem.js => addProblem.js} (100%) rename static/src/js/app/admin/problem/{edit_problem.js => editProblem.js} (100%) rename static/src/js/app/admin/problem/{submission_list.js => submissionList.js} (91%) diff --git a/static/src/js/app/admin/contest/add_contest.js b/static/src/js/app/admin/contest/addContest.js similarity index 100% rename from static/src/js/app/admin/contest/add_contest.js rename to static/src/js/app/admin/contest/addContest.js diff --git a/static/src/js/app/admin/contest/contest_list.js b/static/src/js/app/admin/contest/contestList.js similarity index 100% rename from static/src/js/app/admin/contest/contest_list.js rename to static/src/js/app/admin/contest/contestList.js diff --git a/static/src/js/app/admin/contest/edit_problem.js b/static/src/js/app/admin/contest/editProblem.js similarity index 100% rename from static/src/js/app/admin/contest/edit_problem.js rename to static/src/js/app/admin/contest/editProblem.js diff --git a/static/src/js/app/admin/problem/add_problem.js b/static/src/js/app/admin/problem/addProblem.js similarity index 100% rename from static/src/js/app/admin/problem/add_problem.js rename to static/src/js/app/admin/problem/addProblem.js diff --git a/static/src/js/app/admin/problem/edit_problem.js b/static/src/js/app/admin/problem/editProblem.js similarity index 100% rename from static/src/js/app/admin/problem/edit_problem.js rename to static/src/js/app/admin/problem/editProblem.js diff --git a/static/src/js/app/admin/problem/submission_list.js b/static/src/js/app/admin/problem/submissionList.js similarity index 91% rename from static/src/js/app/admin/problem/submission_list.js rename to static/src/js/app/admin/problem/submissionList.js index 21c451bf..405cffa7 100644 --- a/static/src/js/app/admin/problem/submission_list.js +++ b/static/src/js/app/admin/problem/submissionList.js @@ -1,4 +1,4 @@ -require(["jquery", "avalon", "csrfToken", "bsAlert", "formValidation"], function ($, avalon, csrfTokenHeader, bsAlert) { +require(["jquery", "avalon", "csrfToken", "bsAlert"], function ($, avalon, csrfTokenHeader, bsAlert) { avalon.ready(function () { avalon.vmodels.submissionList = null; @@ -41,9 +41,11 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "formValidation"], function getPage: function (page_index) { getPageData(page_index); }, - showSubmissionDetailPage: function (submissionId) { + }, + showProblemListPage: function(){ + vm.$fire("up!showProblemListPage"); } }); diff --git a/template/admin/contest/add_contest.html b/template/admin/contest/add_contest.html index a1042e8c..6f237c55 100644 --- a/template/admin/contest/add_contest.html +++ b/template/admin/contest/add_contest.html @@ -103,4 +103,4 @@
- + diff --git a/template/admin/contest/contest_list.html b/template/admin/contest/contest_list.html index 8163ad32..5c156299 100644 --- a/template/admin/contest/contest_list.html +++ b/template/admin/contest/contest_list.html @@ -185,4 +185,4 @@
- + diff --git a/template/admin/contest/edit_problem.html b/template/admin/contest/edit_problem.html index 43070362..331917ce 100644 --- a/template/admin/contest/edit_problem.html +++ b/template/admin/contest/edit_problem.html @@ -135,4 +135,4 @@
- + diff --git a/template/admin/problem/add_problem.html b/template/admin/problem/add_problem.html index fadea4cf..38c22c62 100644 --- a/template/admin/problem/add_problem.html +++ b/template/admin/problem/add_problem.html @@ -134,4 +134,4 @@
- \ No newline at end of file + \ No newline at end of file diff --git a/template/admin/problem/edit_problem.html b/template/admin/problem/edit_problem.html index 3dd08708..0a2b7b57 100644 --- a/template/admin/problem/edit_problem.html +++ b/template/admin/problem/edit_problem.html @@ -140,4 +140,4 @@
- + diff --git a/template/admin/problem/submission_list.html b/template/admin/problem/submission_list.html index 6d94dabd..70aacb82 100644 --- a/template/admin/problem/submission_list.html +++ b/template/admin/problem/submission_list.html @@ -1,4 +1,10 @@
+

提交列表

@@ -25,4 +31,4 @@ - \ No newline at end of file + \ No newline at end of file From 1145c4e29c46d572b7326ea816b5da559770e5d7 Mon Sep 17 00:00:00 2001 From: esp Date: Tue, 25 Aug 2015 12:38:37 +0800 Subject: [PATCH 21/21] =?UTF-8?q?[=E5=89=8D=E7=AB=AF]=E6=95=B4=E7=90=86?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F,=E5=8E=BB=E6=8E=89tab(=E4=BB=A5=E5=89=8D?= =?UTF-8?q?=E7=94=A8vim,=E5=AE=83=E8=87=AA=E5=B7=B1=E7=BB=99=E5=8A=A0?= =?UTF-8?q?=E7=9A=84),=E5=8E=BB=E6=8E=89=E8=B0=83=E8=AF=95=E7=94=A8?= =?UTF-8?q?=E7=9A=84console.log[CI=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/js/app/admin/contest/addContest.js | 3 -- .../src/js/app/admin/contest/contestList.js | 41 ++++++++----------- .../src/js/app/admin/problem/editProblem.js | 1 - 3 files changed, 18 insertions(+), 27 deletions(-) diff --git a/static/src/js/app/admin/contest/addContest.js b/static/src/js/app/admin/contest/addContest.js index 3b0073b2..437fbdf3 100644 --- a/static/src/js/app/admin/contest/addContest.js +++ b/static/src/js/app/admin/contest/addContest.js @@ -36,7 +36,6 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "date ajaxData.groups.push(parseInt(vm.choseGroupList[i].id)) } - console.log(ajaxData); $.ajax({ // Add contest beforeSend: csrfTokenHeader, url: "/api/admin/contest/", @@ -64,11 +63,9 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "date } else { bsAlert(data.data); - console.log(data); } } }); - console.log(JSON.stringify(ajaxData)); } return false; }); diff --git a/static/src/js/app/admin/contest/contestList.js b/static/src/js/app/admin/contest/contestList.js index b9dbd3d2..9c1ba71b 100644 --- a/static/src/js/app/admin/contest/contestList.js +++ b/static/src/js/app/admin/contest/contestList.js @@ -40,29 +40,26 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", ajaxData.groups.push(parseInt(vm.choseGroupList[i].id)) } - console.log(ajaxData); - $.ajax({ // Add contest - beforeSend: csrfTokenHeader, - url: "/api/admin/contest/", - dataType: "json", - contentType: "application/json", - data: JSON.stringify(ajaxData), - method: "put", - contentType: "application/json", - success: function (data) { - if (!data.code) { - bsAlert("修改成功!"); + $.ajax({ // Add contest + beforeSend: csrfTokenHeader, + url: "/api/admin/contest/", + dataType: "json", + contentType: "application/json", + data: JSON.stringify(ajaxData), + method: "put", + contentType: "application/json", + success: function (data) { + if (!data.code) { + bsAlert("修改成功!"); vm.editingContestId = 0; // Hide the editor vm.getPage(1); // Refresh the contest list - } - else { - bsAlert(data.data); - console.log(data); - } - } - }); - console.log(JSON.stringify(ajaxData)); - } + } + else { + bsAlert(data.data); + } + } + }); + } return false; }); @@ -228,7 +225,6 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", vm.group = -1; }, removeGroup: function(groupIndex){ - console.log(groupIndex); if (vm.groupList[vm.choseGroupList[groupIndex].index].id == 0){ vm.passwordUsable = false; for (var i = 0; i < vm.groupList.length; i++) { @@ -242,7 +238,6 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", vm.$fire("up!showContestProblemPage", 0, vm.contestList[vm.editingProblemContestIndex-1].id, vm.editMode); }, showProblemEditor: function(el) { - console.log(el); vm.$fire("up!showContestProblemPage", el.id, vm.contestList[vm.editingProblemContestIndex-1].id, vm.editMode); }, getYesOrNo: function(yORn) { diff --git a/static/src/js/app/admin/problem/editProblem.js b/static/src/js/app/admin/problem/editProblem.js index 88055198..8e1ce6d6 100644 --- a/static/src/js/app/admin/problem/editProblem.js +++ b/static/src/js/app/admin/problem/editProblem.js @@ -158,7 +158,6 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE } else { var problem = data.data; - console.log(problem); vm.title = problem.title; vm.description = problem.description; vm.timeLimit = problem.time_limit;