From 995400a98f3816bcc33b8575e01e77f5014fb899 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Mon, 16 Jun 2025 21:01:19 +0800 Subject: [PATCH 01/16] =?UTF-8?q?feat:=20=E3=80=90ele=E3=80=91=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E6=96=B0=E5=A2=9E=E6=89=B9=E9=87=8F=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/api/system/tenant-package/index.ts | 7 ++ apps/web-ele/src/api/system/tenant/index.ts | 7 ++ apps/web-ele/src/views/system/tenant/data.ts | 4 + .../web-ele/src/views/system/tenant/index.vue | 88 ++++++++++++++----- .../src/views/system/tenantPackage/data.ts | 4 + .../src/views/system/tenantPackage/index.vue | 68 +++++++++++--- 6 files changed, 142 insertions(+), 36 deletions(-) diff --git a/apps/web-ele/src/api/system/tenant-package/index.ts b/apps/web-ele/src/api/system/tenant-package/index.ts index 5066cea98..53be78f73 100644 --- a/apps/web-ele/src/api/system/tenant-package/index.ts +++ b/apps/web-ele/src/api/system/tenant-package/index.ts @@ -49,6 +49,13 @@ export function deleteTenantPackage(id: number) { return requestClient.delete(`/system/tenant-package/delete?id=${id}`); } +/** 批量删除租户套餐 */ +export function deleteTenantPackageList(ids: number[]) { + return requestClient.delete( + `/system/tenant-package/delete-list?ids=${ids.join(',')}`, + ); +} + /** 获取租户套餐精简信息列表 */ export function getTenantPackageList() { return requestClient.get( diff --git a/apps/web-ele/src/api/system/tenant/index.ts b/apps/web-ele/src/api/system/tenant/index.ts index 3bed9249c..c18a4dfab 100644 --- a/apps/web-ele/src/api/system/tenant/index.ts +++ b/apps/web-ele/src/api/system/tenant/index.ts @@ -61,6 +61,13 @@ export function deleteTenant(id: number) { return requestClient.delete(`/system/tenant/delete?id=${id}`); } +/** 批量删除租户 */ +export function deleteTenantList(ids: number[]) { + return requestClient.delete( + `/system/tenant/delete-list?ids=${ids.join(',')}`, + ); +} + /** 导出租户 */ export function exportTenant(params: any) { return requestClient.download('/system/tenant/export-excel', { diff --git a/apps/web-ele/src/views/system/tenant/data.ts b/apps/web-ele/src/views/system/tenant/data.ts index 16c165414..8facb2a25 100644 --- a/apps/web-ele/src/views/system/tenant/data.ts +++ b/apps/web-ele/src/views/system/tenant/data.ts @@ -167,6 +167,10 @@ export function useGridColumns( getPackageName?: (packageId: number) => string | undefined, ): VxeTableGridOptions['columns'] { return [ + { + type: 'checkbox', + width: 40, + }, { field: 'id', title: '租户编号', diff --git a/apps/web-ele/src/views/system/tenant/index.vue b/apps/web-ele/src/views/system/tenant/index.vue index 1eb2d6f14..f692af9fc 100644 --- a/apps/web-ele/src/views/system/tenant/index.vue +++ b/apps/web-ele/src/views/system/tenant/index.vue @@ -9,13 +9,17 @@ import type { SystemTenantPackageApi } from '#/api/system/tenant-package'; import { onMounted, ref } from 'vue'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; -import { Download, Plus } from '@vben/icons'; -import { downloadFileFromBlobPart } from '@vben/utils'; +import { downloadFileFromBlobPart, isEmpty } from '@vben/utils'; -import { ElButton, ElLoading, ElMessage } from 'element-plus'; +import { ElLoading, ElMessage } from 'element-plus'; -import { useVbenVxeGrid } from '#/adapter/vxe-table'; -import { deleteTenant, exportTenant, getTenantPage } from '#/api/system/tenant'; +import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; +import { + deleteTenant, + deleteTenantList, + exportTenant, + getTenantPage, +} from '#/api/system/tenant'; import { getTenantPackageList } from '#/api/system/tenant-package'; import { $t } from '#/locales'; @@ -69,13 +73,36 @@ async function onDelete(row: SystemTenantApi.Tenant) { await deleteTenant(row.id as number); ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); onRefresh(); - } catch { - // 错误处理 } finally { loading.close(); } } +/** 批量删除租户 */ +async function onDeleteBatch() { + const loading = ElLoading.service({ + lock: true, + text: $t('ui.actionMessage.deleting'), + background: 'rgba(0, 0, 0, 0.7)', + }); + try { + await deleteTenantList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); + } finally { + loading.close(); + } +} + +const checkedIds = ref([]); +function handleRowCheckboxChange({ + records, +}: { + records: SystemTenantApi.Tenant[]; +}) { + checkedIds.value = records.map((item) => item.id as number); +} + /** 表格操作按钮的回调函数 */ function onActionClick({ code, @@ -120,6 +147,10 @@ const [Grid, gridApi] = useVbenVxeGrid({ search: true, }, } as VxeTableGridOptions, + gridEvents: { + checkboxAll: handleRowCheckboxChange, + checkboxChange: handleRowCheckboxChange, + }, }); /** 初始化 */ @@ -136,23 +167,32 @@ onMounted(async () => { diff --git a/apps/web-ele/src/views/system/tenantPackage/data.ts b/apps/web-ele/src/views/system/tenantPackage/data.ts index 5f1bcf9fd..93e7aea17 100644 --- a/apps/web-ele/src/views/system/tenantPackage/data.ts +++ b/apps/web-ele/src/views/system/tenantPackage/data.ts @@ -95,6 +95,10 @@ export function useGridColumns( onActionClick: OnActionClickFn, ): VxeTableGridOptions['columns'] { return [ + { + type: 'checkbox', + width: 40, + }, { field: 'id', title: '套餐编号', diff --git a/apps/web-ele/src/views/system/tenantPackage/index.vue b/apps/web-ele/src/views/system/tenantPackage/index.vue index 8b2634242..246cd5cf7 100644 --- a/apps/web-ele/src/views/system/tenantPackage/index.vue +++ b/apps/web-ele/src/views/system/tenantPackage/index.vue @@ -5,14 +5,17 @@ import type { } from '#/adapter/vxe-table'; import type { SystemTenantPackageApi } from '#/api/system/tenant-package'; +import { ref } from 'vue'; + import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; -import { Plus } from '@vben/icons'; +import { isEmpty } from '@vben/utils'; -import { ElButton, ElMessage } from 'element-plus'; +import { ElMessage } from 'element-plus'; -import { useVbenVxeGrid } from '#/adapter/vxe-table'; +import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { deleteTenantPackage, + deleteTenantPackageList, getTenantPackagePage, } from '#/api/system/tenant-package'; import { $t } from '#/locales'; @@ -52,11 +55,37 @@ async function onDelete(row: SystemTenantPackageApi.TenantPackage) { loadingInstance.close(); ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); onRefresh(); - } catch { + } finally { loadingInstance.close(); } } +/** 批量删除租户套餐 */ +async function onDeleteBatch() { + const loadingInstance = ElMessage({ + message: $t('ui.actionMessage.deleting'), + type: 'info', + duration: 0, + }); + try { + await deleteTenantPackageList(checkedIds.value); + loadingInstance.close(); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); + } finally { + loadingInstance.close(); + } +} + +const checkedIds = ref([]); +function handleRowCheckboxChange({ + records, +}: { + records: SystemTenantPackageApi.TenantPackage[]; +}) { + checkedIds.value = records.map((item) => item.id as number); +} + /** 表格操作按钮的回调函数 */ function onActionClick({ code, @@ -102,6 +131,10 @@ const [Grid, gridApi] = useVbenVxeGrid({ search: true, }, } as VxeTableGridOptions, + gridEvents: { + checkboxAll: handleRowCheckboxChange, + checkboxChange: handleRowCheckboxChange, + }, }); @@ -114,14 +147,25 @@ const [Grid, gridApi] = useVbenVxeGrid({ -- Gitee From 879cad366f2ec5c019784e183ecf945e05c20f1e Mon Sep 17 00:00:00 2001 From: puhui999 Date: Mon, 16 Jun 2025 21:13:01 +0800 Subject: [PATCH 02/16] =?UTF-8?q?feat:=20=E3=80=90ele=E3=80=91=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=AE=A1=E7=90=86=E6=96=B0=E5=A2=9E=E6=89=B9=E9=87=8F?= =?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-ele/src/api/system/user/index.ts | 5 +++ apps/web-ele/src/views/system/user/data.ts | 4 ++ apps/web-ele/src/views/system/user/index.vue | 41 ++++++++++++++++++-- 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/apps/web-ele/src/api/system/user/index.ts b/apps/web-ele/src/api/system/user/index.ts index 52d8cdd2e..1f51a5bc7 100644 --- a/apps/web-ele/src/api/system/user/index.ts +++ b/apps/web-ele/src/api/system/user/index.ts @@ -49,6 +49,11 @@ export function deleteUser(id: number) { return requestClient.delete(`/system/user/delete?id=${id}`); } +/** 批量删除用户 */ +export function deleteUserList(ids: number[]) { + return requestClient.delete(`/system/user/delete-list?ids=${ids.join(',')}`); +} + /** 导出用户 */ export function exportUser(params: any) { return requestClient.download('/system/user/export', params); diff --git a/apps/web-ele/src/views/system/user/data.ts b/apps/web-ele/src/views/system/user/data.ts index b2cbd00bd..a20318be0 100644 --- a/apps/web-ele/src/views/system/user/data.ts +++ b/apps/web-ele/src/views/system/user/data.ts @@ -285,6 +285,10 @@ export function useGridColumns( ) => PromiseLike, ): VxeTableGridOptions['columns'] { return [ + { + type: 'checkbox', + width: 40, + }, { field: 'id', title: '用户编号', diff --git a/apps/web-ele/src/views/system/user/index.vue b/apps/web-ele/src/views/system/user/index.vue index 0673493d9..13ec5428c 100644 --- a/apps/web-ele/src/views/system/user/index.vue +++ b/apps/web-ele/src/views/system/user/index.vue @@ -6,13 +6,14 @@ import type { SystemUserApi } from '#/api/system/user'; import { ref } from 'vue'; import { confirm, DocAlert, Page, useVbenModal } from '@vben/common-ui'; -import { downloadFileFromBlobPart } from '@vben/utils'; +import { downloadFileFromBlobPart, isEmpty } from '@vben/utils'; import { ElLoading, ElMessage } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { deleteUser, + deleteUserList, exportUser, getUserPage, updateUserStatus, @@ -90,13 +91,35 @@ async function onDelete(row: SystemUserApi.User) { await deleteUser(row.id as number); ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.username])); onRefresh(); - } catch { - // 异常处理 } finally { loadingInstance.close(); } } +/** 批量删除用户 */ +async function onDeleteBatch() { + const loadingInstance = ElLoading.service({ + text: $t('ui.actionMessage.deleting'), + fullscreen: true, + }); + try { + await deleteUserList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); + } finally { + loadingInstance.close(); + } +} + +const checkedIds = ref([]); +function handleRowCheckboxChange({ + records, +}: { + records: SystemUserApi.User[]; +}) { + checkedIds.value = records.map((item) => item.id as number); +} + /** 重置密码 */ function onResetPassword(row: SystemUserApi.User) { resetPasswordModalApi.setData(row).open(); @@ -161,6 +184,10 @@ const [Grid, gridApi] = useVbenVxeGrid({ search: true, }, } as VxeTableGridOptions, + gridEvents: { + checkboxAll: handleRowCheckboxChange, + checkboxChange: handleRowCheckboxChange, + }, }); @@ -212,6 +239,14 @@ const [Grid, gridApi] = useVbenVxeGrid({ auth: ['system:user:import'], onClick: onImport, }, + { + label: $t('ui.actionTitle.deleteBatch'), + type: 'danger', + icon: ACTION_ICON.DELETE, + disabled: isEmpty(checkedIds), + auth: ['system:user:delete'], + onClick: onDeleteBatch, + }, ]" /> -- Gitee From 3d331d7fccff1757e59e68f9d4549cee1b8430db Mon Sep 17 00:00:00 2001 From: puhui999 Date: Mon, 16 Jun 2025 21:14:19 +0800 Subject: [PATCH 03/16] =?UTF-8?q?feat:=20=E3=80=90ele=E3=80=91=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E7=AE=A1=E7=90=86=E6=96=B0=E5=A2=9E=E6=89=B9=E9=87=8F?= =?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-ele/src/api/system/role/index.ts | 5 ++ apps/web-ele/src/views/system/role/data.ts | 4 ++ apps/web-ele/src/views/system/role/index.vue | 51 ++++++++++++++++++-- 3 files changed, 56 insertions(+), 4 deletions(-) diff --git a/apps/web-ele/src/api/system/role/index.ts b/apps/web-ele/src/api/system/role/index.ts index 07824c43e..23d5ade98 100644 --- a/apps/web-ele/src/api/system/role/index.ts +++ b/apps/web-ele/src/api/system/role/index.ts @@ -50,6 +50,11 @@ export function deleteRole(id: number) { return requestClient.delete(`/system/role/delete?id=${id}`); } +/** 批量删除角色 */ +export function deleteRoleList(ids: number[]) { + return requestClient.delete(`/system/role/delete-list?ids=${ids.join(',')}`); +} + /** 导出角色 */ export function exportRole(params: any) { return requestClient.download('/system/role/export-excel', { diff --git a/apps/web-ele/src/views/system/role/data.ts b/apps/web-ele/src/views/system/role/data.ts index aee51e3eb..5b2fc800a 100644 --- a/apps/web-ele/src/views/system/role/data.ts +++ b/apps/web-ele/src/views/system/role/data.ts @@ -193,6 +193,10 @@ export function useGridColumns( onActionClick: OnActionClickFn, ): VxeTableGridOptions['columns'] { return [ + { + type: 'checkbox', + width: 40, + }, { field: 'id', title: '角色编号', diff --git a/apps/web-ele/src/views/system/role/index.vue b/apps/web-ele/src/views/system/role/index.vue index 653f6a8f7..c1d23cb2e 100644 --- a/apps/web-ele/src/views/system/role/index.vue +++ b/apps/web-ele/src/views/system/role/index.vue @@ -5,14 +5,21 @@ import type { } from '#/adapter/vxe-table'; import type { SystemRoleApi } from '#/api/system/role'; +import { ref } from 'vue'; + import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { Download, Plus } from '@vben/icons'; -import { downloadFileFromBlobPart } from '@vben/utils'; +import { downloadFileFromBlobPart, isEmpty } from '@vben/utils'; import { ElButton, ElLoading, ElMessage } from 'element-plus'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; -import { deleteRole, exportRole, getRolePage } from '#/api/system/role'; +import { + deleteRole, + deleteRoleList, + exportRole, + getRolePage, +} from '#/api/system/role'; import { $t } from '#/locales'; import { useGridColumns, useGridFormSchema } from './data'; @@ -67,13 +74,35 @@ async function onDelete(row: SystemRoleApi.Role) { await deleteRole(row.id as number); ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); onRefresh(); - } catch { - // 异常处理 } finally { loadingInstance.close(); } } +/** 批量删除角色 */ +async function onDeleteBatch() { + const loadingInstance = ElLoading.service({ + text: $t('ui.actionMessage.deleting'), + fullscreen: true, + }); + try { + await deleteRoleList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); + } finally { + loadingInstance.close(); + } +} + +const checkedIds = ref([]); +function handleRowCheckboxChange({ + records, +}: { + records: SystemRoleApi.Role[]; +}) { + checkedIds.value = records.map((item) => item.id as number); +} + /** 分配角色的数据权限 */ function onAssignDataPermission(row: SystemRoleApi.Role) { assignDataPermissionFormApi.setData(row).open(); @@ -133,6 +162,10 @@ const [Grid, gridApi] = useVbenVxeGrid({ search: true, }, } as VxeTableGridOptions, + gridEvents: { + checkboxAll: handleRowCheckboxChange, + checkboxChange: handleRowCheckboxChange, + }, }); @@ -168,6 +201,16 @@ const [Grid, gridApi] = useVbenVxeGrid({ {{ $t('ui.actionTitle.export') }} + + + {{ $t('ui.actionTitle.deleteBatch') }} + -- Gitee From 842404d5b9f451a00da3dffaf1d0bb28aff3f263 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Mon, 16 Jun 2025 21:16:29 +0800 Subject: [PATCH 04/16] =?UTF-8?q?feat:=20=E3=80=90ele=E3=80=91=E5=B2=97?= =?UTF-8?q?=E4=BD=8D=E7=AE=A1=E7=90=86=E6=96=B0=E5=A2=9E=E6=89=B9=E9=87=8F?= =?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-ele/src/api/system/post/index.ts | 5 ++ apps/web-ele/src/views/system/post/data.ts | 4 + apps/web-ele/src/views/system/post/index.vue | 89 ++++++++++++++------ 3 files changed, 74 insertions(+), 24 deletions(-) diff --git a/apps/web-ele/src/api/system/post/index.ts b/apps/web-ele/src/api/system/post/index.ts index a82f58155..06df146c3 100644 --- a/apps/web-ele/src/api/system/post/index.ts +++ b/apps/web-ele/src/api/system/post/index.ts @@ -50,6 +50,11 @@ export function deletePost(id: number) { return requestClient.delete(`/system/post/delete?id=${id}`); } +/** 批量删除岗位 */ +export function deletePostList(ids: number[]) { + return requestClient.delete(`/system/post/delete-list?ids=${ids.join(',')}`); +} + /** 导出岗位 */ export function exportPost(params: any) { return requestClient.download('/system/post/export', { diff --git a/apps/web-ele/src/views/system/post/data.ts b/apps/web-ele/src/views/system/post/data.ts index ba14bba64..71572481e 100644 --- a/apps/web-ele/src/views/system/post/data.ts +++ b/apps/web-ele/src/views/system/post/data.ts @@ -90,6 +90,10 @@ export function useGridColumns( onActionClick: OnActionClickFn, ): VxeTableGridOptions['columns'] { return [ + { + type: 'checkbox', + width: 40, + }, { field: 'id', title: '岗位编号', diff --git a/apps/web-ele/src/views/system/post/index.vue b/apps/web-ele/src/views/system/post/index.vue index 144a277d6..37cbebaf5 100644 --- a/apps/web-ele/src/views/system/post/index.vue +++ b/apps/web-ele/src/views/system/post/index.vue @@ -5,14 +5,20 @@ import type { } from '#/adapter/vxe-table'; import type { SystemPostApi } from '#/api/system/post'; +import { ref } from 'vue'; + import { Page, useVbenModal } from '@vben/common-ui'; -import { Download, Plus } from '@vben/icons'; -import { downloadFileFromBlobPart } from '@vben/utils'; +import { downloadFileFromBlobPart, isEmpty } from '@vben/utils'; -import { ElButton, ElLoading, ElMessage } from 'element-plus'; +import { ElLoading, ElMessage } from 'element-plus'; -import { useVbenVxeGrid } from '#/adapter/vxe-table'; -import { deletePost, exportPost, getPostPage } from '#/api/system/post'; +import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; +import { + deletePost, + deletePostList, + exportPost, + getPostPage, +} from '#/api/system/post'; import { $t } from '#/locales'; import { useGridColumns, useGridFormSchema } from './data'; @@ -54,13 +60,35 @@ async function onDelete(row: SystemPostApi.Post) { await deletePost(row.id as number); ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name])); onRefresh(); - } catch { - // 异常处理 } finally { loadingInstance.close(); } } +/** 批量删除岗位 */ +async function onDeleteBatch() { + const loadingInstance = ElLoading.service({ + text: $t('ui.actionMessage.deleting'), + fullscreen: true, + }); + try { + await deletePostList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); + } finally { + loadingInstance.close(); + } +} + +const checkedIds = ref([]); +function handleRowCheckboxChange({ + records, +}: { + records: SystemPostApi.Post[]; +}) { + checkedIds.value = records.map((item) => item.id as number); +} + /** 表格操作按钮的回调函数 */ function onActionClick({ code, row }: OnActionClickParams) { switch (code) { @@ -102,6 +130,10 @@ const [Grid, gridApi] = useVbenVxeGrid({ search: true, }, } as VxeTableGridOptions, + gridEvents: { + checkboxAll: handleRowCheckboxChange, + checkboxChange: handleRowCheckboxChange, + }, }); @@ -110,23 +142,32 @@ const [Grid, gridApi] = useVbenVxeGrid({ -- Gitee From 79c451d256d6f4ea04dd3b4d53d726f5faba5e51 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Mon, 16 Jun 2025 21:21:37 +0800 Subject: [PATCH 05/16] =?UTF-8?q?feat:=20=E3=80=90ele=E3=80=91=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E7=AE=A1=E7=90=86=E6=96=B0=E5=A2=9E=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web-ele/src/api/system/dict/data/index.ts | 7 ++ .../web-ele/src/api/system/dict/type/index.ts | 7 ++ apps/web-ele/src/views/system/dict/data.ts | 2 + .../views/system/dict/modules/data-grid.vue | 83 +++++++++++----- .../views/system/dict/modules/type-grid.vue | 95 ++++++++++++------- 5 files changed, 138 insertions(+), 56 deletions(-) diff --git a/apps/web-ele/src/api/system/dict/data/index.ts b/apps/web-ele/src/api/system/dict/data/index.ts index a64330cda..6bf7473ce 100644 --- a/apps/web-ele/src/api/system/dict/data/index.ts +++ b/apps/web-ele/src/api/system/dict/data/index.ts @@ -48,6 +48,13 @@ export function deleteDictData(id: number) { return requestClient.delete(`/system/dict-data/delete?id=${id}`); } +// 批量删除字典数据 +export function deleteDictDataList(ids: number[]) { + return requestClient.delete( + `/system/dict-data/delete-list?ids=${ids.join(',')}`, + ); +} + // 导出字典类型数据 export function exportDictData(params: any) { return requestClient.download('/system/dict-data/export', { params }); diff --git a/apps/web-ele/src/api/system/dict/type/index.ts b/apps/web-ele/src/api/system/dict/type/index.ts index 612fe1052..8c2951cc1 100644 --- a/apps/web-ele/src/api/system/dict/type/index.ts +++ b/apps/web-ele/src/api/system/dict/type/index.ts @@ -42,6 +42,13 @@ export function deleteDictType(id: number) { return requestClient.delete(`/system/dict-type/delete?id=${id}`); } +// 批量删除字典 +export function deleteDictTypeList(ids: number[]) { + return requestClient.delete( + `/system/dict-type/delete-list?ids=${ids.join(',')}`, + ); +} + // 导出字典类型 export function exportDictType(params: any) { return requestClient.download('/system/dict-type/export', { params }); diff --git a/apps/web-ele/src/views/system/dict/data.ts b/apps/web-ele/src/views/system/dict/data.ts index 48ab6c727..1c7b7918a 100644 --- a/apps/web-ele/src/views/system/dict/data.ts +++ b/apps/web-ele/src/views/system/dict/data.ts @@ -100,6 +100,7 @@ export function useTypeGridColumns( onActionClick: OnActionClickFn, ): VxeTableGridOptions['columns'] { return [ + { type: 'checkbox', width: 40 }, { field: 'id', title: '字典编号', @@ -314,6 +315,7 @@ export function useDataGridColumns( onActionClick: OnActionClickFn, ): VxeTableGridOptions['columns'] { return [ + { type: 'checkbox', width: 40 }, { field: 'id', title: '字典编码', diff --git a/apps/web-ele/src/views/system/dict/modules/data-grid.vue b/apps/web-ele/src/views/system/dict/modules/data-grid.vue index f2dc365e8..a28ccc015 100644 --- a/apps/web-ele/src/views/system/dict/modules/data-grid.vue +++ b/apps/web-ele/src/views/system/dict/modules/data-grid.vue @@ -5,17 +5,17 @@ import type { } from '#/adapter/vxe-table'; import type { SystemDictDataApi } from '#/api/system/dict/data'; -import { watch } from 'vue'; +import { ref, watch } from 'vue'; import { useVbenModal } from '@vben/common-ui'; -import { Download, Plus } from '@vben/icons'; -import { downloadFileFromBlobPart } from '@vben/utils'; +import { downloadFileFromBlobPart, isEmpty } from '@vben/utils'; -import { ElButton, ElLoading, ElMessage } from 'element-plus'; +import { ElLoading, ElMessage } from 'element-plus'; -import { useVbenVxeGrid } from '#/adapter/vxe-table'; +import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { deleteDictData, + deleteDictDataList, exportDictData, getDictDataPage, } from '#/api/system/dict/data'; @@ -67,13 +67,35 @@ async function onDelete(row: any) { await deleteDictData(row.id); ElMessage.success($t('common.operationSuccess')); onRefresh(); - } catch { - // 异常处理 } finally { loadingInstance.close(); } } +/** 批量删除字典数据 */ +async function onDeleteBatch() { + const loadingInstance = ElLoading.service({ + text: $t('ui.actionMessage.deleting'), + fullscreen: true, + }); + try { + await deleteDictDataList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); + } finally { + loadingInstance.close(); + } +} + +const checkedIds = ref([]); +function handleRowCheckboxChange({ + records, +}: { + records: SystemDictDataApi.DictData[]; +}) { + checkedIds.value = records.map((item) => item.id as number); +} + /** 表格操作按钮回调 */ function onActionClick({ code, row }: OnActionClickParams) { switch (code) { @@ -116,6 +138,10 @@ const [Grid, gridApi] = useVbenVxeGrid({ search: true, }, } as VxeTableGridOptions, + gridEvents: { + checkboxAll: handleRowCheckboxChange, + checkboxChange: handleRowCheckboxChange, + }, }); /** 监听 dictType 变化,重新查询 */ @@ -135,23 +161,32 @@ watch( diff --git a/apps/web-ele/src/views/system/dict/modules/type-grid.vue b/apps/web-ele/src/views/system/dict/modules/type-grid.vue index 1e540e83b..675b665a9 100644 --- a/apps/web-ele/src/views/system/dict/modules/type-grid.vue +++ b/apps/web-ele/src/views/system/dict/modules/type-grid.vue @@ -1,20 +1,21 @@ @@ -130,23 +152,32 @@ const [Grid, gridApi] = useVbenVxeGrid({ -- Gitee From 3bae7aa44292b861655dd4aadccc5e06d3a9a0e2 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Mon, 16 Jun 2025 21:24:11 +0800 Subject: [PATCH 06/16] =?UTF-8?q?feat:=20=E3=80=90ele=E3=80=91=E9=82=AE?= =?UTF-8?q?=E7=AE=B1=E7=AE=A1=E7=90=86=E6=96=B0=E5=A2=9E=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/api/system/mail/account/index.ts | 7 ++ .../src/api/system/mail/template/index.ts | 7 ++ .../src/views/system/mail/account/data.ts | 4 ++ .../src/views/system/mail/account/index.vue | 66 +++++++++++++++---- .../src/views/system/mail/template/data.ts | 4 ++ .../src/views/system/mail/template/index.vue | 62 +++++++++++++---- 6 files changed, 126 insertions(+), 24 deletions(-) diff --git a/apps/web-ele/src/api/system/mail/account/index.ts b/apps/web-ele/src/api/system/mail/account/index.ts index 8a43a3326..7f506fd87 100644 --- a/apps/web-ele/src/api/system/mail/account/index.ts +++ b/apps/web-ele/src/api/system/mail/account/index.ts @@ -49,6 +49,13 @@ export function deleteMailAccount(id: number) { return requestClient.delete(`/system/mail-account/delete?id=${id}`); } +/** 批量删除邮箱账号 */ +export function deleteMailAccountList(ids: number[]) { + return requestClient.delete( + `/system/mail-account/delete-list?ids=${ids.join(',')}`, + ); +} + /** 获得邮箱账号精简列表 */ export function getSimpleMailAccountList() { return requestClient.get( diff --git a/apps/web-ele/src/api/system/mail/template/index.ts b/apps/web-ele/src/api/system/mail/template/index.ts index 34b4a09d0..1750cfd2a 100644 --- a/apps/web-ele/src/api/system/mail/template/index.ts +++ b/apps/web-ele/src/api/system/mail/template/index.ts @@ -56,6 +56,13 @@ export function deleteMailTemplate(id: number) { return requestClient.delete(`/system/mail-template/delete?id=${id}`); } +/** 批量删除邮件模版 */ +export function deleteMailTemplateList(ids: number[]) { + return requestClient.delete( + `/system/mail-template/delete-list?ids=${ids.join(',')}`, + ); +} + /** 发送邮件 */ export function sendMail(data: SystemMailTemplateApi.MailSendReqVO) { return requestClient.post('/system/mail-template/send-mail', data); diff --git a/apps/web-ele/src/views/system/mail/account/data.ts b/apps/web-ele/src/views/system/mail/account/data.ts index 48a7989a2..964b70b71 100644 --- a/apps/web-ele/src/views/system/mail/account/data.ts +++ b/apps/web-ele/src/views/system/mail/account/data.ts @@ -129,6 +129,10 @@ export function useGridColumns( onActionClick: OnActionClickFn, ): VxeTableGridOptions['columns'] { return [ + { + type: 'checkbox', + width: 40, + }, { field: 'id', title: '编号', diff --git a/apps/web-ele/src/views/system/mail/account/index.vue b/apps/web-ele/src/views/system/mail/account/index.vue index cf7a4e923..fdd342bbd 100644 --- a/apps/web-ele/src/views/system/mail/account/index.vue +++ b/apps/web-ele/src/views/system/mail/account/index.vue @@ -5,14 +5,17 @@ import type { } from '#/adapter/vxe-table'; import type { SystemMailAccountApi } from '#/api/system/mail/account'; +import { ref } from 'vue'; + import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; -import { Plus } from '@vben/icons'; +import { isEmpty } from '@vben/utils'; -import { ElButton, ElLoading, ElMessage } from 'element-plus'; +import { ElLoading, ElMessage } from 'element-plus'; -import { useVbenVxeGrid } from '#/adapter/vxe-table'; +import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { deleteMailAccount, + deleteMailAccountList, getMailAccountPage, } from '#/api/system/mail/account'; import { $t } from '#/locales'; @@ -50,13 +53,35 @@ async function onDelete(row: SystemMailAccountApi.MailAccount) { await deleteMailAccount(row.id as number); ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.mail])); onRefresh(); - } catch { - // 异常处理 } finally { loadingInstance.close(); } } +/** 批量删除邮箱账号 */ +async function onDeleteBatch() { + const loadingInstance = ElLoading.service({ + text: $t('ui.actionMessage.deleting'), + fullscreen: true, + }); + try { + await deleteMailAccountList(checkedIds.value); + ElMessage.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); + } finally { + loadingInstance.close(); + } +} + +const checkedIds = ref([]); +function handleRowCheckboxChange({ + records, +}: { + records: SystemMailAccountApi.MailAccount[]; +}) { + checkedIds.value = records.map((item) => item.id as number); +} + /** 表格操作按钮的回调函数 */ function onActionClick({ code, @@ -101,6 +126,10 @@ const [Grid, gridApi] = useVbenVxeGrid({ search: true, }, } as VxeTableGridOptions, + gridEvents: { + checkboxAll: handleRowCheckboxChange, + checkboxChange: handleRowCheckboxChange, + }, });