Files
SeeyonFileSystem/web/src/stores/user.ts

127 lines
3.1 KiB
TypeScript
Raw Normal View History

2026-07-03 15:58:29 +08:00
/**
*
* Token
*/
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { login as loginApi, getUserPermissions, type UserPermissionVO, type LoginParams } from '../api/auth'
import router from '../router'
export const useUserStore = defineStore('user', () => {
// 状态
const token = ref(localStorage.getItem('token') || '')
const username = ref(localStorage.getItem('username') || '')
const nickname = ref(localStorage.getItem('nickname') || '')
const role = ref(localStorage.getItem('role') || '')
// RBAC权限
const roles = ref<{ id: number; name: string; display_name: string }[]>([])
const permissions = ref<string[]>([])
/** 是否已登录 */
const isLoggedIn = () => !!token.value
/** 是否管理员(兼容旧逻辑) */
const isAdmin = () => role.value === 'admin' || roles.value.some(r => r.name === 'admin')
/**
*
*
*/
function hasPermission(code: string): boolean {
if (isAdmin()) return true
return permissions.value.includes(code) || permissions.value.includes('*')
}
/**
*
*/
async function login(params: LoginParams) {
const res = await loginApi(params)
const data = res.data
saveLoginResult(data)
// 首次登录需改密码
if ((data as any).must_change_pwd) {
router.push('/?change_pwd=1')
} else {
router.push('/')
}
}
/**
* SSO登录(Token)
*/
function ssoLogin(data: { token: string; username: string; nickname: string; role: string }) {
saveLoginResult(data)
router.push('/')
}
/**
*
*/
function saveLoginResult(data: { token: string; username: string; nickname: string; role: string }) {
token.value = data.token
username.value = data.username
nickname.value = data.nickname
role.value = data.role
localStorage.setItem('token', data.token)
localStorage.setItem('username', data.username)
localStorage.setItem('nickname', data.nickname)
localStorage.setItem('role', data.role)
// 登录后加载权限
loadPermissions()
}
/**
*
*/
async function loadPermissions() {
if (!token.value) return
try {
const res = await getUserPermissions()
const data: UserPermissionVO = res.data
roles.value = data.roles || []
permissions.value = data.permissions || []
} catch (error) {
console.error('加载权限失败:', error)
}
}
/**
*
*/
function logout() {
token.value = ''
username.value = ''
nickname.value = ''
role.value = ''
roles.value = []
permissions.value = []
localStorage.removeItem('token')
localStorage.removeItem('username')
localStorage.removeItem('nickname')
localStorage.removeItem('role')
router.push('/login')
}
return {
token,
username,
nickname,
role,
roles,
permissions,
isLoggedIn,
isAdmin,
hasPermission,
login,
ssoLogin,
loadPermissions,
logout,
}
})