From 6daedd1de57b9fc04c0457acaef3403a06ba13ef Mon Sep 17 00:00:00 2001 From: dap <15891557205@163.com> Date: Sat, 24 May 2025 12:45:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=8F=9C=E5=8D=95=E7=BA=A7=E8=81=94?= =?UTF-8?q?=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/api/system/menu/index.ts | 9 +++++ apps/web-antd/src/views/system/menu/data.tsx | 1 + apps/web-antd/src/views/system/menu/index.vue | 40 ++++++++++++++++--- 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/apps/web-antd/src/api/system/menu/index.ts b/apps/web-antd/src/api/system/menu/index.ts index 0381449d..e42fd0fe 100644 --- a/apps/web-antd/src/api/system/menu/index.ts +++ b/apps/web-antd/src/api/system/menu/index.ts @@ -81,3 +81,12 @@ export function tenantPackageMenuTreeSelect(packageId: ID) { `${Api.tenantPackageMenuTreeselect}/${packageId}`, ); } + +/** + * 批量删除菜单 + * @param menuIds 菜单ids + * @returns void + */ +export function menuCascadeRemove(menuIds: IDS) { + return requestClient.deleteWithMsg(`${Api.root}/cascade/${menuIds}`); +} diff --git a/apps/web-antd/src/views/system/menu/data.tsx b/apps/web-antd/src/views/system/menu/data.tsx index f29cc4f3..d209ac2e 100644 --- a/apps/web-antd/src/views/system/menu/data.tsx +++ b/apps/web-antd/src/views/system/menu/data.tsx @@ -219,6 +219,7 @@ export const drawerSchema: FormSchemaGetter = () => [ fieldName: 'orderNum', help: '排序, 数字越小越靠前', label: '显示排序', + defaultValue: 0, rules: 'required', }, { diff --git a/apps/web-antd/src/views/system/menu/index.vue b/apps/web-antd/src/views/system/menu/index.vue index 9be81bcb..08b4a0b5 100644 --- a/apps/web-antd/src/views/system/menu/index.vue +++ b/apps/web-antd/src/views/system/menu/index.vue @@ -4,16 +4,16 @@ import type { VbenFormProps } from '@vben/common-ui'; import type { VxeGridProps } from '#/adapter/vxe-table'; import type { Menu } from '#/api/system/menu/model'; -import { computed } from 'vue'; +import { computed, ref } from 'vue'; import { useAccess } from '@vben/access'; import { Fallback, Page, useVbenDrawer } from '@vben/common-ui'; -import { eachTree, getVxePopupContainer } from '@vben/utils'; +import { eachTree, getVxePopupContainer, treeToList } from '@vben/utils'; -import { Popconfirm, Space } from 'ant-design-vue'; +import { Popconfirm, Space, Switch, Tooltip } from 'ant-design-vue'; import { preserveTreeTableState, useVbenVxeGrid } from '#/adapter/vxe-table'; -import { menuList, menuRemove } from '#/api/system/menu'; +import { menuCascadeRemove, menuList, menuRemove } from '#/api/system/menu'; import { columns, querySchema } from './data'; import menuDrawer from './menu-drawer.vue'; @@ -111,13 +111,35 @@ async function handleEdit(record: Menu) { drawerApi.open(); } +/** + * 是否级联删除 + */ +const cascadingDeletion = ref(false); async function handleDelete(row: Menu) { await preserveTreeTableState(tableApi, async () => { - await menuRemove([row.menuId]); + if (cascadingDeletion.value) { + // 级联删除 + const menuAndChildren: Menu[] = treeToList([row], { id: 'menuId' }); + await menuCascadeRemove(menuAndChildren.map((item) => item.menuId)); + } else { + // 单删除 + await menuRemove([row.menuId]); + } await tableApi.query(); }); } +function removeConfirmTitle(row: Menu) { + if (!cascadingDeletion.value) { + return `是否确认删除 [${row.menuName}] ?`; + } + const menuAndChildren = treeToList([row], { id: 'menuId' }); + if (menuAndChildren.length === 1) { + return `是否确认删除 [${row.menuName}] ?`; + } + return `是否确认删除 [${row.menuName}] 及 [${menuAndChildren.length - 1}]个子项目 ?`; +} + /** * 编辑/添加成功后刷新表格 */ @@ -149,6 +171,12 @@ const isAdmin = computed(() => {