技术栈:Go (Gin + GORM) + PHP + MySQL 5.7 + Redis 主要功能: - 多班级完全隔离(class_id 贯穿全系统) - 后端从 Python FastAPI 重写为 Go Gin(端口 56789) - 超级管理员独立登录(env 配置路径,默认账密 admin/Admin123) - 科任老师/课代表新角色 - 课代表作业管理页面 - 排行榜分项排行(操行分/考勤/作业) - 角色加减分上下限由班主任配置 - 家长改密功能(可开关) - 班级角色按需开关 - 宿舍号格式:南0-000 - 周度/月度重置功能 - MySQL 5.7 兼容 - Nginx 反向代理部署 开发者: Canglan 版权归属: Sea Network Technology Studio 许可证: Apache License 2.0
160 lines
5.6 KiB
JavaScript
160 lines
5.6 KiB
JavaScript
/**
|
|
* 多班级版班级管理系统 - 课代表作业管理JS
|
|
*
|
|
* 开发者: Canglan
|
|
* 版权归属: Sea Network Technology Studio
|
|
*
|
|
* 版权所有 © Sea Network Technology Studio
|
|
*/
|
|
|
|
(function() {
|
|
'use strict';
|
|
|
|
var currentPage = 1;
|
|
var pageSize = 20;
|
|
var currentAssignmentId = null;
|
|
|
|
async function loadHomework(page) {
|
|
var res = await apiGet('/api/cadre/homework', { page: page, page_size: pageSize });
|
|
if (res && res.success && res.data) {
|
|
var items = res.data.items || res.data.records || [];
|
|
var total = res.data.total || 0;
|
|
var html = '';
|
|
if (items.length === 0) {
|
|
html = '<tr><td colspan="5" style="text-align:center;">暂无作业记录</td></tr>';
|
|
} else {
|
|
items.forEach(function(item) {
|
|
html += '<tr>' +
|
|
'<td>' + escapeHtml(item.title || '-') + '</td>' +
|
|
'<td>' + escapeHtml(item.subject_name || '-') + '</td>' +
|
|
'<td>' + formatDate(item.deadline) + '</td>' +
|
|
'<td>' + escapeHtml(item.description || '-') + '</td>' +
|
|
'<td><button class="btn btn-sm btn-outline" onclick="showAbsentModal(' + item.assignment_id + ')">登记缺交</button></td>' +
|
|
'</tr>';
|
|
});
|
|
}
|
|
document.getElementById('homeworkList').innerHTML = html;
|
|
|
|
var totalPages = Math.ceil(total / pageSize);
|
|
if (totalPages > 1) {
|
|
document.getElementById('pagination').style.display = 'flex';
|
|
document.getElementById('pageInfo').textContent = page + ' / ' + totalPages;
|
|
document.getElementById('prevBtn').disabled = page <= 1;
|
|
document.getElementById('nextBtn').disabled = page >= totalPages;
|
|
} else {
|
|
document.getElementById('pagination').style.display = 'none';
|
|
}
|
|
}
|
|
}
|
|
|
|
window.changePage = function(delta) {
|
|
currentPage += delta;
|
|
loadHomework(currentPage);
|
|
};
|
|
|
|
window.showPublishModal = function() {
|
|
document.getElementById('publishForm').reset();
|
|
document.getElementById('hwDeadline').value = new Date().toISOString().split('T')[0];
|
|
document.getElementById('publishModal').style.display = 'flex';
|
|
};
|
|
|
|
window.submitHomework = async function() {
|
|
var title = document.getElementById('hwTitle').value.trim();
|
|
var deadline = document.getElementById('hwDeadline').value;
|
|
var description = document.getElementById('hwDescription').value.trim();
|
|
|
|
if (!title) {
|
|
showToast('请填写作业标题', 'error');
|
|
return;
|
|
}
|
|
if (!deadline) {
|
|
showToast('请选择截止日期', 'error');
|
|
return;
|
|
}
|
|
|
|
var res = await apiPost('/api/cadre/homework', {
|
|
title: title,
|
|
deadline: deadline,
|
|
description: description
|
|
});
|
|
|
|
if (res && res.success) {
|
|
showToast('作业发布成功');
|
|
closeModal('publishModal');
|
|
loadHomework(currentPage);
|
|
} else {
|
|
showToast(res && res.message ? res.message : '发布失败', 'error');
|
|
}
|
|
};
|
|
|
|
window.showAbsentModal = async function(assignmentId) {
|
|
currentAssignmentId = assignmentId;
|
|
var res = await apiGet('/api/admin/students', { page_size: 1000 });
|
|
if (res && res.success && res.data) {
|
|
var students = res.data.students || res.data.items || [];
|
|
var html = '<div class="form-group"><label>选择缺交学生</label></div>';
|
|
if (students.length === 0) {
|
|
html += '<p style="text-align:center;padding:20px;">暂无学生数据</p>';
|
|
} else {
|
|
html += '<div class="table-wrapper"><table class="table"><thead><tr>' +
|
|
'<th><input type="checkbox" id="selectAllAbsent" onchange="toggleAllAbsent(this)"></th>' +
|
|
'<th>学号</th><th>姓名</th></tr></thead><tbody>';
|
|
students.forEach(function(s) {
|
|
html += '<tr>' +
|
|
'<td><input type="checkbox" class="absent-checkbox" data-id="' + s.student_id + '"></td>' +
|
|
'<td>' + escapeHtml(s.student_no) + '</td>' +
|
|
'<td>' + escapeHtml(s.name) + '</td>' +
|
|
'</tr>';
|
|
});
|
|
html += '</tbody></table></div>';
|
|
}
|
|
document.getElementById('absentStudentList').innerHTML = html;
|
|
document.getElementById('absentModal').style.display = 'flex';
|
|
} else {
|
|
showToast('获取学生列表失败', 'error');
|
|
}
|
|
};
|
|
|
|
window.toggleAllAbsent = function(el) {
|
|
var checkboxes = document.querySelectorAll('.absent-checkbox');
|
|
checkboxes.forEach(function(cb) { cb.checked = el.checked; });
|
|
};
|
|
|
|
window.submitAbsent = async function() {
|
|
var checkboxes = document.querySelectorAll('.absent-checkbox:checked');
|
|
if (checkboxes.length === 0) {
|
|
showToast('请选择至少一名缺交学生', 'error');
|
|
return;
|
|
}
|
|
|
|
var studentIds = [];
|
|
checkboxes.forEach(function(cb) {
|
|
studentIds.push(parseInt(cb.getAttribute('data-id')));
|
|
});
|
|
|
|
var hwDeduct = window.DEDUCTION_HOMEWORK_NOT_SUBMIT || 2;
|
|
var res = await apiPost('/api/cadre/conduct/add', {
|
|
student_ids: studentIds,
|
|
points_change: -hwDeduct,
|
|
reason: '作业未提交',
|
|
related_type: 'homework'
|
|
});
|
|
|
|
if (res && res.success) {
|
|
showToast('已登记 ' + studentIds.length + ' 名学生缺交');
|
|
closeModal('absentModal');
|
|
} else {
|
|
showToast(res && res.message ? res.message : '提交失败', 'error');
|
|
}
|
|
};
|
|
|
|
window.closeModal = function(id) {
|
|
document.getElementById(id).style.display = 'none';
|
|
};
|
|
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
loadHomework(currentPage);
|
|
});
|
|
|
|
})();
|