超管开启后所有角色 getter 降级为普通学生,全站权限判断自动跟随。 realIsSuperAdmin 保留真实身份,用于判断能否切换。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
95 lines
2.8 KiB
TypeScript
95 lines
2.8 KiB
TypeScript
import { PROBLEM_PERMISSION, STORAGE_KEY, USER_TYPE } from "utils/constants"
|
|
import storage from "utils/storage"
|
|
import type { Profile, User } from "utils/types"
|
|
import { getProfile } from "../api"
|
|
import { useConfigStore } from "./config"
|
|
|
|
export const useUserStore = defineStore("user", () => {
|
|
const configStore = useConfigStore()
|
|
|
|
const profile = ref<Profile | null>(null)
|
|
const [isFinished] = useToggle(false)
|
|
const user = computed<User | null>(() => profile.value?.user ?? null)
|
|
const isAuthed = computed(() => !!user.value?.email)
|
|
|
|
// 演示模式:超管临时把界面伪装成普通学生,方便上课投屏
|
|
const demoMode = ref<boolean>(storage.get(STORAGE_KEY.DEMO_MODE) ?? false)
|
|
|
|
// 不受伪装影响的真实身份,只用于判断能否切换演示模式。
|
|
// 若这里用被伪装后的 isSuperAdmin,一进入演示模式入口就消失了,退不出来。
|
|
const realIsSuperAdmin = computed(
|
|
() => user.value?.admin_type === USER_TYPE.SUPER_ADMIN,
|
|
)
|
|
|
|
const isAdminRole = computed(
|
|
() =>
|
|
!demoMode.value &&
|
|
(user.value?.admin_type === USER_TYPE.STUDENT_ADMIN ||
|
|
user.value?.admin_type === USER_TYPE.TEACHER_ADMIN ||
|
|
user.value?.admin_type === USER_TYPE.SUPER_ADMIN),
|
|
)
|
|
const isStudentAdmin = computed(
|
|
() => !demoMode.value && user.value?.admin_type === USER_TYPE.STUDENT_ADMIN,
|
|
)
|
|
const isTeacherAdmin = computed(
|
|
() => !demoMode.value && user.value?.admin_type === USER_TYPE.TEACHER_ADMIN,
|
|
)
|
|
const isTeacherOrAbove = computed(
|
|
() =>
|
|
!demoMode.value &&
|
|
(user.value?.admin_type === USER_TYPE.TEACHER_ADMIN ||
|
|
user.value?.admin_type === USER_TYPE.SUPER_ADMIN),
|
|
)
|
|
const isSuperAdmin = computed(() => !demoMode.value && realIsSuperAdmin.value)
|
|
const hasProblemPermission = computed(
|
|
() =>
|
|
!demoMode.value &&
|
|
user.value?.problem_permission !== PROBLEM_PERMISSION.NONE,
|
|
)
|
|
|
|
const canToggleDemoMode = computed(() => realIsSuperAdmin.value)
|
|
|
|
function toggleDemoMode() {
|
|
demoMode.value = !demoMode.value
|
|
storage.set(STORAGE_KEY.DEMO_MODE, demoMode.value)
|
|
}
|
|
|
|
const showSubmissions = computed(() => {
|
|
let flag = configStore.config.submission_list_show_all
|
|
if (isAdminRole.value) flag = true
|
|
return flag
|
|
})
|
|
|
|
async function getMyProfile() {
|
|
isFinished.value = false
|
|
const res = await getProfile()
|
|
profile.value = res.data
|
|
isFinished.value = true
|
|
storage.set(STORAGE_KEY.AUTHED, !!user.value?.email)
|
|
}
|
|
|
|
function clearProfile() {
|
|
profile.value = null
|
|
demoMode.value = false
|
|
storage.clear()
|
|
}
|
|
return {
|
|
profile,
|
|
isFinished,
|
|
user,
|
|
isAdminRole,
|
|
isStudentAdmin,
|
|
isTeacherAdmin,
|
|
isTeacherOrAbove,
|
|
isSuperAdmin,
|
|
hasProblemPermission,
|
|
demoMode,
|
|
canToggleDemoMode,
|
|
toggleDemoMode,
|
|
isAuthed,
|
|
showSubmissions,
|
|
getMyProfile,
|
|
clearProfile,
|
|
}
|
|
})
|