From c6898c0a99b00fb08863295d7fb1adb06cf66113 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 5 May 2025 17:02:48 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E5=A2=9E=E5=8A=A0=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E7=A7=9F=E6=88=B7=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/system/tenant/index.ts | 5 +++ src/config/axios/service.ts | 16 ++++++- src/hooks/web/useCache.ts | 2 + src/layout/components/TenantVisit/index.vue | 46 +++++++++++++++++++++ src/layout/components/ToolHeader.vue | 6 +++ src/utils/auth.ts | 12 +++++- 6 files changed, 83 insertions(+), 4 deletions(-) create mode 100644 src/layout/components/TenantVisit/index.vue diff --git a/src/api/system/tenant/index.ts b/src/api/system/tenant/index.ts index 176c3757..12c32528 100644 --- a/src/api/system/tenant/index.ts +++ b/src/api/system/tenant/index.ts @@ -41,6 +41,11 @@ export const getTenant = (id: number) => { return request.get({ url: '/system/tenant/get?id=' + id }) } +// 获取租户精简信息列表 +export const getTenantList = () => { + return request.get({ url: '/system/tenant/simple-list' }) +} + // 新增租户 export const createTenant = (data: TenantVO) => { return request.post({ url: '/system/tenant/create', data }) diff --git a/src/config/axios/service.ts b/src/config/axios/service.ts index 7c31e0b2..74280a92 100644 --- a/src/config/axios/service.ts +++ b/src/config/axios/service.ts @@ -3,7 +3,14 @@ import axios, { AxiosError, AxiosInstance, AxiosResponse, InternalAxiosRequestCo import { ElMessage, ElMessageBox, ElNotification } from 'element-plus' import qs from 'qs' import { config } from '@/config/axios/config' -import { getAccessToken, getRefreshToken, getTenantId, removeToken, setToken } from '@/utils/auth' +import { + getAccessToken, + getRefreshToken, + getTenantId, + getVisitTenantId, + removeToken, + setToken +} from '@/utils/auth' import errorCode from './errorCode' import { resetRouter } from '@/router' @@ -24,7 +31,7 @@ export const isRelogin = { show: false } let requestList: any[] = [] // 是否正在刷新中 let isRefreshToken = false -// 请求白名单,无须token的接口 +// 请求白名单,无须 token 的接口 const whiteList: string[] = ['/login', '/refresh-token'] // 创建axios实例 @@ -55,6 +62,11 @@ service.interceptors.request.use( if (tenantEnable && tenantEnable === 'true') { const tenantId = getTenantId() if (tenantId) config.headers['tenant-id'] = tenantId + // 只有登录时,才设置 visit-tenant-id 访问租户 + const visitTenantId = getVisitTenantId() + if (config.headers.Authorization && visitTenantId) { + config.headers['visit-tenant-id'] = visitTenantId + } } const method = config.method?.toUpperCase() // 防止 GET 请求缓存 diff --git a/src/hooks/web/useCache.ts b/src/hooks/web/useCache.ts index 4f39f307..1acb03bc 100644 --- a/src/hooks/web/useCache.ts +++ b/src/hooks/web/useCache.ts @@ -10,6 +10,7 @@ export const CACHE_KEY = { // 用户相关 ROLE_ROUTERS: 'roleRouters', USER: 'user', + VisitTenantId: 'visitTenantId', // 系统设置 IS_DARK: 'isDark', LANG: 'lang', @@ -35,5 +36,6 @@ export const deleteUserCache = () => { const { wsCache } = useCache() wsCache.delete(CACHE_KEY.USER) wsCache.delete(CACHE_KEY.ROLE_ROUTERS) + wsCache.delete(CACHE_KEY.VisitTenantId) // 注意,不要清理 LoginForm 登录表单 } diff --git a/src/layout/components/TenantVisit/index.vue b/src/layout/components/TenantVisit/index.vue new file mode 100644 index 00000000..81e04a97 --- /dev/null +++ b/src/layout/components/TenantVisit/index.vue @@ -0,0 +1,46 @@ + + + diff --git a/src/layout/components/ToolHeader.vue b/src/layout/components/ToolHeader.vue index 0b8d00d5..4ab94972 100644 --- a/src/layout/components/ToolHeader.vue +++ b/src/layout/components/ToolHeader.vue @@ -8,8 +8,10 @@ import { Breadcrumb } from '@/layout/components/Breadcrumb' import { SizeDropdown } from '@/layout/components/SizeDropdown' import { LocaleDropdown } from '@/layout/components/LocaleDropdown' import RouterSearch from '@/components/RouterSearch/index.vue' +import TenantVisit from '@/layout/components/TenantVisit/index.vue' import { useAppStore } from '@/store/modules/app' import { useDesign } from '@/hooks/web/useDesign' +import { checkPermi } from '@/utils/permission' const { getPrefixCls, variables } = useDesign() @@ -41,6 +43,9 @@ const locale = computed(() => appStore.getLocale) // 消息图标 const message = computed(() => appStore.getMessage) +// 租户切换权限 +const hasTenantVisitPermission = computed(() => checkPermi(['system:tenant:visit'])) + export default defineComponent({ name: 'ToolHeader', setup() { @@ -62,6 +67,7 @@ export default defineComponent({ ) : undefined}
+ {hasTenantVisitPermission.value ? : undefined} {screenfull.value ? ( ) : undefined} diff --git a/src/utils/auth.ts b/src/utils/auth.ts index d9e85650..ad67440d 100644 --- a/src/utils/auth.ts +++ b/src/utils/auth.ts @@ -67,6 +67,14 @@ export const getTenantId = () => { return wsCache.get(CACHE_KEY.TenantId) } -export const setTenantId = (username: string) => { - wsCache.set(CACHE_KEY.TenantId, username) +export const setTenantId = (tenantId: number) => { + wsCache.set(CACHE_KEY.TenantId, tenantId) +} + +export const getVisitTenantId = () => { + return wsCache.get(CACHE_KEY.VisitTenantId) +} + +export const setVisitTenantId = (visitTenantId: number) => { + wsCache.set(CACHE_KEY.VisitTenantId, visitTenantId) }