学院管理员限制在所属学院。 辅导员通过稳定账号 ID 绑定行政班,避免重名串班。 教师只能访问本人档案、授课课程和所授课学生。 学生只能访问本人档案及所在班级课程。 教师/学生角色会自动校验并绑定工号或学号档案。 超级管理员可在用户页面调整角色、学院、工号/学号,并预览生效后的数据范围。
45 lines
1.4 KiB
TypeScript
45 lines
1.4 KiB
TypeScript
import { computed, ref } from 'vue'
|
|
import { defineStore } from 'pinia'
|
|
import http from '../api/http'
|
|
|
|
export interface CurrentUser {
|
|
id: string
|
|
userName: string
|
|
displayName: string
|
|
roles: string[]
|
|
collegeId?: string
|
|
effectiveDataScope: 'Self' | 'Class' | 'College' | 'All'
|
|
}
|
|
|
|
export const useAuthStore = defineStore('auth', () => {
|
|
const token = ref(localStorage.getItem('jiaowu_token') ?? '')
|
|
const saved = localStorage.getItem('jiaowu_user')
|
|
const user = ref<CurrentUser | null>(saved ? JSON.parse(saved) : null)
|
|
const isLoggedIn = computed(() => Boolean(token.value))
|
|
const isSuperAdmin = computed(() => user.value?.roles.includes('SuperAdmin') ?? false)
|
|
|
|
async function login(userName: string, password: string) {
|
|
const { data } = await http.post('/auth/login', { userName, password })
|
|
token.value = data.token
|
|
user.value = data.user
|
|
localStorage.setItem('jiaowu_token', data.token)
|
|
localStorage.setItem('jiaowu_user', JSON.stringify(data.user))
|
|
}
|
|
|
|
async function refresh() {
|
|
if (!token.value) return
|
|
const { data } = await http.get('/auth/me')
|
|
user.value = data
|
|
localStorage.setItem('jiaowu_user', JSON.stringify(data))
|
|
}
|
|
|
|
function logout() {
|
|
token.value = ''
|
|
user.value = null
|
|
localStorage.removeItem('jiaowu_token')
|
|
localStorage.removeItem('jiaowu_user')
|
|
}
|
|
|
|
return { token, user, isLoggedIn, isSuperAdmin, login, refresh, logout }
|
|
})
|