Files
WebWork/frontend/views/admin/user_management.html
祀梦 b1da021185 feat: 实现教师资料更新、操作日志和系统设置功能
新增教师资料更新功能,包括个人信息修改和密码更新
添加操作日志记录系统,记录用户关键操作
实现系统设置模块,支持动态配置系统参数
重构数据库模型,新增教师表和系统设置表
优化成绩录入逻辑,支持平时分、期中和期末成绩计算
添加数据导出功能,支持学生、教师和成绩数据导出
完善管理员后台,增加统计图表和操作日志查看
2025-12-22 23:30:01 +08:00

330 lines
12 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>用户管理 - 管理员端</title>
<!-- Bootstrap 5 CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- Font Awesome -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<!-- Google Fonts -->
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;700&display=swap" rel="stylesheet">
<style>
:root {
--sidebar-width: 260px;
--primary-color: #4e73df;
--secondary-color: #858796;
--light-bg: #f8f9fc;
--admin-gradient: linear-gradient(135deg, #4e73df 0%, #224abe 100%);
}
body {
font-family: 'Noto Sans SC', sans-serif;
background-color: var(--light-bg);
overflow-x: hidden;
}
/* 侧边栏样式 */
.sidebar {
width: var(--sidebar-width);
height: 100vh;
position: fixed;
left: 0;
top: 0;
background: var(--admin-gradient);
color: white;
z-index: 1000;
transition: all 0.3s;
}
.sidebar-header {
padding: 2rem 1.5rem;
text-align: center;
border-bottom: 1px solid rgba(255,255,255,0.1);
}
.sidebar-brand {
font-size: 1.25rem;
font-weight: 700;
color: white;
text-decoration: none;
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
}
.user-profile {
padding: 2rem 1rem;
text-align: center;
}
.user-avatar {
width: 80px;
height: 80px;
background: rgba(255,255,255,0.2);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto 1rem;
font-size: 2rem;
}
.user-info h6 { margin-bottom: 0.25rem; font-weight: 600; }
.user-info p { font-size: 0.85rem; opacity: 0.8; margin-bottom: 0; }
.nav-menu { padding: 1rem 0; }
.nav-item { padding: 0.25rem 1rem; }
.nav-link {
color: rgba(255,255,255,0.8);
padding: 0.8rem 1.25rem;
border-radius: 0.5rem;
display: flex;
align-items: center;
gap: 12px;
transition: all 0.2s;
text-decoration: none;
}
.nav-link:hover, .nav-link.active {
color: white;
background: rgba(255,255,255,0.15);
}
.nav-link i { width: 20px; text-align: center; }
/* 主内容区 */
.main-content {
margin-left: var(--sidebar-width);
padding: 2rem;
min-height: 100vh;
}
.top-navbar {
background: white;
padding: 1rem 2rem;
border-radius: 1rem;
box-shadow: 0 0.15rem 1.75rem 0 rgba(58, 59, 69, 0.1);
margin-bottom: 2rem;
display: flex;
justify-content: space-between;
align-items: center;
}
.page-heading h4 { margin-bottom: 0; font-weight: 700; color: #333; }
@media (max-width: 992px) {
.sidebar { left: -var(--sidebar-width); }
.main-content { margin-left: 0; }
.sidebar.active { left: 0; }
}
</style>
</head>
<body>
<!-- 侧边栏 -->
<div class="sidebar">
<div class="sidebar-header">
<a href="#" class="sidebar-brand">
<i class="fas fa-graduation-cap"></i>
<span>成绩管理系统</span>
</a>
</div>
<div class="user-profile">
<div class="user-avatar">
<i class="fas fa-user-shield"></i>
</div>
<div class="user-info text-white">
<h6 id="adminName">加载中...</h6>
<p>管理员</p>
</div>
</div>
<nav class="nav-menu">
<div class="nav-item">
<a href="/admin/dashboard" class="nav-link">
<i class="fas fa-tachometer-alt"></i>
<span>仪表板</span>
</a>
</div>
<div class="nav-item">
<a href="/admin/user_management" class="nav-link active">
<i class="fas fa-users"></i>
<span>用户管理</span>
</a>
</div>
<div class="nav-item">
<a href="/admin/student_management" class="nav-link">
<i class="fas fa-user-graduate"></i>
<span>学生管理</span>
</a>
</div>
<div class="nav-item">
<a href="/admin/teacher_management" class="nav-link">
<i class="fas fa-chalkboard-teacher"></i>
<span>教师管理</span>
</a>
</div>
<div class="nav-item">
<a href="/admin/grade_statistics" class="nav-link">
<i class="fas fa-chart-bar"></i>
<span>成绩统计</span>
</a>
</div>
<div class="nav-item">
<a href="/admin/system_settings" class="nav-link">
<i class="fas fa-cog"></i>
<span>系统设置</span>
</a>
</div>
<div class="nav-item">
<a href="/admin/data_export" class="nav-link">
<i class="fas fa-download"></i>
<span>数据导出</span>
</a>
</div>
<div class="nav-item">
<a href="/admin/operation_logs" class="nav-link">
<i class="fas fa-history"></i>
<span>操作日志</span>
</a>
</div>
<div class="nav-item mt-4">
<a href="javascript:void(0)" id="logoutBtn" class="nav-link text-warning">
<i class="fas fa-sign-out-alt"></i>
<span>退出登录</span>
</a>
</div>
</nav>
</div>
<!-- 主内容 -->
<div class="main-content">
<!-- 顶部导航 -->
<div class="top-navbar">
<div class="page-heading">
<h4>用户管理</h4>
</div>
<div class="d-flex align-items-center gap-3">
<div class="text-end d-none d-md-block">
<div class="small text-muted" id="currentTime"></div>
<div class="fw-bold" id="userName">加载中...</div>
</div>
</div>
</div>
<!-- 筛选栏 -->
<div class="card border-0 shadow-sm mb-4">
<div class="card-body">
<form id="filterForm" class="row g-3 align-items-end">
<div class="col-md-3">
<label class="form-label">搜索用户</label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-search"></i></span>
<input type="text" class="form-control" id="search" placeholder="ID、姓名或班级">
</div>
</div>
<div class="col-md-3">
<label class="form-label">角色筛选</label>
<select class="form-select" id="roleFilter">
<option value="">全部角色</option>
<option value="student">学生</option>
<option value="teacher">教师</option>
<option value="admin">管理员</option>
</select>
</div>
<div class="col-md-6 text-md-end">
<button type="button" class="btn btn-primary" id="addUserBtn">
<i class="fas fa-plus me-1"></i> 新增用户
</button>
</div>
</form>
</div>
</div>
<!-- 用户列表 -->
<div class="card border-0 shadow-sm">
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-hover align-middle mb-0">
<thead class="bg-light">
<tr>
<th class="ps-4">ID</th>
<th>姓名</th>
<th>角色</th>
<th>班级/部门</th>
<th>注册时间</th>
<th class="text-end pe-4">操作</th>
</tr>
</thead>
<tbody id="userTableBody">
<tr><td colspan="6" class="text-center py-5">加载中...</td></tr>
</tbody>
</table>
</div>
</div>
<div class="card-footer bg-white border-0 py-3">
<nav>
<ul class="pagination justify-content-center mb-0" id="pagination">
<!-- Pagination rendered by JS -->
</ul>
</nav>
</div>
</div>
</div>
<!-- Add/Edit User Modal -->
<div class="modal fade" id="userModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="userModalTitle">新增用户</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form id="userForm">
<input type="hidden" name="isEdit" id="isEdit" value="false">
<div class="mb-3">
<label class="form-label">用户ID</label>
<input type="text" class="form-control" name="id" id="userId" required>
</div>
<div class="mb-3">
<label class="form-label">姓名</label>
<input type="text" class="form-control" name="name" id="userNameInput" required>
</div>
<div class="mb-3">
<label class="form-label">角色</label>
<select class="form-select" name="role" id="userRole" required>
<option value="student">学生</option>
<option value="teacher">教师</option>
<option value="admin">管理员</option>
</select>
</div>
<div class="mb-3">
<label class="form-label">密码</label>
<input type="password" class="form-control" name="password" id="userPassword" placeholder="默认密码同ID">
<div class="form-text">新增时默认密码与ID相同编辑时留空不修改</div>
</div>
<div class="mb-3">
<label class="form-label">班级/部门</label>
<input type="text" class="form-control" name="class" id="userClass" placeholder="学生必填班级">
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary" id="saveUserBtn">保存</button>
</div>
</div>
</div>
</div>
<!-- Bootstrap 5 JS -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="/public/js/admin.js"></script>
</body>
</html>