refactor(auth): 重构认证模块适配Bootstrap 5样式 feat(controller): 在登录响应中返回用户对象 feat(server): 添加学生个人中心路由 refactor(models): 重构学生和成绩模型结构 style: 更新登录和注册页面UI设计 chore: 添加数据库备份脚本和空备份文件
108 lines
4.2 KiB
JavaScript
108 lines
4.2 KiB
JavaScript
/**
|
|
* 教师端功能管理
|
|
*/
|
|
class TeacherManager {
|
|
constructor() {
|
|
this.apiBase = '/api/teacher';
|
|
this.init();
|
|
}
|
|
|
|
init() {
|
|
this.initDashboard();
|
|
this.updateCurrentTime();
|
|
setInterval(() => this.updateCurrentTime(), 1000);
|
|
}
|
|
|
|
updateCurrentTime() {
|
|
const timeElement = document.getElementById('currentTime');
|
|
if (timeElement) {
|
|
const now = new Date();
|
|
const options = {
|
|
year: 'numeric', month: 'long', day: 'numeric',
|
|
hour: '2-digit', minute: '2-digit', second: '2-digit'
|
|
};
|
|
timeElement.textContent = now.toLocaleString('zh-CN', options);
|
|
}
|
|
}
|
|
|
|
async initDashboard() {
|
|
// 检查是否在仪表板页面
|
|
if (!document.getElementById('courseList')) return;
|
|
|
|
try {
|
|
const response = await fetch(`${this.apiBase}/courses`);
|
|
const result = await response.json();
|
|
|
|
if (result.success) {
|
|
this.renderDashboard(result.data.courses);
|
|
} else {
|
|
if (window.authManager) {
|
|
window.authManager.showNotification(result.message || '获取课程失败', 'error');
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error('Fetch teacher data failed:', error);
|
|
}
|
|
}
|
|
|
|
renderDashboard(courses) {
|
|
const courseList = document.getElementById('courseList');
|
|
if (!courseList) return;
|
|
|
|
if (!courses || courses.length === 0) {
|
|
courseList.innerHTML = '<div class="col-12 text-center py-5 text-muted">暂无负责课程</div>';
|
|
return;
|
|
}
|
|
|
|
courseList.innerHTML = courses.map(course => `
|
|
<div class="col-md-6 col-xl-4 mb-4">
|
|
<div class="card h-100 border-0 shadow-sm course-card">
|
|
<div class="card-body">
|
|
<div class="d-flex justify-content-between align-items-center mb-3">
|
|
<span class="badge bg-primary bg-opacity-10 text-primary px-3 py-2">
|
|
<i class="fas fa-book me-1"></i> ${course.course_code || 'CODE'}
|
|
</span>
|
|
<span class="text-muted small">${course.credit} 学分</span>
|
|
</div>
|
|
<h5 class="card-title fw-bold mb-2">${course.course_name}</h5>
|
|
<p class="card-text text-secondary small mb-4">
|
|
<i class="fas fa-users me-1"></i> 学生人数: ${course.student_count || 0}
|
|
</p>
|
|
<div class="d-grid gap-2">
|
|
<a href="/teacher/grade_entry?courseId=${course.id}" class="btn btn-outline-primary btn-sm">
|
|
<i class="fas fa-edit me-1"></i> 成绩录入
|
|
</a>
|
|
<a href="/teacher/grade_management?courseId=${course.id}" class="btn btn-primary btn-sm">
|
|
<i class="fas fa-tasks me-1"></i> 成绩管理
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
`).join('');
|
|
|
|
// 更新统计数据
|
|
document.getElementById('courseCount').textContent = courses.length;
|
|
const totalStudents = courses.reduce((sum, c) => sum + (c.student_count || 0), 0);
|
|
document.getElementById('totalStudents').textContent = totalStudents;
|
|
}
|
|
}
|
|
|
|
// 初始化
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
window.teacherManager = new TeacherManager();
|
|
|
|
// 从 Session 获取用户信息并更新 UI
|
|
fetch('/api/auth/me')
|
|
.then(res => res.json())
|
|
.then(result => {
|
|
if (result.success && result.data.user) {
|
|
const user = result.data.user;
|
|
const nameEl = document.getElementById('userName');
|
|
const teacherNameEl = document.getElementById('teacherName');
|
|
|
|
if (nameEl) nameEl.textContent = user.name;
|
|
if (teacherNameEl) teacherNameEl.textContent = user.name;
|
|
}
|
|
});
|
|
}); |