52 lines
2.0 KiB
JavaScript
52 lines
2.0 KiB
JavaScript
import { defineStore } from 'pinia'
|
|
export const useUserStore = defineStore('user', {
|
|
state: () => ({
|
|
token: typeof window !== 'undefined' ? localStorage.getItem('rt_token') || '' :'',
|
|
userInfo: typeof window !== 'undefined' ? JSON.parse(localStorage.getItem('userInfo') || '{}') : {},
|
|
roles: typeof window !== 'undefined' ? JSON.parse(localStorage.getItem('roles') || '[]') : [],
|
|
// 新增:会话级标记(是否已拉取过用户信息,不持久化,刷新自动重置)
|
|
isUserInfoFetched: false
|
|
}),
|
|
getters: {
|
|
isLogin: (state) => !!state.token, // 必须有
|
|
hasRole: (state) => (role) => state.roles.includes(role), // 必须有
|
|
},
|
|
actions: {
|
|
// 确保该方法存在:设置用户信息
|
|
setUserInfo(userInfo) {
|
|
this.userInfo = userInfo;
|
|
if (typeof window !== 'undefined') {
|
|
localStorage.setItem('userInfo', JSON.stringify(userInfo)); // 持久化到本地
|
|
}
|
|
},
|
|
// 确保该方法存在:设置权限角色
|
|
setRoles(roleList) {
|
|
this.roles = roleList;
|
|
if (typeof window !== 'undefined') {
|
|
localStorage.setItem('roles', JSON.stringify(roleList)); // 持久化到本地
|
|
}
|
|
},
|
|
// 新增:更新用户信息拉取标记
|
|
setUserInfoFetched(status) {
|
|
this.isUserInfoFetched = status;
|
|
},
|
|
resetStore() { // 必须有:退出登录清除状态
|
|
this.token = ''
|
|
this.userInfo = {}
|
|
this.roles = []
|
|
if (typeof window !== 'undefined') {
|
|
localStorage.removeItem('rt_token')
|
|
localStorage.removeItem('userInfo')
|
|
localStorage.removeItem('roles')
|
|
}
|
|
},
|
|
setToken(token) {
|
|
this.token = token
|
|
if (typeof window !== 'undefined') {
|
|
localStorage.setItem('rt_token', token)
|
|
}
|
|
},
|
|
// 其他setUserInfo/setRoles方法...
|
|
},
|
|
})
|