diff --git a/app/templates/classes.html b/app/templates/classes.html
index 2cc3c55..3cc8c74 100644
--- a/app/templates/classes.html
+++ b/app/templates/classes.html
@@ -236,8 +236,6 @@ function toggleMineFilter() {
// 加载班级列表
function loadClasses() {
- saveClassFilterState();
-
const activeFilter = document.getElementById('activeFilter').value;
const mineFilter = document.getElementById('mineFilterBtn').classList.contains('active');
let url = '/api/classes?';
@@ -248,69 +246,27 @@ function loadClasses() {
fetch(url).then(r => r.json()).then(classes => {
const tbody = document.querySelector('#classesTable tbody');
const isAdmin = currentUserRole === 'admin';
- tbody.innerHTML = classes.map(c => `
-
- | ${c.id} |
- ${c.name} |
- ${c.level || '启蒙'} |
- ${c.description || '-'} |
- ${c.active ? '进行中' : '已结束'} |
- ${c.student_count} |
- ${c.created_at} |
-
-
- ${isAdmin ? `
- ` : ''}
- |
-
- `).join('');
- });
-}
- loadClasses();
-};
-
-// 我的班级筛选
-function toggleMineFilter() {
- const btn = document.getElementById('mineFilterBtn');
- btn.classList.toggle('active');
- if (btn.classList.contains('active')) {
- btn.classList.remove('btn-outline-secondary');
- btn.classList.add('btn-primary');
- } else {
- btn.classList.remove('btn-primary');
- btn.classList.add('btn-outline-secondary');
- }
- loadClasses();
-}
-
-// 加载班级列表
-function loadClasses() {
- const activeFilter = document.getElementById('activeFilter').value;
- const mineFilter = document.getElementById('mineFilterBtn').classList.contains('active');
- let url = '/api/classes?';
- if (activeFilter) url += 'active=' + activeFilter + '&';
- if (mineFilter) url += 'mine=true&';
- url = url.endsWith('&') ? url.slice(0, -1) : url;
- url = url.endsWith('?') ? '/api/classes' : url;
- fetch(url).then(r => r.json()).then(classes => {
- const tbody = document.querySelector('#classesTable tbody');
- const isAdmin = currentUserRole === 'admin';
- tbody.innerHTML = classes.map(c => `
-
- | ${c.id} |
- ${c.name} |
- ${c.level || '启蒙'} |
- ${c.description || '-'} |
- ${c.active ? '进行中' : '已结束'} |
- ${c.student_count} |
- ${c.created_at} |
-
-
- ${isAdmin ? `
- ` : ''}
- |
-
- `).join('');
+ tbody.innerHTML = classes.map(c => {
+ const esc = (s) => s == null ? '' : String(s).replace(/'/g, "\\'").replace(/"/g, '"');
+ const level = c.level || '启蒙';
+ const desc = c.description || '';
+ const teacherId = c.teacher_id || 'null';
+ const active = c.active ? 'true' : 'false';
+ return '' +
+ '| ' + c.id + ' | ' +
+ '' + esc(c.name) + ' | ' +
+ '' + level + ' | ' +
+ '' + esc(desc) + ' | ' +
+ '' + (c.active ? '进行中' : '已结束') + ' | ' +
+ '' + c.student_count + ' | ' +
+ '' + c.created_at + ' | ' +
+ '' +
+ '' +
+ (isAdmin ? '' : '') +
+ '' +
+ ' | ' +
+ '
';
+ }).join('');
});
}
@@ -518,7 +474,8 @@ document.getElementById('confirm-assign-goal').addEventListener('click', async (
// 弹出确认框
if (!confirm('将给班级所有学员分配此目标,确定吗?')) return;
- const res = await fetch(`/api/classes/${currentClassId}/goals`, {
+ const url = '/api/classes/' + currentClassId + '/goals';
+ const res = await fetch(url, {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
@@ -533,7 +490,11 @@ document.getElementById('confirm-assign-goal').addEventListener('click', async (
if (res.ok) {
const data = await res.json();
assignGoalModal.hide();
- alert(data.message + (data.skipped_count ? `(${data.skipped_count}个学员已分配此目标,跳过)` : ''));
+ let msg = data.message;
+ if (data.skipped_count) {
+ msg += ' (' + data.skipped_count + '个学员已分配此目标跳过)';
+ }
+ alert(msg);
} else {
const err = await res.json();
alert(err.error || '分配失败');