diff --git a/src/api/schoolProductConfig.js b/src/api/schoolProductConfig.js new file mode 100644 index 0000000..7f4839a --- /dev/null +++ b/src/api/schoolProductConfig.js @@ -0,0 +1,23 @@ +import request from "@/utils/request"; + +export function getCurrentSchoolProductConfig() { + return request({ + url: "/api/school-product-config/current", + method: "get", + }); +} + +export function getPlatformSchoolProductConfig(schoolId) { + return request({ + url: `/api/platform-admin/schools/${schoolId}/product-config`, + method: "get", + }); +} + +export function updatePlatformSchoolProductConfig(schoolId, data) { + return request({ + url: `/api/platform-admin/schools/${schoolId}/product-config`, + method: "put", + data, + }); +} diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue index 0a883c7..521e810 100644 --- a/src/layout/components/Sidebar/index.vue +++ b/src/layout/components/Sidebar/index.vue @@ -565,7 +565,7 @@ const getTaskList = () => { if (userStore.userInfo.roleId == 1) { sidebarRouters.value = [...constantRoutes, ...platformAdminRoutes]; } else if (userStore.userInfo.roleId == 2) { - sidebarRouters.value = [...constantRoutes, ...schoolAdminRoutes]; + sidebarRouters.value = [...constantRoutes, ...filterRoutesByOrganizationMode(schoolAdminRoutes)]; } else if (userStore.userInfo.roleId != 3) { indexApi.getStudentTaskList({ userId: userStore.userInfo.userId }).then((res) => { const disabledTitles = processModuleStatus(groupAndSortModules(res.data)).disabledParents; @@ -577,7 +577,14 @@ const getTaskList = () => { } else { sidebarRouters.value = [...constantRoutes, ...teacherRoutes]; } -}; +}; + +function filterRoutesByOrganizationMode(routes) { + if (userStore.schoolProductConfig?.organizationMode !== "TEACHING_CLASS_ONLY") { + return routes; + } + return routes.filter((route) => !route.meta?.requiresAdminClass); +} onMounted(() => { getTaskList(); loadTrainingTaskTitles(); diff --git a/src/permission.js b/src/permission.js index f071250..10f0981 100644 --- a/src/permission.js +++ b/src/permission.js @@ -38,9 +38,19 @@ router.beforeEach((to, from, next) => { NProgress.done(); } } else { - usePermissionStore() - .getRoutersPermission() - .then((accessRoutes) => { + const userStore = useUserStore(); + userStore + .ensureSchoolProductConfig() + .then((config) => { + if (config?.organizationMode === "TEACHING_CLASS_ONLY" && to.matched.some((record) => record.meta?.requiresAdminClass)) { + next({ path: "/admin-school/index" }); + NProgress.done(); + return null; + } + return usePermissionStore().getRoutersPermission(); + }) + .then((accessRoutes) => { + if (accessRoutes === null) return; next(); // hack方法 确保addRoutes已完成 }); } diff --git a/src/router/index.js b/src/router/index.js index 35f4e1d..c06a44f 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -653,7 +653,7 @@ export const schoolAdminRoutes = [ component: Layout, redirect: "/admin-faculty/index", roles: ["schoolAdmin"], - meta: { title: "院系管理", icon: "院系管理", affix: true }, + meta: { title: "院系管理", icon: "院系管理", affix: true, requiresAdminClass: true }, children: [ { path: "index", @@ -668,7 +668,7 @@ export const schoolAdminRoutes = [ component: Layout, redirect: "/admin-major/index", roles: ["schoolAdmin"], - meta: { title: "专业管理", icon: "专业管理", affix: true }, + meta: { title: "专业管理", icon: "专业管理", affix: true, requiresAdminClass: true }, children: [ { path: "index", @@ -683,7 +683,7 @@ export const schoolAdminRoutes = [ component: Layout, redirect: "/admin-class/index", roles: ["schoolAdmin"], - meta: { title: "班级管理", icon: "班级管理", affix: true }, + meta: { title: "班级管理", icon: "班级管理", affix: true, requiresAdminClass: true }, children: [ { path: "index", @@ -713,7 +713,7 @@ export const schoolAdminRoutes = [ component: Layout, redirect: "/admin-student/index", roles: ["schoolAdmin"], - meta: { title: "学生管理", icon: "学生管理", affix: true }, + meta: { title: "学生管理", icon: "学生管理", affix: true, requiresAdminClass: true }, children: [ { path: "index", diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 020ed57..ebf5aff 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -6,7 +6,8 @@ * @FilePath: \vue3\src\store\modules\user.js * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ -import { login, logout, getInfo } from "@/api/login"; +import { login, logout, getInfo } from "@/api/login"; +import { getCurrentSchoolProductConfig } from "@/api/schoolProductConfig"; import { getToken, setToken, removeToken, setUserInfo, removeUserInfo, getUserInfo } from "@/utils/auth"; import defAva from "@/assets/images/profile.jpg"; const useUserStore = defineStore("user", { @@ -16,8 +17,9 @@ const useUserStore = defineStore("user", { avatar: "", roles: ["teacher"], permissions: [], - userInfo: JSON.parse(getUserInfo() ?? "{}"), - classList: [], + userInfo: JSON.parse(getUserInfo() ?? "{}"), + classList: [], + schoolProductConfig: null, }), actions: { // 登录 @@ -40,7 +42,7 @@ const useUserStore = defineStore("user", { }); }, // 获取用户信息 - getInfo() { + getInfo() { return new Promise((resolve, reject) => { getInfo() .then((res) => { @@ -61,14 +63,27 @@ const useUserStore = defineStore("user", { reject(error); }); }); - }, + }, + ensureSchoolProductConfig() { + if (this.schoolProductConfig) { + return Promise.resolve(this.schoolProductConfig); + } + if (!this.userInfo?.schoolId || this.userInfo?.roleId == 1) { + return Promise.resolve(null); + } + return getCurrentSchoolProductConfig().then((res) => { + this.schoolProductConfig = res.data; + return this.schoolProductConfig; + }); + }, // 退出系统 logOut() { return new Promise((resolve, reject) => { // logout(this.token).then(() => { this.token = ""; this.roles = []; - this.permissions = []; + this.permissions = []; + this.schoolProductConfig = null; removeToken(); removeUserInfo(); resolve(); diff --git a/src/views/platformAdmin/school/index.vue b/src/views/platformAdmin/school/index.vue index baf9bd6..2cd90a6 100644 --- a/src/views/platformAdmin/school/index.vue +++ b/src/views/platformAdmin/school/index.vue @@ -77,6 +77,13 @@ + + + + + +
新建学校默认采用标准模式;已有行政组织数据的学校不能直接切换模式。
+