diff --git a/static/src/js/app/admin/contest/add_contest.js b/static/src/js/app/admin/contest/add_contest.js new file mode 100644 index 0000000..1e88501 --- /dev/null +++ b/static/src/js/app/admin/contest/add_contest.js @@ -0,0 +1,252 @@ +require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "datetimePicker", + "formValidation",], + function ($, avalon, editor, uploader, bsAlert, csrfTokenHeader) { + avalon.vmodels.add_contest = null; + $("#add-contest-form") + .formValidation({ + framework: "bootstrap", + fields: { + name: { + validators: { + notEmpty: { + message: "请填写比赛名称" + }, + stringLength: { + min: 1, + max: 30, + message: "名称不能超过30个字" + } + } + }, + description: { + validators: { + notEmpty: { + message: "请输入描述" + } + } + }, + start_time: { + validators: { + notEmpty: { + message: "请填写开始时间" + + }, + date: { + format: "YYYY-MM-DD h:m", + message: "请输入一个正确的日期格式" + } + } + }, + end_time: { + validators: { + notEmpty: { + message: "请填写结束时间" + }, + date: { + format: "YYYY-MM-DD h:m", + message: "请输入一个正确的日期格式" + } + } + }, + password: { + validators: { + stringLength: { + min: 0, + max: 30, + message: "密码不能超过10个字符" + } + } + }, + "problem_name[]": { + validators: { + notEmpty: { + message: "请输入题目名称" + }, + stringLength: { + min: 1, + max: 30, + message: "题目不能超过30个字符" + } + } + }, + "cpu[]": { + validators: { + notEmpty: { + message: "请输入时间限制" + }, + integer: { + message: "时间限制用整数表示" + }, + between: { + inclusive: true, + min: 1, + max: 5000, + message: "只能在1-5000之间" + } + } + }, + "memory[]": { + validators: { + notEmpty: { + message: "请输入内存" + }, + integer: { + message: "请输入一个合法的数字" + } + } + } + } + }) + .on("success.form.fv", function (e) { + e.preventDefault(); + var data = { + title: vm.title, + description: vm.description, + start_time: vm.startTime, + end_time: vm.endTime, + password: vm.password, + mode: vm.model, + show_rank: vm.openRank + }; + $.ajax({ + beforeSend: csrfTokenHeader, + url: "/api/admin/contest/", + dataType: "json", + data: data, + method: "post", + contentType: "application/json", + success: function (data) { + if (!data.code) { + bsAlert("添加成功!"); + console.log(data); + } + else { + bsAlert(data.data); + console.log(data); + } + } + }); + console.log(data); + }); + function make_id() { + var text = ""; + var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + for (var i = 0; i < 5; i++) + text += possible.charAt(Math.floor(Math.random() * possible.length)); + return text; + } + var upLoaderInited = false; + editor("#editor"); + + var vm = avalon.define({ + $id: "add_contest", + title: "", + problemCount: 0, + description: "", + startTime: "", + endTime: "", + password: "", + model: "", + openRank: false, + problems: [], + problemNo: "-1", + add_problem: function () { + var problem_id = make_id(); + var problem = { + id: problem_id, + title: "", + cpu: 1000, + memory: 256, + description: "", + samples: [], + visible: true, + test_case_id: "", + testCaseList: [], + hint: "", + difficulty: 0, + uploadSuccess: false + }; + vm.problems.push(problem); + var id = vm.problems.length - 1; + editor("#problem-" + problem_id + "-description"); + var hinteditor = editor("#problem-" + problem_id +"-hint"); + $("#add-contest-form").formValidation('addField', $('[name="problem_name[]"]')); + $("#add-contest-form").formValidation('addField', $('[name="cpu[]"]')); + $("#add-contest-form").formValidation('addField', $('[name="memory[]"]')); + }, + del_problem: function (problem) { + if (confirm("你确定要删除么?")) { + vm.problems.remove(problem); + } + }, + toggle: function (item) { + item.visible = !item.visible; + }, + add_sample: function (problem) { + problem.samples.push({id: make_id(), visible: true, input: "", output: ""}); + }, + del_sample: function (problem, sample) { + if (confirm("你确定要删除么?")) { + problem.samples.remove(sample); + } + }, + getBtnContent: function (item) { + if (item.visible) + return "折叠"; + return "展开"; + } + }); + + uploader("#uploader", "/api/admin/test_case_upload/", function (file, respond) { + if (respond.code) + bsAlert(respond.data); + else { + var index = parseInt(vm.problemNo)-1; + vm.problems[index].test_case_id = respond.data.test_case_id; + vm.problems[index].uploadSuccess = true; + vm.problems[index].testCaseList = []; + for (var i = 0; i < respond.data.file_list.input.length; i++) { + vm.problems[index].testCaseList.push({ + input: respond.data.file_list.input[i], + output: respond.data.file_list.output[i] + }); + } + bsAlert("测试数据添加成功!共添加"+vm.problems[index].testCaseList.length +"组测试数据"); + } + }, + function(){ + console.log(vm.problemNo); + if (vm.problemNo == "-1") + { + bsAlert("你还未指定一道题目!"); + return false; + } + } + ); + isUploaderInited = true; + + avalon.scan(); + + $("#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" + }); + $("#contest_start_time").datetimepicker() + .on("hide", function (ev) { + $("#add-contest-form") + .formValidation("revalidateField", "start_time"); + }); + $("#contest_end_time").datetimepicker() + .on("hide", function (ev) { + $("#add-contest-form") + .formValidation("revalidateField", "end_time"); + }); + }); \ 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 new file mode 100644 index 0000000..823179e --- /dev/null +++ b/static/src/js/app/admin/contest/contest_list.js @@ -0,0 +1,87 @@ +require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "datetimePicker"], 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, + keyword: "", + editingContestId: 0, + editTitle: "", + 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; + editor("#editor").setValue(vm.contestList[contestId-1].description); + } + } + }); + + getPageData(1); + } + + function getPageData(page) { +/* + var url = "/api/admin/contest/?paging=true&page=" + page + "&page_size=10"; + if (vm.keyword != "") + url += "&keyword=" + vm.keyword; + $.ajax({ + url: url, + dataType: "json", + method: "get", + success: function (data) { + if (!data.code) { + vm.contestList = 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); + } + } + }); +*/ + vm.contestList =[{id: 1, title:"The first contest", created_by: {username:"owen"}, description:"

this contest is just for

fun

"}]; + vm.totalPage = 1; + vm.previousPage = false; + vm.nextPage = false; + vm.page = 1; + } + + + }); + avalon.scan(); +}); diff --git a/template/admin/contest/contest_list.html b/template/admin/contest/contest_list.html new file mode 100644 index 0000000..0df7ba3 --- /dev/null +++ b/template/admin/contest/contest_list.html @@ -0,0 +1,96 @@ +
+

比赛列表

+ +
+
+
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
ID比赛比赛类型比赛模式公开排名开始时间结束时间创建时间创建者
{{ el.id }}{{ el.title }}{{ el.type }}{{ el.mode }}{{ el.show_rank }}{{ el.start_time|date("yyyy-MM-dd HH:mm:ss")}}{{ el.end_time|date("yyyy-MM-dd HH:mm:ss")}}{{ el.create_time|date("yyyy-MM-dd HH:mm:ss")}}{{ el.created_by.username }} + +
+
+ 页数:{{ page }}/{{ totalPage }}   + + +
+
+
+ + + + + 请填写比赛描述 +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ +
+