S2OJ/web/app/controllers/user_info.php
Masco Skray c49b69aa86 style(web): upgrade to Bootstrap 4 view with new artworks
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.
2019-09-10 10:25:07 +08:00

256 lines
8.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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() ?>