Files
WebWork/frontend/views/admin/student_management.html
祀梦 bcf2c71fad refactor(frontend): 重构前端目录结构并优化认证流程
将前端文件从html目录迁移到views目录,按功能模块组织
重构认证中间件和路由处理,简化页面权限控制
更新静态资源引用路径,统一使用/public前缀
添加学生仪表板页面,优化移动端显示
移除旧版html和js文件,更新样式和脚本
2025-12-21 22:07:23 +08:00

442 lines
18 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>摮衣<EFBFBD>蝞∠<EFBFBD> - XX摮行嵗<E8A18C>鞟貍蝞∠<E89D9E>蝟餌<E89D9F></title>
<link rel="stylesheet" href="/public/css/style.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
</head>
<body>
<!-- 撖潸⏛<E6BDB8>?-->
<nav class="navbar">
<div class="container">
<div class="navbar-brand">
<a href="/">
<i class="fas fa-graduation-cap"></i>
<span>XX摮行嵗<EFBFBD>鞟貍蝞∠<EFBFBD>蝟餌<EFBFBD></span>
</a>
</div>
<div class="navbar-menu">
<a href="/" class="navbar-item">
<i class="fas fa-home"></i>
<span>銝駁△</span>
</a>
<a href="/admin/dashboard" class="navbar-item">
<i class="fas fa-tachometer-alt"></i>
<span><EFBFBD><EFBFBD><EFBFBD></span>
</a>
<a href="/admin/student_management" class="navbar-item active">
<i class="fas fa-users"></i>
<span>摮衣<EFBFBD>蝞∠<EFBFBD></span>
</a>
<a href="/teacher/grade_management" class="navbar-item">
<i class="fas fa-chart-bar"></i>
<span><EFBFBD>鞟貍蝞∠<EFBFBD></span>
</a>
<a href="/admin/user_management" class="navbar-item">
<i class="fas fa-user-cog"></i>
<span><EFBFBD><EFBFBD>蝞∠<EFBFBD></span>
</a>
<div class="navbar-user">
<i class="fas fa-user-circle"></i>
<span>蝞∠<EFBFBD><EFBFBD>?/span>
<div class="user-dropdown">
<a href="#"><i class="fas fa-user"></i> 銝芯犖韏<E78A96><E99F8F></a>
<a href="#"><i class="fas fa-cog"></i> 霈曄蔭</a>
<a href="/login"><i class="fas fa-sign-out-alt"></i> <20><><EFBFBD>箇蒈敶?/a>
</div>
</div>
</div>
</div>
</nav>
<!-- 銝餉<E98A9D><E9A489><EFBFBD><EFBFBD>?-->
<main class="main-content">
<div class="container">
<div class="student-management">
<!-- 憿菟𢒰<E88F9F><F0A292B0><EFBFBD> -->
<div class="page-header">
<h1><i class="fas fa-users"></i> 摮衣<E691AE>蝞∠<E89D9E></h1>
<p>蝞∠<EFBFBD>摮衣<EFBFBD><EFBFBD>箸𧋦靽⊥<EFBFBD>嚗峕𣈲<EFBFBD><EFBFBD><EFBFBD>𨬭<EFBFBD><EFBFBD><EFBFBD>颲㻫<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>亥砭摮衣<EFBFBD>靽⊥<EFBFBD></p>
</div>
<!-- 蝑偦<E89D91>匧躹<E58CA7>?-->
<div class="filter-section">
<div class="filter-row">
<div class="filter-group">
<label for="student-id"><i class="fas fa-id-card"></i> 摮血噡</label>
<input type="text" id="student-id" placeholder="霂瑁<E99C82><E79181>亙郎<E4BA99>?>
</div>
<div class="filter-group">
<label for="student-name"><i class="fas fa-user"></i> 憪枏<E686AA></label>
<input type="text" id="student-name" placeholder="霂瑁<E99C82><E79181><EFBFBD><E4BA99>?>
</div>
<div class="filter-group">
<label for="class-select"><i class="fas fa-school"></i> <20>剔漣</label>
<select id="class-select">
<option value=""><EFBFBD><EFBFBD><EFBFBD>剔漣</option>
<option value="霈∠<E99C88><E288A0><EFBFBD>摮虫<E691AE><E899AB><EFBFBD><EFBFBD>?<3F>?>霈∠<E99C88><E288A0><EFBFBD>摮虫<E691AE><E899AB><EFBFBD><EFBFBD>?<3F>?/option>
<option value="<EFBFBD><EFBFBD><EFBFBD>摮虫<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<EFBFBD>?>霈∠<EFBFBD><EFBFBD><EFBFBD>摮虫<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F>?/option>
<option value="頧臭辣撌亦<E6928C>1<EFBFBD>?>頧臭辣撌亦<E6928C>1<EFBFBD>?/option>
<option value="頧臭辣撌亦<EFBFBD>2<EFBFBD>?>頧臭辣撌亦<EFBFBD>2<EFBFBD>?/option>
<option value="蝵𤑳<E89DB5>撌亦<E6928C>1<EFBFBD>?>蝵𤑳<E89DB5>撌亦<E6928C>1<EFBFBD>?/option>
<option value="蝵𤑳<EFBFBD>撌亦<EFBFBD>2<EFBFBD>?>蝵𤑳<EFBFBD>撌亦<EFBFBD>2<EFBFBD>?/option>
</select>
</div>
<div class="filter-group">
<label for="gender-select"><i class="fas fa-venus-mars"></i> <20><EFBFBD></label>
<select id="gender-select">
<option value=""><EFBFBD><EFBFBD><EFBFBD><EFBFBD></option>
<option value="<22>?><3E>?/option>
<option value="?>憟?/option>
</select>
</div>
</div>
<div class="action-buttons">
<button id="add-btn" class="btn-add">
<i class="fas fa-plus"></i>
瘛餃<E7989B>摮衣<E691AE>
</button>
<button id="search-btn" class="btn-search">
<i class="fas fa-search"></i>
<20>亥砭摮衣<E691AE>
</button>
<button id="reset-btn" class="btn-reset">
<i class="fas fa-redo"></i>
<20>滨蔭<E6BBA8>∩辣
</button>
<button id="export-btn" class="btn-export">
<i class="fas fa-file-export"></i>
撖澆枂<E6BE86>唳旿
</button>
</div>
</div>
<!-- 摮衣<E691AE>銵冽聢 -->
<div class="table-responsive">
<table class="student-table">
<thead>
<tr>
<th>摮血噡</th>
<th>憪枏<EFBFBD></th>
<th><EFBFBD><EFBFBD></th>
<th><EFBFBD>剔漣</th>
<th><EFBFBD>𠉛頂<EFBFBD><EFBFBD></th>
<th><EFBFBD>桃拳</th>
<th><EFBFBD>亙郎<EFBFBD>園𡢿</th>
<th><EFBFBD><EFBFBD></th>
</tr>
</thead>
<tbody id="student-table-body">
<!-- <20>唳旿撠<E697BF><E692A0><EFBFBD>JavaScript<70><EFBFBD><E586BD><EFBFBD>頧?-->
<tr>
<td colspan="8" class="loading">
<i class="fas fa-spinner fa-spin"></i>
<p><EFBFBD><EFBFBD>㰘蝸摮衣<EFBFBD><EFBFBD>唳旿...</p>
</td>
</tr>
</tbody>
</table>
</div>
<!-- <20><><EFBFBD>找辣 -->
<div class="pagination" id="pagination">
<button id="prev-btn" disabled>
<i class="fas fa-chevron-left"></i>
銝𠹺<E98A9D>憿? </button>
<button class="active">1</button>
<button>2</button>
<button>3</button>
<button id="next-btn">
銝衤<E98A9D>憿? <i class="fas fa-chevron-right"></i>
</button>
</div>
</div>
</div>
</main>
<!-- 憿菔<E686BF> -->
<footer class="footer">
<div class="container">
<p>穢 2023 XX摮行嵗<E8A18C>鞟貍蝞∠<E89D9E>蝟餌<E89D9F>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?</p>
<p><EFBFBD><EFBFBD><EFBFBD>舀𣈲<EFBFBD>? 霈∠<E99C88><E288A0><EFBFBD>摮虫<E691AE><E899AB><EFBFBD><EFBFBD>臬郎<E887AC>?/p>
</div>
</footer>
<script>
// 璅⊥<E79285>摮衣<E691AE><E8A1A3>唳旿
const mockStudents = [
{
id: '20230001',
name: '撘牐<E69298>',
gender: '<27>?,
class: '<EFBFBD><EFBFBD><EFBFBD>摮虫<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<EFBFBD>?,
phone: '13800138001',
email: 'zhangsan@example.com',
enrollmentDate: '2023-09-01'
},
{
id: '20230002',
name: '<27>𤾸<EFBFBD>',
gender: '憟?,
class: '<EFBFBD><EFBFBD><EFBFBD>摮虫<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<EFBFBD>?,
phone: '13800138002',
email: 'lisi@example.com',
enrollmentDate: '2023-09-01'
},
{
id: '20230003',
name: '<27><EFBFBD>',
gender: '<27>?,
class: '<EFBFBD><EFBFBD><EFBFBD>摮虫<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<EFBFBD>?,
phone: '13800138003',
email: 'wangwu@example.com',
enrollmentDate: '2023-09-01'
},
{
id: '20230004',
name: '韏萄<E99F8F>',
gender: '憟?,
class: '頧臭辣撌亦<EFBFBD>1<EFBFBD>?,
phone: '13800138004',
email: 'zhaoliu@example.com',
enrollmentDate: '2023-09-01'
},
{
id: '20230005',
name: '<27><EFBFBD>',
gender: '<27>?,
class: '頧臭辣撌亦<EFBFBD>2<EFBFBD>?,
phone: '13800138005',
email: 'qianqi@example.com',
enrollmentDate: '2023-09-01'
},
{
id: '20230006',
name: '摮坔<E691AE>',
gender: '<27>?,
class: '蝵𤑳<EFBFBD>撌亦<EFBFBD>1<EFBFBD>?,
phone: '13800138006',
email: 'sunba@example.com',
enrollmentDate: '2023-09-01'
},
{
id: '20230007',
name: '<27><EFBFBD>',
gender: '憟?,
class: '蝵𤑳<EFBFBD>撌亦<EFBFBD>2<EFBFBD>?,
phone: '13800138007',
email: 'zhoujiu@example.com',
enrollmentDate: '2023-09-01'
},
{
id: '20230008',
name: '<27><EFBFBD>',
gender: '<27>?,
class: '<EFBFBD><EFBFBD><EFBFBD>摮虫<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<EFBFBD>?,
phone: '13800138008',
email: 'wushi@example.com',
enrollmentDate: '2023-09-01'
}
];
// 敶枏<E695B6>憿菜㺭<E88F9C>? let currentPage = 1;
const pageSize = 5;
let filteredStudents = [...mockStudents];
// DOM<4F><4D><EFBFBD>
const studentTableBody = document.getElementById('student-table-body');
const pagination = document.getElementById('pagination');
const prevBtn = document.getElementById('prev-btn');
const nextBtn = document.getElementById('next-btn');
const searchBtn = document.getElementById('search-btn');
const resetBtn = document.getElementById('reset-btn');
const addBtn = document.getElementById('add-btn');
const exportBtn = document.getElementById('export-btn');
// 皜脫<E79A9C>摮衣<E691AE>銵冽聢
function renderStudentTable() {
const startIndex = (currentPage - 1) * pageSize;
const endIndex = startIndex + pageSize;
const pageStudents = filteredStudents.slice(startIndex, endIndex);
if (pageStudents.length === 0) {
studentTableBody.innerHTML = `
<tr>
<td colspan="8" class="no-results">
<i class="fas fa-user-slash"></i>
<h3>瘝⊥<E7989D><E28AA5><EFBFBD>摮衣<E691AE>靽⊥<E99DBD></h3>
<p>霂瑕<E99C82>霂閗<E99C82><E99697><EFBFBD><E6B8A1>㗇辺隞嗆<E99A9E>瘛餃<E7989B><E9A483>啣郎<E595A3>?/p>
</td>
</tr>
`;
return;
}
let tableHTML = '';
pageStudents.forEach(student => {
tableHTML += `
<tr>
<td>${student.id}</td>
<td>${student.name}</td>
<td>${student.gender}</td>
<td>${student.class}</td>
<td>${student.phone}</td>
<td>${student.email}</td>
<td>${student.enrollmentDate}</td>
<td>
<div class="action-buttons-cell">
<button class="btn-edit" onclick="editStudent('${student.id}')">
<i class="fas fa-edit"></i>
蝻𤥁<E89DBB>
</button>
<button class="btn-delete" onclick="deleteStudent('${student.id}')">
<i class="fas fa-trash"></i>
<20>𣳇膄
</button>
</div>
</td>
</tr>
`;
});
studentTableBody.innerHTML = tableHTML;
}
// <20>湔鰵<E6B994><E9B0B5><EFBFBD>找辣
function updatePagination() {
const totalPages = Math.ceil(filteredStudents.length / pageSize);
const paginationButtons = pagination.querySelectorAll('button:not(#prev-btn):not(#next-btn)');
// <20>湔鰵憿萇<E686BF><E89087>厰僼
paginationButtons.forEach((btn, index) => {
if (index < totalPages) {
btn.textContent = index + 1;
btn.style.display = 'inline-block';
btn.classList.toggle('active', index + 1 === currentPage);
} else {
btn.style.display = 'none';
}
});
// <20>湔鰵銝𠹺<E98A9D>憿?銝衤<E98A9D>憿菜<E686BF><E88F9C>桃𠶖<E6A183>? prevBtn.disabled = currentPage === 1;
nextBtn.disabled = currentPage === totalPages || totalPages === 0;
}
// 蝑偦<E89D91>匧郎<E58CA7>? function filterStudents() {
const studentId = document.getElementById('student-id').value.trim();
const studentName = document.getElementById('student-name').value.trim();
const selectedClass = document.getElementById('class-select').value;
const selectedGender = document.getElementById('gender-select').value;
filteredStudents = mockStudents.filter(student => {
const matchesId = !studentId || student.id.includes(studentId);
const matchesName = !studentName || student.name.includes(studentName);
const matchesClass = !selectedClass || student.class === selectedClass;
const matchesGender = !selectedGender || student.gender === selectedGender;
return matchesId && matchesName && matchesClass && matchesGender;
});
currentPage = 1;
renderStudentTable();
updatePagination();
}
// <20>滨蔭蝑偦<E89D91>㗇辺隞? function resetFilters() {
document.getElementById('student-id').value = '';
document.getElementById('student-name').value = '';
document.getElementById('class-select').value = '';
document.getElementById('gender-select').value = '';
filteredStudents = [...mockStudents];
currentPage = 1;
renderStudentTable();
updatePagination();
}
// 瘛餃<E7989B>摮衣<E691AE>
function addStudent() {
alert('瘛餃<E7989B>摮衣<E691AE><E8A1A3><EFBFBD><EFBFBD><EFBFBD>𡒊垢API摰峕<E691B0><E5B395>𤾸<EFBFBD><F0A4BEB8>?);
// 餈䠷<E9A488><E4A0B7>臭誑<E887AD><EFBFBD><EFBFBD>銝芣芋<E88AA3><E88A8B><EFBFBD><EFBFBD>交溶<E4BAA4>惩郎<E683A9>煺縑<E785BA>? }
// 蝻𤥁<E89DBB>摮衣<E691AE>
function editStudent(studentId) {
alert(`蝻𤥁<E89DBB>摮衣<E691AE> ${studentId} <20><EFBFBD><EFBFBD><EFBFBD>𡒊垢API摰峕<E691B0><E5B395>𤾸<EFBFBD><F0A4BEB8>躬);
// 餈䠷<E9A488><E4A0B7>臭誑<E887AD><EFBFBD><EFBFBD>銝芣芋<E88AA3><E88A8B><EFBFBD><EFBFBD><EFBFBD>颲穃郎<E7A983>煺縑<E785BA>? }
// <20>𣳇膄摮衣<E691AE>
function deleteStudent(studentId) {
if (confirm(`蝖桀<E89D96><EFBFBD><E996AC><EFBFBD>文郎<E69687>瑚蛹 ${studentId} <20><><EFBFBD><EFBFBD>嚗鬮)) {
alert(`<60>𣳇膄摮衣<E691AE> ${studentId} <20><EFBFBD><EFBFBD><EFBFBD>𡒊垢API摰峕<E691B0><E5B395>𤾸<EFBFBD><F0A4BEB8>躬);
// 餈䠷<E9A488><E4A0B7>臭誑靚<E8AA91>鍂API<50>𣳇膄摮衣<E691AE>
}
}
// 撖澆枂<E6BE86>唳旿
function exportData() {
alert('撖澆枂<EFBFBD>唳旿<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡒊垢API摰峕<EFBFBD><EFBFBD>𤾸<EFBFBD><EFBFBD>?);
// 餈䠷<E9A488><E4A0B7>臭誑靚<E8AA91>鍂API撖澆枂Excel<65>𥟟SV<53><56>
}
// 憿菟𢒰<E88F9F><F0A292B0>
function goToPage(page) {
currentPage = page;
renderStudentTable();
updatePagination();
}
// <20><EFBFBD><E598A5><EFBFBD>隞嗥<E99A9E><E597A5>? function initEventListeners() {
searchBtn.addEventListener('click', filterStudents);
resetBtn.addEventListener('click', resetFilters);
addBtn.addEventListener('click', addStudent);
exportBtn.addEventListener('click', exportData);
prevBtn.addEventListener('click', () => {
if (currentPage > 1) {
goToPage(currentPage - 1);
}
});
nextBtn.addEventListener('click', () => {
const totalPages = Math.ceil(filteredStudents.length / pageSize);
if (currentPage < totalPages) {
goToPage(currentPage + 1);
}
});
// 憿萇<E686BF><E89087>厰僼<E58EB0>孵稬鈭衤辣
pagination.addEventListener('click', (e) => {
if (e.target.tagName === 'BUTTON' &&
!e.target.id &&
!e.target.classList.contains('active')) {
const page = parseInt(e.target.textContent);
goToPage(page);
}
});
// 颲枏<E9A2B2><EFBFBD><E78DA2>頧行<E9A0A7>蝝? document.getElementById('student-id').addEventListener('keypress', (e) => {
if (e.key === 'Enter') filterStudents();
});
document.getElementById('student-name').addEventListener('keypress', (e) => {
if (e.key === 'Enter') filterStudents();
});
}
// 憿菟𢒰<E88F9F>㰘蝸摰峕<E691B0><E5B395>𤾸<EFBFBD>憪见<E686AA>
document.addEventListener('DOMContentLoaded', () => {
// 璅⊥<E79285>API撱嗉<E692B1><E59789>㰘蝸
setTimeout(() => {
renderStudentTable();
updatePagination();
initEventListeners();
}, 500);
});
</script>
</body>
</html>