import { computed, ref } from "vue"; import { Message } from "view-ui-plus"; import { useDefaultStore } from "@/store"; import { UserRoleEnum } from "@/types"; /** * 应用管理页学校上下文(管理端权限分级改造 §4.3)。
* SCHOOL 模式专属:多校管理员(schoolGroupIds.length > 1)页面顶部出现「学校」下拉, * currentSchoolId 随接口下发给 AppList/AppSortList/AppSort/EditApp/EditType/AppTypeSort, * 覆盖只对所选学校生效;单校管理员不显示下拉(后端自动取唯一学校), * 超管/局端不进入本上下文(局端无应用管理菜单)。 */ export function useAppSchoolScope() { const store = useDefaultStore(); const isSchoolMode = computed(() => store.userRole === UserRoleEnum.School); const schoolGroupIds = computed(() => store.userScope?.schoolGroupIds ?? []); const multiSchool = computed(() => isSchoolMode.value && schoolGroupIds.value.length > 1); const schoolList = ref<{ id: number; name: string }[]>([]); // 默认不选中(currentSchoolId=undefined):查询走后端「多校并集」模式; // 写操作(编辑/排序)要求先选定学校,由页面用 requireSchool() 守卫 const currentSchoolId = ref(undefined); /** 多校模式下写操作前置校验:未选学校时提示并阻断,返回 false */ function requireSchool(): boolean { if (multiSchool.value && !currentSchoolId.value) { Message.warning("您管理多所学校,请先在顶部选择学校后再操作"); return false; } return true; } if (multiSchool.value) { // 下拉数据源(SUPER/BUREAU 后端返回空数组,前端也不渲染下拉) Promise.resolve(Apis.AppSettings.schoolList({ cacheFor: null })) .then((list: any) => { schoolList.value = Array.isArray(list) ? list : []; }) .catch(e => console.warn("获取可管理学校列表失败", e)); } return { isSchoolMode, multiSchool, schoolList, currentSchoolId, requireSchool }; }