Skip to content

Commit 9819580

Browse files
committed
feat:支持租户下拉选择
1 parent 3326086 commit 9819580

File tree

5 files changed

+100
-5
lines changed

5 files changed

+100
-5
lines changed

src/api/system/tenant.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,11 @@ export function exportTenantExcel(query) {
7171
responseType: 'blob'
7272
})
7373
}
74+
75+
// 获取租户精简信息列表
76+
export function getTenantList() {
77+
return request({
78+
url: '/system/tenant/simple-list',
79+
method: 'get'
80+
})
81+
}

src/components/TenantVisit/index.vue

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
4<template>
2+
<div>
3+
<el-select
4+
filterable
5+
placeholder="请选择租户"
6+
style="width: 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>
17+
import { getTenantList } from '@/api/system/tenant'
18+
import { getVisitTenantId, setVisitTenantId } from '@/utils/auth'
19+
20+
export default {
21+
name: 'TenantVisit',
22+
data() {
23+
return {
24+
value: getVisitTenantId() ? Number(getVisitTenantId()) : undefined, // 当前选中的租户 ID
25+
tenants: [] // 租户列表
26+
}
27+
},
28+
methods: {
29+
handleChange(id) {
30+
// 设置访问租户 ID
31+
setVisitTenantId(id)
32+
// 关闭其他标签页,只保留当前页
33+
this.$tab.closeOtherPage();
34+
// 刷新当前页面
35+
this.$tab.refreshPage();
36+
// 提示切换成功
37+
const tenant = this.tenants.find((item) => item.id === id)
38+
if (tenant) {
39+
this.$message.success(`切换当前租户为: ${tenant.name}`)
40+
}
41+
}
42+
},
43+
async mounted() {
44+
try {
45+
const response = await getTenantList()
46+
this.tenants = response.data || []
47+
} catch (error) {
48+
console.error('获取租户列表失败:', error)
49+
}
50+
}
51+
}
52+
</script>

src/layout/components/Navbar.vue

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77

88
<div class="right-menu">
99
<template v-if="device!=='mobile'">
10+
<!-- 租户下拉框 -->
11+
<tenant-visit v-if="tenantEnable" v-hasPermi="['system:tenant:visit']" class="right-menu-item" />
12+
13+
<!-- 菜单搜索 -->
1014
<search id="header-search" class="right-menu-item" />
1115

1216
<!-- 站内信 -->
@@ -61,7 +65,8 @@ import Search from '@/components/HeaderSearch'
6165
import RuoYiGit from '@/components/RuoYi/Git'
6266
import RuoYiDoc from '@/components/RuoYi/Doc'
6367
import NotifyMessage from '@/layout/components/Message'
64-
import {getPath} from "@/utils/ruoyi";
68+
import TenantVisit from '@/components/TenantVisit'
69+
import {getPath, getTenantEnable} from "@/utils/ruoyi";
6570
6671
export default {
6772
components: {
@@ -73,7 +78,8 @@ export default {
7378
Search,
7479
RuoYiGit,
7580
RuoYiDoc,
76-
NotifyMessage
81+
NotifyMessage,
82+
TenantVisit
7783
},
7884
computed: {
7985
...mapGetters([
@@ -97,6 +103,9 @@ export default {
97103
get() {
98104
return this.$store.state.settings.topNav
99105
}
106+
},
107+
tenantEnable() {
108+
return getTenantEnable()
100109
}
101110
},
102111
methods: {
@@ -109,6 +118,10 @@ export default {
109118
location.href = getPath('/index');
110119
})
111120
}).catch(() => {});
121+
},
122+
checkPermi(permissions) {
123+
return this.$auth.hasPermi(permissions)
124+
return true;
112125
}
113126
}
114127
}

src/utils/auth.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ export function removeRememberMe() {
7070

7171
const TenantIdKey = 'TENANT_ID'
7272
const TenantNameKey = 'TENANT_NAME'
73+
const VisitTenantIdKey = 'VISIT_TENANT_ID'
7374

7475
export function getTenantName() {
7576
return localStorage.getItem(TenantNameKey)
@@ -95,5 +96,14 @@ export function removeTenantId() {
9596
localStorage.removeItem(TenantIdKey)
9697
}
9798

98-
export class getToken {
99+
export function getVisitTenantId() {
100+
return localStorage.getItem(VisitTenantIdKey)
101+
}
102+
103+
export function setVisitTenantId(tenantId) {
104+
localStorage.setItem(VisitTenantIdKey, tenantId)
105+
}
106+
107+
export function removeVisitTenantId() {
108+
localStorage.removeItem(VisitTenantIdKey)
99109
}

src/utils/request.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import axios from 'axios'
22
import {Message, MessageBox, Notification} from 'element-ui'
33
import store from '@/store'
4-
import {getAccessToken, getRefreshToken, getTenantId, setToken} from '@/utils/auth'
4+
import {getAccessToken, getRefreshToken, getTenantId, setToken, getVisitTenantId} from '@/utils/auth'
55
import errorCode from '@/utils/errorCode'
66
import {getPath, getTenantEnable} from "@/utils/ruoyi";
77
import {refreshToken} from "@/api/login";
@@ -43,6 +43,11 @@ service.interceptors.request.use(config => {
4343
if (tenantId) {
4444
config.headers['tenant-id'] = tenantId;
4545
}
46+
// 只有登录时,才设置 visit-tenant-id 访问租户
47+
const visitTenantId = getVisitTenantId()
48+
if (config.headers.Authorization && visitTenantId) {
49+
config.headers['visit-tenant-id'] = visitTenantId
50+
}
4651
}
4752
// get请求映射params参数
4853
if (config.method === 'get' && config.params) {
@@ -183,10 +188,17 @@ service.interceptors.response.use(async res => {
183188
)
184189

185190
export function getBaseHeader() {
186-
return {
191+
const headers = {
187192
'Authorization': "Bearer " + getAccessToken(),
188193
'tenant-id': getTenantId(),
189194
}
195+
// 如果已登录且存在访问租户ID,添加 visit-tenant-id 请求头
196+
const visitTenantId = getVisitTenantId()
197+
if (getAccessToken() && visitTenantId) {
198+
headers['visit-tenant-id'] = visitTenantId
199+
}
200+
201+
return headers
190202
}
191203

192204
function handleAuthorized() {

0 commit comments

Comments
 (0)