mirror of
https://github.com/renbaoshuo/S2OJ.git
synced 2024-12-27 18:31:54 +00:00
206 lines
5.0 KiB
PHP
206 lines
5.0 KiB
PHP
<?php
|
|
|
|
class UOJRanklist {
|
|
public static function printHTML($cfg = []) {
|
|
$cfg += [
|
|
'top10' => false,
|
|
'card' => false,
|
|
'flush' => false,
|
|
'group_id' => null,
|
|
'page_len' => 50,
|
|
];
|
|
|
|
$cfg['flush'] |= $cfg['card'];
|
|
|
|
$conds = [];
|
|
|
|
if ($cfg['group_id']) {
|
|
$conds[] = [
|
|
"username", "in", DB::rawtuple(UOJGroup::query($cfg['group_id'])->getUsernames()),
|
|
];
|
|
}
|
|
|
|
if (empty($conds)) {
|
|
$conds = '1';
|
|
}
|
|
|
|
$last_user = null;
|
|
$parsedown = HTML::parsedown(['username_with_color' => true]);
|
|
$purifier = HTML::purifier_inline();
|
|
$print_row = function ($user, $now_cnt) use (&$last_user, &$conds, &$parsedown, &$purifier) {
|
|
if ($last_user === null) {
|
|
$rank = DB::selectCount([
|
|
"select count(*) from user_info",
|
|
"where", [
|
|
["ac_num", ">", $user['ac_num']],
|
|
DB::conds($conds)
|
|
]
|
|
]);
|
|
$rank++;
|
|
} elseif ($user['ac_num'] == $last_user['ac_num']) {
|
|
$rank = $last_user['rank'];
|
|
} else {
|
|
$rank = $now_cnt;
|
|
}
|
|
|
|
$user['rank'] = $rank;
|
|
|
|
$userpro = HTML::url('/user/' . $user['username']);
|
|
$userlink = UOJUser::getLink($user['username']);
|
|
$asrc = HTML::avatar_addr($user, 100);
|
|
$esc_motto = $purifier->purify($parsedown->line($user['motto']));
|
|
$solved_text = UOJLocale::get('solved');
|
|
echo <<<EOD
|
|
<div class="list-group-item">
|
|
<div class="d-flex">
|
|
<div class="flex-shrink-0">
|
|
<a href="{$userpro}"><img class="rounded uoj-user-avatar" src="{$asrc}" width="50" height="50" /></a>
|
|
</div>
|
|
<div class="flex-grow-1 ms-3">
|
|
<div class="row">
|
|
<h5 class="col-sm-8">#{$user['rank']}: {$userlink}</h5>
|
|
<div class="col-sm-4 text-end"><strong>$solved_text: {$user['ac_num']}</strong></div>
|
|
</div>
|
|
<div>{$esc_motto}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
EOD;
|
|
|
|
$last_user = $user;
|
|
};
|
|
|
|
$pag_config = [
|
|
'get_row_index' => '',
|
|
'table_name' => 'user_info',
|
|
'col_names' => ['username', 'ac_num', 'email', 'qq', 'motto', 'extra'],
|
|
'cond' => $conds,
|
|
'tail' => 'order by ac_num desc, username asc'
|
|
];
|
|
|
|
if ($cfg['top10']) {
|
|
$pag_config['tail'] .= ' limit 10';
|
|
$pag_config['echo_full'] = '';
|
|
} else {
|
|
$pag_config['page_len'] = $cfg['page_len'];
|
|
}
|
|
|
|
$pag = new Paginator($pag_config);
|
|
|
|
if ($cfg['card']) {
|
|
echo '<div class="card my-3">';
|
|
}
|
|
|
|
if ($cfg['flush']) {
|
|
echo '<div class="list-group list-group-flush">';
|
|
} else {
|
|
echo '<div class="list-group">';
|
|
}
|
|
foreach ($pag->get() as $idx => $row) {
|
|
$print_row($row, $idx);
|
|
}
|
|
if ($pag->isEmpty()) {
|
|
echo <<<EOD
|
|
<div class="list-group-item">
|
|
无
|
|
</div>
|
|
EOD;
|
|
}
|
|
echo '</div>';
|
|
if ($cfg['card']) {
|
|
echo '</div>';
|
|
}
|
|
|
|
if ($pag->n_pages > 1) {
|
|
if ($cfg['flush']) {
|
|
echo '<div class="list-group-item">';
|
|
}
|
|
|
|
echo $pag->pagination();
|
|
|
|
if ($cfg['flush']) {
|
|
echo '</div>';
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Old style of ranklist
|
|
*/
|
|
public static function printTableHTML($cfg = []) {
|
|
$cfg += [
|
|
'top10' => false,
|
|
'group_id' => null,
|
|
'page_len' => 100,
|
|
];
|
|
|
|
$conds = [];
|
|
|
|
if ($cfg['group_id']) {
|
|
$conds[] = [
|
|
"username", "in", DB::rawtuple(UOJGroup::query($cfg['group_id'])->getUsernames()),
|
|
];
|
|
}
|
|
|
|
if (empty($conds)) {
|
|
$conds = '1';
|
|
}
|
|
|
|
$header_row = '';
|
|
$header_row .= '<tr>';
|
|
$header_row .= '<th style="width: 5em;">#</th>';
|
|
$header_row .= '<th style="width: 14em;">' . UOJLocale::get('username') . '</th>';
|
|
$header_row .= '<th style="width: 50em;">' . UOJLocale::get('motto') . '</th>';
|
|
$header_row .= '<th style="width: 5em;">' . UOJLocale::get('solved') . '</th>';
|
|
$header_row .= '</tr>';
|
|
|
|
$last_user = null;
|
|
$parsedown = HTML::parsedown(['username_with_color' => true]);
|
|
$purifier = HTML::purifier_inline();
|
|
$print_row = function ($user, $now_cnt) use (&$last_user, &$conds, &$parsedown, &$purifier) {
|
|
if ($last_user === null) {
|
|
$rank = DB::selectCount([
|
|
"select count(*) from user_info",
|
|
"where", [
|
|
["ac_num", ">", $user['ac_num']],
|
|
DB::conds($conds)
|
|
]
|
|
]);
|
|
$rank++;
|
|
} elseif ($user['ac_num'] == $last_user['ac_num']) {
|
|
$rank = $last_user['rank'];
|
|
} else {
|
|
$rank = $now_cnt;
|
|
}
|
|
|
|
$user['rank'] = $rank;
|
|
|
|
echo '<tr>';
|
|
echo '<td>' . $user['rank'] . '</td>';
|
|
echo '<td>' . UOJUser::getLink($user['username']) . '</td>';
|
|
echo '<td>' . $purifier->purify($parsedown->line($user['motto'])) . '</td>';
|
|
echo '<td>' . $user['ac_num'] . '</td>';
|
|
echo '</tr>';
|
|
|
|
$last_user = $user;
|
|
};
|
|
|
|
$col_names = ['username', 'ac_num', 'motto'];
|
|
|
|
$tail = 'order by ac_num desc, username asc';
|
|
|
|
$table_config = [
|
|
'get_row_index' => ''
|
|
];
|
|
|
|
if ($cfg['top10']) {
|
|
$tail .= ' limit 10';
|
|
$table_config['echo_full'] = '';
|
|
} else {
|
|
$table_config['page_len'] = $cfg['page_len'];
|
|
}
|
|
|
|
echoLongTable($col_names, 'user_info', $conds, $tail, $header_row, $print_row, $table_config);
|
|
}
|
|
}
|