v1.7版本更新

This commit is contained in:
2026-05-21 20:15:56 +08:00
parent 74a71ddaf5
commit cb0c367eb7
54 changed files with 2292 additions and 1785 deletions

View File

@@ -81,6 +81,16 @@ include __DIR__ . '/../includes/header.php';
<button type="button" class="btn btn-sm" onclick="selectDeductionType(0, '')">自定义</button>
</div>
</div>
<?php if ($role === '学习委员'): ?>
<div class="form-group">
<label>具体作业</label>
<input type="text" id="hwTitle" placeholder="选填,如:第三章练习">
</div>
<div class="form-group">
<label>缴交时间</label>
<input type="date" id="hwDeadline">
</div>
<?php endif; ?>
<div class="form-group">
<label>分数变动</label>
<input type="number" id="pointsChange" required min="-5" max="5" step="1" placeholder="正数加分,负数扣分">
@@ -101,118 +111,10 @@ include __DIR__ . '/../includes/header.php';
</div>
</div>
<script>
var selectedStudentIds = [];
const hwRole = '<?php echo $role; ?>';
// 初始化扣分配置
const hwMaxPoints = hwRole === '班主任' ? 100 : 5;
const hwNotSubmit = window.DEDUCTION_HOMEWORK_NOT_SUBMIT || 2;
const hwLate = window.DEDUCTION_HOMEWORK_LATE || 1;
// 更新页面中的配置值显示
document.querySelectorAll('.hw-not-submit').forEach(el => el.textContent = hwNotSubmit);
document.querySelectorAll('.hw-late').forEach(el => el.textContent = hwLate);
document.querySelectorAll('.hw-max').forEach(el => el.textContent = hwMaxPoints);
// 更新输入框的 min/max
document.getElementById('pointsChange').setAttribute('min', -hwMaxPoints);
document.getElementById('pointsChange').setAttribute('max', hwMaxPoints);
// 加载科目列表(学习委员)
async function loadSubjectsForHomework() {
if (hwRole !== '学习委员') return;
const subjectSelect = document.getElementById('hwSubjectSelect');
if (!subjectSelect) return;
const res = await apiGet('/api/subject/list');
if (res && res.success && res.data && res.data.subjects) {
let html = '<option value="">不选择科目</option>';
res.data.subjects.forEach(s => {
html += `<option value="${escapeHtml(s.subject_name)}">${escapeHtml(s.subject_name)}</option>`;
});
subjectSelect.innerHTML = html;
}
}
async function loadStudents() {
const res = await apiGet('/api/admin/students', {page_size: 1000});
if (res && res.success) {
let html = '';
res.data.students.forEach(student => {
html += `<tr>
<td><input type="checkbox" class="student-checkbox" data-id="${student.student_id}"></td>
<td>${escapeHtml(student.student_no)}</td>
<td>${escapeHtml(student.name)}</td>
<td>${student.total_points}</td>
<td><button class="btn btn-sm btn-primary" onclick="showSinglePointsModal(${student.student_id}, '${escapeHtml(student.name)}')">加减分</button></td>
</tr>`;
});
if (res.data.students.length === 0) {
html = '<tr><td colspan="5" style="text-align:center;">暂无学生数据</td></tr>';
}
document.getElementById('studentList').innerHTML = html;
}
}
function showSinglePointsModal(studentId, studentName) {
selectedStudentIds = [studentId];
document.getElementById('selectedStudentsCount').innerHTML = `${studentName} (1人)`;
document.getElementById('pointsChange').value = '';
document.getElementById('pointsReason').value = '';
document.getElementById('batchPointsModal').style.display = 'flex';
}
function showBatchPointsModal() {
selectedStudentIds = [];
document.querySelectorAll('.student-checkbox:checked').forEach(cb => {
selectedStudentIds.push(parseInt(cb.dataset.id));
});
if (selectedStudentIds.length === 0) {
showToast('请先选择学生', 'warning');
return;
}
document.getElementById('selectedStudentsCount').innerHTML = `已选择 ${selectedStudentIds.length} 名学生`;
document.getElementById('pointsChange').value = '';
document.getElementById('pointsReason').value = '';
document.getElementById('batchPointsModal').style.display = 'flex';
}
function selectDeductionType(points, reason) {
document.getElementById('pointsChange').value = points;
if (points !== 0) {
document.getElementById('pointsReason').value = reason;
} else {
document.getElementById('pointsReason').value = '';
document.getElementById('pointsReason').focus();
}
}
function handleSubmitPoints() {
const pointsChange = parseInt(document.getElementById('pointsChange').value);
if (isNaN(pointsChange) || pointsChange === 0) {
showToast('请输入有效的加减分值', 'warning');
return;
}
if (Math.abs(pointsChange) > hwMaxPoints) {
showToast(`每次加减分不超过${hwMaxPoints}分`, 'warning');
return;
}
// 学习委员附加科目前缀
if (hwRole === '学习委员') {
const subjectSelect = document.getElementById('hwSubjectSelect');
const subjectName = subjectSelect ? subjectSelect.value : '';
const reasonEl = document.getElementById('pointsReason');
if (subjectName && !reasonEl.value.startsWith('[')) {
reasonEl.value = `[${subjectName}] ${reasonEl.value}`;
}
}
submitBatchPoints();
}
loadStudents();
loadSubjectsForHomework();
</script>
<script src="/assets/js/admin.js"></script>
<script>window.PAGE_CONFIG = { role: '<?php echo $role; ?>' };</script>
<script src="/assets/js/modules/modal-utils.js"></script>
<script src="/assets/js/modules/utils.js"></script>
<script src="/assets/js/modules/points-mgmt.js"></script>
<script src="/assets/js/homework-manage.js"></script>
<?php include __DIR__ . '/../includes/footer.php'; ?>