|
|
- <!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;
- }
-
- body,
- p,
- pre {
- font-family: 'Noto Sans SC', sans-serif;
- }
-
- .qbox pre {
- white-space: pre-wrap;
- }
-
- h1,
- h2,
- h3,
- h4,
- h5,
- h6,
- .num-info{
- font-family: 'Noto Serif SC', serif;
- font-weight: 300;
- }
-
- .num-info-active{
- font-family: 'Noto Serif SC', serif;
- font-weight: 700;
- }
-
- .num-infos {
- display: inline-block;
- }
-
- 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;
- }
-
- .liked {
- fill: #000;
- }
-
- .display_name {
- margin: 0;
- }
-
- .card-body {
- padding: 0.75em;
- }
-
- .cate {
- margin: 4px;
- display: inline-block;
- }
-
- .cate a {
- display: inline-block;
- background-color: #444;
- color: white;
- padding: 2px 4px;
- text-decoration: none;
- }
-
- .cate.selected a {
- background-color: white;
- color: #444;
- border: 1px black solid;
- }
-
- .cate .count {
- font-size: 12px;
- vertical-align: bottom;
- margin-left: -3px;
- }
-
- .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 {
- position: fixed;
- top: 0;
- right: 0;
- z-index: 1030
- }
-
- .user-info:not(:hover) div:not(.show) .username{
- display: none;
- }
-
- .btn, input, select, textarea, label {
- box-shadow: none !important;
- }
-
- .mask {
- background: linear-gradient(25deg,
- #5558 calc(50% - 1px),
- #333 calc(50%),
- #5558 calc(50% + 1px)
- );
- background-size: 10px 5px;
- position: absolute;
- z-index: 999;
- width: 100%;
- height: 100%;
- top: -5px;
- left: -5px;
- border-radius: 0;
- }
-
- .wechat-share div {
- position: absolute;
- right: 50%;
- top: 100%;
- background-color: #fffd;
- }
-
- .wechat-share:not(:hover) div {
- display: none;
- }
-
- .wechat-share img {
- width: 196px;
- }
-
- .custom-file-label {
- overflow: hidden;
- }
- </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="user-info">
- <div class="btn-group">
- <button type="button" class="btn btn-dark rounded-0 p-1 pl-2">
- <img class="rounded-circle" src="{{avatar}}" width="24">
- <span class="username ml-2">{{username}}</span>
- </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="?my_upload=1#part2">我的上传</a>
- <a class="dropdown-item" href="?my_fav=1#part2">我的点赞</a>
- <div class="dropdown-divider"></div>
- <a class="dropdown-item" href="logout">退出账号</a>
- <div class="dropdown-divider"></div>
- <a class="dropdown-item wechat-share" href="##">
- 微信传播
- <div><img src="img/wechat-share.png"></div>
- </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="教师名或“不详”" value="不详" 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="upload-dir" name="upload-dir">
- <label class="custom-control-label" for="upload-dir">上传文件夹</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>
- {% if disable_upload %}
- <button class="mask" onclick="alert('目前guest无权限上传')"></button>
- {% endif %}
-
- <div style="font-size:80%;margin-bottom:70px">
- <ul>
- <li>
- 如果觉得操作太麻烦,也可将资料发给
- <a href="mailto:thu_courses@protonmail.com">thu_courses@protonmail.com</a>
- ,由工作人员后台添加。
- </li>
- <li>
- 如果你认为本项目侵犯了你的权益,请致信
- <a href="mailto:thu_courses@protonmail.com">thu_courses@protonmail.com</a>
- ,我们会在第一时间处理。
- </li>
- <li>
- 如无特别注明,由贡献者所编写部分使用知识共享许可协议
- <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh">CC BY-NC-SA 4.0 (署名-非商业性使用-相同方式共享 4.0 国际)</a>
- ,其余部分的版权归属于原作者。
- </li>
- </ul>
- </div>
- </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 k, courses in all_courses_abc.items() %}
- <h5>{{k}}</h5>
- {% for c, count in courses %}
- <span class="cate {{'selected' if c==course else ''}}">
- <a href="?course={{'' if c==course else c}}#part2">{{c}}</a>
- <span class="count">({{count}})</span>
- </span>
- {% endfor %}
- {% 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, count in all_teachers %}
- <span class="cate {{'selected' if t==teacher else ''}}">
- <a href="?teacher={{'' if t==teacher else t}}#part2">{{t}}</a>
- <span class="count">({{count}})</span>
- </span>
- </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, count in all_years %}
- <span class="cate {{'selected' if y==year else ''}}">
- <a href="?year={{'' if y==year else y}}#part2">{{y or '/'}}</a>
- <span class="count">({{count}})</span>
- </span>
- </span>
- {% endfor %}
- </div>
- </div>
- </div>
- </div>
- <div class="ml-2 mt-2 mb-5">
- <p>*点击某一课程/教师/年份进行筛选</p>
- </div>
-
- <div class="mb-2">
- {% if is_my_upload %}
- <span class="cate selected"><a href="?my_upload=#part2">我的上传</a></span>
- {% endif %}
- {% if is_my_fav %}
- <span class="cate selected"><a href="?my_fav=#part2">我的点赞</a></span>
- {% endif %}
- </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>
- <div class="num-infos">
- <button class="btn btn-link" id="like-{{p.id}}" onclick="like('{{p.id}}')">
- <span class="num-info {{'num-info-active' if p.is_liked() else ''}}">好评(<span>{{p.like_num}}</span>)</span>
- </button>
- <span>
- <a href="{{p.id}}/download?v={{ipfs_version}}" target="_blank" class="btn btn-link px-0" id="download-{{p.id}}">
- <span class="num-info {{'num-info-active' if p.is_downloaded() else ''}}">去下载({{p.down_num}})</span>
- </a>
- <button type="button" class="btn btn-link px-0 dropdown-toggle dropdown-toggle-split" id="downloadDropdownMenuReference" data-toggle="dropdown" data-reference="parent">
- <span class="sr-only">Toggle Dropdown</span>
- </button>
- <div class="dropdown-menu" style="min-width: 5rem">
- <a class="dropdown-item" href="{{p.id}}/download?format=zip" target="_blank"><span class="num-info">打包下载 - zip</span></a>
- <a class="dropdown-item" href="{{p.id}}/download?format=tar" target="_blank"><span class="num-info">打包下载 - tar</span></a>
- <a class="dropdown-item" href="{{p.id}}/download?format=gztar" target="_blank"><span class="num-info">打包下载 - gzip</span></a>
- </div>
- </span>
- </div>
- </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) {
- var method = 'POST';
- if ($(`#like-${toot} .num-info`).hasClass("num-info-active")) {
- method = 'DELETE'
- }
- $.ajax({
- type: method,
- url: toot + '/like',
- success: (result, status, xhr) => {
- $(`#like-${toot} > span > span`).text(result);
- $(`#like-${toot} > span`).toggleClass("num-info-active");
- },
- error: (xhr, status, error) => {
- alert(xhr.status + ' ' + xhr.statusText);
- }
- });
- }
-
- $(document).ready(function () {
- bsCustomFileInput.init();
- $("#upload-dir").change(function() {
- var fi = $('.custom-file-input');
- var fl = $('.custom-file-label');
- console.log(fi);
- if(this.checked) {
- fi.attr('webkitdirectory', true);
- fl.text('选择文件夹,可以多选');
- }
- else {
- fi.removeAttr('webkitdirectory');
- fl.text('选择文件,可以多选');
- }
- });
-
- $('[data-toggle="popover"]').popover({
- html: true,
- placement: "top",
- trigger: "focus",
- title: "说明",
- content:`<ul>
- <li>文件可以多选,电脑端一般是按住ctrl选择,移动端一般是直接勾选多个。对文件数量和大小没有限制,总大小不要太过分就行。</li>
- <li>时间请填写该学期开始时的年份,课程名尽量与已有的保持一致。</li>
- </ul>`
- });
- })
-
- </script>
-
- </html>
|