From cdd84bea31bccefe95541218d271b237481cea5b Mon Sep 17 00:00:00 2001 From: zhoutianchi <1305666981@qq.com> Date: Tue, 24 Feb 2026 16:24:27 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=92=E8=89=B2=E5=BC=B9=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.vue | 19 +++++++++++++- src/dept_change.docx | Bin 13442 -> 0 bytes src/types/mitt.d.ts | 1 + src/utils/request.ts | 12 +++++++-- src/utils/roleSelect.ts | 24 ++++++++++++++++++ .../admin/system/role/changeRole-fir.vue | 21 +++++++++------ 6 files changed, 66 insertions(+), 11 deletions(-) delete mode 100644 src/dept_change.docx create mode 100644 src/utils/roleSelect.ts diff --git a/src/App.vue b/src/App.vue index 1f2fece..30b40e5 100644 --- a/src/App.vue +++ b/src/App.vue @@ -4,6 +4,7 @@ + @@ -14,16 +15,19 @@ import { useThemeConfig } from '/@/stores/themeConfig'; import other from '/@/utils/other'; import { Local, Session } from '/@/utils/storage'; import mittBus from '/@/utils/mitt'; +import { needRoleSelection, isRoleDialogTriggered, setRoleDialogTriggered } from '/@/utils/roleSelect'; 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 { messages, locale } = useI18n(); const settingsRef = ref(); +const changeRoleFirRef = ref<{ open: () => void }>(); const route = useRoute(); const stores = useTagsViewRoutes(); const storesThemeConfig = useThemeConfig(); @@ -44,6 +48,7 @@ const getGlobalComponentSize = computed(() => { const getGlobalI18n = computed(() => { return messages.value[locale.value]; }); + // 设置初始化,防止刷新时恢复默认 onBeforeMount(() => { // 设置批量第三方 icon 图标 @@ -67,11 +72,23 @@ onMounted(() => { if (Session.get('isTagsViewCurrenFull')) { stores.setCurrenFullscreen(Session.get('isTagsViewCurrenFull')); } + // 全局判断:已登录但 Local 缺少角色信息时弹出角色选择;弹框已触发则不再重复弹出 + if (Session.getToken() && needRoleSelection() && !isRoleDialogTriggered()) { + setRoleDialogTriggered(true); + setTimeout(() => { + changeRoleFirRef.value?.open(); + }, 300); + } + // 请求拦截器里也会在发送请求时判断并 emit,此处统一监听打开弹框 + mittBus.on('openRoleSelectDialog', () => { + changeRoleFirRef.value?.open(); + }); }); }); -// 页面销毁时,关闭监听布局配置/i18n监听 +// 页面销毁时,关闭监听 onUnmounted(() => { mittBus.off('openSettingsDrawer', () => {}); + mittBus.off('openRoleSelectDialog'); }); // 监听路由的变化,设置网站标题 watch( diff --git a/src/dept_change.docx b/src/dept_change.docx deleted file mode 100644 index 699ad73985f927060f8e30b808996b7c4df805d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13442 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 diff --git a/src/types/mitt.d.ts b/src/types/mitt.d.ts index 66bb95d..8dc82a4 100644 --- a/src/types/mitt.d.ts +++ b/src/types/mitt.d.ts @@ -23,6 +23,7 @@ declare type MittType = { openShareTagsView?: string; onTagsViewRefreshRouterView?: T; onCurrentContextmenuClick?: T; + openRoleSelectDialog?: string; }; // mitt 参数类型定义 diff --git a/src/utils/request.ts b/src/utils/request.ts index dc86db0..cfb91d2 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -1,10 +1,12 @@ import axios, { AxiosInstance, AxiosResponse, InternalAxiosRequestConfig } from 'axios'; import { Session } from '/@/utils/storage'; -import {useMessage, useMessageBox} from '/@/hooks/message'; +import { useMessage, useMessageBox } from '/@/hooks/message'; import qs from 'qs'; import other from './other'; -import {paramsFilter} from "/@/flow"; +import { paramsFilter } from "/@/flow"; import { wrapEncryption, encryptRequestParams, decrypt } from './apiCrypto'; +import mittBus from '/@/utils/mitt'; +import { needRoleSelection, isRoleDialogTriggered, setRoleDialogTriggered } from '/@/utils/roleSelect'; // 常用header export enum CommonHeaderEnum { @@ -81,6 +83,12 @@ service.interceptors.request.use( // 自动适配单体和微服务架构不同的URL config.url = other.adaptationUrl(config.url); + // 发送请求时判断:已登录但缺少角色信息则弹出角色选择;若弹框已触发则不再重复弹出 + if (token && needRoleSelection() && !isRoleDialogTriggered()) { + setRoleDialogTriggered(true); + mittBus.emit('openRoleSelectDialog'); + } + // 处理完毕,返回config对象 return config; }, diff --git a/src/utils/roleSelect.ts b/src/utils/roleSelect.ts new file mode 100644 index 0000000..07419a9 --- /dev/null +++ b/src/utils/roleSelect.ts @@ -0,0 +1,24 @@ +import { Local } from '/@/utils/storage'; + +/** Local 是否缺少角色信息(缺任一则需弹出角色选择) */ +export function needRoleSelection(): boolean { + try { + const roleCode = Local.get('roleCode'); + const roleName = Local.get('roleName'); + const roleId = Local.get('roleId'); + return !roleCode || !roleName || !roleId; + } catch { + return true; + } +} + +/** 角色选择弹框是否已触发(防止多请求同时触发时重复弹出) */ +let roleDialogTriggered = false; + +export function isRoleDialogTriggered(): boolean { + return roleDialogTriggered; +} + +export function setRoleDialogTriggered(value: boolean): void { + roleDialogTriggered = value; +} diff --git a/src/views/admin/system/role/changeRole-fir.vue b/src/views/admin/system/role/changeRole-fir.vue index 7894ea1..e50ae0d 100644 --- a/src/views/admin/system/role/changeRole-fir.vue +++ b/src/views/admin/system/role/changeRole-fir.vue @@ -21,18 +21,23 @@ import {useMessage} from "/@/hooks/message"; const visible=ref(false) const radio=ref('') -const allRole=reactive([]) +const allRole = reactive([]) const schoolName=ref('') -const open=()=>{ - // handleQuerySchoolName() - listAllRole().then(res=>{ - Object.assign(allRole,res.data) - radio.value=Local.get("roleCode") - visible.value=true +const open = () => { + listAllRole().then(res => { + Object.assign(allRole, res.data) + radio.value = Local.get('roleCode') + visible.value = true }) } -const handleChangeRole=(label:any)=>{ + +// 必须选择角色后才能关闭,禁止点击遮罩/ESC 关闭(不调用 done 即不关闭) +const handleBeforeClose = (_done: () => void) => { + useMessage().warning('请先选择登录角色') +} + +const handleChangeRole = (label: any) => { let obj:any=allRole.find((v:any) => v.roleCode == label) Local.set("roleCode",obj.roleCode) Local.set("roleName",obj.roleName)