document.addEventListener('DOMContentLoaded', function () { var currentUserName = document.getElementById('currentUserName'); var logoutBtn = document.getElementById('logoutBtn'); var sidebarNav = document.getElementById('sidebarNav'); var sectionTitle = document.getElementById('sectionTitle'); var sectionDesc = document.getElementById('sectionDesc'); var subTabs = document.getElementById('subTabs'); var mainView = document.getElementById('mainView'); var state = { user: null, currentView: '', currentTab: 'all', events: [], myEvents: [], adminUsers: [], adminRegistrations: [], adminEvents: [], editingEventId: null }; var studentMenus = [ { key: 'profile', label: '涓汉淇℃伅', desc: '鏌ョ湅骞剁淮鎶ゅ綋鍓嶇櫥褰曚汉鍛樼殑鍩虹璧勬枡銆? }, { key: 'events', label: '杩愬姩浼氭姤鍚?, desc: '娴忚鎵€鏈夐」鐩苟瀹屾垚鎶ュ悕锛屼篃鍙互鏌ョ湅鑷繁鐨勬姤鍚嶄俊鎭€? } ]; var adminMenus = [ { key: 'admin-home', label: '杩愬姩浼氱鐞?, desc: '鏌ョ湅鍚庡彴棣栭〉鍜岀郴缁熸瑙堛€? }, { key: 'team-info', label: '鍥綋淇℃伅绠$悊', desc: '缁存姢鍙傝禌鍥綋涓庣粍缁囦俊鎭€? }, { key: 'user-manage', label: '鐢ㄦ埛淇℃伅绠$悊', desc: '鏌ョ湅銆佺淮鎶ょ敤鎴疯祫鏂欏苟鎵ц璐﹀彿绠$悊鎿嶄綔銆? }, { key: 'event-manage', label: '椤圭洰绠$悊', desc: '缁存姢璧涗簨椤圭洰銆佸垎绫汇€佺粍鍒拰鎶ュ悕鍙傛暟銆? }, { key: 'athlete-manage', label: '鍙傝禌杩愬姩鍛樼鐞?, desc: '鏌ョ湅鎵€鏈夊凡鎶ュ悕杩愬姩鍛樺拰鍙傝禌鍚嶅崟銆? }, { key: 'score-manage', label: '鍙傝禌鎴愮哗绠$悊', desc: '褰曞叆銆佹煡鐪嬪拰缁存姢姣旇禌鎴愮哗銆? }, { key: 'record-manage', label: '椤圭洰璁板綍绠$悊', desc: '绠$悊椤圭洰璁板綍銆佺З搴忓唽鍜岃禌浜嬭褰曘€? }, { key: 'system-manage', label: '绯荤粺绠$悊', desc: '缁存姢绯荤粺鍩虹閰嶇疆鍜屽悗鍙拌繍琛屼俊鎭€? } ]; function escapeHtml(value) { return String(value == null ? '' : value) .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } function getMenus() { return state.user && state.user.role === 'ADMIN' ? adminMenus : studentMenus; } function renderSidebar() { var menus = getMenus(); sidebarNav.innerHTML = menus.map(function (item, index) { return ''; }).join(''); Array.prototype.slice.call(sidebarNav.querySelectorAll('.nav-item')).forEach(function (button) { button.addEventListener('click', function () { switchView(button.getAttribute('data-view')); }); }); } function renderTabs() { var html = ''; if (state.currentView === 'events') { html = '' + '' + ''; } subTabs.innerHTML = html; subTabs.classList.toggle('hidden', !html); Array.prototype.slice.call(subTabs.querySelectorAll('.tab-item')).forEach(function (button) { button.addEventListener('click', function () { state.currentTab = button.getAttribute('data-tab'); renderTabs(); renderCurrentView(); }); }); } function renderProfile() { mainView.innerHTML = '' + '
' + '

鍩虹璧勬枡

褰撳墠璐﹀彿鐨勪釜浜轰俊鎭涓嬨€?/p>

' + '
' + '
韬唤璇佸彿

' + escapeHtml(state.user.idCard) + '

' + '
鐧诲綍璐﹀彿

' + escapeHtml(state.user.username) + '

' + '
濮撳悕

' + escapeHtml(state.user.name) + '

' + '
鑱旂郴鐢佃瘽

' + escapeHtml(state.user.phone) + '

' + '
鎬у埆

' + escapeHtml(state.user.gender) + '

' + '
瀛﹂櫌

' + escapeHtml(state.user.college) + '

' + '
鐝骇

' + escapeHtml(state.user.className) + '

' + '
瀛﹀彿

' + escapeHtml(state.user.studentNo) + '

' + '
绫诲埆

' + escapeHtml(state.user.category) + '

' + '
瑙掕壊

' + escapeHtml(state.user.role) + '

' + '
' + '
'; } function renderProfile() { mainView.innerHTML = '' + '
' + '

鍩虹璧勬枡

褰撳墠璐﹀彿鐨勪釜浜轰俊鎭涓嬨€?/p>

' + '
' + '
韬唤璇佸彿

' + escapeHtml(state.user.idCard) + '

' + '
鐧诲綍璐﹀彿

' + escapeHtml(state.user.username) + '

' + '
濮撳悕

' + escapeHtml(state.user.name) + '

' + '
鑱旂郴鐢佃瘽

' + escapeHtml(state.user.phone) + '

' + '
鎬у埆

' + escapeHtml(state.user.gender) + '

' + '
瀛﹂櫌

' + escapeHtml(state.user.college) + '

' + '
鐝骇

' + escapeHtml(state.user.className) + '

' + '
瀛﹀彿

' + escapeHtml(state.user.studentNo) + '

' + '
绫诲埆

' + escapeHtml(state.user.category) + '

' + '
瑙掕壊

' + escapeHtml(state.user.role) + '

' + '
' + '
' + '
' + '

淇敼涓汉淇℃伅

鍙互鍦ㄨ繖閲屾洿鏂板鍚嶃€佺數璇濄€佸闄€佺彮绾у拰瀛﹀彿绛変俊鎭€?/p>

' + '
' + ' ' + '
' + '

' + ' ' + ''; bindProfileForm(); } function bindProfileForm() { var form = document.getElementById('profileForm'); var messageEl = document.getElementById('profileMessage'); if (!form) { return; } form.addEventListener('submit', function (event) { event.preventDefault(); var formData = new FormData(form); var payload = { name: String(formData.get('name') || '').trim(), phone: String(formData.get('phone') || '').trim(), gender: String(formData.get('gender') || '').trim(), college: String(formData.get('college') || '').trim(), className: String(formData.get('className') || '').trim(), studentNo: String(formData.get('studentNo') || '').trim(), category: String(formData.get('category') || '').trim() }; appUtils.ajax({ method: 'PUT', url: '/api/users/me', data: payload, success: function (response) { if (!response.success || !response.data) { appUtils.showMessage(messageEl, response.message || '淇敼澶辫触', false); return; } state.user = response.data; currentUserName.textContent = state.user.name + (state.user.role === 'ADMIN' ? ' 绠$悊鍛? : ' 鐢ㄦ埛'); renderProfile(); appUtils.showMessage(document.getElementById('profileMessage'), 'Saved successfully', true); }, error: function (xhr, response) { appUtils.showMessage(messageEl, (response && response.message) || '淇敼澶辫触', false); } }); }); } function renderEventTable(list, isMine) { if (!list.length) { mainView.innerHTML = '

鏆傛棤鏁版嵁

' + (isMine ? '褰撳墠杩樻病鏈夋姤鍚嶈褰曘€? : '褰撳墠娌℃湁鍙睍绀洪」鐩€?) + '

'; return; } mainView.innerHTML = '' + '' + ' ' + ' ' + list.map(function (item) { var actionHtml = isMine ? '' : ''; return '' + '' + '' + '' + '' + '' + '' + '' + '' + ''; }).join('') + ' ' + '
椤圭洰鍚嶇О椤圭洰绫诲埆姣旇禌鏃堕棿姣旇禌鍦扮偣鎶ュ悕鎯呭喌椤圭洰璇存槑鎿嶄綔
' + escapeHtml(item.eventName) + '' + escapeHtml(item.eventCategory) + '' + escapeHtml(item.eventTime) + '' + escapeHtml(item.location) + '' + escapeHtml(item.registeredCount + '/' + item.quota) + '' + escapeHtml(item.description) + '' + actionHtml + '
'; bindEventButtons(); } function renderUserManage() { if (!state.adminUsers.length) { mainView.innerHTML = '

鏆傛棤鐢ㄦ埛

褰撳墠绯荤粺杩樻病鏈夌敤鎴锋暟鎹€?/p>

'; return; } mainView.innerHTML = '' + '
' + '

鏁版嵁姒傝

鏌ョ湅褰撳墠绯荤粺鍐呯敤鎴锋€讳綋鎯呭喌銆?/p>

' + '
' + '
鐢ㄦ埛鎬绘暟

' + state.adminUsers.length + '

' + '
绠$悊鍛樻暟閲?/strong>

' + state.adminUsers.filter(function (item) { return item.role === "ADMIN"; }).length + '

' + '
绂佺敤璐﹀彿鏁伴噺

' + state.adminUsers.filter(function (item) { return item.status === "DISABLED"; }).length + '

' + '
' + '
' + '
' + '

鐢ㄦ埛鍒楄〃

鏌ョ湅绯荤粺鍐呮墍鏈夌敤鎴蜂俊鎭€?/p>

' + ' ' + ' ' + ' ' + state.adminUsers.map(function (item) { var isAdmin = item.role === 'ADMIN'; var statusText = item.status === 'DISABLED' ? '宸茬鐢? : '姝e父'; var statusAction = isAdmin ? '' : (item.status === 'DISABLED' ? '' : ''); var deleteAction = isAdmin ? '' : ''; return '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + ''; }).join('') + ' ' + '
濮撳悕璐﹀彿韬唤璇佸彿鐢佃瘽鎬у埆瀛﹂櫌绫诲埆瑙掕壊鐘舵€?/th>鎿嶄綔
' + escapeHtml(item.name) + '' + escapeHtml(item.username) + '' + escapeHtml(item.idCard) + '' + escapeHtml(item.phone) + '' + escapeHtml(item.gender) + '' + escapeHtml(item.college) + '' + escapeHtml(item.category) + '' + escapeHtml(isAdmin ? '绠$悊鍛? : '鏅€氱敤鎴?) + '' + escapeHtml(statusText) + ' ' + statusAction + ' ' + deleteAction + '
' + '
'; bindUserManageActions(); } function renderAthleteManage() { if (!state.adminRegistrations.length) { mainView.innerHTML = '

鏆傛棤鎶ュ悕璁板綍

褰撳墠杩樻病鏈夊弬璧涜繍鍔ㄥ憳鏁版嵁銆?/p>

'; return; } mainView.innerHTML = '' + '
' + '

鏁版嵁姒傝

鏌ョ湅褰撳墠鍙傝禌杩愬姩鍛樼殑鎬讳綋缁熻銆?/p>

' + '
' + '
鎶ュ悕璁板綍鎬绘暟

' + state.adminRegistrations.length + '

' + '
宸叉姤鍚嶇姸鎬?/strong>

' + state.adminRegistrations.filter(function (item) { return item.status === "宸叉姤鍚?; }).length + '

' + '
瑕嗙洊椤圭洰鏁?/strong>

' + uniqueEventCount() + '

' + '
' + '
' + '
' + '

鍙傝禌鍚嶅崟

鏌ョ湅鎵€鏈夊凡鎶ュ悕杩愬姩鍛樺拰椤圭洰鏄庣粏銆?/p>

' + ' ' + ' ' + ' ' + state.adminRegistrations.map(function (item) { return '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + ''; }).join('') + ' ' + '
濮撳悕璐﹀彿鐢佃瘽瀛﹂櫌绫诲埆椤圭洰鍚嶇О椤圭洰绫诲埆鏃堕棿鍦扮偣鐘舵€?/th>鎶ュ悕鏃堕棿
' + escapeHtml(item.studentName) + '' + escapeHtml(item.username) + '' + escapeHtml(item.phone) + '' + escapeHtml(item.college) + '' + escapeHtml(item.category) + '' + escapeHtml(item.eventName) + '' + escapeHtml(item.eventCategory) + '' + escapeHtml(item.eventTime + ' / ' + item.location) + '' + escapeHtml(item.status) + '' + escapeHtml(item.createdAt) + '
' + '
'; } function renderEventManage() { var formTitle = state.editingEventId ? '缂栬緫椤圭洰' : '鏂板椤圭洰'; var editingItem = state.adminEvents.find(function (item) { return item.id === state.editingEventId; }) || { eventName: '', eventCategory: '', location: '', quota: '', description: '', eventTime: '' }; mainView.innerHTML = '' + '
' + '

' + formTitle + '

鍙湪杩欓噷缁存姢姣旇禌椤圭洰鐨勫熀纭€淇℃伅銆?/p>

' + '
' + ' ' + '
' + '

' + ' ' + '' + '
' + '

椤圭洰鍒楄〃

褰撳墠绯荤粺鍐呯殑鍏ㄩ儴姣旇禌椤圭洰銆?/p>

' + (state.adminEvents.length ? '' + '' + ' ' + ' ' + state.adminEvents.map(function (item) { return '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + ''; }).join('') + ' ' + '
椤圭洰鍚嶇О椤圭洰鍒嗙被姣旇禌鏃堕棿姣旇禌鍦扮偣浜烘暟涓婇檺宸叉姤鍚?/th>椤圭洰璇存槑鎿嶄綔
' + escapeHtml(item.eventName) + '' + escapeHtml(item.eventCategory) + '' + escapeHtml(item.eventTime) + '' + escapeHtml(item.location) + '' + escapeHtml(item.quota) + '' + escapeHtml(item.registeredCount || 0) + '' + escapeHtml(item.description) + '
' : '

鏆傛棤椤圭洰

褰撳墠杩樻病鏈夋瘮璧涢」鐩紝璇峰厛鏂板椤圭洰銆?/p>

') + '
'; bindEventManageActions(); } function renderPlaceholder(title, text) { mainView.innerHTML = '' + '
' + '

' + title + '

' + '

' + text + '

' + '
'; } function uniqueEventCount() { var map = {}; state.adminRegistrations.forEach(function (item) { map[item.eventName] = true; }); return Object.keys(map).length; } function bindEventButtons() { Array.prototype.slice.call(document.querySelectorAll('.register-btn')).forEach(function (button) { button.addEventListener('click', function () { appUtils.ajax({ method: 'POST', url: '/api/events/' + button.getAttribute('data-id') + '/register', success: function (response) { if (!response.success) { window.alert(response.message || '鎶ュ悕澶辫触'); return; } window.alert('鎶ュ悕鎴愬姛'); loadEventData(); }, error: function (xhr, response) { window.alert((response && response.message) || '鎶ュ悕澶辫触'); } }); }); }); Array.prototype.slice.call(document.querySelectorAll('.cancel-btn')).forEach(function (button) { button.addEventListener('click', function () { appUtils.ajax({ method: 'DELETE', url: '/api/events/' + button.getAttribute('data-id') + '/register', success: function (response) { if (!response.success) { window.alert(response.message || '鍙栨秷鎶ュ悕澶辫触'); return; } window.alert('鍙栨秷鎶ュ悕鎴愬姛'); loadEventData(); }, error: function (xhr, response) { window.alert((response && response.message) || '鍙栨秷鎶ュ悕澶辫触'); } }); }); }); } function bindUserManageActions() { Array.prototype.slice.call(document.querySelectorAll('.reset-password-btn')).forEach(function (button) { button.addEventListener('click', function () { var id = button.getAttribute('data-id'); appUtils.ajax({ method: 'POST', url: '/api/admin/users/' + id + '/reset-password', success: function (response) { if (!response.success) { window.alert(response.message || '閲嶇疆瀵嗙爜澶辫触'); return; } window.alert('瀵嗙爜宸查噸缃负 123456'); }, error: function (xhr, response) { window.alert((response && response.message) || '閲嶇疆瀵嗙爜澶辫触'); } }); }); }); Array.prototype.slice.call(document.querySelectorAll('.disable-user-btn')).forEach(function (button) { button.addEventListener('click', function () { var id = button.getAttribute('data-id'); appUtils.ajax({ method: 'POST', url: '/api/admin/users/' + id + '/disable', success: function (response) { if (!response.success) { window.alert(response.message || '绂佺敤璐︽埛澶辫触'); return; } loadAdminData(); }, error: function (xhr, response) { window.alert((response && response.message) || '绂佺敤璐︽埛澶辫触'); } }); }); }); Array.prototype.slice.call(document.querySelectorAll('.enable-user-btn')).forEach(function (button) { button.addEventListener('click', function () { var id = button.getAttribute('data-id'); appUtils.ajax({ method: 'POST', url: '/api/admin/users/' + id + '/enable', success: function (response) { if (!response.success) { window.alert(response.message || '瑙i櫎绂佺敤澶辫触'); return; } loadAdminData(); }, error: function (xhr, response) { window.alert((response && response.message) || '瑙i櫎绂佺敤澶辫触'); } }); }); }); Array.prototype.slice.call(document.querySelectorAll('.delete-user-btn')).forEach(function (button) { button.addEventListener('click', function () { var id = button.getAttribute('data-id'); if (!window.confirm('纭畾瑕佸垹闄よ繖涓处鍙峰悧锛?)) { return; } appUtils.ajax({ method: 'DELETE', url: '/api/admin/users/' + id, success: function (response) { if (!response.success) { window.alert(response.message || '鍒犻櫎鐢ㄦ埛澶辫触'); return; } loadAdminData(); }, error: function (xhr, response) { window.alert((response && response.message) || '鍒犻櫎鐢ㄦ埛澶辫触'); } }); }); }); } function renderCurrentView() { var currentMenu = getMenus().find(function (item) { return item.key === state.currentView; }); if (currentMenu) { sectionTitle.textContent = currentMenu.label; sectionDesc.textContent = currentMenu.desc; } renderTabs(); if (state.currentView === 'profile') { renderProfile(); return; } if (state.currentView === 'events') { renderEventTable(state.currentTab === 'mine' ? state.myEvents : state.events, state.currentTab === 'mine'); return; } if (state.currentView === 'user-manage') { renderUserManage(); return; } if (state.currentView === 'athlete-manage') { renderAthleteManage(); return; } if (state.currentView === 'admin-home') { renderPlaceholder('杩愬姩浼氱鐞?, '杩欓噷灏嗕綔涓虹鐞嗗憳鍚庡彴棣栭〉锛屽彲灞曠ず鎶ュ悕鎬昏銆佺郴缁熷叕鍛娿€佽繍鍔ㄤ細绠$悊鍏ュ彛绛夊唴瀹广€?); return; } if (state.currentView === 'team-info') { renderPlaceholder('鍥綋淇℃伅绠$悊', '杩欓噷灏嗙户缁ˉ鍏呭闄€侀儴闂ㄣ€佷唬琛ㄩ槦绛夊洟浣撲俊鎭鐞嗗姛鑳姐€?); return; } if (state.currentView === 'event-manage') { renderEventManage(); return; } if (state.currentView === 'score-manage') { renderPlaceholder('鍙傝禌鎴愮哗绠$悊', '杩欓噷灏嗙户缁ˉ鍏呮垚缁╁綍鍏ャ€佹垚缁╃淮鎶ゃ€佹垚缁╂煡璇㈢瓑鍔熻兘銆?); return; } if (state.currentView === 'record-manage') { renderPlaceholder('椤圭洰璁板綍绠$悊', '杩欓噷灏嗙户缁ˉ鍏呴」鐩褰曘€佽禌浜嬬З搴忓唽鍜岄」鐩。妗堢鐞嗗姛鑳姐€?); return; } if (state.currentView === 'system-manage') { renderPlaceholder('绯荤粺绠$悊', '杩欓噷灏嗙户缁ˉ鍏呯郴缁熼厤缃€佽处鍙锋潈闄愬拰杩愯缁存姢鍔熻兘銆?); } } function switchView(view) { state.currentView = view; if (view === 'events' && state.currentTab !== 'mine') { state.currentTab = 'all'; } renderSidebar(); renderCurrentView(); } function loadEventData() { appUtils.ajax({ method: 'GET', url: '/api/events', success: function (response) { if (response.success) { state.events = response.data || []; renderCurrentView(); } } }); appUtils.ajax({ method: 'GET', url: '/api/events/my', success: function (response) { if (response.success) { state.myEvents = response.data || []; renderCurrentView(); } } }); } function loadAdminData() { if (!state.user || state.user.role !== 'ADMIN') { return; } appUtils.ajax({ method: 'GET', url: '/api/admin/users', success: function (response) { if (response.success) { state.adminUsers = response.data || []; renderCurrentView(); } } }); appUtils.ajax({ method: 'GET', url: '/api/admin/registrations', success: function (response) { if (response.success) { state.adminRegistrations = response.data || []; renderCurrentView(); } } }); appUtils.ajax({ method: 'GET', url: '/api/admin/events', success: function (response) { if (response.success) { state.adminEvents = response.data || []; renderCurrentView(); } } }); } function bindEventManageActions() { var form = document.getElementById('eventForm'); var resetButton = document.getElementById('resetEventForm'); var messageEl = document.getElementById('eventFormMessage'); if (form) { form.addEventListener('submit', function (event) { event.preventDefault(); var formData = new FormData(form); var payload = { eventName: String(formData.get('eventName') || '').trim(), eventCategory: String(formData.get('eventCategory') || '').trim(), location: String(formData.get('location') || '').trim(), quota: Number(formData.get('quota') || 0), description: String(formData.get('description') || '').trim(), eventTime: String(formData.get('eventTime') || '').trim() }; var successText = state.editingEventId ? '椤圭洰淇敼鎴愬姛' : '椤圭洰鏂板鎴愬姛'; appUtils.ajax({ method: state.editingEventId ? 'PUT' : 'POST', url: state.editingEventId ? '/api/admin/events/' + state.editingEventId : '/api/admin/events', data: payload, success: function (response) { if (!response.success) { appUtils.showMessage(messageEl, response.message || '淇濆瓨澶辫触', false); return; } state.editingEventId = null; window.alert(successText); loadAdminData(); }, error: function (xhr, response) { appUtils.showMessage(messageEl, (response && response.message) || '淇濆瓨澶辫触', false); } }); }); } if (resetButton) { resetButton.addEventListener('click', function () { state.editingEventId = null; renderCurrentView(); }); } Array.prototype.slice.call(document.querySelectorAll('.edit-event-btn')).forEach(function (button) { button.addEventListener('click', function () { state.editingEventId = Number(button.getAttribute('data-id')); renderCurrentView(); }); }); Array.prototype.slice.call(document.querySelectorAll('.delete-event-btn')).forEach(function (button) { button.addEventListener('click', function () { var eventId = button.getAttribute('data-id'); if (!window.confirm('纭畾瑕佸垹闄よ繖涓」鐩悧锛熷垹闄ゅ悗璇ラ」鐩殑鎶ュ悕璁板綍涔熶細涓€骞舵竻闄ゃ€?)) { return; } appUtils.ajax({ method: 'DELETE', url: '/api/admin/events/' + eventId, success: function (response) { if (!response.success) { window.alert(response.message || '鍒犻櫎澶辫触'); return; } if (state.editingEventId === Number(eventId)) { state.editingEventId = null; } loadAdminData(); }, error: function (xhr, response) { window.alert((response && response.message) || '鍒犻櫎澶辫触'); } }); }); }); } function loadCurrentUser() { appUtils.ajax({ method: 'GET', url: '/api/users/me', success: function (response) { if (!response.success || !response.data) { window.location.href = './login.html'; return; } state.user = response.data; currentUserName.textContent = state.user.name + (state.user.role === 'ADMIN' ? ' 绠$悊鍛? : ' 鐢ㄦ埛'); state.currentView = state.user.role === 'ADMIN' ? 'admin-home' : 'profile'; renderSidebar(); renderCurrentView(); loadEventData(); loadAdminData(); }, error: function () { window.location.href = './login.html'; } }); } logoutBtn.addEventListener('click', function () { appUtils.ajax({ method: 'POST', url: '/api/auth/logout', success: function () { window.location.href = './login.html'; }, error: function () { window.location.href = './login.html'; } }); }); loadCurrentUser(); });