index.html 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. {% extends "base.html" %}
  2. {% block title %}首页 - 满意错题本{% endblock %}
  3. {% block page_title %}首页{% endblock %}
  4. {% block content %}
  5. <!-- Stats -->
  6. <div class="grid grid-cols-4 gap-5 mb-8">
  7. <div class="bg-white rounded-2xl p-5 shadow-sm border border-gray-100">
  8. <div class="flex items-center justify-between">
  9. <div>
  10. <p class="text-gray-400 text-xs mb-1">科目总数</p>
  11. <p class="text-3xl font-bold text-gray-800">{{ subjects|length }}</p>
  12. </div>
  13. <div class="w-11 h-11 rounded-xl bg-indigo-50 flex items-center justify-center text-primary text-lg">
  14. <i class="fa-solid fa-folder-open"></i>
  15. </div>
  16. </div>
  17. </div>
  18. <div class="bg-white rounded-2xl p-5 shadow-sm border border-gray-100">
  19. <div class="flex items-center justify-between">
  20. <div>
  21. <p class="text-gray-400 text-xs mb-1">今日错题</p>
  22. <p class="text-3xl font-bold text-gray-800">{{ today_images.values() | map('length') | sum }}</p>
  23. </div>
  24. <div class="w-11 h-11 rounded-xl bg-pink-50 flex items-center justify-center text-accent text-lg">
  25. <i class="fa-solid fa-image"></i>
  26. </div>
  27. </div>
  28. </div>
  29. <div class="bg-white rounded-2xl p-5 shadow-sm border border-gray-100">
  30. <div class="flex items-center justify-between">
  31. <div>
  32. <p class="text-gray-400 text-xs mb-1">累计记录</p>
  33. <p class="text-3xl font-bold text-gray-800">{{ subjects | map(attribute='error_images') | map('length') | sum }}</p>
  34. </div>
  35. <div class="w-11 h-11 rounded-xl bg-emerald-50 flex items-center justify-center text-emerald-500 text-lg">
  36. <i class="fa-solid fa-images"></i>
  37. </div>
  38. </div>
  39. </div>
  40. <div class="bg-white rounded-2xl p-5 shadow-sm border border-gray-100">
  41. <div class="flex items-center justify-between">
  42. <div>
  43. <p class="text-gray-400 text-xs mb-1">知识评价</p>
  44. <p class="text-3xl font-bold text-gray-800">{{ evaluations|length }}</p>
  45. </div>
  46. <div class="w-11 h-11 rounded-xl bg-amber-50 flex items-center justify-center text-amber-500 text-lg">
  47. <i class="fa-solid fa-clipboard-list"></i>
  48. </div>
  49. </div>
  50. </div>
  51. </div>
  52. <!-- 今日错题 -->
  53. <div class="mb-8">
  54. <div class="flex items-center justify-between mb-4">
  55. <div class="flex items-center gap-3">
  56. <h3 class="text-sm font-semibold text-gray-700">今日错题</h3>
  57. <span class="text-xs text-gray-400 bg-gray-100 px-2.5 py-1 rounded-full">{{ today }}</span>
  58. </div>
  59. <a href="/timeline?date={{ today }}" class="text-xs text-primary hover:underline">查看全部 <i class="fa-solid fa-arrow-right"></i></a>
  60. </div>
  61. {% if today_images %}
  62. <div class="grid grid-cols-3 gap-5">
  63. {% for subject_id, imgs in today_images.items() %}
  64. {% set subject = subjects | selectattr('id', 'equalto', subject_id) | first %}
  65. {% if subject %}
  66. <div class="bg-white rounded-2xl shadow-sm border border-gray-100 overflow-hidden">
  67. <div class="px-5 py-3.5 flex items-center gap-3 border-b border-gray-50">
  68. <span class="w-2.5 h-2.5 rounded-full flex-shrink-0" style="background-color:{{ subject.color }}"></span>
  69. <span class="font-semibold text-gray-700 text-sm">{{ subject.name }}</span>
  70. <span class="ml-auto text-xs text-gray-400">{{ imgs|length }}张</span>
  71. </div>
  72. {% set t_imgs = [] %}
  73. {% set t_txts = [] %}
  74. {% for img in imgs %}{% if img.filename %}{% set x = t_imgs.append(img) %}{% else %}{% set x = t_txts.append(img) %}{% endif %}{% endfor %}
  75. <div class="p-4 grid grid-cols-2 gap-3">
  76. {% for img in t_imgs[:4] %}
  77. <div class="aspect-[3/4] rounded-xl overflow-hidden bg-gray-100 group relative cursor-pointer" onclick="openLightbox('/static/uploads/{{ img.filename }}','{{ img.original_name }}',todayImg{{ subject_id }},{{ loop.index0 }})">
  78. <img src="/static/uploads/{{ img.filename }}" class="w-full h-full object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy">
  79. </div>
  80. {% endfor %}
  81. {% for txt in t_txts[:4 - t_imgs[:4]|length] if t_imgs[:4]|length < 4 %}
  82. <div class="aspect-[3/4] rounded-xl overflow-hidden bg-violet-50 border border-violet-100 cursor-pointer hover:shadow-sm transition flex flex-col" onclick="toggleIndexAnswer(this, {{ subject_id }}, {{ loop.index0 }})">
  83. <div class="p-3 flex-1">
  84. <p class="text-xs font-medium text-gray-700 line-clamp-3 leading-relaxed">{{ txt.question[:40] }}</p>
  85. </div>
  86. <div class="index-answer hidden px-3 pb-3">
  87. <p class="text-[11px] text-gray-500 leading-relaxed">{{ txt.answer }}</p>
  88. </div>
  89. </div>
  90. {% endfor %}
  91. </div>
  92. <div class="px-5 py-2.5 bg-gray-50 border-t border-gray-100">
  93. <a href="/subject/{{ subject_id }}?date={{ today }}" class="text-xs text-primary font-medium hover:underline flex items-center gap-1">
  94. <i class="fa-solid fa-eye"></i>查看完整记录
  95. </a>
  96. </div>
  97. </div>
  98. {% endif %}
  99. {% endfor %}
  100. </div>
  101. {% else %}
  102. <div class="bg-white rounded-2xl border border-gray-100 p-12 text-center">
  103. <div class="text-5xl text-gray-200 mb-4"><i class="fa-solid fa-camera"></i></div>
  104. <p class="text-gray-400 mb-4">今日暂无错题记录</p>
  105. <a href="/subjects" class="inline-flex items-center gap-2 bg-primary text-white px-5 py-2.5 rounded-xl text-sm font-medium hover:bg-indigo-600 transition">
  106. <i class="fa-solid fa-plus"></i>去添加错题
  107. </a>
  108. </div>
  109. {% endif %}
  110. </div>
  111. <!-- 快捷入口 -->
  112. <div class="grid grid-cols-4 gap-5">
  113. <a href="/subjects" class="bg-white rounded-2xl p-5 shadow-sm border border-gray-100 hover:shadow-md transition group">
  114. <div class="w-11 h-11 rounded-xl bg-indigo-50 flex items-center justify-center text-primary text-lg mb-3 group-hover:scale-110 transition">
  115. <i class="fa-solid fa-folder-plus"></i>
  116. </div>
  117. <p class="font-semibold text-gray-700 text-sm">管理科目</p>
  118. <p class="text-xs text-gray-400 mt-1">创建、编辑各科目录</p>
  119. </a>
  120. <a href="/timeline" class="bg-white rounded-2xl p-5 shadow-sm border border-gray-100 hover:shadow-md transition group">
  121. <div class="w-11 h-11 rounded-xl bg-pink-50 flex items-center justify-center text-accent text-lg mb-3 group-hover:scale-110 transition">
  122. <i class="fa-solid fa-clock-rotate-left"></i>
  123. </div>
  124. <p class="font-semibold text-gray-700 text-sm">时间线浏览</p>
  125. <p class="text-xs text-gray-400 mt-1">按日期查看所有错题</p>
  126. </a>
  127. <a href="/review" class="bg-white rounded-2xl p-5 shadow-sm border border-gray-100 hover:shadow-md transition group">
  128. <div class="w-11 h-11 rounded-xl bg-emerald-50 flex items-center justify-center text-emerald-500 text-lg mb-3 group-hover:scale-110 transition">
  129. <i class="fa-solid fa-bookmark"></i>
  130. </div>
  131. <p class="font-semibold text-gray-700 text-sm">复习汇总</p>
  132. <p class="text-xs text-gray-400 mt-1">期中/期末一键汇总</p>
  133. </a>
  134. <a href="/evaluations" class="bg-white rounded-2xl p-5 shadow-sm border border-gray-100 hover:shadow-md transition group">
  135. <div class="w-11 h-11 rounded-xl bg-amber-50 flex items-center justify-center text-amber-500 text-lg mb-3 group-hover:scale-110 transition">
  136. <i class="fa-solid fa-chart-line"></i>
  137. </div>
  138. <p class="font-semibold text-gray-700 text-sm">知识评价</p>
  139. <p class="text-xs text-gray-400 mt-1">记录老师定期评价</p>
  140. </a>
  141. </div>
  142. {% endblock %}
  143. {% block extra_js %}
  144. <script>
  145. {% for subject_id, imgs in today_images.items() %}
  146. const todayImg{{ subject_id }} = [
  147. {% for img in imgs %}{% if img.filename %}"/static/uploads/{{ img.filename }}",{% endif %}
  148. {% endfor %}
  149. ];
  150. {% endfor %}
  151. </script>
  152. {% endblock %}