index.html 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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. <div class="p-4 grid grid-cols-2 gap-3">
  73. {% for img in imgs[:4] %}
  74. <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 }})">
  75. <img src="/static/uploads/{{ img.filename }}" class="w-full h-full object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy">
  76. </div>
  77. {% endfor %}
  78. </div>
  79. <div class="px-5 py-2.5 bg-gray-50 border-t border-gray-100">
  80. <a href="/subject/{{ subject_id }}?date={{ today }}" class="text-xs text-primary font-medium hover:underline flex items-center gap-1">
  81. <i class="fa-solid fa-eye"></i>查看��整记录
  82. </a>
  83. </div>
  84. </div>
  85. {% endif %}
  86. {% endfor %}
  87. </div>
  88. {% else %}
  89. <div class="bg-white rounded-2xl border border-gray-100 p-12 text-center">
  90. <div class="text-5xl text-gray-200 mb-4"><i class="fa-solid fa-camera"></i></div>
  91. <p class="text-gray-400 mb-4">今日暂无错题记录</p>
  92. <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">
  93. <i class="fa-solid fa-plus"></i>去添加错题
  94. </a>
  95. </div>
  96. {% endif %}
  97. </div>
  98. <!-- 快捷入口 -->
  99. <div class="grid grid-cols-4 gap-5">
  100. <a href="/subjects" class="bg-white rounded-2xl p-5 shadow-sm border border-gray-100 hover:shadow-md transition group">
  101. <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">
  102. <i class="fa-solid fa-folder-plus"></i>
  103. </div>
  104. <p class="font-semibold text-gray-700 text-sm">管理科目</p>
  105. <p class="text-xs text-gray-400 mt-1">创建、编辑各科目录</p>
  106. </a>
  107. <a href="/timeline" class="bg-white rounded-2xl p-5 shadow-sm border border-gray-100 hover:shadow-md transition group">
  108. <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">
  109. <i class="fa-solid fa-clock-rotate-left"></i>
  110. </div>
  111. <p class="font-semibold text-gray-700 text-sm">时间线浏览</p>
  112. <p class="text-xs text-gray-400 mt-1">按日期查看所有错题</p>
  113. </a>
  114. <a href="/review" class="bg-white rounded-2xl p-5 shadow-sm border border-gray-100 hover:shadow-md transition group">
  115. <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">
  116. <i class="fa-solid fa-bookmark"></i>
  117. </div>
  118. <p class="font-semibold text-gray-700 text-sm">复习汇总</p>
  119. <p class="text-xs text-gray-400 mt-1">期中/期末一键汇总</p>
  120. </a>
  121. <a href="/evaluations" class="bg-white rounded-2xl p-5 shadow-sm border border-gray-100 hover:shadow-md transition group">
  122. <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">
  123. <i class="fa-solid fa-chart-line"></i>
  124. </div>
  125. <p class="font-semibold text-gray-700 text-sm">知识评价</p>
  126. <p class="text-xs text-gray-400 mt-1">记录老师定期评价</p>
  127. </a>
  128. </div>
  129. {% endblock %}
  130. {% block extra_js %}
  131. <script>
  132. {% for subject_id, imgs in today_images.items() %}
  133. const todayImg{{ subject_id }} = [
  134. {% for img in imgs %}" /static/uploads/{{ img.filename }}",{% endfor %}
  135. ];
  136. {% endfor %}
  137. </script>
  138. {% endblock %}