✨ 新增管理员代登录功能

This commit is contained in:
caojia
2026-11-04 15:20:05 +08:00
parent 93da04fe5e
commit 5cccbf510f
17 changed files with 540 additions and 18 deletions
+27 -1
View File
@@ -1,9 +1,34 @@
import Cookies from 'js-cookie'
const TokenKey = 'Admin-Token'
const ImpersonationTokenKey = 'bms-impersonation-token'
let impersonationRecoveryInProgress = false
export function getToken() {
return Cookies.get(TokenKey)
return getImpersonationToken() || Cookies.get(TokenKey)
}
export function getImpersonationToken() {
return sessionStorage.getItem(ImpersonationTokenKey)
}
export function setImpersonationToken(token) {
sessionStorage.setItem(ImpersonationTokenKey, token)
}
export function clearImpersonationToken() {
sessionStorage.removeItem(ImpersonationTokenKey)
}
export function recoverImpersonation() {
if (impersonationRecoveryInProgress) return
impersonationRecoveryInProgress = true
clearImpersonationToken()
location.replace('/index')
}
export function isImpersonationRecoveryInProgress() {
return impersonationRecoveryInProgress
}
export function setToken(token) {
@@ -11,5 +36,6 @@ export function setToken(token) {
}
export function removeToken() {
clearImpersonationToken()
return Cookies.remove(TokenKey)
}
+12 -1
View File
@@ -1,6 +1,6 @@
import axios from 'axios'
import { ElNotification , ElMessageBox, ElMessage, ElLoading } from 'element-plus'
import { getToken } from '@/utils/auth'
import { getToken, getImpersonationToken, recoverImpersonation } from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import { tansParams, blobValidate } from '@/utils/bms'
import cache from '@/plugins/cache'
@@ -83,6 +83,11 @@ service.interceptors.response.use(res => {
return res.data
}
if (code === 401) {
const impersonationToken = getImpersonationToken()
if (impersonationToken && res.config.headers?.Authorization === 'Bearer ' + impersonationToken) {
recoverImpersonation()
return Promise.reject(new Error('代登录会话已结束,正在返回管理员账号'))
}
if (!isRelogin.show) {
isRelogin.show = true
ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
@@ -109,6 +114,12 @@ service.interceptors.response.use(res => {
}
},
error => {
const impersonationToken = getImpersonationToken()
if (impersonationToken && error.response?.status === 401 &&
error.config?.headers?.Authorization === 'Bearer ' + impersonationToken) {
recoverImpersonation()
return Promise.reject(error)
}
console.log('err' + error)
let { message } = error
if (message == "Network Error") {