fix school admin ui issues

dev-QQq
chenyuan 2 months ago
parent 9ba591e7a1
commit 61a5790149

@ -1,7 +1,23 @@
.gdialog {
color: #dcecff;
p,
span,
div,
li {
color: #dcecff !important;
}
p {
color: black !important;
font-size: 15px;
line-height: 1.65;
}
strong,
b {
color: #ffffff !important;
}
border-radius: 5px;
.el-dialog__title {
font-weight: 600 !important;
@ -130,4 +146,4 @@
color: #ffffff;
}
}
}
}

@ -4,7 +4,7 @@
<span class="nacber-name" v-if="role !== 3"></span>
<span class="nacber-name" v-else> - </span>
</div>
<div :class="['el-ment', { 'platform-nav': role === 1 }]">
<div :class="['el-ment', { 'platform-nav': role === 1 || role === 2, 'school-admin-nav': role === 2 }]">
<template v-for="item in roleList" :key="item.name">
<div :class="['el-ment-item', { 'el-ment-item-active': isActive(item) }]" @click="go(item)">{{ item.name }}</div>
</template>
@ -106,6 +106,36 @@ const mentList = ref([
role: 1,
activePrefix: "/platform-school-admins",
},
{
name: "院系管理",
path: "/admin-faculty/index",
role: 2,
activePrefix: "/admin-faculty",
},
{
name: "专业管理",
path: "/admin-major/index",
role: 2,
activePrefix: "/admin-major",
},
{
name: "班级管理",
path: "/admin-class/index",
role: 2,
activePrefix: "/admin-class",
},
{
name: "教师管理",
path: "/admin-teacher/index",
role: 2,
activePrefix: "/admin-teacher",
},
{
name: "学生管理",
path: "/admin-student/index",
role: 2,
activePrefix: "/admin-student",
},
{
name: "实验报告",
path: "/report/index",
@ -179,7 +209,7 @@ const roleList = computed(() => {
return item.path === "/index" || item.role === 1;
}
if (currentRole === 2) {
return item.path === "/index";
return item.path === "/index" || item.role === 2;
}
if (!item.role || item.path === "/index" || item.path === "/analysis/index") return true;
return item.role == currentRole;
@ -323,6 +353,14 @@ onMounted(() => {
&.platform-nav {
gap: 14px;
}
&.school-admin-nav {
left: 55%;
gap: 8px;
font-size: 16px;
.el-ment-item {
padding: 6px 10px;
}
}
}
.right-menu {
float: right;

@ -30,7 +30,7 @@ const sidebar = computed(() => useAppStore().sidebar);
const device = computed(() => useAppStore().device);
const needTagsView = computed(() => settingsStore.tagsView);
const fixedHeader = computed(() => settingsStore.fixedHeader);
const useTopNavbarOnly = computed(() => role.value === 1);
const useTopNavbarOnly = computed(() => role.value === 1 || role.value === 2);
const classObj = computed(() => ({
hideSidebar: !sidebar.value.opened,

@ -57,12 +57,11 @@ const go = (path) => {
router.push(path);
};
const schoolAdminLinks = [
{ label: "School", title: "学校管理", desc: "查看并编辑当前学校基础信息。", path: "/admin-school/index" },
{ label: "Faculty", title: "院系管理", desc: "维护本校院系数据。", path: "/admin-faculty/index" },
{ label: "Major", title: "专业管理", desc: "维护本校专业数据。", path: "/admin-major/index" },
{ label: "Class", title: "班级管理", desc: "维护本校班级数据。", path: "/admin-class/index" },
{ label: "Teacher", title: "教师管理", desc: "维护本校教师账号。", path: "/admin-teacher/index" },
{ label: "Student", title: "学生管理", desc: "维护本校学生账号。", path: "/admin-student/index" },
{ label: "Faculty", title: "院系管理", desc: "维护院系数据。", path: "/admin-faculty/index" },
{ label: "Major", title: "专业管理", desc: "维护专业数据。", path: "/admin-major/index" },
{ label: "Class", title: "班级管理", desc: "维护班级数据。", path: "/admin-class/index" },
{ label: "Teacher", title: "教师管理", desc: "维护教师账号。", path: "/admin-teacher/index" },
{ label: "Student", title: "学生管理", desc: "维护学生账号。", path: "/admin-student/index" },
];
</script>
<style lang='scss' scoped>

@ -46,7 +46,7 @@
width="680px"
align-center
append-to-body
custom-class="platform-admin-dialog platform-school-dialog"
custom-class="admin-edit-dialog platform-admin-dialog platform-school-dialog"
>
<el-form :model="form" label-width="98px">
<el-form-item label="学校名称">

@ -52,7 +52,7 @@
width="560px"
align-center
append-to-body
custom-class="platform-admin-dialog"
custom-class="admin-edit-dialog platform-admin-dialog"
>
<el-form :model="form" label-width="92px">
<el-form-item label="所属学校">

@ -127,11 +127,22 @@
border-color: rgba(45, 143, 207, 0.32);
background: rgba(3, 24, 36, 0.72);
color: #dceeff;
--el-table-border-color: rgba(45, 143, 207, 0.2);
--el-table-header-bg-color: #082338;
--el-table-header-text-color: #e8f7ff;
--el-table-row-hover-bg-color: rgba(0, 160, 255, 0.14);
}
.school-admin-workbench .el-table th.el-table__cell {
background: rgba(0, 42, 68, 0.92);
color: #b9e2ff;
.school-admin-workbench .el-table .el-table__header-wrapper th.el-table__cell,
.school-admin-workbench .el-table .el-table__fixed-header-wrapper th.el-table__cell {
background-color: #082338 !important;
color: #e8f7ff !important;
font-weight: 700;
border-color: rgba(45, 143, 207, 0.22);
}
.school-admin-workbench .el-table th.el-table__cell > .cell {
color: #e8f7ff;
font-weight: 700;
}
@ -186,6 +197,7 @@
background: transparent;
}
.admin-edit-dialog,
.platform-admin-dialog {
display: flex;
max-width: calc(100vw - 32px);
@ -193,10 +205,26 @@
flex-direction: column;
}
.admin-edit-dialog .el-dialog__body,
.platform-admin-dialog .el-dialog__body {
overflow-y: auto;
}
.admin-edit-dialog .el-input__wrapper,
.admin-edit-dialog .el-select .el-input__wrapper {
background: rgba(3, 24, 36, 0.9);
border: 1px solid rgba(45, 95, 126, 0.9);
box-shadow: none;
}
.admin-edit-dialog .el-input__inner {
color: #eef5ff;
}
.admin-edit-dialog .el-input__inner::placeholder {
color: #5f7d9c;
}
@media (max-width: 900px) {
.school-admin-workbench {
padding: 14px;

@ -20,9 +20,6 @@
<el-table-column label="班级名称" min-width="180">
<template #default="{ row }">{{ item(row).className }}</template>
</el-table-column>
<el-table-column label="班级编号" min-width="140">
<template #default="{ row }">{{ item(row).classSn }}</template>
</el-table-column>
<el-table-column label="所属专业" min-width="180">
<template #default="{ row }">{{ majorName(item(row).schoolMajorId) }}</template>
</el-table-column>
@ -36,15 +33,19 @@
<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="load" />
<el-dialog v-model="dialogVisible" :title="form.schoolClassId ? '编辑班级' : '新增班级'" width="520px">
<el-dialog v-model="dialogVisible" :title="form.schoolClassId ? '编辑班级' : '新增班级'" width="520px" align-center append-to-body custom-class="admin-edit-dialog">
<el-form :model="form" label-width="96px">
<el-form-item label="所属院系">
<el-select v-model="form.schoolFacultyId" placeholder="请选择院系" style="width: 100%" @change="handleFacultyChange">
<el-option v-for="faculty in faculties" :key="faculty.schoolFacultyId" :label="faculty.schoolFacultyName" :value="faculty.schoolFacultyId" />
</el-select>
</el-form-item>
<el-form-item label="所属专业">
<el-select v-model="form.schoolMajorId" placeholder="请选择专业" style="width: 100%">
<el-option v-for="major in majors" :key="major.schoolMajorId" :label="major.schoolMajorName" :value="major.schoolMajorId" />
<el-select v-model="form.schoolMajorId" placeholder="请选择专业" style="width: 100%" :disabled="!form.schoolFacultyId">
<el-option v-for="major in formMajors" :key="major.schoolMajorId" :label="major.schoolMajorName" :value="major.schoolMajorId" />
</el-select>
</el-form-item>
<el-form-item label="班级名称"><el-input v-model="form.className" /></el-form-item>
<el-form-item label="班级编号"><el-input v-model="form.classSn" /></el-form-item>
</el-form>
<template #footer>
<el-button @click="dialogVisible = false">取消</el-button>
@ -58,7 +59,7 @@
<script setup>
import "@/views/schoolAdmin/admin-theme.scss";
import { ElMessage, ElMessageBox } from "element-plus";
import { addAdminClass, deleteAdminClass, getAdminClasses, getAdminMajors, updateAdminClass } from "@/api/schoolAdmin";
import { addAdminClass, deleteAdminClass, getAdminClasses, getAdminFaculties, getAdminMajors, updateAdminClass } from "@/api/schoolAdmin";
const query = reactive({ index: 1, size: 10, className: "", schoolMajorId: "" });
const rows = ref([]);
@ -66,13 +67,24 @@ const total = ref(0);
const loading = ref(false);
const dialogVisible = ref(false);
const form = ref({});
const faculties = ref([]);
const majors = ref([]);
const item = (row) => row.schoolClass || row;
const majorName = (id) => majors.value.find((major) => major.schoolMajorId === id)?.schoolMajorName || "";
const majorFacultyId = (id) => majors.value.find((major) => major.schoolMajorId === id)?.schoolFacultyId || "";
const formMajors = computed(() => majors.value.filter((major) => major.schoolFacultyId === form.value.schoolFacultyId));
const loadFaculties = async () => {
const res = await getAdminFaculties({ index: 1, size: 1000 });
faculties.value = (res.data?.list || []).map((row) => row.schoolFaculty || row);
};
const loadMajors = async () => {
const res = await getAdminMajors({ index: 1, size: 1000 });
majors.value = (res.data?.list || []).map((row) => ({ ...(row.schoolMajor || row), schoolMajorId: row.schoolMajorId || row.schoolMajor?.schoolMajorId }));
majors.value = (res.data?.list || []).map((row) => ({
...(row.schoolMajor || row),
schoolFacultyId: row.schoolFacultyId || row.schoolMajor?.schoolFacultyId,
schoolMajorId: row.schoolMajorId || row.schoolMajor?.schoolMajorId,
}));
};
const load = async () => {
loading.value = true;
@ -91,18 +103,27 @@ const reset = () => {
load();
};
const openCreate = () => {
form.value = {};
form.value = { schoolFacultyId: "", schoolMajorId: "", className: "" };
dialogVisible.value = true;
};
const openEdit = (row) => {
form.value = { ...item(row) };
const current = { ...item(row) };
form.value = { ...current, schoolFacultyId: majorFacultyId(current.schoolMajorId) };
dialogVisible.value = true;
};
const handleFacultyChange = () => {
form.value.schoolMajorId = "";
};
const submit = async () => {
const payload = {
schoolClassId: form.value.schoolClassId,
schoolMajorId: form.value.schoolMajorId,
className: form.value.className,
};
if (form.value.schoolClassId) {
await updateAdminClass(form.value.schoolClassId, form.value);
await updateAdminClass(form.value.schoolClassId, payload);
} else {
await addAdminClass(form.value);
await addAdminClass(payload);
}
ElMessage.success("保存成功");
dialogVisible.value = false;
@ -116,6 +137,7 @@ const remove = async (row) => {
};
onMounted(() => {
loadFaculties();
loadMajors();
load();
});

@ -36,7 +36,7 @@
<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="load" />
<el-dialog v-model="dialogVisible" :title="form.schoolFacultyId ? '编辑院系' : '新增院系'" width="520px">
<el-dialog v-model="dialogVisible" :title="form.schoolFacultyId ? '编辑院系' : '新增院系'" width="520px" align-center append-to-body custom-class="admin-edit-dialog">
<el-form :model="form" label-width="96px">
<el-form-item label="院系名称"><el-input v-model="form.schoolFacultyName" /></el-form-item>
<el-form-item label="联系人"><el-input v-model="form.schoolFacultyContact" /></el-form-item>

@ -37,7 +37,7 @@
<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="load" />
<el-dialog v-model="dialogVisible" :title="form.schoolMajorId ? '编辑专业' : '新增专业'" width="520px">
<el-dialog v-model="dialogVisible" :title="form.schoolMajorId ? '编辑专业' : '新增专业'" width="520px" align-center append-to-body custom-class="admin-edit-dialog">
<el-form :model="form" label-width="96px">
<el-form-item label="所属院系">
<el-select v-model="form.schoolFacultyId" placeholder="请选择院系" style="width: 100%">

@ -35,13 +35,23 @@
<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="load" />
<el-dialog v-model="dialogVisible" :title="form.userId ? '编辑学生' : '新增学生'" width="520px">
<el-dialog v-model="dialogVisible" :title="form.userId ? '编辑学生' : '新增学生'" width="520px" align-center append-to-body custom-class="admin-edit-dialog">
<el-form :model="form" label-width="86px">
<el-form-item label="姓名"><el-input v-model="form.name" /></el-form-item>
<el-form-item label="学号"><el-input v-model="form.username" :disabled="Boolean(form.userId)" /></el-form-item>
<el-form-item label="所属院系">
<el-select v-model="form.schoolFacultyId" placeholder="请选择院系" style="width: 100%" @change="handleFacultyChange">
<el-option v-for="faculty in faculties" :key="faculty.schoolFacultyId" :label="faculty.schoolFacultyName" :value="faculty.schoolFacultyId" />
</el-select>
</el-form-item>
<el-form-item label="所属专业">
<el-select v-model="form.schoolMajorId" placeholder="请选择专业" style="width: 100%" :disabled="!form.schoolFacultyId" @change="handleMajorChange">
<el-option v-for="major in formMajors" :key="major.schoolMajorId" :label="major.schoolMajorName" :value="major.schoolMajorId" />
</el-select>
</el-form-item>
<el-form-item label="班级">
<el-select v-model="form.schoolClassId" placeholder="请选择班级" style="width: 100%">
<el-option v-for="klass in classes" :key="klass.schoolClassId" :label="klass.className" :value="klass.schoolClassId" />
<el-select v-model="form.schoolClassId" placeholder="请选择班级" style="width: 100%" :disabled="!form.schoolMajorId">
<el-option v-for="klass in formClasses" :key="klass.schoolClassId" :label="klass.className" :value="klass.schoolClassId" />
</el-select>
</el-form-item>
<el-form-item label="性别"><el-input v-model="form.sex" /></el-form-item>
@ -60,7 +70,7 @@
<script setup>
import "@/views/schoolAdmin/admin-theme.scss";
import { ElMessage, ElMessageBox } from "element-plus";
import { addAdminStudent, deleteAdminStudent, getAdminClasses, getAdminStudents, updateAdminStudent } from "@/api/schoolAdmin";
import { addAdminStudent, deleteAdminStudent, getAdminClasses, getAdminFaculties, getAdminMajors, getAdminStudents, updateAdminStudent } from "@/api/schoolAdmin";
const query = reactive({ index: 1, size: 10, name: "", username: "", schoolClassId: "" });
const rows = ref([]);
@ -68,9 +78,27 @@ const total = ref(0);
const loading = ref(false);
const dialogVisible = ref(false);
const form = ref({});
const faculties = ref([]);
const majors = ref([]);
const classes = ref([]);
const className = (id) => classes.value.find((klass) => klass.schoolClassId === id)?.className || "";
const classMajorId = (id) => classes.value.find((klass) => klass.schoolClassId === id)?.schoolMajorId || "";
const majorFacultyId = (id) => majors.value.find((major) => major.schoolMajorId === id)?.schoolFacultyId || "";
const formMajors = computed(() => majors.value.filter((major) => major.schoolFacultyId === form.value.schoolFacultyId));
const formClasses = computed(() => classes.value.filter((klass) => klass.schoolMajorId === form.value.schoolMajorId));
const loadFaculties = async () => {
const res = await getAdminFaculties({ index: 1, size: 1000 });
faculties.value = (res.data?.list || []).map((row) => row.schoolFaculty || row);
};
const loadMajors = async () => {
const res = await getAdminMajors({ index: 1, size: 1000 });
majors.value = (res.data?.list || []).map((row) => ({
...(row.schoolMajor || row),
schoolFacultyId: row.schoolFacultyId || row.schoolMajor?.schoolFacultyId,
schoolMajorId: row.schoolMajorId || row.schoolMajor?.schoolMajorId,
}));
};
const loadClasses = async () => {
const res = await getAdminClasses({ index: 1, size: 1000 });
classes.value = (res.data?.list || []).map((row) => row.schoolClass || row);
@ -93,13 +121,25 @@ const reset = () => {
load();
};
const openCreate = () => {
form.value = {};
form.value = { schoolFacultyId: "", schoolMajorId: "", schoolClassId: "" };
dialogVisible.value = true;
};
const openEdit = (row) => {
form.value = { ...row };
const schoolMajorId = row.schoolMajorId || classMajorId(row.schoolClassId);
form.value = {
...row,
schoolMajorId,
schoolFacultyId: row.schoolFacultyId || majorFacultyId(schoolMajorId),
};
dialogVisible.value = true;
};
const handleFacultyChange = () => {
form.value.schoolMajorId = "";
form.value.schoolClassId = "";
};
const handleMajorChange = () => {
form.value.schoolClassId = "";
};
const submit = async () => {
if (form.value.userId) {
await updateAdminStudent(form.value.userId, form.value);
@ -118,6 +158,8 @@ const remove = async (row) => {
};
onMounted(() => {
loadFaculties();
loadMajors();
loadClasses();
load();
});

@ -17,7 +17,9 @@
<el-table v-loading="loading" :data="rows" border>
<el-table-column label="姓名" prop="name" min-width="120" />
<el-table-column label="工号" prop="username" min-width="140" />
<el-table-column label="性别" prop="sex" width="90" />
<el-table-column label="性别" width="90">
<template #default="{ row }">{{ sexText(row.sex) }}</template>
</el-table-column>
<el-table-column label="手机" prop="phone" min-width="140" />
<el-table-column label="邮箱" prop="email" min-width="180" />
<el-table-column label="操作" width="160" fixed="right">
@ -30,11 +32,25 @@
<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="load" />
<el-dialog v-model="dialogVisible" :title="form.userId ? '编辑教师' : '新增教师'" width="520px">
<el-dialog v-model="dialogVisible" :title="form.userId ? '编辑教师' : '新增教师'" width="520px" align-center append-to-body custom-class="admin-edit-dialog">
<el-form :model="form" label-width="86px">
<el-form-item label="姓名"><el-input v-model="form.name" /></el-form-item>
<el-form-item label="工号"><el-input v-model="form.username" :disabled="Boolean(form.userId)" /></el-form-item>
<el-form-item label="性别"><el-input v-model="form.sex" /></el-form-item>
<el-form-item label="所属院系">
<el-select v-model="form.schoolFacultyId" placeholder="请选择院系" style="width: 100%" @change="handleFacultyChange">
<el-option v-for="faculty in faculties" :key="faculty.schoolFacultyId" :label="faculty.schoolFacultyName" :value="faculty.schoolFacultyId" />
</el-select>
</el-form-item>
<el-form-item label="所属专业">
<el-select v-model="form.schoolMajorId" placeholder="请选择专业" style="width: 100%" :disabled="!form.schoolFacultyId">
<el-option v-for="major in formMajors" :key="major.schoolMajorId" :label="major.schoolMajorName" :value="major.schoolMajorId" />
</el-select>
</el-form-item>
<el-form-item label="性别">
<el-select v-model="form.sex" placeholder="请选择性别" style="width: 100%">
<el-option v-for="option in sexOptions" :key="option.value" :label="option.label" :value="option.value" />
</el-select>
</el-form-item>
<el-form-item label="手机"><el-input v-model="form.phone" /></el-form-item>
<el-form-item label="邮箱"><el-input v-model="form.email" /></el-form-item>
</el-form>
@ -50,7 +66,7 @@
<script setup>
import "@/views/schoolAdmin/admin-theme.scss";
import { ElMessage, ElMessageBox } from "element-plus";
import { addAdminTeacher, deleteAdminTeacher, getAdminTeachers, updateAdminTeacher } from "@/api/schoolAdmin";
import { addAdminTeacher, deleteAdminTeacher, getAdminFaculties, getAdminMajors, getAdminTeachers, updateAdminTeacher } from "@/api/schoolAdmin";
const query = reactive({ index: 1, size: 10, name: "", username: "" });
const rows = ref([]);
@ -58,6 +74,34 @@ const total = ref(0);
const loading = ref(false);
const dialogVisible = ref(false);
const form = ref({});
const faculties = ref([]);
const majors = ref([]);
const sexOptions = [
{ label: "男", value: "男" },
{ label: "女", value: "女" },
];
const majorFacultyId = (id) => majors.value.find((major) => major.schoolMajorId === id)?.schoolFacultyId || "";
const formMajors = computed(() => majors.value.filter((major) => major.schoolFacultyId === form.value.schoolFacultyId));
const normalizeSex = (sex) => {
const value = String(sex ?? "").trim();
if (value === "1" || value === "男" || value === "男性") return "男";
if (value === "2" || value === "女" || value === "女性") return "女";
return "";
};
const sexText = (sex) => normalizeSex(sex) || "-";
const loadFaculties = async () => {
const res = await getAdminFaculties({ index: 1, size: 1000 });
faculties.value = (res.data?.list || []).map((row) => row.schoolFaculty || row);
};
const loadMajors = async () => {
const res = await getAdminMajors({ index: 1, size: 1000 });
majors.value = (res.data?.list || []).map((row) => ({
...(row.schoolMajor || row),
schoolFacultyId: row.schoolFacultyId || row.schoolMajor?.schoolFacultyId,
schoolMajorId: row.schoolMajorId || row.schoolMajor?.schoolMajorId,
}));
};
const load = async () => {
loading.value = true;
@ -76,13 +120,16 @@ const reset = () => {
load();
};
const openCreate = () => {
form.value = {};
form.value = { schoolFacultyId: "", schoolMajorId: "", sex: "" };
dialogVisible.value = true;
};
const openEdit = (row) => {
form.value = { ...row };
form.value = { ...row, schoolFacultyId: row.schoolFacultyId || majorFacultyId(row.schoolMajorId), sex: normalizeSex(row.sex) };
dialogVisible.value = true;
};
const handleFacultyChange = () => {
form.value.schoolMajorId = "";
};
const submit = async () => {
if (form.value.userId) {
await updateAdminTeacher(form.value.userId, form.value);
@ -100,5 +147,9 @@ const remove = async (row) => {
load();
};
onMounted(load);
onMounted(() => {
loadFaculties();
loadMajors();
load();
});
</script>

Loading…
Cancel
Save