You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dianshang-qianduan/src/views/platformAdmin/school/index.vue

209 lines
6.9 KiB
Vue

<template>
<div class="school-admin-workbench">
<section class="admin-hero">
<div class="admin-badge">Platform Admin / Schools</div>
<h1 class="admin-title">学校管理</h1>
<p class="admin-subtitle">平台超管维护学校基础档案学校管理员账号和本校业务数据会绑定到这里</p>
</section>
<section class="admin-panel">
<div class="toolbar">
<el-input v-model="query.schoolName" clearable placeholder="学校名称" class="filter-input" @keyup.enter="load" />
<el-button type="primary" @click="load"></el-button>
<el-button @click="reset"></el-button>
<el-button type="success" @click="openCreate"></el-button>
</div>
<el-table v-loading="loading" :data="rows" border>
<el-table-column label="学校名称" prop="schoolName" min-width="180" />
<el-table-column label="学校层次" prop="schoolGrade" min-width="120" />
<el-table-column label="省份" prop="schoolProvince" width="110" />
<el-table-column label="城市" prop="schoolCity" width="110" />
<el-table-column label="联系人" prop="schoolContacts" min-width="120" />
<el-table-column label="联系电话" prop="schoolContactsMobile" min-width="140" />
<el-table-column label="联系邮箱" prop="schoolContactsEmail" min-width="180" />
<el-table-column label="操作" width="160" fixed="right">
<template #default="{ row }">
<el-button link type="primary" @click="openEdit(row)"></el-button>
<el-button link type="danger" @click="remove(row)"></el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
class="pager"
layout="total, prev, pager, next, sizes"
:total="total"
v-model:current-page="query.index"
v-model:page-size="query.size"
@current-change="load"
@size-change="handleSizeChange"
/>
<el-dialog
v-model="dialogVisible"
:title="editingId ? '编辑学校' : '新增学校'"
width="680px"
align-center
append-to-body
custom-class="admin-edit-dialog platform-admin-dialog platform-school-dialog"
>
<el-form :model="form" label-width="98px">
<el-form-item label="学校名称">
<el-input v-model="form.schoolName" />
</el-form-item>
<el-form-item label="学校层次">
<el-input v-model="form.schoolGrade" placeholder="如:本科、专科、双一流" />
</el-form-item>
<el-form-item label="省份/城市">
<div class="form-inline">
<el-select v-model="form.schoolProvince" filterable placeholder="请选择省份" @change="handleProvinceChange">
<el-option v-for="item in chinaRegions" :key="item.province" :label="item.province" :value="item.province" />
</el-select>
<el-select v-model="form.schoolCity" filterable placeholder="请选择城市" :disabled="!form.schoolProvince">
<el-option v-for="city in cityOptions" :key="city" :label="city" :value="city" />
</el-select>
</div>
</el-form-item>
<el-form-item label="联系人">
<el-input v-model="form.schoolContacts" />
</el-form-item>
<el-form-item label="联系电话">
<el-input v-model="form.schoolContactsMobile" />
</el-form-item>
<el-form-item label="联系邮箱">
<el-input v-model="form.schoolContactsEmail" />
</el-form-item>
<el-form-item label="学校Logo">
<ImageUpload v-model="form.schoolLogo" class="school-logo-upload" :limit="1" :file-size="2" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="submit"></el-button>
</template>
</el-dialog>
</section>
</div>
</template>
<script setup>
import "@/views/schoolAdmin/admin-theme.scss";
import { ElMessage, ElMessageBox } from "element-plus";
import { addPlatformSchool, deletePlatformSchool, getPlatformSchools, updatePlatformSchool } from "@/api/platformAdmin";
import { chinaRegions } from "@/utils/chinaRegions";
const query = reactive({ index: 1, size: 10, schoolName: "" });
const rows = ref([]);
const total = ref(0);
const loading = ref(false);
const dialogVisible = ref(false);
const editingId = ref("");
const form = ref({});
const cityOptions = computed(() => chinaRegions.find((item) => item.province === form.value.schoolProvince)?.cities || []);
const load = async () => {
loading.value = true;
try {
const res = await getPlatformSchools(query);
rows.value = res.data?.list || [];
total.value = res.data?.total || 0;
} finally {
loading.value = false;
}
};
const reset = () => {
query.index = 1;
query.schoolName = "";
load();
};
const handleSizeChange = () => {
query.index = 1;
load();
};
const openCreate = () => {
editingId.value = "";
form.value = {
schoolName: "",
schoolGrade: "",
schoolProvince: "",
schoolCity: "",
schoolContacts: "",
schoolContactsMobile: "",
schoolContactsEmail: "",
schoolLogo: "",
};
dialogVisible.value = true;
};
const openEdit = (row) => {
editingId.value = row.schoolId;
form.value = { ...row };
dialogVisible.value = true;
};
const handleProvinceChange = () => {
form.value.schoolCity = "";
};
const buildSchoolPayload = () => ({
schoolName: form.value.schoolName,
schoolGrade: form.value.schoolGrade,
schoolProvince: form.value.schoolProvince,
schoolCity: form.value.schoolCity,
schoolContacts: form.value.schoolContacts,
schoolContactsMobile: form.value.schoolContactsMobile,
schoolContactsEmail: form.value.schoolContactsEmail,
schoolLogo: form.value.schoolLogo,
});
const submit = async () => {
const payload = buildSchoolPayload();
if (editingId.value) {
await updatePlatformSchool(editingId.value, payload);
} else {
await addPlatformSchool(payload);
}
ElMessage.success("保存成功");
dialogVisible.value = false;
load();
};
const remove = async (row) => {
await ElMessageBox.confirm("确认删除该学校?学校下存在业务数据时后端会拒绝删除。", "提示", { type: "warning" });
await deletePlatformSchool(row.schoolId);
ElMessage.success("删除成功");
load();
};
onMounted(load);
</script>
<style scoped lang="scss">
.form-inline {
display: grid;
width: 100%;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 10px;
}
.school-logo-upload {
width: 100%;
}
.school-logo-upload :deep(.el-upload-list--picture-card .el-upload-list__item),
.school-logo-upload :deep(.el-upload--picture-card) {
width: 96px;
height: 96px;
}
@media (max-width: 640px) {
.form-inline {
grid-template-columns: 1fr;
}
}
</style>