/* 老师管理:增删改查
接口 /teacher/ 没有查询参数,筛选在客户端做;
新增必须选一个已存在的班级,否则会撞外键约束 */
window.PAGES.push({
key: 'teachers',
title: '老师管理',
sub: '班主任与任课老师,工号可自动生成',
group: '数据管理',
icon: 'teacher',
component: {
name: 'TeachersPage',
template: `
共 {{ filtered.length }} 位老师
{{ className(row.class_id) }}
{{ row.role }}
{{ dash(row.t_phone) }}
{{ dash(row.t_email) }}
编辑
删除
取消
保存
`,
setup() {
const loading = ref(false);
const saving = ref(false);
const generating = ref(false);
const rows = ref([]);
const classes = ref([]);
const keyword = ref('');
const dialog = ref(false);
const editing = ref(null);
const formRef = ref(null);
const emptyForm = () => ({ t_no: '', t_name: '', t_phone: '', t_email: '', class_id: null, role: '任课' });
const form = ref(emptyForm());
const rules = {
t_name: [{ required: true, message: '请填写姓名', trigger: 'blur' }],
class_id: [{ required: true, message: '请选择班级', trigger: 'change' }],
role: [{ required: true, message: '请选择角色', trigger: 'change' }],
};
// 接口没有查询条件,拿回全部后在本地过滤
const filtered = computed(() => {
const k = keyword.value.trim().toLowerCase();
if (!k) return rows.value;
return rows.value.filter(r =>
String(r.t_no || '').toLowerCase().includes(k) ||
String(r.t_name || '').toLowerCase().includes(k));
});
const load = async () => {
loading.value = true;
try { rows.value = await TeacherApi.list(); }
catch (e) { toastErr(e); }
finally { loading.value = false; }
};
const generateNo = async () => {
generating.value = true;
try {
const r = await TeacherApi.generateNo();
form.value.t_no = r.t_no;
toastOk('已生成工号:' + r.t_no);
} catch (e) { toastErr(e); }
finally { generating.value = false; }
};
const openCreate = () => {
editing.value = null;
form.value = emptyForm();
dialog.value = true;
};
const openEdit = (row) => {
editing.value = row.t_id;
form.value = {
t_no: row.t_no, t_name: row.t_name, t_phone: row.t_phone,
t_email: row.t_email, class_id: row.class_id, role: row.role,
};
dialog.value = true;
};
const submit = async () => {
if (!formRef.value) return;
try { await formRef.value.validate(); } catch (e) { return; }
saving.value = true;
try {
if (editing.value) {
await TeacherApi.update(editing.value, pruneEmpty(form.value));
toastOk('修改成功');
} else {
await TeacherApi.create(pruneEmpty(form.value));
toastOk('新增成功');
}
dialog.value = false;
await load();
} catch (e) { toastErr(e); }
finally { saving.value = false; }
};
const remove = async (row) => {
try {
await ElementPlus.ElMessageBox.confirm(
`确定删除老师「${row.t_name}」吗?`,
'删除确认', { type: 'warning', confirmButtonText: '确定删除', cancelButtonText: '取消' });
} catch (e) { return; }
try {
await TeacherApi.remove(row.t_id);
toastOk('删除成功');
await load();
} catch (e) { toastErr(e); }
};
onMounted(async () => {
try { classes.value = await Cache.loadClasses(); }
catch (e) { toastErr(e); }
load();
});
return { loading, saving, generating, rows, classes, keyword, filtered, dialog,
editing, formRef, form, rules, load, generateNo, openCreate, openEdit,
submit, remove, ROLE_OPTIONS, dash, className, classLabel };
},
},
});