From 6ae03a9fc97366de3ff5bab5b34fa3c6ed35eb5d Mon Sep 17 00:00:00 2001 From: jackhoo_98 Date: Fri, 31 Mar 2023 21:21:35 +0800 Subject: [PATCH] fix: bug#11271 --- src/views/system/Menu/Setting/index.vue | 49 ++++++++++++++++++++++++- src/views/system/Menu/Setting/utils.ts | 19 +++++++--- 2 files changed, 60 insertions(+), 8 deletions(-) diff --git a/src/views/system/Menu/Setting/index.vue b/src/views/system/Menu/Setting/index.vue index 5ec65f93..68535772 100644 --- a/src/views/system/Menu/Setting/index.vue +++ b/src/views/system/Menu/Setting/index.vue @@ -103,10 +103,55 @@ const params = { ], }; +// 过滤子级空children +const filterAndClean = (data: any) => { + // 如果 data 是一个数组,则对每个元素递归调用此函数 + if (Array.isArray(data)) { + return data + .filter((item) => item !== null) // 过滤掉 null 元素 + .map((item: any) => filterAndClean(item)); // 递归调用此函数 + } + + // 如果 data 是一个对象,则递归调用此函数来清除其子元素 + if (typeof data === 'object') { + let cleanedChildren = filterAndClean(data.children); // 递归清除子元素 + if (Array.isArray(cleanedChildren)) { + cleanedChildren = cleanedChildren.filter((i) => i); + } + + if (cleanedChildren !== undefined) { + data.children = cleanedChildren; + } else { + delete data.children; // 如果 children 是 undefined,则将其删除 + } + } + return data; +}; + const handleOk = async () => { + const { arrMap, rootSet } = developArrToMap( + cloneDeep(treeData.value), + false, + true, + ); + const dataMap = new Map(); + // 过滤选中菜单的map + selectedKeys.value.forEach((item: string) => { + if (arrMap.has(item)) { + dataMap.set(item, arrMap.get(item)); + } + }); + + const _saveDataMap = { + arrMap: dataMap, + rootSet, + }; + + const dataArr = filterAndClean(mergeMapToArr(_saveDataMap, _saveDataMap)); + loading.value = true; - const res = await updateMenus(treeData.value); - if (res.status === 200) { + const res = await updateMenus(dataArr).catch(() => {}); + if (res?.status === 200) { onlyMessage('操作成功', 'success'); } loading.value = false; diff --git a/src/views/system/Menu/Setting/utils.ts b/src/views/system/Menu/Setting/utils.ts index 14090d68..ce4c9098 100644 --- a/src/views/system/Menu/Setting/utils.ts +++ b/src/views/system/Menu/Setting/utils.ts @@ -31,12 +31,12 @@ export const filterMenu = (permissions: string[], menus: any[]) => { export const mergeMapToArr = (baseMenuData: any, systemMenuData: any) => { const updataArr = (r: any) => { for (let i = 0; i < r.length; i++) { - const child = r[i].children; + let child = r[i].children; if (child) { updataArr(child); } r[i] = newMap.get(r[i].code); - delete r[i].parentCode; + r[i]?.parentCode && delete r[i].parentCode; } }; const root: any = []; @@ -45,7 +45,7 @@ export const mergeMapToArr = (baseMenuData: any, systemMenuData: any) => { ...new Set([...baseMenuData?.rootSet, ...systemMenuData.rootSet]), ]; newRootArr.forEach((item: any) => { - root.push(newMap.get(item)); + newMap.has(item) && root.push(newMap.get(item)); }); updataArr(root); return root; @@ -55,9 +55,10 @@ export const mergeMapToArr = (baseMenuData: any, systemMenuData: any) => { * 平铺菜单 * @param value 默认菜单以及查询系统菜单 baseMenu systemMenu * @param checked 查询系统菜单传true + * @param save 保存时传true * @returns 平铺菜单Map、根菜单名、系统选中的keys */ -export const developArrToMap = (Menu: any, checked = false) => { +export const developArrToMap = (Menu: any, checked = false, save = false) => { const rootSet = new Set(); const arrMap = new Map(); const checkedKeys: any = []; @@ -65,10 +66,16 @@ export const developArrToMap = (Menu: any, checked = false) => { arr.forEach((item: any) => { item.title = item.code; item.key = item.code; - if (checked || item?.checked) { - item.checked = item?.checked || checked; + if (save) { + delete item.checked; //保存时删除 checked 字段 checkedKeys.push(item.code); + } else { + if (checked || item?.checked) { + item.checked = item?.checked || checked; + checkedKeys.push(item.code); + } } + arrMap.set(item.code, item); if (parentCode === 'root') { rootSet.add(item.code); //处理根菜单