mirror of
https://github.com/renbaoshuo/S2OJ.git
synced 2024-11-10 09:18:41 +00:00
307 lines
8.9 KiB
PHP
307 lines
8.9 KiB
PHP
<?php
|
|
requirePHPLib('form');
|
|
requirePHPLib('judger');
|
|
|
|
$REQUIRE_LIB['bootstrap5'] = '';
|
|
|
|
if (!Auth::check() && UOJConfig::$data['switch']['force-login']) {
|
|
redirectToLogin();
|
|
}
|
|
|
|
if (!isNormalUser($myUser) && UOJConfig::$data['switch']['force-login']) {
|
|
become403Page();
|
|
}
|
|
|
|
if (!validateUInt($_GET['id']) || !($problem = queryProblemBrief($_GET['id']))) {
|
|
become404Page();
|
|
}
|
|
|
|
if (!isProblemVisibleToUser($problem, $myUser)) {
|
|
become404Page();
|
|
}
|
|
|
|
$problem_extra_config = getProblemExtraConfig($problem);
|
|
$solution_viewable = hasViewSolutionPermission($problem_extra_config['view_solution_type'], $myUser, $problem);
|
|
$solution_submittable = hasViewSolutionPermission($problem_extra_config['submit_solution_type'], $myUser, $problem);
|
|
|
|
if (!$solution_viewable) {
|
|
become403Page();
|
|
}
|
|
|
|
if (!hasProblemPermission($myUser, $problem) && isRegisteredRunningContestProblem($myUser, $problem)) {
|
|
become403Page();
|
|
}
|
|
|
|
function removeSolutionForm($blog_id) {
|
|
$res_form = new UOJForm("remove_solution_{$blog_id}");
|
|
$res_form->addHidden("blog_id", $blog_id, function($blog_id) {
|
|
global $myUser, $problem;
|
|
|
|
if (!validateUInt($blog_id)) {
|
|
return '博客 ID 不是有效的数字';
|
|
}
|
|
|
|
$blog = queryBlog($blog_id);
|
|
if (!$blog) {
|
|
return '博客不存在';
|
|
}
|
|
|
|
if (!hasProblemPermission($myUser, $problem)) {
|
|
if ($blog['poster'] != $myUser['username']) {
|
|
return '您只能删除自己的题解';
|
|
}
|
|
}
|
|
|
|
return '';
|
|
}, null);
|
|
$res_form->handle = function() {
|
|
global $myUser, $problem;
|
|
|
|
$blog_id = $_POST["blog_id"];
|
|
DB::query("delete from problems_solutions where problem_id = {$problem['id']} and blog_id = {$blog_id}");
|
|
$blog = queryBlog($blog_id);
|
|
|
|
if ($blog['poster'] != $myUser['username']) {
|
|
$blog_link = getBlogLink($blog['id']);
|
|
$poster_user_link = getUserLink($blog['poster']);
|
|
$admin_user_link = isSuperUser($myUser) ? '管理员' : getUserLink($myUser['username']);
|
|
$content = <<<EOD
|
|
<p>{$poster_user_link} 您好:</p>
|
|
<p>您为问题 <a href="/problem/{$problem['id']}">#{$problem['id']} ({$problem['title']})</a> 提交的题解 {$blog_link} 已经被 {$admin_user_link} 移除。 </p>
|
|
EOD;
|
|
sendSystemMsg($blog['poster'], '题解移除通知', $content);
|
|
}
|
|
};
|
|
$res_form->submit_button_config['margin_class'] = 'mt-0';
|
|
$res_form->submit_button_config['class_str'] = 'btn btn-link text-decoration-none text-danger p-0';
|
|
$res_form->submit_button_config['text'] = '移除';
|
|
$res_form->submit_button_config['align'] = 'inline';
|
|
|
|
return $res_form;
|
|
}
|
|
|
|
if ($solution_submittable) {
|
|
$add_new_solution_form = new UOJForm('add_new_solution');
|
|
$add_new_solution_form->addVInput('blog_id_2', 'text', '博客 ID', '',
|
|
function ($x) {
|
|
global $myUser, $problem, $solution_submittable;
|
|
|
|
if (!validateUInt($x)) {
|
|
return 'ID 不合法';
|
|
}
|
|
|
|
$blog = queryBlog($x);
|
|
if (!$blog) {
|
|
return '博客不存在';
|
|
}
|
|
|
|
if (!hasProblemPermission($myUser, $problem)) {
|
|
if ($blog['poster'] != $myUser['username']) {
|
|
if ($blog['is_hidden']) {
|
|
return '博客不存在';
|
|
}
|
|
|
|
return '只能提交本人撰写的博客';
|
|
}
|
|
|
|
if ($blog['is_hidden']) {
|
|
return '只能提交公开的博客';
|
|
}
|
|
}
|
|
|
|
if (querySolution($problem['id'], $x)) {
|
|
return '该题解已提交';
|
|
}
|
|
|
|
if (!$solution_submittable) {
|
|
return '您无权提交题解';
|
|
}
|
|
|
|
return '';
|
|
},
|
|
null
|
|
);
|
|
$add_new_solution_form->submit_button_config['text'] = '发布';
|
|
$add_new_solution_form->submit_button_config['align'] = 'center';
|
|
$add_new_solution_form->handle = function() {
|
|
global $problem, $myUser;
|
|
|
|
$blog_id_2 = $_POST['blog_id_2'];
|
|
$problem_id = $problem['id'];
|
|
|
|
DB::insert("insert into problems_solutions (problem_id, blog_id) values ({$problem_id}, {$blog_id_2})");
|
|
};
|
|
$add_new_solution_form->runAtServer();
|
|
}
|
|
|
|
$pag_config = array('page_len' => 5);
|
|
$pag_config['col_names'] = array('blog_id', 'content', 'poster', 'post_time', 'zan', 'is_hidden');
|
|
$pag_config['table_name'] = "problems_solutions inner join blogs on problems_solutions.blog_id = blogs.id";
|
|
$pag_config['cond'] = "problem_id = {$problem['id']}";
|
|
if (!hasProblemPermission($myUser, $problem)) {
|
|
$pag_config['cond'] .= " and (is_hidden = 0 or poster = '{$myUser['username']}')";
|
|
}
|
|
$pag_config['tail'] = "order by zan desc, post_time desc, id asc";
|
|
$pag = new Paginator($pag_config);
|
|
|
|
$rows = [];
|
|
|
|
foreach ($pag->get() as $idx => $row) {
|
|
$rows[$idx] = $row;
|
|
if ($row['poster'] == $myUser['username'] || hasProblemPermission($myUser, $problem)) {
|
|
$removeForm = removeSolutionForm($row['blog_id']);
|
|
$removeForm->runAtServer();
|
|
$rows[$idx]['removeForm'] = $removeForm;
|
|
}
|
|
}
|
|
?>
|
|
<?php
|
|
$REQUIRE_LIB['mathjax'] = '';
|
|
$REQUIRE_LIB['hljs'] = '';
|
|
?>
|
|
|
|
<?php echoUOJPageHeader(UOJLocale::get('problems::solutions') . ' - ' . HTML::stripTags($problem['title'])) ?>
|
|
|
|
<div class="row">
|
|
|
|
<!-- Left col -->
|
|
<div class="col-lg-9">
|
|
|
|
<div class="card card-default mb-2">
|
|
<div class="card-body">
|
|
<h1 class="h2 card-title text-center">
|
|
#<?= $problem['id']?>. <?= $problem['title'] ?>
|
|
</h1>
|
|
</div>
|
|
|
|
<ul class="list-group list-group-flush">
|
|
<?php foreach ($rows as $row): ?>
|
|
<li class="list-group-item">
|
|
<?php $poster = queryUser($row['poster']); ?>
|
|
<div class="mb-3">
|
|
<span class="me-2 d-inline-block">
|
|
<a class="text-decoration-none" href="<?= HTML::url('/user/profile/'.$poster['username']) ?>">
|
|
<img src="<?= HTML::avatar_addr($poster, 64) ?>" width="32" height="32" class="rounded" />
|
|
</a>
|
|
<?= getUserLink($poster['username']) ?>
|
|
</span>
|
|
<span class="text-muted small d-inline-block">
|
|
<?= UOJLocale::get('post time') ?>:
|
|
<time class="text-muted"><?= $row['post_time'] ?></time>
|
|
</span>
|
|
<?php if ($row['is_hidden']): ?>
|
|
<span class="badge text-bg-danger ms-2">隐藏</span>
|
|
<?php endif ?>
|
|
</div>
|
|
|
|
<div class="markdown-body">
|
|
<?= $row['content'] ?>
|
|
</div>
|
|
|
|
<ul class="mt-3 text-end list-inline">
|
|
<?php if (isset($row['removeForm'])): ?>
|
|
<li class="list-inline-item">
|
|
<?php $row['removeForm']->printHTML(); ?>
|
|
</li>
|
|
<?php endif ?>
|
|
<?php if (Auth::check() && (isSuperUser(Auth::user()) || Auth::id() == $row['poster'])): ?>
|
|
<li class="list-inline-item">
|
|
<a class="text-decoration-none" href="<?= HTML::blog_url($row['poster'], '/post/'.$row['blog_id'].'/write') ?>">
|
|
修改
|
|
</a>
|
|
</li>
|
|
<?php endif ?>
|
|
<li class="list-inline-item">
|
|
<a class="text-decoration-none" href="/blogs/<?= $row['blog_id'] ?>">在 Ta 的博客上查看</a>
|
|
<li class="list-inline-item">
|
|
<?= getClickZanBlock('B', $row['blog_id'], $row['zan']) ?>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<?php endforeach ?>
|
|
<?php if ($pag->isEmpty()): ?>
|
|
<div class="text-center py-2">
|
|
暂无题解
|
|
</div>
|
|
<?php endif ?>
|
|
</ul>
|
|
</div>
|
|
|
|
<!-- Pagination -->
|
|
<div class="text-center">
|
|
<?= $pag->pagination(); ?>
|
|
</div>
|
|
|
|
<!-- End left col -->
|
|
</div>
|
|
|
|
<!-- Right col -->
|
|
<aside class="col mt-3 mt-lg-0">
|
|
|
|
<div class="card card-default mb-2">
|
|
<ul class="nav nav-pills nav-fill flex-column" role="tablist">
|
|
<li class="nav-item text-start">
|
|
<a href="/problem/<?= $problem['id'] ?>" class="nav-link" role="tab">
|
|
<i class="bi bi-journal-text"></i>
|
|
<?= UOJLocale::get('problems::statement') ?>
|
|
</a>
|
|
</li>
|
|
<li class="nav-item text-start">
|
|
<a href="#" class="nav-link active" role="tab">
|
|
<i class="bi bi-journal-bookmark"></i>
|
|
<?= UOJLocale::get('problems::solutions') ?>
|
|
</a>
|
|
</li>
|
|
<li class="nav-item text-start">
|
|
<a class="nav-link" href="/problem/<?= $problem['id'] ?>/statistics">
|
|
<i class="bi bi-graph-up"></i>
|
|
<?= UOJLocale::get('problems::statistics') ?>
|
|
</a>
|
|
</li>
|
|
<?php if (hasProblemPermission($myUser, $problem)): ?>
|
|
<li class="nav-item text-start">
|
|
<a class="nav-link" href="/problem/<?= $problem['id'] ?>/manage/statement" role="tab">
|
|
<i class="bi bi-sliders"></i>
|
|
<?= UOJLocale::get('problems::manage') ?>
|
|
</a>
|
|
</li>
|
|
<?php endif ?>
|
|
</ul>
|
|
<div class="card-footer bg-transparent">
|
|
评价:<?= getClickZanBlock('P', $problem['id'], $problem['zan']) ?>
|
|
</div>
|
|
</div>
|
|
|
|
<?php if (isset($add_new_solution_form)): ?>
|
|
<div class="card card-default mb-2">
|
|
<div class="card-header bg-transparent fw-bold">
|
|
增加题解
|
|
</div>
|
|
<div class="card-body">
|
|
<?php $add_new_solution_form->printHTML(); ?>
|
|
</div>
|
|
<div class="card-footer bg-transparent">
|
|
<a class="text-decoration-none" href="<?= HTML::blog_url(Auth::id(), '/post/new/write?title=' . urlencode('【题解】#' . $problem['id'] . '. ' . $problem['title']) . '&is_hidden=0') ?>">
|
|
快速新建文章
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<?php endif ?>
|
|
|
|
<?php uojIncludeView('sidebar', array()); ?>
|
|
|
|
<!-- End right col -->
|
|
</aside>
|
|
|
|
</div>
|
|
|
|
<script>
|
|
$(document).ready(function() {
|
|
$('.markdown-body table').each(function() {
|
|
$(this).addClass('table table-bordered');
|
|
});
|
|
});
|
|
</script>
|
|
|
|
<?php echoUOJPageFooter() ?>
|