import { appStore } from './app';
|
import type {
|
LoginParams,
|
GetUserInfoByUserIdModel,
|
GetUserInfoByUserIdParams,
|
} from '/@/api/sys/model/userModel';
|
|
import store from '/@/store/index';
|
import { VuexModule, Module, getModule, Mutation, Action } from 'vuex-module-decorators';
|
import { hotModuleUnregisterModule } from '/@/utils/helper/vuexHelper';
|
|
import { PageEnum } from '/@/enums/pageEnum';
|
import { RoleEnum } from '/@/enums/roleEnum';
|
import { CacheTypeEnum, ROLES_KEY, TOKEN_KEY, USER_INFO_KEY } from '/@/enums/cacheEnum';
|
|
import { useMessage } from '/@/hooks/web/useMessage';
|
|
import router from '/@/router';
|
|
import { loginApi, getUserInfoById } from '/@/api/sys/user';
|
|
import { setLocal, getLocal, getSession, setSession } from '/@/utils/helper/persistent';
|
import { useProjectSetting } from '/@/hooks/setting';
|
import { useI18n } from '/@/hooks/web/useI18n';
|
|
export type UserInfo = Omit<GetUserInfoByUserIdModel, 'roles'>;
|
|
const NAME = 'user';
|
hotModuleUnregisterModule(NAME);
|
|
const { permissionCacheType } = useProjectSetting();
|
|
function getCache<T>(key: string) {
|
const fn = permissionCacheType === CacheTypeEnum.LOCAL ? getLocal : getSession;
|
return fn(key) as T;
|
}
|
|
function setCache(USER_INFO_KEY: string, info: any) {
|
if (!info) return;
|
// const fn = permissionCacheType === CacheTypeEnum.LOCAL ? setLocal : setSession;
|
setLocal(USER_INFO_KEY, info, true);
|
// TODO
|
setSession(USER_INFO_KEY, info, true);
|
}
|
|
@Module({ namespaced: true, name: NAME, dynamic: true, store })
|
class User extends VuexModule {
|
// user info
|
private userInfoState: UserInfo | null = null;
|
|
// token
|
private tokenState = '';
|
|
// roleList
|
private roleListState: RoleEnum[] = [];
|
|
get getUserInfoState(): UserInfo {
|
return this.userInfoState || getCache<UserInfo>(USER_INFO_KEY) || {};
|
}
|
|
get getTokenState(): string {
|
return this.tokenState || getCache<string>(TOKEN_KEY);
|
}
|
|
get getRoleListState(): RoleEnum[] {
|
return this.roleListState.length > 0 ? this.roleListState : getCache<RoleEnum[]>(ROLES_KEY);
|
}
|
|
@Mutation
|
commitResetState(): void {
|
this.userInfoState = null;
|
this.tokenState = '';
|
this.roleListState = [];
|
}
|
|
@Mutation
|
commitUserInfoState(info: UserInfo): void {
|
this.userInfoState = info;
|
setCache(USER_INFO_KEY, info);
|
}
|
|
@Mutation
|
commitRoleListState(roleList: RoleEnum[]): void {
|
this.roleListState = roleList;
|
setCache(ROLES_KEY, roleList);
|
}
|
|
@Mutation
|
commitTokenState(info: string): void {
|
this.tokenState = info;
|
setCache(TOKEN_KEY, info);
|
}
|
|
/**
|
* @description: login
|
*/
|
@Action
|
async login(params: LoginParams, goHome = true): Promise<GetUserInfoByUserIdModel | null> {
|
try {
|
const data = await loginApi(params);
|
const { token, userId } = data;
|
// get user info
|
const userInfo = await this.getUserInfoAction({ userId });
|
|
// save token
|
this.commitTokenState(token);
|
|
// const name = FULL_PAGE_NOT_FOUND_ROUTE.name;
|
// name && router.removeRoute(name);
|
goHome &&
|
(await router.push(PageEnum.BASE_HOME).then(() => {
|
setTimeout(() => {
|
appStore.commitPageLoadingState(false);
|
}, 30);
|
}));
|
return userInfo;
|
} catch (error) {
|
return null;
|
}
|
}
|
|
@Action
|
async getUserInfoAction({ userId }: GetUserInfoByUserIdParams) {
|
const userInfo = await getUserInfoById({ userId });
|
const { role } = userInfo;
|
const roleList = [role.value] as RoleEnum[];
|
this.commitUserInfoState(userInfo);
|
this.commitRoleListState(roleList);
|
return userInfo;
|
}
|
|
/**
|
* @description: login out
|
*/
|
@Action
|
async loginOut(goLogin = false) {
|
goLogin && router.push(PageEnum.BASE_LOGIN);
|
}
|
|
/**
|
* @description: Confirm before logging out
|
*/
|
@Action
|
async confirmLoginOut() {
|
const { createConfirm } = useMessage();
|
const { t } = useI18n('sys.app');
|
createConfirm({
|
iconType: 'warning',
|
title: t('loginOutTip'),
|
content: t('loginOutMessage'),
|
onOk: async () => {
|
await this.loginOut(true);
|
},
|
});
|
}
|
}
|
export const userStore = getModule<User>(User);
|