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 genderOptions = ['男', '女']; var collegeOptions = [ '文学院与文化传播学院', '马克思主义学院', '教育学院', '外国语学院', '历史文化学院', '商学院', '化学工程与技术学院', '电子信息与电气工程学院', '数学与统计学院', '生物工程与技术学院', '机电工程学院', '土木工程学院', '资源与环境工程学院', '体育学院', '美术与设计学院', '音乐舞蹈学院', '卫生健康学院', '继续教育学院(培训中心)' ]; var categoryOptions = ['青年组', '老年组']; 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 getMeta(viewKey) { var menu = getMenus().find(function (item) { return item.key === viewKey; }); return menu || { label: '系统首页', desc: '欢迎进入运动会报名系统。' }; } function renderSidebar() { sidebarNav.innerHTML = getMenus().map(function (item) { return ''; }).join(''); Array.prototype.slice.call(sidebarNav.querySelectorAll('.nav-item')).forEach(function (button) { button.addEventListener('click', function () { switchView(button.getAttribute('data-view')); }); }); } function renderTabs() { if (state.currentView !== 'events') { subTabs.innerHTML = ''; subTabs.classList.add('hidden'); return; } subTabs.innerHTML = '' + '' + ''; subTabs.classList.remove('hidden'); 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 = '' + '
' + '

基础资料

当前账号信息如下。

' + '
' + infoCard('身份证号', state.user.idCard) + infoCard('登录账号', state.user.username) + infoCard('姓名', state.user.name) + infoCard('联系电话', state.user.phone) + infoCard('性别', state.user.gender) + infoCard('学院', state.user.college) + infoCard('班级', state.user.className) + infoCard('学号', state.user.studentNo) + infoCard('类别', state.user.category) + infoCard('角色', state.user.role) + '
' + '
' + '
' + '

修改个人信息

可在此更新姓名、电话、学院、班级、学号等信息。

' + '
' + fieldInput('姓名', 'name', state.user.name, '请输入姓名') + fieldInput('联系电话', 'phone', state.user.phone, '请输入电话') + fieldSelect('性别', 'gender', state.user.gender, genderOptions, '请选择性别') + fieldSelect('学院', 'college', state.user.college, collegeOptions, '请选择学院') + fieldInput('班级', 'className', state.user.className, '请输入班级') + fieldInput('学号', 'studentNo', state.user.studentNo, '请输入学号') + fieldSelect('类别', 'category', state.user.category, categoryOptions, '请选择类别', true) + '
' + ' ' + '
' + '

' + '
' + '
'; var form = document.getElementById('profileForm'); var messageEl = document.getElementById('profileMessage'); form.addEventListener('submit', function (event) { event.preventDefault(); var formData = new FormData(form); appUtils.ajax({ method: 'PUT', url: '/api/users/me', data: { 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() }, success: function (response) { if (!response.success || !response.data) { appUtils.showMessage(messageEl, response.message || '保存失败', false); return; } state.user = response.data; updateCurrentUserName(); renderProfile(); appUtils.showMessage(document.getElementById('profileMessage'), '个人信息修改成功', 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 buttonHtml = isMine ? '' : ''; return '' + '' + '' + '' + '' + '' + '' + '' + ''; }).join('') + ' ' + '
项目名称项目分类比赛时间比赛地点报名情况项目说明操作
' + escapeHtml(item.eventName) + '' + escapeHtml(item.eventCategory) + '' + escapeHtml(item.eventTime) + '' + escapeHtml(item.location) + '' + escapeHtml((item.registeredCount || 0) + '/' + (item.quota || 0)) + '' + escapeHtml(item.description) + '' + buttonHtml + '
'; Array.prototype.slice.call(document.querySelectorAll('.register-btn')).forEach(function (button) { button.addEventListener('click', function () { var eventId = button.getAttribute('data-id'); appUtils.ajax({ method: 'POST', url: '/api/events/' + eventId + '/register', success: function (response) { if (!response.success) { window.alert(response.message || '报名失败'); return; } 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 () { var eventId = button.getAttribute('data-id'); appUtils.ajax({ method: 'DELETE', url: '/api/events/' + eventId + '/register', success: function (response) { if (!response.success) { window.alert(response.message || '取消报名失败'); return; } loadEventData(); }, error: function (xhr, response) { window.alert((response && response.message) || '取消报名失败'); } }); }); }); } function renderAdminHome() { mainView.innerHTML = '' + '
' + '

系统概览

管理员可在此查看系统整体情况。

' + '
' + summaryCard('用户总数', state.adminUsers.length) + summaryCard('报名记录', state.adminRegistrations.length) + summaryCard('比赛项目', state.adminEvents.length) + '
' + '
'; } function renderUserManage() { if (!state.adminUsers.length) { mainView.innerHTML = '

暂无用户

当前系统中还没有用户数据。

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

数据概览

查看当前系统内用户整体情况。

' + '
' + summaryCard('用户总数', state.adminUsers.length) + summaryCard('管理员数量', state.adminUsers.filter(function (item) { return item.role === 'ADMIN'; }).length) + summaryCard('禁用账号数量', state.adminUsers.filter(function (item) { return item.status === 'DISABLED'; }).length) + '
' + '
' + '
' + '

用户列表

支持重置密码、禁用、解除禁用和删除账号。

' + ' ' + ' ' + ' ' + state.adminUsers.map(function (item) { var isAdmin = item.role === 'ADMIN'; var statusText = item.status === 'DISABLED' ? '已禁用' : '正常'; var enableOrDisable = isAdmin ? '' : (item.status === 'DISABLED' ? '' : ''); var deleteAction = isAdmin ? '' : ''; return '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + ''; }).join('') + ' ' + '
姓名账号身份证号电话性别学院班级学号类别角色状态操作
' + escapeHtml(item.name) + '' + escapeHtml(item.username) + '' + escapeHtml(item.idCard) + '' + escapeHtml(item.phone) + '' + escapeHtml(item.gender) + '' + escapeHtml(item.college) + '' + escapeHtml(item.className) + '' + escapeHtml(item.studentNo) + '' + escapeHtml(item.category) + '' + escapeHtml(item.role) + '' + escapeHtml(statusText) + ' ' + enableOrDisable + ' ' + deleteAction + '
' + '
'; bindAdminUserActions(); } function renderAthleteManage() { if (!state.adminRegistrations.length) { mainView.innerHTML = '

暂无报名记录

当前还没有参赛人员数据。

'; return; } var coveredEvents = {}; state.adminRegistrations.forEach(function (item) { coveredEvents[item.eventName] = true; }); mainView.innerHTML = '' + '
' + '

数据概览

查看当前参赛人员和报名记录。

' + '
' + summaryCard('报名记录总数', state.adminRegistrations.length) + summaryCard('已覆盖项目', Object.keys(coveredEvents).length) + summaryCard('系统用户数', state.adminUsers.length) + '
' + '
' + '
' + '

参赛名单

显示所有已报名人员和项目详情。

' + ' ' + ' ' + ' ' + state.adminRegistrations.map(function (item) { return '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + ''; }).join('') + ' ' + '
姓名账号电话学院类别项目名称项目分类时间地点状态报名时间
' + 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 editingItem = state.adminEvents.find(function (item) { return item.id === state.editingEventId; }) || { eventName: '', eventCategory: '', location: '', quota: '', eventTime: '', description: '' }; mainView.innerHTML = '' + '
' + '

' + (state.editingEventId ? '编辑项目' : '新增项目') + '

在这里维护比赛项目基础信息。

' + '
' + fieldInput('项目名称', 'eventName', editingItem.eventName, '请输入项目名称') + fieldInput('项目分类', 'eventCategory', editingItem.eventCategory, '请输入项目分类') + fieldInput('比赛地点', 'location', editingItem.location, '请输入比赛地点') + ' ' + fieldInput('比赛时间', 'eventTime', editingItem.eventTime, '例如 2026-05-20 08:30', true) + fieldInput('项目说明', 'description', editingItem.description, '请输入项目说明', true) + '
' + ' ' + ' ' + '
' + '

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

项目列表

查看、编辑和删除当前项目。

' + (state.adminEvents.length ? '' + '' + ' ' + ' ' + state.adminEvents.map(function (item) { return '' + '' + '' + '' + '' + '' + '' + '' + '' + ''; }).join('') + ' ' + '
项目名称项目分类比赛时间比赛地点人数上限已报名项目说明操作
' + escapeHtml(item.eventName) + '' + escapeHtml(item.eventCategory) + '' + escapeHtml(item.eventTime) + '' + escapeHtml(item.location) + '' + escapeHtml(item.quota) + '' + escapeHtml(item.registeredCount || 0) + '' + escapeHtml(item.description) + '
' : '

暂无项目

请先新增比赛项目。

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

' + escapeHtml(title) + '

' + escapeHtml(desc) + '

' + '

功能持续完善中

这个模块的详细功能可以继续在现有框架上补充。

' + '
'; } function renderCurrentView() { var meta = getMeta(state.currentView); sectionTitle.textContent = meta.label; sectionDesc.textContent = meta.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 === 'admin-home') { renderAdminHome(); return; } if (state.currentView === 'user-manage') { renderUserManage(); return; } if (state.currentView === 'athlete-manage') { renderAthleteManage(); return; } if (state.currentView === 'event-manage') { renderEventManage(); return; } if (state.currentView === 'team-info') { renderPlaceholder('团体信息管理', '可继续补充学院、班级、代表队等团体信息管理功能。'); return; } if (state.currentView === 'score-manage') { renderPlaceholder('参赛成绩管理', '可继续补充成绩录入、成绩维护、成绩查询等功能。'); return; } if (state.currentView === 'record-manage') { renderPlaceholder('项目记录管理', '可继续补充项目记录、秩序册和赛事档案管理功能。'); return; } if (state.currentView === 'system-manage') { renderPlaceholder('系统管理', '可继续补充系统配置、权限设置和运行维护功能。'); return; } 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 || []; if (state.currentView === 'events') { renderCurrentView(); } } } }); appUtils.ajax({ method: 'GET', url: '/api/events/my', success: function (response) { if (response.success) { state.myEvents = response.data || []; if (state.currentView === 'events') { 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 bindAdminUserActions() { bindUserAction('.reset-password-btn', 'POST', '/api/admin/users/{id}/reset-password', '重置密码成功'); bindUserAction('.disable-user-btn', 'POST', '/api/admin/users/{id}/disable', '账号已禁用'); bindUserAction('.enable-user-btn', 'POST', '/api/admin/users/{id}/enable', '账号已解除禁用'); bindUserAction('.delete-user-btn', 'DELETE', '/api/admin/users/{id}', '用户已删除'); } function bindUserAction(selector, method, urlTemplate, successText) { Array.prototype.slice.call(document.querySelectorAll(selector)).forEach(function (button) { button.addEventListener('click', function () { var userId = button.getAttribute('data-id'); appUtils.ajax({ method: method, url: urlTemplate.replace('{id}', userId), success: function (response) { if (!response.success) { window.alert(response.message || '操作失败'); return; } if (successText) { window.alert(successText); } loadAdminData(); }, error: function (xhr, response) { window.alert((response && response.message) || '操作失败'); } }); }); }); } 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), eventTime: String(formData.get('eventTime') || '').trim(), description: String(formData.get('description') || '').trim() }; 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; 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'); 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; state.currentView = state.user.role === 'ADMIN' ? 'admin-home' : 'profile'; updateCurrentUserName(); renderSidebar(); renderCurrentView(); loadEventData(); loadAdminData(); }, error: function () { window.location.href = './login.html'; } }); } function updateCurrentUserName() { currentUserName.textContent = state.user.name + (state.user.role === 'ADMIN' ? ' 管理员' : ' 用户'); } function fieldInput(label, name, value, placeholder, fullRow) { return ' '; } function fieldSelect(label, name, value, options, placeholder, fullRow) { return ' '; } function infoCard(label, value) { return '
' + label + '

' + escapeHtml(value) + '

'; } function summaryCard(label, value) { return '
' + label + '

' + escapeHtml(value) + '

'; } 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(); });