新增管理员模拟登录

This commit is contained in:
吴红兵
2026-03-09 13:22:55 +08:00
parent bfd864bb2c
commit 92aa64f1dd
2 changed files with 56 additions and 2 deletions

View File

@@ -153,3 +153,13 @@ export function getUserListByRole(obj: string) {
method: 'get',
});
}
/**
* 模拟登录(管理员以指定用户身份登录)
*/
export function simulateLogin(userId: string) {
return request({
url: '/auth/token/simulate/' + userId,
method: 'get',
});
}

View File

@@ -95,9 +95,20 @@
<el-switch v-model="scope.row.lockFlag" @change="changeSwitch(scope.row)" active-value="0" inactive-value="9"></el-switch>
</template>
</el-table-column>
<el-table-column :label="$t('common.action')" width="200" fixed="right">
<el-table-column :label="$t('common.action')" width="280" fixed="right">
<template #default="scope">
<div style="display: flex">
<!-- 模拟登录 -->
<el-button
v-auth="'sys_user_simulate'"
icon="User"
text
type="primary"
:disabled="scope.row.username === 'admin'"
@click="handleSimulateLogin(scope.row)"
>
模拟登录
</el-button>
<!-- 重置密码 -->
<popover-input v-model="inputPassword" @confirm="changePassword(scope.row)">
<template #default>
@@ -142,22 +153,31 @@
url="/admin/user/import"
@refreshDataList="getDataList"
/>
<change-role ref="changeRoleRef" />
</div>
</template>
<script lang="ts" name="systemUser" setup>
import { delObj, pageList, putObj } from '/@/api/admin/user';
import { delObj, pageList, putObj, simulateLogin } from '/@/api/admin/user';
import { deptTree } from '/@/api/admin/dept';
import { BasicTableProps, useTable } from '/@/hooks/table';
import { useMessage, useMessageBox } from '/@/hooks/message';
import { useI18n } from 'vue-i18n';
import { useUserInfo } from '/@/stores/userInfo';
import { Session, Local } from '/@/utils/storage';
import { useRouter } from 'vue-router';
// 动态引入组件
const UserForm = defineAsyncComponent(() => import('./form.vue'));
const QueryTree = defineAsyncComponent(() => import('/@/components/QueryTree/index.vue'));
const PopoverInput = defineAsyncComponent(() => import('/@/components/PopoverInput/index.vue'));
const ChangeRole = defineAsyncComponent(() => import('/@/views/admin/system/role/change-role.vue'));
const { t } = useI18n();
const router = useRouter();
const userStore = useUserInfo();
const changeRoleRef = ref();
// 定义变量内容
const userDialogRef = ref();
@@ -260,4 +280,28 @@ const changePassword = async (row: any) => {
useMessage().success(t('common.optSuccessText'));
getDataList();
};
// 模拟登录
const handleSimulateLogin = async (row: any) => {
try {
await useMessageBox().confirm('确定要以用户 "' + row.realName + '" 的身份登录吗?');
const res = await simulateLogin(row.userId);
if (res.data && res.data.access_token) {
userStore.setTokenCache(res.data.access_token, res.data.refresh_token);
Session.set('userInfo', {
user: { username: res.data.username, userId: res.data.user_id },
});
await userStore.setUserInfos();
useMessage().success('模拟登录成功');
router.push('/');
setTimeout(() => {
changeRoleRef.value?.open();
}, 500);
}
} catch (err: any) {
if (err !== 'cancel') {
useMessage().error(err.msg || '模拟登录失败');
}
}
};
</script>