/* 老师管理:增删改查 接口 /teacher/ 没有查询参数,筛选在客户端做; 新增必须选一个已存在的班级,否则会撞外键约束 */ window.PAGES.push({ key: 'teachers', title: '老师管理', sub: '班主任与任课老师,工号可自动生成', group: '数据管理', icon: 'teacher', component: { name: 'TeachersPage', template: `
共 {{ filtered.length }} 位老师
老师列表
刷新 + 新增老师
自动生成
`, 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 }; }, }, });