Files
Academic-Affairs-System/web/src/stores/auth.ts
T
biss bcc4d33bd5 多角色账号按 All > College > Class > Self 自动取最高权限。
学院管理员限制在所属学院。
辅导员通过稳定账号 ID 绑定行政班,避免重名串班。
教师只能访问本人档案、授课课程和所授课学生。
学生只能访问本人档案及所在班级课程。
教师/学生角色会自动校验并绑定工号或学号档案。
超级管理员可在用户页面调整角色、学院、工号/学号,并预览生效后的数据范围。
2026-07-24 14:54:30 +08:00

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 }
})