pdf_management.html 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. {% extends "layout.html" %}
  2. {% block title %}家谱管理 - 家谱管理系统{% endblock %}
  3. {% block extra_css %}
  4. <style>
  5. .pdf-card {
  6. cursor: pointer;
  7. transition: all 0.3s ease;
  8. border: 2px solid transparent;
  9. border-radius: 8px;
  10. }
  11. .pdf-card:hover {
  12. border-color: #0d6efd;
  13. box-shadow: 0 4px 16px rgba(13,110,253,0.18);
  14. transform: translateY(-2px);
  15. }
  16. .pdf-card.active {
  17. border-color: #0d6efd;
  18. background-color: #f0f6ff;
  19. }
  20. .pdf-card .card-body {
  21. padding: 16px;
  22. }
  23. .pdf-card-icon {
  24. font-size: 1.8rem;
  25. color: #dc3545;
  26. }
  27. .pdf-card-title {
  28. font-size: 0.95rem;
  29. font-weight: 600;
  30. line-height: 1.3;
  31. margin-bottom: 8px;
  32. }
  33. .pdf-card-meta {
  34. font-size: 0.75rem;
  35. color: #6c757d;
  36. line-height: 1.4;
  37. }
  38. .pdf-card-meta-item {
  39. display: flex;
  40. align-items: center;
  41. margin-bottom: 4px;
  42. }
  43. .pdf-card-meta-item i {
  44. font-size: 0.65rem;
  45. margin-right: 6px;
  46. width: 14px;
  47. text-align: center;
  48. }
  49. .pdf-viewer-wrapper {
  50. background: #e9ecef;
  51. border-radius: 8px;
  52. overflow: hidden;
  53. min-height: 80vh;
  54. }
  55. .pdf-viewer-wrapper iframe,
  56. .pdf-viewer-wrapper embed {
  57. width: 100%;
  58. min-height: 80vh;
  59. border: none;
  60. }
  61. .pdf-list-scroll {
  62. max-height: 300px;
  63. overflow-y: auto;
  64. }
  65. .pdf-detail-meta {
  66. display: flex;
  67. flex-wrap: wrap;
  68. gap: 16px;
  69. margin-top: 8px;
  70. padding-top: 12px;
  71. border-top: 1px solid #e9ecef;
  72. }
  73. .pdf-detail-meta-item {
  74. display: flex;
  75. align-items: center;
  76. font-size: 0.85rem;
  77. }
  78. .pdf-detail-meta-item i {
  79. color: #6c757d;
  80. margin-right: 8px;
  81. }
  82. </style>
  83. {% endblock %}
  84. {% block content %}
  85. <div class="d-flex justify-content-between align-items-center mb-4">
  86. <h2><i class="bi bi-book"></i> 家谱管理</h2>
  87. </div>
  88. {% if pdfs %}
  89. <div class="card shadow-sm mb-4">
  90. <div class="card-header bg-white py-2">
  91. <span class="fw-bold small text-muted">已上传家谱文件({{ pdfs|length }} 个)</span>
  92. </div>
  93. <div class="card-body p-2 pdf-list-scroll">
  94. <div class="row g-2">
  95. {% for pdf in pdfs %}
  96. <div class="col-md-3 col-sm-6">
  97. <div class="card pdf-card {{ 'active' if selected_pdf and selected_pdf.id == pdf.id }}"
  98. onclick="window.location.href='{{ url_for('pdf_management', view=pdf.id) }}'">
  99. <div class="card-body">
  100. <div class="d-flex align-items-start">
  101. <i class="bi bi-file-earmark-pdf pdf-card-icon me-3 flex-shrink-0"></i>
  102. <div class="flex-grow-1">
  103. <div class="pdf-card-title text-truncate" title="{{ pdf.file_name }}">{{ pdf.file_name }}</div>
  104. <div class="pdf-card-meta">
  105. {% if pdf.version_name %}
  106. <div class="pdf-card-meta-item">
  107. <i class="bi bi-tag"></i>
  108. <span>{{ pdf.version_name }}</span>
  109. </div>
  110. {% endif %}
  111. {% if pdf.version_source %}
  112. <div class="pdf-card-meta-item">
  113. <i class="bi bi-building"></i>
  114. <span>{{ pdf.version_source }}</span>
  115. </div>
  116. {% endif %}
  117. {% if pdf.file_provider %}
  118. <div class="pdf-card-meta-item">
  119. <i class="bi bi-person"></i>
  120. <span>{{ pdf.file_provider }}</span>
  121. </div>
  122. {% endif %}
  123. <div class="pdf-card-meta-item">
  124. <i class="bi bi-calendar"></i>
  125. <span>{{ pdf.upload_time.strftime('%Y-%m-%d') if pdf.upload_time else '未知' }}</span>
  126. </div>
  127. </div>
  128. </div>
  129. </div>
  130. </div>
  131. </div>
  132. </div>
  133. {% endfor %}
  134. </div>
  135. </div>
  136. </div>
  137. {% endif %}
  138. {% if selected_pdf %}
  139. <div class="card shadow-sm">
  140. <div class="card-header bg-white py-3">
  141. <div class="d-flex align-items-center mb-2">
  142. <i class="bi bi-file-earmark-pdf text-danger me-3 fs-5"></i>
  143. <h5 class="mb-0">{{ selected_pdf.file_name }}</h5>
  144. </div>
  145. <div class="pdf-detail-meta">
  146. {% if selected_pdf.version_name %}
  147. <div class="pdf-detail-meta-item">
  148. <i class="bi bi-tag"></i>
  149. <span><strong>版本名称:</strong>{{ selected_pdf.version_name }}</span>
  150. </div>
  151. {% endif %}
  152. {% if selected_pdf.version_source %}
  153. <div class="pdf-detail-meta-item">
  154. <i class="bi bi-building"></i>
  155. <span><strong>版本来源:</strong>{{ selected_pdf.version_source }}</span>
  156. </div>
  157. {% endif %}
  158. {% if selected_pdf.file_provider %}
  159. <div class="pdf-detail-meta-item">
  160. <i class="bi bi-person"></i>
  161. <span><strong>文件提供人:</strong>{{ selected_pdf.file_provider }}</span>
  162. </div>
  163. {% endif %}
  164. <div class="pdf-detail-meta-item">
  165. <i class="bi bi-calendar"></i>
  166. <span><strong>上传时间:</strong>{{ selected_pdf.upload_time.strftime('%Y-%m-%d %H:%M') if selected_pdf.upload_time else '未知' }}</span>
  167. </div>
  168. </div>
  169. <div class="d-flex gap-2 mt-3 justify-content-end">
  170. <a href="{{ selected_pdf.oss_url }}" target="_blank" class="btn btn-sm btn-outline-primary">
  171. <i class="bi bi-box-arrow-up-right"></i> 新窗口打开
  172. </a>
  173. <a href="{{ selected_pdf.oss_url }}" download class="btn btn-sm btn-outline-secondary">
  174. <i class="bi bi-download"></i> 下载
  175. </a>
  176. <form action="{{ url_for('delete_pdf', pdf_id=selected_pdf.id) }}" method="POST" class="d-inline"
  177. onsubmit="return confirm('确定要删除此PDF文件吗?此操作无法撤销。');">
  178. <button type="submit" class="btn btn-sm btn-outline-danger">
  179. <i class="bi bi-trash"></i> 删除
  180. </button>
  181. </form>
  182. </div>
  183. </div>
  184. <div class="card-body p-0">
  185. <div class="pdf-viewer-wrapper">
  186. <iframe id="pdfViewer" src="{{ selected_pdf.oss_url }}" type="application/pdf"></iframe>
  187. </div>
  188. </div>
  189. </div>
  190. {% elif not pdfs %}
  191. <div class="card shadow-sm">
  192. <div class="card-body text-center py-5 text-muted">
  193. <i class="bi bi-file-earmark-pdf fs-1 d-block mb-3 text-secondary"></i>
  194. <h5 class="text-secondary">暂无PDF家谱文件</h5>
  195. <p class="mb-3">在扫描件管理中上传PDF文件后,会自动添加到此处。</p>
  196. </div>
  197. </div>
  198. {% else %}
  199. <div class="card shadow-sm">
  200. <div class="card-body text-center py-5 text-muted">
  201. <i class="bi bi-hand-index-thumb fs-1 d-block mb-3"></i>
  202. <h5 class="text-secondary">请从上方选择一个PDF文件进行查看</h5>
  203. </div>
  204. </div>
  205. {% endif %}
  206. {% endblock %}