2021的特普通奖
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

236 lines
9.4 KiB

2 years ago
2 years ago
2 years ago
2 years ago
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
  6. <link rel="icon" type="image/png" href="static/img/icon-128.png" />
  7. <link href="https://fonts.yecdn.com/css2?family=Noto+Serif+SC:wght@300;700&display=swap" rel="stylesheet">
  8. <link href="https://fonts.yecdn.com/css2?family=Noto+Sans+SC&display=swap" rel="stylesheet">
  9. <meta property="og:title" content="华清大学特普通奖学金 {{story.title}}" />
  10. <meta property="og:description" content="华清大学特普通奖学金" />
  11. <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
  12. <link href="static/css/ordinary.css" rel="stylesheet">
  13. <title>第二届 华清大学特普通奖 {{story.title}}</title>
  14. <script>
  15. if(navigator.userAgent.search('MicroMessenger') !== -1)
  16. location.href = `https://closed.social/tools/safe_jump/?go=${encodeURIComponent(location.href)}&t=${encodeURIComponent('华清大学特普通奖')}`;
  17. </script>
  18. </head>
  19. <body>
  20. <div class="container">
  21. <a href=".">
  22. <div style='padding:15px'>
  23. <img src="static/img/logo.png" width="200px" />
  24. </div>
  25. </a>
  26. <div class="user-info">
  27. <div class="btn-group">
  28. <button type="button" class="btn btn-dark rounded-0 p-1 pl-2">
  29. <img class="rounded-circle" src="{{avatar}}" width="24">
  30. <span class="username ml-2">{{username or '未登录'}}</span>
  31. </button>
  32. </div>
  33. </div>
  34. <div class="part1 col-md-6">
  35. <div class="story-box qbox part-box">
  36. <h1>{{story.title}}</h1>
  37. <p class="story-text" title="{{paragraph_part[0].author}}, {{paragraph_part[0].create_at}}, {{paragraph_part[0].like_num}}">{{paragraph_part[0].text}}</p>
  38. <img src="{{story.avatar}}" style="width: 80%">
  39. <hr>
  40. {% for p in paragraph_part[1:] %}
  41. <p class="story-text" title="{{p.author}}, {{p.create_at}}, {{p.like_num}}">{{p.text}}</p>
  42. {% endfor %}
  43. </div>
  44. <div style="font-size:90%;">
  45. <ul>
  46. <li>我们将每六小时划分为一个时段,每个时段结束后,该时段获得赞同票数最高(且不小于 10)的条目将入选,成为这个角色最终故事的一部分。</li>
  47. <li>具体时段为:6:00-12:00, 12:00-18:00,18:00-24:00,0:00-6:00</li>
  48. <li>当前时段剩余时间:<span id="timeleft" data-period="{{period}}"></span></li>
  49. <li>参与创作需要回答几个简单的问题以验证学生身份,或者通过<a href="https://thu.closed.social/">闭社清华站</a>账号登录。</li>
  50. <li>如需删除条目,请联系工作人员(微信:ordinary_thuer)。</li>
  51. </ul>
  52. </div>
  53. </div>
  54. <div class="part2" id="part2">
  55. <div class="paragraph-list twin front qbox part-box" style="border: 0">
  56. <h1 style="margin: -8px -5px 20px">备选续写</h1>
  57. <span style="margin:8px" class="sort-by">
  58. {% if sort_by == 'like' %}
  59. <a href="?sort_by=time#part2">按时间</a> | <b>按赞数</b>
  60. {% else %}
  61. <b>按时间</b> | <a href="?sort_by=like#part2">按赞数</a>
  62. {% endif %}
  63. </span>
  64. {% for p in pagination.items %}
  65. <div class="qbox">
  66. <small>No. {{p.id}}</small>
  67. <p class="story-text">{{p.text}}</p>
  68. <div class="text-end" title="{{p.create_at}}">
  69. {% for emoji, num, reacted, kind in p.reaction_status() %}
  70. <button class="btn {{'btn-secondary' if reacted else 'btn-outline-secondary can-react'}}
  71. btn-sm" data-kind="{{kind}}" data-pid="{{p.id}}">{{emoji}} <span>{{num or ''}}</span></button>
  72. {% endfor %}
  73. <br>
  74. <time class="timeago" datetime="{{p.time}}"></time>
  75. </div>
  76. </div>
  77. {% endfor %}
  78. <nav>
  79. <ul class="pagination">
  80. {%- for page in pagination.iter_pages(left_edge=2, left_current=1, right_current=3, right_edge=2) %}
  81. {% if page %}
  82. {% if page != pagination.page %}
  83. <li class="page-item"><a class="page-link" href="{{ url_for('main_bp.story', story_id=story_id, page=page, per_page=pagination.per_page, key=key, sort_by=sort_by) }}">{{ page }}</a></li>
  84. {% else %}
  85. <li class="page-item active">
  86. <a class="page-link" href="#">{{ page }}<span class="visually-hidden">(current)</span></a>
  87. </li>
  88. {% endif %}
  89. {% else %}
  90. <li class="page-item"><span class=ellipsis>...</span></li>
  91. {% endif %}
  92. {%- endfor %}
  93. </ul>
  94. </nav>
  95. </div>
  96. <div class="create-paragraph twin behind qbox part-box">
  97. <h1 style="text-align:right;margin:-8px -8px 16px">续!</h1>
  98. <form action="create" method="post">
  99. <input type="hidden" name="story-id" value={{story_id}}>
  100. <div class="form-group">
  101. <textarea class="form-control" name="text" rows="11" placeholder="来续写{{story.title}}的故事吧!(不超过 140 字)" required maxLength="140"></textarea>
  102. </div>
  103. <div class="form-group">
  104. <button type="submit" class="btn btn-link btn-lg">续!</button>
  105. </div>
  106. </form>
  107. </div>
  108. </div>
  109. </div>
  110. <div class="footer">
  111. <p>
  112. <a href="//closed.social" target="_blank">闭社</a>提供技术支持,本报名系统开源于<a href="//git.closed.social/closed-social/">碧茶</a>
  113. </p>
  114. <p> 🄯 2021 Copyleft: closed.social</p>
  115. </div>
  116. <div class="modal fade" id="loginModal" tabindex="-1">
  117. <div class="modal-dialog">
  118. <div class="modal-content">
  119. <div class="modal-header">
  120. <h3 class="modal-title">登录</h3>
  121. </div>
  122. <div class="modal-body">
  123. <div class="text-center mb-4">
  124. <a href="{{cs_login_url}}" target="_blank" class="btn btn-link">闭社帐号登录</a>
  125. </div>
  126. <div class="text-center mb-4">
  127. <a href="#answerLogin" data-bs-toggle="collapse" class="btn btn-link" role="button">答题验证登录</a>
  128. <div class="collapse" id="answerLogin">
  129. <form action="{{guest_login_url}}" method="post">
  130. {% for id, question, hint, answer in verify_questions %}
  131. <div class="form-group row">
  132. <label for="{{id}}" class="col-sm-8 col-form-label">{{question}}</label>
  133. <div class="col-sm-4">
  134. <input type="text" class="form-control" name="{{id}}" id="{{id}}" placeholder="{{hint}}" required="required">
  135. </div>
  136. </div>
  137. {% endfor %}
  138. <button type="submit" class="btn btn-link btn-lg mb-3">提交</button>
  139. </form>
  140. </div>
  141. <p>
  142. </div>
  143. </div>
  144. </div>
  145. </div>
  146. </div>
  147. </body>
  148. <script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
  149. <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
  150. <script src="https://cdn.bootcdn.net/ajax/libs/jquery-timeago/1.6.7/jquery.timeago.min.js"></script>
  151. <script src="https://cdn.bootcdn.net/ajax/libs/jquery-timeago/1.6.7/locales/jquery.timeago.zh-CN.js"></script>
  152. <script>
  153. $('.can-react').click(function (e) {
  154. if (check_login())
  155. return;
  156. $this = $(this);
  157. $.post(
  158. 'react',
  159. {
  160. 'pid': $this.data('pid'),
  161. 'kind': $this.data('kind')
  162. },
  163. (n) => {
  164. $this.addClass('btn-secondary').removeClass('btn-outline-secondary can-react');
  165. console.log(n);
  166. if (n) {
  167. $this.find('span').text(n);
  168. }
  169. }
  170. ).fail(function(xhr, status, error) {
  171. console.log(xhr, status, error);
  172. alert(error);
  173. });;
  174. });
  175. function check_login() {
  176. if (! "{{username}}") {
  177. new bootstrap.Modal(document.getElementById('loginModal')).show();
  178. return true;
  179. }
  180. }
  181. $('.timeago').timeago();
  182. $('.twin').click((e) => {
  183. if($(e.currentTarget).hasClass('front'))
  184. return;
  185. let behind_box = $('.behind');
  186. let front_box = $('.front');
  187. behind_box.toggleClass('behind front');
  188. front_box.toggleClass('front behind');
  189. });
  190. $('.user-info .btn').click(check_login);
  191. $('textarea').focus(check_login);
  192. function makeTimer() {
  193. let period = $("#timeleft").data('period') * 60;
  194. var now = new Date();
  195. now = (Date.parse(now) / 1000);
  196. var timeLeft = period - now % period;
  197. var hours = Math.floor(timeLeft / 3600);
  198. var minutes = Math.floor((timeLeft - (hours * 3600 )) / 60);
  199. var seconds = Math.floor((timeLeft - (hours * 3600) - (minutes * 60)));
  200. if (hours < "10") { hours = "0" + hours; }
  201. if (minutes < "10") { minutes = "0" + minutes; }
  202. if (seconds < "10") { seconds = "0" + seconds; }
  203. $("#timeleft").html(`${hours}:${minutes}:${seconds}`);
  204. }
  205. setInterval(function() { makeTimer(); }, 1000);
  206. </script>
  207. </html>