123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426 |
- import type { UserInfo, LoginInfo } from '/#/store';
- import type { ErrorMessageMode } from '/#/axios';
- import { defineStore } from 'pinia';
- import { store } from '/@/store';
- import { PageEnum } from '/@/enums/pageEnum';
- import { ROLES_KEY, TOKEN_KEY, USER_INFO_KEY, LOGIN_INFO_KEY, DB_DICT_DATA_KEY, TENANT_ID, PWD_KEY } from '/@/enums/cacheEnum';
- import { getAuthCache, setAuthCache } from '/@/utils/auth';
- import { AutoLoginParams, GetUserInfoModel, LoginParams, ThirdLoginParams } from '/@/api/sys/model/userModel';
- import { autoLoginApi, doLogout, getUserInfo, loginApi, phoneLoginApi, thirdLogin } from '/@/api/sys/user';
- import { useI18n } from '/@/hooks/web/useI18n';
- import { useMessage } from '/@/hooks/web/useMessage';
- import { router } from '/@/router';
- import { usePermissionStore } from '/@/store/modules/permission';
- import { RouteRecordRaw } from 'vue-router';
- import { PAGE_NOT_FOUND_ROUTE, QIANKUN_ROUTE } from '/@/router/routes/basic';
- import { isArray } from '/@/utils/is';
- import { useGlobSetting } from '/@/hooks/setting';
- import { JDragConfigEnum } from '/@/enums/jeecgEnum';
- import { RoleEnum } from '/@/enums/roleEnum';
- import { useSso } from '/@/hooks/web/useSso';
- import { getActions } from '/@/qiankun/state';
- import { MOCK_LOGIN_PASSWORD, MOCK_LOGIN_UESRNAME } from '../constant';
- interface UserState {
- userInfo: Nullable<UserInfo>;
- token?: string;
- roleList: RoleEnum[];
- dictItems?: [];
- sessionTimeout?: boolean;
- lastUpdateTime: number;
- tenantid?: string | number;
- shareTenantId?: Nullable<string | number>;
- loginInfo?: Nullable<LoginInfo>;
- }
- export const useUserStore = defineStore({
- id: 'app-user',
- state: (): UserState => ({
- // 用户信息
- userInfo: null,
- // token
- token: undefined,
- // 角色列表
- roleList: [],
- // 字典
- dictItems: [],
- // session过期时间
- sessionTimeout: false,
- // Last fetch time
- lastUpdateTime: 0,
- //租户id
- tenantid: '',
- // 分享租户ID
- // 用于分享页面所属租户与当前用户登录租户不一致的情况
- shareTenantId: null,
- //登录返回信息
- loginInfo: null,
- }),
- getters: {
- getUserInfo(): UserInfo {
- return this.userInfo || getAuthCache<UserInfo>(USER_INFO_KEY) || {};
- },
- getLoginInfo(): LoginInfo {
- return this.loginInfo || getAuthCache<LoginInfo>(LOGIN_INFO_KEY) || {};
- },
- getToken(): string {
- return this.token || getAuthCache<string>(TOKEN_KEY);
- },
- getAllDictItems(): [] {
- return this.dictItems || getAuthCache(DB_DICT_DATA_KEY);
- },
- getRoleList(): RoleEnum[] {
- return this.roleList.length > 0 ? this.roleList : getAuthCache<RoleEnum[]>(ROLES_KEY);
- },
- getSessionTimeout(): boolean {
- return !!this.sessionTimeout;
- },
- getLastUpdateTime(): number {
- return this.lastUpdateTime;
- },
- getTenant(): string | number {
- return this.tenantid || getAuthCache<string | number>(TENANT_ID);
- },
- // 是否有分享租户id
- hasShareTenantId(): boolean {
- return this.shareTenantId != null && this.shareTenantId !== '';
- },
- // 目前用户角色列表为空数组,所以使用既定的用户名判断
- getIsMockLogin() {
- console.log(this.getUserInfo.username === MOCK_LOGIN_UESRNAME);
- return this.getUserInfo.username === MOCK_LOGIN_UESRNAME;
- },
- },
- actions: {
- /** 设置用户密码并加密,理论上加密、解密的工作应仅在此模块进行 */
- setPassword(password: string) {
- // setAuthCache(PWD_KEY, AES.encrypt(password, PWD_KEY));
- setAuthCache(PWD_KEY, btoa(password));
- },
- setToken(info: string | undefined) {
- this.token = info ? info : ''; // for null or undefined value
- setAuthCache(TOKEN_KEY, info);
- },
- setRoleList(roleList: RoleEnum[]) {
- this.roleList = roleList;
- setAuthCache(ROLES_KEY, roleList);
- },
- setUserInfo(info: UserInfo | null) {
- this.userInfo = info;
- this.lastUpdateTime = new Date().getTime();
- setAuthCache(USER_INFO_KEY, info);
- },
- setLoginInfo(info: LoginInfo | null) {
- this.loginInfo = info;
- setAuthCache(LOGIN_INFO_KEY, info);
- },
- setAllDictItems(dictItems) {
- this.dictItems = dictItems;
- setAuthCache(DB_DICT_DATA_KEY, dictItems);
- },
- setTenant(id) {
- this.tenantid = id;
- setAuthCache(TENANT_ID, id);
- },
- setShareTenantId(id: NonNullable<typeof this.shareTenantId>) {
- this.shareTenantId = id;
- },
- setSessionTimeout(flag: boolean) {
- this.sessionTimeout = flag;
- },
- resetState() {
- this.userInfo = null;
- this.dictItems = [];
- this.token = '';
- this.roleList = [];
- this.sessionTimeout = false;
- },
- /**
- * 登录事件
- */
- async login(
- params: LoginParams & {
- goHome?: boolean;
- mode?: ErrorMessageMode;
- }
- ): Promise<GetUserInfoModel | null> {
- try {
- const { goHome = true, mode, ...loginParams } = params;
- const data = await loginApi(loginParams, mode);
- const { token, userInfo } = data;
- // save token
- this.setToken(token);
- this.setTenant(userInfo.loginTenantId);
- return this.afterLoginAction(goHome, data);
- } catch (error) {
- return Promise.reject(error);
- }
- },
- /**
- * 扫码登录事件
- */
- async qrCodeLogin(token): Promise<GetUserInfoModel | null> {
- try {
- // save token
- this.setToken(token);
- return this.afterLoginAction(true, {});
- } catch (error) {
- return Promise.reject(error);
- }
- },
- /**
- * 登录完成处理
- * @param goHome
- */
- async afterLoginAction(goHome?: boolean, data?: any): Promise<any | null> {
- const glob = useGlobSetting();
- if (!this.getToken) return null;
- //获取用户信息
- const userInfo = await this.getUserInfoAction();
- const sessionTimeout = this.sessionTimeout;
- if (sessionTimeout) {
- this.setSessionTimeout(false);
- } else {
- const permissionStore = usePermissionStore();
- if (!permissionStore.isDynamicAddedRoute) {
- const routes = await permissionStore.buildRoutesAction();
- routes.forEach((route) => {
- router.addRoute(route as unknown as RouteRecordRaw);
- });
- router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw);
- router.addRoute(QIANKUN_ROUTE as unknown as RouteRecordRaw);
- permissionStore.setDynamicAddedRoute(true);
- }
- await this.setLoginInfo({ ...data, isLogin: true });
- //update-begin-author:liusq date:2022-5-5 for:登录成功后缓存拖拽模块的接口前缀
- localStorage.setItem(JDragConfigEnum.DRAG_BASE_URL, useGlobSetting().domainUrl);
- //update-end-author:liusq date:2022-5-5 for: 登录成功后缓存拖拽模块的接口前缀
- goHome && (await router.replace((userInfo && userInfo.homePath) || glob.homePath || PageEnum.BASE_HOME));
- // update-begin-author:sunjianlei date:20230306 for: 修复登录成功后,没有正确重定向的问题
- const redirect = router.currentRoute.value?.query?.redirect as string;
- // 判断是否有 redirect 重定向地址
- //update-begin---author:wangshuai ---date:20230424 for:【QQYUN-5195】登录之后直接刷新页面导致没有进入创建组织页面------------
- if (redirect && goHome) {
- //update-end---author:wangshuai ---date:20230424 for:【QQYUN-5195】登录之后直接刷新页面导致没有进入创建组织页面------------
- // 当前页面打开
- window.open(redirect, '_self');
- return data;
- }
- // update-end-author:sunjianlei date:20230306 for: 修复登录成功后,没有正确重定向的问题
- goHome && (await router.replace((userInfo && userInfo.homePath) || glob.homePath || PageEnum.BASE_HOME));
- }
- if (useGlobSetting().openQianKun) {
- const actions = getActions();
- actions.setGlobalState({ token: this.getToken, userInfo: userInfo, isMounted: false });
- }
- return data;
- },
- /**
- * 手机号登录
- * @param params
- */
- async phoneLogin(
- params: LoginParams & {
- goHome?: boolean;
- mode?: ErrorMessageMode;
- }
- ): Promise<GetUserInfoModel | null> {
- try {
- const { goHome = true, mode, ...loginParams } = params;
- const data = await phoneLoginApi(loginParams, mode);
- const { token } = data;
- // save token
- this.setToken(token);
- return this.afterLoginAction(goHome, data);
- } catch (error) {
- return Promise.reject(error);
- }
- },
- /**
- * 获取用户信息
- */
- async getUserInfoAction(): Promise<UserInfo | null> {
- if (!this.getToken) {
- return null;
- }
- const { userInfo, sysAllDictItems } = await getUserInfo();
- if (userInfo) {
- const { roles = [] } = userInfo;
- if (isArray(roles)) {
- const roleList = roles.map((item) => item.value) as RoleEnum[];
- this.setRoleList(roleList);
- } else {
- userInfo.roles = [];
- this.setRoleList([]);
- }
- this.setUserInfo(userInfo);
- }
- /**
- * 添加字典信息到缓存
- * @updateBy:lsq
- * @updateDate:2021-09-08
- */
- if (sysAllDictItems) {
- this.setAllDictItems(sysAllDictItems);
- }
- return userInfo;
- },
- /**
- * 退出登录
- */
- async logout(goLogin = false) {
- if (this.getToken) {
- try {
- await doLogout();
- } catch {
- console.log('注销Token失败');
- }
- }
- // //update-begin-author:taoyan date:2022-5-5 for: src/layouts/default/header/index.vue showLoginSelect方法 获取tenantId 退出登录后再次登录依然能获取到值,没有清空
- // let username:any = this.userInfo && this.userInfo.username;
- // if(username){
- // removeAuthCache(username)
- // }
- // //update-end-author:taoyan date:2022-5-5 for: src/layouts/default/header/index.vue showLoginSelect方法 获取tenantId 退出登录后再次登录依然能获取到值,没有清空
- this.setToken('');
- setAuthCache(TOKEN_KEY, null);
- this.setSessionTimeout(false);
- this.setUserInfo(null);
- this.setLoginInfo(null);
- this.setTenant(null);
- //update-begin-author:liusq date:2022-5-5 for:退出登录后清除拖拽模块的接口前缀
- localStorage.removeItem(JDragConfigEnum.DRAG_BASE_URL);
- //update-end-author:liusq date:2022-5-5 for: 退出登录后清除拖拽模块的接口前缀
- //如果开启单点登录,则跳转到单点统一登录中心
- const openSso = useGlobSetting().openSso;
- if (openSso == 'true') {
- await useSso().ssoLoginOut();
- }
- //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------
- //退出登录的时候需要用的应用id
- // if(isOAuth2AppEnv()){
- // let tenantId = getAuthCache(OAUTH2_THIRD_LOGIN_TENANT_ID);
- // removeAuthCache(OAUTH2_THIRD_LOGIN_TENANT_ID);
- // goLogin && await router.push({ name:"Login",query:{ tenantId:tenantId }})
- // }else{
- // // update-begin-author:sunjianlei date:20230306 for: 修复登录成功后,没有正确重定向的问题
- // goLogin && (await router.push({
- // path: PageEnum.BASE_LOGIN,
- // query: {
- // // 传入当前的路由,登录成功后跳转到当前路由
- // redirect: router.currentRoute.value.fullPath,
- // }
- // }));
- // // update-end-author:sunjianlei date:20230306 for: 修复登录成功后,没有正确重定向的问题
- // }
- goLogin &&
- (await router.push({
- path: PageEnum.BASE_LOGIN,
- query: {
- // 传入当前的路由,登录成功后跳转到当前路由
- redirect: router.currentRoute.value.fullPath,
- },
- }));
- //update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------
- },
- /**
- * 登录事件
- */
- async ThirdLogin(
- params: ThirdLoginParams & {
- goHome?: boolean;
- mode?: ErrorMessageMode;
- }
- ): Promise<any | null> {
- try {
- const { goHome = true, mode, ...ThirdLoginParams } = params;
- const data = await thirdLogin(ThirdLoginParams, mode);
- const { token } = data;
- // save token
- this.setToken(token);
- return this.afterLoginAction(goHome, data);
- } catch (error) {
- return Promise.reject(error);
- }
- },
- /**
- * 退出询问
- */
- confirmLoginOut() {
- // debugger;
- const { createConfirm } = useMessage();
- const { t } = useI18n();
- createConfirm({
- iconType: 'warning',
- title: t('sys.app.logoutTip'),
- content: t('sys.app.logoutMessage'),
- onOk: async () => {
- await this.logout(true);
- },
- });
- },
- /** 模拟用户登录行为,使用既定的账号,账号权限将受限 */
- async mockLogin(
- params: Partial<LoginParams> & {
- goHome?: boolean;
- mode?: ErrorMessageMode;
- } = {}
- ) {
- try {
- const loginParams = {
- username: MOCK_LOGIN_UESRNAME,
- password: MOCK_LOGIN_PASSWORD,
- checkKey: new Date().getTime(),
- ...params,
- };
- return this.login(loginParams);
- } catch (error) {
- return Promise.reject(error);
- }
- },
- /** 续登录,即登出后再次模拟登录并刷新当前页面,不需要用户重复登录"自动"登录账户 */
- async redoMockLogin(
- params: Partial<LoginParams> & {
- goHome?: boolean;
- mode?: ErrorMessageMode;
- } = {}
- ) {
- await this.logout();
- await this.mockLogin({
- goHome: false,
- ...params,
- });
- router.go(0);
- },
- /** 用户自动登录,即不需要用户密码即可登录 */
- async autoLogin(
- params: AutoLoginParams & {
- goHome?: boolean;
- mode?: ErrorMessageMode;
- }
- ) {
- try {
- const { goHome = true, mode, ...loginParams } = params;
- const data = await autoLoginApi(loginParams, mode);
- const { token, userInfo } = data;
- // save token
- this.setToken(token);
- this.setTenant(userInfo.loginTenantId);
- return this.afterLoginAction(goHome, data);
- } catch (error) {
- return Promise.reject(error);
- }
- },
- },
- });
- // Need to be used outside the setup
- export function useUserStoreWithOut() {
- return useUserStore(store);
- }
|