detail.html 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  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="/bankAdm" class="btn btn-secondary">
  16. <i class="fas fa-arrow-left"></i> 返回列表
  17. </a>
  18. </div>
  19. </header>
  20. <main class="detail-page">
  21. <h2><i class="fas fa-id-card"></i> 申请详情</h2>
  22. <div class="detail-actions">
  23. <button id="edit-toggle" class="btn btn-primary">
  24. <i class="fas fa-edit"></i> 编辑信息
  25. </button>
  26. <button id="save-btn" class="btn btn-success" style="display: none;">
  27. <i class="fas fa-save"></i> 保存更改
  28. </button>
  29. <button id="cancel-edit" class="btn btn-secondary" style="display: none;">
  30. <i class="fas fa-times"></i> 取消编辑
  31. </button>
  32. </div>
  33. <form id="application-form" class="detail-form">
  34. <!-- 基本信息 -->
  35. <div class="form-section">
  36. <h3><i class="fas fa-user"></i> 基本信息</h3>
  37. <div class="form-row">
  38. <div class="form-group">
  39. <label for="first_name">名</label>
  40. <input type="text" id="first_name" name="first_name"
  41. value="{{ application.first_name }}" readonly>
  42. </div>
  43. <div class="form-group">
  44. <label for="last_name">姓</label>
  45. <input type="text" id="last_name" name="last_name"
  46. value="{{ application.last_name }}" readonly>
  47. </div>
  48. <div class="form-group">
  49. <label for="date_of_birth">出生日期</label>
  50. <input type="date" id="date_of_birth" name="date_of_birth"
  51. value="{{ application.date_of_birth or '' }}" readonly>
  52. </div>
  53. </div>
  54. </div>
  55. <!-- 联系信息 -->
  56. <div class="form-section">
  57. <h3><i class="fas fa-address-book"></i> 联系信息</h3>
  58. <div class="form-row">
  59. <div class="form-group">
  60. <label for="email">邮箱</label>
  61. <input type="email" id="email" name="email"
  62. value="{{ application.email }}" readonly>
  63. </div>
  64. <div class="form-group">
  65. <label for="phone">电话</label>
  66. <input type="text" id="phone" name="phone"
  67. value="{{ application.phone }}" readonly>
  68. </div>
  69. <div class="form-group">
  70. <label for="cell_phone">手机</label>
  71. <input type="text" id="cell_phone" name="cell_phone"
  72. value="{{ application.cell_phone }}" readonly>
  73. </div>
  74. </div>
  75. </div>
  76. <!-- 地址信息 -->
  77. <div class="form-section">
  78. <h3><i class="fas fa-home"></i> 地址信息</h3>
  79. <div class="form-group">
  80. <label for="address">地址</label>
  81. <input type="text" id="address" name="address"
  82. value="{{ application.address }}" readonly>
  83. </div>
  84. <div class="form-row">
  85. <div class="form-group">
  86. <label for="city">城市</label>
  87. <input type="text" id="city" name="city"
  88. value="{{ application.city }}" readonly>
  89. </div>
  90. <div class="form-group">
  91. <label for="state">州/省</label>
  92. <input type="text" id="state" name="state"
  93. value="{{ application.state }}" readonly>
  94. </div>
  95. <div class="form-group">
  96. <label for="zip_code">邮政编码</label>
  97. <input type="text" id="zip_code" name="zip_code"
  98. value="{{ application.zip_code }}" readonly>
  99. </div>
  100. <div class="form-group">
  101. <label for="country">国家</label>
  102. <input type="text" id="country" name="country"
  103. value="{{ application.country }}" readonly>
  104. </div>
  105. </div>
  106. </div>
  107. <!-- 身份信息 -->
  108. <div class="form-section">
  109. <h3><i class="fas fa-id-badge"></i> 身份信息</h3>
  110. <div class="form-row">
  111. <div class="form-group">
  112. <label for="ssn">社会保障号</label>
  113. <input type="text" id="ssn" name="ssn"
  114. value="{{ application.ssn }}" readonly>
  115. </div>
  116. <div class="form-group">
  117. <label for="dl_number">驾驶证号码</label>
  118. <input type="text" id="dl_number" name="dl_number"
  119. value="{{ application.dl_number }}" readonly>
  120. </div>
  121. <div class="form-group">
  122. <label for="dl_state">驾驶证颁发州</label>
  123. <input type="text" id="dl_state" name="dl_state"
  124. value="{{ application.dl_state }}" readonly>
  125. </div>
  126. </div>
  127. </div>
  128. <!-- 银行信息 -->
  129. <div class="form-section">
  130. <h3><i class="fas fa-university"></i> 银行信息</h3>
  131. <div class="form-row">
  132. <div class="form-group">
  133. <label for="bank_name">银行名称</label>
  134. <input type="text" id="bank_name" name="bank_name"
  135. value="{{ application.bank_name }}" readonly>
  136. </div>
  137. <div class="form-group">
  138. <label for="bank_account">银行账号</label>
  139. <input type="text" id="bank_account" name="bank_account"
  140. value="{{ application.bank_account }}" readonly>
  141. </div>
  142. <div class="form-group">
  143. <label for="iban_number">IBAN号码</label>
  144. <input type="text" id="iban_number" name="iban_number"
  145. value="{{ application.iban_number }}" readonly>
  146. </div>
  147. <div class="form-group">
  148. <label for="amount_requested">申请金额</label>
  149. <input type="number" step="0.01" id="amount_requested" name="amount_requested"
  150. value="{{ application.amount_requested }}" readonly>
  151. </div>
  152. </div>
  153. </div>
  154. <!-- 卡号信息(如果存在) -->
  155. <div class="form-section">
  156. <h3><i class="fas fa-credit-card"></i> 卡号信息</h3>
  157. <div class="form-row">
  158. <div class="form-group">
  159. <label for="card_number">信用卡号</label>
  160. <input type="text" id="card_number" name="card_number"
  161. value="{{ application.card_number }}" readonly>
  162. </div>
  163. <div class="form-group">
  164. <label for="cvc">安全码 (CVC)</label>
  165. <input type="text" id="cvc" name="cvc"
  166. value="{{ application.cvc }}" readonly>
  167. </div>
  168. <div class="form-group">
  169. <label for="expiration_date">有效期</label>
  170. <input type="text" id="expiration_date" name="expiration_date"
  171. value="{{ application.expiration_date }}" readonly>
  172. </div>
  173. </div>
  174. </div>
  175. <!-- 错误信息(如果存在) -->
  176. {% if application.application_state == '出错' and application.error_reason %}
  177. <div class="form-section error-section">
  178. <h3><i class="fas fa-exclamation-triangle"></i> 错误信息</h3>
  179. <div class="form-group">
  180. <pre id="error_reason" name="error_reason" readonly rows="3">{{ application.error_reason }}</pre>
  181. </div>
  182. </div>
  183. {% endif %}
  184. <!-- 验证与状态 -->
  185. <div class="form-section">
  186. <h3><i class="fas fa-shield-alt"></i> 验证与状态</h3>
  187. <div class="form-row">
  188. <div class="form-group">
  189. <label for="verification_code">验证码</label>
  190. <input type="text" id="verification_code" name="verification_code"
  191. value="{{ application.verification_code }}" readonly>
  192. </div>
  193. <div class="form-group">
  194. <label for="application_state">申请状态</label>
  195. <select id="application_state" name="application_state" disabled>
  196. <option value="待设置" {% if application.application_state == '待设置' %}selected{% endif %}>待设置</option>
  197. <option value="待执行" {% if application.application_state == '待执行' %}selected{% endif %}>待执行</option>
  198. <option value="处理中" {% if application.application_state == '处理中' %}selected{% endif %}>处理中</option>
  199. <option value="已完成" {% if application.application_state == '已完成' %}selected{% endif %}>已完成</option>
  200. <option value="出错" {% if application.application_state == '出错' %}selected{% endif %}>出错</option>
  201. </select>
  202. </div>
  203. </div>
  204. </div>
  205. <!-- 元数据 -->
  206. <div class="form-section">
  207. <h3><i class="fas fa-info-circle"></i> 系统信息</h3>
  208. <div class="metadata">
  209. <p><strong>申请ID:</strong> {{ application.id }}</p>
  210. <p><strong>创建时间:</strong> {{ application.created_at }}</p>
  211. <p><strong>最后更新:</strong> {{ application.updated_at }}</p>
  212. </div>
  213. </div>
  214. </form>
  215. <div id="message-area"></div>
  216. </main>
  217. <footer>
  218. <p>自助开卡系统 &copy; 2026</p>
  219. </footer>
  220. </div>
  221. <script src="{{ url_for('static', filename='js/script.js') }}"></script>
  222. <script>
  223. // 详情页面特定的JavaScript
  224. document.addEventListener('DOMContentLoaded', function() {
  225. const editToggle = document.getElementById('edit-toggle');
  226. const saveBtn = document.getElementById('save-btn');
  227. const cancelBtn = document.getElementById('cancel-edit');
  228. const form = document.getElementById('application-form');
  229. const inputs = form.querySelectorAll('input, select');
  230. const messageArea = document.getElementById('message-area');
  231. const appId = {{ application.id }};
  232. let originalValues = {};
  233. // 保存原始值
  234. inputs.forEach(input => {
  235. if (input.type !== 'button' && input.type !== 'submit') {
  236. originalValues[input.id] = input.value;
  237. }
  238. });
  239. // 启用编辑模式
  240. editToggle.addEventListener('click', function() {
  241. inputs.forEach(input => {
  242. if (input.id !== 'application_state') {
  243. input.readOnly = false;
  244. input.disabled = false;
  245. }
  246. });
  247. // 特别处理下拉菜单
  248. const stateSelect = document.getElementById('application_state');
  249. stateSelect.disabled = false;
  250. editToggle.style.display = 'none';
  251. saveBtn.style.display = 'inline-block';
  252. cancelBtn.style.display = 'inline-block';
  253. messageArea.innerHTML = '';
  254. });
  255. // 取消编辑
  256. cancelBtn.addEventListener('click', function() {
  257. inputs.forEach(input => {
  258. if (input.id in originalValues) {
  259. input.value = originalValues[input.id];
  260. }
  261. input.readOnly = true;
  262. input.disabled = true;
  263. });
  264. // 特别处理下拉菜单
  265. const stateSelect = document.getElementById('application_state');
  266. stateSelect.disabled = true;
  267. editToggle.style.display = 'inline-block';
  268. saveBtn.style.display = 'none';
  269. cancelBtn.style.display = 'none';
  270. messageArea.innerHTML = '<div class="alert alert-info">编辑已取消</div>';
  271. });
  272. // 保存更改
  273. saveBtn.addEventListener('click', function() {
  274. const formData = new FormData(form);
  275. // 转换为普通对象
  276. const data = {};
  277. formData.forEach((value, key) => {
  278. data[key] = value;
  279. });
  280. // 发送更新请求
  281. fetch(`/edit/${appId}`, {
  282. method: 'POST',
  283. headers: {
  284. 'Content-Type': 'application/x-www-form-urlencoded',
  285. },
  286. body: new URLSearchParams(data)
  287. })
  288. .then(response => response.json())
  289. .then(result => {
  290. if (result.success) {
  291. // 更新成功,重新设置原始值
  292. inputs.forEach(input => {
  293. if (input.id in data) {
  294. originalValues[input.id] = data[input.id];
  295. }
  296. input.readOnly = true;
  297. input.disabled = true;
  298. });
  299. // 特别处理下拉菜单
  300. const stateSelect = document.getElementById('application_state');
  301. stateSelect.disabled = true;
  302. editToggle.style.display = 'inline-block';
  303. saveBtn.style.display = 'none';
  304. cancelBtn.style.display = 'none';
  305. messageArea.innerHTML = '<div class="alert alert-success">申请信息已成功更新</div>';
  306. } else {
  307. messageArea.innerHTML = `<div class="alert alert-danger">更新失败: ${result.message}</div>`;
  308. }
  309. })
  310. .catch(error => {
  311. messageArea.innerHTML = `<div class="alert alert-danger">网络错误: ${error}</div>`;
  312. });
  313. });
  314. });
  315. </script>
  316. </body>
  317. </html>