From b971e6de5299812a13b8d6e06394651e84aa4a5c Mon Sep 17 00:00:00 2001 From: zhoutianchi <1305666981@qq.com> Date: Tue, 24 Feb 2026 17:06:57 +0800 Subject: [PATCH 1/2] 1 --- src/App.vue | 31 ++++---- src/layout/navBars/breadcrumb/user.vue | 11 +-- src/views/admin/system/role/change-role.vue | 77 ++++++++++++++----- .../admin/system/role/changeRole-fir.vue | 64 --------------- 4 files changed, 76 insertions(+), 107 deletions(-) delete mode 100644 src/views/admin/system/role/changeRole-fir.vue diff --git a/src/App.vue b/src/App.vue index 30b40e5..cc669bd 100644 --- a/src/App.vue +++ b/src/App.vue @@ -4,7 +4,7 @@ - + @@ -22,7 +22,7 @@ import setIntroduction from '/@/utils/setIconfont'; const LockScreen = defineAsyncComponent(() => import('/@/layout/lockScreen/index.vue')); const Settings = defineAsyncComponent(() => import('./layout/navBars/breadcrumb/settings.vue')); const CloseFull = defineAsyncComponent(() => import('/@/layout/navBars/breadcrumb/closeFull.vue')); -const ChangeRoleFir = defineAsyncComponent(() => import('/@/views/admin/system/role/changeRole-fir.vue')); +const ChangeRole = defineAsyncComponent(() => import('/@/views/admin/system/role/change-role.vue')); // 定义变量内容 const { messages, locale } = useI18n(); @@ -56,10 +56,19 @@ onBeforeMount(() => { // 设置批量第三方 js setIntroduction.jsCdn(); }); -// 页面加载时 +// 角色选择弹框是否已在本轮打开过(防止事件被触发两次) +let roleDialogOpenedThisSession = false onMounted(() => { + // 唯一入口:只通过事件打开,且只打开一次;延迟打开以等待异步组件挂载 + mittBus.on('openRoleSelectDialog', () => { + if (roleDialogOpenedThisSession) return + roleDialogOpenedThisSession = true + setTimeout(() => { + changeRoleFirRef.value?.open() + }, 300) + }) nextTick(() => { - // 监听布局配'置弹窗点击打开 + // 监听布局配置弹窗点击打开 mittBus.on('openSettingsDrawer', () => { settingsRef.value.openDrawer(); }); @@ -72,18 +81,12 @@ onMounted(() => { if (Session.get('isTagsViewCurrenFull')) { stores.setCurrenFullscreen(Session.get('isTagsViewCurrenFull')); } - // 全局判断:已登录但 Local 缺少角色信息时弹出角色选择;弹框已触发则不再重复弹出 + // 与请求拦截器共用同一逻辑:先设标志再 emit,由监听器统一打开(监听器内会延迟 300ms 以等待异步组件挂载) if (Session.getToken() && needRoleSelection() && !isRoleDialogTriggered()) { - setRoleDialogTriggered(true); - setTimeout(() => { - changeRoleFirRef.value?.open(); - }, 300); + setRoleDialogTriggered(true) + mittBus.emit('openRoleSelectDialog') } - // 请求拦截器里也会在发送请求时判断并 emit,此处统一监听打开弹框 - mittBus.on('openRoleSelectDialog', () => { - changeRoleFirRef.value?.open(); - }); - }); + }) }); // 页面销毁时,关闭监听 onUnmounted(() => { diff --git a/src/layout/navBars/breadcrumb/user.vue b/src/layout/navBars/breadcrumb/user.vue index 576c6bd..f436c0e 100644 --- a/src/layout/navBars/breadcrumb/user.vue +++ b/src/layout/navBars/breadcrumb/user.vue @@ -253,15 +253,7 @@ const getIsDot = () => { }); }; -// 登录后若存储中无角色信息则弹出角色切换框 -const openChangeRoleIfMissing = () => { - const hasRole = Local.get('roleCode') && Local.get('roleName') && Local.get('roleId') - if (!hasRole) { - nextTick(() => { - setTimeout(() => ChangeRoleRef.value?.open(), 100) - }) - } -} +// 首次登录缺角色时由 App.vue + 请求拦截器统一弹出「首次登录请选择角色」弹框,此处不再自动打开 // 页面加载时 onMounted(() => { @@ -271,7 +263,6 @@ onMounted(() => { } useFlowJob().topJobList() getIsDot() - openChangeRoleIfMissing() }); diff --git a/src/views/admin/system/role/change-role.vue b/src/views/admin/system/role/change-role.vue index 25b4087..eb6f195 100644 --- a/src/views/admin/system/role/change-role.vue +++ b/src/views/admin/system/role/change-role.vue @@ -1,56 +1,79 @@