/* 顾问管理:增删改查 + 服务端筛选与分页 名下还挂着学生的顾问不允许删除,后端会拦下来并返回中文提示 */ window.PAGES.push({ key: 'advisors', title: '顾问管理', sub: '招生顾问及其负责区域,名下还有学生时不可删除', group: '数据管理', icon: 'advisor', component: { name: 'AdvisorsPage', template: `
查询 重置
顾问列表
共 {{ total }} 位顾问
+ 新增顾问
`, setup() { const loading = ref(false); const saving = ref(false); const rows = ref([]); const total = ref(0); const dialog = ref(false); const editing = ref(null); const formRef = ref(null); // 接口用 skip/limit 分页,skip 由页码换算 const limit = ref(10); const skipPage = ref(1); const filter = ref({ adv_name: '', adv_phone: '', adv_region: '', adv_gender: null }); const emptyForm = () => ({ adv_name: '', adv_gender: null, adv_phone: '', adv_email: '', adv_region: '' }); const form = ref(emptyForm()); const rules = { adv_name: [{ required: true, message: '请填写姓名', trigger: 'blur' }], }; const load = async () => { loading.value = true; try { // 先按当前条件取一批,用来判断总数:接口不返回总数, // 所以拿 limit=1000 的一次全量结果算,再切当前页显示。 const all = await AdvisorApi.list({ adv_name: filter.value.adv_name, adv_phone: filter.value.adv_phone, adv_region: filter.value.adv_region, adv_gender: filter.value.adv_gender, limit: 1000, }); total.value = all.length; const start = (skipPage.value - 1) * limit.value; rows.value = all.slice(start, start + limit.value); } catch (e) { toastErr(e); } finally { loading.value = false; } }; const reset = () => { filter.value = { adv_name: '', adv_phone: '', adv_region: '', adv_gender: null }; skipPage.value = 1; load(); }; const openCreate = () => { editing.value = null; form.value = emptyForm(); dialog.value = true; }; const openEdit = (row) => { editing.value = row.adv_id; form.value = { adv_name: row.adv_name, adv_gender: row.adv_gender, adv_phone: row.adv_phone, adv_email: row.adv_email, adv_region: row.adv_region, }; 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 AdvisorApi.update(editing.value, pruneEmpty(form.value)); toastOk('修改成功'); } else { await AdvisorApi.create(pruneEmpty(form.value)); toastOk('新增成功'); } Cache.invalidate('advisors'); dialog.value = false; await load(); } catch (e) { toastErr(e); } finally { saving.value = false; } }; const remove = async (row) => { try { await ElementPlus.ElMessageBox.confirm( `确定删除顾问「${row.adv_name}」吗?`, '删除确认', { type: 'warning', confirmButtonText: '确定删除', cancelButtonText: '取消' }); } catch (e) { return; } try { await AdvisorApi.remove(row.adv_id); toastOk('删除成功'); Cache.invalidate('advisors'); await load(); } catch (e) { toastErr(e); } }; // 翻页 / 改每页条数都要重新取 watch([skipPage, limit], load); onMounted(load); return { loading, saving, rows, total, limit, skipPage, filter, dialog, editing, formRef, form, rules, load, reset, openCreate, openEdit, submit, remove, GENDER_OPTIONS, dash }; }, }, });