Skip to content

Commit c6898c0

Browse files
committed
feat:增加切换租户的功能
1 parent 2765c4a commit c6898c0

File tree

6 files changed

+83
-4
lines changed

6 files changed

+83
-4
lines changed

src/api/system/tenant/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ export const getTenant = (id: number) => {
4141
return request.get({ url: '/system/tenant/get?id=' + id })
4242
}
4343

44+
// 获取租户精简信息列表
45+
export const getTenantList = () => {
46+
return request.get({ url: '/system/tenant/simple-list' })
47+
}
48+
4449
// 新增租户
4550
export const createTenant = (data: TenantVO) => {
4651
return request.post({ url: '/system/tenant/create', data })

src/config/axios/service.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,14 @@ import axios, { AxiosError, AxiosInstance, AxiosResponse, InternalAxiosRequestCo
33
import { ElMessage, ElMessageBox, ElNotification } from 'element-plus'
44
import qs from 'qs'
55
import { config } from '@/config/axios/config'
6-
import { getAccessToken, getRefreshToken, getTenantId, removeToken, setToken } from '@/utils/auth'
6+
import {
7+
getAccessToken,
8+
getRefreshToken,
9+
getTenantId,
10+
getVisitTenantId,
11+
removeToken,
12+
setToken
13+
} from '@/utils/auth'
714
import errorCode from './errorCode'
815

916
import { resetRouter } from '@/router'
@@ -24,7 +31,7 @@ export const isRelogin = { show: false }
2431
let requestList: any[] = []
2532
// 是否正在刷新中
2633
let isRefreshToken = false
27-
// 请求白名单,无须token的接口
34+
// 请求白名单,无须 token 的接口
2835
const whiteList: string[] = ['/login', '/refresh-token']
2936

3037
// 创建axios实例
@@ -55,6 +62,11 @@ service.interceptors.request.use(
5562
if (tenantEnable && tenantEnable === 'true') {
5663
const tenantId = getTenantId()
5764
if (tenantId) config.headers['tenant-id'] = tenantId
65+
// 只有登录时,才设置 visit-tenant-id 访问租户
66+
const visitTenantId = getVisitTenantId()
67+
if (config.headers.Authorization && visitTenantId) {
68+
config.headers['visit-tenant-id'] = visitTenantId
69+
}
5870
}
5971
const method = config.method?.toUpperCase()
6072
// 防止 GET 请求缓存

src/hooks/web/useCache.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export const CACHE_KEY = {
1010
// 用户相关
1111
ROLE_ROUTERS: 'roleRouters',
1212
USER: 'user',
13+
VisitTenantId: 'visitTenantId',
1314
// 系统设置
1415
IS_DARK: 'isDark',
1516
LANG: 'lang',
@@ -35,5 +36,6 @@ export const deleteUserCache = () => {
3536
const { wsCache } = useCache()
3637
wsCache.delete(CACHE_KEY.USER)
3738
wsCache.delete(CACHE_KEY.ROLE_ROUTERS)
39+
wsCache.delete(CACHE_KEY.VisitTenantId)
3840
// 注意,不要清理 LoginForm 登录表单
3941
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<template>
2+
<div>
3+
<el-select
4+
filterable
5+
placeholder="请选择租户"
6+
class="!w-180px"
7+
v-model="value"
8+
@change="handleChange"
9+
clearable
10+
>
11+
<el-option v-for="item in tenants" :key="item.id" :label="item.name" :value="item.id" />
12+
</el-select>
13+
</div>
14+
</template>
15+
16+
<script lang="ts" setup>
17+
import { ref, onMounted } from 'vue'
18+
import * as TenantApi from '@/api/system/tenant'
19+
import { getVisitTenantId, setVisitTenantId } from '@/utils/auth'
20+
import { useMessage } from '@/hooks/web/useMessage'
21+
import { useTagsView } from '@/hooks/web/useTagsView'
22+
23+
const message = useMessage() // 消息弹窗
24+
const tagsView = useTagsView() // 标签页操作
25+
26+
const value = ref(getVisitTenantId()) // 当前选中的租户 ID
27+
const tenants = ref<any[]>([]) // 租户列表
28+
29+
const handleChange = (id: number) => {
30+
// 设置访问租户 ID
31+
setVisitTenantId(id)
32+
// 关闭其他标签页,只保留当前页
33+
tagsView.closeOther()
34+
// 刷新当前页面
35+
tagsView.refreshPage()
36+
// 提示切换成功
37+
const tenant = tenants.value.find((item) => item.id === id)
38+
if (tenant) {
39+
message.success(`切换当前租户为: ${tenant.name}`)
40+
}
41+
}
42+
43+
onMounted(async () => {
44+
tenants.value = await TenantApi.getTenantList()
45+
})
46+
</script>

src/layout/components/ToolHeader.vue

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ import { Breadcrumb } from '@/layout/components/Breadcrumb'
88
import { SizeDropdown } from '@/layout/components/SizeDropdown'
99
import { LocaleDropdown } from '@/layout/components/LocaleDropdown'
1010
import RouterSearch from '@/components/RouterSearch/index.vue'
11+
import TenantVisit from '@/layout/components/TenantVisit/index.vue'
1112
import { useAppStore } from '@/store/modules/app'
1213
import { useDesign } from '@/hooks/web/useDesign'
14+
import { checkPermi } from '@/utils/permission'
1315
1416
const { getPrefixCls, variables } = useDesign()
1517
@@ -41,6 +43,9 @@ const locale = computed(() => appStore.getLocale)
4143
// 消息图标
4244
const message = computed(() => appStore.getMessage)
4345
46+
// 租户切换权限
47+
const hasTenantVisitPermission = computed(() => checkPermi(['system:tenant:visit']))
48+
4449
export default defineComponent({
4550
name: 'ToolHeader',
4651
setup() {
@@ -62,6 +67,7 @@ export default defineComponent({
6267
</div>
6368
) : undefined}
6469
<div class="h-full flex items-center">
70+
{hasTenantVisitPermission.value ? <TenantVisit /> : undefined}
6571
{screenfull.value ? (
6672
<Screenfull class="custom-hover" color="var(--top-header-text-color)"></Screenfull>
6773
) : undefined}

src/utils/auth.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,14 @@ export const getTenantId = () => {
6767
return wsCache.get(CACHE_KEY.TenantId)
6868
}
6969

70-
export const setTenantId = (username: string) => {
71-
wsCache.set(CACHE_KEY.TenantId, username)
70+
export const setTenantId = (tenantId: number) => {
71+
wsCache.set(CACHE_KEY.TenantId, tenantId)
72+
}
73+
74+
export const getVisitTenantId = () => {
75+
return wsCache.get(CACHE_KEY.VisitTenantId)
76+
}
77+
78+
export const setVisitTenantId = (visitTenantId: number) => {
79+
wsCache.set(CACHE_KEY.VisitTenantId, visitTenantId)
7280
}

0 commit comments

Comments
 (0)