From 513f6d4b57399aad43ea71de7d6a147d84039017 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Mon, 19 May 2025 15:12:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E3=80=90ANTD=E3=80=91=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=8E=A5=E5=8F=A3=E7=A4=BA=E4=BE=8B=20demo03?= =?UTF-8?q?=20erp=20=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/api/infra/demo/demo03/erp/index.ts | 29 +++++++--- .../src/views/infra/demo/demo03/erp/data.ts | 3 ++ .../src/views/infra/demo/demo03/erp/index.vue | 52 ++++++++++++++++-- .../demo03/erp/modules/demo03-course-list.vue | 53 +++++++++++++++++-- .../demo03/erp/modules/demo03-grade-list.vue | 49 +++++++++++++++-- .../infra/demo/demo03/erp/modules/form.vue | 1 - 6 files changed, 170 insertions(+), 17 deletions(-) diff --git a/apps/web-antd/src/api/infra/demo/demo03/erp/index.ts b/apps/web-antd/src/api/infra/demo/demo03/erp/index.ts index f9704bf1..29c1f2b6 100644 --- a/apps/web-antd/src/api/infra/demo/demo03/erp/index.ts +++ b/apps/web-antd/src/api/infra/demo/demo03/erp/index.ts @@ -61,6 +61,13 @@ export function deleteDemo03Student(id: number) { return requestClient.delete(`/infra/demo03-student/delete?id=${id}`); } +// 批量删除学生 +export function deleteDemo03StudentByIds(ids: number[]) { + return requestClient.delete( + `/infra/demo03-student/delete-batch?ids=${ids.join(',')}`, + ); +} + /** 导出学生 */ export function exportDemo03Student(params: any) { return requestClient.download('/infra/demo03-student/export-excel', params); @@ -72,9 +79,7 @@ export function exportDemo03Student(params: any) { export function getDemo03CoursePage(params: PageParam) { return requestClient.get>( `/infra/demo03-student/demo03-course/page`, - { - params, - }, + { params }, ); } /** 新增学生课程 */ @@ -94,6 +99,13 @@ export function deleteDemo03Course(id: number) { ); } +// 批量删除学生课程 +export function deleteDemo03CourseByIds(ids: number[]) { + return requestClient.delete( + `/infra/demo03-student/demo03-course/delete-batch?ids=${ids.join(',')}`, + ); +} + /** 获得学生课程 */ export function getDemo03Course(id: number) { return requestClient.get( @@ -107,9 +119,7 @@ export function getDemo03Course(id: number) { export function getDemo03GradePage(params: PageParam) { return requestClient.get>( `/infra/demo03-student/demo03-grade/page`, - { - params, - }, + { params }, ); } /** 新增学生班级 */ @@ -129,6 +139,13 @@ export function deleteDemo03Grade(id: number) { ); } +// 批量删除学生班级 +export function deleteDemo03GradeByIds(ids: number[]) { + return requestClient.delete( + `/infra/demo03-student/demo03-grade/delete-batch?ids=${ids.join(',')}`, + ); +} + /** 获得学生班级 */ export function getDemo03Grade(id: number) { return requestClient.get( diff --git a/apps/web-antd/src/views/infra/demo/demo03/erp/data.ts b/apps/web-antd/src/views/infra/demo/demo03/erp/data.ts index d0c360f3..4122efde 100644 --- a/apps/web-antd/src/views/infra/demo/demo03/erp/data.ts +++ b/apps/web-antd/src/views/infra/demo/demo03/erp/data.ts @@ -107,6 +107,7 @@ export function useGridColumns( onActionClick?: OnActionClickFn, ): VxeTableGridOptions['columns'] { return [ + { type: 'checkbox', width: 40 }, { field: 'id', title: '编号', @@ -254,6 +255,7 @@ export function useDemo03CourseGridColumns( onActionClick?: OnActionClickFn, ): VxeTableGridOptions['columns'] { return [ + { type: 'checkbox', width: 40 }, { field: 'id', title: '编号', @@ -391,6 +393,7 @@ export function useDemo03GradeGridColumns( onActionClick?: OnActionClickFn, ): VxeTableGridOptions['columns'] { return [ + { type: 'checkbox', width: 40 }, { field: 'id', title: '编号', diff --git a/apps/web-antd/src/views/infra/demo/demo03/erp/index.vue b/apps/web-antd/src/views/infra/demo/demo03/erp/index.vue index 1f561d18..e605774d 100644 --- a/apps/web-antd/src/views/infra/demo/demo03/erp/index.vue +++ b/apps/web-antd/src/views/infra/demo/demo03/erp/index.vue @@ -5,17 +5,18 @@ import type { } from '#/adapter/vxe-table'; import type { Demo03StudentApi } from '#/api/infra/demo/demo03/erp'; -import { h, ref } from 'vue'; +import { computed, h, ref } from 'vue'; import { Page, useVbenModal } from '@vben/common-ui'; -import { Download, Plus } from '@vben/icons'; -import { downloadFileFromBlobPart } from '@vben/utils'; +import { Download, Plus, Trash2 } from '@vben/icons'; +import { downloadFileFromBlobPart, isEmpty } from '@vben/utils'; import { Button, message, Tabs } from 'ant-design-vue'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { deleteDemo03Student, + deleteDemo03StudentByIds, exportDemo03Student, getDemo03StudentPage, } from '#/api/infra/demo/demo03/erp'; @@ -61,7 +62,25 @@ async function onDelete(row: Demo03StudentApi.Demo03Student) { await deleteDemo03Student(row.id as number); message.success($t('ui.actionMessage.deleteSuccess', [row.id])); onRefresh(); - } catch { + } finally { + hideLoading(); + } +} + +const deleteIds = ref([]); // 待删除学生 ID +const showDeleteBatchBtn = computed(() => isEmpty(deleteIds.value)); +/** 批量删除学生 */ +async function onDeleteBatch() { + const hideLoading = message.loading({ + content: $t('ui.actionMessage.deleting'), + duration: 0, + key: 'action_process_msg', + }); + try { + await deleteDemo03StudentByIds(deleteIds.value); + message.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); + } finally { hideLoading(); } } @@ -124,6 +143,20 @@ const [Grid, gridApi] = useVbenVxeGrid({ cellClick: ({ row }: { row: Demo03StudentApi.Demo03Student }) => { selectDemo03Student.value = row; }, + checkboxAll: ({ + records, + }: { + records: Demo03StudentApi.Demo03Student[]; + }) => { + deleteIds.value = records.map((item) => item.id); + }, + checkboxChange: ({ + records, + }: { + records: Demo03StudentApi.Demo03Student[]; + }) => { + deleteIds.value = records.map((item) => item.id); + }, }, }); @@ -152,6 +185,17 @@ const [Grid, gridApi] = useVbenVxeGrid({ > {{ $t('ui.actionTitle.export') }} + diff --git a/apps/web-antd/src/views/infra/demo/demo03/erp/modules/demo03-course-list.vue b/apps/web-antd/src/views/infra/demo/demo03/erp/modules/demo03-course-list.vue index 32da0b65..3e95bbb7 100644 --- a/apps/web-antd/src/views/infra/demo/demo03/erp/modules/demo03-course-list.vue +++ b/apps/web-antd/src/views/infra/demo/demo03/erp/modules/demo03-course-list.vue @@ -5,16 +5,18 @@ import type { } from '#/adapter/vxe-table'; import type { Demo03StudentApi } from '#/api/infra/demo/demo03/erp'; -import { h, nextTick, watch } from 'vue'; +import { computed, h, nextTick, ref, watch } from 'vue'; import { useVbenModal } from '@vben/common-ui'; -import { Plus } from '@vben/icons'; +import { Plus, Trash2 } from '@vben/icons'; +import { isEmpty } from '@vben/utils'; import { Button, message } from 'ant-design-vue'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { deleteDemo03Course, + deleteDemo03CourseByIds, getDemo03CoursePage, } from '#/api/infra/demo/demo03/erp'; import { $t } from '#/locales'; @@ -59,7 +61,25 @@ async function onDelete(row: Demo03StudentApi.Demo03Course) { await deleteDemo03Course(row.id as number); message.success($t('ui.actionMessage.deleteSuccess', [row.id])); onRefresh(); - } catch { + } finally { + hideLoading(); + } +} + +const deleteIds = ref([]); // 待删除学生课程 ID +const showDeleteBatchBtn = computed(() => isEmpty(deleteIds.value)); +/** 批量删除学生课程 */ +async function onDeleteBatch() { + const hideLoading = message.loading({ + content: $t('ui.actionMessage.deleting'), + duration: 0, + key: 'action_process_msg', + }); + try { + await deleteDemo03CourseByIds(deleteIds.value); + message.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); + } finally { hideLoading(); } } @@ -115,6 +135,22 @@ const [Grid, gridApi] = useVbenVxeGrid({ isHover: true, }, } as VxeTableGridOptions, + gridEvents: { + checkboxAll: ({ + records, + }: { + records: Demo03StudentApi.Demo03Course[]; + }) => { + deleteIds.value = records.map((item) => item.id); + }, + checkboxChange: ({ + records, + }: { + records: Demo03StudentApi.Demo03Course[]; + }) => { + deleteIds.value = records.map((item) => item.id); + }, + }, }); /** 刷新表格 */ @@ -148,6 +184,17 @@ watch( > {{ $t('ui.actionTitle.create', ['学生课程']) }} + diff --git a/apps/web-antd/src/views/infra/demo/demo03/erp/modules/demo03-grade-list.vue b/apps/web-antd/src/views/infra/demo/demo03/erp/modules/demo03-grade-list.vue index 7b20a705..596c8927 100644 --- a/apps/web-antd/src/views/infra/demo/demo03/erp/modules/demo03-grade-list.vue +++ b/apps/web-antd/src/views/infra/demo/demo03/erp/modules/demo03-grade-list.vue @@ -5,16 +5,18 @@ import type { } from '#/adapter/vxe-table'; import type { Demo03StudentApi } from '#/api/infra/demo/demo03/erp'; -import { h, nextTick, watch } from 'vue'; +import { computed, h, nextTick, ref, watch } from 'vue'; import { useVbenModal } from '@vben/common-ui'; -import { Plus } from '@vben/icons'; +import { Plus, Trash2 } from '@vben/icons'; +import { isEmpty } from '@vben/utils'; import { Button, message } from 'ant-design-vue'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { deleteDemo03Grade, + deleteDemo03GradeByIds, getDemo03GradePage, } from '#/api/infra/demo/demo03/erp'; import { $t } from '#/locales'; @@ -59,7 +61,25 @@ async function onDelete(row: Demo03StudentApi.Demo03Grade) { await deleteDemo03Grade(row.id as number); message.success($t('ui.actionMessage.deleteSuccess', [row.id])); onRefresh(); - } catch { + } finally { + hideLoading(); + } +} + +const deleteIds = ref([]); // 待删除学生班级 ID +const showDeleteBatchBtn = computed(() => isEmpty(deleteIds.value)); +/** 批量删除学生班级 */ +async function onDeleteBatch() { + const hideLoading = message.loading({ + content: $t('ui.actionMessage.deleting'), + duration: 0, + key: 'action_process_msg', + }); + try { + await deleteDemo03GradeByIds(deleteIds.value); + message.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); + } finally { hideLoading(); } } @@ -115,6 +135,18 @@ const [Grid, gridApi] = useVbenVxeGrid({ isHover: true, }, } as VxeTableGridOptions, + gridEvents: { + checkboxAll: ({ records }: { records: Demo03StudentApi.Demo03Grade[] }) => { + deleteIds.value = records.map((item) => item.id); + }, + checkboxChange: ({ + records, + }: { + records: Demo03StudentApi.Demo03Grade[]; + }) => { + deleteIds.value = records.map((item) => item.id); + }, + }, }); /** 刷新表格 */ @@ -148,6 +180,17 @@ watch( > {{ $t('ui.actionTitle.create', ['学生班级']) }} + diff --git a/apps/web-antd/src/views/infra/demo/demo03/erp/modules/form.vue b/apps/web-antd/src/views/infra/demo/demo03/erp/modules/form.vue index 50cfa2cf..3c83ff97 100644 --- a/apps/web-antd/src/views/infra/demo/demo03/erp/modules/form.vue +++ b/apps/web-antd/src/views/infra/demo/demo03/erp/modules/form.vue @@ -64,7 +64,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - // 加载数据 let data = modalApi.getData(); if (!data) {