修改 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:
@@ -118,3 +118,13 @@ li.problem-tag {
|
||||
padding-top: 7.5px;
|
||||
padding-bottom: 7.5px;
|
||||
}
|
||||
|
||||
|
||||
#tfa-qrcode{
|
||||
height: 40%;
|
||||
width: 40%;
|
||||
}
|
||||
|
||||
#tfa-area{
|
||||
display: none;
|
||||
}
|
||||
@@ -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("请求失败");
|
||||
}
|
||||
});
|
||||
|
||||
143
static/src/js/app/admin/judges/judges.js
Normal file
143
static/src/js/app/admin/judges/judges.js
Normal 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();
|
||||
});
|
||||
@@ -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);
|
||||
|
||||
});
|
||||
@@ -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();
|
||||
});
|
||||
|
||||
});
|
||||
27
static/src/js/app/oj/account/twoFactorAuth.js
Normal file
27
static/src/js/app/oj/account/twoFactorAuth.js
Normal 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();
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
})
|
||||
});
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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: {
|
||||
|
||||
Reference in New Issue
Block a user