feat: 菜单根据切换核心网显示

This commit is contained in:
TsMask
2025-06-13 19:48:09 +08:00
parent 4167428c10
commit 859615fecc
7 changed files with 87 additions and 20 deletions

View File

@@ -22,6 +22,7 @@ import {
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import useLayoutStore from '@/store/modules/layout'; import useLayoutStore from '@/store/modules/layout';
import useAppStore from '@/store/modules/app'; import useAppStore from '@/store/modules/app';
import useCoreStore from '@/store/modules/core';
import useNeStore from '@/store/modules/ne'; import useNeStore from '@/store/modules/ne';
import useRouterStore from '@/store/modules/router'; import useRouterStore from '@/store/modules/router';
import useTabsStore from '@/store/modules/tabs'; import useTabsStore from '@/store/modules/tabs';
@@ -35,7 +36,6 @@ import { parseUrlPath } from '@/plugins/file-static-url';
const { proConfig, waterMarkContent } = useLayoutStore(); const { proConfig, waterMarkContent } = useLayoutStore();
const { t, currentLocale } = useI18n(); const { t, currentLocale } = useI18n();
const routerStore = useRouterStore(); const routerStore = useRouterStore();
const neListStore = useNeStore();
const tabsStore = useTabsStore(); const tabsStore = useTabsStore();
const appStore = useAppStore(); const appStore = useAppStore();
const router = useRouter(); const router = useRouter();
@@ -80,9 +80,12 @@ const menuData = computed(() => {
rootRoute.children = children; rootRoute.children = children;
} }
} }
const neTypes = neListStore.getNeSelectOtions.map(v => v.value);
let routes = clearMenuItem(router.getRoutes()); let routes = clearMenuItem(router.getRoutes());
routes = routerStore.clearMenuItemByNeList(routes, neTypes); const coreUid = useCoreStore().getCurrentCoreUid;
const neTypes = useNeStore()
.fnNeSelectOtions(coreUid)
.map(v => v.value);
routes = routerStore.clearMenuItemByNeList(routes, coreUid, neTypes);
const { menuData } = getMenuData(routes); const { menuData } = getMenuData(routes);
return menuData; return menuData;
}); });
@@ -311,7 +314,7 @@ onUnmounted(() => {
<template #headerContentRender></template> <template #headerContentRender></template>
<!--插槽-渲染顶部内容区域仅布局side有效--> <!--插槽-渲染顶部内容区域仅布局side有效-->
<template #menuHeaderExtraRender> <template #menuHeaderExtraRender>
<CoreSelect></CoreSelect> <CoreSelect></CoreSelect>
</template> </template>

View File

@@ -6,7 +6,9 @@ const coreStore = useCoreStore();
const { t } = useI18n(); const { t } = useI18n();
/**当前选中 */ /**当前选中 */
const coreValue = ref(coreStore.current?.value || 'Global'); const coreValue = ref(
coreStore.current?.value == 'all' ? 'Global' : coreStore.current?.value
);
/**选择列表数据 */ /**选择列表数据 */
const coreOtions = ref(coreStore.getSelectOtions); const coreOtions = ref(coreStore.getSelectOtions);
/**选择过滤名称 */ /**选择过滤名称 */

View File

@@ -27,6 +27,11 @@ const useCoreStore = defineStore('core', {
coreSelectOtions: [], coreSelectOtions: [],
}), }),
getters: { getters: {
/**当前核心网Uid */
getCurrentCoreUid(): string {
return this.current.value;
},
/**选择器 */
getSelectOtions(): Record<string, any>[] { getSelectOtions(): Record<string, any>[] {
return this.coreSelectOtions; return this.coreSelectOtions;
}, },

View File

@@ -11,16 +11,16 @@ type NeList = {
/**网元列表 */ /**网元列表 */
neList: Record<string, any>[]; neList: Record<string, any>[];
/**级联options树结构 */ /**级联options树结构 */
neCascaderOptions: Record<string, any>[]; neCascaderOptions: Map<string, Record<string, any>[]>;
/**选择器单级父类型 */ /**选择器单级父类型 */
neSelectOtions: Record<string, any>[]; neSelectOtions: Map<string, Record<string, any>[]>;
}; };
const useNeStore = defineStore('ne_list', { const useNeStore = defineStore('ne_list', {
state: (): NeList => ({ state: (): NeList => ({
neList: [], neList: [],
neCascaderOptions: [], neCascaderOptions: new Map(),
neSelectOtions: [], neSelectOtions: new Map(),
}), }),
getters: { getters: {
/** /**
@@ -72,33 +72,71 @@ const useNeStore = defineStore('ne_list', {
// 原始列表 // 原始列表
this.neList = JSON.parse(JSON.stringify(res.data)); this.neList = JSON.parse(JSON.stringify(res.data));
// 转级联数据
const options = parseDataToOptions( const options = parseDataToOptions(
res.data, res.data,
'neType', 'neType',
'neName', 'neName',
'neId' 'neUid'
); );
this.neCascaderOptions = options;
// 转选择器单级父类型 for (const item of options) {
this.neSelectOtions = options.map(item => { const k = item.coreUid;
return { // 转级联数据
let cascaderMap = this.neCascaderOptions.get(k);
if (cascaderMap) {
cascaderMap.push(item);
} else {
cascaderMap = [item];
}
this.neCascaderOptions.set(k, cascaderMap);
// 转选择器单级父类型
let selectMap = this.neSelectOtions.get(k);
const selectItem = {
label: item.label, label: item.label,
value: item.value, value: item.value,
}; };
}); if (selectMap) {
selectMap.push(selectItem);
} else {
selectMap = [selectItem];
}
this.neSelectOtions.set(k, selectMap);
}
} }
return res; return res;
}, },
/**
* 获取级联options树结构
* @param coreUid 核心网元uid
*/
fnNeCascaderOptions(coreUid: string) {
const m = this.neCascaderOptions.get(coreUid);
if (!m) {
return [];
}
return m;
},
/**
* 获取选择器单级父类型
* @param coreUid 核心网元uid
*/
fnNeSelectOtions(coreUid: string) {
const m = this.neSelectOtions.get(coreUid);
if (!m) {
return [];
}
return m;
},
/** /**
* 含有网元 * 含有网元
* @param coreUid 核心网元uid
* @param metaNeType ['udm', 'ims', 'udm+ims', 'SGWC'] 支持大小写 * @param metaNeType ['udm', 'ims', 'udm+ims', 'SGWC'] 支持大小写
* @returns boolean * @returns boolean
*/ */
fnHasNe(metaNeType: string[]) { fnHasNe(coreUid: string, metaNeType: string[]) {
if (this.neList.length > 0) { if (this.neList.length > 0) {
const neTypes = this.neSelectOtions.map(item => item.value); const neTypes = this.fnNeSelectOtions(coreUid).map(item => item.value);
let match = false; // 匹配 let match = false; // 匹配
for (const netype of metaNeType) { for (const netype of metaNeType) {
if (netype.indexOf('+') > -1) { if (netype.indexOf('+') > -1) {

View File

@@ -58,16 +58,28 @@ const useRouterStore = defineStore('router', {
/** /**
* 根据网元类型过滤菜单 * 根据网元类型过滤菜单
* @param routes 经过clearMenuItem(router.getRoutes())处理 * @param routes 经过clearMenuItem(router.getRoutes())处理
* @param coreUid 核心网元uid
* @param neTypes 网元类型 * @param neTypes 网元类型
* @returns 过滤后的菜单 * @returns 过滤后的菜单
*/ */
clearMenuItemByNeList( clearMenuItemByNeList(
routes: RouteRecord[] | RouteRecordRaw[], routes: RouteRecord[] | RouteRecordRaw[],
coreUid: string,
neTypes: string[] neTypes: string[]
): RouteRecordRaw[] { ): RouteRecordRaw[] {
return routes return routes
.map((item: RouteRecord | RouteRecordRaw) => { .map((item: RouteRecord | RouteRecordRaw) => {
const finalItem = { ...item }; const finalItem = { ...item };
// 过滤核心网菜单
if (coreUid.length < 8 && finalItem.meta?.core == true) {
// 全局 网元菜单
return null;
}
if (coreUid.length == 8 && finalItem.meta?.core == false) {
// 核心网 非网元菜单
return null;
}
// 过滤网元类型 // 过滤网元类型
if ( if (
Array.isArray(finalItem.meta?.neType) && Array.isArray(finalItem.meta?.neType) &&
@@ -96,6 +108,7 @@ const useRouterStore = defineStore('router', {
if (finalItem.children && finalItem.children.length > 0) { if (finalItem.children && finalItem.children.length > 0) {
const children = this.clearMenuItemByNeList( const children = this.clearMenuItemByNeList(
finalItem.children, finalItem.children,
coreUid,
neTypes neTypes
); );
// 如果子菜单都被过滤掉了,就不显示 // 如果子菜单都被过滤掉了,就不显示

View File

@@ -9,6 +9,11 @@ declare module 'vue-router' {
permissions?: string[]; permissions?: string[];
/**角色 */ /**角色 */
roles?: string[]; roles?: string[];
/**租户标识 */
tenant?: boolean;
/**核心网标识 */
core?: boolean;
/**网元类型信息 */ /**网元类型信息 */
neType?: string[]; neType?: string[];
} }

View File

@@ -8,13 +8,13 @@ import BackupModal from '@/views/ne/neConfigBackup/components/BackupModal.vue';
import { parseDateToStr } from '@/utils/date-utils'; import { parseDateToStr } from '@/utils/date-utils';
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import useI18n from '@/hooks/useI18n'; import useI18n from '@/hooks/useI18n';
import useCoreStore from '@/store/modules/core';
import useNeStore from '@/store/modules/ne'; import useNeStore from '@/store/modules/ne';
import saveAs from 'file-saver'; import saveAs from 'file-saver';
import { delFile, getFile, listFile } from '@/api/tool/file'; import { delFile, getFile, listFile } from '@/api/tool/file';
import { parseSizeFromFile } from '@/utils/parse-utils'; import { parseSizeFromFile } from '@/utils/parse-utils';
import { pushBackupFTP } from '@/api/neData/backup'; import { pushBackupFTP } from '@/api/neData/backup';
const { t } = useI18n(); const { t } = useI18n();
const neListStore = useNeStore();
/**文件来源 */ /**文件来源 */
let sourceState = reactive({ let sourceState = reactive({
@@ -306,9 +306,10 @@ function fnSyncFileToFTP(fileName: string) {
} }
onMounted(() => { onMounted(() => {
const coreUid = useCoreStore().getCurrentCoreUid;
sourceState.list = sourceState.list.filter(item => { sourceState.list = sourceState.list.filter(item => {
if (!item.neType) return true; if (!item.neType) return true;
return neListStore.fnHasNe([item.neType]); return useNeStore().fnHasNe(coreUid, [item.neType]);
}); });
}); });
</script> </script>