diff --git a/dist/css/246.6342d496.css b/dist/css/11.e28a3037.css
similarity index 59%
rename from dist/css/246.6342d496.css
rename to dist/css/11.e28a3037.css
index 0726663..4f69d9c 100644
--- a/dist/css/246.6342d496.css
+++ b/dist/css/11.e28a3037.css
@@ -1 +1 @@
-.user-info-card[data-v-7c40ae87]{width:100%}.card-container[data-v-7c40ae87]{background-color:#fff;border-radius:12px;box-shadow:0 4px 20px rgba(0,0,0,.08);overflow:hidden;position:relative;transition:all .3s ease}.detail-header[data-v-7c40ae87]{position:relative;padding:20px 20px 4px;display:flex;align-items:flex-start}.header-bg[data-v-7c40ae87]{position:absolute;top:0;left:0;right:0;height:70px;background:linear-gradient(135deg,#3182ce,#63b3ed);opacity:.2}.avatar-wrapper[data-v-7c40ae87]{position:relative;margin-right:16px}.detail-avatar[data-v-7c40ae87]{width:80px;height:80px;border-radius:50%;-o-object-fit:cover;object-fit:cover;border:4px solid #fff;box-shadow:0 2px 10px rgba(0,0,0,.1);position:relative;z-index:1;background-color:#fff}.avatar-edit-overlay[data-v-7c40ae87]{position:absolute;bottom:0;right:0;background:rgba(49,130,206,.8);width:28px;height:28px;border-radius:50%;display:flex;justify-content:center;align-items:center;cursor:pointer;z-index:2;transition:all .2s ease;border:2px solid #fff}.avatar-edit-overlay[data-v-7c40ae87]:hover{background:#3182ce;transform:scale(1.1)}.detail-right[data-v-7c40ae87]{flex:1;position:relative;padding-top:8px}.detail-name-container[data-v-7c40ae87]{display:flex;align-items:center;gap:8px}.detail-name[data-v-7c40ae87]{font-weight:600;font-size:20px;color:#2d3748;margin-bottom:4px}.edit-btn[data-v-7c40ae87]{background:none;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:50%;transition:all .2s ease}.edit-btn[data-v-7c40ae87]:hover{background-color:#edf2f7}.edit-icon[data-v-7c40ae87]{font-style:normal;font-size:14px}.user-badges[data-v-7c40ae87]{display:flex;gap:6px;margin-top:16px}.badge[data-v-7c40ae87]{display:inline-block;padding:2px 8px;border-radius:4px;font-size:12px;color:#fff;font-weight:500}.verified[data-v-7c40ae87]{background-color:#3182ce}.invited[data-v-7c40ae87]{background-color:#f56565}.medal[data-v-7c40ae87]{background-color:#ecc94b;color:#744210}.user-sign-container[data-v-7c40ae87]{margin:16px 20px}.user-sign[data-v-7c40ae87]{display:flex;align-items:flex-start;gap:10px;padding:12px 16px;background-color:#f7fafc;border-radius:8px;position:relative}.sign-icon[data-v-7c40ae87]{font-size:16px;color:#718096;margin-top:2px}.sign-text[data-v-7c40ae87]{flex:1;font-size:14px;color:#4a5568;line-height:1.6;word-break:break-word;margin-top:3px}.user-email[data-v-7c40ae87]{display:flex;align-items:center;gap:10px;padding:8px 20px;margin:8px 20px;background-color:#f7fafc;border-radius:8px}.email-icon[data-v-7c40ae87]{font-size:16px;color:#718096}.email-text[data-v-7c40ae87]{font-size:14px;color:#4a5568}.user-stats[data-v-7c40ae87]{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;background-color:#f7fafc;margin:16px 20px;border-radius:8px}.stat-item[data-v-7c40ae87]{text-align:center;flex:1}.stat-separator[data-v-7c40ae87]{width:1px;height:28px;background-color:#e2e8f0}.stat-value[data-v-7c40ae87]{font-weight:600;font-size:18px;color:#2d3748}.stat-label[data-v-7c40ae87]{font-size:13px;color:#718096;margin-top:4px}.message-box[data-v-7c40ae87]{position:absolute;top:16px;left:50%;transform:translateX(-50%);width:80%;z-index:100;animation:messageSlideIn-7c40ae87 .3s ease}@keyframes messageSlideIn-7c40ae87{0%{opacity:0;transform:translate(-50%,-10px)}to{opacity:1;transform:translate(-50%)}}.message-content[data-v-7c40ae87]{padding:10px 16px;border-radius:6px;text-align:center;font-size:14px;color:#fff;box-shadow:0 2px 10px rgba(0,0,0,.1)}.success[data-v-7c40ae87]{background-color:#38a169}.error[data-v-7c40ae87]{background-color:#e53e3e}@media (max-width:640px){.detail-header[data-v-7c40ae87]{flex-direction:column;align-items:center;text-align:center;padding:20px 16px 4px}.avatar-wrapper[data-v-7c40ae87]{margin-right:0;margin-bottom:16px}.detail-name-container[data-v-7c40ae87]{justify-content:center}.user-badges[data-v-7c40ae87]{justify-content:center;margin-top:4px}}.coin-container[data-v-6b086920]{padding:24px;background-color:#fff;border-radius:12px;box-shadow:0 4px 16px rgba(0,0,0,.08)}.not-activated[data-v-6b086920]{text-align:center}.alert-info[data-v-6b086920]{background-color:#f0f7ff;border-left:4px solid #1890ff;padding:20px;border-radius:8px;margin-bottom:20px}.alert-info p[data-v-6b086920]{color:#2c3e50;font-size:16px;margin-bottom:16px}.coin-info[data-v-6b086920]{margin-bottom:24px;padding:20px;background:linear-gradient(135deg,#f6f8ff,#f0f7ff);border-radius:10px;border:1px solid #e6f0ff}.coin-info h3[data-v-6b086920]{color:#2c3e50;font-size:18px;margin:0}.coin-amount[data-v-6b086920]{font-weight:600;color:#ff9500;font-size:24px;margin:0 4px}.transactions h4[data-v-6b086920]{color:#2c3e50;font-size:18px;margin-bottom:16px;font-weight:500}.transaction-table[data-v-6b086920]{width:100%;border-collapse:separate;border-spacing:0;margin-bottom:24px;border-radius:8px;overflow:hidden;box-shadow:0 2px 8px rgba(0,0,0,.04)}.transaction-table td[data-v-6b086920],.transaction-table th[data-v-6b086920]{padding:16px;text-align:left;border-bottom:1px solid #edf2f7}.transaction-table th[data-v-6b086920]{background-color:#f8fafc;font-weight:600;color:#4a5568;font-size:14px;text-transform:uppercase;letter-spacing:.5px}.transaction-table tr[data-v-6b086920]:hover{background-color:#f8fafc;transition:background-color .2s ease}.transaction-table tr:last-child td[data-v-6b086920]{border-bottom:none}.credit[data-v-6b086920]{color:#38a169;font-weight:500}.debit[data-v-6b086920]{color:#e53e3e;font-weight:500}.pagination[data-v-6b086920]{display:flex;justify-content:center;align-items:center;margin-top:24px;gap:12px}.page-info[data-v-6b086920]{margin:0 16px;color:#4a5568;font-size:14px;font-weight:500}.no-records[data-v-6b086920]{text-align:center;padding:32px;color:#718096;background-color:#f8fafc;border-radius:8px;font-size:15px}.modal[data-v-6b086920]{display:flex;position:fixed;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.4);z-index:1000;justify-content:center;align-items:center;backdrop-filter:blur(4px)}.modal-content[data-v-6b086920]{background-color:#fff;border-radius:12px;width:90%;max-width:480px;box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04);transform:translateY(0);transition:transform .3s ease}.modal-header[data-v-6b086920]{display:flex;justify-content:space-between;align-items:center;padding:20px 24px;border-bottom:1px solid #edf2f7}.modal-header h3[data-v-6b086920]{color:#2d3748;font-size:18px;font-weight:600;margin:0}.close[data-v-6b086920]{font-size:24px;cursor:pointer;color:#a0aec0;transition:color .2s ease}.close[data-v-6b086920]:hover{color:#4a5568}.modal-body[data-v-6b086920]{padding:24px}.form-group[data-v-6b086920]{margin-bottom:20px}.form-group label[data-v-6b086920]{display:block;margin-bottom:8px;color:#4a5568;font-size:14px;font-weight:500}.input-group[data-v-6b086920]{display:flex;gap:12px}.input-group input[data-v-6b086920]{flex:1}.modal-message[data-v-6b086920]{margin:16px 0;padding:12px 16px;background-color:#f8fafc;border-left:4px solid #3182ce;color:#2d3748;font-size:14px;border-radius:4px}.verify-btn[data-v-6b086920]{width:100%;margin-top:20px}.btn[data-v-6b086920]{display:inline-flex;align-items:center;justify-content:center;padding:8px 16px;font-size:14px;font-weight:500;line-height:1.5;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;border:1px solid transparent;border-radius:6px;transition:all .2s ease}.btn[data-v-6b086920]:hover{transform:translateY(-1px);box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.btn[data-v-6b086920]:active{transform:translateY(0);box-shadow:none}.btn-primary[data-v-6b086920]{color:#fff;background-color:#3182ce;border-color:#3182ce}.btn-primary[data-v-6b086920]:hover{background-color:#2c5282;border-color:#2c5282}.btn-success[data-v-6b086920]{color:#fff;background-color:#38a169;border-color:#38a169}.btn-success[data-v-6b086920]:hover{background-color:#2f855a;border-color:#2f855a}.btn-outline-primary[data-v-6b086920]{color:#3182ce;background-color:transparent;border-color:#3182ce}.btn-outline-primary[data-v-6b086920]:hover{color:#fff;background-color:#3182ce}.btn-sm[data-v-6b086920]{padding:6px 12px;font-size:13px;border-radius:4px}.btn[data-v-6b086920]:disabled{opacity:.65;cursor:not-allowed;transform:none;box-shadow:none}.form-control[data-v-6b086920]{display:block;width:100%;padding:8px 12px;font-size:14px;line-height:1.5;color:#2d3748;background-color:#fff;border:1px solid #e2e8f0;border-radius:6px;transition:all .2s ease}.form-control[data-v-6b086920]:focus{border-color:#4299e1;box-shadow:0 0 0 3px rgba(66,153,225,.15);outline:none}.form-control[data-v-6b086920]::-moz-placeholder{color:#a0aec0}.form-control[data-v-6b086920]::placeholder{color:#a0aec0}@media (max-width:640px){.coin-container[data-v-6b086920]{padding:16px}.transaction-table td[data-v-6b086920],.transaction-table th[data-v-6b086920]{padding:12px;font-size:13px}.modal-content[data-v-6b086920]{width:95%;margin:16px}}.policy-notification[data-v-6b086920]{background-color:#fffbeb;border-left:4px solid #f59e0b;color:#92400e;padding:16px;border-radius:8px;margin-bottom:24px;font-size:15px;text-align:left}.submission-container[data-v-477e6a08]{background-color:#fff;border-radius:12px;box-shadow:0 4px 16px rgba(0,0,0,.08);padding:20px;margin-bottom:24px}.header[data-v-477e6a08]{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px;padding-bottom:16px;border-bottom:1px solid #e2e8f0}.title[data-v-477e6a08]{font-size:18px;font-weight:600;color:#2d3748;margin:0}.header-buttons[data-v-477e6a08]{display:flex;gap:12px}.key-manage-btn[data-v-477e6a08]{background-color:#6b7280;color:#fff;border:none;border-radius:6px;padding:8px 16px;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s ease}.key-manage-btn[data-v-477e6a08]:hover{background-color:#4b5563;transform:translateY(-1px);box-shadow:0 4px 6px -1px rgba(0,0,0,.1)}.manage-btn[data-v-477e6a08]{background-color:#3182ce;color:#fff;border:none;border-radius:6px;padding:8px 16px;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s ease}.manage-btn[data-v-477e6a08]:hover{background-color:#2c5282;transform:translateY(-1px);box-shadow:0 4px 6px -1px rgba(0,0,0,.1)}.submission-table-wrapper[data-v-477e6a08]{overflow-x:auto}.submission-table[data-v-477e6a08]{width:100%;border-collapse:separate;border-spacing:0;white-space:nowrap}.submission-table td[data-v-477e6a08],.submission-table th[data-v-477e6a08]{padding:12px 16px;text-align:left;border-bottom:1px solid #e2e8f0;font-size:14px}.submission-table th[data-v-477e6a08]{background-color:#f7fafc;color:#4a5568;font-weight:600;position:sticky;top:0}.submission-table tr:last-child td[data-v-477e6a08]{border-bottom:none}.submission-table tbody tr[data-v-477e6a08]{transition:background-color .2s ease}.submission-table tbody tr[data-v-477e6a08]:hover{background-color:#f7fafc}.clickable[data-v-477e6a08]{cursor:pointer;position:relative}.clickable[data-v-477e6a08]:hover{background-color:#ebf8ff!important}.clickable[data-v-477e6a08]:after{content:"";position:absolute;left:0;top:0;width:3px;height:100%;background-color:#3182ce}.title-cell[data-v-477e6a08]{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.empty-state[data-v-477e6a08]{padding:40px 20px;text-align:center;color:#718096;font-size:15px;background-color:#f7fafc;border-radius:8px}.pagination[data-v-477e6a08]{display:flex;justify-content:center;align-items:center;margin-top:20px;gap:12px}.page-btn[data-v-477e6a08]{background-color:#fff;border:1px solid #e2e8f0;color:#4a5568;padding:6px 12px;border-radius:6px;font-size:14px;cursor:pointer;transition:all .2s ease}.page-btn[data-v-477e6a08]:hover:not(:disabled){background-color:#f7fafc;border-color:#cbd5e0}.page-btn[data-v-477e6a08]:disabled{opacity:.5;cursor:not-allowed}.page-info[data-v-477e6a08]{color:#4a5568;font-size:14px;font-weight:500}.status-approved[data-v-477e6a08]{color:#38a169;background-color:#f0fff4;padding:4px 8px;border-radius:4px;font-weight:500;font-size:13px}.status-pending[data-v-477e6a08]{color:#d69e2e;background-color:#fffaf0;padding:4px 8px;border-radius:4px;font-weight:500;font-size:13px}.status-rejected[data-v-477e6a08]{color:#e53e3e;background-color:#fff5f5;padding:4px 8px;border-radius:4px;font-weight:500;font-size:13px}.edit-btn[data-v-477e6a08]{background-color:#4299e1;color:#fff;border:none;border-radius:4px;padding:4px 8px;font-size:13px;cursor:pointer;transition:all .2s ease}.edit-btn[data-v-477e6a08]:hover{background-color:#3182ce;transform:translateY(-1px);box-shadow:0 2px 4px rgba(0,0,0,.1)}.modal-overlay[data-v-477e6a08]{position:fixed;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.5);display:flex;justify-content:center;align-items:center;z-index:1000}.modal-content[data-v-477e6a08]{background-color:#fff;border-radius:12px;box-shadow:0 10px 25px -5px rgba(0,0,0,.15);width:90%;max-width:600px;max-height:80vh;overflow:hidden;display:flex;flex-direction:column}.modal-header[data-v-477e6a08]{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid #e2e8f0}.modal-header h3[data-v-477e6a08]{margin:0;font-size:18px;font-weight:600;color:#2d3748}.close-btn[data-v-477e6a08]{background:none;border:none;font-size:24px;color:#718096;cursor:pointer;transition:color .2s ease}.close-btn[data-v-477e6a08]:hover{color:#4a5568}.modal-body[data-v-477e6a08]{padding:20px;overflow-y:auto}.key-management-modal[data-v-477e6a08]{min-height:300px}.exchange-key-btn[data-v-477e6a08]{background-color:#3182ce;color:#fff;border:none;border-radius:6px;padding:8px 16px;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s ease;margin-bottom:20px}.exchange-key-btn[data-v-477e6a08]:hover{background-color:#2c5282;transform:translateY(-1px);box-shadow:0 4px 6px -1px rgba(0,0,0,.1)}.key-table-wrapper[data-v-477e6a08]{margin-top:16px;overflow-x:auto;width:100%}.key-table[data-v-477e6a08]{width:100%;min-width:500px;border-collapse:separate;border-spacing:0}.key-table td[data-v-477e6a08],.key-table th[data-v-477e6a08]{padding:12px 16px;text-align:left;border-bottom:1px solid #e2e8f0;font-size:14px}.key-table th[data-v-477e6a08]{background-color:#f7fafc;color:#4a5568;font-weight:600;position:sticky;top:0}.key-content[data-v-477e6a08]{display:flex;align-items:center;gap:10px}.toggle-visibility[data-v-477e6a08]{background:none;border:none;cursor:pointer;color:#718096;padding:4px;display:flex;align-items:center;justify-content:center;transition:color .2s ease}.toggle-visibility[data-v-477e6a08]:hover{color:#4a5568}.status-valid[data-v-477e6a08]{color:#38a169;background-color:#f0fff4}.status-invalid[data-v-477e6a08],.status-valid[data-v-477e6a08]{padding:4px 8px;border-radius:4px;font-weight:500;font-size:13px}.status-invalid[data-v-477e6a08]{color:#e53e3e;background-color:#fff5f5}.empty-keys[data-v-477e6a08],.loading-keys[data-v-477e6a08]{padding:40px 20px;text-align:center;color:#718096;font-size:15px;background-color:#f7fafc;border-radius:8px;margin-top:16px}.exchange-key-modal[data-v-477e6a08]{max-width:450px}.form-group[data-v-477e6a08]{margin-bottom:16px}.form-group label[data-v-477e6a08]{display:block;margin-bottom:8px;font-weight:500;color:#4a5568;font-size:14px}.form-group input[data-v-477e6a08]{width:100%;padding:10px 12px;border:1px solid #e2e8f0;border-radius:6px;font-size:14px;transition:border-color .2s ease}.form-group input[data-v-477e6a08]:focus{outline:none;border-color:#3182ce;box-shadow:0 0 0 3px rgba(66,153,225,.15)}.form-actions[data-v-477e6a08]{margin-top:24px;display:flex;justify-content:flex-end}.submit-btn[data-v-477e6a08]{background-color:#3182ce;color:#fff;border:none;border-radius:6px;padding:10px 20px;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s ease}.submit-btn[data-v-477e6a08]:hover:not(:disabled){background-color:#2c5282;transform:translateY(-1px);box-shadow:0 4px 6px -1px rgba(0,0,0,.1)}.submit-btn[data-v-477e6a08]:disabled{opacity:.5;cursor:not-allowed}@media (max-width:768px){.submission-container[data-v-477e6a08]{padding:16px}.header[data-v-477e6a08]{flex-direction:column;align-items:flex-start;gap:12px}.header-buttons[data-v-477e6a08]{display:flex;width:100%;justify-content:space-between}.key-manage-btn[data-v-477e6a08],.manage-btn[data-v-477e6a08]{flex:1}.modal-content[data-v-477e6a08]{width:95%;max-height:90vh}.key-table-wrapper[data-v-477e6a08]{margin:0 -10px;padding:0 10px;width:calc(100% + 20px)}.key-table td[data-v-477e6a08],.key-table th[data-v-477e6a08]{padding:10px 12px;font-size:13px;white-space:nowrap}}.user-center[data-v-c5320252]{min-height:100vh;background-color:#f4f7fa;padding-top:60px}.container[data-v-c5320252]{max-width:1200px;margin:0 auto;padding:24px 16px;display:flex;flex-direction:column;gap:24px}.login-required-container[data-v-c5320252]{display:flex;justify-content:center;align-items:center;height:calc(100vh - 200px)}.login-required-message[data-v-c5320252]{background-color:#fff;padding:30px 50px;border-radius:10px;box-shadow:0 4px 15px rgba(0,0,0,.1);text-align:center}.login-required-message h2[data-v-c5320252]{font-size:24px;color:#333;margin-bottom:10px}.login-required-message p[data-v-c5320252]{font-size:16px;color:#666}.upper-section[data-v-c5320252]{display:flex;gap:24px;flex-wrap:wrap}.coin-container[data-v-c5320252],.user-info-container[data-v-c5320252]{flex:1;min-width:300px}@media (min-width:769px){.upper-section[data-v-c5320252]{align-items:stretch}.coin-container[data-v-c5320252],.user-info-container[data-v-c5320252]{display:flex;flex-direction:column;height:350px}.coin-container[data-v-c5320252]>:first-child{flex:1;overflow-y:auto;display:flex;flex-direction:column}.coin-container[data-v-c5320252] ::-webkit-scrollbar{width:6px}.coin-container[data-v-c5320252] ::-webkit-scrollbar-track{background:#f1f1f1;border-radius:10px}.coin-container[data-v-c5320252] ::-webkit-scrollbar-thumb{background:#c1c1c1;border-radius:10px}.coin-container[data-v-c5320252] ::-webkit-scrollbar-thumb:hover{background:#a8a8a8}}.lower-section[data-v-c5320252]{width:100%}@media (max-width:768px){.upper-section[data-v-c5320252]{flex-direction:column}.coin-container[data-v-c5320252],.user-info-container[data-v-c5320252]{width:100%;height:auto}.container[data-v-c5320252]{padding:16px 12px}}.loading-container[data-v-c5320252]{display:flex;justify-content:center;align-items:center;height:calc(100vh - 60px)}.loading-spinner[data-v-c5320252]{padding:20px;background-color:#fff;border-radius:8px;box-shadow:0 4px 12px rgba(0,0,0,.1);font-size:16px;color:#3182ce}.user-center[data-v-c5320252]{transition:all .3s ease}@media (max-width:480px){.container[data-v-c5320252]{padding:12px 8px}}
\ No newline at end of file
+.user-info-card[data-v-7c40ae87]{width:100%}.card-container[data-v-7c40ae87]{background-color:#fff;border-radius:12px;box-shadow:0 4px 20px rgba(0,0,0,.08);overflow:hidden;position:relative;transition:all .3s ease}.detail-header[data-v-7c40ae87]{position:relative;padding:20px 20px 4px;display:flex;align-items:flex-start}.header-bg[data-v-7c40ae87]{position:absolute;top:0;left:0;right:0;height:70px;background:linear-gradient(135deg,#3182ce,#63b3ed);opacity:.2}.avatar-wrapper[data-v-7c40ae87]{position:relative;margin-right:16px}.detail-avatar[data-v-7c40ae87]{width:80px;height:80px;border-radius:50%;-o-object-fit:cover;object-fit:cover;border:4px solid #fff;box-shadow:0 2px 10px rgba(0,0,0,.1);position:relative;z-index:1;background-color:#fff}.avatar-edit-overlay[data-v-7c40ae87]{position:absolute;bottom:0;right:0;background:rgba(49,130,206,.8);width:28px;height:28px;border-radius:50%;display:flex;justify-content:center;align-items:center;cursor:pointer;z-index:2;transition:all .2s ease;border:2px solid #fff}.avatar-edit-overlay[data-v-7c40ae87]:hover{background:#3182ce;transform:scale(1.1)}.detail-right[data-v-7c40ae87]{flex:1;position:relative;padding-top:8px}.detail-name-container[data-v-7c40ae87]{display:flex;align-items:center;gap:8px}.detail-name[data-v-7c40ae87]{font-weight:600;font-size:20px;color:#2d3748;margin-bottom:4px}.edit-btn[data-v-7c40ae87]{background:none;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:50%;transition:all .2s ease}.edit-btn[data-v-7c40ae87]:hover{background-color:#edf2f7}.edit-icon[data-v-7c40ae87]{font-style:normal;font-size:14px}.user-badges[data-v-7c40ae87]{display:flex;gap:6px;margin-top:16px}.badge[data-v-7c40ae87]{display:inline-block;padding:2px 8px;border-radius:4px;font-size:12px;color:#fff;font-weight:500}.verified[data-v-7c40ae87]{background-color:#3182ce}.invited[data-v-7c40ae87]{background-color:#f56565}.medal[data-v-7c40ae87]{background-color:#ecc94b;color:#744210}.user-sign-container[data-v-7c40ae87]{margin:16px 20px}.user-sign[data-v-7c40ae87]{display:flex;align-items:flex-start;gap:10px;padding:12px 16px;background-color:#f7fafc;border-radius:8px;position:relative}.sign-icon[data-v-7c40ae87]{font-size:16px;color:#718096;margin-top:2px}.sign-text[data-v-7c40ae87]{flex:1;font-size:14px;color:#4a5568;line-height:1.6;word-break:break-word;margin-top:3px}.user-email[data-v-7c40ae87]{display:flex;align-items:center;gap:10px;padding:8px 20px;margin:8px 20px;background-color:#f7fafc;border-radius:8px}.email-icon[data-v-7c40ae87]{font-size:16px;color:#718096}.email-text[data-v-7c40ae87]{font-size:14px;color:#4a5568}.user-stats[data-v-7c40ae87]{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;background-color:#f7fafc;margin:16px 20px;border-radius:8px}.stat-item[data-v-7c40ae87]{text-align:center;flex:1}.stat-separator[data-v-7c40ae87]{width:1px;height:28px;background-color:#e2e8f0}.stat-value[data-v-7c40ae87]{font-weight:600;font-size:18px;color:#2d3748}.stat-label[data-v-7c40ae87]{font-size:13px;color:#718096;margin-top:4px}.message-box[data-v-7c40ae87]{position:absolute;top:16px;left:50%;transform:translateX(-50%);width:80%;z-index:100;animation:messageSlideIn-7c40ae87 .3s ease}@keyframes messageSlideIn-7c40ae87{0%{opacity:0;transform:translate(-50%,-10px)}to{opacity:1;transform:translate(-50%)}}.message-content[data-v-7c40ae87]{padding:10px 16px;border-radius:6px;text-align:center;font-size:14px;color:#fff;box-shadow:0 2px 10px rgba(0,0,0,.1)}.success[data-v-7c40ae87]{background-color:#38a169}.error[data-v-7c40ae87]{background-color:#e53e3e}@media (max-width:640px){.detail-header[data-v-7c40ae87]{flex-direction:column;align-items:center;text-align:center;padding:20px 16px 4px}.avatar-wrapper[data-v-7c40ae87]{margin-right:0;margin-bottom:16px}.detail-name-container[data-v-7c40ae87]{justify-content:center}.user-badges[data-v-7c40ae87]{justify-content:center;margin-top:4px}}.coin-container[data-v-6b086920]{padding:24px;background-color:#fff;border-radius:12px;box-shadow:0 4px 16px rgba(0,0,0,.08)}.not-activated[data-v-6b086920]{text-align:center}.alert-info[data-v-6b086920]{background-color:#f0f7ff;border-left:4px solid #1890ff;padding:20px;border-radius:8px;margin-bottom:20px}.alert-info p[data-v-6b086920]{color:#2c3e50;font-size:16px;margin-bottom:16px}.coin-info[data-v-6b086920]{margin-bottom:24px;padding:20px;background:linear-gradient(135deg,#f6f8ff,#f0f7ff);border-radius:10px;border:1px solid #e6f0ff}.coin-info h3[data-v-6b086920]{color:#2c3e50;font-size:18px;margin:0}.coin-amount[data-v-6b086920]{font-weight:600;color:#ff9500;font-size:24px;margin:0 4px}.transactions h4[data-v-6b086920]{color:#2c3e50;font-size:18px;margin-bottom:16px;font-weight:500}.transaction-table[data-v-6b086920]{width:100%;border-collapse:separate;border-spacing:0;margin-bottom:24px;border-radius:8px;overflow:hidden;box-shadow:0 2px 8px rgba(0,0,0,.04)}.transaction-table td[data-v-6b086920],.transaction-table th[data-v-6b086920]{padding:16px;text-align:left;border-bottom:1px solid #edf2f7}.transaction-table th[data-v-6b086920]{background-color:#f8fafc;font-weight:600;color:#4a5568;font-size:14px;text-transform:uppercase;letter-spacing:.5px}.transaction-table tr[data-v-6b086920]:hover{background-color:#f8fafc;transition:background-color .2s ease}.transaction-table tr:last-child td[data-v-6b086920]{border-bottom:none}.credit[data-v-6b086920]{color:#38a169;font-weight:500}.debit[data-v-6b086920]{color:#e53e3e;font-weight:500}.pagination[data-v-6b086920]{display:flex;justify-content:center;align-items:center;margin-top:24px;gap:12px}.page-info[data-v-6b086920]{margin:0 16px;color:#4a5568;font-size:14px;font-weight:500}.no-records[data-v-6b086920]{text-align:center;padding:32px;color:#718096;background-color:#f8fafc;border-radius:8px;font-size:15px}.modal[data-v-6b086920]{display:flex;position:fixed;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.4);z-index:1000;justify-content:center;align-items:center;backdrop-filter:blur(4px)}.modal-content[data-v-6b086920]{background-color:#fff;border-radius:12px;width:90%;max-width:480px;box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04);transform:translateY(0);transition:transform .3s ease}.modal-header[data-v-6b086920]{display:flex;justify-content:space-between;align-items:center;padding:20px 24px;border-bottom:1px solid #edf2f7}.modal-header h3[data-v-6b086920]{color:#2d3748;font-size:18px;font-weight:600;margin:0}.close[data-v-6b086920]{font-size:24px;cursor:pointer;color:#a0aec0;transition:color .2s ease}.close[data-v-6b086920]:hover{color:#4a5568}.modal-body[data-v-6b086920]{padding:24px}.form-group[data-v-6b086920]{margin-bottom:20px}.form-group label[data-v-6b086920]{display:block;margin-bottom:8px;color:#4a5568;font-size:14px;font-weight:500}.input-group[data-v-6b086920]{display:flex;gap:12px}.input-group input[data-v-6b086920]{flex:1}.modal-message[data-v-6b086920]{margin:16px 0;padding:12px 16px;background-color:#f8fafc;border-left:4px solid #3182ce;color:#2d3748;font-size:14px;border-radius:4px}.verify-btn[data-v-6b086920]{width:100%;margin-top:20px}.btn[data-v-6b086920]{display:inline-flex;align-items:center;justify-content:center;padding:8px 16px;font-size:14px;font-weight:500;line-height:1.5;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;border:1px solid transparent;border-radius:6px;transition:all .2s ease}.btn[data-v-6b086920]:hover{transform:translateY(-1px);box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.btn[data-v-6b086920]:active{transform:translateY(0);box-shadow:none}.btn-primary[data-v-6b086920]{color:#fff;background-color:#3182ce;border-color:#3182ce}.btn-primary[data-v-6b086920]:hover{background-color:#2c5282;border-color:#2c5282}.btn-success[data-v-6b086920]{color:#fff;background-color:#38a169;border-color:#38a169}.btn-success[data-v-6b086920]:hover{background-color:#2f855a;border-color:#2f855a}.btn-outline-primary[data-v-6b086920]{color:#3182ce;background-color:transparent;border-color:#3182ce}.btn-outline-primary[data-v-6b086920]:hover{color:#fff;background-color:#3182ce}.btn-sm[data-v-6b086920]{padding:6px 12px;font-size:13px;border-radius:4px}.btn[data-v-6b086920]:disabled{opacity:.65;cursor:not-allowed;transform:none;box-shadow:none}.form-control[data-v-6b086920]{display:block;width:100%;padding:8px 12px;font-size:14px;line-height:1.5;color:#2d3748;background-color:#fff;border:1px solid #e2e8f0;border-radius:6px;transition:all .2s ease}.form-control[data-v-6b086920]:focus{border-color:#4299e1;box-shadow:0 0 0 3px rgba(66,153,225,.15);outline:none}.form-control[data-v-6b086920]::-moz-placeholder{color:#a0aec0}.form-control[data-v-6b086920]::placeholder{color:#a0aec0}@media (max-width:640px){.coin-container[data-v-6b086920]{padding:16px}.transaction-table td[data-v-6b086920],.transaction-table th[data-v-6b086920]{padding:12px;font-size:13px}.modal-content[data-v-6b086920]{width:95%;margin:16px}}.policy-notification[data-v-6b086920]{background-color:#fffbeb;border-left:4px solid #f59e0b;color:#92400e;padding:16px;border-radius:8px;margin-bottom:24px;font-size:15px;text-align:left}.submission-container[data-v-03a6fef0]{background-color:#fff;border-radius:12px;box-shadow:0 4px 16px rgba(0,0,0,.08);padding:20px;margin-bottom:24px}.header[data-v-03a6fef0]{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px;padding-bottom:16px;border-bottom:1px solid #e2e8f0}.title[data-v-03a6fef0]{font-size:18px;font-weight:600;color:#2d3748;margin:0}.header-buttons[data-v-03a6fef0]{display:flex;gap:12px}.key-manage-btn[data-v-03a6fef0]{background-color:#6b7280;color:#fff;border:none;border-radius:6px;padding:8px 16px;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s ease}.key-manage-btn[data-v-03a6fef0]:hover{background-color:#4b5563;transform:translateY(-1px);box-shadow:0 4px 6px -1px rgba(0,0,0,.1)}.manage-btn[data-v-03a6fef0]{background-color:#3182ce;color:#fff;border:none;border-radius:6px;padding:8px 16px;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s ease}.manage-btn[data-v-03a6fef0]:hover{background-color:#2c5282;transform:translateY(-1px);box-shadow:0 4px 6px -1px rgba(0,0,0,.1)}.submission-table-wrapper[data-v-03a6fef0]{overflow-x:auto}.submission-table[data-v-03a6fef0]{width:100%;border-collapse:separate;border-spacing:0;white-space:nowrap}.submission-table td[data-v-03a6fef0],.submission-table th[data-v-03a6fef0]{padding:12px 16px;text-align:left;border-bottom:1px solid #e2e8f0;font-size:14px}.submission-table th[data-v-03a6fef0]{background-color:#f7fafc;color:#4a5568;font-weight:600;position:sticky;top:0}.submission-table tr:last-child td[data-v-03a6fef0]{border-bottom:none}.submission-table tbody tr[data-v-03a6fef0]{transition:background-color .2s ease}.submission-table tbody tr[data-v-03a6fef0]:hover{background-color:#f7fafc}.clickable[data-v-03a6fef0]{cursor:pointer;position:relative}.clickable[data-v-03a6fef0]:hover{background-color:#ebf8ff!important}.clickable[data-v-03a6fef0]:after{content:"";position:absolute;left:0;top:0;width:3px;height:100%;background-color:#3182ce}.title-cell[data-v-03a6fef0]{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.empty-state[data-v-03a6fef0]{padding:40px 20px;text-align:center;color:#718096;font-size:15px;background-color:#f7fafc;border-radius:8px}.pagination[data-v-03a6fef0]{display:flex;justify-content:center;align-items:center;margin-top:20px;gap:12px}.page-btn[data-v-03a6fef0]{background-color:#fff;border:1px solid #e2e8f0;color:#4a5568;padding:6px 12px;border-radius:6px;font-size:14px;cursor:pointer;transition:all .2s ease}.page-btn[data-v-03a6fef0]:hover:not(:disabled){background-color:#f7fafc;border-color:#cbd5e0}.page-btn[data-v-03a6fef0]:disabled{opacity:.5;cursor:not-allowed}.page-info[data-v-03a6fef0]{color:#4a5568;font-size:14px;font-weight:500}.status-approved[data-v-03a6fef0]{color:#38a169;background-color:#f0fff4;padding:4px 8px;border-radius:4px;font-weight:500;font-size:13px}.status-pending[data-v-03a6fef0]{color:#d69e2e;background-color:#fffaf0;padding:4px 8px;border-radius:4px;font-weight:500;font-size:13px}.status-rejected[data-v-03a6fef0]{color:#e53e3e;background-color:#fff5f5;padding:4px 8px;border-radius:4px;font-weight:500;font-size:13px}.edit-btn[data-v-03a6fef0]{background-color:#4299e1;color:#fff;border:none;border-radius:4px;padding:4px 8px;font-size:13px;cursor:pointer;transition:all .2s ease}.edit-btn[data-v-03a6fef0]:hover{background-color:#3182ce;transform:translateY(-1px);box-shadow:0 2px 4px rgba(0,0,0,.1)}.modal-overlay[data-v-03a6fef0]{position:fixed;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.5);display:flex;justify-content:center;align-items:center;z-index:1000}.modal-content[data-v-03a6fef0]{background-color:#fff;border-radius:12px;box-shadow:0 10px 25px -5px rgba(0,0,0,.15);width:90%;max-width:600px;max-height:80vh;overflow:hidden;display:flex;flex-direction:column}.modal-header[data-v-03a6fef0]{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid #e2e8f0}.modal-header h3[data-v-03a6fef0]{margin:0;font-size:18px;font-weight:600;color:#2d3748}.close-btn[data-v-03a6fef0]{background:none;border:none;font-size:24px;color:#718096;cursor:pointer;transition:color .2s ease}.close-btn[data-v-03a6fef0]:hover{color:#4a5568}.modal-body[data-v-03a6fef0]{padding:20px;overflow-y:auto}.key-management-modal[data-v-03a6fef0]{min-height:300px}.exchange-key-btn[data-v-03a6fef0]{background-color:#3182ce;color:#fff;border:none;border-radius:6px;padding:8px 16px;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s ease;margin-bottom:20px}.exchange-key-btn[data-v-03a6fef0]:hover{background-color:#2c5282;transform:translateY(-1px);box-shadow:0 4px 6px -1px rgba(0,0,0,.1)}.key-table-wrapper[data-v-03a6fef0]{overflow-x:auto;width:100%}.key-table[data-v-03a6fef0]{width:100%;min-width:500px;border-collapse:separate;border-spacing:0}.key-table td[data-v-03a6fef0],.key-table th[data-v-03a6fef0]{padding:12px 16px;text-align:left;border-bottom:1px solid #e2e8f0;font-size:14px}.key-table th[data-v-03a6fef0]{background-color:#f7fafc;color:#4a5568;font-weight:600;position:sticky;top:0}.key-content[data-v-03a6fef0]{display:flex;align-items:center;gap:10px}.toggle-visibility[data-v-03a6fef0]{background:none;border:none;cursor:pointer;color:#718096;padding:4px;display:flex;align-items:center;justify-content:center;transition:color .2s ease}.toggle-visibility[data-v-03a6fef0]:hover{color:#4a5568}.status-valid[data-v-03a6fef0]{color:#38a169;background-color:#f0fff4}.status-invalid[data-v-03a6fef0],.status-valid[data-v-03a6fef0]{padding:4px 8px;border-radius:4px;font-weight:500;font-size:13px}.status-invalid[data-v-03a6fef0]{color:#e53e3e;background-color:#fff5f5}.empty-keys[data-v-03a6fef0],.loading-keys[data-v-03a6fef0]{padding:40px 20px;text-align:center;color:#718096;font-size:15px;background-color:#f7fafc;border-radius:8px}.exchange-key-modal[data-v-03a6fef0]{max-width:450px}.form-group[data-v-03a6fef0]{margin-bottom:16px}.form-group label[data-v-03a6fef0]{display:block;margin-bottom:8px;font-weight:500;color:#4a5568;font-size:14px}.form-group input[data-v-03a6fef0]{width:100%;padding:10px 12px;border:1px solid #e2e8f0;border-radius:6px;font-size:14px;transition:border-color .2s ease}.form-group input[data-v-03a6fef0]:focus{outline:none;border-color:#3182ce;box-shadow:0 0 0 3px rgba(66,153,225,.15)}.form-actions[data-v-03a6fef0]{margin-top:24px;display:flex;justify-content:flex-end}.submit-btn[data-v-03a6fef0]{background-color:#3182ce;color:#fff;border:none;border-radius:6px;padding:10px 20px;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s ease}.submit-btn[data-v-03a6fef0]:hover:not(:disabled){background-color:#2c5282;transform:translateY(-1px);box-shadow:0 4px 6px -1px rgba(0,0,0,.1)}.submit-btn[data-v-03a6fef0]:disabled{opacity:.5;cursor:not-allowed}@media (max-width:768px){.submission-container[data-v-03a6fef0]{padding:16px}.header[data-v-03a6fef0]{flex-direction:column;align-items:flex-start;gap:12px}.header-buttons[data-v-03a6fef0]{display:flex;width:100%;justify-content:space-between}.key-manage-btn[data-v-03a6fef0],.manage-btn[data-v-03a6fef0]{flex:1}.modal-content[data-v-03a6fef0]{width:95%;max-height:90vh}.key-table-wrapper[data-v-03a6fef0]{margin:0 -10px;padding:0 10px;width:calc(100% + 20px)}.key-table td[data-v-03a6fef0],.key-table th[data-v-03a6fef0]{padding:10px 12px;font-size:13px;white-space:nowrap}}.user-center[data-v-c5320252]{min-height:100vh;background-color:#f4f7fa;padding-top:60px}.container[data-v-c5320252]{max-width:1200px;margin:0 auto;padding:24px 16px;display:flex;flex-direction:column;gap:24px}.login-required-container[data-v-c5320252]{display:flex;justify-content:center;align-items:center;height:calc(100vh - 200px)}.login-required-message[data-v-c5320252]{background-color:#fff;padding:30px 50px;border-radius:10px;box-shadow:0 4px 15px rgba(0,0,0,.1);text-align:center}.login-required-message h2[data-v-c5320252]{font-size:24px;color:#333;margin-bottom:10px}.login-required-message p[data-v-c5320252]{font-size:16px;color:#666}.upper-section[data-v-c5320252]{display:flex;gap:24px;flex-wrap:wrap}.coin-container[data-v-c5320252],.user-info-container[data-v-c5320252]{flex:1;min-width:300px}@media (min-width:769px){.upper-section[data-v-c5320252]{align-items:stretch}.coin-container[data-v-c5320252],.user-info-container[data-v-c5320252]{display:flex;flex-direction:column;height:350px}.coin-container[data-v-c5320252]>:first-child{flex:1;overflow-y:auto;display:flex;flex-direction:column}.coin-container[data-v-c5320252] ::-webkit-scrollbar{width:6px}.coin-container[data-v-c5320252] ::-webkit-scrollbar-track{background:#f1f1f1;border-radius:10px}.coin-container[data-v-c5320252] ::-webkit-scrollbar-thumb{background:#c1c1c1;border-radius:10px}.coin-container[data-v-c5320252] ::-webkit-scrollbar-thumb:hover{background:#a8a8a8}}.lower-section[data-v-c5320252]{width:100%}@media (max-width:768px){.upper-section[data-v-c5320252]{flex-direction:column}.coin-container[data-v-c5320252],.user-info-container[data-v-c5320252]{width:100%;height:auto}.container[data-v-c5320252]{padding:16px 12px}}.loading-container[data-v-c5320252]{display:flex;justify-content:center;align-items:center;height:calc(100vh - 60px)}.loading-spinner[data-v-c5320252]{padding:20px;background-color:#fff;border-radius:8px;box-shadow:0 4px 12px rgba(0,0,0,.1);font-size:16px;color:#3182ce}.user-center[data-v-c5320252]{transition:all .3s ease}@media (max-width:480px){.container[data-v-c5320252]{padding:12px 8px}}
\ No newline at end of file
diff --git a/dist/index.html b/dist/index.html
index 959959c..cfeebbd 100644
--- a/dist/index.html
+++ b/dist/index.html
@@ -1 +1 @@
-
NEU小站
\ No newline at end of file
+NEU小站
\ No newline at end of file
diff --git a/dist/js/11.b856e82b.js b/dist/js/11.b856e82b.js
new file mode 100644
index 0000000..61381d4
--- /dev/null
+++ b/dist/js/11.b856e82b.js
@@ -0,0 +1,2 @@
+"use strict";(self["webpackChunknewfront"]=self["webpackChunknewfront"]||[]).push([[11],{9011:function(e,t,s){s.r(t),s.d(t,{default:function(){return Ye}});var a=s(6768);const n={class:"user-center"},i={key:0,class:"loading-container"},o={key:1,class:"container"},r={class:"upper-section"},l={class:"user-info-container"},c={class:"coin-container"},d={class:"lower-section"},u={key:2,class:"login-required-container"};function h(e,t,s,h,g,k){const v=(0,a.g2)("Navbar"),m=(0,a.g2)("UserInfo"),p=(0,a.g2)("Coin"),L=(0,a.g2)("SubmissionList");return(0,a.uX)(),(0,a.CE)("div",n,[(0,a.bF)(v),g.isLoading?((0,a.uX)(),(0,a.CE)("div",i,t[0]||(t[0]=[(0,a.Lk)("div",{class:"loading-spinner"},"加载中...",-1)]))):g.isAuthenticated?((0,a.uX)(),(0,a.CE)("div",o,[(0,a.Lk)("div",r,[(0,a.Lk)("div",l,[(0,a.bF)(m,{ref:"userInfo"},null,512)]),(0,a.Lk)("div",c,[(0,a.bF)(p,{ref:"coin"},null,512)])]),(0,a.Lk)("div",d,[(0,a.bF)(L,{onManageWorks:k.handleManageWorks},null,8,["onManageWorks"])])])):((0,a.uX)(),(0,a.CE)("div",u,t[1]||(t[1]=[(0,a.Lk)("div",{class:"login-required-message"},[(0,a.Lk)("h2",null,"请先登录!"),(0,a.Lk)("p",null,"您需要登录后才能访问个人中心")],-1)])))])}s(4114);var g=s(3070),k=s(4232);const v={class:"user-info-card"},m={class:"card-container"},p={class:"detail-header"},L={class:"avatar-wrapper"},y=["src"],f={class:"detail-right"},b={class:"detail-name-container"},w={class:"detail-name"},C={class:"user-badges"},_=["title"],x=["title"],A={key:2,class:"badge medal"},E={class:"user-sign-container"},I={class:"user-sign"},M={class:"sign-text"},P={class:"user-email"},S={class:"email-text"},$={class:"user-stats"},K={class:"stat-item"},X={class:"stat-value"},T={class:"stat-item"},j={class:"stat-value"},F={class:"stat-item"},z={class:"stat-value"},D={key:0,class:"message-box"};function O(e,t,s,n,i,o){return(0,a.uX)(),(0,a.CE)("div",v,[(0,a.Lk)("div",m,[(0,a.Lk)("div",p,[t[6]||(t[6]=(0,a.Lk)("div",{class:"header-bg"},null,-1)),(0,a.Lk)("div",L,[(0,a.Lk)("img",{src:i.userInfo.avatar_path,alt:"用户头像",class:"detail-avatar"},null,8,y),(0,a.Lk)("div",{class:"avatar-edit-overlay",onClick:t[0]||(t[0]=(...e)=>o.triggerFileInput&&o.triggerFileInput(...e))},t[4]||(t[4]=[(0,a.Lk)("i",{class:"edit-icon"},"📷",-1)])),(0,a.Lk)("input",{type:"file",ref:"fileInput",style:{display:"none"},accept:"image/jpeg, image/png, image/gif",onChange:t[1]||(t[1]=(...e)=>o.uploadAvatar&&o.uploadAvatar(...e))},null,544)]),(0,a.Lk)("div",f,[(0,a.Lk)("div",b,[(0,a.Lk)("div",w,(0,k.v_)(i.userInfo.nickname),1),(0,a.Lk)("button",{class:"edit-btn",onClick:t[2]||(t[2]=(...e)=>o.editNickname&&o.editNickname(...e)),title:"修改昵称"},t[5]||(t[5]=[(0,a.Lk)("i",{class:"edit-icon"},"✏️",-1)]))]),(0,a.Lk)("div",C,[i.userInfo.verified?((0,a.uX)(),(0,a.CE)("span",{key:0,class:"badge verified",title:i.userInfo.verified},"认证",8,_)):(0,a.Q3)("",!0),i.userInfo.invited?((0,a.uX)(),(0,a.CE)("span",{key:1,class:"badge invited",title:i.userInfo.invited},"特邀",8,x)):(0,a.Q3)("",!0),i.userInfo.medal?((0,a.uX)(),(0,a.CE)("span",A,"小站奖章")):(0,a.Q3)("",!0)])])]),(0,a.Lk)("div",E,[(0,a.Lk)("div",I,[t[8]||(t[8]=(0,a.Lk)("div",{class:"sign-icon"},"✍️",-1)),(0,a.Lk)("div",M,(0,k.v_)(i.userInfo.sign||"这个人很懒,还没有写个性签名~"),1),(0,a.Lk)("button",{class:"edit-btn",onClick:t[3]||(t[3]=(...e)=>o.editSign&&o.editSign(...e)),title:"修改签名"},t[7]||(t[7]=[(0,a.Lk)("i",{class:"edit-icon"},"✏️",-1)]))])]),(0,a.Lk)("div",P,[t[9]||(t[9]=(0,a.Lk)("div",{class:"email-icon"},"📧",-1)),(0,a.Lk)("div",S,(0,k.v_)(i.userInfo.email),1)]),(0,a.Lk)("div",$,[(0,a.Lk)("div",K,[(0,a.Lk)("div",X,(0,k.v_)(i.userInfo.follower||0),1),t[10]||(t[10]=(0,a.Lk)("div",{class:"stat-label"},"粉丝",-1))]),t[13]||(t[13]=(0,a.Lk)("div",{class:"stat-separator"},null,-1)),(0,a.Lk)("div",T,[(0,a.Lk)("div",j,(0,k.v_)(i.userInfo.following||0),1),t[11]||(t[11]=(0,a.Lk)("div",{class:"stat-label"},"关注",-1))]),t[14]||(t[14]=(0,a.Lk)("div",{class:"stat-separator"},null,-1)),(0,a.Lk)("div",F,[(0,a.Lk)("div",z,(0,k.v_)(i.userInfo.coin||"未激活"),1),t[12]||(t[12]=(0,a.Lk)("div",{class:"stat-label"},"东币",-1))])]),i.message.show?((0,a.uX)(),(0,a.CE)("div",D,[(0,a.Lk)("div",{class:(0,k.C4)(["message-content",i.message.type])},(0,k.v_)(i.message.text),3)])):(0,a.Q3)("",!0)])])}var N=s(8704),U=s(6253),q={name:"UserInfo",data(){return{userInfo:{id:"",nickname:"加载中...",verified:null,invited:null,medal:!1,avatar_path:"",email:"",sign:"",follower:0,following:0,coin:0},message:{show:!1,text:"",type:"success",timer:null}}},created(){this.fetchUserInfo()},methods:{async fetchUserInfo(){try{const e=N.A.get("token");if(!e)return void this.showMessage("未登录或登录已过期","error");const t=await fetch("https://newfront.xn--xhq44jb2fzpc.com/user/info",{method:"GET",headers:{Authorization:e}});if(!t.ok)throw new Error("获取用户信息失败");const s=await t.json();this.userInfo=s}catch(e){console.error("获取用户信息出错:",e),this.showMessage("获取用户信息失败","error")}},triggerFileInput(){this.$refs.fileInput.click()},async uploadAvatar(e){const t=e.target.files[0];if(!t)return void this.showMessage("请选择一个文件","error");if(t.size>1048576)return void this.showMessage("头像必须小于1MB","error");const s=N.A.get("token");if(s)try{const e=new FormData;e.append("avatar",t);const a=await fetch("https://userlogin.xn--xhq44jb2fzpc.com/avatar/upload",{method:"POST",headers:{Authorization:s},body:e});if(a.ok){const e=await a.json();this.userInfo.avatar_path=e.avatarUrl,this.showMessage("头像上传成功","success")}else 401===a.status||403===a.status?this.showMessage("权限错误,请重新登录后再试","error"):this.showMessage("上传失败,请稍后再试","error")}catch(a){console.error("头像上传错误:",a),this.showMessage("上传过程中发生错误","error")}else this.showMessage("请先登录,再上传头像","error")},async editNickname(){const e=N.A.get("token");e?(0,U.A)({title:"修改昵称",message:"请输入新的昵称:",showInput:!0,inputPlaceholder:"请输入新昵称",inputValue:this.userInfo.nickname,confirmText:"确认",cancelText:"取消",cancel:!0}).then((async({value:t})=>{if(null!==t&&""!==t.trim())try{const s=await fetch("https://userlogin.xn--xhq44jb2fzpc.com/avatar/edit-nickname",{method:"POST",headers:{"Content-Type":"application/json",Authorization:e},body:JSON.stringify({nickname:t.trim()})});if(s.ok){await s.json();this.userInfo.nickname=t.trim(),this.showMessage("昵称修改成功","success")}else{const e=await s.json();this.showMessage(`修改昵称失败:${e.message}`,"error")}}catch(s){console.error("修改昵称错误:",s),this.showMessage("发生错误,请稍后再试","error")}else this.showMessage("昵称不能为空","error")})).catch((()=>{})):this.showMessage("您尚未登录,请登录后再尝试修改昵称","error")},async editSign(){const e=N.A.get("token");if(!e)return void this.showMessage("您尚未登录,请登录后再尝试修改签名","error");const t=this.userInfo.sign||"";(0,U.A)({title:"修改个性签名",message:"请输入新的个性签名 (最多20个汉字,留空表示删除个性签名):",showInput:!0,inputValue:t,inputPlaceholder:"请输入个性签名",confirmText:"确认",cancelText:"取消",cancel:!0}).then((async({value:t})=>{if(null!==t)try{const s=await fetch("https://newfront.xn--xhq44jb2fzpc.com/user/sign",{method:"POST",headers:{"Content-Type":"application/json",Authorization:e},body:JSON.stringify({sign:t.trim()})});if(s.ok)this.userInfo.sign=t.trim(),this.showMessage("个性签名修改成功","success");else{const e=await s.json();this.showMessage(`修改签名失败:${e.message}`,"error")}}catch(s){console.error("修改签名错误:",s),this.showMessage("发生错误,请稍后再试","error")}})).catch((()=>{}))},showMessage(e,t="success"){this.message.timer&&clearTimeout(this.message.timer),this.message.show=!0,this.message.text=e,this.message.type=t,this.message.timer=setTimeout((()=>{this.message.show=!1}),3e3)}}},Q=s(1241);const W=(0,Q.A)(q,[["render",O],["__scopeId","data-v-7c40ae87"]]);var B=W;const J={class:"coin-container"},V={key:0,class:"not-activated"},G={class:"alert alert-warning policy-notification"},H={key:1,class:"activated"},Y={class:"alert alert-warning policy-notification"},R={class:"coin-info"},Z={class:"coin-amount"},ee={class:"transactions"},te={key:0,class:"no-records"},se={key:1,class:"transaction-table"},ae={key:2,class:"pagination"},ne=["disabled"],ie={class:"page-info"},oe=["disabled"];function re(e,t,s,n,i,o){return(0,a.uX)(),(0,a.CE)("div",J,[i.isActivated?((0,a.uX)(),(0,a.CE)("div",H,[(0,a.Lk)("div",Y,(0,k.v_)(i.policyNotification),1),(0,a.Lk)("div",R,[(0,a.Lk)("h3",null,[t[3]||(t[3]=(0,a.eW)("您当前拥有 ")),(0,a.Lk)("span",Z,(0,k.v_)(i.coinAmount),1),t[4]||(t[4]=(0,a.eW)(" 枚东币"))])]),(0,a.Lk)("div",ee,[0===i.transactions.length?((0,a.uX)(),(0,a.CE)("div",te," 暂无交易记录 ")):((0,a.uX)(),(0,a.CE)("table",se,[t[5]||(t[5]=(0,a.Lk)("thead",null,[(0,a.Lk)("tr",null,[(0,a.Lk)("th",null,"时间"),(0,a.Lk)("th",null,"金额"),(0,a.Lk)("th",null,"备注")])],-1)),(0,a.Lk)("tbody",null,[((0,a.uX)(!0),(0,a.CE)(a.FK,null,(0,a.pI)(i.transactions,(e=>((0,a.uX)(),(0,a.CE)("tr",{key:e.id},[(0,a.Lk)("td",null,(0,k.v_)(o.formatDate(e.created_at)),1),(0,a.Lk)("td",{class:(0,k.C4)({credit:"credit"===e.type,debit:"debit"===e.type})},(0,k.v_)("credit"===e.type?"+":"-")+(0,k.v_)(e.amount),3),(0,a.Lk)("td",null,(0,k.v_)(e.note),1)])))),128))])])),i.totalPages>1?((0,a.uX)(),(0,a.CE)("div",ae,[(0,a.Lk)("button",{disabled:1===i.currentPage,onClick:t[0]||(t[0]=e=>o.loadTransactions(i.currentPage-1)),class:"btn btn-sm btn-outline-primary"}," 上一页 ",8,ne),(0,a.Lk)("span",ie,(0,k.v_)(i.currentPage)+" / "+(0,k.v_)(i.totalPages),1),(0,a.Lk)("button",{disabled:i.currentPage===i.totalPages,onClick:t[1]||(t[1]=e=>o.loadTransactions(i.currentPage+1)),class:"btn btn-sm btn-outline-primary"}," 下一页 ",8,oe)])):(0,a.Q3)("",!0)])])):((0,a.uX)(),(0,a.CE)("div",V,[(0,a.Lk)("div",G,(0,k.v_)(i.policyNotification),1),t[2]||(t[2]=(0,a.Lk)("div",{class:"alert alert-info"},[(0,a.Lk)("p",null,"东币系统在账号完成校园验证后自动激活。")],-1))]))])}var le={name:"CoinComponent",data(){return{isActivated:!1,coinAmount:0,transactions:[],currentPage:1,totalPages:1,policyNotification:"由于政策原因,短信验证码服务已于2025.4.13下线,后续东币系统将在校园验证通过后自动激活。之前已完成校园验证但未手动激活东币系统的用户,系统已为您自动激活东币系统。"}},created(){this.loadTransactions(1)},methods:{async loadTransactions(e){try{const t=N.A.get("token");if(!t)return console.error("未找到登录token"),void(this.isActivated=!1);const s=await fetch("https://newfront.xn--xhq44jb2fzpc.com/coin/transactions",{method:"POST",headers:{Authorization:t,"Content-Type":"application/json"},body:JSON.stringify({page_num:e})}),a=await s.json();if(s.ok)this.isActivated=!0,this.coinAmount=a.coinAmount,this.transactions=a.transactions,this.currentPage=a.current_page,this.totalPages=a.total_pages;else{if(403!==s.status||"用户未激活东币系统"!==a.message)throw new Error(a.message||"获取交易记录失败");this.isActivated=!1,this.coinAmount=0,this.transactions=[]}}catch(t){console.error("获取交易记录出错:",t),this.isActivated=!1}},formatDate(e){const t=new Date(e);return`${t.getFullYear()}/${t.getMonth()+1}/${t.getDate()} ${t.getHours()}:${String(t.getMinutes()).padStart(2,"0")}:${String(t.getSeconds()).padStart(2,"0")}`}}};const ce=(0,Q.A)(le,[["render",re],["__scopeId","data-v-6b086920"]]);var de=ce,ue=s(5130);const he={class:"submission-container"},ge={class:"header"},ke={class:"header-buttons"},ve={class:"modal-content key-management-modal"},me={class:"modal-header"},pe={class:"modal-body"},Le={key:0,class:"key-table-wrapper"},ye={class:"key-table"},fe={class:"key-cell"},be={class:"key-content"},we=["onClick"],Ce={key:0,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"black","stroke-linecap":"round","stroke-linejoin":"round",width:"24",height:"24","stroke-width":"1.1"},_e={key:1,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"black","stroke-linecap":"round","stroke-linejoin":"round",width:"24",height:"24","stroke-width":"1.1"},xe={key:1,class:"loading-keys"},Ae={key:2,class:"empty-keys"},Ee={class:"modal-content exchange-key-modal"},Ie={class:"modal-header"},Me={class:"modal-body"},Pe={class:"form-group"},Se={class:"form-group"},$e={class:"form-actions"},Ke=["disabled"],Xe={class:"submission-table-wrapper"},Te={key:0,class:"submission-table"},je=["onClick"],Fe={class:"title-cell"},ze=["onClick"],De={key:1,class:"empty-state"},Oe={key:2,class:"pagination"},Ne=["disabled"],Ue={class:"page-info"},qe=["disabled"];function Qe(e,t,s,n,i,o){return(0,a.uX)(),(0,a.CE)("div",he,[(0,a.Lk)("div",ge,[t[12]||(t[12]=(0,a.Lk)("h3",{class:"title"},"我的投稿记录",-1)),(0,a.Lk)("div",ke,[(0,a.Lk)("button",{class:"key-manage-btn",onClick:t[0]||(t[0]=e=>i.showKeyManagement=!0)},"密钥管理"),(0,a.Lk)("button",{class:"manage-btn",onClick:t[1]||(t[1]=(...e)=>o.handleManage&&o.handleManage(...e))},"我要投稿")])]),i.showKeyManagement?((0,a.uX)(),(0,a.CE)("div",{key:0,class:"modal-overlay",onClick:t[4]||(t[4]=(0,ue.D$)((e=>i.showKeyManagement=!1),["self"]))},[(0,a.Lk)("div",ve,[(0,a.Lk)("div",me,[t[13]||(t[13]=(0,a.Lk)("h3",null,"密钥管理",-1)),(0,a.Lk)("button",{class:"close-btn",onClick:t[2]||(t[2]=e=>i.showKeyManagement=!1)},"×")]),(0,a.Lk)("div",pe,[(0,a.Lk)("button",{class:"exchange-key-btn",onClick:t[3]||(t[3]=e=>i.showExchangeKey=!0)},"兑换密钥"),i.keyList.length>0?((0,a.uX)(),(0,a.CE)("div",Le,[(0,a.Lk)("table",ye,[t[16]||(t[16]=(0,a.Lk)("thead",null,[(0,a.Lk)("tr",null,[(0,a.Lk)("th",null,"密钥"),(0,a.Lk)("th",null,"状态"),(0,a.Lk)("th",null,"创建时间"),(0,a.Lk)("th",null,"最后使用时间")])],-1)),(0,a.Lk)("tbody",null,[((0,a.uX)(!0),(0,a.CE)(a.FK,null,(0,a.pI)(i.keyList,((e,s)=>((0,a.uX)(),(0,a.CE)("tr",{key:s},[(0,a.Lk)("td",fe,[(0,a.Lk)("div",be,[(0,a.Lk)("span",null,(0,k.v_)(i.visibleKeyIndex===s?e.key_plaintext:"******"),1),(0,a.Lk)("button",{class:"toggle-visibility",onClick:e=>o.toggleKeyVisibility(s)},[i.visibleKeyIndex!==s?((0,a.uX)(),(0,a.CE)("svg",Ce,t[14]||(t[14]=[(0,a.Lk)("path",{d:"M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0"},null,-1),(0,a.Lk)("path",{d:"M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6"},null,-1)]))):((0,a.uX)(),(0,a.CE)("svg",_e,t[15]||(t[15]=[(0,a.Lk)("path",{d:"M10.585 10.587a2 2 0 0 0 2.829 2.828"},null,-1),(0,a.Lk)("path",{d:"M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87"},null,-1),(0,a.Lk)("path",{d:"M3 3l18 18"},null,-1)])))],8,we)])]),(0,a.Lk)("td",null,[(0,a.Lk)("span",{class:(0,k.C4)(e.is_valid?"status-valid":"status-invalid")},(0,k.v_)(e.is_valid?"有效":"无效"),3)]),(0,a.Lk)("td",null,(0,k.v_)(o.formatDate(e.created_at)),1),(0,a.Lk)("td",null,(0,k.v_)(e.last_used_at?o.formatDate(e.last_used_at):"未使用"),1)])))),128))])])])):i.loadingKeyList?((0,a.uX)(),(0,a.CE)("div",xe," 加载中... ")):((0,a.uX)(),(0,a.CE)("div",Ae,t[17]||(t[17]=[(0,a.Lk)("p",null,"暂无密钥记录",-1)])))])])])):(0,a.Q3)("",!0),i.showExchangeKey?((0,a.uX)(),(0,a.CE)("div",{key:1,class:"modal-overlay",onClick:t[9]||(t[9]=(0,ue.D$)((e=>i.showExchangeKey=!1),["self"]))},[(0,a.Lk)("div",Ee,[(0,a.Lk)("div",Ie,[t[18]||(t[18]=(0,a.Lk)("h3",null,"兑换密钥",-1)),(0,a.Lk)("button",{class:"close-btn",onClick:t[5]||(t[5]=e=>i.showExchangeKey=!1)},"×")]),(0,a.Lk)("div",Me,[(0,a.Lk)("div",Pe,[t[19]||(t[19]=(0,a.Lk)("label",{for:"invite-code"},"邀请码",-1)),(0,a.bo)((0,a.Lk)("input",{id:"invite-code","onUpdate:modelValue":t[6]||(t[6]=e=>i.exchangeForm.invite_code=e),type:"text",placeholder:"输入邀请码"},null,512),[[ue.Jo,i.exchangeForm.invite_code]])]),(0,a.Lk)("div",Se,[t[20]||(t[20]=(0,a.Lk)("label",{for:"custom-key"},"自定义密钥",-1)),(0,a.bo)((0,a.Lk)("input",{id:"custom-key","onUpdate:modelValue":t[7]||(t[7]=e=>i.exchangeForm.key=e),type:"text",placeholder:"输入您的自定义密钥"},null,512),[[ue.Jo,i.exchangeForm.key]])]),(0,a.Lk)("div",$e,[(0,a.Lk)("button",{class:"submit-btn",disabled:!i.exchangeForm.invite_code||!i.exchangeForm.key||i.submitting,onClick:t[8]||(t[8]=(...e)=>o.exchangeKey&&o.exchangeKey(...e))},(0,k.v_)(i.submitting?"处理中...":"确认兑换"),9,Ke)])])])])):(0,a.Q3)("",!0),(0,a.Lk)("div",Xe,[i.submissions.length>0?((0,a.uX)(),(0,a.CE)("table",Te,[t[21]||(t[21]=(0,a.Lk)("thead",null,[(0,a.Lk)("tr",null,[(0,a.Lk)("th",null,"标题"),(0,a.Lk)("th",null,"板块"),(0,a.Lk)("th",null,"审核状态"),(0,a.Lk)("th",null,"审核备注"),(0,a.Lk)("th",null,"投稿时间"),(0,a.Lk)("th",null,"状态更新时间"),(0,a.Lk)("th",null,"操作")])],-1)),(0,a.Lk)("tbody",null,[((0,a.uX)(!0),(0,a.CE)(a.FK,null,(0,a.pI)(i.submissions,(e=>((0,a.uX)(),(0,a.CE)("tr",{key:e.id,class:(0,k.C4)({clickable:e.article_id}),onClick:t=>e.article_id&&o.navigateToArticle(e.article_id)},[(0,a.Lk)("td",Fe,(0,k.v_)(e.title),1),(0,a.Lk)("td",null,(0,k.v_)(e.section),1),(0,a.Lk)("td",null,[(0,a.Lk)("span",{class:(0,k.C4)(o.getStatusClass(e.status))},(0,k.v_)(e.status),3)]),(0,a.Lk)("td",null,(0,k.v_)(e.note||"无"),1),(0,a.Lk)("td",null,(0,k.v_)(o.formatDate(e.created_at)),1),(0,a.Lk)("td",null,(0,k.v_)(o.formatDate(e.updated_at)),1),(0,a.Lk)("td",null,["已通过"===e.status&&e.article_id?((0,a.uX)(),(0,a.CE)("button",{key:0,class:"edit-btn",onClick:(0,ue.D$)((t=>o.navigateToEdit(e.article_id)),["stop"])}," 编辑 ",8,ze)):(0,a.Q3)("",!0)])],10,je)))),128))])])):((0,a.uX)(),(0,a.CE)("div",De,t[22]||(t[22]=[(0,a.Lk)("p",null,"暂无投稿记录",-1)]))),i.totalPages>1?((0,a.uX)(),(0,a.CE)("div",Oe,[(0,a.Lk)("button",{disabled:1===i.currentPage,onClick:t[10]||(t[10]=e=>o.loadSubmissions(i.currentPage-1)),class:"page-btn"}," 上一页 ",8,Ne),(0,a.Lk)("span",Ue,(0,k.v_)(i.currentPage)+" / "+(0,k.v_)(i.totalPages),1),(0,a.Lk)("button",{disabled:i.currentPage===i.totalPages,onClick:t[11]||(t[11]=e=>o.loadSubmissions(i.currentPage+1)),class:"page-btn"}," 下一页 ",8,qe)])):(0,a.Q3)("",!0)])])}var We={name:"SubmissionList",data(){return{submissions:[],currentPage:1,totalPages:1,totalSubmissions:0,loading:!1,loadingKeyList:!1,showKeyManagement:!1,showExchangeKey:!1,keyList:[],visibleKeyIndex:-1,exchangeForm:{invite_code:"",key:""},submitting:!1}},created(){this.loadSubmissions(1)},methods:{async loadSubmissions(e){this.loading=!0;try{const t=N.A.get("token");if(!t)return void console.error("未找到登录token");const s=await fetch("https://newfront.xn--xhq44jb2fzpc.com/user/submission",{method:"POST",headers:{Authorization:t,"Content-Type":"application/json"},body:JSON.stringify({page_num:e})});if(!s.ok)throw new Error("获取投稿记录失败");const a=await s.json();this.submissions=a.submissions,this.currentPage=a.current_page,this.totalPages=a.total_pages,this.totalSubmissions=a.total_submissions}catch(t){console.error("获取投稿记录出错:",t)}finally{this.loading=!1}},handleManage(){console.log("点击了作品管理按钮"),this.$emit("manage-works")},navigateToArticle(e){this.$router.push(`/article/${e}`)},navigateToEdit(e){const t=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||window.innerWidth<768;t?U.A.confirm("建议在电脑端进行编辑以获得最佳体验。仍要继续吗?","提示").then((()=>{this.$router.push(`/edit?article=${e}`)})).catch((()=>{console.log("用户取消了在移动端编辑")})):this.$router.push(`/edit?article=${e}`)},formatDate(e){if(!e)return"未知";const t=new Date(e);return`${t.getFullYear()}/${t.getMonth()+1}/${t.getDate()} ${t.getHours()}:${String(t.getMinutes()).padStart(2,"0")}:${String(t.getSeconds()).padStart(2,"0")}`},getStatusClass(e){switch(e){case"已通过":return"status-approved";case"审核中":return"status-pending";case"未通过":return"status-rejected";default:return""}},async loadKeyList(){this.loadingKeyList=!0;try{const e=N.A.get("token");if(!e)return void console.error("未找到登录token");const t=await fetch("https://newfront.xn--xhq44jb2fzpc.com/encrypt/getcode",{method:"GET",headers:{Authorization:e,"Content-Type":"application/json"}});if(!t.ok)throw new Error("获取密钥列表失败");const s=await t.json();if(!s.success)throw new Error(s.message||"获取密钥列表失败");this.keyList=s.data||[]}catch(e){console.error("获取密钥列表出错:",e),U.A.alert(e.message||"获取密钥列表失败,请稍后再试","错误")}finally{this.loadingKeyList=!1}},toggleKeyVisibility(e){this.visibleKeyIndex===e?this.visibleKeyIndex=-1:this.visibleKeyIndex=e},async exchangeKey(){if(this.exchangeForm.invite_code&&this.exchangeForm.key){this.submitting=!0;try{const e=N.A.get("token");if(!e)return void console.error("未找到登录token");const t=await fetch("https://newfront.xn--xhq44jb2fzpc.com/encrypt/setcode",{method:"POST",headers:{Authorization:e,"Content-Type":"application/json"},body:JSON.stringify(this.exchangeForm)}),s=await t.json();if(!s.success)throw new Error(s.message||"密钥兑换失败");U.A.alert("密钥兑换成功","提示"),this.showExchangeKey=!1,this.exchangeForm.invite_code="",this.exchangeForm.key="",this.loadKeyList()}catch(e){console.error("密钥兑换出错:",e),U.A.alert(e.message||"密钥兑换失败,请稍后再试","错误")}finally{this.submitting=!1}}else U.A.alert("请输入邀请码和密钥","提示")}},watch:{showKeyManagement(e){e?this.loadKeyList():this.visibleKeyIndex=-1}}};const Be=(0,Q.A)(We,[["render",Qe],["__scopeId","data-v-03a6fef0"]]);var Je=Be,Ve=s(6965),Ge={name:"UserCenter",components:{Navbar:g.A,UserInfo:B,Coin:de,SubmissionList:Je},data(){return{isAuthenticated:!1,isLoading:!0}},created(){document.title="个人中心 - NEU小站"},mounted(){this.checkAuthAndFetchUserInfo()},methods:{async checkAuthAndFetchUserInfo(){const e=N.A.get("token");if(!e)return this.isLoading=!1,"/user-center"===this.$route.path?void this.$router.replace("/login"):void("/login"===this.$route.path&&this.showLoginDialog());try{const t=await fetch("https://newfront.xn--xhq44jb2fzpc.com/user/islogin",{method:"GET",headers:{Authorization:e}});if(!t.ok)throw new Error("Token 验证失败");const s=await t.json();if(!s||!s.isLoggedIn)throw new Error("Token 验证成功但返回状态不正确");this.isAuthenticated=!0,this.isLoading=!1,"/login"===this.$route.path&&this.$router.replace("/user-center")}catch(t){if(console.error("获取用户信息出错:",t),this.isLoading=!1,N.A.remove("token"),"/user-center"===this.$route.path)return void this.$router.replace("/login");"/login"===this.$route.path&&this.showLoginDialog()}},showLoginDialog(){(0,Ve.A)().then((e=>{console.log("登录成功:",e),this.isAuthenticated=!0,this.$router.replace("/user-center")})).catch((e=>{console.log("登录取消:",e)}))},handleManageWorks(){const e=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||window.innerWidth<768;e?U.A.confirm("建议在电脑端进行投稿以获得最佳体验。仍要继续吗?","提示").then((()=>{this.$router.push("/submit")})).catch((()=>{console.log("用户取消了在移动端投稿")})):this.$router.push("/submit")}}};const He=(0,Q.A)(Ge,[["render",h],["__scopeId","data-v-c5320252"]]);var Ye=He}}]);
+//# sourceMappingURL=11.b856e82b.js.map
\ No newline at end of file
diff --git a/dist/js/246.7afadba1.js b/dist/js/246.7afadba1.js
deleted file mode 100644
index 3ef14c2..0000000
--- a/dist/js/246.7afadba1.js
+++ /dev/null
@@ -1,2 +0,0 @@
-"use strict";(self["webpackChunknewfront"]=self["webpackChunknewfront"]||[]).push([[246],{1246:function(e,t,s){s.r(t),s.d(t,{default:function(){return Ye}});var a=s(6768);const n={class:"user-center"},i={key:0,class:"loading-container"},o={key:1,class:"container"},r={class:"upper-section"},l={class:"user-info-container"},c={class:"coin-container"},d={class:"lower-section"},u={key:2,class:"login-required-container"};function h(e,t,s,h,g,k){const v=(0,a.g2)("Navbar"),m=(0,a.g2)("UserInfo"),p=(0,a.g2)("Coin"),L=(0,a.g2)("SubmissionList");return(0,a.uX)(),(0,a.CE)("div",n,[(0,a.bF)(v),g.isLoading?((0,a.uX)(),(0,a.CE)("div",i,t[0]||(t[0]=[(0,a.Lk)("div",{class:"loading-spinner"},"加载中...",-1)]))):g.isAuthenticated?((0,a.uX)(),(0,a.CE)("div",o,[(0,a.Lk)("div",r,[(0,a.Lk)("div",l,[(0,a.bF)(m,{ref:"userInfo"},null,512)]),(0,a.Lk)("div",c,[(0,a.bF)(p,{ref:"coin"},null,512)])]),(0,a.Lk)("div",d,[(0,a.bF)(L,{onManageWorks:k.handleManageWorks},null,8,["onManageWorks"])])])):((0,a.uX)(),(0,a.CE)("div",u,t[1]||(t[1]=[(0,a.Lk)("div",{class:"login-required-message"},[(0,a.Lk)("h2",null,"请先登录!"),(0,a.Lk)("p",null,"您需要登录后才能访问个人中心")],-1)])))])}s(4114);var g=s(3070),k=s(4232);const v={class:"user-info-card"},m={class:"card-container"},p={class:"detail-header"},L={class:"avatar-wrapper"},y=["src"],f={class:"detail-right"},b={class:"detail-name-container"},w={class:"detail-name"},C={class:"user-badges"},_=["title"],x=["title"],A={key:2,class:"badge medal"},E={class:"user-sign-container"},I={class:"user-sign"},M={class:"sign-text"},P={class:"user-email"},S={class:"email-text"},$={class:"user-stats"},K={class:"stat-item"},X={class:"stat-value"},T={class:"stat-item"},j={class:"stat-value"},F={class:"stat-item"},z={class:"stat-value"},D={key:0,class:"message-box"};function O(e,t,s,n,i,o){return(0,a.uX)(),(0,a.CE)("div",v,[(0,a.Lk)("div",m,[(0,a.Lk)("div",p,[t[6]||(t[6]=(0,a.Lk)("div",{class:"header-bg"},null,-1)),(0,a.Lk)("div",L,[(0,a.Lk)("img",{src:i.userInfo.avatar_path,alt:"用户头像",class:"detail-avatar"},null,8,y),(0,a.Lk)("div",{class:"avatar-edit-overlay",onClick:t[0]||(t[0]=(...e)=>o.triggerFileInput&&o.triggerFileInput(...e))},t[4]||(t[4]=[(0,a.Lk)("i",{class:"edit-icon"},"📷",-1)])),(0,a.Lk)("input",{type:"file",ref:"fileInput",style:{display:"none"},accept:"image/jpeg, image/png, image/gif",onChange:t[1]||(t[1]=(...e)=>o.uploadAvatar&&o.uploadAvatar(...e))},null,544)]),(0,a.Lk)("div",f,[(0,a.Lk)("div",b,[(0,a.Lk)("div",w,(0,k.v_)(i.userInfo.nickname),1),(0,a.Lk)("button",{class:"edit-btn",onClick:t[2]||(t[2]=(...e)=>o.editNickname&&o.editNickname(...e)),title:"修改昵称"},t[5]||(t[5]=[(0,a.Lk)("i",{class:"edit-icon"},"✏️",-1)]))]),(0,a.Lk)("div",C,[i.userInfo.verified?((0,a.uX)(),(0,a.CE)("span",{key:0,class:"badge verified",title:i.userInfo.verified},"认证",8,_)):(0,a.Q3)("",!0),i.userInfo.invited?((0,a.uX)(),(0,a.CE)("span",{key:1,class:"badge invited",title:i.userInfo.invited},"特邀",8,x)):(0,a.Q3)("",!0),i.userInfo.medal?((0,a.uX)(),(0,a.CE)("span",A,"小站奖章")):(0,a.Q3)("",!0)])])]),(0,a.Lk)("div",E,[(0,a.Lk)("div",I,[t[8]||(t[8]=(0,a.Lk)("div",{class:"sign-icon"},"✍️",-1)),(0,a.Lk)("div",M,(0,k.v_)(i.userInfo.sign||"这个人很懒,还没有写个性签名~"),1),(0,a.Lk)("button",{class:"edit-btn",onClick:t[3]||(t[3]=(...e)=>o.editSign&&o.editSign(...e)),title:"修改签名"},t[7]||(t[7]=[(0,a.Lk)("i",{class:"edit-icon"},"✏️",-1)]))])]),(0,a.Lk)("div",P,[t[9]||(t[9]=(0,a.Lk)("div",{class:"email-icon"},"📧",-1)),(0,a.Lk)("div",S,(0,k.v_)(i.userInfo.email),1)]),(0,a.Lk)("div",$,[(0,a.Lk)("div",K,[(0,a.Lk)("div",X,(0,k.v_)(i.userInfo.follower||0),1),t[10]||(t[10]=(0,a.Lk)("div",{class:"stat-label"},"粉丝",-1))]),t[13]||(t[13]=(0,a.Lk)("div",{class:"stat-separator"},null,-1)),(0,a.Lk)("div",T,[(0,a.Lk)("div",j,(0,k.v_)(i.userInfo.following||0),1),t[11]||(t[11]=(0,a.Lk)("div",{class:"stat-label"},"关注",-1))]),t[14]||(t[14]=(0,a.Lk)("div",{class:"stat-separator"},null,-1)),(0,a.Lk)("div",F,[(0,a.Lk)("div",z,(0,k.v_)(i.userInfo.coin||"未激活"),1),t[12]||(t[12]=(0,a.Lk)("div",{class:"stat-label"},"东币",-1))])]),i.message.show?((0,a.uX)(),(0,a.CE)("div",D,[(0,a.Lk)("div",{class:(0,k.C4)(["message-content",i.message.type])},(0,k.v_)(i.message.text),3)])):(0,a.Q3)("",!0)])])}var N=s(8704),U=s(6253),q={name:"UserInfo",data(){return{userInfo:{id:"",nickname:"加载中...",verified:null,invited:null,medal:!1,avatar_path:"",email:"",sign:"",follower:0,following:0,coin:0},message:{show:!1,text:"",type:"success",timer:null}}},created(){this.fetchUserInfo()},methods:{async fetchUserInfo(){try{const e=N.A.get("token");if(!e)return void this.showMessage("未登录或登录已过期","error");const t=await fetch("https://newfront.xn--xhq44jb2fzpc.com/user/info",{method:"GET",headers:{Authorization:e}});if(!t.ok)throw new Error("获取用户信息失败");const s=await t.json();this.userInfo=s}catch(e){console.error("获取用户信息出错:",e),this.showMessage("获取用户信息失败","error")}},triggerFileInput(){this.$refs.fileInput.click()},async uploadAvatar(e){const t=e.target.files[0];if(!t)return void this.showMessage("请选择一个文件","error");if(t.size>1048576)return void this.showMessage("头像必须小于1MB","error");const s=N.A.get("token");if(s)try{const e=new FormData;e.append("avatar",t);const a=await fetch("https://userlogin.xn--xhq44jb2fzpc.com/avatar/upload",{method:"POST",headers:{Authorization:s},body:e});if(a.ok){const e=await a.json();this.userInfo.avatar_path=e.avatarUrl,this.showMessage("头像上传成功","success")}else 401===a.status||403===a.status?this.showMessage("权限错误,请重新登录后再试","error"):this.showMessage("上传失败,请稍后再试","error")}catch(a){console.error("头像上传错误:",a),this.showMessage("上传过程中发生错误","error")}else this.showMessage("请先登录,再上传头像","error")},async editNickname(){const e=N.A.get("token");e?(0,U.A)({title:"修改昵称",message:"请输入新的昵称:",showInput:!0,inputPlaceholder:"请输入新昵称",inputValue:this.userInfo.nickname,confirmText:"确认",cancelText:"取消",cancel:!0}).then((async({value:t})=>{if(null!==t&&""!==t.trim())try{const s=await fetch("https://userlogin.xn--xhq44jb2fzpc.com/avatar/edit-nickname",{method:"POST",headers:{"Content-Type":"application/json",Authorization:e},body:JSON.stringify({nickname:t.trim()})});if(s.ok){await s.json();this.userInfo.nickname=t.trim(),this.showMessage("昵称修改成功","success")}else{const e=await s.json();this.showMessage(`修改昵称失败:${e.message}`,"error")}}catch(s){console.error("修改昵称错误:",s),this.showMessage("发生错误,请稍后再试","error")}else this.showMessage("昵称不能为空","error")})).catch((()=>{})):this.showMessage("您尚未登录,请登录后再尝试修改昵称","error")},async editSign(){const e=N.A.get("token");if(!e)return void this.showMessage("您尚未登录,请登录后再尝试修改签名","error");const t=this.userInfo.sign||"";(0,U.A)({title:"修改个性签名",message:"请输入新的个性签名 (最多20个汉字,留空表示删除个性签名):",showInput:!0,inputValue:t,inputPlaceholder:"请输入个性签名",confirmText:"确认",cancelText:"取消",cancel:!0}).then((async({value:t})=>{if(null!==t)try{const s=await fetch("https://newfront.xn--xhq44jb2fzpc.com/user/sign",{method:"POST",headers:{"Content-Type":"application/json",Authorization:e},body:JSON.stringify({sign:t.trim()})});if(s.ok)this.userInfo.sign=t.trim(),this.showMessage("个性签名修改成功","success");else{const e=await s.json();this.showMessage(`修改签名失败:${e.message}`,"error")}}catch(s){console.error("修改签名错误:",s),this.showMessage("发生错误,请稍后再试","error")}})).catch((()=>{}))},showMessage(e,t="success"){this.message.timer&&clearTimeout(this.message.timer),this.message.show=!0,this.message.text=e,this.message.type=t,this.message.timer=setTimeout((()=>{this.message.show=!1}),3e3)}}},Q=s(1241);const W=(0,Q.A)(q,[["render",O],["__scopeId","data-v-7c40ae87"]]);var B=W;const J={class:"coin-container"},V={key:0,class:"not-activated"},G={class:"alert alert-warning policy-notification"},H={key:1,class:"activated"},Y={class:"alert alert-warning policy-notification"},R={class:"coin-info"},Z={class:"coin-amount"},ee={class:"transactions"},te={key:0,class:"no-records"},se={key:1,class:"transaction-table"},ae={key:2,class:"pagination"},ne=["disabled"],ie={class:"page-info"},oe=["disabled"];function re(e,t,s,n,i,o){return(0,a.uX)(),(0,a.CE)("div",J,[i.isActivated?((0,a.uX)(),(0,a.CE)("div",H,[(0,a.Lk)("div",Y,(0,k.v_)(i.policyNotification),1),(0,a.Lk)("div",R,[(0,a.Lk)("h3",null,[t[3]||(t[3]=(0,a.eW)("您当前拥有 ")),(0,a.Lk)("span",Z,(0,k.v_)(i.coinAmount),1),t[4]||(t[4]=(0,a.eW)(" 枚东币"))])]),(0,a.Lk)("div",ee,[0===i.transactions.length?((0,a.uX)(),(0,a.CE)("div",te," 暂无交易记录 ")):((0,a.uX)(),(0,a.CE)("table",se,[t[5]||(t[5]=(0,a.Lk)("thead",null,[(0,a.Lk)("tr",null,[(0,a.Lk)("th",null,"时间"),(0,a.Lk)("th",null,"金额"),(0,a.Lk)("th",null,"备注")])],-1)),(0,a.Lk)("tbody",null,[((0,a.uX)(!0),(0,a.CE)(a.FK,null,(0,a.pI)(i.transactions,(e=>((0,a.uX)(),(0,a.CE)("tr",{key:e.id},[(0,a.Lk)("td",null,(0,k.v_)(o.formatDate(e.created_at)),1),(0,a.Lk)("td",{class:(0,k.C4)({credit:"credit"===e.type,debit:"debit"===e.type})},(0,k.v_)("credit"===e.type?"+":"-")+(0,k.v_)(e.amount),3),(0,a.Lk)("td",null,(0,k.v_)(e.note),1)])))),128))])])),i.totalPages>1?((0,a.uX)(),(0,a.CE)("div",ae,[(0,a.Lk)("button",{disabled:1===i.currentPage,onClick:t[0]||(t[0]=e=>o.loadTransactions(i.currentPage-1)),class:"btn btn-sm btn-outline-primary"}," 上一页 ",8,ne),(0,a.Lk)("span",ie,(0,k.v_)(i.currentPage)+" / "+(0,k.v_)(i.totalPages),1),(0,a.Lk)("button",{disabled:i.currentPage===i.totalPages,onClick:t[1]||(t[1]=e=>o.loadTransactions(i.currentPage+1)),class:"btn btn-sm btn-outline-primary"}," 下一页 ",8,oe)])):(0,a.Q3)("",!0)])])):((0,a.uX)(),(0,a.CE)("div",V,[(0,a.Lk)("div",G,(0,k.v_)(i.policyNotification),1),t[2]||(t[2]=(0,a.Lk)("div",{class:"alert alert-info"},[(0,a.Lk)("p",null,"东币系统在账号完成校园验证后自动激活。")],-1))]))])}var le={name:"CoinComponent",data(){return{isActivated:!1,coinAmount:0,transactions:[],currentPage:1,totalPages:1,policyNotification:"由于政策原因,短信验证码服务已于2025.4.13下线,后续东币系统将在校园验证通过后自动激活。之前已完成校园验证但未手动激活东币系统的用户,系统已为您自动激活东币系统。"}},created(){this.loadTransactions(1)},methods:{async loadTransactions(e){try{const t=N.A.get("token");if(!t)return console.error("未找到登录token"),void(this.isActivated=!1);const s=await fetch("https://newfront.xn--xhq44jb2fzpc.com/coin/transactions",{method:"POST",headers:{Authorization:t,"Content-Type":"application/json"},body:JSON.stringify({page_num:e})}),a=await s.json();if(s.ok)this.isActivated=!0,this.coinAmount=a.coinAmount,this.transactions=a.transactions,this.currentPage=a.current_page,this.totalPages=a.total_pages;else{if(403!==s.status||"用户未激活东币系统"!==a.message)throw new Error(a.message||"获取交易记录失败");this.isActivated=!1,this.coinAmount=0,this.transactions=[]}}catch(t){console.error("获取交易记录出错:",t),this.isActivated=!1}},formatDate(e){const t=new Date(e);return`${t.getFullYear()}/${t.getMonth()+1}/${t.getDate()} ${t.getHours()}:${String(t.getMinutes()).padStart(2,"0")}:${String(t.getSeconds()).padStart(2,"0")}`}}};const ce=(0,Q.A)(le,[["render",re],["__scopeId","data-v-6b086920"]]);var de=ce,ue=s(5130);const he={class:"submission-container"},ge={class:"header"},ke={class:"header-buttons"},ve={class:"modal-content key-management-modal"},me={class:"modal-header"},pe={class:"modal-body"},Le={key:0,class:"key-table-wrapper"},ye={class:"key-table"},fe={class:"key-cell"},be={class:"key-content"},we=["onClick"],Ce={key:0,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"black","stroke-linecap":"round","stroke-linejoin":"round",width:"24",height:"24","stroke-width":"1.1"},_e={key:1,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"black","stroke-linecap":"round","stroke-linejoin":"round",width:"24",height:"24","stroke-width":"1.1"},xe={key:1,class:"loading-keys"},Ae={key:2,class:"empty-keys"},Ee={class:"modal-content exchange-key-modal"},Ie={class:"modal-header"},Me={class:"modal-body"},Pe={class:"form-group"},Se={class:"form-group"},$e={class:"form-actions"},Ke=["disabled"],Xe={class:"submission-table-wrapper"},Te={key:0,class:"submission-table"},je=["onClick"],Fe={class:"title-cell"},ze=["onClick"],De={key:1,class:"empty-state"},Oe={key:2,class:"pagination"},Ne=["disabled"],Ue={class:"page-info"},qe=["disabled"];function Qe(e,t,s,n,i,o){return(0,a.uX)(),(0,a.CE)("div",he,[(0,a.Lk)("div",ge,[t[12]||(t[12]=(0,a.Lk)("h3",{class:"title"},"我的投稿记录",-1)),(0,a.Lk)("div",ke,[(0,a.Lk)("button",{class:"key-manage-btn",onClick:t[0]||(t[0]=e=>i.showKeyManagement=!0)},"密钥管理"),(0,a.Lk)("button",{class:"manage-btn",onClick:t[1]||(t[1]=(...e)=>o.handleManage&&o.handleManage(...e))},"我要投稿")])]),i.showKeyManagement?((0,a.uX)(),(0,a.CE)("div",{key:0,class:"modal-overlay",onClick:t[4]||(t[4]=(0,ue.D$)((e=>i.showKeyManagement=!1),["self"]))},[(0,a.Lk)("div",ve,[(0,a.Lk)("div",me,[t[13]||(t[13]=(0,a.Lk)("h3",null,"密钥管理",-1)),(0,a.Lk)("button",{class:"close-btn",onClick:t[2]||(t[2]=e=>i.showKeyManagement=!1)},"×")]),(0,a.Lk)("div",pe,[(0,a.Lk)("button",{class:"exchange-key-btn",onClick:t[3]||(t[3]=e=>i.showExchangeKey=!0)},"兑换密钥"),i.keyList.length>0?((0,a.uX)(),(0,a.CE)("div",Le,[(0,a.Lk)("table",ye,[t[16]||(t[16]=(0,a.Lk)("thead",null,[(0,a.Lk)("tr",null,[(0,a.Lk)("th",null,"密钥"),(0,a.Lk)("th",null,"状态"),(0,a.Lk)("th",null,"创建时间"),(0,a.Lk)("th",null,"最后使用时间")])],-1)),(0,a.Lk)("tbody",null,[((0,a.uX)(!0),(0,a.CE)(a.FK,null,(0,a.pI)(i.keyList,((e,s)=>((0,a.uX)(),(0,a.CE)("tr",{key:s},[(0,a.Lk)("td",fe,[(0,a.Lk)("div",be,[(0,a.Lk)("span",null,(0,k.v_)(i.visibleKeyIndex===s?e.key_plaintext:"******"),1),(0,a.Lk)("button",{class:"toggle-visibility",onClick:e=>o.toggleKeyVisibility(s)},[i.visibleKeyIndex!==s?((0,a.uX)(),(0,a.CE)("svg",Ce,t[14]||(t[14]=[(0,a.Lk)("path",{d:"M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0"},null,-1),(0,a.Lk)("path",{d:"M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6"},null,-1)]))):((0,a.uX)(),(0,a.CE)("svg",_e,t[15]||(t[15]=[(0,a.Lk)("path",{d:"M10.585 10.587a2 2 0 0 0 2.829 2.828"},null,-1),(0,a.Lk)("path",{d:"M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87"},null,-1),(0,a.Lk)("path",{d:"M3 3l18 18"},null,-1)])))],8,we)])]),(0,a.Lk)("td",null,[(0,a.Lk)("span",{class:(0,k.C4)(e.is_valid?"status-valid":"status-invalid")},(0,k.v_)(e.is_valid?"有效":"无效"),3)]),(0,a.Lk)("td",null,(0,k.v_)(o.formatDate(e.created_at)),1),(0,a.Lk)("td",null,(0,k.v_)(e.last_used_at?o.formatDate(e.last_used_at):"未使用"),1)])))),128))])])])):i.loadingKeyList?((0,a.uX)(),(0,a.CE)("div",xe," 加载中... ")):((0,a.uX)(),(0,a.CE)("div",Ae,t[17]||(t[17]=[(0,a.Lk)("p",null,"暂无密钥记录",-1)])))])])])):(0,a.Q3)("",!0),i.showExchangeKey?((0,a.uX)(),(0,a.CE)("div",{key:1,class:"modal-overlay",onClick:t[9]||(t[9]=(0,ue.D$)((e=>i.showExchangeKey=!1),["self"]))},[(0,a.Lk)("div",Ee,[(0,a.Lk)("div",Ie,[t[18]||(t[18]=(0,a.Lk)("h3",null,"兑换密钥",-1)),(0,a.Lk)("button",{class:"close-btn",onClick:t[5]||(t[5]=e=>i.showExchangeKey=!1)},"×")]),(0,a.Lk)("div",Me,[(0,a.Lk)("div",Pe,[t[19]||(t[19]=(0,a.Lk)("label",{for:"invite-code"},"邀请码",-1)),(0,a.bo)((0,a.Lk)("input",{id:"invite-code","onUpdate:modelValue":t[6]||(t[6]=e=>i.exchangeForm.invite_code=e),type:"text",placeholder:"输入邀请码"},null,512),[[ue.Jo,i.exchangeForm.invite_code]])]),(0,a.Lk)("div",Se,[t[20]||(t[20]=(0,a.Lk)("label",{for:"custom-key"},"自定义密钥",-1)),(0,a.bo)((0,a.Lk)("input",{id:"custom-key","onUpdate:modelValue":t[7]||(t[7]=e=>i.exchangeForm.key=e),type:"text",placeholder:"输入您的自定义密钥"},null,512),[[ue.Jo,i.exchangeForm.key]])]),(0,a.Lk)("div",$e,[(0,a.Lk)("button",{class:"submit-btn",disabled:!i.exchangeForm.invite_code||!i.exchangeForm.key||i.submitting,onClick:t[8]||(t[8]=(...e)=>o.exchangeKey&&o.exchangeKey(...e))},(0,k.v_)(i.submitting?"处理中...":"确认兑换"),9,Ke)])])])])):(0,a.Q3)("",!0),(0,a.Lk)("div",Xe,[i.submissions.length>0?((0,a.uX)(),(0,a.CE)("table",Te,[t[21]||(t[21]=(0,a.Lk)("thead",null,[(0,a.Lk)("tr",null,[(0,a.Lk)("th",null,"标题"),(0,a.Lk)("th",null,"板块"),(0,a.Lk)("th",null,"审核状态"),(0,a.Lk)("th",null,"审核备注"),(0,a.Lk)("th",null,"投稿时间"),(0,a.Lk)("th",null,"状态更新时间"),(0,a.Lk)("th",null,"操作")])],-1)),(0,a.Lk)("tbody",null,[((0,a.uX)(!0),(0,a.CE)(a.FK,null,(0,a.pI)(i.submissions,(e=>((0,a.uX)(),(0,a.CE)("tr",{key:e.id,class:(0,k.C4)({clickable:e.article_id}),onClick:t=>e.article_id&&o.navigateToArticle(e.article_id)},[(0,a.Lk)("td",Fe,(0,k.v_)(e.title),1),(0,a.Lk)("td",null,(0,k.v_)(e.section),1),(0,a.Lk)("td",null,[(0,a.Lk)("span",{class:(0,k.C4)(o.getStatusClass(e.status))},(0,k.v_)(e.status),3)]),(0,a.Lk)("td",null,(0,k.v_)(e.note||"无"),1),(0,a.Lk)("td",null,(0,k.v_)(o.formatDate(e.created_at)),1),(0,a.Lk)("td",null,(0,k.v_)(o.formatDate(e.updated_at)),1),(0,a.Lk)("td",null,["已通过"===e.status&&e.article_id?((0,a.uX)(),(0,a.CE)("button",{key:0,class:"edit-btn",onClick:(0,ue.D$)((t=>o.navigateToEdit(e.article_id)),["stop"])}," 编辑 ",8,ze)):(0,a.Q3)("",!0)])],10,je)))),128))])])):((0,a.uX)(),(0,a.CE)("div",De,t[22]||(t[22]=[(0,a.Lk)("p",null,"暂无投稿记录",-1)]))),i.totalPages>1?((0,a.uX)(),(0,a.CE)("div",Oe,[(0,a.Lk)("button",{disabled:1===i.currentPage,onClick:t[10]||(t[10]=e=>o.loadSubmissions(i.currentPage-1)),class:"page-btn"}," 上一页 ",8,Ne),(0,a.Lk)("span",Ue,(0,k.v_)(i.currentPage)+" / "+(0,k.v_)(i.totalPages),1),(0,a.Lk)("button",{disabled:i.currentPage===i.totalPages,onClick:t[11]||(t[11]=e=>o.loadSubmissions(i.currentPage+1)),class:"page-btn"}," 下一页 ",8,qe)])):(0,a.Q3)("",!0)])])}var We={name:"SubmissionList",data(){return{submissions:[],currentPage:1,totalPages:1,totalSubmissions:0,loading:!1,loadingKeyList:!1,showKeyManagement:!1,showExchangeKey:!1,keyList:[],visibleKeyIndex:-1,exchangeForm:{invite_code:"",key:""},submitting:!1}},created(){this.loadSubmissions(1)},methods:{async loadSubmissions(e){this.loading=!0;try{const t=N.A.get("token");if(!t)return void console.error("未找到登录token");const s=await fetch("https://newfront.xn--xhq44jb2fzpc.com/user/submission",{method:"POST",headers:{Authorization:t,"Content-Type":"application/json"},body:JSON.stringify({page_num:e})});if(!s.ok)throw new Error("获取投稿记录失败");const a=await s.json();this.submissions=a.submissions,this.currentPage=a.current_page,this.totalPages=a.total_pages,this.totalSubmissions=a.total_submissions}catch(t){console.error("获取投稿记录出错:",t)}finally{this.loading=!1}},handleManage(){console.log("点击了作品管理按钮"),this.$emit("manage-works")},navigateToArticle(e){this.$router.push(`/article/${e}`)},navigateToEdit(e){const t=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||window.innerWidth<768;t?U.A.confirm("建议在电脑端进行编辑以获得最佳体验。仍要继续吗?","提示").then((()=>{this.$router.push(`/edit?article=${e}`)})).catch((()=>{console.log("用户取消了在移动端编辑")})):this.$router.push(`/edit?article=${e}`)},formatDate(e){if(!e)return"未知";const t=new Date(e);return`${t.getFullYear()}/${t.getMonth()+1}/${t.getDate()} ${t.getHours()}:${String(t.getMinutes()).padStart(2,"0")}:${String(t.getSeconds()).padStart(2,"0")}`},getStatusClass(e){switch(e){case"已通过":return"status-approved";case"审核中":return"status-pending";case"未通过":return"status-rejected";default:return""}},async loadKeyList(){this.loadingKeyList=!0;try{const e=N.A.get("token");if(!e)return void console.error("未找到登录token");const t=await fetch("https://newfront.xn--xhq44jb2fzpc.com/encrypt/getcode",{method:"GET",headers:{Authorization:e,"Content-Type":"application/json"}});if(!t.ok)throw new Error("获取密钥列表失败");const s=await t.json();if(!s.success)throw new Error(s.message||"获取密钥列表失败");this.keyList=s.data||[]}catch(e){console.error("获取密钥列表出错:",e),U.A.alert(e.message||"获取密钥列表失败,请稍后再试","错误")}finally{this.loadingKeyList=!1}},toggleKeyVisibility(e){this.visibleKeyIndex===e?this.visibleKeyIndex=-1:this.visibleKeyIndex=e},async exchangeKey(){if(this.exchangeForm.invite_code&&this.exchangeForm.key){this.submitting=!0;try{const e=N.A.get("token");if(!e)return void console.error("未找到登录token");const t=await fetch("https://newfront.xn--xhq44jb2fzpc.com/encrypt/setcode",{method:"POST",headers:{Authorization:e,"Content-Type":"application/json"},body:JSON.stringify(this.exchangeForm)}),s=await t.json();if(!s.success)throw new Error(s.message||"密钥兑换失败");U.A.alert("密钥兑换成功","提示"),this.showExchangeKey=!1,this.exchangeForm.invite_code="",this.exchangeForm.key="",this.loadKeyList()}catch(e){console.error("密钥兑换出错:",e),U.A.alert(e.message||"密钥兑换失败,请稍后再试","错误")}finally{this.submitting=!1}}else U.A.alert("请输入邀请码和密钥","提示")}},watch:{showKeyManagement(e){e?this.loadKeyList():this.visibleKeyIndex=-1}}};const Be=(0,Q.A)(We,[["render",Qe],["__scopeId","data-v-477e6a08"]]);var Je=Be,Ve=s(6965),Ge={name:"UserCenter",components:{Navbar:g.A,UserInfo:B,Coin:de,SubmissionList:Je},data(){return{isAuthenticated:!1,isLoading:!0}},created(){document.title="个人中心 - NEU小站"},mounted(){this.checkAuthAndFetchUserInfo()},methods:{async checkAuthAndFetchUserInfo(){const e=N.A.get("token");if(!e)return this.isLoading=!1,"/user-center"===this.$route.path?void this.$router.replace("/login"):void("/login"===this.$route.path&&this.showLoginDialog());try{const t=await fetch("https://newfront.xn--xhq44jb2fzpc.com/user/islogin",{method:"GET",headers:{Authorization:e}});if(!t.ok)throw new Error("Token 验证失败");const s=await t.json();if(!s||!s.isLoggedIn)throw new Error("Token 验证成功但返回状态不正确");this.isAuthenticated=!0,this.isLoading=!1,"/login"===this.$route.path&&this.$router.replace("/user-center")}catch(t){if(console.error("获取用户信息出错:",t),this.isLoading=!1,N.A.remove("token"),"/user-center"===this.$route.path)return void this.$router.replace("/login");"/login"===this.$route.path&&this.showLoginDialog()}},showLoginDialog(){(0,Ve.A)().then((e=>{console.log("登录成功:",e),this.isAuthenticated=!0,this.$router.replace("/user-center")})).catch((e=>{console.log("登录取消:",e)}))},handleManageWorks(){const e=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||window.innerWidth<768;e?U.A.confirm("建议在电脑端进行投稿以获得最佳体验。仍要继续吗?","提示").then((()=>{this.$router.push("/submit")})).catch((()=>{console.log("用户取消了在移动端投稿")})):this.$router.push("/submit")}}};const He=(0,Q.A)(Ge,[["render",h],["__scopeId","data-v-c5320252"]]);var Ye=He}}]);
-//# sourceMappingURL=246.7afadba1.js.map
\ No newline at end of file
diff --git a/dist/js/app.2e52ebcc.js b/dist/js/app.2e52ebcc.js
new file mode 100644
index 0000000..9b1dd6f
--- /dev/null
+++ b/dist/js/app.2e52ebcc.js
@@ -0,0 +1,2 @@
+(function(){"use strict";var e={3070:function(e,t,a){a.d(t,{A:function(){return S}});var n=a(6768),s=a(4232),o=a(5130);const i={class:"navbar"},r={class:"container"},c={class:"navbar-brand"},l={class:"navbar-end"},d={key:0,class:"navbar-item user-dropdown",style:{padding:"0"}},u=["src","alt"],h={class:"user-nickname"},p={class:"dropdown-menu"},m={key:1,class:"navbar-item"},g={key:0,class:"activation-dialog"},f={class:"activation-dialog-content"},v={class:"activation-methods"},b={class:"activation-method"},k={class:"activation-method"};function y(e,t,a,y,C,w){const L=(0,n.g2)("router-link");return(0,n.uX)(),(0,n.CE)("nav",i,[(0,n.Lk)("div",r,[(0,n.Lk)("div",c,[(0,n.bF)(L,{to:"/",class:"navbar-logo"},{default:(0,n.k6)((()=>t[8]||(t[8]=[(0,n.Lk)("img",{src:"https://download.xn--xhq44jb2fzpc.com/images/logo-hd.png",alt:"NEU小站",class:"navbar-logo-img"},null,-1),(0,n.Lk)("span",null,"NEU小站",-1)]))),_:1}),(0,n.Lk)("div",{class:(0,s.C4)(["navbar-burger",{"is-active":C.isMenuActive}]),onClick:t[0]||(t[0]=(...e)=>w.toggleMenu&&w.toggleMenu(...e))},t[9]||(t[9]=[(0,n.Lk)("span",null,null,-1),(0,n.Lk)("span",null,null,-1),(0,n.Lk)("span",null,null,-1)]),2)]),(0,n.Lk)("div",{class:(0,s.C4)(["navbar-menu",{"is-active":C.isMenuActive}])},[(0,n.Lk)("div",l,[(0,n.bF)(L,{to:"/",class:"navbar-item"},{default:(0,n.k6)((()=>t[10]||(t[10]=[(0,n.eW)("首页")]))),_:1}),(0,n.bF)(L,{to:"/strategy",class:"navbar-item"},{default:(0,n.k6)((()=>t[11]||(t[11]=[(0,n.eW)("攻略指南")]))),_:1}),(0,n.bF)(L,{to:"/resources",class:"navbar-item"},{default:(0,n.k6)((()=>t[12]||(t[12]=[(0,n.eW)("资源共享")]))),_:1}),(0,n.bF)(L,{to:"/app",class:"navbar-item"},{default:(0,n.k6)((()=>t[13]||(t[13]=[(0,n.eW)("应用中心")]))),_:1}),(0,n.bF)(L,{to:"/about",class:"navbar-item"},{default:(0,n.k6)((()=>t[14]||(t[14]=[(0,n.eW)("关于")]))),_:1}),(0,n.bF)(L,{to:"/search",class:"navbar-item"},{default:(0,n.k6)((()=>t[15]||(t[15]=[(0,n.eW)("搜索")]))),_:1}),C.userInfo?((0,n.uX)(),(0,n.CE)("div",d,[(0,n.Lk)("div",{class:"user-info",onClick:t[1]||(t[1]=(...e)=>w.toggleDropdown&&w.toggleDropdown(...e))},[(0,n.Lk)("img",{src:C.userInfo.avatar_path,class:"user-avatar",alt:C.userInfo.nickname},null,8,u),(0,n.Lk)("span",h,(0,s.v_)(C.userInfo.nickname),1),(0,n.Lk)("span",{class:(0,s.C4)(["dropdown-arrow",{"is-active":C.isDropdownActive}])},"▼",2)]),(0,n.bo)((0,n.Lk)("div",p,[(0,n.Lk)("div",{class:"dropdown-item",onClick:t[2]||(t[2]=(...e)=>w.handleUserCenter&&w.handleUserCenter(...e))},"个人中心"),(0,n.Lk)("div",{class:"dropdown-item",onClick:t[3]||(t[3]=(...e)=>w.handleLogout&&w.handleLogout(...e))},"退出登录")],512),[[o.aG,C.isDropdownActive]])])):((0,n.uX)(),(0,n.CE)("div",m,[(0,n.Lk)("a",{class:"login-btn",onClick:t[4]||(t[4]=(...e)=>w.handleLogin&&w.handleLogin(...e))},"登录")]))])],2)]),C.showActivationDialog?((0,n.uX)(),(0,n.CE)("div",g,[(0,n.Lk)("div",f,[t[20]||(t[20]=(0,n.Lk)("h3",null,"账户激活",-1)),t[21]||(t[21]=(0,n.Lk)("p",null,"您的账户尚未激活,请选择以下方式进行激活:",-1)),(0,n.Lk)("div",v,[(0,n.Lk)("div",b,[t[16]||(t[16]=(0,n.Lk)("h4",null,"方式 1:NEU 校园网验证",-1)),t[17]||(t[17]=(0,n.Lk)("p",null,"请连接 NEU 校园网后点击下面的验证按钮(暂不支持秦皇岛分校)",-1)),(0,n.Lk)("button",{onClick:t[5]||(t[5]=(...e)=>w.handleNetworkVerify&&w.handleNetworkVerify(...e)),class:"verify-btn"},"校园网验证")]),(0,n.Lk)("div",k,[t[18]||(t[18]=(0,n.Lk)("h4",null,"方式 2:校园邮箱验证",-1)),t[19]||(t[19]=(0,n.Lk)("p",null,"使用 @stu.neu.edu.cn 或 @stu.neuq.edu.cn 后缀的校园邮箱验证",-1)),(0,n.Lk)("button",{onClick:t[6]||(t[6]=(...e)=>w.handleEmailVerify&&w.handleEmailVerify(...e)),class:"verify-btn"},"邮箱验证")])]),(0,n.Lk)("button",{onClick:t[7]||(t[7]=(...e)=>w.handleLogout&&w.handleLogout(...e)),class:"close-btn"},"退出登录")])])):(0,n.Q3)("",!0)])}a(4114);var C=a(8704),w=a(4373),L=a(6253),A=a(6965),E={name:"NavBar",data(){return{isMenuActive:!1,isDropdownActive:!1,userInfo:null,showActivationDialog:!1,isActivated:!1}},mounted(){this.checkLoginStatus()},methods:{handleLogin(){(0,A.A)().then((e=>{console.log(e),this.checkLoginStatus()})).catch((e=>{console.log(e)}))},toggleMenu(){this.isMenuActive=!this.isMenuActive},toggleDropdown(){this.isDropdownActive=!this.isDropdownActive},handleUserCenter(){this.isDropdownActive=!1,this.$router.push("/user-center")},handleLogout(){const e=window.location.hostname.includes("localhost")?"localhost":window.location.hostname.split(".").slice(-2).join(".");C.A.remove("token",{domain:e,path:"/"}),this.userInfo=null,window.location.reload()},checkLoginStatus(){const e=C.A.get("token");e&&w.A.get("https://newfront.xn--xhq44jb2fzpc.com/user/info",{headers:{Authorization:e}}).then((e=>{this.userInfo=e.data,this.isActivated=e.data.activated,this.isActivated||(this.showActivationDialog=!0)})).catch((e=>{console.log(e),this.userInfo=null}))},checkActivationStatus(e){},closeActivationDialog(){this.showActivationDialog=!1},handleNetworkVerify(){const e=C.A.get("token");e?w.A.get("https://userlogin.xn--xhq44jb2fzpc.com/qv",{headers:{Authorization:e}}).then((e=>{L.A.alert(e.data.message,"提示"),this.isActivated=!0,this.showActivationDialog=!1})).catch((e=>{e.response&&e.response.data?L.A.alert(`${e.response.data.message} 当前IP: ${e.response.data.ip||"未知"}`,"提示"):L.A.alert("验证失败,请稍后重试","提示")})):L.A.alert("您未登录,请先登录后操作!","提示")},handleEmailVerify(){const e=C.A.get("token");e?w.A.get("https://userlogin.xn--xhq44jb2fzpc.com/check-email",{headers:{Authorization:e}}).then((e=>{L.A.alert(e.data.message,"提示"),this.isActivated=!0,this.showActivationDialog=!1})).catch((t=>{t.response&&403===t.response.status?this.promptForCampusEmail(e):t.response&&t.response.data?L.A.alert(t.response.data.message||"发生未知错误,请稍后重试","提示"):L.A.alert("验证失败,请稍后重试","提示")})):L.A.alert("您未登录,请先登录后操作!","提示")},promptForCampusEmail(e){(0,L.A)({title:"校园邮箱验证",message:"请输入您的 @stu.neu.edu.cn 或 @stu.neuq.edu.cn 校园邮箱:",showInput:!0,inputPlaceholder:"请输入校园邮箱",confirmText:"确认",cancelText:"取消",cancel:!0}).then((({value:t})=>{t?t.endsWith("@stu.neu.edu.cn")||t.endsWith("@stu.neuq.edu.cn")?this.sendCampusVerificationEmail(t,e):L.A.alert("请输入有效的 @stu.neu.edu.cn 或 @stu.neuq.edu.cn 校园邮箱!","提示"):L.A.alert("邮箱不能为空","提示")})).catch((()=>{}))},sendCampusVerificationEmail(e,t){w.A.post("https://userlogin.xn--xhq44jb2fzpc.com/send-campus-verify",{campus_email:e},{headers:{Authorization:t,"Content-Type":"application/json"}}).then((t=>{L.A.alert(`验证邮件已发送至 ${e},请检查您的邮箱完成验证。`,"提示")})).catch((e=>{e.response&&e.response.data?L.A.alert(`发送验证邮件失败:${e.response.data.message}`,"提示"):L.A.alert("发送验证邮件失败,请稍后重试","提示")}))}}},I=a(1241);const M=(0,I.A)(E,[["render",y],["__scopeId","data-v-868bf484"]]);var S=M},4876:function(e,t,a){a.d(t,{A:function(){return f}});var n=a(6768),s=a(5130),o=a(4232);const i={class:"message-box"},r={key:0,class:"message-header"},c={class:"message-content"},l={key:0,class:"input-wrapper"},d=["type","placeholder"],u={class:"message-footer"};function h(e,t,a,h,p,m){return(0,n.uX)(),(0,n.Wv)(s.eB,{name:"message-fade"},{default:(0,n.k6)((()=>[a.visible?((0,n.uX)(),(0,n.CE)("div",{key:0,class:"message-overlay",onClick:t[4]||(t[4]=(0,s.D$)(((...e)=>m.handleOverlayClick&&m.handleOverlayClick(...e)),["self"]))},[(0,n.Lk)("div",i,[a.title?((0,n.uX)(),(0,n.CE)("div",r,[(0,n.Lk)("h3",null,(0,o.v_)(a.title),1)])):(0,n.Q3)("",!0),(0,n.Lk)("div",c,[(0,n.Lk)("p",null,(0,o.v_)(a.message),1),a.showInput?((0,n.uX)(),(0,n.CE)("div",l,[(0,n.bo)((0,n.Lk)("input",{"onUpdate:modelValue":t[0]||(t[0]=e=>p.localInputValue=e),type:a.inputType,placeholder:a.inputPlaceholder,class:"message-input",onKeyup:t[1]||(t[1]=(0,s.jR)(((...e)=>m.handleConfirm&&m.handleConfirm(...e)),["enter"]))},null,40,d),[[s.hp,p.localInputValue]])])):(0,n.Q3)("",!0)]),(0,n.Lk)("div",u,[m.cancelVisible?((0,n.uX)(),(0,n.CE)("button",{key:0,class:"btn btn-cancel",onClick:t[2]||(t[2]=(...e)=>m.handleCancel&&m.handleCancel(...e))},(0,o.v_)(a.cancelText),1)):(0,n.Q3)("",!0),m.confirmVisible?((0,n.uX)(),(0,n.CE)("button",{key:1,class:"btn btn-confirm",onClick:t[3]||(t[3]=(...e)=>m.handleConfirm&&m.handleConfirm(...e))},(0,o.v_)(a.confirmText),1)):(0,n.Q3)("",!0)])])])):(0,n.Q3)("",!0)])),_:1})}var p={name:"MessageBox",props:{visible:{type:Boolean,default:!1},title:{type:String,default:""},message:{type:String,required:!0},confirm:{type:Boolean,default:!0},cancel:{type:Boolean,default:!1},confirmText:{type:String,default:"确定"},cancelText:{type:String,default:"取消"},closeOnClickOverlay:{type:Boolean,default:!1},showInput:{type:Boolean,default:!1},inputType:{type:String,default:"text"},inputValue:{type:String,default:""},inputPlaceholder:{type:String,default:"请输入"}},data(){return{localInputValue:""}},watch:{inputValue:{immediate:!0,handler(e){this.localInputValue=e}}},computed:{confirmVisible(){return this.confirm},cancelVisible(){return this.cancel}},methods:{handleConfirm(){this.$emit("confirm",this.localInputValue)},handleCancel(){this.$emit("cancel")},handleOverlayClick(){this.closeOnClickOverlay&&this.$emit("cancel")}}},m=a(1241);const g=(0,m.A)(p,[["render",h],["__scopeId","data-v-076938bc"]]);var f=g},6253:function(e,t,a){var n=a(5130),s=a(4876);const o=(e={})=>new Promise(((t,a)=>{const o=document.createElement("div");document.body.appendChild(o);const i=(0,n.Ef)(s.A,{...e,visible:!0,confirm:!1!==e.confirm,cancel:!0===e.cancel,onConfirm:e=>{i.unmount(),document.body.removeChild(o),t({value:e,action:"confirm"})},onCancel:()=>{i.unmount(),document.body.removeChild(o),a({action:"cancel"})}});i.mount(o)}));o.alert=(e,t="",a={})=>o({title:t,message:e,confirm:!0,cancel:!1,...a}),o.confirm=(e,t="",a={})=>o({title:t,message:e,confirm:!0,cancel:!0,...a}),o.prompt=(e,t="",a={})=>o({title:t,message:e,showInput:!0,confirm:!0,cancel:!0,...a}),t.A=o},6597:function(e,t,a){var n=a(5130),s=a(6768);const o={id:"app"},i={class:"beian-footer"},r={class:"container"},c={class:"copyright"};function l(e,t){const a=(0,s.g2)("router-view"),n=(0,s.g2)("router-link");return(0,s.uX)(),(0,s.CE)("div",o,[(0,s.bF)(a),(0,s.Lk)("footer",i,[(0,s.Lk)("div",r,[t[2]||(t[2]=(0,s.Lk)("span",{style:{"white-space":"nowrap"}},[(0,s.Lk)("img",{src:"https://beian.mps.gov.cn/web/assets/logo01.6189a29f.png",alt:"公安标识",style:{"vertical-align":"middle",height:"16px",display:"inline-block"}}),(0,s.Lk)("a",{href:"https://beian.mps.gov.cn/",target:"_blank"}," 赣公网安备36090202000259号"),(0,s.eW)(" | "),(0,s.Lk)("a",{href:"https://beian.miit.gov.cn/",target:"_blank"},"赣ICP备2024039267号-1")],-1)),(0,s.Lk)("div",c,[t[1]||(t[1]=(0,s.eW)(" © 2025 ")),(0,s.bF)(n,{to:"/about"},{default:(0,s.k6)((()=>t[0]||(t[0]=[(0,s.eW)("NEU小站")]))),_:1})])])])])}var d=a(1241);const u={},h=(0,d.A)(u,[["render",l]]);var p=h,m=a(1387);const g={class:"home"};function f(e,t,a,n,o,i){const r=(0,s.g2)("Navbar");return(0,s.uX)(),(0,s.CE)("div",g,[(0,s.bF)(r),t[0]||(t[0]=(0,s.Fv)('
欢迎访问NEU小站
NEUer的实用工具站
“哈哈,恭喜你发现了宝藏,让我在接下来的日子里陪你一起成长吧”
——NEU小站
',1))])}var v=a(3070),b={name:"HomeView",components:{Navbar:v.A},created(){document.title="NEU小站"}};const k=(0,d.A)(b,[["render",f],["__scopeId","data-v-1c64fc58"]]);var y=k;const C=[{path:"/",name:"home",component:y},{path:"/login",name:"login",component:()=>a.e(11).then(a.bind(a,9011))},{path:"/article/:id",name:"article-detail",component:()=>a.e(340).then(a.bind(a,3340))},{path:"/about",name:"about",component:()=>a.e(594).then(a.bind(a,2793))},{path:"/strategy",name:"strategy",component:()=>a.e(34).then(a.bind(a,3034))},{path:"/resources",name:"resources",component:()=>a.e(287).then(a.bind(a,5287))},{path:"/loading-demo",name:"loading-demo",component:()=>a.e(647).then(a.bind(a,4647))},{path:"/user-demo",name:"user-demo",component:()=>a.e(5).then(a.bind(a,2005))},{path:"/message-demo",name:"message-demo",component:()=>a.e(120).then(a.bind(a,7120))},{path:"/:pathMatch(.*)*",name:"404",component:()=>a.e(899).then(a.bind(a,3899))},{path:"/search",name:"search",component:()=>a.e(368).then(a.bind(a,7368))},{path:"/user-center",name:"user-center",component:()=>a.e(11).then(a.bind(a,9011))},{path:"/app",name:"app",component:()=>a.e(313).then(a.bind(a,2313))},{path:"/submit",name:"submit",component:()=>a.e(29).then(a.bind(a,29))},{path:"/preview",name:"preview",component:()=>a.e(340).then(a.bind(a,3340))},{path:"/edit",name:"edit-article",component:()=>a.e(29).then(a.bind(a,29))}],w=(0,m.aE)({history:(0,m.LA)("/"),routes:C});var L=w;(0,n.Ef)(p).use(L).mount("#app")},6965:function(e,t,a){a.d(t,{A:function(){return I}});var n=a(5130),s=a(6768),o=a(4232);const i={key:0,class:"login-container"},r={class:"login-box"},c={class:"login-header"},l={class:"form-group"},d={class:"form-group"},u={class:"button-group"},h={class:"modal-content"},p={class:"modal-header"},m={class:"modal-body"},g={class:"captcha-instruction"},f={class:"form-group"},v={class:"modal-footer"},b={key:0,class:"loading-overlay"};function k(e,t,a,k,y,C){return a.visible?((0,s.uX)(),(0,s.CE)("div",i,[t[14]||(t[14]=(0,s.Lk)("div",{class:"login-overlay"},null,-1)),(0,s.Lk)("div",r,[(0,s.Lk)("div",c,[t[9]||(t[9]=(0,s.Lk)("h2",{class:"login-title"},"登录/注册",-1)),a.showClose?((0,s.uX)(),(0,s.CE)("button",{key:0,onClick:t[0]||(t[0]=(...e)=>C.handleClose&&C.handleClose(...e)),class:"close-btn"},"×")):(0,s.Q3)("",!0)]),(0,s.Lk)("form",{onSubmit:t[5]||(t[5]=(0,n.D$)(((...e)=>C.handleSubmit&&C.handleSubmit(...e)),["prevent"])),class:"login-form"},[(0,s.Lk)("div",l,[t[10]||(t[10]=(0,s.Lk)("label",{for:"email"},"邮箱",-1)),(0,s.bo)((0,s.Lk)("input",{type:"email",id:"email","onUpdate:modelValue":t[1]||(t[1]=e=>y.email=e),placeholder:"请输入邮箱地址",required:"",class:"form-input",pattern:"[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,}$",title:"请输入有效的邮箱地址"},null,512),[[n.Jo,y.email]])]),(0,s.Lk)("div",d,[t[11]||(t[11]=(0,s.Lk)("label",{for:"password"},"密码",-1)),(0,s.bo)((0,s.Lk)("input",{type:"password",id:"password","onUpdate:modelValue":t[2]||(t[2]=e=>y.password=e),placeholder:"请输入密码",required:"",class:"form-input"},null,512),[[n.Jo,y.password]])]),y.message?((0,s.uX)(),(0,s.CE)("div",{key:0,class:(0,o.C4)(["message",{error:y.messageIsError,success:!y.messageIsError}])},(0,o.v_)(y.message),3)):(0,s.Q3)("",!0),(0,s.Lk)("div",u,[(0,s.Lk)("button",{type:"button",onClick:t[3]||(t[3]=(...e)=>C.login&&C.login(...e)),class:"btn btn-primary"},"登录"),(0,s.Lk)("button",{type:"button",onClick:t[4]||(t[4]=(...e)=>C.register&&C.register(...e)),class:"btn btn-secondary"},"注册")])],32)]),(0,s.Lk)("div",{class:(0,o.C4)(["modal",{show:y.showCaptchaModal}])},[(0,s.Lk)("div",h,[(0,s.Lk)("div",p,[t[12]||(t[12]=(0,s.Lk)("h3",null,"邮箱验证",-1)),(0,s.Lk)("button",{onClick:t[6]||(t[6]=(...e)=>C.closeCaptchaModal&&C.closeCaptchaModal(...e)),class:"close-btn"},"×")]),(0,s.Lk)("div",m,[(0,s.Lk)("p",g,(0,o.v_)(y.captchaInstruction),1),(0,s.Lk)("div",f,[(0,s.bo)((0,s.Lk)("input",{type:"text","onUpdate:modelValue":t[7]||(t[7]=e=>y.captchaCode=e),placeholder:"请输入验证码",class:"form-input"},null,512),[[n.Jo,y.captchaCode]])]),y.captchaMessage?((0,s.uX)(),(0,s.CE)("div",{key:0,class:(0,o.C4)(["captcha-message",{error:y.captchaMessageIsError,success:!y.captchaMessageIsError}])},(0,o.v_)(y.captchaMessage),3)):(0,s.Q3)("",!0)]),(0,s.Lk)("div",v,[(0,s.Lk)("button",{onClick:t[8]||(t[8]=(...e)=>C.verifyCaptcha&&C.verifyCaptcha(...e)),class:"btn btn-primary"},"验证")])])],2),y.loading?((0,s.uX)(),(0,s.CE)("div",b,[t[13]||(t[13]=(0,s.Lk)("div",{class:"spinner"},null,-1)),(0,s.Lk)("p",null,(0,o.v_)(y.loadingMessage),1)])):(0,s.Q3)("",!0)])):(0,s.Q3)("",!0)}var y=a(6253),C={name:"Login",props:{visible:{type:Boolean,default:!0},showClose:{type:Boolean,default:!1},onSuccess:{type:Function,default:null},onClose:{type:Function,default:null}},data(){return{email:"",password:"",message:"",messageIsError:!0,loading:!1,loadingMessage:"加载中...",showCaptchaModal:!1,captchaCode:"",captchaMessage:"",captchaMessageIsError:!0,captchaInstruction:"验证码已发送至您的邮箱,请在下方输入"}},methods:{async handleSubmit(){await this.login()},handleClose(){this.onClose?this.onClose():this.$emit("close")},async login(){if(!this.email||!this.password)return this.message="请输入邮箱和密码",void(this.messageIsError=!0);const e=/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;if(!e.test(this.email))return this.message="请输入有效的邮箱地址",void(this.messageIsError=!0);this.loading=!0,this.loadingMessage="登录中...";try{const e=await this.loginOrRegister(this.email,this.password,"login");"Login successful."===e.message?this.handleLoginSuccess(e):"User not registered."===e.message?(this.loading=!1,(0,y.A)({title:"邮箱未注册",message:'此邮箱没有注册。点击"发送"按钮将向您的邮箱发送注册验证码。',confirmText:"发送",cancelText:"取消",cancel:!0,closeOnClickOverlay:!0}).then((async()=>{await this.sendRegisterCode()})).catch((()=>{}))):"Invalid email or password."===e.message?(this.message="密码错误。",this.messageIsError=!0,this.loading=!1):(this.message=e.message||"登录失败,请重试。",this.messageIsError=!0,this.loading=!1)}catch(t){console.error("Error:",t),this.message="发生错误,请稍后重试。",this.messageIsError=!0,this.loading=!1}},async register(){if(!this.email||!this.password)return this.message="请输入邮箱和密码",void(this.messageIsError=!0);const e=/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;if(!e.test(this.email))return this.message="请输入有效的邮箱地址",void(this.messageIsError=!0);await this.sendRegisterCode()},async sendRegisterCode(){this.loading=!0,this.loadingMessage="发送验证码中...";try{const e=await this.loginOrRegister(this.email,this.password,"register");"Verification email sent."===e.message?(this.captchaInstruction="验证码已发送至您的邮箱,请在下方输入",this.captchaMessage="",this.captchaCode="",this.showCaptchaModal=!0):"A valid code has already been sent. Please try again later."===e.message?(this.captchaInstruction="您还有未验证的验证码,请查看邮箱并在下方输入",this.captchaMessage="",this.captchaCode="",this.showCaptchaModal=!0):"Email is already registered."===e.message?(this.message="此邮箱已注册。",this.messageIsError=!0):(this.message="发送验证码失败,请稍后重试。",this.messageIsError=!0),this.loading=!1}catch(e){console.error("Error:",e),this.message="发生错误,请稍后重试。",this.messageIsError=!0,this.loading=!1}},async verifyCaptcha(){if(!this.captchaCode)return this.captchaMessage="请输入验证码",void(this.captchaMessageIsError=!0);try{const e=await this.verifyRegisterCode(this.email,this.captchaCode);"User registered successfully."===e.message?(this.captchaMessage="验证成功!",this.captchaMessageIsError=!1,setTimeout((()=>{this.closeCaptchaModal(),this.handleSuccessfulRegistration()}),1500)):(this.captchaMessage="您的验证码不正确",this.captchaMessageIsError=!0)}catch(e){console.error("Error:",e),this.captchaMessage="验证过程中发生错误,请重试",this.captchaMessageIsError=!0}},closeCaptchaModal(){this.showCaptchaModal=!1,this.captchaCode="",this.captchaMessage=""},async handleSuccessfulRegistration(){this.message="注册成功!正在登录...",this.messageIsError=!1,this.loading=!0,this.loadingMessage="登录中...",await this.delay(1e3);try{const e=await this.loginOrRegister(this.email,this.password,"login");"Login successful."===e.message?this.handleLoginSuccess(e):(this.message="注册成功,但自动登录失败,请手动登录。",this.messageIsError=!0,this.loading=!1)}catch(e){console.error("Error during login after registration:",e),this.message="注册成功,但自动登录失败,请手动登录。",this.messageIsError=!0,this.loading=!1}},handleLoginSuccess(e){const t=e.token,a=window.location.hostname.includes("localhost")?"localhost":window.location.hostname.split(".").slice(-2).join(".");document.cookie=`token=${t}; max-age=86340; path=/; domain=${a}; secure; SameSite=Strict`,this.loading=!1,this.message="登录成功!正在加载中...",this.messageIsError=!1;const n={email:this.email,userId:e.id,token:e.token};this.onSuccess&&(this.onSuccess(n),window.location.reload()),this.$emit("login-success",n),this.onClose&&setTimeout((()=>{this.handleClose()}),3e3)},async loginOrRegister(e,t,a){const n="login"===a?"https://userlogin.xn--xhq44jb2fzpc.com/login":"https://userlogin.xn--xhq44jb2fzpc.com/register",s=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:e,password:t})});return s.json()},async verifyRegisterCode(e,t){const a="https://userlogin.xn--xhq44jb2fzpc.com/verify-register-code",n=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:e,code:t})});return n.json()},delay(e){return new Promise((t=>setTimeout(t,e)))}}},w=a(1241);const L=(0,w.A)(C,[["render",k],["__scopeId","data-v-514354c8"]]);var A=L;const E=(e={})=>new Promise(((t,a)=>{const s=document.createElement("div");document.body.appendChild(s);const o=(0,n.Ef)(A,{...e,visible:!0,showClose:!0,onSuccess:e=>{t(e)},onClose:()=>{o.unmount(),document.body.removeChild(s)}});o.mount(s)}));E.withCallback=(e,t={})=>E({...t,onSuccess:t=>{e(t)}});var I=E}},t={};function a(n){var s=t[n];if(void 0!==s)return s.exports;var o=t[n]={exports:{}};return e[n].call(o.exports,o,o.exports,a),o.exports}a.m=e,function(){var e=[];a.O=function(t,n,s,o){if(!n){var i=1/0;for(d=0;d=o)&&Object.keys(a.O).every((function(e){return a.O[e](n[c])}))?n.splice(c--,1):(r=!1,o0&&e[d-1][2]>o;d--)e[d]=e[d-1];e[d]=[n,s,o]}}(),function(){a.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return a.d(t,{a:t}),t}}(),function(){a.d=function(e,t){for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}}(),function(){a.f={},a.e=function(e){return Promise.all(Object.keys(a.f).reduce((function(t,n){return a.f[n](e,t),t}),[]))}}(),function(){a.u=function(e){return"js/"+(594===e?"about":e)+"."+{5:"56366bd5",11:"b856e82b",29:"7c52a143",34:"f5c2eff0",120:"e01d64ca",287:"f37f152f",313:"0593018b",340:"64ae6864",368:"658f248e",594:"e953c7d5",647:"262efcda",899:"a643b136"}[e]+".js"}}(),function(){a.miniCssF=function(e){return"css/"+(594===e?"about":e)+"."+{5:"d70f219a",11:"e28a3037",29:"ce3746ca",34:"e99d09ea",120:"720fbcc2",287:"7da28f35",313:"72ba01cb",340:"33e12b42",368:"9ee9e7c3",594:"54f7f7a6",647:"ce55be69",899:"35501d47"}[e]+".css"}}(),function(){a.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){var e={},t="newfront:";a.l=function(n,s,o,i){if(e[n])e[n].push(s);else{var r,c;if(void 0!==o)for(var l=document.getElementsByTagName("script"),d=0;dt[8]||(t[8]=[(0,n.Lk)("img",{src:"https://download.xn--xhq44jb2fzpc.com/images/logo-hd.png",alt:"NEU小站",class:"navbar-logo-img"},null,-1),(0,n.Lk)("span",null,"NEU小站",-1)]))),_:1}),(0,n.Lk)("div",{class:(0,s.C4)(["navbar-burger",{"is-active":C.isMenuActive}]),onClick:t[0]||(t[0]=(...e)=>w.toggleMenu&&w.toggleMenu(...e))},t[9]||(t[9]=[(0,n.Lk)("span",null,null,-1),(0,n.Lk)("span",null,null,-1),(0,n.Lk)("span",null,null,-1)]),2)]),(0,n.Lk)("div",{class:(0,s.C4)(["navbar-menu",{"is-active":C.isMenuActive}])},[(0,n.Lk)("div",l,[(0,n.bF)(L,{to:"/",class:"navbar-item"},{default:(0,n.k6)((()=>t[10]||(t[10]=[(0,n.eW)("首页")]))),_:1}),(0,n.bF)(L,{to:"/strategy",class:"navbar-item"},{default:(0,n.k6)((()=>t[11]||(t[11]=[(0,n.eW)("攻略指南")]))),_:1}),(0,n.bF)(L,{to:"/resources",class:"navbar-item"},{default:(0,n.k6)((()=>t[12]||(t[12]=[(0,n.eW)("资源共享")]))),_:1}),(0,n.bF)(L,{to:"/app",class:"navbar-item"},{default:(0,n.k6)((()=>t[13]||(t[13]=[(0,n.eW)("应用中心")]))),_:1}),(0,n.bF)(L,{to:"/about",class:"navbar-item"},{default:(0,n.k6)((()=>t[14]||(t[14]=[(0,n.eW)("关于")]))),_:1}),(0,n.bF)(L,{to:"/search",class:"navbar-item"},{default:(0,n.k6)((()=>t[15]||(t[15]=[(0,n.eW)("搜索")]))),_:1}),C.userInfo?((0,n.uX)(),(0,n.CE)("div",d,[(0,n.Lk)("div",{class:"user-info",onClick:t[1]||(t[1]=(...e)=>w.toggleDropdown&&w.toggleDropdown(...e))},[(0,n.Lk)("img",{src:C.userInfo.avatar_path,class:"user-avatar",alt:C.userInfo.nickname},null,8,u),(0,n.Lk)("span",h,(0,s.v_)(C.userInfo.nickname),1),(0,n.Lk)("span",{class:(0,s.C4)(["dropdown-arrow",{"is-active":C.isDropdownActive}])},"▼",2)]),(0,n.bo)((0,n.Lk)("div",p,[(0,n.Lk)("div",{class:"dropdown-item",onClick:t[2]||(t[2]=(...e)=>w.handleUserCenter&&w.handleUserCenter(...e))},"个人中心"),(0,n.Lk)("div",{class:"dropdown-item",onClick:t[3]||(t[3]=(...e)=>w.handleLogout&&w.handleLogout(...e))},"退出登录")],512),[[o.aG,C.isDropdownActive]])])):((0,n.uX)(),(0,n.CE)("div",m,[(0,n.Lk)("a",{class:"login-btn",onClick:t[4]||(t[4]=(...e)=>w.handleLogin&&w.handleLogin(...e))},"登录")]))])],2)]),C.showActivationDialog?((0,n.uX)(),(0,n.CE)("div",g,[(0,n.Lk)("div",f,[t[20]||(t[20]=(0,n.Lk)("h3",null,"账户激活",-1)),t[21]||(t[21]=(0,n.Lk)("p",null,"您的账户尚未激活,请选择以下方式进行激活:",-1)),(0,n.Lk)("div",v,[(0,n.Lk)("div",b,[t[16]||(t[16]=(0,n.Lk)("h4",null,"方式 1:NEU 校园网验证",-1)),t[17]||(t[17]=(0,n.Lk)("p",null,"请连接 NEU 校园网后点击下面的验证按钮(暂不支持秦皇岛分校)",-1)),(0,n.Lk)("button",{onClick:t[5]||(t[5]=(...e)=>w.handleNetworkVerify&&w.handleNetworkVerify(...e)),class:"verify-btn"},"校园网验证")]),(0,n.Lk)("div",k,[t[18]||(t[18]=(0,n.Lk)("h4",null,"方式 2:校园邮箱验证",-1)),t[19]||(t[19]=(0,n.Lk)("p",null,"使用 @stu.neu.edu.cn 或 @stu.neuq.edu.cn 后缀的校园邮箱验证",-1)),(0,n.Lk)("button",{onClick:t[6]||(t[6]=(...e)=>w.handleEmailVerify&&w.handleEmailVerify(...e)),class:"verify-btn"},"邮箱验证")])]),(0,n.Lk)("button",{onClick:t[7]||(t[7]=(...e)=>w.handleLogout&&w.handleLogout(...e)),class:"close-btn"},"退出登录")])])):(0,n.Q3)("",!0)])}a(4114);var C=a(8704),w=a(4373),L=a(6253),A=a(6965),E={name:"NavBar",data(){return{isMenuActive:!1,isDropdownActive:!1,userInfo:null,showActivationDialog:!1,isActivated:!1}},mounted(){this.checkLoginStatus()},methods:{handleLogin(){(0,A.A)().then((e=>{console.log(e),this.checkLoginStatus()})).catch((e=>{console.log(e)}))},toggleMenu(){this.isMenuActive=!this.isMenuActive},toggleDropdown(){this.isDropdownActive=!this.isDropdownActive},handleUserCenter(){this.isDropdownActive=!1,this.$router.push("/user-center")},handleLogout(){const e=window.location.hostname.includes("localhost")?"localhost":window.location.hostname.split(".").slice(-2).join(".");C.A.remove("token",{domain:e,path:"/"}),this.userInfo=null,window.location.reload()},checkLoginStatus(){const e=C.A.get("token");e&&w.A.get("https://newfront.xn--xhq44jb2fzpc.com/user/info",{headers:{Authorization:e}}).then((e=>{this.userInfo=e.data,this.isActivated=e.data.activated,this.isActivated||(this.showActivationDialog=!0)})).catch((e=>{console.log(e),this.userInfo=null}))},checkActivationStatus(e){},closeActivationDialog(){this.showActivationDialog=!1},handleNetworkVerify(){const e=C.A.get("token");e?w.A.get("https://userlogin.xn--xhq44jb2fzpc.com/qv",{headers:{Authorization:e}}).then((e=>{L.A.alert(e.data.message,"提示"),this.isActivated=!0,this.showActivationDialog=!1})).catch((e=>{e.response&&e.response.data?L.A.alert(`${e.response.data.message} 当前IP: ${e.response.data.ip||"未知"}`,"提示"):L.A.alert("验证失败,请稍后重试","提示")})):L.A.alert("您未登录,请先登录后操作!","提示")},handleEmailVerify(){const e=C.A.get("token");e?w.A.get("https://userlogin.xn--xhq44jb2fzpc.com/check-email",{headers:{Authorization:e}}).then((e=>{L.A.alert(e.data.message,"提示"),this.isActivated=!0,this.showActivationDialog=!1})).catch((t=>{t.response&&403===t.response.status?this.promptForCampusEmail(e):t.response&&t.response.data?L.A.alert(t.response.data.message||"发生未知错误,请稍后重试","提示"):L.A.alert("验证失败,请稍后重试","提示")})):L.A.alert("您未登录,请先登录后操作!","提示")},promptForCampusEmail(e){(0,L.A)({title:"校园邮箱验证",message:"请输入您的 @stu.neu.edu.cn 或 @stu.neuq.edu.cn 校园邮箱:",showInput:!0,inputPlaceholder:"请输入校园邮箱",confirmText:"确认",cancelText:"取消",cancel:!0}).then((({value:t})=>{t?t.endsWith("@stu.neu.edu.cn")||t.endsWith("@stu.neuq.edu.cn")?this.sendCampusVerificationEmail(t,e):L.A.alert("请输入有效的 @stu.neu.edu.cn 或 @stu.neuq.edu.cn 校园邮箱!","提示"):L.A.alert("邮箱不能为空","提示")})).catch((()=>{}))},sendCampusVerificationEmail(e,t){w.A.post("https://userlogin.xn--xhq44jb2fzpc.com/send-campus-verify",{campus_email:e},{headers:{Authorization:t,"Content-Type":"application/json"}}).then((t=>{L.A.alert(`验证邮件已发送至 ${e},请检查您的邮箱完成验证。`,"提示")})).catch((e=>{e.response&&e.response.data?L.A.alert(`发送验证邮件失败:${e.response.data.message}`,"提示"):L.A.alert("发送验证邮件失败,请稍后重试","提示")}))}}},I=a(1241);const M=(0,I.A)(E,[["render",y],["__scopeId","data-v-868bf484"]]);var S=M},4876:function(e,t,a){a.d(t,{A:function(){return f}});var n=a(6768),s=a(5130),o=a(4232);const i={class:"message-box"},r={key:0,class:"message-header"},c={class:"message-content"},l={key:0,class:"input-wrapper"},d=["type","placeholder"],u={class:"message-footer"};function h(e,t,a,h,p,m){return(0,n.uX)(),(0,n.Wv)(s.eB,{name:"message-fade"},{default:(0,n.k6)((()=>[a.visible?((0,n.uX)(),(0,n.CE)("div",{key:0,class:"message-overlay",onClick:t[4]||(t[4]=(0,s.D$)(((...e)=>m.handleOverlayClick&&m.handleOverlayClick(...e)),["self"]))},[(0,n.Lk)("div",i,[a.title?((0,n.uX)(),(0,n.CE)("div",r,[(0,n.Lk)("h3",null,(0,o.v_)(a.title),1)])):(0,n.Q3)("",!0),(0,n.Lk)("div",c,[(0,n.Lk)("p",null,(0,o.v_)(a.message),1),a.showInput?((0,n.uX)(),(0,n.CE)("div",l,[(0,n.bo)((0,n.Lk)("input",{"onUpdate:modelValue":t[0]||(t[0]=e=>p.localInputValue=e),type:a.inputType,placeholder:a.inputPlaceholder,class:"message-input",onKeyup:t[1]||(t[1]=(0,s.jR)(((...e)=>m.handleConfirm&&m.handleConfirm(...e)),["enter"]))},null,40,d),[[s.hp,p.localInputValue]])])):(0,n.Q3)("",!0)]),(0,n.Lk)("div",u,[m.cancelVisible?((0,n.uX)(),(0,n.CE)("button",{key:0,class:"btn btn-cancel",onClick:t[2]||(t[2]=(...e)=>m.handleCancel&&m.handleCancel(...e))},(0,o.v_)(a.cancelText),1)):(0,n.Q3)("",!0),m.confirmVisible?((0,n.uX)(),(0,n.CE)("button",{key:1,class:"btn btn-confirm",onClick:t[3]||(t[3]=(...e)=>m.handleConfirm&&m.handleConfirm(...e))},(0,o.v_)(a.confirmText),1)):(0,n.Q3)("",!0)])])])):(0,n.Q3)("",!0)])),_:1})}var p={name:"MessageBox",props:{visible:{type:Boolean,default:!1},title:{type:String,default:""},message:{type:String,required:!0},confirm:{type:Boolean,default:!0},cancel:{type:Boolean,default:!1},confirmText:{type:String,default:"确定"},cancelText:{type:String,default:"取消"},closeOnClickOverlay:{type:Boolean,default:!1},showInput:{type:Boolean,default:!1},inputType:{type:String,default:"text"},inputValue:{type:String,default:""},inputPlaceholder:{type:String,default:"请输入"}},data(){return{localInputValue:""}},watch:{inputValue:{immediate:!0,handler(e){this.localInputValue=e}}},computed:{confirmVisible(){return this.confirm},cancelVisible(){return this.cancel}},methods:{handleConfirm(){this.$emit("confirm",this.localInputValue)},handleCancel(){this.$emit("cancel")},handleOverlayClick(){this.closeOnClickOverlay&&this.$emit("cancel")}}},m=a(1241);const g=(0,m.A)(p,[["render",h],["__scopeId","data-v-076938bc"]]);var f=g},6253:function(e,t,a){var n=a(5130),s=a(4876);const o=(e={})=>new Promise(((t,a)=>{const o=document.createElement("div");document.body.appendChild(o);const i=(0,n.Ef)(s.A,{...e,visible:!0,confirm:!1!==e.confirm,cancel:!0===e.cancel,onConfirm:e=>{i.unmount(),document.body.removeChild(o),t({value:e,action:"confirm"})},onCancel:()=>{i.unmount(),document.body.removeChild(o),a({action:"cancel"})}});i.mount(o)}));o.alert=(e,t="",a={})=>o({title:t,message:e,confirm:!0,cancel:!1,...a}),o.confirm=(e,t="",a={})=>o({title:t,message:e,confirm:!0,cancel:!0,...a}),o.prompt=(e,t="",a={})=>o({title:t,message:e,showInput:!0,confirm:!0,cancel:!0,...a}),t.A=o},6597:function(e,t,a){var n=a(5130),s=a(6768);const o={id:"app"},i={class:"beian-footer"},r={class:"container"},c={class:"copyright"};function l(e,t){const a=(0,s.g2)("router-view"),n=(0,s.g2)("router-link");return(0,s.uX)(),(0,s.CE)("div",o,[(0,s.bF)(a),(0,s.Lk)("footer",i,[(0,s.Lk)("div",r,[t[2]||(t[2]=(0,s.Lk)("span",{style:{"white-space":"nowrap"}},[(0,s.Lk)("img",{src:"https://beian.mps.gov.cn/web/assets/logo01.6189a29f.png",alt:"公安标识",style:{"vertical-align":"middle",height:"16px",display:"inline-block"}}),(0,s.Lk)("a",{href:"https://beian.mps.gov.cn/",target:"_blank"}," 赣公网安备36090202000259号"),(0,s.eW)(" | "),(0,s.Lk)("a",{href:"https://beian.miit.gov.cn/",target:"_blank"},"赣ICP备2024039267号-1")],-1)),(0,s.Lk)("div",c,[t[1]||(t[1]=(0,s.eW)(" © 2025 ")),(0,s.bF)(n,{to:"/about"},{default:(0,s.k6)((()=>t[0]||(t[0]=[(0,s.eW)("NEU小站")]))),_:1})])])])])}var d=a(1241);const u={},h=(0,d.A)(u,[["render",l]]);var p=h,m=a(1387);const g={class:"home"};function f(e,t,a,n,o,i){const r=(0,s.g2)("Navbar");return(0,s.uX)(),(0,s.CE)("div",g,[(0,s.bF)(r),t[0]||(t[0]=(0,s.Fv)('
欢迎访问NEU小站
NEUer的实用工具站
“哈哈,恭喜你发现了宝藏,让我在接下来的日子里陪你一起成长吧”
——NEU小站
',1))])}var v=a(3070),b={name:"HomeView",components:{Navbar:v.A},created(){document.title="NEU小站"}};const k=(0,d.A)(b,[["render",f],["__scopeId","data-v-1c64fc58"]]);var y=k;const C=[{path:"/",name:"home",component:y},{path:"/login",name:"login",component:()=>a.e(246).then(a.bind(a,1246))},{path:"/article/:id",name:"article-detail",component:()=>a.e(340).then(a.bind(a,3340))},{path:"/about",name:"about",component:()=>a.e(594).then(a.bind(a,2793))},{path:"/strategy",name:"strategy",component:()=>a.e(34).then(a.bind(a,3034))},{path:"/resources",name:"resources",component:()=>a.e(287).then(a.bind(a,5287))},{path:"/loading-demo",name:"loading-demo",component:()=>a.e(647).then(a.bind(a,4647))},{path:"/user-demo",name:"user-demo",component:()=>a.e(5).then(a.bind(a,2005))},{path:"/message-demo",name:"message-demo",component:()=>a.e(120).then(a.bind(a,7120))},{path:"/:pathMatch(.*)*",name:"404",component:()=>a.e(899).then(a.bind(a,3899))},{path:"/search",name:"search",component:()=>a.e(368).then(a.bind(a,7368))},{path:"/user-center",name:"user-center",component:()=>a.e(246).then(a.bind(a,1246))},{path:"/app",name:"app",component:()=>a.e(313).then(a.bind(a,2313))},{path:"/submit",name:"submit",component:()=>a.e(29).then(a.bind(a,29))},{path:"/preview",name:"preview",component:()=>a.e(340).then(a.bind(a,3340))},{path:"/edit",name:"edit-article",component:()=>a.e(29).then(a.bind(a,29))}],w=(0,m.aE)({history:(0,m.LA)("/"),routes:C});var L=w;(0,n.Ef)(p).use(L).mount("#app")},6965:function(e,t,a){a.d(t,{A:function(){return I}});var n=a(5130),s=a(6768),o=a(4232);const i={key:0,class:"login-container"},r={class:"login-box"},c={class:"login-header"},l={class:"form-group"},d={class:"form-group"},u={class:"button-group"},h={class:"modal-content"},p={class:"modal-header"},m={class:"modal-body"},g={class:"captcha-instruction"},f={class:"form-group"},v={class:"modal-footer"},b={key:0,class:"loading-overlay"};function k(e,t,a,k,y,C){return a.visible?((0,s.uX)(),(0,s.CE)("div",i,[t[14]||(t[14]=(0,s.Lk)("div",{class:"login-overlay"},null,-1)),(0,s.Lk)("div",r,[(0,s.Lk)("div",c,[t[9]||(t[9]=(0,s.Lk)("h2",{class:"login-title"},"登录/注册",-1)),a.showClose?((0,s.uX)(),(0,s.CE)("button",{key:0,onClick:t[0]||(t[0]=(...e)=>C.handleClose&&C.handleClose(...e)),class:"close-btn"},"×")):(0,s.Q3)("",!0)]),(0,s.Lk)("form",{onSubmit:t[5]||(t[5]=(0,n.D$)(((...e)=>C.handleSubmit&&C.handleSubmit(...e)),["prevent"])),class:"login-form"},[(0,s.Lk)("div",l,[t[10]||(t[10]=(0,s.Lk)("label",{for:"email"},"邮箱",-1)),(0,s.bo)((0,s.Lk)("input",{type:"email",id:"email","onUpdate:modelValue":t[1]||(t[1]=e=>y.email=e),placeholder:"请输入邮箱地址",required:"",class:"form-input",pattern:"[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,}$",title:"请输入有效的邮箱地址"},null,512),[[n.Jo,y.email]])]),(0,s.Lk)("div",d,[t[11]||(t[11]=(0,s.Lk)("label",{for:"password"},"密码",-1)),(0,s.bo)((0,s.Lk)("input",{type:"password",id:"password","onUpdate:modelValue":t[2]||(t[2]=e=>y.password=e),placeholder:"请输入密码",required:"",class:"form-input"},null,512),[[n.Jo,y.password]])]),y.message?((0,s.uX)(),(0,s.CE)("div",{key:0,class:(0,o.C4)(["message",{error:y.messageIsError,success:!y.messageIsError}])},(0,o.v_)(y.message),3)):(0,s.Q3)("",!0),(0,s.Lk)("div",u,[(0,s.Lk)("button",{type:"button",onClick:t[3]||(t[3]=(...e)=>C.login&&C.login(...e)),class:"btn btn-primary"},"登录"),(0,s.Lk)("button",{type:"button",onClick:t[4]||(t[4]=(...e)=>C.register&&C.register(...e)),class:"btn btn-secondary"},"注册")])],32)]),(0,s.Lk)("div",{class:(0,o.C4)(["modal",{show:y.showCaptchaModal}])},[(0,s.Lk)("div",h,[(0,s.Lk)("div",p,[t[12]||(t[12]=(0,s.Lk)("h3",null,"邮箱验证",-1)),(0,s.Lk)("button",{onClick:t[6]||(t[6]=(...e)=>C.closeCaptchaModal&&C.closeCaptchaModal(...e)),class:"close-btn"},"×")]),(0,s.Lk)("div",m,[(0,s.Lk)("p",g,(0,o.v_)(y.captchaInstruction),1),(0,s.Lk)("div",f,[(0,s.bo)((0,s.Lk)("input",{type:"text","onUpdate:modelValue":t[7]||(t[7]=e=>y.captchaCode=e),placeholder:"请输入验证码",class:"form-input"},null,512),[[n.Jo,y.captchaCode]])]),y.captchaMessage?((0,s.uX)(),(0,s.CE)("div",{key:0,class:(0,o.C4)(["captcha-message",{error:y.captchaMessageIsError,success:!y.captchaMessageIsError}])},(0,o.v_)(y.captchaMessage),3)):(0,s.Q3)("",!0)]),(0,s.Lk)("div",v,[(0,s.Lk)("button",{onClick:t[8]||(t[8]=(...e)=>C.verifyCaptcha&&C.verifyCaptcha(...e)),class:"btn btn-primary"},"验证")])])],2),y.loading?((0,s.uX)(),(0,s.CE)("div",b,[t[13]||(t[13]=(0,s.Lk)("div",{class:"spinner"},null,-1)),(0,s.Lk)("p",null,(0,o.v_)(y.loadingMessage),1)])):(0,s.Q3)("",!0)])):(0,s.Q3)("",!0)}var y=a(6253),C={name:"Login",props:{visible:{type:Boolean,default:!0},showClose:{type:Boolean,default:!1},onSuccess:{type:Function,default:null},onClose:{type:Function,default:null}},data(){return{email:"",password:"",message:"",messageIsError:!0,loading:!1,loadingMessage:"加载中...",showCaptchaModal:!1,captchaCode:"",captchaMessage:"",captchaMessageIsError:!0,captchaInstruction:"验证码已发送至您的邮箱,请在下方输入"}},methods:{async handleSubmit(){await this.login()},handleClose(){this.onClose?this.onClose():this.$emit("close")},async login(){if(!this.email||!this.password)return this.message="请输入邮箱和密码",void(this.messageIsError=!0);const e=/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;if(!e.test(this.email))return this.message="请输入有效的邮箱地址",void(this.messageIsError=!0);this.loading=!0,this.loadingMessage="登录中...";try{const e=await this.loginOrRegister(this.email,this.password,"login");"Login successful."===e.message?this.handleLoginSuccess(e):"User not registered."===e.message?(this.loading=!1,(0,y.A)({title:"邮箱未注册",message:'此邮箱没有注册。点击"发送"按钮将向您的邮箱发送注册验证码。',confirmText:"发送",cancelText:"取消",cancel:!0,closeOnClickOverlay:!0}).then((async()=>{await this.sendRegisterCode()})).catch((()=>{}))):"Invalid email or password."===e.message?(this.message="密码错误。",this.messageIsError=!0,this.loading=!1):(this.message=e.message||"登录失败,请重试。",this.messageIsError=!0,this.loading=!1)}catch(t){console.error("Error:",t),this.message="发生错误,请稍后重试。",this.messageIsError=!0,this.loading=!1}},async register(){if(!this.email||!this.password)return this.message="请输入邮箱和密码",void(this.messageIsError=!0);const e=/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;if(!e.test(this.email))return this.message="请输入有效的邮箱地址",void(this.messageIsError=!0);await this.sendRegisterCode()},async sendRegisterCode(){this.loading=!0,this.loadingMessage="发送验证码中...";try{const e=await this.loginOrRegister(this.email,this.password,"register");"Verification email sent."===e.message?(this.captchaInstruction="验证码已发送至您的邮箱,请在下方输入",this.captchaMessage="",this.captchaCode="",this.showCaptchaModal=!0):"A valid code has already been sent. Please try again later."===e.message?(this.captchaInstruction="您还有未验证的验证码,请查看邮箱并在下方输入",this.captchaMessage="",this.captchaCode="",this.showCaptchaModal=!0):"Email is already registered."===e.message?(this.message="此邮箱已注册。",this.messageIsError=!0):(this.message="发送验证码失败,请稍后重试。",this.messageIsError=!0),this.loading=!1}catch(e){console.error("Error:",e),this.message="发生错误,请稍后重试。",this.messageIsError=!0,this.loading=!1}},async verifyCaptcha(){if(!this.captchaCode)return this.captchaMessage="请输入验证码",void(this.captchaMessageIsError=!0);try{const e=await this.verifyRegisterCode(this.email,this.captchaCode);"User registered successfully."===e.message?(this.captchaMessage="验证成功!",this.captchaMessageIsError=!1,setTimeout((()=>{this.closeCaptchaModal(),this.handleSuccessfulRegistration()}),1500)):(this.captchaMessage="您的验证码不正确",this.captchaMessageIsError=!0)}catch(e){console.error("Error:",e),this.captchaMessage="验证过程中发生错误,请重试",this.captchaMessageIsError=!0}},closeCaptchaModal(){this.showCaptchaModal=!1,this.captchaCode="",this.captchaMessage=""},async handleSuccessfulRegistration(){this.message="注册成功!正在登录...",this.messageIsError=!1,this.loading=!0,this.loadingMessage="登录中...",await this.delay(1e3);try{const e=await this.loginOrRegister(this.email,this.password,"login");"Login successful."===e.message?this.handleLoginSuccess(e):(this.message="注册成功,但自动登录失败,请手动登录。",this.messageIsError=!0,this.loading=!1)}catch(e){console.error("Error during login after registration:",e),this.message="注册成功,但自动登录失败,请手动登录。",this.messageIsError=!0,this.loading=!1}},handleLoginSuccess(e){const t=e.token,a=window.location.hostname.includes("localhost")?"localhost":window.location.hostname.split(".").slice(-2).join(".");document.cookie=`token=${t}; max-age=86340; path=/; domain=${a}; secure; SameSite=Strict`,this.loading=!1,this.message="登录成功!正在加载中...",this.messageIsError=!1;const n={email:this.email,userId:e.id,token:e.token};this.onSuccess&&(this.onSuccess(n),window.location.reload()),this.$emit("login-success",n),this.onClose&&setTimeout((()=>{this.handleClose()}),3e3)},async loginOrRegister(e,t,a){const n="login"===a?"https://userlogin.xn--xhq44jb2fzpc.com/login":"https://userlogin.xn--xhq44jb2fzpc.com/register",s=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:e,password:t})});return s.json()},async verifyRegisterCode(e,t){const a="https://userlogin.xn--xhq44jb2fzpc.com/verify-register-code",n=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:e,code:t})});return n.json()},delay(e){return new Promise((t=>setTimeout(t,e)))}}},w=a(1241);const L=(0,w.A)(C,[["render",k],["__scopeId","data-v-514354c8"]]);var A=L;const E=(e={})=>new Promise(((t,a)=>{const s=document.createElement("div");document.body.appendChild(s);const o=(0,n.Ef)(A,{...e,visible:!0,showClose:!0,onSuccess:e=>{t(e)},onClose:()=>{o.unmount(),document.body.removeChild(s)}});o.mount(s)}));E.withCallback=(e,t={})=>E({...t,onSuccess:t=>{e(t)}});var I=E}},t={};function a(n){var s=t[n];if(void 0!==s)return s.exports;var o=t[n]={exports:{}};return e[n].call(o.exports,o,o.exports,a),o.exports}a.m=e,function(){var e=[];a.O=function(t,n,s,o){if(!n){var i=1/0;for(d=0;d=o)&&Object.keys(a.O).every((function(e){return a.O[e](n[c])}))?n.splice(c--,1):(r=!1,o0&&e[d-1][2]>o;d--)e[d]=e[d-1];e[d]=[n,s,o]}}(),function(){a.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return a.d(t,{a:t}),t}}(),function(){a.d=function(e,t){for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}}(),function(){a.f={},a.e=function(e){return Promise.all(Object.keys(a.f).reduce((function(t,n){return a.f[n](e,t),t}),[]))}}(),function(){a.u=function(e){return"js/"+(594===e?"about":e)+"."+{5:"56366bd5",29:"7c52a143",34:"f5c2eff0",120:"e01d64ca",246:"7afadba1",287:"f37f152f",313:"0593018b",340:"64ae6864",368:"658f248e",594:"e953c7d5",647:"262efcda",899:"a643b136"}[e]+".js"}}(),function(){a.miniCssF=function(e){return"css/"+(594===e?"about":e)+"."+{5:"d70f219a",29:"ce3746ca",34:"e99d09ea",120:"720fbcc2",246:"6342d496",287:"7da28f35",313:"72ba01cb",340:"33e12b42",368:"9ee9e7c3",594:"54f7f7a6",647:"ce55be69",899:"35501d47"}[e]+".css"}}(),function(){a.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){var e={},t="newfront:";a.l=function(n,s,o,i){if(e[n])e[n].push(s);else{var r,c;if(void 0!==o)for(var l=document.getElementsByTagName("script"),d=0;d