mirror of
https://github.com/vbenjs/vue-vben-admin.git
synced 2025-08-26 16:46:19 +08:00
156 lines
4.0 KiB
TypeScript
156 lines
4.0 KiB
TypeScript
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';
|
|
|
|
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();
|
|
createConfirm({
|
|
iconType: 'warning',
|
|
title: '温馨提醒',
|
|
content: '是否确认退出系统?',
|
|
onOk: async () => {
|
|
await this.loginOut(true);
|
|
},
|
|
});
|
|
}
|
|
}
|
|
export const userStore = getModule<User>(User);
|