| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- <?php
- $username = $_GET['username'];
-
- requireLib('flot');
- $REQUIRE_LIB['mathjax'] = '';
- $REQUIRE_LIB['hljs'] = '';
- ?>
- <?php if (validateUsername($username) && ($user = queryUser($username))): ?>
- <?php echoUOJPageHeader($user['username'] . ' - ' . UOJLocale::get('user profile')) ?>
- <?php
- $esc_email = HTML::escape($user['email']);
- $esc_qq = HTML::escape($user['qq'] != 0 ? $user['qq'] : 'Unfilled');
- $esc_sex = HTML::escape($user['sex']);
- $col_sex="color:blue";
- if ($esc_sex == "M") {
- $esc_sex="♂";
- $col_sex="color:blue";
- } elseif ($esc_sex == "F") {
- $esc_sex="♀";
- $col_sex="color:red";
- } else {
- $esc_sex="";
- $col_sex="color:black";
- }
- $esc_motto = HTML::escape($user['motto']);
- $extgroups = $user['extgroups'];
- ?>
- <div class="card border-info">
- <h5 class="card-header bg-info"><?= UOJLocale::get('user profile') ?></h5>
- <div class="card-body">
- <div class="row mb-4">
- <div class="col-md-4 order-md-9">
- <img class="media-object img-thumbnail d-block mx-auto" alt="<?= $user['username'] ?> Avatar" height="250" width="250" src="<?= HTML::avatar_addr($user, 256) ?>" />
- </div>
- <div class="col-md-8 order-md-1">
- <h2><span class="uoj-honor" data-rating="<?= $user['rating'] ?>" data-certs="<?= $user['certs'] ?>"><?= $user['username'] ?></span> <span><strong style="<?= $col_sex ?>"><?= $esc_sex ?></strong></span></h2>
- <div class="list-group">
- <div class="list-group-item">
- <h4 class="list-group-item-heading"><?= UOJLocale::get('rating') ?></h4>
- <p class="list-group-item-text"><strong style="color:red"><?= $user['rating'] ?></strong></p>
- </div>
- <div class="list-group-item">
- <h4 class="list-group-item-heading"><?= UOJLocale::get('email') ?></h4>
- <p class="list-group-item-text"><?= $esc_email ?></p>
- </div>
- <div class="list-group-item">
- <h4 class="list-group-item-heading"><?= UOJLocale::get('QQ') ?></h4>
- <p class="list-group-item-text"><?= $esc_qq ?></p>
- </div>
- <div class="list-group-item">
- <h4 class="list-group-item-heading"><?= UOJLocale::get('motto') ?></h4>
- <p class="list-group-item-text"><?= $esc_motto ?></p>
- </div>
- <div class="list-group-item">
- <h4 class="list-group-item-heading">用户组信息</h4>
- <p class="list-group-item-text"><?= $extgroups ?></p>
- </div>
-
- <?php if (isSuperUser($myUser)): ?>
- <div class="list-group-item">
- <h4 class="list-group-item-heading">register time</h4>
- <p class="list-group-item-text"><?= $user['register_time'] ?></p>
- </div>
- <div class="list-group-item">
- <h4 class="list-group-item-heading">remote_addr</h4>
- <p class="list-group-item-text"><?= $user['remote_addr'] ?></p>
- </div>
- <div class="list-group-item">
- <h4 class="list-group-item-heading">http_x_forwarded_for</h4>
- <p class="list-group-item-text"><?= $user['http_x_forwarded_for'] ?></p>
- </div>
- <?php endif ?>
- </div>
- </div>
- </div>
- <?php if (Auth::check()): ?>
- <?php if (Auth::id() != $user['username']): ?>
- <a type="button" class="btn btn-info btn-sm" href="/user/msg?enter=<?= $user['username'] ?>"><span class="glyphicon glyphicon-envelope"></span> <?= UOJLocale::get('send private message') ?></a>
- <?php else: ?>
- <a type="button" class="btn btn-info btn-sm" href="/user/modify-profile"><span class="glyphicon glyphicon-pencil"></span> <?= UOJLocale::get('modify my profile') ?></a>
- <?php endif ?>
- <?php endif ?>
-
- <a type="button" class="btn btn-success btn-sm" href="<?= HTML::blog_url($user['username'], '/') ?>"><span class="glyphicon glyphicon-arrow-right"></span> <?= UOJLocale::get('visit his blog', $username) ?></a>
-
- <div class="top-buffer-lg"></div>
- <div class="list-group">
- <?php
- $blogid = $user['aboutme_blogid'];
- if ($blogid) {
- echo '<div class="list-group-item">';
- echoBlog(queryBlog($blogid), array('show_content_only' => true, 'outside_blog_domain' => true));
- echo '</div>';
- }
- ?>
- <div class="list-group-item">
- <h4 class="list-group-item-heading"><?= UOJLocale::get('rating changes') ?></h4>
- <div class="list-group-item-text" id="rating-plot" style="height:500px;"></div>
- </div>
- <div class="list-group-item">
- <?php
- $ac_problems = DB::selectAll("select problem_id from best_ac_submissions where submitter = '{$user['username']}'");
- ?>
- <h4 class="list-group-item-heading"><?= UOJLocale::get('accepted problems').':'.UOJLocale::get('n problems in total', count($ac_problems))?> </h4>
- <p class="list-group-item-text">
- <?php
- foreach ($ac_problems as $problem) {
- echo '<a href="/problem/', $problem['problem_id'], '" style="display:inline-block; width:4em;">', $problem['problem_id'], '</a>';
- }
- if (empty($ac_problems)) {
- echo UOJLocale::get('none');
- }
- ?>
- </p>
- </div>
- </div>
- </div>
- </div>
- <script type="text/javascript">
- var rating_data = [[
- <?php
- $user_rating_min = $user_rating_max = 1500;
- $result = DB::query("select contest_id, `rank`, user_rating from contests_registrants where username = '{$user['username']}' and has_participated = 1 order by contest_id");
- $is_first_row = true;
- $last_rating = 1500;
- while ($row = DB::fetch($result)) {
- $contest = queryContest($row['contest_id']);
- $rating_delta = $row['user_rating'] - $last_rating;
- if (!$is_first_row) {
- echo "[$last_contest_time, {$row['user_rating']}, $last_contest_id, $last_contest_name, $last_rank, $rating_delta],";
- } else {
- $is_first_row = false;
- }
- $contest_start_time = new DateTime($contest['start_time']);
- $last_contest_time = ($contest_start_time->getTimestamp() + $contest_start_time->getOffset()) * 1000;
- $last_contest_name = json_encode($contest['name']);
- $last_contest_id = $contest['id'];
- $last_rank = $row['rank'];
- $last_rating = $row['user_rating'];
-
- if ($row['user_rating'] < $user_rating_min) {
- $user_rating_min = $row['user_rating'];
- }
- if ($row['user_rating'] > $user_rating_max) {
- $user_rating_max = $row['user_rating'];
- }
- }
- if ($is_first_row) {
- $time_now_stamp = (UOJTime::$time_now->getTimestamp() + UOJTime::$time_now->getOffset()) * 1000;
- echo "[{$time_now_stamp}, {$user['rating']}, 0]";
- } else {
- $rating_delta = $user['rating'] - $last_rating;
- echo "[$last_contest_time, {$user['rating']}, $last_contest_id, $last_contest_name, $last_rank, $rating_delta]";
- }
- if ($user['rating'] < $user_rating_min) {
- $user_rating_min = $user['rating'];
- }
- if ($user['rating'] > $user_rating_max) {
- $user_rating_max = $user['rating'];
- }
-
- $user_rating_min -= 400;
- $user_rating_max += 400;
- ?>
- ]];
- var rating_plot = $.plot($("#rating-plot"), [{
- color: "#3850eb",
- label: "<?= $user['username'] ?>",
- data: rating_data[0]
- }], {
- series: {
- lines: {
- show: true
- },
- points: {
- show: true
- }
- },
- xaxis: {
- mode: "time"
- },
- yaxis: {
- min: <?= $user_rating_min ?>,
- max: <?= $user_rating_max ?>
- },
- legend: {
- labelFormatter: function(username) {
- return getUserLink(username, <?= $user['rating'] ?>, false);
- }
- },
- grid: {
- clickable: true,
- hoverable: true
- },
- hooks: {
- drawBackground: [
- function(plot, ctx) {
- var plotOffset = plot.getPlotOffset();
- for (var y = 0; y < plot.height(); y++) {
- var rating = <?= $user_rating_max ?> - <?= $user_rating_max - $user_rating_min ?> * y / plot.height();
- ctx.fillStyle = getColOfRating(rating);
- ctx.fillRect(plotOffset.left, plotOffset.top + y, plot.width(), Math.min(5, plot.height() - y));
- }
- }
- ]
- }
- });
- function showTooltip(x, y, contents) {
- $('<div id="rating-tooltip">' + contents + '</div>').css({
- position: 'absolute',
- display: 'none',
- top: y - 20,
- left: x + 10,
- border: '1px solid #fdd',
- padding: '2px',
- 'font-size' : '11px',
- 'background-color': '#fee',
- opacity: 0.80
- }).appendTo("body").fadeIn(200);
- }
- var prev = -1;
- function onHoverRating(event, pos, item) {
- if (prev != item.dataIndex) {
- $("#rating-tooltip").remove();
- var params = rating_data[item.seriesIndex][item.dataIndex];
- var total = params[1];
- var contestId = params[2];
- if (contestId != 0) {
- var change = params[5] > 0 ? "+" + params[5] : params[5];
- var contestName = params[3];
- var rank = params[4];
- var html = "= " + total + " (" + change + "), <br/>"
- + "Rank: " + rank + "<br/>"
- + '<a href="' + '/contest/' + contestId + '">' + contestName + '</a>';
- } else {
- var html = "= " + total + "<br/>"
- + "Unrated";
- }
- showTooltip(item.pageX, item.pageY, html);
- prev = item.dataIndex;
- }
- }
- $("#rating-plot").bind("plothover", function (event, pos, item) {
- if (item) {
- onHoverRating(event, pos, item);
- }
- });
- $("#rating-plot").bind("plotclick", function (event, pos, item) {
- if (item && prev == -1) {
- onHoverRating(event, pos, item);
- } else {
- $("#rating-tooltip").fadeOut(200);
- prev = -1;
- }
- });
- </script>
- <?php else: ?>
- <?php echoUOJPageHeader('不存在该用户' . ' - 用户信息') ?>
- <div class="card border-danger">
- <div class="card-header bg-danger">用户信息</div>
- <div class="card-body">
- <h4>不存在该用户</h4>
- </div>
- </div>
- <?php endif ?>
- <?php echoUOJPageFooter() ?>
|