Просмотр исходного кода

chore: 😀退出登陆时记住当前租户id,登录时再引用

喵你个旺呀 1 год назад
Родитель
Сommit
f0cc9f4516

+ 5 - 0
Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginUserOutput.cs

@@ -100,4 +100,9 @@ public class LoginUserOutput
     /// 水印文字
     /// </summary>
     public string WatermarkText { get; set; }
+
+    /// <summary>
+    /// 租户Id
+    /// </summary>
+    public long? TenantId { get; set; }
 }

+ 1 - 0
Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs

@@ -303,6 +303,7 @@ public class SysAuthService : IDynamicApiController, ITransient
             PosName = pos?.Name,
             Buttons = buttons,
             RoleIds = roleIds,
+            TenantId = user.TenantId,
             WatermarkText = watermarkText
         };
     }

+ 2 - 2
Web/src/layout/navBars/topBar/user.vue

@@ -102,7 +102,7 @@ import { Local, Session } from '/@/utils/storage';
 import Push from 'push.js';
 import { signalR } from '/@/views/system/onlineUser/signalR';
 import { Avatar, CircleCloseFilled, Loading, Lock, Switch } from '@element-plus/icons-vue';
-import { clearAccessTokens, getAPI } from '/@/utils/axios-utils';
+import { clearAccessAfterReload, getAPI } from '/@/utils/axios-utils';
 import { SysAuthApi, SysNoticeApi } from '/@/api-services/api';
 import { auth } from "/@/utils/authFunction";
 
@@ -192,7 +192,7 @@ const onHandleCommandClick = (path: string) => {
 			},
 		})
 			.then(async () => {
-				clearAccessTokens();
+				clearAccessAfterReload();
 			})
 			.catch(() => {});
 	} else if (path === 'changeTenant') {

+ 1 - 0
Web/src/stores/userInfo.ts

@@ -80,6 +80,7 @@ export const useUserInfo = defineStore('userInfo', {
 							posName: d.posName,
 							roles: d.roleIds,
 							authBtnList: d.buttons,
+							tenantId: d.tenantId,
 							time: new Date().getTime(),
 						};
 						// vue-next-admin 提交Id:225bce7 提交消息:admin-23.03.26:发布v2.4.32版本

+ 11 - 6
Web/src/utils/axios-utils.ts

@@ -7,10 +7,12 @@
 
 import globalAxios, { AxiosInstance } from 'axios';
 import { Configuration } from '../api-services';
-import { BaseAPI, BASE_PATH } from '../api-services/base';
+import { BASE_PATH } from '../api-services/base';
 
 import { ElMessage } from 'element-plus';
 import { Local, Session } from '../utils/storage';
+import { useUserInfo } from "/@/stores/userInfo";
+import {useRoute, useRouter} from "vue-router";
 
 // 接口服务器配置
 export const serveConfig = new Configuration({
@@ -32,8 +34,11 @@ export const getHeader = () => {
 };
 
 // 清除 token
-export const clearAccessTokens = () => {
+export const clearAccessAfterReload = () => {
+	const tenantId = useUserInfo().userInfos.tenantId;
+
 	clearTokens();
+	Local.set('t', tenantId);
 
 	// 刷新浏览器
 	window.location.reload();
@@ -109,7 +114,7 @@ axiosInstance.interceptors.response.use(
 
 		// 处理 401
 		if (status === 401) {
-			clearAccessTokens();
+			clearAccessAfterReload();
 		}
 
 		// 处理未进行规范化处理的
@@ -128,7 +133,7 @@ axiosInstance.interceptors.response.use(
 
 		// 判断是否是无效 token
 		if (accessToken === 'invalid_token') {
-			clearAccessTokens();
+			clearAccessAfterReload();
 		}
 		// 判断是否存在刷新 token,如果存在则存储在本地
 		else if (refreshAccessToken && accessToken && accessToken !== 'invalid_token') {
@@ -138,7 +143,7 @@ axiosInstance.interceptors.response.use(
 
 		// 响应拦截及自定义处理
 		if (serve.code === 401) {
-			clearAccessTokens();
+			clearAccessAfterReload();
 		} else if (serve.code === undefined) {
 			return Promise.resolve(res);
 		} else if (serve.code !== 200) {
@@ -162,7 +167,7 @@ axiosInstance.interceptors.response.use(
 		// 处理响应错误
 		if (error.response) {
 			if (error.response.status === 401) {
-				clearAccessTokens();
+				clearAccessAfterReload();
 			}
 		}
 

+ 6 - 17
Web/src/utils/request.ts

@@ -1,6 +1,7 @@
 import axios, { AxiosInstance, AxiosRequestConfig } from 'axios';
 import { ElMessage } from 'element-plus';
-import { Local, Session } from '/@/utils/storage';
+import { Local, } from '/@/utils/storage';
+import {clearAccessAfterReload} from "/@/utils/axios-utils";
 
 // 定义请求中止控制器映射表
 const abortControllerMap: Map<string, AbortController> = new Map();
@@ -21,18 +22,6 @@ export const getToken = () => {
 	return Local.get(accessTokenKey);
 };
 
-// 清除 token
-export const clearAccessTokens = () => {
-	Local.remove(accessTokenKey);
-	Local.remove(refreshAccessTokenKey);
-
-	// 清除其他
-	Session.clear();
-
-	// 刷新浏览器
-	window.location.reload();
-};
-
 // axios 默认实例
 export const axiosInstance: AxiosInstance = axios;
 
@@ -101,7 +90,7 @@ service.interceptors.response.use(
 
 		// 处理 401
 		if (status === 401) {
-			clearAccessTokens();
+			clearAccessAfterReload();
 		}
 
 		// 处理未进行规范化处理的
@@ -120,7 +109,7 @@ service.interceptors.response.use(
 
 		// 判断是否是无效 token
 		if (accessToken === 'invalid_token') {
-			clearAccessTokens();
+			clearAccessAfterReload();
 		}
 		// 判断是否存在刷新 token,如果存在则存储在本地, 并重新加载页面
 		else if (refreshAccessToken && accessToken) {
@@ -130,7 +119,7 @@ service.interceptors.response.use(
 
 		// 响应拦截及自定义处理
 		if (serve.code === 401) {
-			clearAccessTokens();
+			clearAccessAfterReload();
 		} else if (serve.code === undefined) {
 			return Promise.resolve(res);
 		} else if (serve.code !== 200) {
@@ -155,7 +144,7 @@ service.interceptors.response.use(
 		// 处理响应错误
 		if (error.response) {
 			if (error.response.status === 401) {
-				clearAccessTokens();
+				clearAccessAfterReload();
 			}
 		}
 

+ 2 - 1
Web/src/views/login/index.vue

@@ -75,6 +75,7 @@ import loginIconTwo2 from '/@/assets/login-icon-two2.svg';
 import {getAPI} from "/@/utils/axios-utils";
 import {SysTenantApi} from "/@/api-services";
 import {useRoute} from "vue-router";
+import {Local} from "/@/utils/storage";
 
 // 引入组件
 const Register = defineAsyncComponent(() => import('/@/views/login/component/register.vue'));
@@ -111,7 +112,7 @@ onMounted(async () => {
 // 获取租户信息
 const getTenantInfo = async () => {
 	if (themeConfig.value.hideTenantForLogin) {
-		tenantInfo.value.id = route.query.t ? parseInt(<string>route.query.t) : -1;
+		tenantInfo.value.id = parseInt(route.query.t ? <string>route.query.t : (Local.get('t') ?? '-1'));
 		tenantInfo.value.list = [];
 		return tenantInfo.value;
 	}

+ 2 - 2
Web/src/views/system/onlineUser/index.vue

@@ -59,7 +59,7 @@ import { onMounted, reactive } from 'vue';
 import { ElMessageBox, ElNotification } from 'element-plus';
 import { throttle } from 'lodash-es';
 
-import { getAPI, clearAccessTokens } from '/@/utils/axios-utils';
+import { getAPI, clearAccessAfterReload } from '/@/utils/axios-utils';
 import {SysOnlineUserApi, SysAuthApi, SysTenantApi} from '/@/api-services/api';
 import { SysOnlineUser } from '/@/api-services/models';
 import { useUserInfo } from "/@/stores/userInfo";
@@ -109,7 +109,7 @@ onMounted(async () => {
 		await signalR.stop();
 
 		await getAPI(SysAuthApi).apiSysAuthLogoutPost();
-		clearAccessTokens();
+		clearAccessAfterReload();
 	});
 });
 

+ 2 - 2
Web/src/views/system/user/component/userCenter.vue

@@ -170,7 +170,7 @@ import OrgTree from '/@/views/system/user/component/orgTree.vue';
 import CropperDialog from '/@/components/cropper/index.vue';
 import VueGridLayout from 'vue-grid-layout';
 import { sm2 } from 'sm-crypto-v2';
-import { clearAccessTokens, getAPI } from '/@/utils/axios-utils';
+import { clearAccessAfterReload, getAPI } from '/@/utils/axios-utils';
 import { SysFileApi, SysUserApi } from '/@/api-services/api';
 import { ChangePwdInput, SysUser, SysFile } from '/@/api-services/models';
 
@@ -309,7 +309,7 @@ const submitPassword = () => {
 			cancelButtonText: '取消',
 			type: 'warning',
 		}).then(async () => {
-			clearAccessTokens();
+			clearAccessAfterReload();
 		});
 	});
 };