/* 顾问管理:增删改查 + 服务端筛选与分页
名下还挂着学生的顾问不允许删除,后端会拦下来并返回中文提示 */
window.PAGES.push({
key: 'advisors',
title: '顾问管理',
sub: '招生顾问及其负责区域,名下还有学生时不可删除',
group: '数据管理',
icon: 'advisor',
component: {
name: 'AdvisorsPage',
template: `
查询
重置
{{ row.adv_gender }}
—
{{ dash(row.adv_phone) }}
{{ dash(row.adv_email) }}
{{ dash(row.adv_region) }}
编辑
删除
取消
保存
`,
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 };
},
},
});