update: 菜单管理-菜单配置

This commit is contained in:
easy 2023-02-03 18:15:22 +08:00
parent b4850cb168
commit 8df165e916
2 changed files with 71 additions and 35 deletions

View File

@ -22,7 +22,12 @@
</a-tooltip> </a-tooltip>
</div> </div>
<div class="title-func"> <div class="title-func">
<a-button type="primary" ghost>一键拷贝</a-button> <a-button
type="primary"
@click="dialogShow = true"
ghost
>一键拷贝</a-button
>
</div> </div>
</div> </div>
<div class="content"> <div class="content">
@ -37,11 +42,11 @@
</a-input> </a-input>
<a-tree <a-tree
autoExpandParent autoExpandParent
draggable
:tree-data="transfer.data.leftTreeData" :tree-data="transfer.data.leftTreeData"
draggable
> >
<template #title="row"> <template #title="row">
<span>{{ row.name }}</span> <div>{{ row.name }}</div>
</template> </template>
</a-tree> </a-tree>
</div> </div>
@ -77,8 +82,7 @@
draggable draggable
autoExpandParent autoExpandParent
:tree-data="transfer.data.rightTreeData" :tree-data="transfer.data.rightTreeData"
@drop="transfer.onDrop" @drop="transfer.onRightDrop"
@dragenter="transfer.onDragEnter"
> >
<template #title="row"> <template #title="row">
<div <div
@ -110,6 +114,18 @@
</div> </div>
</div> </div>
</div> </div>
<div class="dialogs">
<a-modal
v-model:visible="dialogShow"
title="一键拷贝"
@ok="transfer.copy"
cancelText="取消"
okText="确认"
>
<p>源数据将会覆盖当前的系统菜单数据确定要一键拷贝吗</p>
</a-modal>
</div>
</a-card> </a-card>
</div> </div>
</template> </template>
@ -124,14 +140,14 @@ import {
import { getMenuTree_api } from '@/api/system/menu'; import { getMenuTree_api } from '@/api/system/menu';
import { getSystemPermission as getSystemPermission_api } from '@/api/initHome'; import { getSystemPermission as getSystemPermission_api } from '@/api/initHome';
import { filterMenu } from './utils'; import { filterMenu, getKeys, loop } from './utils';
import BaseTreeData from './baseMenu'; import BaseTreeData from './baseMenu';
import type { import type {
AntTreeNodeDragEnterEvent,
AntTreeNodeDropEvent, AntTreeNodeDropEvent,
TreeDataItem, TreeDataItem,
TreeProps, TreeProps,
} from 'ant-design-vue/es/tree'; } from 'ant-design-vue/es/tree';
const transfer = { const transfer = {
data: reactive({ data: reactive({
// //
@ -142,8 +158,19 @@ const transfer = {
rightSearchValue: '', rightSearchValue: '',
rightTreeData: [] as any[], rightTreeData: [] as any[],
}), }),
leftSourceData: [] as any[],
rightSourceData: [] as any[],
init: () => { init: () => {
//
const sourceMenu = getSystemPermission_api().then((resp: any) => {
const newTree = filterMenu(
resp.result.map((item: any) => JSON.parse(item).id),
BaseTreeData,
);
transfer.leftSourceData = [...newTree];
transfer.data.leftTreeData = newTree;
});
const params = { const params = {
paging: false, paging: false,
terms: [ terms: [
@ -165,35 +192,33 @@ const transfer = {
], ],
}; };
// //
getMenuTree_api(params).then((resp: any) => { const systemMenu = getMenuTree_api(params).then((resp: any) => {
transfer.data.rightTreeData = resp.result; transfer.data.rightTreeData = resp.result;
transfer.data.rightTreeData[2].disabled = true; transfer.rightSourceData = [...resp.result];
});
//
getSystemPermission_api().then((resp: any) => {
const newTree = filterMenu(
resp.result.map((item: any) => JSON.parse(item).id),
BaseTreeData,
);
transfer.data.leftTreeData = newTree;
}); });
//
Promise.all([sourceMenu, systemMenu]).then(() => transfer.updateTree());
},
copy: () => {
transfer.data.rightTreeData = [...toRaw(transfer.data.leftTreeData)];
dialogShow.value = false;
}, },
removeItem: (row: any) => { removeItem: (row: any) => {
transfer.loop( loop(
transfer.data.rightTreeData, transfer.data.rightTreeData,
row.id, row.id,
(item: TreeDataItem, index: number, arr: TreeProps['treeData']) => { (item: TreeDataItem, index: number, arr: TreeProps['treeData']) => {
arr?.splice(index, 1); arr?.splice(index, 1);
}, },
); );
transfer.updateTree();
}, },
onDrop: (info: AntTreeNodeDropEvent) => { onRightDrop: (info: AntTreeNodeDropEvent) => {
const dropKey = info.node.id; const dropKey = info.node.id;
const dragKey = info.dragNode.id; const dragKey = info.dragNode.id;
const dropPos = (info.node.pos && info.node.pos.split('-')) || []; const dropPos = (info.node.pos && info.node.pos.split('-')) || [];
const dropPosition = const dropPosition =
info.dropPosition - Number(dropPos[dropPos.length - 1]); info.dropPosition - Number(dropPos[dropPos.length - 1]);
const loop = transfer.loop;
const data = [...transfer.data.rightTreeData]; const data = [...transfer.data.rightTreeData];
let dragObj: TreeDataItem = { key: '' }; let dragObj: TreeDataItem = { key: '' };
loop( loop(
@ -245,23 +270,13 @@ const transfer = {
} }
transfer.data.rightTreeData = data; transfer.data.rightTreeData = data;
}, },
onDragEnter: (info: AntTreeNodeDragEnterEvent) => { updateTree: () => {
// console.log('onDragEnter', info); console.log(getKeys(transfer.data.rightTreeData));
},
//
loop: (data: TreeProps['treeData'], id: string | number, callback: any) => {
data?.forEach((item, index) => {
if (item.id === id) {
return callback(item, index, data);
}
if (item.children) {
return transfer.loop(item.children, id, callback);
}
});
}, },
}; };
transfer.init(); transfer.init();
const dialogShow = ref<boolean>(false);
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>

View File

@ -1,3 +1,5 @@
import { TreeProps } from "ant-design-vue";
/** /**
* *
*/ */
@ -15,3 +17,22 @@ export const filterMenu = (permissions: string[], menus: any[]) => {
return isShow || !!item.children?.length; return isShow || !!item.children?.length;
}); });
}; };
// 在树形结构中对id进行匹配通过callback对匹配id的对象进行操作
export const loop= (data: TreeProps['treeData'], id: string | number, callback: any) => {
data?.forEach((item, index) => {
if (item.id === id) {
return callback(item, index, data);
}
if (item.children) {
return loop(item.children, id, callback);
}
});
}
//
export const getKeys = (data: any[]): (string | number)[] => {
return data.reduce((pre: (string | number)[], next: any) => {
const childrenKeys = next.children ? getKeys(next.children) : [];
return [...pre, next.code, ...childrenKeys];
}, []);
}