<?php if (!Auth::check()) { redirectToLogin(); } requirePHPLib('form'); requireLib('bootstrap5'); $group_id = $_GET['id']; if (!validateUInt($group_id)) { become404Page(); } $list_id = $_GET['list_id']; if (!validateUInt($list_id)) { become404Page(); } $assignment = queryAssignmentByGroupListID($group_id, $list_id); if (!$assignment) { become404Page(); } $group = queryGroup($assignment['group_id']); $list = queryProblemList($assignment['list_id']); if (($group['is_hidden'] || $list['is_hidden']) && !isSuperUser($myUser)) { become403Page(); } ?> <?php echoUOJPageHeader(UOJLocale::get('assignments')) ?> <div class="row"> <!-- left col --> <div class="col-lg-9"> <h1> <small class="fs-4">作业:</small><?= $list['title'] ?> </h1> <ul class="mt-3"> <li>对应题单:<a class="text-decoration-none" href="<?= HTML::url('/list/'.$list['id']) ?>">#<?= $list['id'] ?></a></li> <li>所属小组:<a class="text-decoration-none" href="<?= HTML::url('/group/'.$group['id']) ?>"><?= $group['title'] ?></a></li> <li>结束时间:<?= $assignment['end_time'] ?></li> </ul> <?php $problems = DB::selectAll("select problem_id from lists_problems where list_id = {$list['id']}"); $users = queryGroupUsers($group['id']); $problem_ids = []; $usernames = []; $n_users = count($users); $n_problems = count($problems); $submission_end_time = min(new DateTime(), DateTime::createFromFormat('Y-m-d H:i:s', $assignment['end_time'])); foreach ($problems as $problem) { $problem_ids[] = $problem['problem_id']; } sort($problem_ids); foreach ($users as $user) { $usernames[] = $user['username']; } // standings: rank => [total_score, user => [username, realname], scores[]] $standings = []; foreach ($usernames as $username) { $user = queryUser($username); $row = ['total_score' => 0]; $scores = []; $row['user'] = [ 'username' => $user['username'], 'realname' => $user['realname'], ]; $cond = "submitter = '{$user['username']}' AND unix_timestamp(submit_time) <= " . $submission_end_time->getTimestamp(); foreach ($problem_ids as $problem_id) { $submission = DB::selectFirst("SELECT id, score FROM submissions WHERE problem_id = $problem_id AND $cond ORDER BY score DESC, id DESC"); if ($submission) { $row['scores'][] = [ 'submission_id' => $submission['id'], 'score' => intval($submission['score']), ]; $row['total_score'] += $submission['score']; } else { $row['scores'][] = null; } } $standings[] = $row; } usort($standings, function($lhs, $rhs) { if ($lhs['total_score'] != $rhs['total_score']) { return $rhs['total_score'] - $lhs['total_score']; } return strcmp($lhs['user']['username'], $rhs['user']['username']); }); ?> <div id="standings"></div> <script> var n_problems = <?= $n_problems ?>; var max_total_score = <?= $n_problems * 100 ?>; var standings = <?= json_encode($standings) ?>; $('#standings').long_table( standings, 1, '<tr>' + '<th style="width:10em"><?= UOJLocale::get('username') ?></th>' + '<th style="width:2em"><?= UOJLocale::get('contests::total score') ?></th>' + <?php foreach ($problem_ids as $problem_id): ?> '<th style="width:2em">' + '<a class="text-decoration-none" href="<?= HTML::url('/problem/' . $problem_id) ?>">#<?= $problem_id ?></a>' + '</th>' + <?php endforeach ?> '</tr>', function(row) { var col_tr = ''; if (row['total_score'] == max_total_score) { col_tr += '<tr class="table-success">'; } else { col_tr += '<tr>'; } col_tr += '<td>' + getUserLink(row['user']['username'], row['user']['realname']) + '</td>'; col_tr += '<td>' + '<span class="uoj-score" data-max="' + max_total_score + '" style="color:' + getColOfScore(row['total_score'] / n_problems) + '">' + row['total_score'] + '</span>' + '</td>'; for (var i = 0; i < row['scores'].length; i++) { var col = row['scores'][i]; if (col) { if (col['score'] == 100) { col_tr += '<td class="table-success">'; } else { col_tr += '<td>'; } col_tr += '<a class="text-decoration-none uoj-score" href="/submission/' + col['submission_id'] + '" style="color:' + getColOfScore(col['score']) + '">' + col['score'] + '</a>'; col_tr += '</td>'; } else { col_tr += '<td></td>'; } } col_tr += '</tr>'; return col_tr; }, { div_classes: ['card', 'my-3', 'table-responsive', 'text-center'], table_classes: ['table', 'uoj-table', 'table-bordered', 'mb-0'], page_len: 50, print_before_table: function() { var html = ''; html += '<div class="card-header bg-transparent text-muted text-start small">' + '成绩统计截止时间:<?= $submission_end_time->format('Y-m-d H:i:s') ?>' + '</div>'; return html; } } ); </script> </div> <!-- end left col --> <aside class="col-lg-3 mt-3 mt-lg-0"> <!-- right col --> <?php uojIncludeView('sidebar', ['assignments_hidden' => true]); ?> </aside> </div> <?php echoUOJPageFooter() ?>