修改 admin 界面,ip 太宽了

monitor 不再使用,配置判题服务器的代码移入 judge_dispatcher 里面

添加前端后台判题服务器管理页面一些校验的功能

去掉判题服务器监控的前端和后端

修复比赛 first ac 显示错误的问题

修复两步验证中的错误

tfa 显示 url

增加 qrcode 依赖

完成两步验证的逻辑

fix error package name and add pip mirrorwq

废弃 huey,多数据库连接的时候存在 connection 无法释放的问题,回到 celery

修复 huey 队列不会释放数据库连接的问题,是用法不对

增加关闭两步验证的 api

增加两步验证基础代码

完善 sso 登录部分

规范配置文件写法;数据库用户名也在环境变量中取

个人博客链接前面也增加图标

修改判题机器的配置文件

删除不再使用的配置文件

Squash from a1fff74 to 12f96c6 by virusdefender
This commit is contained in:
virusdefender
2015-12-23 00:31:43 +08:00
parent 0e222a6109
commit c08ec7a2dc
43 changed files with 1078 additions and 277 deletions

View File

@@ -22,46 +22,48 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "bootstrap"], function ($,
}
var superAdminNav = [
{ name: "首页",
children: [{name: "页", hash: "#index/index"},
{name: "监控", hash: "#monitor/monitor"}]
},
{
name: "通用",
children: [{name: "公告管理", hash: "#announcement/announcement"},
{name: "用户管理", hash: "#user/user_list"}]
},
{
name: "题目管理",
children: [{name: "题目列表", hash: "#problem/problem_list"},
{name: "创建题目", hash: "#problem/add_problem"}]
},
{
name: "比赛管理",
children: [{name: "比赛列表", hash: "#contest/contest_list"},
{name: "创建比赛", hash: "#contest/add_contest"}]
},
{
name: "小组管理",
children: [{name: "小组列表", hash: "#group/group"},
{name: "加入小组请求", hash: "#group/join_group_request_list"}]
}
{
name: "页",
children: [{name: "主页", hash: "#index/index"},
{name: "判题服务器", hash: "#judges/judges"}]
},
{
name: "通用",
children: [{name: "公告管理", hash: "#announcement/announcement"},
{name: "用户管理", hash: "#user/user_list"}]
},
{
name: "题目管理",
children: [{name: "题目列表", hash: "#problem/problem_list"},
{name: "创建题目", hash: "#problem/add_problem"}]
},
{
name: "比赛管理",
children: [{name: "比赛列表", hash: "#contest/contest_list"},
{name: "创建比赛", hash: "#contest/add_contest"}]
},
{
name: "小组管理",
children: [{name: "小组列表", hash: "#group/group"},
{name: "加入小组请求", hash: "#group/join_group_request_list"}]
}
];
var adminNav = [
{ name: "首页",
children: [{name: "页", hash: "#index/index"}]
},
{
name: "比赛管理",
children: [{name: "比赛列表", hash: "#contest/contest_list"},
{name: "创建比赛", hash: "#contest/add_contest"}]
},
{
name: "小组管理",
children: [{name: "小组列表", hash: "#group/group"},
{name: "加入小组请求", hash: "#group/join_group_request_list"}]
}
{
name: "页",
children: [{name: "主页", hash: "#index/index"}]
},
{
name: "比赛管理",
children: [{name: "比赛列表", hash: "#contest/contest_list"},
{name: "创建比赛", hash: "#contest/add_contest"}]
},
{
name: "小组管理",
children: [{name: "小组列表", hash: "#group/group"},
{name: "加入小组请求", hash: "#group/join_group_request_list"}]
}
];
var vm = avalon.define({
@@ -79,7 +81,7 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "bootstrap"], function ($,
hide_loading: function () {
$("#loading-gif").hide();
},
getLiId: function(hash){
getLiId: function (hash) {
return hash.replace("#", "li-").replace("/", "-");
}
});
@@ -89,21 +91,20 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "bootstrap"], function ($,
url: "/api/user/",
method: "get",
dataType: "json",
success: function(data){
if(!data.code){
success: function (data) {
if (!data.code) {
vm.username = data.data.username;
vm.adminType = data.data.admin_type;
if (data.data.admin_type == 2){
if (data.data.admin_type == 2) {
vm.adminNavList = superAdminNav;
}
else{
else {
vm.adminNavList = adminNav;
}
}
}
});
avalon.scan();
@@ -115,12 +116,14 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "bootstrap"], function ($,
show_template("template/" + hash + ".html");
}
};
setTimeout(function(){li_active("#li-" + hash.replace("/", "-"));}, 500);
setTimeout(function () {
li_active("#li-" + hash.replace("/", "-"));
}, 500);
$.ajaxSetup({
beforeSend: csrfTokenHeader,
beforeSend: csrfTokenHeader,
dataType: "json",
error: function(){
error: function () {
bsAlert("请求失败");
}
});

View File

@@ -0,0 +1,143 @@
require(["jquery", "avalon", "csrfToken", "bsAlert", "validator", "pager"],
function ($, avalon, csrfTokenHeader, bsAlert, editor) {
avalon.ready(function () {
if (avalon.vmodels.judges) {
var vm = avalon.vmodels.judges;
}
else {
var vm = avalon.define({
$id: "judges",
judgesList: [],
isEditing: false,
showEnableOnly: false,
//编辑器同步变量
max_instance_number: 0,
ipAddress: "",
port: 0,
status: true,
judgesId: -1,
name: "",
token: "",
id: 0,
pager: {
getPage: function (page) {
getPage(page);
}
},
editJudges: function (judges) {
vm.id = judges.id;
vm.name = judges.name;
vm.judgesId = judges.id;
vm.status = judges.status;
vm.port = judges.port;
vm.ipAddress = judges.ip;
vm.max_instance_number = judges.max_instance_number;
vm.token = judges.token;
vm.isEditing = true;
},
cancelEdit: function () {
vm.isEditing = false;
}
});
vm.$watch("showEnableOnly", function () {
getPage(1);
avalon.vmodels.judgesPager.currentPage = 1;
});
}
function getPage(page) {
var url = "/api/admin/judges/?paging=true&page=" + page + "&page_size=20";
if (vm.showEnableNnly)
url += "&status=true";
$.ajax({
url: url,
method: "get",
success: function (data) {
if (!data.code) {
vm.judgesList = data.data.results;
avalon.vmodels.judgesPager.totalPage = data.data.total_page;
}
else {
bsAlert(data.data);
}
}
});
}
$("#judges-form").validator().on('submit', function (e) {
if (!e.isDefaultPrevented()) {
var name = $("#name").val();
var max_instance_number = $("#max_instance_number").val();
var ip = $("#ipAddress").val();
var port = $("#port").val();
var token = $("#token").val();
$.ajax({
url: "/api/admin/judges/",
contentType: "application/json",
data: JSON.stringify({
name: name,
ip: ip,
port: port,
token: token,
max_instance_number: max_instance_number
}),
dataType: "json",
method: "post",
success: function (data) {
if (!data.code) {
bsAlert("提交成功!");
$("#name").val("");
$("#max_instance_number").val("");
$("#ipAddress").val("");
$("#port").val("");
$("#token").val("");
getPage(1);
} else {
bsAlert(data.data);
}
}
});
return false;
}
});
$("#edit-judges-form").validator().on('submit', function (e) {
if (!e.isDefaultPrevented()) {
var name = vm.name;
var max_instance_number = vm.max_instance_number;
var ip = vm.ipAddress;
var port = vm.port;
var token = vm.token;
var status = vm.status;
var id = vm.id;
$.ajax({
url: "/api/admin/judges/",
contentType: "application/json",
data: JSON.stringify({
id: id,
name: name,
ip: ip,
port: port,
token: token,
max_instance_number: max_instance_number,
status: status
}),
dataType: "json",
method: "put",
success: function (data) {
if (!data.code) {
bsAlert("提交成功!");
getPage(1);
} else {
bsAlert(data.data);
}
}
});
return false;
}
});
});
avalon.scan();
});

View File

@@ -1,48 +0,0 @@
require(["jquery", "chart"], function ($, Chart) {
var data = {
labels: ["初始化"],
datasets: [
{
label: "队列长度",
fillColor: "rgba(255,255,255,0.2)",
strokeColor: "rgba(151,187,205,1)",
pointColor: "rgba(151,187,205,1)",
pointStrokeColor: "#fff",
pointHighlightFill: "#fff",
pointHighlightStroke: "rgba(151,187,205,1)",
data: [0]
}
]
};
var chart = new Chart($("#waiting-queue-chart").get(0).getContext("2d")).Line(data);
var dataCounter = 0;
function getMonitorData(){
var hash = location.hash;
if (hash != "#monitor/monitor"){
clearInterval(intervalId);
}
$.ajax({
url: "/api/admin/monitor/",
method: "get",
dataType: "json",
success: function(data){
if(!data.code){
chart.addData([data.data["count"]], data.data["time"])
dataCounter ++;
}
}
})
}
$("#clear-chart-data").click(function(){
for(var i = 0;i < dataCounter;i++) {
chart.removeData();
}
dataCounter = 0;
});
var intervalId = setInterval(getMonitorData, 3000);
});

View File

@@ -4,23 +4,31 @@ require(["jquery", "bsAlert", "csrfToken", "validator"], function ($, bsAlert, c
if (!e.isDefaultPrevented()) {
var username = $("#username").val();
var password = $("#password").val();
var captcha = $("#captcha").val();
var tfaCode = $("#tfa-code").val();
console.log(tfaCode);
if(tfaCode.length && tfaCode.length != 6){
bsAlert("验证码为六位数字");
return false;
}
$.ajax({
beforeSend: csrfTokenHeader,
url: "/api/login/",
data: {username: username, password: password, captcha: captcha},
data: {username: username, password: password, tfa_code: tfaCode},
dataType: "json",
method: "post",
success: function (data) {
if (!data.code) {
if(data.data == "tfa_required"){
$("#tfa-area").show();
return false;
}
function getLocationVal(id){
var temp = unescape(location.search).split(id+"=")[1] || "";
return temp.indexOf("&")>=0 ? temp.split("&")[0] : temp;
}
var from = getLocationVal("__from");
if(from != ""){
console.log(from);
window.location.href = from;
}
else{
@@ -28,7 +36,6 @@ require(["jquery", "bsAlert", "csrfToken", "validator"], function ($, bsAlert, c
}
}
else {
refresh_captcha();
bsAlert(data.data);
}
},
@@ -40,11 +47,5 @@ require(["jquery", "bsAlert", "csrfToken", "validator"], function ($, bsAlert, c
return false;
}
});
function refresh_captcha(){
$("#captcha-img")[0].src = "/captcha/?" + Math.random();
$("#captcha")[0].value = "";
}
$("#captcha-img").click(function(){
refresh_captcha();
});
});

View File

@@ -0,0 +1,27 @@
require(["jquery", "bsAlert", "csrfToken"], function ($, bsAlert, csrfTokenHeader) {
$("#tfa_submit").click(function(){
var code = $("#tfa_code").val();
if (code.length != 6){
bsAlert("验证码是6位数字");
return;
}
$.ajax({
beforeSend: csrfTokenHeader,
url: "/api/two_factor_auth/",
data: {code: code},
dataType: "json",
method: "post",
success: function(data){
if(data.code){
bsAlert(data.data);
}
else{
bsAlert("两步验证开启成功");
location.reload();
}
}
})
})
});

View File

@@ -54,31 +54,31 @@
//以下都是页面 script 标签引用的js
announcement_0_pack: "app/admin/announcement/announcement",
userList_1_pack: "app/admin/user/userList",
problem_2_pack: "app/oj/problem/problem",
submissionList_3_pack: "app/admin/problem/submissionList",
contestCountdown_4_pack: "app/oj/contest/contestCountdown",
avatar_5_pack: "app/oj/account/avatar",
addProblem_6_pack: "app/admin/problem/addProblem",
problem_7_pack: "app/admin/problem/problem",
contestList_8_pack: "app/admin/contest/contestList",
admin_9_pack: "app/admin/admin",
login_10_pack: "app/oj/account/login",
applyResetPassword_11_pack: "app/oj/account/applyResetPassword",
addContest_12_pack: "app/admin/contest/addContest",
contestPassword_13_pack: "app/oj/contest/contestPassword",
changePassword_14_pack: "app/oj/account/changePassword",
monitor_15_pack: "app/admin/monitor/monitor",
editProblem_16_pack: "app/admin/contest/editProblem",
joinGroupRequestList_17_pack: "app/admin/group/joinGroupRequestList",
group_18_pack: "app/oj/group/group",
contestProblemList_19_pack: "app/admin/contest/contestProblemList",
editProblem_20_pack: "app/admin/problem/editProblem",
register_21_pack: "app/oj/account/register",
groupDetail_22_pack: "app/admin/group/groupDetail",
editContest_23_pack: "app/admin/contest/editContest",
resetPassword_24_pack: "app/oj/account/resetPassword",
group_25_pack: "app/admin/group/group",
settings_26_pack: "app/oj/account/settings"
twoFactorAuth_2_pack: "app/oj/account/twoFactorAuth",
problem_3_pack: "app/oj/problem/problem",
submissionList_4_pack: "app/admin/problem/submissionList",
contestCountdown_5_pack: "app/oj/contest/contestCountdown",
avatar_6_pack: "app/oj/account/avatar",
addProblem_7_pack: "app/admin/problem/addProblem",
problem_8_pack: "app/admin/problem/problem",
contestList_9_pack: "app/admin/contest/contestList",
admin_10_pack: "app/admin/admin",
login_11_pack: "app/oj/account/login",
applyResetPassword_12_pack: "app/oj/account/applyResetPassword",
addContest_13_pack: "app/admin/contest/addContest",
contestPassword_14_pack: "app/oj/contest/contestPassword",
changePassword_15_pack: "app/oj/account/changePassword",
editProblem_17_pack: "app/admin/contest/editProblem",
joinGroupRequestList_18_pack: "app/admin/group/joinGroupRequestList",
group_19_pack: "app/oj/group/group",
contestProblemList_20_pack: "app/admin/contest/contestProblemList",
editProblem_21_pack: "app/admin/problem/editProblem",
register_22_pack: "app/oj/account/register",
groupDetail_23_pack: "app/admin/group/groupDetail",
editContest_24_pack: "app/admin/contest/editContest",
resetPassword_25_pack: "app/oj/account/resetPassword",
group_26_pack: "app/admin/group/group",
settings_27_pack: "app/oj/account/settings"
},
shim: {
avalon: {
@@ -96,79 +96,79 @@
name: "userList_1_pack"
},
{
name: "problem_2_pack"
name: "twoFactorAuth_2_pack"
},
{
name: "submissionList_3_pack"
name: "problem_3_pack"
},
{
name: "contestCountdown_4_pack"
name: "submissionList_4_pack"
},
{
name: "avatar_5_pack"
name: "contestCountdown_5_pack"
},
{
name: "addProblem_6_pack"
name: "avatar_6_pack"
},
{
name: "problem_7_pack"
name: "addProblem_7_pack"
},
{
name: "contestList_8_pack"
name: "problem_8_pack"
},
{
name: "admin_9_pack"
name: "contestList_9_pack"
},
{
name: "login_10_pack"
name: "admin_10_pack"
},
{
name: "applyResetPassword_11_pack"
name: "login_11_pack"
},
{
name: "addContest_12_pack"
name: "applyResetPassword_12_pack"
},
{
name: "contestPassword_13_pack"
name: "addContest_13_pack"
},
{
name: "changePassword_14_pack"
name: "contestPassword_14_pack"
},
{
name: "monitor_15_pack"
name: "changePassword_15_pack"
},
{
name: "editProblem_16_pack"
name: "editProblem_17_pack"
},
{
name: "joinGroupRequestList_17_pack"
name: "joinGroupRequestList_18_pack"
},
{
name: "group_18_pack"
name: "group_19_pack"
},
{
name: "contestProblemList_19_pack"
name: "contestProblemList_20_pack"
},
{
name: "editProblem_20_pack"
name: "editProblem_21_pack"
},
{
name: "register_21_pack"
name: "register_22_pack"
},
{
name: "groupDetail_22_pack"
name: "groupDetail_23_pack"
},
{
name: "editContest_23_pack"
name: "editContest_24_pack"
},
{
name: "resetPassword_24_pack"
name: "resetPassword_25_pack"
},
{
name: "group_25_pack"
name: "group_26_pack"
},
{
name: "settings_26_pack"
name: "settings_27_pack"
}
],
optimizeCss: "standard",

View File

@@ -56,31 +56,31 @@ var require = {
//以下都是页面 script 标签引用的js
announcement_0_pack: "app/admin/announcement/announcement",
userList_1_pack: "app/admin/user/userList",
problem_2_pack: "app/oj/problem/problem",
submissionList_3_pack: "app/admin/problem/submissionList",
contestCountdown_4_pack: "app/oj/contest/contestCountdown",
avatar_5_pack: "app/oj/account/avatar",
addProblem_6_pack: "app/admin/problem/addProblem",
problem_7_pack: "app/admin/problem/problem",
contestList_8_pack: "app/admin/contest/contestList",
admin_9_pack: "app/admin/admin",
login_10_pack: "app/oj/account/login",
applyResetPassword_11_pack: "app/oj/account/applyResetPassword",
addContest_12_pack: "app/admin/contest/addContest",
contestPassword_13_pack: "app/oj/contest/contestPassword",
changePassword_14_pack: "app/oj/account/changePassword",
monitor_15_pack: "app/admin/monitor/monitor",
editProblem_16_pack: "app/admin/contest/editProblem",
joinGroupRequestList_17_pack: "app/admin/group/joinGroupRequestList",
group_18_pack: "app/oj/group/group",
contestProblemList_19_pack: "app/admin/contest/contestProblemList",
editProblem_20_pack: "app/admin/problem/editProblem",
register_21_pack: "app/oj/account/register",
groupDetail_22_pack: "app/admin/group/groupDetail",
editContest_23_pack: "app/admin/contest/editContest",
resetPassword_24_pack: "app/oj/account/resetPassword",
group_25_pack: "app/admin/group/group",
settings_26_pack: "app/oj/account/settings",
twoFactorAuth_2_pack: "app/oj/account/twoFactorAuth",
problem_3_pack: "app/oj/problem/problem",
submissionList_4_pack: "app/admin/problem/submissionList",
contestCountdown_5_pack: "app/oj/contest/contestCountdown",
avatar_6_pack: "app/oj/account/avatar",
addProblem_7_pack: "app/admin/problem/addProblem",
problem_8_pack: "app/admin/problem/problem",
contestList_9_pack: "app/admin/contest/contestList",
admin_10_pack: "app/admin/admin",
login_11_pack: "app/oj/account/login",
applyResetPassword_12_pack: "app/oj/account/applyResetPassword",
addContest_13_pack: "app/admin/contest/addContest",
contestPassword_14_pack: "app/oj/contest/contestPassword",
changePassword_15_pack: "app/oj/account/changePassword",
editProblem_17_pack: "app/admin/contest/editProblem",
joinGroupRequestList_18_pack: "app/admin/group/joinGroupRequestList",
group_19_pack: "app/oj/group/group",
contestProblemList_20_pack: "app/admin/contest/contestProblemList",
editProblem_21_pack: "app/admin/problem/editProblem",
register_22_pack: "app/oj/account/register",
groupDetail_23_pack: "app/admin/group/groupDetail",
editContest_24_pack: "app/admin/contest/editContest",
resetPassword_25_pack: "app/oj/account/resetPassword",
group_26_pack: "app/admin/group/group",
settings_27_pack: "app/oj/account/settings"
},
shim: {
avalon: {