dma_handbook/docs/.vuepress/store/modules/user.js

44 lines
1.7 KiB
JavaScript

import { defineStore } from 'pinia'
export const useUserStore = defineStore('user', {
state: () => ({
token: localStorage.getItem('rt_token') || '',
userInfo: JSON.parse(localStorage.getItem('userInfo') || '{}'),
roles: 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;
localStorage.setItem('userInfo', JSON.stringify(userInfo)); // 持久化到本地
},
// 确保该方法存在:设置权限角色
setRoles(roleList) {
this.roles = roleList;
localStorage.setItem('roles', JSON.stringify(roleList)); // 持久化到本地
},
// 新增:更新用户信息拉取标记
setUserInfoFetched(status) {
this.isUserInfoFetched = status;
},
resetStore() { // 必须有:退出登录清除状态
this.token = ''
this.userInfo = {}
this.roles = []
localStorage.removeItem('rt_token')
localStorage.removeItem('userInfo')
localStorage.removeItem('roles')
},
setToken(token) {
this.token = token
localStorage.setItem('rt_token', token)
},
// 其他setUserInfo/setRoles方法...
},
})