Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
admin
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
c6898c0a
authored
May 05, 2025
by
YunaiV
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat:增加切换租户的功能
parent
2765c4ad
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
83 additions
and
4 deletions
+83
-4
src/api/system/tenant/index.ts
+5
-0
src/config/axios/service.ts
+14
-2
src/hooks/web/useCache.ts
+2
-0
src/layout/components/TenantVisit/index.vue
+46
-0
src/layout/components/ToolHeader.vue
+6
-0
src/utils/auth.ts
+10
-2
No files found.
src/api/system/tenant/index.ts
View file @
c6898c0a
...
@@ -41,6 +41,11 @@ export const getTenant = (id: number) => {
...
@@ -41,6 +41,11 @@ export const getTenant = (id: number) => {
return
request
.
get
({
url
:
'/system/tenant/get?id='
+
id
})
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
)
=>
{
export
const
createTenant
=
(
data
:
TenantVO
)
=>
{
return
request
.
post
({
url
:
'/system/tenant/create'
,
data
})
return
request
.
post
({
url
:
'/system/tenant/create'
,
data
})
...
...
src/config/axios/service.ts
View file @
c6898c0a
...
@@ -3,7 +3,14 @@ import axios, { AxiosError, AxiosInstance, AxiosResponse, InternalAxiosRequestCo
...
@@ -3,7 +3,14 @@ import axios, { AxiosError, AxiosInstance, AxiosResponse, InternalAxiosRequestCo
import
{
ElMessage
,
ElMessageBox
,
ElNotification
}
from
'element-plus'
import
{
ElMessage
,
ElMessageBox
,
ElNotification
}
from
'element-plus'
import
qs
from
'qs'
import
qs
from
'qs'
import
{
config
}
from
'@/config/axios/config'
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
errorCode
from
'./errorCode'
import
{
resetRouter
}
from
'@/router'
import
{
resetRouter
}
from
'@/router'
...
@@ -24,7 +31,7 @@ export const isRelogin = { show: false }
...
@@ -24,7 +31,7 @@ export const isRelogin = { show: false }
let
requestList
:
any
[]
=
[]
let
requestList
:
any
[]
=
[]
// 是否正在刷新中
// 是否正在刷新中
let
isRefreshToken
=
false
let
isRefreshToken
=
false
// 请求白名单,无须
token
的接口
// 请求白名单,无须
token
的接口
const
whiteList
:
string
[]
=
[
'/login'
,
'/refresh-token'
]
const
whiteList
:
string
[]
=
[
'/login'
,
'/refresh-token'
]
// 创建axios实例
// 创建axios实例
...
@@ -55,6 +62,11 @@ service.interceptors.request.use(
...
@@ -55,6 +62,11 @@ service.interceptors.request.use(
if
(
tenantEnable
&&
tenantEnable
===
'true'
)
{
if
(
tenantEnable
&&
tenantEnable
===
'true'
)
{
const
tenantId
=
getTenantId
()
const
tenantId
=
getTenantId
()
if
(
tenantId
)
config
.
headers
[
'tenant-id'
]
=
tenantId
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
()
const
method
=
config
.
method
?.
toUpperCase
()
// 防止 GET 请求缓存
// 防止 GET 请求缓存
...
...
src/hooks/web/useCache.ts
View file @
c6898c0a
...
@@ -10,6 +10,7 @@ export const CACHE_KEY = {
...
@@ -10,6 +10,7 @@ export const CACHE_KEY = {
// 用户相关
// 用户相关
ROLE_ROUTERS
:
'roleRouters'
,
ROLE_ROUTERS
:
'roleRouters'
,
USER
:
'user'
,
USER
:
'user'
,
VisitTenantId
:
'visitTenantId'
,
// 系统设置
// 系统设置
IS_DARK
:
'isDark'
,
IS_DARK
:
'isDark'
,
LANG
:
'lang'
,
LANG
:
'lang'
,
...
@@ -35,5 +36,6 @@ export const deleteUserCache = () => {
...
@@ -35,5 +36,6 @@ export const deleteUserCache = () => {
const
{
wsCache
}
=
useCache
()
const
{
wsCache
}
=
useCache
()
wsCache
.
delete
(
CACHE_KEY
.
USER
)
wsCache
.
delete
(
CACHE_KEY
.
USER
)
wsCache
.
delete
(
CACHE_KEY
.
ROLE_ROUTERS
)
wsCache
.
delete
(
CACHE_KEY
.
ROLE_ROUTERS
)
wsCache
.
delete
(
CACHE_KEY
.
VisitTenantId
)
// 注意,不要清理 LoginForm 登录表单
// 注意,不要清理 LoginForm 登录表单
}
}
src/layout/components/TenantVisit/index.vue
0 → 100644
View file @
c6898c0a
<
template
>
<div>
<el-select
filterable
placeholder=
"请选择租户"
class=
"!w-180px"
v-model=
"value"
@
change=
"handleChange"
clearable
>
<el-option
v-for=
"item in tenants"
:key=
"item.id"
:label=
"item.name"
:value=
"item.id"
/>
</el-select>
</div>
</
template
>
<
script
lang=
"ts"
setup
>
import
{
ref
,
onMounted
}
from
'vue'
import
*
as
TenantApi
from
'@/api/system/tenant'
import
{
getVisitTenantId
,
setVisitTenantId
}
from
'@/utils/auth'
import
{
useMessage
}
from
'@/hooks/web/useMessage'
import
{
useTagsView
}
from
'@/hooks/web/useTagsView'
const
message
=
useMessage
()
// 消息弹窗
const
tagsView
=
useTagsView
()
// 标签页操作
const
value
=
ref
(
getVisitTenantId
())
// 当前选中的租户 ID
const
tenants
=
ref
<
any
[]
>
([])
// 租户列表
const
handleChange
=
(
id
:
number
)
=>
{
// 设置访问租户 ID
setVisitTenantId
(
id
)
// 关闭其他标签页,只保留当前页
tagsView
.
closeOther
()
// 刷新当前页面
tagsView
.
refreshPage
()
// 提示切换成功
const
tenant
=
tenants
.
value
.
find
((
item
)
=>
item
.
id
===
id
)
if
(
tenant
)
{
message
.
success
(
`切换当前租户为:
${
tenant
.
name
}
`
)
}
}
onMounted
(
async
()
=>
{
tenants
.
value
=
await
TenantApi
.
getTenantList
()
})
</
script
>
src/layout/components/ToolHeader.vue
View file @
c6898c0a
...
@@ -8,8 +8,10 @@ import { Breadcrumb } from '@/layout/components/Breadcrumb'
...
@@ -8,8 +8,10 @@ import { Breadcrumb } from '@/layout/components/Breadcrumb'
import
{
SizeDropdown
}
from
'@/layout/components/SizeDropdown'
import
{
SizeDropdown
}
from
'@/layout/components/SizeDropdown'
import
{
LocaleDropdown
}
from
'@/layout/components/LocaleDropdown'
import
{
LocaleDropdown
}
from
'@/layout/components/LocaleDropdown'
import
RouterSearch
from
'@/components/RouterSearch/index.vue'
import
RouterSearch
from
'@/components/RouterSearch/index.vue'
import
TenantVisit
from
'@/layout/components/TenantVisit/index.vue'
import
{
useAppStore
}
from
'@/store/modules/app'
import
{
useAppStore
}
from
'@/store/modules/app'
import
{
useDesign
}
from
'@/hooks/web/useDesign'
import
{
useDesign
}
from
'@/hooks/web/useDesign'
import
{
checkPermi
}
from
'@/utils/permission'
const
{
getPrefixCls
,
variables
}
=
useDesign
()
const
{
getPrefixCls
,
variables
}
=
useDesign
()
...
@@ -41,6 +43,9 @@ const locale = computed(() => appStore.getLocale)
...
@@ -41,6 +43,9 @@ const locale = computed(() => appStore.getLocale)
// 消息图标
// 消息图标
const
message
=
computed
(()
=>
appStore
.
getMessage
)
const
message
=
computed
(()
=>
appStore
.
getMessage
)
// 租户切换权限
const
hasTenantVisitPermission
=
computed
(()
=>
checkPermi
([
'system:tenant:visit'
]))
export
default
defineComponent
({
export
default
defineComponent
({
name
:
'ToolHeader'
,
name
:
'ToolHeader'
,
setup
()
{
setup
()
{
...
@@ -62,6 +67,7 @@ export default defineComponent({
...
@@ -62,6 +67,7 @@ export default defineComponent({
<
/div
>
<
/div
>
)
:
undefined
}
)
:
undefined
}
<
div
class
=
"h-full flex items-center"
>
<
div
class
=
"h-full flex items-center"
>
{
hasTenantVisitPermission
.
value
?
<
TenantVisit
/>
:
undefined
}
{
screenfull
.
value
?
(
{
screenfull
.
value
?
(
<
Screenfull
class
=
"custom-hover"
color
=
"var(--top-header-text-color)"
><
/Screenfull
>
<
Screenfull
class
=
"custom-hover"
color
=
"var(--top-header-text-color)"
><
/Screenfull
>
)
:
undefined
}
)
:
undefined
}
...
...
src/utils/auth.ts
View file @
c6898c0a
...
@@ -67,6 +67,14 @@ export const getTenantId = () => {
...
@@ -67,6 +67,14 @@ export const getTenantId = () => {
return
wsCache
.
get
(
CACHE_KEY
.
TenantId
)
return
wsCache
.
get
(
CACHE_KEY
.
TenantId
)
}
}
export
const
setTenantId
=
(
username
:
string
)
=>
{
export
const
setTenantId
=
(
tenantId
:
number
)
=>
{
wsCache
.
set
(
CACHE_KEY
.
TenantId
,
username
)
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
)
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment