mirror of
https://github.com/renbaoshuo/S2OJ.git
synced 2024-12-27 19:51:53 +00:00
c49b69aa86
Let's welcome brand new look made by Bootstrap 4! Not only website but also our logo is being flat now. The new logo uses blue as main color, to be different from original. For us, it also shows the project has up to a new stage. We hope that the project will get better and better. BREAKING CHANGE: The path for users to place their images is renamed. Logos are saved as new names too. Users should move "pictures" to "images". Any modifications should suit the Bootstrap 4's standard.
256 lines
8.6 KiB
PHP
256 lines
8.6 KiB
PHP
<?php
|
||
$username = $_GET['username'];
|
||
|
||
requireLib('flot');
|
||
?>
|
||
<?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";
|
||
}
|
||
else if($esc_sex == "F") {
|
||
$esc_sex="♀";
|
||
$col_sex="color:red";
|
||
} else {
|
||
$esc_sex="";
|
||
$col_sex="color:black";
|
||
}
|
||
$esc_motto = HTML::escape($user['motto']);
|
||
?>
|
||
<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" src="<?= HTML::avatar_addr($user, 256) ?>" />
|
||
</div>
|
||
<div class="col-md-8 order-md-1">
|
||
<h2><span class="uoj-honor" data-rating="<?= $user['rating'] ?>"><?= $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>
|
||
<?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">
|
||
<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 = $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() ?>
|