后台题目创建编辑 js 的 bug 修复;增加文件上传进度条

This commit is contained in:
virusdefender 2015-10-17 19:59:53 +08:00
parent e46847880e
commit bb5be25371
9 changed files with 131 additions and 166 deletions

View File

@ -109,24 +109,10 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "bootstrap"], function ($,
vm.template_url = "template/group/group_detail.html"; vm.template_url = "template/group/group_detail.html";
}); });
vm.$watch("showEditProblemPage", function (problemId) {
vm.problemId = problemId;
vm.template_url = "template/problem/edit_problem.html";
});
vm.$watch("showProblemListPage", function () {
vm.template_url = "template/problem/problem_list.html";
});
vm.$watch("showGroupListPage", function () { vm.$watch("showGroupListPage", function () {
vm.template_url = "template/group/group.html"; vm.template_url = "template/group/group.html";
}); });
vm.$watch("showProblemSubmissionPage", function (problemId) {
vm.problemId = problemId;
vm.template_url = "template/problem/submission_list.html";
});
vm.$watch("showContestProblemPage", function (problemId, contestId, contestMode) { vm.$watch("showContestProblemPage", function (problemId, contestId, contestMode) {
vm.$problemId = problemId; vm.$problemId = problemId;
vm.$contestId = contestId; vm.$contestId = contestId;

View File

@ -4,7 +4,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE
$("#add-problem-form").validator() $("#add-problem-form").validator()
.on('submit', function (e) { .on('submit', function (e) {
if (!e.isDefaultPrevented()){ if (!e.isDefaultPrevented()) {
if (vm.testCaseId == "") { if (vm.testCaseId == "") {
bsAlert("你还没有上传测试数据!"); bsAlert("你还没有上传测试数据!");
return false; return false;
@ -13,8 +13,8 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE
bsAlert("题目描述不能为空!"); bsAlert("题目描述不能为空!");
return false; return false;
} }
if (vm.timeLimit < 100 || vm.timeLimit > 5000) { if (vm.timeLimit < 30 || vm.timeLimit > 5000) {
bsAlert("保证时间限制是一个100-5000的合法整数"); bsAlert("保证时间限制是一个30-5000的合法整数");
return false; return false;
} }
if (vm.samples.length == 0) { if (vm.samples.length == 0) {
@ -50,7 +50,10 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE
}; };
for (var i = 0; i < vm.samples.$model.length; i++) { 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({ $.ajax({
@ -74,44 +77,11 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE
} }
}); });
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 + "组测试数据");
}
});
var hintEditor = editor("#hint"); var hintEditor = editor("#hint");
var problemDescription = editor("#problemDescription"); var problemDescription = editor("#problemDescription");
if (avalon.vmodels.addProblem) { if (avalon.vmodels.addProblem) {
var vm = 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 else
var vm = avalon.define({ var vm = avalon.define({
@ -119,7 +89,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE
title: "", title: "",
description: "", description: "",
timeLimit: 1000, timeLimit: 1000,
memoryLimit: 256, memoryLimit: 128,
samples: [{input: "", output: "", "visible": true}], samples: [{input: "", output: "", "visible": true}],
hint: "", hint: "",
visible: true, visible: true,
@ -131,6 +101,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE
testCaseList: [], testCaseList: [],
uploadSuccess: false, uploadSuccess: false,
source: "", source: "",
uploadProgress: 0,
addSample: function () { addSample: function () {
vm.samples.push({input: "", output: "", "visible": true}); vm.samples.push({input: "", output: "", "visible": true});
}, },
@ -149,6 +120,27 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE
} }
}); });
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 + "组测试数据");
}
},
function (file, percentage) {
vm.uploadProgress = percentage;
});
var tagAutoCompleteList = []; var tagAutoCompleteList = [];
$.ajax({ $.ajax({

View File

@ -5,7 +5,7 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE
$("#edit-problem-form").validator() $("#edit-problem-form").validator()
.on('submit', function (e) { .on('submit', function (e) {
if (!e.isDefaultPrevented()){ if (!e.isDefaultPrevented()) {
if (vm.testCaseId == "") { if (vm.testCaseId == "") {
bsAlert("你还没有上传测试数据!"); bsAlert("你还没有上传测试数据!");
return false; return false;
@ -51,7 +51,10 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE
}; };
for (var i = 0; i < vm.samples.$model.length; i++) { 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({ $.ajax({
@ -75,78 +78,70 @@ require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagE
return false; return false;
} }
}); });
if (avalon.vmodels.editProblem) { if (avalon.vmodels.editProblem) {
var vm = avalon.vmodels.editProblem; var vm = avalon.vmodels.editProblem;
vm.title= "", }
vm.description= ""; else
vm.timeLimit= -1; var vm = avalon.define({
vm.memoryLimit= -1; $id: "editProblem",
vm.samples= []; title: "",
vm.hint= ""; description: "",
vm.visible= true; timeLimit: -1,
vm.difficulty= 0; memoryLimit: -1,
vm.inputDescription= ""; samples: [],
vm.outputDescription= ""; hint: "",
vm.testCaseIdd= ""; visible: true,
vm.uploadSuccess= false; difficulty: 0,
vm.source= ""; inputDescription: "",
vm.testCaseList= []; outputDescription: "",
} testCaseIdd: "",
else uploadSuccess: false,
var vm = avalon.define({ source: "",
$id: "editProblem", testCaseList: [],
title: "", uploadProgress: 0,
description: "", addSample: function () {
timeLimit: -1, vm.samples.push({input: "", output: "", "visible": true});
memoryLimit: -1, },
samples: [], delSample: function (sample) {
hint: "", if (confirm("你确定要删除么?")) {
visible: true, vm.samples.remove(sample);
difficulty: 0, }
inputDescription: "", },
outputDescription: "", toggleSample: function (sample) {
testCaseIdd: "", sample.visible = !sample.visible;
uploadSuccess: false, },
source: "", getBtnContent: function (item) {
testCaseList: [], if (item.visible)
addSample: function () { return "折叠";
vm.samples.push({input: "", output: "", "visible": true}); return "展开";
}, },
delSample: function (sample) { showProblemListPage: function () {
if (confirm("你确定要删除么?")) { avalon.vmodels.admin.template_url = "template/problem/problem_list.html";
vm.samples.remove(sample);
} }
}, });
toggleSample: function (sample) {
sample.visible = !sample.visible;
},
getBtnContent: function (item) {
if (item.visible)
return "折叠";
return "展开";
},
showProblemListPage: function(){
vm.$fire("up!showProblemListPage");
}
});
var hintEditor = editor("#hint"); var hintEditor = editor("#hint");
var descriptionEditor = editor("#problemDescription"); var descriptionEditor = editor("#problemDescription");
var testCaseUploader = uploader("#testCaseFile", "/api/admin/test_case_upload/", function (file, response) { var testCaseUploader = uploader("#testCaseFile", "/api/admin/test_case_upload/",
if (response.code) function (file, response) {
bsAlert(response.data); if (response.code)
else { bsAlert(response.data);
vm.testCaseId = response.data.test_case_id; else {
vm.uploadSuccess = true; vm.testCaseId = response.data.test_case_id;
vm.testCaseList = []; vm.uploadSuccess = true;
for (var i = 0; i < response.data.file_list.input.length; i++) { vm.testCaseList = [];
vm.testCaseList.push({ for (var i = 0; i < response.data.file_list.input.length; i++) {
input: response.data.file_list.input[i], vm.testCaseList.push({
output: response.data.file_list.output[i] input: response.data.file_list.input[i],
}); output: response.data.file_list.output[i]
});
}
bsAlert("测试数据添加成功!共添加" + vm.testCaseList.length + "组测试数据");
} }
bsAlert("测试数据添加成功!共添加" + vm.testCaseList.length + "组测试数据"); },
function (file, percentage) {
vm.uploadProgress = percentage;
} }
}); );
$.ajax({ $.ajax({
url: "/api/admin/problem/?problem_id=" + avalon.vmodels.admin.problemId, url: "/api/admin/problem/?problem_id=" + avalon.vmodels.admin.problemId,

View File

@ -1,54 +1,44 @@
require(["jquery", "avalon", "csrfToken", "bsAlert"], function ($, avalon, csrfTokenHeader, bsAlert) { require(["jquery", "avalon", "csrfToken", "bsAlert", "pager"], function ($, avalon, csrfTokenHeader, bsAlert) {
avalon.ready(function () { avalon.ready(function () {
if(avalon.vmodels.problemList){ if(avalon.vmodels.problemList){
vm = avalon.vmodels.problemList; vm = avalon.vmodels.problemList;
problemList = [];
} }
else { else {
var vm = avalon.define({ var vm = avalon.define({
$id: "problemList", $id: "problemList",
problemList: [], problemList: [],
previousPage: 0,
nextPage: 0,
page: 1,
totalPage: 1,
keyword: "", keyword: "",
showVisibleOnly: false, showVisibleOnly: false,
getNext: function () {
if (!vm.nextPage) pager: {
return; getPage: function (page) {
getPageData(vm.page + 1); getPage(page);
},
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);
},
showEditProblemPage: function (problemId) { showEditProblemPage: function (problemId) {
vm.$fire("up!showEditProblemPage", problemId); avalon.vmodels.admin.problemId = problemId;
avalon.vmodels.admin.template_url = "template/problem/edit_problem.html";
}, },
showProblemSubmissionPage: function(problemId){ showProblemSubmissionPage: function(problemId){
vm.$fire("up!showProblemSubmissionPage", problemId); avalon.vmodels.admin.problemId = problemId;
avalon.vmodels.admin.template_url = "template/problem/submission_list.html";
},
search: function(){
getPage(1);
avalon.vmodels.problemPager.currentPage = 1;
} }
}); });
vm.$watch("showVisibleOnly", function () { vm.$watch("showVisibleOnly", function () {
getPageData(1); getPage(1);
avalon.vmodels.problemPager.currentPage = 1;
}); });
} }
getPageData(1);
function getPageData(page) { function getPage(page) {
var url = "/api/admin/problem/?paging=true&page=" + page + "&page_size=10"; var url = "/api/admin/problem/?paging=true&page=" + page + "&page_size=10";
if (vm.keyword != "") if (vm.keyword != "")
url += "&keyword=" + vm.keyword; url += "&keyword=" + vm.keyword;
@ -61,10 +51,7 @@ require(["jquery", "avalon", "csrfToken", "bsAlert"], function ($, avalon, csrfT
success: function (data) { success: function (data) {
if (!data.code) { if (!data.code) {
vm.problemList = data.data.results; vm.problemList = data.data.results;
vm.totalPage = data.data.total_page; avalon.vmodels.problemPager.totalPage = data.data.total_page;
vm.previousPage = data.data.previous_page;
vm.nextPage = data.data.next_page;
vm.page = page;
} }
else { else {
bsAlert(data.data); bsAlert(data.data);

View File

@ -1,6 +1,6 @@
define("uploader", ["webUploader", "csrfToken"], function(webuploader,csrfTokenHeader){ define("uploader", ["webUploader", "csrfToken"], function (webuploader, csrfTokenHeader) {
function uploader(selector, server, onSuccess, beforeUpload) { function uploader(selector, server, onSuccess, uploadProgress) {
var Webuploader= webuploader.create({ var Webuploader = webuploader.create({
auto: true, auto: true,
// swf文件路径 // swf文件路径
swf: "/static/img/Uploader.swf", swf: "/static/img/Uploader.swf",
@ -11,11 +11,16 @@ define("uploader", ["webUploader", "csrfToken"], function(webuploader,csrfTokenH
pick: selector, pick: selector,
// 不压缩image, 默认如果是jpeg文件上传前会压缩一把再上传 // 不压缩image, 默认如果是jpeg文件上传前会压缩一把再上传
resize: false, resize: false,
uploadBeforeSend : csrfTokenHeader uploadBeforeSend: csrfTokenHeader,
accept: {
title: 'testcase zip',
extensions: 'zip',
mimeTypes: 'application/zip'
}
}); });
Webuploader.on("uploadBeforeSend",csrfTokenHeader); Webuploader.on("uploadBeforeSend", csrfTokenHeader);
Webuploader.on("uploadSuccess", onSuccess); Webuploader.on("uploadSuccess", onSuccess);
Webuploader.on("beforeFileQueued", beforeUpload); Webuploader.on("uploadProgress", uploadProgress);
return Webuploader; return Webuploader;
} }

View File

@ -105,6 +105,7 @@
<small class="text-info">请将所有测试用例打包在一个文件中上传所有文件要在压缩包的根目录且输入输出文件名要以从1开始连续数字标识要对应例如<br> <small class="text-info">请将所有测试用例打包在一个文件中上传所有文件要在压缩包的根目录且输入输出文件名要以从1开始连续数字标识要对应例如<br>
1.in 1.out 2.in 2.out 1.in 1.out 2.in 2.out
</small> </small>
<p>上传进度<span ms-text="uploadProgress * 100"></span>%</p>
<table class="table table-striped" ms-visible="uploadSuccess"> <table class="table table-striped" ms-visible="uploadSuccess">
<tr> <tr>
<td>编号</td> <td>编号</td>

View File

@ -111,6 +111,7 @@
<small class="text-info">请将所有测试用例打包在一个文件中上传所有文件要在压缩包的根目录且输入输出文件名要以从1开始连续数字标识要对应例如<br> <small class="text-info">请将所有测试用例打包在一个文件中上传所有文件要在压缩包的根目录且输入输出文件名要以从1开始连续数字标识要对应例如<br>
1.in 1.out 2.in 2.out 1.in 1.out 2.in 2.out
</small> </small>
<p>上传进度<span ms-text="uploadProgress * 100"></span>%</p>
<table class="table table-striped" ms-visible="uploadSuccess"> <table class="table table-striped" ms-visible="uploadSuccess">
<tr> <tr>
<td>编号</td> <td>编号</td>

View File

@ -6,7 +6,7 @@
<div class="form-group-sm"> <div class="form-group-sm">
<label>搜索</label> <label>搜索</label>
<input name="keyWord" class="form-control" placeholder="请输入关键词" ms-duplex="keyword"> <input name="keyWord" class="form-control" placeholder="请输入关键词" ms-duplex="keyword">
<input type="submit" value="搜索" class="btn btn-primary" ms-click="getPage(1)"> <input type="submit" value="搜索" class="btn btn-primary" ms-click="search()">
</div> </div>
</form> </form>
<br> <br>
@ -38,9 +38,7 @@
<label>仅显示可见 <input ms-duplex-checked="showVisibleOnly" type="checkbox"/></label> <label>仅显示可见 <input ms-duplex-checked="showVisibleOnly" type="checkbox"/></label>
</div> </div>
<div class="text-right"> <div class="text-right">
页数:{{ page }}/{{ totalPage }}&nbsp;&nbsp; <ms:pager $id="problemPager" config="pager"></ms:pager>
<button ms-attr-class="getBtnClass('pre')" ms-click="getPrevious">上一页</button>
<button ms-attr-class="getBtnClass('next')" ms-click="getNext">下一页</button>
</div> </div>
</div> </div>
<script src="/static/js/app/admin/problem/problem.js"></script> <script src="/static/js/app/admin/problem/problem.js"></script>

View File

@ -36,7 +36,7 @@
{% include "oj/problem/_problem_header.html" %} {% include "oj/problem/_problem_header.html" %}
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-body"> <div class="panel-body">
<h4>运行结果 : <span class="text-{{ submission.result|translate_result_class }}"> <h4>运行结果: <span class="text-{{ submission.result|translate_result_class }}">
{{ submission.result|translate_result }} {{ submission.result|translate_result }}
</span> </span>
</h4> </h4>