You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
216 lines
7.0 KiB
216 lines
7.0 KiB
7 months ago
|
<!-- @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>
|