2016-07-18 16:39:37 +00:00
< ? php
requirePHPLib ( 'form' );
requirePHPLib ( 'judger' );
if ( $myUser == null || ! isSuperUser ( $myUser )) {
become403Page ();
}
$user_form = new UOJForm ( 'user' );
$user_form -> addInput ( 'username' , 'text' , '用户名' , '' ,
function ( $username ) {
if ( ! validateUsername ( $username )) {
return '用户名不合法' ;
}
if ( ! queryUser ( $username )) {
return '用户不存在' ;
}
return '' ;
},
null
);
$options = array (
2017-11-25 04:00:00 +00:00
'banneduser' => '设为封禁用户' ,
'normaluser' => '设为普通用户' ,
'superuser' => '设为超级用户'
2016-07-18 16:39:37 +00:00
);
$user_form -> addSelect ( 'op-type' , $options , '操作类型' , '' );
$user_form -> handle = function () {
global $user_form ;
$username = $_POST [ 'username' ];
switch ( $_POST [ 'op-type' ]) {
2017-11-25 04:00:00 +00:00
case 'banneduser' :
2016-07-18 16:39:37 +00:00
DB :: update ( " update user_info set usergroup = 'B' where username = ' { $username } ' " );
break ;
2017-11-25 04:00:00 +00:00
case 'normaluser' :
2016-07-18 16:39:37 +00:00
DB :: update ( " update user_info set usergroup = 'U' where username = ' { $username } ' " );
break ;
2017-11-25 04:00:00 +00:00
case 'superuser' :
DB :: update ( " update user_info set usergroup = 'S' where username = ' { $username } ' " );
2016-07-18 16:39:37 +00:00
break ;
}
};
$user_form -> runAtServer ();
$blog_link_contests = new UOJForm ( 'blog_link_contests' );
$blog_link_contests -> addInput ( 'blog_id' , 'text' , '博客ID' , '' ,
function ( $x ) {
2020-06-25 12:41:16 +00:00
if ( ! validateUInt ( $x )) {
return 'ID不合法' ;
}
if ( ! queryBlog ( $x )) {
return '博客不存在' ;
}
2016-07-18 16:39:37 +00:00
return '' ;
},
null
);
$blog_link_contests -> addInput ( 'contest_id' , 'text' , '比赛ID' , '' ,
function ( $x ) {
2020-06-25 12:41:16 +00:00
if ( ! validateUInt ( $x )) {
return 'ID不合法' ;
}
if ( ! queryContest ( $x )) {
return '比赛不存在' ;
}
2016-07-18 16:39:37 +00:00
return '' ;
},
null
);
$blog_link_contests -> addInput ( 'title' , 'text' , '标题' , '' ,
function ( $x ) {
return '' ;
},
null
);
$options = array (
'add' => '添加' ,
'del' => '删除'
);
$blog_link_contests -> addSelect ( 'op-type' , $options , '操作类型' , '' );
$blog_link_contests -> handle = function () {
$blog_id = $_POST [ 'blog_id' ];
$contest_id = $_POST [ 'contest_id' ];
2017-11-25 15:29:18 +00:00
$str = DB :: selectFirst (( " select * from contests where id=' ${ contest_id } ' " ));
2016-07-18 16:39:37 +00:00
$all_config = json_decode ( $str [ 'extra_config' ], true );
$config = $all_config [ 'links' ];
$n = count ( $config );
if ( $_POST [ 'op-type' ] == 'add' ) {
$row = array ();
$row [ 0 ] = $_POST [ 'title' ];
$row [ 1 ] = $blog_id ;
$config [ $n ] = $row ;
}
if ( $_POST [ 'op-type' ] == 'del' ) {
2020-06-25 12:41:16 +00:00
for ( $i = 0 ; $i < $n ; $i ++ ) {
2016-07-18 16:39:37 +00:00
if ( $config [ $i ][ 1 ] == $blog_id ) {
$config [ $i ] = $config [ $n - 1 ];
unset ( $config [ $n - 1 ]);
break ;
}
2020-06-25 12:41:16 +00:00
}
2016-07-18 16:39:37 +00:00
}
$all_config [ 'links' ] = $config ;
$str = json_encode ( $all_config );
2017-11-25 15:29:18 +00:00
$str = DB :: escape ( $str );
DB :: query ( " update contests set extra_config=' ${ str } ' where id=' ${ contest_id } ' " );
2016-07-18 16:39:37 +00:00
};
$blog_link_contests -> runAtServer ();
$blog_link_index = new UOJForm ( 'blog_link_index' );
$blog_link_index -> addInput ( 'blog_id2' , 'text' , '博客ID' , '' ,
function ( $x ) {
2020-06-25 12:41:16 +00:00
if ( ! validateUInt ( $x )) {
return 'ID不合法' ;
}
if ( ! queryBlog ( $x )) {
return '博客不存在' ;
}
2016-07-18 16:39:37 +00:00
return '' ;
},
null
);
$blog_link_index -> addInput ( 'blog_level' , 'text' , '置顶级别(删除不用填)' , '0' ,
function ( $x ) {
2020-06-25 12:41:16 +00:00
if ( ! validateUInt ( $x )) {
return '数字不合法' ;
}
if ( $x > 3 ) {
return '该级别不存在' ;
}
2016-07-18 16:39:37 +00:00
return '' ;
},
null
);
$options = array (
'add' => '添加' ,
'del' => '删除'
);
$blog_link_index -> addSelect ( 'op-type2' , $options , '操作类型' , '' );
$blog_link_index -> handle = function () {
$blog_id = $_POST [ 'blog_id2' ];
$blog_level = $_POST [ 'blog_level' ];
if ( $_POST [ 'op-type2' ] == 'add' ) {
if ( DB :: selectFirst ( " select * from important_blogs where blog_id = { $blog_id } " )) {
DB :: update ( " update important_blogs set level = { $blog_level } where blog_id = { $blog_id } " );
} else {
DB :: insert ( " insert into important_blogs (blog_id, level) values ( { $blog_id } , { $blog_level } ) " );
}
}
if ( $_POST [ 'op-type2' ] == 'del' ) {
DB :: delete ( " delete from important_blogs where blog_id = { $blog_id } " );
}
};
$blog_link_index -> runAtServer ();
$blog_deleter = new UOJForm ( 'blog_deleter' );
$blog_deleter -> addInput ( 'blog_del_id' , 'text' , '博客ID' , '' ,
function ( $x ) {
if ( ! validateUInt ( $x )) {
return 'ID不合法' ;
}
if ( ! queryBlog ( $x )) {
return '博客不存在' ;
}
return '' ;
},
null
);
$blog_deleter -> handle = function () {
deleteBlog ( $_POST [ 'blog_del_id' ]);
};
$blog_deleter -> runAtServer ();
$contest_submissions_deleter = new UOJForm ( 'contest_submissions' );
$contest_submissions_deleter -> addInput ( 'contest_id' , 'text' , '比赛ID' , '' ,
function ( $x ) {
if ( ! validateUInt ( $x )) {
return 'ID不合法' ;
}
if ( ! queryContest ( $x )) {
return '博客不存在' ;
}
return '' ;
},
null
);
$contest_submissions_deleter -> handle = function () {
$contest = queryContest ( $_POST [ 'contest_id' ]);
genMoreContestInfo ( $contest );
$contest_problems = DB :: selectAll ( " select problem_id from contests_problems where contest_id = { $contest [ 'id' ] } " );
foreach ( $contest_problems as $problem ) {
$submissions = DB :: selectAll ( " select * from submissions where problem_id = { $problem [ 'problem_id' ] } and submit_time < ' { $contest [ 'start_time_str' ] } ' " );
foreach ( $submissions as $submission ) {
$content = json_decode ( $submission [ 'content' ], true );
unlink ( UOJContext :: storagePath () . $content [ 'file_name' ]);
DB :: delete ( " delete from submissions where id = { $submission [ 'id' ] } " );
updateBestACSubmissions ( $submission [ 'submitter' ], $submission [ 'problem_id' ]);
}
}
};
$contest_submissions_deleter -> runAtServer ();
$custom_test_deleter = new UOJForm ( 'custom_test_deleter' );
$custom_test_deleter -> addInput ( 'last' , 'text' , '删除末尾记录' , '5' ,
function ( $x , & $vdata ) {
if ( ! validateUInt ( $x )) {
return '不合法' ;
}
$vdata [ 'last' ] = $x ;
return '' ;
},
null
);
$custom_test_deleter -> handle = function ( & $vdata ) {
$all = DB :: selectAll ( " select * from custom_test_submissions order by id asc limit { $vdata [ 'last' ] } " );
foreach ( $all as $submission ) {
$content = json_decode ( $submission [ 'content' ], true );
unlink ( UOJContext :: storagePath () . $content [ 'file_name' ]);
}
DB :: delete ( " delete from custom_test_submissions order by id asc limit { $vdata [ 'last' ] } " );
};
$custom_test_deleter -> runAtServer ();
2019-09-12 10:12:01 +00:00
$judger_adder = new UOJForm ( 'judger_adder' );
$judger_adder -> addInput ( 'judger_adder_name' , 'text' , '评测机名称' , '' ,
function ( $x , & $vdata ) {
if ( ! validateUsername ( $x )) {
return '不合法' ;
}
2020-06-25 12:41:16 +00:00
if ( DB :: selectCount ( " select count(*) from judger_info where judger_name=' $x ' " ) != 0 ) {
2019-09-12 10:12:01 +00:00
return '不合法' ;
}
$vdata [ 'name' ] = $x ;
return '' ;
},
null
);
$judger_adder -> handle = function ( & $vdata ) {
$password = uojRandString ( 32 );
DB :: insert ( " insert into judger_info (judger_name,password) values(' { $vdata [ 'name' ] } ',' { $password } ') " );
};
$judger_adder -> runAtServer ();
$judger_deleter = new UOJForm ( 'judger_deleter' );
$judger_deleter -> addInput ( 'judger_deleter_name' , 'text' , '评测机名称' , '' ,
function ( $x , & $vdata ) {
if ( ! validateUsername ( $x )) {
return '不合法' ;
}
2020-06-25 12:41:16 +00:00
if ( DB :: selectCount ( " select count(*) from judger_info where judger_name=' $x ' " ) != 1 ) {
2019-09-12 10:12:01 +00:00
return '不合法' ;
}
$vdata [ 'name' ] = $x ;
return '' ;
},
null
);
$judger_deleter -> handle = function ( & $vdata ) {
DB :: delete ( " delete from judger_info where judger_name=' { $vdata [ 'name' ] } ' " );
};
$judger_deleter -> runAtServer ();
$judgerlist_cols = array ( 'judger_name' , 'password' );
$judgerlist_config = array ();
$judgerlist_header_row = <<< EOD
< tr >
< th > 评测机名称 </ th >
< th > 密码 </ th >
</ tr >
EOD ;
$judgerlist_print_row = function ( $row ) {
echo <<< EOD
< tr >
< td > { $row [ 'judger_name' ]} </ td >
< td > { $row [ 'password' ]} </ td >
</ tr >
EOD ;
};
2016-07-18 16:39:37 +00:00
$banlist_cols = array ( 'username' , 'usergroup' );
$banlist_config = array ();
$banlist_header_row = <<< EOD
< tr >
< th > 用户名 </ th >
</ tr >
EOD ;
$banlist_print_row = function ( $row ) {
$hislink = getUserLink ( $row [ 'username' ]);
echo <<< EOD
< tr >
< td > $ { hislink } </ td >
</ tr >
EOD ;
};
$cur_tab = isset ( $_GET [ 'tab' ]) ? $_GET [ 'tab' ] : 'users' ;
$tabs_info = array (
'users' => array (
'name' => '用户操作' ,
'url' => " /super-manage/users "
),
'blogs' => array (
'name' => '博客管理' ,
'url' => " /super-manage/blogs "
),
'submissions' => array (
'name' => '提交记录' ,
'url' => " /super-manage/submissions "
),
'custom-test' => array (
'name' => '自定义测试' ,
'url' => '/super-manage/custom-test'
),
'click-zan' => array (
'name' => '点赞管理' ,
'url' => '/super-manage/click-zan'
),
'search' => array (
'name' => '搜索管理' ,
'url' => '/super-manage/search'
2019-09-12 10:12:01 +00:00
),
'judger' => array (
'name' => '评测机管理' ,
'url' => '/super-manage/judger'
2016-07-18 16:39:37 +00:00
)
);
if ( ! isset ( $tabs_info [ $cur_tab ])) {
become404Page ();
}
?>
< ? php
requireLib ( 'shjs' );
requireLib ( 'morris' );
?>
< ? php echoUOJPageHeader ( '系统管理' ) ?>
< div class = " row " >
< div class = " col-sm-3 " >
2019-09-10 02:15:20 +00:00
< ? = HTML :: tablist ( $tabs_info , $cur_tab , 'nav-pills flex-column' ) ?>
2016-07-18 16:39:37 +00:00
</ div >
< div class = " col-sm-9 " >
< ? php if ( $cur_tab === 'users' ) : ?>
< ? php $user_form -> printHTML (); ?>
< h3 > 封禁名单 </ h3 >
< ? php echoLongTable ( $banlist_cols , 'user_info' , " usergroup='B' " , '' , $banlist_header_row , $banlist_print_row , $banlist_config ) ?>
< ? php elseif ( $cur_tab === 'blogs' ) : ?>
< div >
< h4 > 添加到比赛链接 </ h4 >
< ? php $blog_link_contests -> printHTML (); ?>
</ div >
< div >
< h4 > 添加到公告 </ h4 >
< ? php $blog_link_index -> printHTML (); ?>
</ div >
< div >
< h4 > 删除博客 </ h4 >
< ? php $blog_deleter -> printHTML (); ?>
</ div >
< ? php elseif ( $cur_tab === 'submissions' ) : ?>
< div >
< h4 > 删除赛前提交记录 </ h4 >
< ? php $contest_submissions_deleter -> printHTML (); ?>
</ div >
< div >
< h4 > 测评失败的提交记录 </ h4 >
2018-10-11 12:34:18 +00:00
< ? php echoSubmissionsList ( " result_error = 'Judgement Failed' " , 'order by id desc' , array ( 'result_hidden' => '' ), $myUser ); ?>
2016-07-18 16:39:37 +00:00
</ div >
< ? php elseif ( $cur_tab === 'custom-test' ) : ?>
< ? php $custom_test_deleter -> printHTML () ?>
< ? php
$submissions_pag = new Paginator ( array (
'col_names' => array ( '*' ),
'table_name' => 'custom_test_submissions' ,
'cond' => '1' ,
'tail' => 'order by id asc' ,
'page_len' => 5
));
2020-06-25 12:41:16 +00:00
foreach ( $submissions_pag -> get () as $submission ) {
2016-07-18 16:39:37 +00:00
$problem = queryProblemBrief ( $submission [ 'problem_id' ]);
$submission_result = json_decode ( $submission [ 'result' ], true );
echo '<dl class="dl-horizontal">' ;
echo '<dt>id</dt>' ;
echo '<dd>' , " # { $submission [ 'id' ] } " , '</dd>' ;
echo '<dt>problem_id</dt>' ;
echo '<dd>' , " # { $submission [ 'problem_id' ] } " , '</dd>' ;
echo '<dt>submit time</dt>' ;
echo '<dd>' , $submission [ 'submit_time' ], '</dd>' ;
echo '<dt>submitter</dt>' ;
echo '<dd>' , $submission [ 'submitter' ], '</dd>' ;
echo '<dt>judge_time</dt>' ;
echo '<dd>' , $submission [ 'judge_time' ], '</dd>' ;
echo '</dl>' ;
echoSubmissionContent ( $submission , getProblemCustomTestRequirement ( $problem ));
echoCustomTestSubmissionDetails ( $submission_result [ 'details' ], " submission- { $submission [ 'id' ] } -details " );
}
?>
< ? = $submissions_pag -> pagination () ?>
< ? php elseif ( $cur_tab === 'click-zan' ) : ?>
没写好QAQ
< ? php elseif ( $cur_tab === 'search' ) : ?>
< h2 class = " text-center " > 一周搜索情况 </ h2 >
< div id = " search-distribution-chart-week " style = " height: 250px; " ></ div >
< script type = " text/javascript " >
new Morris . Line ({
element : 'search-distribution-chart-week' ,
data : < ? = json_encode ( DB :: selectAll ( " select DATE_FORMAT(created_at, '%Y-%m-%d %h:00'), count(*) from search_requests where created_at > now() - interval 1 week group by DATE_FORMAT(created_at, '%Y-%m-%d %h:00') " )) ?> ,
xkey : " DATE_FORMAT(created_at, '%Y-%m-%d %h:00') " ,
ykeys : [ " count(*) " ],
labels : [ 'number' ],
resize : true
});
</ script >
< h2 class = " text-center " > 一月搜索情况 </ h2 >
< div id = " search-distribution-chart-month " style = " height: 250px; " ></ div >
< script type = " text/javascript " >
new Morris . Line ({
element : 'search-distribution-chart-month' ,
data : < ? = json_encode ( DB :: selectAll ( " select DATE_FORMAT(created_at, '%Y-%m-%d'), count(*) from search_requests where created_at > now() - interval 1 week group by DATE_FORMAT(created_at, '%Y-%m-%d') " )) ?> ,
xkey : " DATE_FORMAT(created_at, '%Y-%m-%d') " ,
ykeys : [ " count(*) " ],
labels : [ 'number' ],
resize : true
});
</ script >
< ? php echoLongTable ( array ( '*' ), 'search_requests' , " 1 " , 'order by id desc' ,
'<tr><th>id</th><th>created_at</th><th>remote_addr</th><th>type</th><th>q</th><tr>' ,
function ( $row ) {
echo '<tr>' ;
echo '<td>' , $row [ 'id' ], '</td>' ;
echo '<td>' , $row [ 'created_at' ], '</td>' ;
echo '<td>' , $row [ 'remote_addr' ], '</td>' ;
echo '<td>' , $row [ 'type' ], '</td>' ;
echo '<td>' , HTML :: escape ( $row [ 'q' ]), '</td>' ;
echo '</tr>' ;
}, array (
'page_len' => 1000
))
?>
2019-09-12 10:12:01 +00:00
< ? php elseif ( $cur_tab === 'judger' ) : ?>
< div >
< h4 > 添加评测机 </ h4 >
< ? php $judger_adder -> printHTML (); ?>
</ div >
< div >
< h4 > 删除评测机 </ h4 >
< ? php $judger_deleter -> printHTML (); ?>
</ div >
< h3 > 评测机列表 </ h3 >
< ? php echoLongTable ( $judgerlist_cols , 'judger_info' , " 1=1 " , '' , $judgerlist_header_row , $judgerlist_print_row , $judgerlist_config ) ?>
2016-07-18 16:39:37 +00:00
< ? php endif ?>
</ div >
</ div >
< ? php echoUOJPageFooter () ?>