diff --git a/static/src/js/app/admin/admin.js b/static/src/js/app/admin/admin.js index 0e8e83d5..9e2c6ff3 100644 --- a/static/src/js/app/admin/admin.js +++ b/static/src/js/app/admin/admin.js @@ -73,6 +73,8 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "bootstrap"], function ($, adminNavList: [], contestId: -1, + contestProblemStatus: "edit", + hide_loading: function () { $("#loading-gif").hide(); }, diff --git a/static/src/js/app/admin/contest/contestList.js b/static/src/js/app/admin/contest/contestList.js index f3629273..515933d4 100644 --- a/static/src/js/app/admin/contest/contestList.js +++ b/static/src/js/app/admin/contest/contestList.js @@ -27,7 +27,8 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker", // todo 修改template_url }, showContestProblems: function(contestId){ - // todo + avalon.vmodels.admin.contestId = contestId; + avalon.vmodels.admin.template_url = "template/contest/problem_list.html"; } }) } diff --git a/static/src/js/app/admin/contest/contestProblemList.js b/static/src/js/app/admin/contest/contestProblemList.js new file mode 100644 index 00000000..180e0b16 --- /dev/null +++ b/static/src/js/app/admin/contest/contestProblemList.js @@ -0,0 +1,43 @@ +require(["jquery", "avalon", "csrfToken", "bsAlert"], function ($, avalon, csrfTokenHeader, bsAlert) { + + avalon.ready(function () { + if (avalon.vmodels.contestProblemList) { + vm = avalon.vmodels.contestProblemList; + } + else { + var vm = avalon.define({ + $id: "contestProblemList", + problemList: [], + showEditProblemPage: function (problemId) { + avalon.vmodels.admin.contestProblemStatus = "edit"; + avalon.vmodels.admin.problemId = problemId; + avalon.vmodels.admin.template_url = "template/contest/edit_problem.html"; + }, + addProblem: function(){ + avalon.vmodels.admin.contestProblemStatus = "add"; + avalon.vmodels.admin.template_url = "template/contest/edit_problem.html"; + }, + goBack: function(){ + avalon.vmodels.admin.template_url = "template/contest/contest_list.html" + } + }); + } + + $.ajax({ + url: "/api/admin/contest_problem/?contest_id=" + avalon.vmodels.admin.contestId, + dataType: "json", + method: "get", + success: function (data) { + if (!data.code) { + vm.problemList = data.data; + } + else { + bsAlert(data.data); + } + } + }); + + avalon.scan(); + }); + +}); diff --git a/static/src/js/app/admin/contest/editProblem.js b/static/src/js/app/admin/contest/editProblem.js index 81c69316..31b2560a 100644 --- a/static/src/js/app/admin/contest/editProblem.js +++ b/static/src/js/app/admin/contest/editProblem.js @@ -1,22 +1,22 @@ -require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagEditor", "validator", "jqueryUI"], +require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagEditor", "validator", "editorComponent"], function ($, avalon, editor, uploader, bsAlert, csrfTokenHeader) { avalon.ready(function () { $("#edit-problem-form").validator() .on('submit', function (e) { - if (!e.isDefaultPrevented()){ + if (!e.isDefaultPrevented()) { e.preventDefault(); if (vm.testCaseId == "") { bsAlert("你还没有上传测试数据!"); return false; } - if (vm.description == "") { + if (avalon.vmodels.contestProblemDescriptionEditor.content == "") { bsAlert("题目描述不能为空!"); return false; } - if (vm.timeLimit < 1000 || vm.timeLimit > 5000) { - bsAlert("保证时间限制是一个1000-5000的合法整数"); + if (vm.timeLimit < 30 || vm.timeLimit > 5000) { + bsAlert("保证时间限制是一个30-5000的合法整数"); return false; } if (vm.samples.length == 0) { @@ -31,33 +31,34 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE } var ajaxData = { title: vm.title, - description: vm.description, + description: avalon.vmodels.contestProblemDescriptionEditor.content, 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, + hint: avalon.vmodels.contestProblemHintEditor.content, + visible: vm.visible, + contest_id: avalon.vmodels.admin.contestId, + input_description: vm.inputDescription, output_description: vm.outputDescription, - sort_index: vm.sortIndex, + sort_index: vm.sortIndex }; - if (vm.contestMode == '2') { - if (!vm.score) { - bsAlert("请输入有效的分值!") - return false; - } - ajaxData.score = vm.score; + + if (avalon.vmodels.admin.contestProblemStatus == "edit") { + var method = "put"; + ajaxData["id"] = avalon.vmodels.admin.problemId; + var alertContent = "题目编辑成功"; } - var method = "post"; - if (avalon.vmodels.admin.$problemId) { - method = "put"; - ajaxData.id = avalon.vmodels.admin.$problemId; + else{ + var method = "post"; + var alertContent = "题目创建成功"; } 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}); + ajaxData.samples.push({ + input: vm.samples.$model[i].input, + output: vm.samples.$model[i].output + }); } $.ajax({ @@ -69,8 +70,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE contentType: "application/json;charset=UTF-8", success: function (data) { if (!data.code) { - bsAlert("题目编辑成功!"); - vm.goBack(true); + bsAlert(alertContent); } else { bsAlert(data.data); @@ -82,93 +82,101 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE } }); - if (!avalon.vmodels.editProblem) - var vm = avalon.define({ - $id: "editProblem", - title: "", - description: "", - timeLimit: 0, - memoryLimit: 0, - samples: [], - hint: "", - sortIndex: "", - visible: true, - inputDescription: "", - outputDescription: "", - testCaseIdd: "", - contestMode: 0, - score: 1, - uploadSuccess: false, - 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"); - } - } - }); - else - vm = avalon.vmodels.editProblem; + if (!avalon.vmodels.editProblem) + var vm = avalon.define({ + $id: "editProblem", + title: "", + description: "", + timeLimit: 1000, + memoryLimit: 128, + samples: [], + hint: "", + sortIndex: "", + visible: true, + inputDescription: "", + outputDescription: "", + testCaseId: "", + testCaseList: [], + uploadSuccess: false, + + contestProblemDescriptionEditor: { + editorId: "contest-problem-description-editor", + placeholder: "题目描述" + }, + contestProblemHintEditor: { + editorId: "contest-problem-hint-editor", + placeholder: "提示" + }, + + 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) { + avalon.vmodels.admin.template_url = "template/contest/problem_list.html"; + } + }); + else { + var vm = avalon.vmodels.editProblem; + } - 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++) { + for(var key in response.data.file_list){ vm.testCaseList.push({ - input: response.data.file_list.input[i], - output: response.data.file_list.output[i] - }); + input: response.data.file_list[key].input_name, + output: response.data.file_list[key].output_name + }) } + vm.uploadSuccess = true; bsAlert("测试数据添加成功!共添加" + vm.testCaseList.length + "组测试数据"); } }); - vm.contestMode = avalon.vmodels.admin.$contestMode; - if (avalon.vmodels.admin.$problemId){ + if (avalon.vmodels.admin.contestProblemStatus == "edit") { $.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 { // Edit mode load the problem data + else { var problem = data.data; - 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.testCaseList = []; + vm.sortIndex = problem.sort_index; + vm.title = problem.title; + avalon.vmodels.contestProblemDescriptionEditor.content = 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; + vm.score = problem.score; + vm.testCaseId = problem.test_case_id; + vm.samples = []; for (var i = 0; i < problem.samples.length; i++) { vm.samples.push({ input: problem.samples[i].input, @@ -176,26 +184,32 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE visible: false }) } - hintEditor.setValue(vm.hint); - descriptionEditor.setValue(vm.description); + avalon.vmodels.contestProblemHintEditor.content = problem.hint; + $.ajax({ + url: "/api/admin/test_case_upload/?test_case_id=" + vm.testCaseId, + method: "get", + dataType: "json", + success: function(response){ + if(response.code){ + bsAlert(response.data); + } + else { + vm.testCaseList = []; + for (var key in response.data.file_list) { + vm.testCaseList.push({ + input: response.data.file_list[key].input_name, + output: response.data.file_list[key].output_name + }) + } + vm.uploadSuccess = true; + } + } + }) } } }); - } - 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/static/src/js/app/admin/contest/submissionList.js b/static/src/js/app/admin/contest/submissionList.js deleted file mode 100644 index 34fd5914..00000000 --- a/static/src/js/app/admin/contest/submissionList.js +++ /dev/null @@ -1,88 +0,0 @@ -require(["jquery", "avalon", "csrfToken", "bsAlert"], function ($, avalon, csrfTokenHeader, bsAlert) { - - avalon.ready(function () { - - if (avalon.vmodels.contestSubmissionList){ - var vm = avalon.vmodels.contestSubmissionList; - } - else { - - var vm = avalon.define({ - $id: "contestSubmissionList", - submissionList: [], - previousPage: 0, - nextPage: 0, - page: 1, - totalPage: 1, - results : { - 0: "Accepted", - 1: "Runtime Error", - 2: "Time Limit Exceeded", - 3: "Memory Limit Exceeded", - 4: "Compile Error", - 5: "Format Error", - 6: "Wrong Answer", - 7: "System Error", - 8: "Waiting" - }, - 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) { - if (!page_index) - var page_index = vm.page; - getPageData(page_index); - }, - showSubmissionDetailPage: function (submissionId) { - - }, - goBack: function(check){ - vm.$fire("up!showContestListPage"); - } - }); - } - - getPageData(1); - - function getPageData(page) { - var url = "/api/admin/contest_submission/?paging=true&page=" + page + "&page_size=10&contest_id=" + avalon.vmodels.admin.$contestId; - if (avalon.vmodels.admin.$problemId) - url += "&problem_id=" + avalon.vmodels.admin.$problemId - $.ajax({ - url: url, - dataType: "json", - method: "get", - success: function (data) { - if (!data.code) { - vm.submissionList = data.data.results; - vm.totalPage = data.data.total_page; - vm.previousPage = data.data.previous_page; - vm.nextPage = data.data.next_page; - vm.page = page; - } - else { - bsAlert(data.data); - } - } - }); - } - - - }); - avalon.scan(); -}); \ No newline at end of file diff --git a/static/src/js/app/admin/problem/addProblem.js b/static/src/js/app/admin/problem/addProblem.js index 553e1f48..dc19f0b5 100644 --- a/static/src/js/app/admin/problem/addProblem.js +++ b/static/src/js/app/admin/problem/addProblem.js @@ -135,11 +135,11 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE vm.testCaseId = response.data.test_case_id; vm.uploadSuccess = true; vm.testCaseList = []; - for (var i = 0; i < response.data.file_list.input.length; i++) { + for(var key in response.data.file_list){ vm.testCaseList.push({ - input: response.data.file_list.input[i], - output: response.data.file_list.output[i] - }); + input: response.data.file_list[key].input_name, + output: response.data.file_list[key].output_name + }) } bsAlert("测试数据添加成功!共添加" + vm.testCaseList.length + "组测试数据"); } diff --git a/static/src/js/app/admin/problem/editProblem.js b/static/src/js/app/admin/problem/editProblem.js index 923dd854..9fa96251 100644 --- a/static/src/js/app/admin/problem/editProblem.js +++ b/static/src/js/app/admin/problem/editProblem.js @@ -137,11 +137,11 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE vm.testCaseId = response.data.test_case_id; vm.uploadSuccess = true; vm.testCaseList = []; - for (var i = 0; i < response.data.file_list.input.length; i++) { + for(var key in response.data.file_list){ vm.testCaseList.push({ - input: response.data.file_list.input[i], - output: response.data.file_list.output[i] - }); + input: response.data.file_list[key].input_name, + output: response.data.file_list[key].output_name + }) } bsAlert("测试数据添加成功!共添加" + vm.testCaseList.length + "组测试数据"); } diff --git a/template/src/admin/contest/edit_problem.html b/template/src/admin/contest/edit_problem.html index 87a7976f..f5ef1487 100644 --- a/template/src/admin/contest/edit_problem.html +++ b/template/src/admin/contest/edit_problem.html @@ -2,7 +2,7 @@
@@ -22,15 +22,14 @@
- -

请填写题目描述

+
+ data-error="请输入时间限制(保证是一个30-5000的合法整数)" required>
@@ -41,11 +40,6 @@
-
-
- -
-


-
+
请将所有测试用例打包在一个文件中上传,所有文件要在压缩包的根目录,且输入输出文件名要以从1开始连续数字标识要对应例如:
1.in 1.out 2.in 2.out
@@ -127,7 +121,7 @@
- +
diff --git a/template/src/admin/contest/problem_list.html b/template/src/admin/contest/problem_list.html new file mode 100644 index 00000000..b0042db1 --- /dev/null +++ b/template/src/admin/contest/problem_list.html @@ -0,0 +1,34 @@ +
+ +

比赛题目列表

+
+ +
+ + + + + + + + + + + + + + + + + +
ID题目创建时间可见通过次数/提交总数
{{ el.sort_index }}{{ el.title }}{{ el.create_time|date("yyyy-MM-dd HH:mm:ss")}}{{ el.total_accepted_number }}/{{ el.total_submit_number }} + +
+
+ \ No newline at end of file