113 lines
3.2 KiB
TypeScript
113 lines
3.2 KiB
TypeScript
// Author: fruit.com.cn
|
|
|
|
import { defineStore } from 'pinia'
|
|
import { store } from '../index'
|
|
import { UserLoginType, UserType } from '@/api/login/types'
|
|
import { ElMessageBox } from 'element-plus'
|
|
import { useI18n } from '@/hooks/web/useI18n'
|
|
import { loginOutApi } from '@/api/login'
|
|
import { useTagsViewStore } from './tagsView'
|
|
import { usePermissionStore } from './permission'
|
|
import router from '@/router'
|
|
|
|
interface UserState {
|
|
userInfo?: UserType
|
|
tokenKey: string
|
|
token: string
|
|
roleRouters?: string[] | AppCustomRouteRecordRaw[]
|
|
rememberMe: boolean
|
|
loginInfo?: UserLoginType
|
|
}
|
|
|
|
export const useUserStore = defineStore('user', {
|
|
state: (): UserState => {
|
|
return {
|
|
userInfo: undefined,
|
|
tokenKey: 'Authorization',
|
|
token: '',
|
|
roleRouters: undefined,
|
|
// 记住我
|
|
rememberMe: false,
|
|
loginInfo: undefined
|
|
}
|
|
},
|
|
getters: {
|
|
getTokenKey(): string {
|
|
return this.tokenKey
|
|
},
|
|
getToken(): string {
|
|
return this.token
|
|
},
|
|
getUserInfo(): UserType | undefined {
|
|
return this.userInfo
|
|
},
|
|
getRoleRouters(): string[] | AppCustomRouteRecordRaw[] | undefined {
|
|
return this.roleRouters
|
|
},
|
|
getRememberMe(): boolean {
|
|
return this.rememberMe
|
|
},
|
|
getLoginInfo(): UserLoginType | undefined {
|
|
return this.loginInfo
|
|
}
|
|
},
|
|
actions: {
|
|
setTokenKey(tokenKey: string) {
|
|
this.tokenKey = tokenKey
|
|
},
|
|
setToken(token: string) {
|
|
this.token = token
|
|
},
|
|
setUserInfo(userInfo?: UserType) {
|
|
this.userInfo = userInfo
|
|
},
|
|
setRoleRouters(roleRouters: string[] | AppCustomRouteRecordRaw[]) {
|
|
this.roleRouters = roleRouters
|
|
},
|
|
logoutConfirm() {
|
|
const { t } = useI18n()
|
|
ElMessageBox.confirm(t('common.loginOutMessage'), t('common.reminder'), {
|
|
confirmButtonText: t('common.ok'),
|
|
cancelButtonText: t('common.cancel'),
|
|
type: 'warning'
|
|
})
|
|
.then(async () => {
|
|
const res = await loginOutApi().catch(() => {})
|
|
if (res) {
|
|
this.reset()
|
|
}
|
|
})
|
|
.catch(() => {})
|
|
},
|
|
reset() {
|
|
const tagsViewStore = useTagsViewStore()
|
|
const permissionStore = usePermissionStore()
|
|
// 顺序要紧:delAllVisitedViews() 会「保留 affix 标签」,而它判断的正是 userInfo 是否还在。
|
|
// 先清账号信息再清标签,否则写死路由表里 affix 的「工作台」会在切换账号后残留。
|
|
this.setToken('')
|
|
this.setUserInfo(undefined)
|
|
this.setRoleRouters([])
|
|
// 注意:不能清 loginInfo / rememberMe —— 那是「记住我」存的账号密码,
|
|
// 退出登录后回到登录页还要靠它来回填,清了就等于「记住我」没生效。
|
|
tagsViewStore.delAllViews()
|
|
// 菜单/路由一起清:否则换账号后 permissionStore 里还是上一个账号的路由表
|
|
permissionStore.clearRoutes()
|
|
router.replace('/login')
|
|
},
|
|
logout() {
|
|
this.reset()
|
|
},
|
|
setRememberMe(rememberMe: boolean) {
|
|
this.rememberMe = rememberMe
|
|
},
|
|
setLoginInfo(loginInfo: UserLoginType | undefined) {
|
|
this.loginInfo = loginInfo
|
|
}
|
|
},
|
|
persist: true
|
|
})
|
|
|
|
export const useUserStoreWithOut = () => {
|
|
return useUserStore(store)
|
|
}
|