<!-- @format --> <template> <a-layout class="ns-application" :id="iframe ? 'iframeApplication' : ''"> <ns-header class="ns-header-menu" :initHeaderKey="selectedHeaderKeys" /> <a-layout class="ns-application-layout"> <ns-sider v-if="dealMenus(newMenu)" :menuList="newMenu" :initSiderKey="selectedSiderKeys" :initSiderOpenKey="selectedSiderOpenKeys" /> <a-layout> <!-- <NsBreadcrumb :isCheck="false" :breadcrumbList="breadcrumbList" /> --> <newNsTags :menuList="newMenu" /> <a-layout-content class="ns-content"> <ns-content /> </a-layout-content> </a-layout> </a-layout> </a-layout> </template> <script lang="ts"> import { computed, defineComponent, provide, ref, watch, onMounted } from 'vue'; import NsHeader from './layout/customHeader.vue'; import NsSider from './layout/customSider.vue'; import newNsTags from './layout/tag/index.vue'; import NsBreadcrumb from './layout/breadcrumb.vue'; import NsContent from './layout/baseContent.vue'; import { useRouter } from 'vue-router'; import { emitEvents } from './application.d'; import { Cookies } from '/nerv-lib/util/cookie'; import { appConfigStore } from '/nerv-lib/saas/store/modules/app-config'; import { authorizationService } from '/nerv-base/store/modules/authorization-service'; import mitt from 'mitt'; import { storeToRefs } from 'pinia'; export default defineComponent({ name: 'NsApplication', components: { NsHeader, NsSider, NsContent, newNsTags, NsBreadcrumb }, setup() { const mittEmit = mitt<emitEvents>(); const breadcrumbList = ref<object[]>([]); provide('mittEmit', mittEmit); const configStore = appConfigStore(); const authorizationStore = authorizationService(); const { getInitRouterList: initRouterList } = storeToRefs(authorizationStore); const { getAllResourMenus: initAllMenus } = storeToRefs(authorizationStore); if (!authorizationStore.getPrjectId && Cookies.get('projectUuid')) { authorizationStore.setProjectId(Cookies.get('projectUuid')); } const newMenu = ref<object>([]); const selectedHeaderKeys = ref<string[]>([]); const selectedSiderOpenKeys = ref<string[]>([]); const selectedSiderKeys = ref<string[]>([]); const router = useRouter(); const dealMenus = (arr: object[]) => { if (!arr.length) { return false; } else { let isTrue = false; arr.forEach((item) => { if (item.type !== 'op') { isTrue = true; } }); return isTrue; } }; //处理顶部菜单和左侧菜单选中展开 const dealInitHeaderKey = async (key: string) => { if (!initAllMenus.value.length) { await authorizationStore.initMenuResource(); } const info = initAllMenus.value.filter((x) => x.code === key)[0]; if (info && info.parentCode) { dealInitHeaderKey(info.parentCode); selectedSiderKeys.value.push(info.code); selectedSiderOpenKeys.value.push(info.code); } else { if (info) { selectedHeaderKeys.value.push(info.code); newMenu.value = info.menus ? info.menus : []; } } }; const dealBreadcrumb = (e) => { let info = authorizationStore.allResourMenus.filter((x) => e.code && x.code === e.code)[0]; if (info) { breadcrumbList.value.unshift({ name: info.code, menus: info.menus, type: info.type, meta: { title: info.label, }, }); if (info.parentCode) { dealBreadcrumb({ code: info.parentCode }); } } }; const dealRouterCode = (e) => { breadcrumbList.value = []; let code = ''; if (e.name && e.name.endsWith('Index')) { const info = authorizationStore.allResourMenus.filter( (x) => x.code === `${configStore.resourceName}${e.name}`, )[0]; if (info && info.type === 'menus') { code = `${configStore.resourceName}${e.name}`; } else { code = `${configStore.resourceName}${e.name.toString().replace('Index', '')}`; } } else { code = `${configStore.resourceName}${e.name}`; } if (authorizationStore.allResourMenus?.length) { dealBreadcrumb({ code }); } else { setTimeout(() => { dealBreadcrumb({ code }); }, 500); } }; onMounted(() => { setTimeout(() => { dealRouterCode(router.currentRoute.value); }, 1000); }); watch( () => router.currentRoute.value, async (e) => { dealRouterCode(e); if (e.fullPath !== '/login' && e.matched.length > 1) { selectedHeaderKeys.value = []; selectedSiderKeys.value = []; selectedSiderOpenKeys.value = []; if (!initAllMenus.value.length) { //写死 const loginType = sessionStorage.getItem('loginType'); if (loginType === '4') { await authorizationStore.initUserResource(); authorizationStore.initMenus = authorizationStore.userResourceList; } else { await authorizationStore.initMenuResource(); } } let code = e.meta?.bindView ? e.meta?.bindView : e.name; if (configStore.resourceName) { code = `${configStore.resourceName}${code}`; } if (initAllMenus.value.findIndex((x) => x.code === code) === -1) { dealInitHeaderKey(code?.toString().replace('Index', '')); } else { dealInitHeaderKey(code); } window.sessionStorage.setItem('url', e.fullPath); } }, { immediate: true }, ); return { breadcrumbList, dealMenus, iframe: computed(() => configStore.iframe), configStore, initRouterList, selectedHeaderKeys, selectedSiderKeys, selectedSiderOpenKeys, newMenu, authorizationStore, }; }, }); </script> <style lang="less" scoped> .ns-application { min-height: 100%; .ns-application-layout { min-height: 100%; flex-direction: row; } } .ns-content { position: relative; flex: 1 1 auto; padding-top: 84px; background-color: #e5ebf0; > div { height: 100%; background-color: #fff; margin: 0 16px 16px 16px; } .ns-content-main { // margin: @ns-content-padding; min-height: calc(100% - 48px); height: calc(100% - 16px); // background-color: @white; } .ns-view { // margin: @ns-content-padding; // min-height: calc(100% - 48px); // height: calc(100% - 48px); background-color: @white; } } #iframeApplication .ns-content { padding-top: 55px !important; } </style>