import { defineStore } from 'pinia';
|
import { store } from '@/store';
|
import { getToken, setToken, removeToken, removeUserInfo, setUserInfo, getUserInfo } from '@/utils';
|
import { resetRouter, router } from '@/router';
|
import { useTagsViewStoreHook } from './tagsView';
|
import * as accountServices from '@/services/api/Account';
|
import * as userServices from '@/services/api/User';
|
import { usePermissionStoreHook } from './permission';
|
import { getAccountInfoFromAccessToken, AccountInfo } from '@bole-core/core';
|
import { useClearSubModule } from '@/hooks';
|
import { myClient } from '@/constants/query';
|
|
export interface UserState {
|
token: string;
|
userInfo: API.IdentityModelTokenCacheItem;
|
accountInfo: Partial<AccountInfo>;
|
name: string;
|
}
|
|
function getDefaultState() {
|
const accessToken = getToken();
|
const userInfo = getUserInfo();
|
const accountInfo = getAccountInfoFromAccessToken(accessToken);
|
|
return {
|
token: accessToken,
|
name: accountInfo.name,
|
accountInfo: accountInfo || {},
|
userInfo: userInfo || {},
|
} as UserState;
|
}
|
|
export const useUserStore = defineStore({
|
id: 'user',
|
state: getDefaultState,
|
getters: {
|
accessToken(state) {
|
return state.token;
|
},
|
user(state) {
|
return state.userInfo;
|
},
|
|
userId(state) {
|
return state.accountInfo.sub;
|
},
|
},
|
actions: {
|
setToken(token: string) {
|
this.token = token;
|
setToken(token);
|
},
|
setName(name: string) {
|
this.name = name;
|
},
|
setUserInfo(userInfo: API.IdentityModelTokenCacheItem) {
|
this.userInfo = userInfo;
|
setUserInfo(userInfo);
|
},
|
setAccountInfo(accountInfo: Partial<AccountInfo>) {
|
this.accountInfo = accountInfo;
|
},
|
|
// 用户登入
|
loginByUsername(data: API.AccessRequestDto) {
|
return new Promise<void>((resolve, reject) => {
|
userServices
|
.passwordLogin(
|
{
|
loginName: data.userName,
|
password: data.userPassword,
|
},
|
{ showLoading: false }
|
)
|
.then((res) => {
|
if (res) {
|
console.log('res: ', res);
|
this.setToken(res.accessToken);
|
|
const accountInfo = getAccountInfoFromAccessToken(res.accessToken);
|
|
this.setName(accountInfo.name);
|
this.setAccountInfo(accountInfo);
|
|
// 获取用户信息
|
this.setUserInfo(res);
|
|
resolve();
|
}
|
})
|
.catch((error) => {
|
reject(error);
|
});
|
});
|
},
|
|
// 登出 清空缓存
|
logout(redirectPath = '/') {
|
return new Promise(async (resolve) => {
|
removeToken();
|
removeUserInfo();
|
this.resetState();
|
resetRouter();
|
myClient.removeQueries();
|
|
await router.push(`/login?redirect=${redirectPath}`);
|
|
const tagsViewStore = useTagsViewStoreHook();
|
tagsViewStore.delAllViews();
|
const { clearSubModule } = useClearSubModule();
|
clearSubModule();
|
|
const permissionStore = usePermissionStoreHook();
|
permissionStore.resetModuleList();
|
resolve(1);
|
});
|
},
|
|
resetToken() {
|
this.token = '';
|
removeToken();
|
this.resetState();
|
},
|
|
resetState() {
|
Object.assign(this, getDefaultState());
|
},
|
|
refreshToken(params: API.AccessRefreshToken) {
|
return new Promise<API.IdentityModelTokenCacheItem>(
|
// eslint-disable-next-line no-async-promise-executor
|
async (resolve, reject) => {
|
try {
|
const res = await accountServices.getTokenByRefreshToken(params, {
|
showLoading: false,
|
});
|
if (res) {
|
this.setToken(res.accessToken);
|
this.setUserInfo(res);
|
resolve(res);
|
return;
|
}
|
reject('出错了');
|
} catch (error) {
|
reject(error);
|
}
|
}
|
);
|
},
|
},
|
});
|
|
export function useUserStoreHook() {
|
return useUserStore(store);
|
}
|