<template> <div className="application" style="height: 100%"> <div className="headerMenu" v-if="showLayout"> <ns-header :notifies="notifies" :showNotify="showNotify" /> </div> <div className="contentMenu"> <div className="leftMenu" v-if="showLayout"> <ns-sider :appRecords="docks" /> </div> <div className="content"> <ns-content /> </div> </div> </div> </template> <script lang="ts"> import { authorizationService } from '/nerv-lib/paas/store/modules/authorization-service'; import { CatalogConfigService, CatalogItem } from '/nerv-lib/paas/store/modules/catalog-config'; import {defineComponent, inject} from 'vue'; import NsHeader from './header.vue'; import NsSider from './sider.vue'; import NsContent from './content.vue'; import { storeToRefs } from 'pinia'; import { http } from '/nerv-lib/util/http'; import { cloneDeep } from 'lodash-es'; export default defineComponent({ name: 'NsLayout', components: { NsHeader, NsSider, NsContent }, provide() { return { selecDocks: (item: CatalogItem) => { this.toggleDock(item); }, }; }, setup() { const showLayout = inject('showLayout', true); return { showLayout } }, data() { return { authLoadComplete: false, showNotify: false, authService: {}, catalogConfig: {}, notifies: [], //未读通知 docks: [], }; }, mounted() { this.authService = authorizationService(); this.catalogConfig = CatalogConfigService(); this.catalogConfig.$subscribe((mutation, state) => { this.restoreDocks(this.authService.itemMap); }); }, created() {}, methods: { restoreDocks(authorityMap: any) { const storage = window.localStorage; this.showNotify = this.authService.checkPermission('notify', 'WebConsoleMsg'); if (this.showNotify) { this.getNotifies(); } if (!storage) { return; } if (!storage['docks']) { storage['docks'] = JSON.stringify([]); } const cataItemNamesMap = {}; const { data } = this.catalogConfig; let catalogs = cloneDeep(data); // console.log('catalogs', catalogs); if (catalogs) { this.docks = []; catalogs.forEach((catalog) => { if (catalog.items) { catalog.items.forEach((item) => { cataItemNamesMap[item.name] = item; }); } }); let newDocksObjs; if (storage['newDocks']) { newDocksObjs = JSON.parse(storage['newDocks']); } let dockNames = JSON.parse(storage['docks']).filter((it) => { return cataItemNamesMap[it] != null; }); // console.log('cataItemNamesMap', cataItemNamesMap); dockNames = dockNames.filter((it) => { let name = it; if (newDocksObjs && newDocksObjs instanceof Array) { newDocksObjs.forEach((item) => { if (item[it] != null) { name = item[it] + '_' + it; } }); } return authorityMap[name] != null || authorityMap['*'] != null; }); storage['docks'] = JSON.stringify(dockNames); dockNames.forEach((it) => { cataItemNamesMap[it].dock = true; this.docks.push(cataItemNamesMap[it]); }); } }, //获取通知信息 getNotifies() { let where = { where: 'status = ?', values: 0, order: 'created_at desc', pageSize: 100, }; http.get('/api/notify/notify/objs/WebConsoleMsg', where).then((response) => { let data = response['data']; if (data) { this.notifies = data; } }); }, //处理产品与服务中用户选中的项目 toggleDock(item: CatalogItem): void { //operate bind data this.operateBindData(item); //operate localStorage data this.operateLocalStorageData(item); }, /** * 当点击"产品与服务"里面的子菜单时, 操作数据绑定对象来控制左侧边栏的图标 * * @param item 当前选中的子菜单 */ operateBindData(item: CatalogItem) { var index = this.docks.findIndex((e) => e.name == item.name); if (index > -1) { this.docks.splice(index, 1); } else { this.docks.push(item); if (item.url.indexOf('http') == 0 || item.isRedirect) { var a = document.createElement('a'); a.setAttribute('href', item.url); a.setAttribute('target', item.url.indexOf('http') == 0 ? '_blank' : '_self'); a.setAttribute('id', 'startTelMedicine'); // 防止反复添加 if (document.getElementById('startTelMedicine')) { document.body.removeChild(document.getElementById('startTelMedicine')); } document.body.appendChild(a); a.click(); } else if (item.url.indexOf('http') == -1 && !item.isRedirect) { // console.log(item); // this.router.navigate([item.url], { // relativeTo: this.route, // queryParams: item.queryParams, // }); } } }, /** * 当点击"产品与服务"里面的子菜单时, 操作做本地存储, 以便下次会话记住左侧菜单项 * * @param item 当前选中的子菜单 */ operateLocalStorageData(item: CatalogItem) { let storage = window.localStorage; if (!storage) { return; } let docks = []; let newDocks = []; let jsonStr = storage['docks']; let newDocksStr = storage['newDocks']; if (jsonStr) { docks = JSON.parse(jsonStr); } if (newDocksStr) { newDocks = JSON.parse(newDocksStr); } let flag = false; //默认未选中 if (item['splitMenuModule']) { newDocks = newDocks.filter((it) => { for (let key in it) { if (key == item.name) { flag = true; return false; } else { return true; } } }); } var index = docks.findIndex((e) => e == item.name); if (index > -1) { docks.splice(index, 1); } else { docks.push(item.name); if (item['splitMenuModule'] && !flag) { let obj = {}; obj[item.name] = item['splitMenuModule']; newDocks.push(obj); } } storage['docks'] = JSON.stringify(docks); storage['newDocks'] = JSON.stringify(newDocks); }, }, }); </script> <style lang="less" scoped> .application { display: block !important; .headerMenu { height: 48px; width: 100%; } .contentMenu { height: calc(100% - 48px); display: flex; .leftMenu { width: 48px; flex-shrink: 0; } } } .content { height: 100%; min-height: 580px; overflow: hidden; width: 100%; } </style>