<!DOCTYPE html>
|
|
<html lang="zh-CN">
|
|
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
|
|
<link href="https://fonts.yecdn.com/css2?family=Noto+Serif+SC:wght@300;700&display=swap" rel="stylesheet">
|
|
<link href="https://fonts.yecdn.com/css2?family=Noto+Sans+SC&display=swap" rel="stylesheet">
|
|
<meta property="og:title" content="华清大学课程攻略共享计划" />
|
|
<meta property="og:description" content="说人话就是往年考题" />
|
|
<title>华清大学课程攻略共享计划</title>
|
|
<style>
|
|
body {
|
|
background: linear-gradient(-45deg,
|
|
#fff calc(50% - 1px),
|
|
#ddd calc(50%),
|
|
#fff calc(50% + 1px)
|
|
);
|
|
background-size: 6px 5px;
|
|
font-family: 'Noto Sans SC', sans-serif;
|
|
}
|
|
|
|
.qbox pre {
|
|
white-space: pre-wrap;
|
|
}
|
|
|
|
h1,
|
|
h2,
|
|
h3,
|
|
h4,
|
|
h5,
|
|
h6 {
|
|
font-family: 'Noto Serif SC', serif;
|
|
font-weight: 300;
|
|
}
|
|
|
|
a,
|
|
a:hover,
|
|
.btn-link,
|
|
.btn-link:hover {
|
|
color: inherit;
|
|
text-decoration: underline;
|
|
}
|
|
|
|
nav .page-link {
|
|
color: #000;
|
|
}
|
|
|
|
nav .page-item.active .page-link {
|
|
background-color: #000;
|
|
border-color: #000;
|
|
}
|
|
|
|
.btn-lg {
|
|
font-size: 2em;
|
|
font-family: 'Noto Serif SC', serif;
|
|
}
|
|
|
|
.part1 {
|
|
max-width: 500px;
|
|
float: left;
|
|
padding-right: 10px;
|
|
position: relative;
|
|
}
|
|
|
|
.input-form {
|
|
position: absolute;
|
|
top: 0;
|
|
overflow-y: auto;
|
|
overflow-x: hidden;
|
|
background-color: #0006;
|
|
height: 100%;
|
|
}
|
|
|
|
.part2 {
|
|
min-width: 200px;
|
|
min-height: 100vh;
|
|
overflow: hidden;
|
|
padding-left: 25px;
|
|
}
|
|
|
|
.card-header {
|
|
padding: .15em 1.25em;
|
|
}
|
|
|
|
.qbox {
|
|
background: #fffe;
|
|
padding: 5px 20px;
|
|
color: black;
|
|
margin: 5px 5px 20px;
|
|
}
|
|
|
|
.new .qbox {
|
|
border: 2px black solid;
|
|
background: white;
|
|
color: black;
|
|
}
|
|
|
|
.new .qbox input,
|
|
.new .qbox textarea {
|
|
border: none;
|
|
border-bottom: 1px solid black;
|
|
background: transparent;
|
|
color: black;
|
|
border-radius: 0;
|
|
}
|
|
|
|
.new .qbox .custom-control-input:checked~.custom-control-label::before {
|
|
background-color: #495057;
|
|
border-color: #495057;
|
|
}
|
|
|
|
.like {
|
|
fill: #fff;
|
|
}
|
|
|
|
.liked {
|
|
fill: #000;
|
|
}
|
|
|
|
.display_name {
|
|
margin: 0;
|
|
}
|
|
|
|
.card-body {
|
|
padding: 0.75em;
|
|
}
|
|
|
|
.cate {
|
|
display: inline-block;
|
|
background-color: #444;
|
|
color: white;
|
|
margin: 4px;
|
|
padding: 2px 4px;
|
|
}
|
|
|
|
.cate.selected {
|
|
background-color: white;
|
|
color: #444;
|
|
border: 1px black solid;
|
|
}
|
|
|
|
.cate a {
|
|
text-decoration: none;
|
|
}
|
|
|
|
.footer {
|
|
background: black;
|
|
color: white;
|
|
text-align: center;
|
|
font-size: 80%;
|
|
border-top: solid 1px white;
|
|
}
|
|
|
|
.footer p {
|
|
margin: 10px 0 0;
|
|
float: bottom;
|
|
}
|
|
|
|
.popover-body ul {
|
|
padding-left: 15px;
|
|
}
|
|
|
|
.popover-body ul li {
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
.user-info:not(:hover) div:not(.show) .username{
|
|
display: none;
|
|
}
|
|
</style>
|
|
</head>
|
|
|
|
<body>
|
|
<div class="container" style="overflow: hidden">
|
|
<div class="pt-3 pl-3 pb-4 mb-4">
|
|
<h1>华清大学<br> 课程攻略<br> 共享计划</h1>
|
|
</div>
|
|
|
|
<div class="fixed-top text-right user-info">
|
|
<div class="btn-group">
|
|
<button type="button" class="btn btn-dark rounded-0 username">{{username}}</button>
|
|
<button type="button" class="btn btn-dark rounded-0 dropdown-toggle dropdown-toggle-split" id="dropdownMenuReference" data-toggle="dropdown" data-reference="parent">
|
|
<span class="sr-only">Toggle Dropdown</span>
|
|
</button>
|
|
<div class="dropdown-menu">
|
|
<a class="dropdown-item" href="#">我的上传</a>
|
|
<a class="dropdown-item" href="#">我的下载</a>
|
|
<a class="dropdown-item" href="#">我的点赞</a>
|
|
<div class="dropdown-divider"></div>
|
|
<a class="dropdown-item" href="login">切换帐号</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="part1 new">
|
|
<form action="upload" method="post" enctype="multipart/form-data">
|
|
<div class="form-group qbox">
|
|
<h1 style="margin: -16px -26px 35px">上传</h1>
|
|
<div class="form-group row">
|
|
<label class="col-sm-3 col-form-label mb-0">课程名</label>
|
|
<div class="col-sm-9">
|
|
<input type="text" class="form-control" name="name" required placeholder="课程名" maxlength="30">
|
|
</div>
|
|
</div>
|
|
<div class="form-group row">
|
|
<label class="col-sm-3 col-form-label">任课教师</label>
|
|
<div class="col-sm-9">
|
|
<input type="text" class="form-control" name="teacher" required placeholder="教师名" maxlength="30">
|
|
</div>
|
|
</div>
|
|
<div class="form-group row">
|
|
<label class="col-sm-3 col-form-label">年份</label>
|
|
<div class="col-sm-9">
|
|
<select class="custom-select" name="year">
|
|
<option selected>不详/不适用</option>
|
|
{% for y in range(curr_year, curr_year-10, -1) %}
|
|
<option value="{{y}}">{{y}}</option>
|
|
{% endfor %}
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<div class="form-group mt-4 mb-4">
|
|
<label>备注(可选)</label>
|
|
<textarea class="form-control" name="notes" rows="2" placeholder="如果你上传的不是往年考题而是其他资料,也请在这里注明一下" maxlength="200"></textarea>
|
|
</div>
|
|
<div class="custom-file">
|
|
<input type="file" class="custom-file-input" name="files[]" multiple required>
|
|
<label class="custom-file-label" for="customFile" data-browse="浏览">选择文件,可以多选</label>
|
|
</div>
|
|
<div class="custom-control custom-switch mb-2 mt-3 ml-1">
|
|
<input type="checkbox" class="custom-control-input" id="anon" name="anon">
|
|
<label class="custom-control-label" for="anon">匿名发布</label>
|
|
</div>
|
|
<p> 开启匿名发布后,其他人在查看时作者会显示为“匿名”。 </p>
|
|
<button type="submit" class="btn btn-link btn-lg mt-4 pr-1">提交</button>
|
|
<span>
|
|
<a href="##" role="button"data-toggle="popover" >
|
|
<svg width="20px" viewBox="0 0 24 28"><path d="M15.07 11.25l-.9.92C13.45 12.89 13 13.5 13 15h-2v-.5c0-1.11.45-2.11 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41a2 2 0 0 0-2-2a2 2 0 0 0-2 2H8a4 4 0 0 1 4-4a4 4 0 0 1 4 4a3.2 3.2 0 0 1-.93 2.25M13 19h-2v-2h2M12 2A10 10 0 0 0 2 12a10 10 0 0 0 10 10a10 10 0 0 0 10-10c0-5.53-4.5-10-10-10z" fill="#626262"/></svg>
|
|
</a>
|
|
</span>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
|
|
<div class="part2" id="part2">
|
|
|
|
<div id="accordion">
|
|
<div class="card">
|
|
<div class="card-header" id="headingOne">
|
|
<h5 class="mb-0">
|
|
<button class="btn btn-link" data-toggle="collapse" data-target="#collapseOne">
|
|
课程
|
|
</button>
|
|
</h5>
|
|
</div>
|
|
|
|
<div id="collapseOne" class="collapse {{'show' if has_course or ept else ''}}" data-parent="#accordion">
|
|
<div class="card-body">
|
|
{% for c in all_courses %}
|
|
<span class="cate {{'selected' if c==course else ''}}"><a href="?course={{'' if c==course else c}}#part2">{{c}}</a></span>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="card">
|
|
<div class="card-header" id="headingTwo">
|
|
<h5 class="mb-0">
|
|
<button class="btn btn-link collapsed" data-toggle="collapse" data-target="#collapseTwo">
|
|
教师
|
|
</button>
|
|
</h5>
|
|
</div>
|
|
<div id="collapseTwo" class="collapse {{'show' if has_teacher else ''}}" data-parent="#accordion">
|
|
<div class="card-body">
|
|
{% for t in all_teachers %}
|
|
<span class="cate {{'selected' if t==teacher else ''}}"><a href="?teacher={{'' if t==teacher else t}}#part2">{{t}}</a></span>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="card">
|
|
<div class="card-header" id="headingThree">
|
|
<h5 class="mb-0">
|
|
<button class="btn btn-link collapsed" data-toggle="collapse" data-target="#collapseThree">
|
|
年份
|
|
</button>
|
|
</h5>
|
|
</div>
|
|
<div id="collapseThree" class="collapse {{'show' if has_year else ''}}" data-parent="#accordion">
|
|
<div class="card-body">
|
|
{% for y in all_years %}
|
|
<span class="cate {{'selected' if y==year else ''}}"><a href="?year={{'' if y==year else y}}#part2">{{y or '/'}}</a></span>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="ml-2 mt-2 mb-4">
|
|
<p>*点击某一课程/教师/年份进行筛选</p>
|
|
</div>
|
|
|
|
|
|
{% for p in pagination.items %}
|
|
<div class="qbox">
|
|
{% if showPrivate %}
|
|
<form action="{{c.id}}/delete" method="post">
|
|
<input type="hidden" name="key" value="{{key}}">
|
|
<button type="submit" class="close">
|
|
<span>×</span>
|
|
</button>
|
|
</form>
|
|
{% endif %}
|
|
<h5>{{p.course}}</h5>
|
|
<p class="ml-3">
|
|
{{p.teacher}} - {{p.year or '/'}}
|
|
</p>
|
|
<pre class="ml-3">{{p.notes}}</pre>
|
|
<div class="text-right">
|
|
<small>@{{'匿名用户' if p.anon else p.author}} | {{p.create_date}}</small>
|
|
<button class="btn btn-link" id="like-{{p.id}}" onclick="like('{{p.id}}')">
|
|
<span>有用({{p.like_num}})</span>
|
|
</button>
|
|
<a href="{{p.id}}/download?v={{ipfs_version}}" target="_blank" class="btn btn-link pl-0" id="like-{{p.id}}">
|
|
<span>下载({{p.down_num}})</span>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
{% endfor %}
|
|
|
|
<nav>
|
|
<ul class="pagination">
|
|
{%- for page in pagination.iter_pages() %}
|
|
{% if page %}
|
|
{% if page != pagination.page %}
|
|
<li class="page-item"><a class="page-link" href="{{ url_for('list', page=page, per_page=pagination.per_page, course=course, teacher=teacher, year=year) }}#part2">{{ page }}</a></li>
|
|
{% else %}
|
|
<li class="page-item active">
|
|
<a class="page-link" href="#part2">{{ page }}<span class="sr-only">(current)</span></a>
|
|
</li>
|
|
{% endif %}
|
|
{% else %}
|
|
<li class="page-item"><span class=ellipsis>…</span></li>
|
|
{% endif %}
|
|
{%- endfor %}
|
|
</ul>
|
|
</nav>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
<div class="footer">
|
|
<p>
|
|
由<a href="//closed.social" target="_blank">闭社</a>提供技术支持,本系统开源于<a href="//git.closed.social/closed-social/pastExam">碧茶</a>。
|
|
</p>
|
|
<p> 🄯 2020 Copyleft: closed.social</p>
|
|
</div>
|
|
</body>
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ho+j7jyWK8fNQe+A12Hb8AhRq26LrZ/JpcUGGOn+Y7RsweNrtN/tE3MoK7ZeZDyx" crossorigin="anonymous"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/bs-custom-file-input/dist/bs-custom-file-input.min.js" crossorigin="anonymous"></script>
|
|
|
|
<script>
|
|
function like(toot) {
|
|
if ($(`#like-${toot}`).hasClass("liked")) {
|
|
alert('赞都赞了,别撤回嘛');
|
|
return;
|
|
}
|
|
$.ajax({
|
|
type: 'POST',
|
|
url: toot + '/like',
|
|
success: (result, status, xhr) => {
|
|
console.log(result + ' : ' + status);
|
|
$(`#like-${toot} span`).text(result);
|
|
$(`#like-${toot} svg`).toggleClass("like liked");
|
|
},
|
|
error: (xhr, status, error) => {
|
|
alert(error);
|
|
}
|
|
});
|
|
}
|
|
|
|
$(document).ready(function () {
|
|
bsCustomFileInput.init()
|
|
$('[data-toggle="popover"]').popover({
|
|
html: true,
|
|
placement: "top",
|
|
trigger: "focus",
|
|
title: "说明",
|
|
content:`<ul>
|
|
<li>文件可以多选,电脑端一般是按住ctrl选择,移动端一般是直接勾选多个。对文件数量和大小没有限制,总大小不要太过分就行。</li>
|
|
<li>时间请填写该学期开始时的年份,课程名尽量与已有的保持一致。</li>
|
|
<li>如有特殊署名或授权需求,请体现在文件名或附带上传LICENSE,请确保授权方式与本平台的运作方式兼容,推荐使用CC-BY-SA许可协议。默认情况下上传内容的版权与上传前一致,属于上传者/原作者/公有领域等。请务必确保上传行为不会侵犯其他人的合法权益。</li>
|
|
</ul>`
|
|
});
|
|
})
|
|
|
|
</script>
|
|
|
|
</html>
|