90 lines
2.2 KiB
TypeScript
90 lines
2.2 KiB
TypeScript
![]() |
import store from '@/store'
|
||
|
import { defineStore } from 'pinia'
|
||
|
import { usePermissionStore } from './permission'
|
||
|
import { getToken, removeToken, setToken } from '@/utils/cookies'
|
||
|
import router, { resetRouter } from '@/router'
|
||
|
import { accountLogin, userInfoRequest } from '@/api/login'
|
||
|
import { RouteRecordRaw } from 'vue-router'
|
||
|
|
||
|
interface IUserState {
|
||
|
token: string
|
||
|
roles: string[]
|
||
|
}
|
||
|
|
||
|
export const useUserStore = defineStore({
|
||
|
id: 'user',
|
||
|
state: (): IUserState => {
|
||
|
return {
|
||
|
token: getToken() || '',
|
||
|
roles: []
|
||
|
}
|
||
|
},
|
||
|
actions: {
|
||
|
/** 设置角色数组 */
|
||
|
setRoles(roles: string[]) {
|
||
|
this.roles = roles
|
||
|
},
|
||
|
/** 登录 */
|
||
|
login(userInfo: { username: string, password: string }) {
|
||
|
return new Promise((resolve, reject) => {
|
||
|
accountLogin({
|
||
|
username: userInfo.username.trim(),
|
||
|
password: userInfo.password
|
||
|
})
|
||
|
.then((res: any) => {
|
||
|
setToken(res.data.accessToken)
|
||
|
this.token = res.data.accessToken
|
||
|
resolve(true)
|
||
|
})
|
||
|
.catch((error) => {
|
||
|
reject(error)
|
||
|
})
|
||
|
})
|
||
|
},
|
||
|
/** 获取用户详情 */
|
||
|
getInfo() {
|
||
|
return new Promise((resolve, reject) => {
|
||
|
userInfoRequest()
|
||
|
.then((res: any) => {
|
||
|
this.roles = res.data.user.roles
|
||
|
resolve(res)
|
||
|
})
|
||
|
.catch((error) => {
|
||
|
reject(error)
|
||
|
})
|
||
|
})
|
||
|
},
|
||
|
/** 切换角色 */
|
||
|
async changeRoles(role: string) {
|
||
|
const token = role + '-token'
|
||
|
this.token = token
|
||
|
setToken(token)
|
||
|
await this.getInfo()
|
||
|
const permissionStore = usePermissionStore()
|
||
|
permissionStore.setRoutes(this.roles)
|
||
|
resetRouter()
|
||
|
permissionStore.dynamicRoutes.forEach((item: RouteRecordRaw) => {
|
||
|
router.addRoute(item)
|
||
|
})
|
||
|
},
|
||
|
/** 登出 */
|
||
|
logout() {
|
||
|
removeToken()
|
||
|
this.token = ''
|
||
|
this.roles = []
|
||
|
resetRouter()
|
||
|
},
|
||
|
/** 重置 token */
|
||
|
resetToken() {
|
||
|
removeToken()
|
||
|
this.token = ''
|
||
|
this.roles = []
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
|
||
|
/** 在 setup 外使用 */
|
||
|
export function useUserStoreHook() {
|
||
|
return useUserStore(store)
|
||
|
}
|