upload_pdf.html 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. {% extends "layout.html" %}
  2. {% block title %}上传家谱 - 家谱管理系统{% endblock %}
  3. {% block extra_css %}
  4. <style>
  5. .drop-shadow { filter: drop-shadow(0 0 4px rgba(0,0,0,0.5)); }
  6. </style>
  7. {% endblock %}
  8. {% block content %}
  9. <div class="row justify-content-center">
  10. <div class="col-md-8">
  11. <div class="card shadow">
  12. <div class="card-header bg-primary text-white">
  13. <h5 class="mb-0"><i class="bi bi-cloud-upload me-2"></i>上传家谱PDF文件</h5>
  14. </div>
  15. <div class="card-body p-4">
  16. <form method="POST" enctype="multipart/form-data" id="uploadForm">
  17. <div class="mb-4">
  18. <label class="form-label fw-bold">选择PDF文件</label>
  19. <input type="file" name="file" id="fileInput" class="form-control form-control-lg" accept=".pdf" required>
  20. <div class="form-text mt-2">
  21. 只支持PDF格式的家谱文件。上传后将显示在家谱管理列表中。
  22. </div>
  23. </div>
  24. <div class="row mb-4">
  25. <div class="col-md-4">
  26. <label class="form-label fw-bold">版本名称 <span class="text-danger">*</span></label>
  27. <input type="text" name="version_name" class="form-control" placeholder="如:衢州1926版" required>
  28. </div>
  29. <div class="col-md-4">
  30. <label class="form-label fw-bold">版本来源 <span class="text-danger">*</span></label>
  31. <input type="text" name="version_source" class="form-control" placeholder="如:留越收藏" required>
  32. </div>
  33. <div class="col-md-4">
  34. <label class="form-label fw-bold">文件提供人</label>
  35. <input type="text" name="file_provider" class="form-control" placeholder="默认:当前系统登录账号">
  36. </div>
  37. </div>
  38. <div class="alert alert-warning mb-4">
  39. <i class="bi bi-info-circle me-2"></i>
  40. 提示:文件将上传至云端 OSS 存储,处理过程可能需要几秒钟。
  41. </div>
  42. <div class="d-grid gap-2 d-md-flex justify-content-md-end">
  43. <a href="{{ url_for('pdf_management') }}" class="btn btn-light px-4">取消</a>
  44. <button type="submit" class="btn btn-primary px-5" id="submitBtn">
  45. <i class="bi bi-check-lg me-1"></i> 开始上传
  46. </button>
  47. </div>
  48. </form>
  49. </div>
  50. </div>
  51. </div>
  52. </div>
  53. {% endblock %}
  54. {% block extra_js %}
  55. <script>
  56. document.getElementById('uploadForm').addEventListener('submit', function(e) {
  57. // Prevent multiple submissions
  58. const btn = document.getElementById('submitBtn');
  59. if (btn.classList.contains('disabled')) {
  60. e.preventDefault();
  61. return;
  62. }
  63. // Show loading state without blocking submit
  64. btn.classList.add('disabled');
  65. btn.innerHTML = '<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> 上传处理中...';
  66. // Disable after a tiny delay to ensure form submission proceeds
  67. setTimeout(() => {
  68. btn.disabled = true;
  69. }, 10);
  70. });
  71. document.getElementById('fileInput').addEventListener('change', function(e) {
  72. let files = e.target.files;
  73. if (files.length > 1) {
  74. alert('一次只能上传1个PDF文件。');
  75. e.target.value = ''; // clear selection
  76. return;
  77. }
  78. if (files.length > 0) {
  79. const file = files[0];
  80. if (!file.name.toLowerCase().endsWith('.pdf')) {
  81. alert('只支持PDF文件上传。');
  82. e.target.value = ''; // clear selection
  83. return;
  84. }
  85. }
  86. });
  87. </script>
  88. {% endblock %}