feat: 多班级版 v2.0 - Go后端重写 + 43轮代码审查
- 后端从 Python FastAPI 重写为 Go Gin(端口 56789) - 多班级完全隔离 - 超级管理员独立登录 - 课代表作业管理、排行榜分项排行 - 角色加减分上下限可配置 - 家长改密功能(可开关) - 周度/月度重置功能 - MySQL 5.7 兼容 - 43轮代码审查+全部修复 - Apache 2.0 许可证
This commit is contained in:
159
frontend/assets/js/cadre-homework.js
Normal file
159
frontend/assets/js/cadre-homework.js
Normal file
@@ -0,0 +1,159 @@
|
||||
/**
|
||||
* 多班级版班级管理系统 - 课代表作业管理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);
|
||||
});
|
||||
|
||||
})();
|
||||
Reference in New Issue
Block a user