review.html 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. {% extends "base.html" %}
  2. {% block title %}复习汇总 - 满意错题本{% endblock %}
  3. {% block page_title %}复习汇总{% endblock %}
  4. {% block content %}
  5. <div class="flex items-center justify-between mb-6">
  6. <div class="flex items-center gap-4">
  7. <div class="w-10 h-10 rounded-xl bg-emerald-100 flex items-center justify-center text-emerald-600">
  8. <i class="fa-solid fa-graduation-cap text-lg"></i>
  9. </div>
  10. <div>
  11. <p class="text-sm font-semibold text-gray-700">期中/期末复习汇总</p>
  12. <p class="text-xs text-gray-400 mt-0.5">按日期排序所有错题,方便系统复习</p>
  13. </div>
  14. </div>
  15. <button onclick="window.print()" class="inline-flex items-center gap-2 bg-white border border-gray-200 text-gray-600 px-4 py-2 rounded-xl text-sm font-medium hover:bg-gray-50 transition">
  16. <i class="fa-solid fa-print"></i>打印
  17. </button>
  18. </div>
  19. {% if review_data %}
  20. <div class="space-y-8">
  21. {% for subject_id, data in review_data.items() %}
  22. {% set subject = data.subject %}
  23. <div>
  24. <!-- Subject header -->
  25. <div class="flex items-center gap-4 mb-4">
  26. <span class="w-4 h-4 rounded-full shadow-sm flex-shrink-0" style="background-color:{{ subject.color }};box-shadow:0 0 0 3px {{ subject.color }}20"></span>
  27. <h3 class="text-base font-bold text-gray-800">{{ subject.name }}</h3>
  28. <span class="text-xs text-gray-400 bg-gray-100 px-3 py-1 rounded-full">{{ data.images|length }} 张错题 · {{ data.dates|length }} 个日期</span>
  29. <a href="/subject/{{ subject_id }}" class="ml-auto text-xs text-primary hover:underline bg-indigo-50 px-3 py-1.5 rounded-lg flex items-center gap-1"><i class="fa-solid fa-pen"></i>管理</a>
  30. </div>
  31. <!-- Timeline of dates -->
  32. <div class="bg-white rounded-2xl border border-gray-100 overflow-hidden">
  33. {% for date_str in data.dates %}
  34. {% set day_images = [] %}
  35. {% for img in data.images if img.date == date_str %}{% set x = day_images.append(img) %}{% endfor %}
  36. <div class="{% if not loop.last %}border-b border-gray-50{% endif %}">
  37. {% set day_imgs = [] %}
  38. {% set day_txts = [] %}
  39. {% for img in day_images %}{% if img.filename %}{% set x = day_imgs.append(img) %}{% else %}{% set x = day_txts.append(img) %}{% endif %}{% endfor %}
  40. <div class="px-5 py-2.5 bg-gray-50 flex items-center gap-3">
  41. <i class="fa-regular fa-calendar text-gray-400 text-sm"></i>
  42. <span class="text-sm font-semibold text-gray-600">{{ date_str }}</span>
  43. <span class="text-xs text-gray-400">{{ day_imgs|length }} 张{% if day_txts %} · {{ day_txts|length }} 条文字{% endif %}</span>
  44. </div>
  45. {% if day_imgs %}
  46. <div class="p-4 grid grid-cols-5 gap-3">
  47. {% for img in day_imgs %}
  48. <div class="group relative aspect-[3/4] rounded-xl overflow-hidden bg-gray-100 cursor-pointer" onclick="openLightbox('/static/uploads/{{ img.filename }}','{{ img.original_name }}',reviewLb{{ subject_id }},{{ loop.index0 }})">
  49. <img src="/static/uploads/{{ img.filename }}" class="w-full h-full object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy">
  50. <div class="absolute inset-0 bg-black/0 group-hover:bg-black/20 transition"></div>
  51. <div class="absolute bottom-1.5 left-1.5 right-1.5">
  52. <p class="text-[10px] text-white/80 truncate px-1 py-0.5 bg-black/30 rounded">{{ img.original_name }}</p>
  53. </div>
  54. </div>
  55. {% endfor %}
  56. </div>
  57. {% endif %}
  58. {% if day_txts %}
  59. <div class="px-4 pb-3">
  60. <div class="flex items-center gap-2 mb-2">
  61. <span class="text-xs text-gray-400 flex items-center gap-1"><i class="fa-solid fa-keyboard"></i>{{ day_txts|length }} 条文字记录</span>
  62. </div>
  63. <div class="grid grid-cols-5 gap-3">
  64. {% for txt in day_txts %}
  65. <div class="rounded-xl overflow-hidden bg-violet-50 border border-violet-100 cursor-pointer hover:shadow-sm transition" onclick="toggleReviewAnswer(this)">
  66. <div class="p-3">
  67. <p class="text-xs font-medium text-gray-700 line-clamp-2 leading-relaxed">{{ txt.question[:40] }}</p>
  68. </div>
  69. <div class="review-answer hidden px-3 pb-3">
  70. <p class="text-[11px] text-gray-500 leading-relaxed">{{ txt.answer }}</p>
  71. </div>
  72. </div>
  73. {% endfor %}
  74. </div>
  75. </div>
  76. {% endif %}
  77. </div>
  78. {% endfor %}
  79. </div>
  80. </div>
  81. {% endfor %}
  82. </div>
  83. {% else %}
  84. <div class="bg-white rounded-2xl border border-gray-100 p-16 text-center">
  85. <div class="text-6xl text-gray-200 mb-4"><i class="fa-solid fa-book-open-reader"></i></div>
  86. <p class="text-gray-400 mb-2">暂无错题数据</p>
  87. <p class="text-sm text-gray-300 mb-6">上传错题后即可在此查看汇总</p>
  88. <a href="/subjects" class="inline-flex items-center gap-2 bg-primary text-white px-6 py-3 rounded-xl text-sm font-medium hover:bg-indigo-600 transition">
  89. <i class="fa-solid fa-plus"></i>先去添加错题
  90. </a>
  91. </div>
  92. {% endif %}
  93. {% endblock %}
  94. {% block extra_js %}
  95. <script>
  96. {% for subject_id, data in review_data.items() %}
  97. const reviewLb{{ subject_id }} = [
  98. {% for img in data.images %}{% if img.filename %}"/static/uploads/{{ img.filename }}",{% endif %}
  99. {% endfor %}
  100. ];
  101. {% endfor %}
  102. function toggleReviewAnswer(el) {
  103. var ans = el.querySelector('.review-answer');
  104. if (ans) ans.classList.toggle('hidden');
  105. }
  106. </script>
  107. {% endblock %}