feat: 根据网元显示特有菜单

This commit is contained in:
TsMask
2025-05-07 15:45:54 +08:00
parent 2c2ca82442
commit d3efefe7c5
58 changed files with 1110 additions and 1377 deletions

View File

@@ -1,29 +1,36 @@
import { defineStore } from 'pinia';
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import {
RESULT_CODE_SUCCESS,
RESULT_MSG_SUCCESS,
} from '@/constants/result-constants';
import { listAllNeInfo } from '@/api/ne/neInfo';
import { parseDataToOptions } from '@/utils/parse-tree-utils';
import { getNePerformanceList } from '@/api/perfManage/taskManage';
/**网元信息类型 */
type NeInfo = {
/**网元列表信息类型 */
type NeList = {
/**网元列表 */
neList: Record<string, any>[];
/**级联options树结构 */
neCascaderOptions: Record<string, any>[];
/**选择器单级父类型 */
neSelectOtions: Record<string, any>[];
/**性能测量数据集 */
perMeasurementList: Record<string, any>[];
};
const useNeInfoStore = defineStore('neinfo', {
state: (): NeInfo => ({
const useNeListStore = defineStore('ne_list', {
state: (): NeList => ({
neList: [],
neCascaderOptions: [],
neSelectOtions: [],
perMeasurementList: [],
}),
getters: {
/**
*
* @param state
* @returns options
*/
getNeList(state) {
return state.neList;
},
/**
* options树结构
* @param state
@@ -35,7 +42,7 @@ const useNeInfoStore = defineStore('neinfo', {
/**
*
* @param state
* @returns options
* @returns options
*/
getNeSelectOtions(state) {
return state.neSelectOtions;
@@ -43,19 +50,23 @@ const useNeInfoStore = defineStore('neinfo', {
},
actions: {
// 刷新网元列表
async fnRefreshNelist() {
async fnNelistRefresh() {
this.neList = [];
const res = await this.fnNelist();
return res;
return await this.fnNelist();
},
// 获取网元列表
async fnNelist() {
// 有数据不请求
if (this.neList.length > 0) {
return { code: RESULT_CODE_SUCCESS, data: this.neList, msg: 'success' };
return {
code: RESULT_CODE_SUCCESS,
msg: RESULT_MSG_SUCCESS['en_US'],
data: this.neList,
};
}
const res = await listAllNeInfo({
bandStatus: false,
bandHost: false,
});
if (res.code === RESULT_CODE_SUCCESS) {
// 原始列表
@@ -71,23 +82,38 @@ const useNeInfoStore = defineStore('neinfo', {
this.neCascaderOptions = options;
// 转选择器单级父类型
this.neSelectOtions = options.map(item => item);
this.neSelectOtions = options.map(item => {
return {
label: item.label,
value: item.value,
};
});
}
return res;
},
// 获取性能测量数据集列表
async fnNeTaskPerformance() {
// 有数据不请求
if (this.perMeasurementList.length > 0) {
return { code: RESULT_CODE_SUCCESS, data: this.perMeasurementList, msg: 'success' };
// 含有网元
fnHasNe(metaNeType: string[]) {
if (this.neList.length > 0) {
const neTypes = this.neSelectOtions.map(item => item.value);
let match = false; // 匹配
for (const netype of metaNeType) {
if (netype.indexOf('+') > -1) {
metaNeType = netype.split('+');
match = true;
break;
}
}
if (match) {
// 同时匹配
return metaNeType.every(item => neTypes.includes(item));
}
// 有一种
return metaNeType.some(item => neTypes.includes(item));
}
const res = await getNePerformanceList();
if (res.code === RESULT_CODE_SUCCESS) {
this.perMeasurementList = res.data;
}
return res;
return false;
},
},
});
export default useNeInfoStore;
export default useNeListStore;

View File

@@ -3,6 +3,7 @@ import type {
RouteComponent,
RouteLocationRaw,
RouteMeta,
RouteRecord,
RouteRecordRaw,
} from 'vue-router';
import { getRouter } from '@/api/auth';
@@ -54,6 +55,62 @@ const useRouterStore = defineStore('router', {
}
return [];
},
/**
* 根据网元类型过滤菜单
* @param routes 经过clearMenuItem(router.getRoutes())处理
* @param neTypes 网元类型
* @returns 过滤后的菜单
*/
clearMenuItemByNeList(
routes: RouteRecord[] | RouteRecordRaw[],
neTypes: string[]
): RouteRecordRaw[] {
return routes
.map((item: RouteRecord | RouteRecordRaw) => {
const finalItem = { ...item };
// 过滤网元类型
if (
Array.isArray(finalItem.meta?.neType) &&
finalItem.meta?.neType.length > 0
) {
let metaNeType: string[] = finalItem.meta.neType;
let match = false; // 匹配
for (const netype of metaNeType) {
if (netype.indexOf('+') > -1) {
metaNeType = netype.split('+');
match = true;
break;
}
}
if (match && !metaNeType.every(item => neTypes.includes(item))) {
// 同时匹配
return null;
} else if (!metaNeType.some(item => neTypes.includes(item))) {
// 有一种
return null;
}
}
// 有子菜单进行递归
if (finalItem.children && finalItem.children.length > 0) {
const children = this.clearMenuItemByNeList(
finalItem.children,
neTypes
);
// 如果子菜单都被过滤掉了,就不显示
if (children.length === 0) {
return null;
}
finalItem.children = children;
return finalItem;
}
delete finalItem.children;
return finalItem;
})
.filter(item => item) as RouteRecordRaw[];
},
},
});
@@ -77,7 +134,7 @@ type RecordRaws = {
*/
function buildRouters(recordRaws: RecordRaws[]): RouteRecordRaw[] {
const routers: RouteRecordRaw[] = [];
for (const item of recordRaws) {
for (const item of recordRaws) {
// 路由页面组件
let component: RouteComponent = {};
if (item.component) {