import.html 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>批量导入 - 自助开卡系统</title>
  7. <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
  8. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
  9. </head>
  10. <body>
  11. <div class="container">
  12. <header>
  13. <h1><i class="fas fa-credit-card"></i> 自助开卡系统</h1>
  14. <div class="header-actions">
  15. <a href="/" class="btn btn-secondary">
  16. <i class="fas fa-arrow-left"></i> 返回列表
  17. </a>
  18. </div>
  19. </header>
  20. <main>
  21. <h2><i class="fas fa-file-import"></i> 批量导入开卡申请</h2>
  22. <div class="import-instructions">
  23. <div class="instruction-card">
  24. <h3><i class="fas fa-info-circle"></i> 导入说明</h3>
  25. <p>请上传包含开卡申请数据的CSV或TXT文件。文件格式要求:</p>
  26. <ul>
  27. <li>文件应为制表符或逗号分隔的文本文件</li>
  28. <li>每行包含一条完整的申请记录</li>
  29. <li>字段顺序应与示例数据一致</li>
  30. <li>系统会自动识别字段分隔符</li>
  31. </ul>
  32. <div class="sample-data">
  33. <h4><i class="fas fa-table"></i> 示例数据格式</h4>
  34. <pre>David Comstick 7801 caber way Antelope CA 95843 d.comstock@bellsouth.net 384209422 C88824C200 CA 9163323221 9163323221 5000 WELLS FARGO 93253120 657420543 USA SYHDUYE873</pre>
  35. <p class="note"><i class="fas fa-lightbulb"></i> 注意:字段顺序必须保持一致,空字段用空白表示</p>
  36. </div>
  37. </div>
  38. <div class="import-form-card">
  39. <h3><i class="fas fa-upload"></i> 上传文件</h3>
  40. <form id="import-form" enctype="multipart/form-data">
  41. <div class="form-group">
  42. <label for="file-input">选择文件</label>
  43. <input type="file" id="file-input" name="file" accept=".csv,.txt" required>
  44. <p class="file-help">支持CSV或TXT格式,最大16MB</p>
  45. </div>
  46. <div class="form-group">
  47. <button type="submit" class="btn btn-primary" id="import-btn">
  48. <i class="fas fa-upload"></i> 开始导入
  49. </button>
  50. <div id="loading-spinner" class="spinner" style="display: none;">
  51. <i class="fas fa-spinner fa-spin"></i> 正在导入,请稍候...
  52. </div>
  53. </div>
  54. </form>
  55. <div id="import-result" class="result-area"></div>
  56. </div>
  57. </div>
  58. <div class="back-to-home">
  59. <a href="/" class="btn btn-secondary">
  60. <i class="fas fa-home"></i> 返回首页
  61. </a>
  62. </div>
  63. </main>
  64. <footer>
  65. <p>自助开卡系统 &copy; 2026</p>
  66. </footer>
  67. </div>
  68. <script src="{{ url_for('static', filename='js/script.js') }}"></script>
  69. <script>
  70. // 导入页面特定的JavaScript
  71. document.addEventListener('DOMContentLoaded', function() {
  72. const importForm = document.getElementById('import-form');
  73. const fileInput = document.getElementById('file-input');
  74. const importBtn = document.getElementById('import-btn');
  75. const loadingSpinner = document.getElementById('loading-spinner');
  76. const resultArea = document.getElementById('import-result');
  77. importForm.addEventListener('submit', function(e) {
  78. e.preventDefault();
  79. const file = fileInput.files[0];
  80. if (!file) {
  81. resultArea.innerHTML = '<div class="alert alert-danger">请选择要上传的文件</div>';
  82. return;
  83. }
  84. // 检查文件类型
  85. const fileExt = file.name.split('.').pop().toLowerCase();
  86. if (!['csv', 'txt'].includes(fileExt)) {
  87. resultArea.innerHTML = '<div class="alert alert-danger">只支持CSV或TXT格式的文件</div>';
  88. return;
  89. }
  90. // 显示加载状态
  91. importBtn.disabled = true;
  92. loadingSpinner.style.display = 'block';
  93. resultArea.innerHTML = '';
  94. // 创建FormData对象
  95. const formData = new FormData();
  96. formData.append('file', file);
  97. // 发送上传请求
  98. fetch('/import', {
  99. method: 'POST',
  100. body: formData
  101. })
  102. .then(response => response.json())
  103. .then(result => {
  104. // 恢复按钮状态
  105. importBtn.disabled = false;
  106. loadingSpinner.style.display = 'none';
  107. if (result.success) {
  108. resultArea.innerHTML = `<div class="alert alert-success">
  109. <i class="fas fa-check-circle"></i> ${result.message}
  110. <p>3秒后自动返回首页...</p>
  111. </div>`;
  112. // 3秒后跳转回首页
  113. setTimeout(() => {
  114. window.location.href = '/';
  115. }, 3000);
  116. } else {
  117. resultArea.innerHTML = `<div class="alert alert-danger">
  118. <i class="fas fa-exclamation-circle"></i> ${result.message}
  119. </div>`;
  120. }
  121. })
  122. .catch(error => {
  123. // 恢复按钮状态
  124. importBtn.disabled = false;
  125. loadingSpinner.style.display = 'none';
  126. resultArea.innerHTML = `<div class="alert alert-danger">
  127. <i class="fas fa-exclamation-circle"></i> 上传失败: ${error}
  128. </div>`;
  129. });
  130. });
  131. });
  132. </script>
  133. </body>
  134. </html>