diff --git a/apps/web-antd/src/adapter/style.css b/apps/web-antd/src/adapter/style.css index d2f32dc7..01368a92 100644 --- a/apps/web-antd/src/adapter/style.css +++ b/apps/web-antd/src/adapter/style.css @@ -1,4 +1,4 @@ -/* 来自 @vben/plugins/vxe-table style.css TODO @puhui999:可以写下目的哈; */ +/* 来自 @vben/plugins/vxe-table style.css,覆盖 vxe-table 原有的样式定义,使用 vben 的样式主题 */ :root { --vxe-ui-font-color: hsl(var(--foreground)); --vxe-ui-font-primary-color: hsl(var(--primary)); diff --git a/apps/web-antd/src/adapter/vxe-table.ts b/apps/web-antd/src/adapter/vxe-table.ts index 1903e1c0..9935d0b0 100644 --- a/apps/web-antd/src/adapter/vxe-table.ts +++ b/apps/web-antd/src/adapter/vxe-table.ts @@ -300,4 +300,5 @@ export type OnActionClickParams> = { export type OnActionClickFn> = ( params: OnActionClickParams, ) => void; +export * from '#/components/table-action'; export type * from '@vben/plugins/vxe-table'; diff --git a/apps/web-antd/src/api/infra/demo/demo01/index.ts b/apps/web-antd/src/api/infra/demo/demo01/index.ts index 5a940a61..d1f646c6 100644 --- a/apps/web-antd/src/api/infra/demo/demo01/index.ts +++ b/apps/web-antd/src/api/infra/demo/demo01/index.ts @@ -9,7 +9,7 @@ export namespace Demo01ContactApi { export interface Demo01Contact { id: number; // 编号 name?: string; // 名字 - sex?: boolean; // 性别 + sex?: number; // 性别 birthday?: Dayjs | string; // 出生年 description?: string; // 简介 avatar: string; // 头像 @@ -46,6 +46,14 @@ export function deleteDemo01Contact(id: number) { return requestClient.delete(`/infra/demo01-contact/delete?id=${id}`); } +/** 批量删除示例联系人 */ +// TODO @puhui999:ByIds,这种按照约定,是不带的,针对 Id 的情况哈。 +export function deleteDemo01ContactListByIds(ids: number[]) { + return requestClient.delete( + `/infra/demo01-contact/delete-list?ids=${ids.join(',')}`, + ); +} + /** 导出示例联系人 */ export function exportDemo01Contact(params: any) { return requestClient.download('/infra/demo01-contact/export-excel', params); 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..ec18150c 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 @@ -34,7 +34,7 @@ export namespace Demo03StudentApi { /** 查询学生分页 */ export function getDemo03StudentPage(params: PageParam) { return requestClient.get>( - '/infra/demo03-student/page', + '/infra/demo03-student-erp/page', { params }, ); } @@ -42,28 +42,38 @@ export function getDemo03StudentPage(params: PageParam) { /** 查询学生详情 */ export function getDemo03Student(id: number) { return requestClient.get( - `/infra/demo03-student/get?id=${id}`, + `/infra/demo03-student-erp/get?id=${id}`, ); } /** 新增学生 */ export function createDemo03Student(data: Demo03StudentApi.Demo03Student) { - return requestClient.post('/infra/demo03-student/create', data); + return requestClient.post('/infra/demo03-student-erp/create', data); } /** 修改学生 */ export function updateDemo03Student(data: Demo03StudentApi.Demo03Student) { - return requestClient.put('/infra/demo03-student/update', data); + return requestClient.put('/infra/demo03-student-erp/update', data); } /** 删除学生 */ export function deleteDemo03Student(id: number) { - return requestClient.delete(`/infra/demo03-student/delete?id=${id}`); + return requestClient.delete(`/infra/demo03-student-erp/delete?id=${id}`); +} + +/** 批量删除学生 */ +export function deleteDemo03StudentListByIds(ids: number[]) { + return requestClient.delete( + `/infra/demo03-student-erp/delete-list?ids=${ids.join(',')}`, + ); } /** 导出学生 */ export function exportDemo03Student(params: any) { - return requestClient.download('/infra/demo03-student/export-excel', params); + return requestClient.download( + '/infra/demo03-student-erp/export-excel', + params, + ); } // ==================== 子表(学生课程) ==================== @@ -71,33 +81,44 @@ export function exportDemo03Student(params: any) { /** 获得学生课程分页 */ export function getDemo03CoursePage(params: PageParam) { return requestClient.get>( - `/infra/demo03-student/demo03-course/page`, - { - params, - }, + `/infra/demo03-student-erp/demo03-course/page`, + { params }, ); } /** 新增学生课程 */ export function createDemo03Course(data: Demo03StudentApi.Demo03Course) { - return requestClient.post(`/infra/demo03-student/demo03-course/create`, data); + return requestClient.post( + `/infra/demo03-student-erp/demo03-course/create`, + data, + ); } /** 修改学生课程 */ export function updateDemo03Course(data: Demo03StudentApi.Demo03Course) { - return requestClient.put(`/infra/demo03-student/demo03-course/update`, data); + return requestClient.put( + `/infra/demo03-student-erp/demo03-course/update`, + data, + ); } /** 删除学生课程 */ export function deleteDemo03Course(id: number) { return requestClient.delete( - `/infra/demo03-student/demo03-course/delete?id=${id}`, + `/infra/demo03-student-erp/demo03-course/delete?id=${id}`, + ); +} + +/** 批量删除学生课程 */ +export function deleteDemo03CourseListByIds(ids: number[]) { + return requestClient.delete( + `/infra/demo03-student-erp/demo03-course/delete-list?ids=${ids.join(',')}`, ); } /** 获得学生课程 */ export function getDemo03Course(id: number) { return requestClient.get( - `/infra/demo03-student/demo03-course/get?id=${id}`, + `/infra/demo03-student-erp/demo03-course/get?id=${id}`, ); } @@ -106,32 +127,43 @@ export function getDemo03Course(id: number) { /** 获得学生班级分页 */ export function getDemo03GradePage(params: PageParam) { return requestClient.get>( - `/infra/demo03-student/demo03-grade/page`, - { - params, - }, + `/infra/demo03-student-erp/demo03-grade/page`, + { params }, ); } /** 新增学生班级 */ export function createDemo03Grade(data: Demo03StudentApi.Demo03Grade) { - return requestClient.post(`/infra/demo03-student/demo03-grade/create`, data); + return requestClient.post( + `/infra/demo03-student-erp/demo03-grade/create`, + data, + ); } /** 修改学生班级 */ export function updateDemo03Grade(data: Demo03StudentApi.Demo03Grade) { - return requestClient.put(`/infra/demo03-student/demo03-grade/update`, data); + return requestClient.put( + `/infra/demo03-student-erp/demo03-grade/update`, + data, + ); } /** 删除学生班级 */ export function deleteDemo03Grade(id: number) { return requestClient.delete( - `/infra/demo03-student/demo03-grade/delete?id=${id}`, + `/infra/demo03-student-erp/demo03-grade/delete?id=${id}`, + ); +} + +/** 批量删除学生班级 */ +export function deleteDemo03GradeListByIds(ids: number[]) { + return requestClient.delete( + `/infra/demo03-student-erp/demo03-grade/delete-list?ids=${ids.join(',')}`, ); } /** 获得学生班级 */ export function getDemo03Grade(id: number) { return requestClient.get( - `/infra/demo03-student/demo03-grade/get?id=${id}`, + `/infra/demo03-student-erp/demo03-grade/get?id=${id}`, ); } diff --git a/apps/web-antd/src/api/infra/demo/demo03/inner/index.ts b/apps/web-antd/src/api/infra/demo/demo03/inner/index.ts index a83cf421..1521923b 100644 --- a/apps/web-antd/src/api/infra/demo/demo03/inner/index.ts +++ b/apps/web-antd/src/api/infra/demo/demo03/inner/index.ts @@ -1,3 +1,5 @@ +import type { Dayjs } from 'dayjs'; + import type { PageParam, PageResult } from '@vben/request'; import { requestClient } from '#/api/request'; @@ -24,7 +26,7 @@ export namespace Demo03StudentApi { id: number; // 编号 name?: string; // 名字 sex?: number; // 性别 - birthday?: Date; // 出生日期 + birthday?: Dayjs | string; // 出生日期 description?: string; // 简介 demo03courses?: Demo03Course[]; demo03grade?: Demo03Grade; @@ -34,7 +36,7 @@ export namespace Demo03StudentApi { /** 查询学生分页 */ export function getDemo03StudentPage(params: PageParam) { return requestClient.get>( - '/infra/demo03-student/page', + '/infra/demo03-student-inner/page', { params }, ); } @@ -42,28 +44,38 @@ export function getDemo03StudentPage(params: PageParam) { /** 查询学生详情 */ export function getDemo03Student(id: number) { return requestClient.get( - `/infra/demo03-student/get?id=${id}`, + `/infra/demo03-student-inner/get?id=${id}`, ); } /** 新增学生 */ export function createDemo03Student(data: Demo03StudentApi.Demo03Student) { - return requestClient.post('/infra/demo03-student/create', data); + return requestClient.post('/infra/demo03-student-inner/create', data); } /** 修改学生 */ export function updateDemo03Student(data: Demo03StudentApi.Demo03Student) { - return requestClient.put('/infra/demo03-student/update', data); + return requestClient.put('/infra/demo03-student-inner/update', data); } /** 删除学生 */ export function deleteDemo03Student(id: number) { - return requestClient.delete(`/infra/demo03-student/delete?id=${id}`); + return requestClient.delete(`/infra/demo03-student-inner/delete?id=${id}`); +} + +/** 批量删除学生 */ +export function deleteDemo03StudentListByIds(ids: number[]) { + return requestClient.delete( + `/infra/demo03-student-inner/delete-list?ids=${ids.join(',')}`, + ); } /** 导出学生 */ export function exportDemo03Student(params: any) { - return requestClient.download('/infra/demo03-student/export-excel', params); + return requestClient.download( + '/infra/demo03-student-inner/export-excel', + params, + ); } // ==================== 子表(学生课程) ==================== @@ -71,7 +83,7 @@ export function exportDemo03Student(params: any) { /** 获得学生课程列表 */ export function getDemo03CourseListByStudentId(studentId: number) { return requestClient.get( - `/infra/demo03-student/demo03-course/list-by-student-id?studentId=${studentId}`, + `/infra/demo03-student-inner/demo03-course/list-by-student-id?studentId=${studentId}`, ); } @@ -80,6 +92,6 @@ export function getDemo03CourseListByStudentId(studentId: number) { /** 获得学生班级 */ export function getDemo03GradeByStudentId(studentId: number) { return requestClient.get( - `/infra/demo03-student/demo03-grade/get-by-student-id?studentId=${studentId}`, + `/infra/demo03-student-inner/demo03-grade/get-by-student-id?studentId=${studentId}`, ); } diff --git a/apps/web-antd/src/api/infra/demo/demo03/normal/index.ts b/apps/web-antd/src/api/infra/demo/demo03/normal/index.ts index a04a919e..79143c82 100644 --- a/apps/web-antd/src/api/infra/demo/demo03/normal/index.ts +++ b/apps/web-antd/src/api/infra/demo/demo03/normal/index.ts @@ -36,7 +36,7 @@ export namespace Demo03StudentApi { /** 查询学生分页 */ export function getDemo03StudentPage(params: PageParam) { return requestClient.get>( - '/infra/demo03-student/page', + '/infra/demo03-student-normal/page', { params }, ); } @@ -44,28 +44,38 @@ export function getDemo03StudentPage(params: PageParam) { /** 查询学生详情 */ export function getDemo03Student(id: number) { return requestClient.get( - `/infra/demo03-student/get?id=${id}`, + `/infra/demo03-student-normal/get?id=${id}`, ); } /** 新增学生 */ export function createDemo03Student(data: Demo03StudentApi.Demo03Student) { - return requestClient.post('/infra/demo03-student/create', data); + return requestClient.post('/infra/demo03-student-normal/create', data); } /** 修改学生 */ export function updateDemo03Student(data: Demo03StudentApi.Demo03Student) { - return requestClient.put('/infra/demo03-student/update', data); + return requestClient.put('/infra/demo03-student-normal/update', data); } /** 删除学生 */ export function deleteDemo03Student(id: number) { - return requestClient.delete(`/infra/demo03-student/delete?id=${id}`); + return requestClient.delete(`/infra/demo03-student-normal/delete?id=${id}`); +} + +/** 批量删除学生 */ +export function deleteDemo03StudentListByIds(ids: number[]) { + return requestClient.delete( + `/infra/demo03-student-normal/delete-list?ids=${ids.join(',')}`, + ); } /** 导出学生 */ export function exportDemo03Student(params: any) { - return requestClient.download('/infra/demo03-student/export-excel', params); + return requestClient.download( + '/infra/demo03-student-normal/export-excel', + params, + ); } // ==================== 子表(学生课程) ==================== @@ -73,7 +83,7 @@ export function exportDemo03Student(params: any) { /** 获得学生课程列表 */ export function getDemo03CourseListByStudentId(studentId: number) { return requestClient.get( - `/infra/demo03-student/demo03-course/list-by-student-id?studentId=${studentId}`, + `/infra/demo03-student-normal/demo03-course/list-by-student-id?studentId=${studentId}`, ); } @@ -82,6 +92,6 @@ export function getDemo03CourseListByStudentId(studentId: number) { /** 获得学生班级 */ export function getDemo03GradeByStudentId(studentId: number) { return requestClient.get( - `/infra/demo03-student/demo03-grade/get-by-student-id?studentId=${studentId}`, + `/infra/demo03-student-normal/demo03-grade/get-by-student-id?studentId=${studentId}`, ); } diff --git a/apps/web-antd/src/api/infra/job/index.ts b/apps/web-antd/src/api/infra/job/index.ts index fcec25c8..3bd20fdb 100644 --- a/apps/web-antd/src/api/infra/job/index.ts +++ b/apps/web-antd/src/api/infra/job/index.ts @@ -15,6 +15,7 @@ export namespace InfraJobApi { retryInterval: number; monitorTimeout: number; createTime?: Date; + nextTimes?: Date[]; } } diff --git a/apps/web-antd/src/components/dept-select-modal/dept-select-modal.vue b/apps/web-antd/src/components/dept-select-modal/dept-select-modal.vue index 7a36899e..8fc25665 100644 --- a/apps/web-antd/src/components/dept-select-modal/dept-select-modal.vue +++ b/apps/web-antd/src/components/dept-select-modal/dept-select-modal.vue @@ -1,3 +1,4 @@ +// TODO @芋艿:是否有更好的组织形式?! @@ -139,6 +171,17 @@ const [Grid, gridApi] = useVbenVxeGrid({ > {{ $t('ui.actionTitle.export') }} + diff --git a/apps/web-antd/src/views/infra/demo/demo02/data.ts b/apps/web-antd/src/views/infra/demo/demo02/data.ts index 1830d4ae..74430fb2 100644 --- a/apps/web-antd/src/views/infra/demo/demo02/data.ts +++ b/apps/web-antd/src/views/infra/demo/demo02/data.ts @@ -1,15 +1,12 @@ import type { VbenFormSchema } from '#/adapter/form'; -import type { OnActionClickFn, VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { Demo02CategoryApi } from '#/api/infra/demo/demo02'; -import { useAccess } from '@vben/access'; import { handleTree } from '@vben/utils'; import { getDemo02CategoryList } from '#/api/infra/demo/demo02'; import { getRangePickerDefaultProps } from '#/utils'; -const { hasAccessByCodes } = useAccess(); - /** 新增/修改的表单 */ export function useFormSchema(): VbenFormSchema[] { return [ @@ -89,9 +86,7 @@ export function useGridFormSchema(): VbenFormSchema[] { } /** 列表的字段 */ -export function useGridColumns( - onActionClick?: OnActionClickFn, -): VxeTableGridOptions['columns'] { +export function useGridColumns(): VxeTableGridOptions['columns'] { return [ { field: 'id', @@ -116,39 +111,10 @@ export function useGridColumns( formatter: 'formatDateTime', }, { - field: 'operation', title: '操作', - minWidth: 200, - align: 'center', + width: 220, fixed: 'right', - headerAlign: 'center', - showOverflow: false, - cellRender: { - attrs: { - nameField: 'id', - nameTitle: '示例分类', - onClick: onActionClick, - }, - name: 'CellOperation', - options: [ - { - code: 'append', - text: '新增下级', - show: hasAccessByCodes(['infra:demo02-category:create']), - }, - { - code: 'edit', - show: hasAccessByCodes(['infra:demo02-category:update']), - }, - { - code: 'delete', - show: hasAccessByCodes(['infra:demo02-category:delete']), - disabled: (row: Demo02CategoryApi.Demo02Category) => { - return !!(row.children && row.children.length > 0); - }, - }, - ], - }, + slots: { default: 'actions' }, }, ]; } diff --git a/apps/web-antd/src/views/infra/demo/demo02/index.vue b/apps/web-antd/src/views/infra/demo/demo02/index.vue index 4983f774..ecff2a70 100644 --- a/apps/web-antd/src/views/infra/demo/demo02/index.vue +++ b/apps/web-antd/src/views/infra/demo/demo02/index.vue @@ -1,19 +1,15 @@ @@ -152,6 +180,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..22afe3e3 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 { 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, + deleteDemo03CourseListByIds, getDemo03CoursePage, } from '#/api/infra/demo/demo03/erp'; import { $t } from '#/locales'; @@ -59,11 +61,36 @@ async function onDelete(row: Demo03StudentApi.Demo03Course) { await deleteDemo03Course(row.id as number); message.success($t('ui.actionMessage.deleteSuccess', [row.id])); onRefresh(); - } catch { + } finally { hideLoading(); } } +/** 批量删除学生课程 */ +async function onDeleteBatch() { + const hideLoading = message.loading({ + content: $t('ui.actionMessage.deleting'), + duration: 0, + key: 'action_process_msg', + }); + try { + await deleteDemo03CourseListByIds(deleteIds.value); + message.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); + } finally { + hideLoading(); + } +} + +const deleteIds = ref([]); // 待删除学生课程 ID +function setDeleteIds({ + records, +}: { + records: Demo03StudentApi.Demo03Course[]; +}) { + deleteIds.value = records.map((item) => item.id); +} + /** 表格操作按钮的回调函数 */ function onActionClick({ code, @@ -115,6 +142,10 @@ const [Grid, gridApi] = useVbenVxeGrid({ isHover: true, }, } as VxeTableGridOptions, + gridEvents: { + checkboxAll: setDeleteIds, + checkboxChange: setDeleteIds, + }, }); /** 刷新表格 */ @@ -148,6 +179,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..5f774dcc 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 { 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, + deleteDemo03GradeListByIds, getDemo03GradePage, } from '#/api/infra/demo/demo03/erp'; import { $t } from '#/locales'; @@ -59,11 +61,36 @@ async function onDelete(row: Demo03StudentApi.Demo03Grade) { await deleteDemo03Grade(row.id as number); message.success($t('ui.actionMessage.deleteSuccess', [row.id])); onRefresh(); - } catch { + } finally { hideLoading(); } } +/** 批量删除学生班级 */ +async function onDeleteBatch() { + const hideLoading = message.loading({ + content: $t('ui.actionMessage.deleting'), + duration: 0, + key: 'action_process_msg', + }); + try { + await deleteDemo03GradeListByIds(deleteIds.value); + message.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); + } finally { + hideLoading(); + } +} + +const deleteIds = ref([]); // 待删除学生班级 ID +function setDeleteIds({ + records, +}: { + records: Demo03StudentApi.Demo03Grade[]; +}) { + deleteIds.value = records.map((item) => item.id); +} + /** 表格操作按钮的回调函数 */ function onActionClick({ code, @@ -115,6 +142,10 @@ const [Grid, gridApi] = useVbenVxeGrid({ isHover: true, }, } as VxeTableGridOptions, + gridEvents: { + checkboxAll: setDeleteIds, + checkboxChange: setDeleteIds, + }, }); /** 刷新表格 */ @@ -148,6 +179,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) { diff --git a/apps/web-antd/src/views/infra/demo/demo03/inner/data.ts b/apps/web-antd/src/views/infra/demo/demo03/inner/data.ts index 64024093..54a15423 100644 --- a/apps/web-antd/src/views/infra/demo/demo03/inner/data.ts +++ b/apps/web-antd/src/views/infra/demo/demo03/inner/data.ts @@ -107,6 +107,7 @@ export function useGridColumns( onActionClick?: OnActionClickFn, ): VxeTableGridOptions['columns'] { return [ + { type: 'checkbox', width: 40 }, { type: 'expand', width: 80, slots: { content: 'expand_content' } }, { field: 'id', @@ -150,7 +151,6 @@ export function useGridColumns( minWidth: 200, align: 'center', fixed: 'right', - headerAlign: 'center', showOverflow: false, cellRender: { attrs: { @@ -199,7 +199,6 @@ export function useDemo03CourseGridEditColumns( minWidth: 60, align: 'center', fixed: 'right', - headerAlign: 'center', showOverflow: false, cellRender: { attrs: { diff --git a/apps/web-antd/src/views/infra/demo/demo03/inner/index.vue b/apps/web-antd/src/views/infra/demo/demo03/inner/index.vue index a784aa93..af4289b3 100644 --- a/apps/web-antd/src/views/infra/demo/demo03/inner/index.vue +++ b/apps/web-antd/src/views/infra/demo/demo03/inner/index.vue @@ -8,14 +8,15 @@ import type { Demo03StudentApi } from '#/api/infra/demo/demo03/inner'; import { 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, + deleteDemo03StudentListByIds, exportDemo03Student, getDemo03StudentPage, } from '#/api/infra/demo/demo03/inner'; @@ -60,11 +61,36 @@ async function onDelete(row: Demo03StudentApi.Demo03Student) { await deleteDemo03Student(row.id as number); message.success($t('ui.actionMessage.deleteSuccess', [row.id])); onRefresh(); - } catch { + } finally { hideLoading(); } } +/** 批量删除学生 */ +async function onDeleteBatch() { + const hideLoading = message.loading({ + content: $t('ui.actionMessage.deleting'), + duration: 0, + key: 'action_process_msg', + }); + try { + await deleteDemo03StudentListByIds(deleteIds.value); + message.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); + } finally { + hideLoading(); + } +} + +const deleteIds = ref([]); // 待删除学生 ID +function setDeleteIds({ + records, +}: { + records: Demo03StudentApi.Demo03Student[]; +}) { + deleteIds.value = records.map((item) => item.id); +} + /** 导出表格 */ async function onExport() { const data = await exportDemo03Student(await gridApi.formApi.getValues()); @@ -118,6 +144,10 @@ const [Grid, gridApi] = useVbenVxeGrid({ search: true, }, } as VxeTableGridOptions, + gridEvents: { + checkboxAll: setDeleteIds, + checkboxChange: setDeleteIds, + }, }); @@ -155,6 +185,17 @@ const [Grid, gridApi] = useVbenVxeGrid({ > {{ $t('ui.actionTitle.export') }} + diff --git a/apps/web-antd/src/views/infra/demo/demo03/inner/modules/demo03-course-list.vue b/apps/web-antd/src/views/infra/demo/demo03/inner/modules/demo03-course-list.vue index c0d159d1..fec5ee91 100644 --- a/apps/web-antd/src/views/infra/demo/demo03/inner/modules/demo03-course-list.vue +++ b/apps/web-antd/src/views/infra/demo/demo03/inner/modules/demo03-course-list.vue @@ -16,18 +16,18 @@ const props = defineProps<{ const [Grid, gridApi] = useVbenVxeGrid({ gridOptions: { columns: useDemo03CourseGridColumns(), - height: 'auto', - rowConfig: { - keyField: 'id', - isHover: true, - }, pagerConfig: { enabled: false, }, toolbarConfig: { enabled: false, }, - } as VxeTableGridOptions, + height: '600px', + rowConfig: { + keyField: 'id', + isHover: true, + }, + } as VxeTableGridOptions, }); /** 刷新表格 */ diff --git a/apps/web-antd/src/views/infra/demo/demo03/inner/modules/demo03-grade-form.vue b/apps/web-antd/src/views/infra/demo/demo03/inner/modules/demo03-grade-form.vue index bdfff11f..3e285460 100644 --- a/apps/web-antd/src/views/infra/demo/demo03/inner/modules/demo03-grade-form.vue +++ b/apps/web-antd/src/views/infra/demo/demo03/inner/modules/demo03-grade-form.vue @@ -11,6 +11,13 @@ const props = defineProps<{ }>(); const [Form, formApi] = useVbenForm({ + commonConfig: { + componentProps: { + class: 'w-full', + }, + formItemClass: 'col-span-2', + labelWidth: 80, + }, layout: 'horizontal', schema: useDemo03GradeFormSchema(), showDefaultActions: false, diff --git a/apps/web-antd/src/views/infra/demo/demo03/inner/modules/demo03-grade-list.vue b/apps/web-antd/src/views/infra/demo/demo03/inner/modules/demo03-grade-list.vue index 7806df60..64ac13e3 100644 --- a/apps/web-antd/src/views/infra/demo/demo03/inner/modules/demo03-grade-list.vue +++ b/apps/web-antd/src/views/infra/demo/demo03/inner/modules/demo03-grade-list.vue @@ -16,18 +16,18 @@ const props = defineProps<{ const [Grid, gridApi] = useVbenVxeGrid({ gridOptions: { columns: useDemo03GradeGridColumns(), - height: 'auto', - rowConfig: { - keyField: 'id', - isHover: true, - }, pagerConfig: { enabled: false, }, toolbarConfig: { enabled: false, }, - } as VxeTableGridOptions, + height: '600px', + rowConfig: { + keyField: 'id', + isHover: true, + }, + } as VxeTableGridOptions, }); /** 刷新表格 */ diff --git a/apps/web-antd/src/views/infra/demo/demo03/inner/modules/form.vue b/apps/web-antd/src/views/infra/demo/demo03/inner/modules/form.vue index ace0ddd5..58dc7b54 100644 --- a/apps/web-antd/src/views/infra/demo/demo03/inner/modules/form.vue +++ b/apps/web-antd/src/views/infra/demo/demo03/inner/modules/form.vue @@ -61,8 +61,8 @@ const [Modal, modalApi] = useVbenModal({ // 提交表单 const data = (await formApi.getValues()) as Demo03StudentApi.Demo03Student; // 拼接子表的数据 - data.demo03courses = demo03CourseFormRef.value?.getData(); - data.demo03grade = await demo03GradeFormRef.value?.getValues(); + data.demo03Courses = demo03CourseFormRef.value?.getData(); + data.demo03Grade = await demo03GradeFormRef.value?.getValues(); try { await (formData.value?.id ? updateDemo03Student(data) @@ -80,7 +80,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - // 加载数据 let data = modalApi.getData(); if (!data) { diff --git a/apps/web-antd/src/views/infra/demo/demo03/normal/data.ts b/apps/web-antd/src/views/infra/demo/demo03/normal/data.ts index 6520e9b3..9d515e49 100644 --- a/apps/web-antd/src/views/infra/demo/demo03/normal/data.ts +++ b/apps/web-antd/src/views/infra/demo/demo03/normal/data.ts @@ -107,6 +107,7 @@ export function useGridColumns( onActionClick?: OnActionClickFn, ): VxeTableGridOptions['columns'] { return [ + { type: 'checkbox', width: 40 }, { field: 'id', title: '编号', @@ -149,7 +150,6 @@ export function useGridColumns( minWidth: 200, align: 'center', fixed: 'right', - headerAlign: 'center', showOverflow: false, cellRender: { attrs: { @@ -198,7 +198,6 @@ export function useDemo03CourseGridEditColumns( minWidth: 60, align: 'center', fixed: 'right', - headerAlign: 'center', showOverflow: false, cellRender: { attrs: { diff --git a/apps/web-antd/src/views/infra/demo/demo03/normal/index.vue b/apps/web-antd/src/views/infra/demo/demo03/normal/index.vue index 01cd47f8..e492af9c 100644 --- a/apps/web-antd/src/views/infra/demo/demo03/normal/index.vue +++ b/apps/web-antd/src/views/infra/demo/demo03/normal/index.vue @@ -5,17 +5,18 @@ import type { } from '#/adapter/vxe-table'; import type { Demo03StudentApi } from '#/api/infra/demo/demo03/normal'; -import { h } from 'vue'; +import { 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 } from 'ant-design-vue'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { deleteDemo03Student, + deleteDemo03StudentListByIds, exportDemo03Student, getDemo03StudentPage, } from '#/api/infra/demo/demo03/normal'; @@ -55,7 +56,31 @@ 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 +function setDeleteIds({ + records, +}: { + records: Demo03StudentApi.Demo03Student[]; +}) { + deleteIds.value = records.map((item) => item.id); +} +/** 批量删除学生 */ +async function onDeleteBatch() { + const hideLoading = message.loading({ + content: $t('ui.actionMessage.deleting'), + duration: 0, + key: 'action_process_msg', + }); + try { + await deleteDemo03StudentListByIds(deleteIds.value); + message.success($t('ui.actionMessage.deleteSuccess')); + onRefresh(); + } finally { hideLoading(); } } @@ -113,6 +138,10 @@ const [Grid, gridApi] = useVbenVxeGrid({ search: true, }, } as VxeTableGridOptions, + gridEvents: { + checkboxAll: setDeleteIds, + checkboxChange: setDeleteIds, + }, }); @@ -139,6 +168,17 @@ const [Grid, gridApi] = useVbenVxeGrid({ > {{ $t('ui.actionTitle.export') }} + diff --git a/apps/web-antd/src/views/infra/demo/demo03/normal/modules/demo03-grade-form.vue b/apps/web-antd/src/views/infra/demo/demo03/normal/modules/demo03-grade-form.vue index 75a8147d..5d5f396b 100644 --- a/apps/web-antd/src/views/infra/demo/demo03/normal/modules/demo03-grade-form.vue +++ b/apps/web-antd/src/views/infra/demo/demo03/normal/modules/demo03-grade-form.vue @@ -11,6 +11,13 @@ const props = defineProps<{ }>(); const [Form, formApi] = useVbenForm({ + commonConfig: { + componentProps: { + class: 'w-full', + }, + formItemClass: 'col-span-2', + labelWidth: 80, + }, layout: 'horizontal', schema: useDemo03GradeFormSchema(), showDefaultActions: false, diff --git a/apps/web-antd/src/views/infra/demo/demo03/normal/modules/form.vue b/apps/web-antd/src/views/infra/demo/demo03/normal/modules/form.vue index 14a52585..72cbf278 100644 --- a/apps/web-antd/src/views/infra/demo/demo03/normal/modules/form.vue +++ b/apps/web-antd/src/views/infra/demo/demo03/normal/modules/form.vue @@ -61,8 +61,8 @@ const [Modal, modalApi] = useVbenModal({ // 提交表单 const data = (await formApi.getValues()) as Demo03StudentApi.Demo03Student; // 拼接子表的数据 - data.demo03courses = demo03CourseFormRef.value?.getData(); - data.demo03grade = await demo03GradeFormRef.value?.getValues(); + data.demo03Courses = demo03CourseFormRef.value?.getData(); + data.demo03Grade = await demo03GradeFormRef.value?.getValues(); try { await (formData.value?.id ? updateDemo03Student(data) @@ -80,7 +80,6 @@ const [Modal, modalApi] = useVbenModal({ formData.value = undefined; return; } - // 加载数据 let data = modalApi.getData(); if (!data) { diff --git a/apps/web-antd/src/views/infra/demo/general/demo01/index.vue b/apps/web-antd/src/views/infra/demo/general/demo01/index.vue index b9249f0e..08ffc3bd 100644 --- a/apps/web-antd/src/views/infra/demo/general/demo01/index.vue +++ b/apps/web-antd/src/views/infra/demo/general/demo01/index.vue @@ -4,11 +4,12 @@ import type { Demo01ContactApi } from '#/api/infra/demo/demo01'; import { h, onMounted, reactive, ref } from 'vue'; import { Page, useVbenModal } from '@vben/common-ui'; -import { Download, Plus } from '@vben/icons'; +import { Download, Plus, Trash2 } from '@vben/icons'; import { cloneDeep, downloadFileFromBlobPart, formatDateTime, + isEmpty, } from '@vben/utils'; import { @@ -24,6 +25,7 @@ import { import { VxeColumn, VxeTable } from '#/adapter/vxe-table'; import { deleteDemo01Contact, + deleteDemo01ContactListByIds, exportDemo01Contact, getDemo01ContactPage, } from '#/api/infra/demo/demo01'; @@ -38,6 +40,7 @@ import Demo01ContactForm from './modules/form.vue'; const loading = ref(true); // 列表的加载中 const list = ref([]); // 列表的数据 + const total = ref(0); // 列表的总页数 const queryParams = reactive({ pageNo: 1, @@ -101,13 +104,41 @@ async function onDelete(row: Demo01ContactApi.Demo01Contact) { }); try { await deleteDemo01Contact(row.id as number); - message.success($t('ui.actionMessage.deleteSuccess', [row.id])); + message.success({ + content: $t('ui.actionMessage.deleteSuccess', [row.id]), + key: 'action_process_msg', + }); await getList(); - } catch { + } finally { hideLoading(); } } +/** 批量删除示例联系人 */ +async function onDeleteBatch() { + const hideLoading = message.loading({ + content: $t('ui.actionMessage.deleting'), + duration: 0, + key: 'action_process_msg', + }); + try { + await deleteDemo01ContactListByIds(deleteIds.value); + message.success($t('ui.actionMessage.deleteSuccess')); + await getList(); + } finally { + hideLoading(); + } +} + +const deleteIds = ref([]); // 待删除示例联系人 ID +function setDeleteIds({ + records, +}: { + records: Demo01ContactApi.Demo01Contact[]; +}) { + deleteIds.value = records.map((item) => item.id); +} + /** 导出表格 */ async function onExport() { try { @@ -205,9 +236,28 @@ onMounted(() => { > {{ $t('ui.actionTitle.export') }} + - + + @@ -240,6 +290,7 @@ onMounted(() => { + { }" show-overflow :loading="loading" + @checkbox-all="setDeleteIds" + @checkbox-change="setDeleteIds" > + diff --git a/apps/web-antd/src/views/infra/demo/general/demo03/erp/modules/demo03-course-list.vue b/apps/web-antd/src/views/infra/demo/general/demo03/erp/modules/demo03-course-list.vue index 346032d3..00caaca1 100644 --- a/apps/web-antd/src/views/infra/demo/general/demo03/erp/modules/demo03-course-list.vue +++ b/apps/web-antd/src/views/infra/demo/general/demo03/erp/modules/demo03-course-list.vue @@ -4,8 +4,8 @@ import type { Demo03StudentApi } from '#/api/infra/demo/demo03/erp'; import { h, nextTick, onMounted, reactive, ref, watch } from 'vue'; import { useVbenModal } from '@vben/common-ui'; -import { Plus } from '@vben/icons'; -import { cloneDeep, formatDateTime } from '@vben/utils'; +import { Plus, Trash2 } from '@vben/icons'; +import { cloneDeep, formatDateTime, isEmpty } from '@vben/utils'; import { Button, @@ -19,6 +19,7 @@ import { import { VxeColumn, VxeTable } from '#/adapter/vxe-table'; import { deleteDemo03Course, + deleteDemo03CourseListByIds, getDemo03CoursePage, } from '#/api/infra/demo/demo03/erp'; import { ContentWrap } from '#/components/content-wrap'; @@ -61,13 +62,41 @@ async function onDelete(row: Demo03StudentApi.Demo03Course) { }); try { await deleteDemo03Course(row.id as number); - message.success($t('ui.actionMessage.deleteSuccess', [row.id])); - getList(); - } catch { + message.success({ + content: $t('ui.actionMessage.deleteSuccess', [row.id]), + key: 'action_process_msg', + }); + await getList(); + } finally { hideLoading(); } } +/** 批量删除学生课程 */ +async function onDeleteBatch() { + const hideLoading = message.loading({ + content: $t('ui.actionMessage.deleting'), + duration: 0, + key: 'action_process_msg', + }); + try { + await deleteDemo03CourseListByIds(deleteIds.value); + message.success($t('ui.actionMessage.deleteSuccess')); + await getList(); + } finally { + hideLoading(); + } +} + +const deleteIds = ref([]); // 待删除学生课程 ID +function setDeleteIds({ + records, +}: { + records: Demo03StudentApi.Demo03Course[]; +}) { + deleteIds.value = records.map((item) => item.id); +} + const loading = ref(true); // 列表的加载中 const list = ref([]); // 列表的数据 const total = ref(0); // 列表的总页数 @@ -100,9 +129,6 @@ const getList = async () => { return []; } const params = cloneDeep(queryParams) as any; - if (params.birthday && Array.isArray(params.birthday)) { - params.birthday = (params.birthday as string[]).join(','); - } if (params.createTime && Array.isArray(params.createTime)) { params.createTime = (params.createTime as string[]).join(','); } @@ -200,9 +226,28 @@ onMounted(() => { > {{ $t('ui.actionTitle.create', ['学生']) }} + - + + diff --git a/apps/web-antd/src/views/infra/demo/general/demo03/erp/modules/demo03-grade-list.vue b/apps/web-antd/src/views/infra/demo/general/demo03/erp/modules/demo03-grade-list.vue index 921d896d..f25c1be2 100644 --- a/apps/web-antd/src/views/infra/demo/general/demo03/erp/modules/demo03-grade-list.vue +++ b/apps/web-antd/src/views/infra/demo/general/demo03/erp/modules/demo03-grade-list.vue @@ -4,8 +4,8 @@ import type { Demo03StudentApi } from '#/api/infra/demo/demo03/erp'; import { h, nextTick, onMounted, reactive, ref, watch } from 'vue'; import { useVbenModal } from '@vben/common-ui'; -import { Plus } from '@vben/icons'; -import { cloneDeep, formatDateTime } from '@vben/utils'; +import { Plus, Trash2 } from '@vben/icons'; +import { cloneDeep, formatDateTime, isEmpty } from '@vben/utils'; import { Button, @@ -19,6 +19,7 @@ import { import { VxeColumn, VxeTable } from '#/adapter/vxe-table'; import { deleteDemo03Grade, + deleteDemo03GradeListByIds, getDemo03GradePage, } from '#/api/infra/demo/demo03/erp'; import { ContentWrap } from '#/components/content-wrap'; @@ -61,13 +62,41 @@ async function onDelete(row: Demo03StudentApi.Demo03Grade) { }); try { await deleteDemo03Grade(row.id as number); - message.success($t('ui.actionMessage.deleteSuccess', [row.id])); - getList(); - } catch { + message.success({ + content: $t('ui.actionMessage.deleteSuccess', [row.id]), + key: 'action_process_msg', + }); + await getList(); + } finally { hideLoading(); } } +/** 批量删除学生班级 */ +async function onDeleteBatch() { + const hideLoading = message.loading({ + content: $t('ui.actionMessage.deleting'), + duration: 0, + key: 'action_process_msg', + }); + try { + await deleteDemo03GradeListByIds(deleteIds.value); + message.success($t('ui.actionMessage.deleteSuccess')); + await getList(); + } finally { + hideLoading(); + } +} + +const deleteIds = ref([]); // 待删除学生班级 ID +function setDeleteIds({ + records, +}: { + records: Demo03StudentApi.Demo03Grade[]; +}) { + deleteIds.value = records.map((item) => item.id); +} + const loading = ref(true); // 列表的加载中 const list = ref([]); // 列表的数据 const total = ref(0); // 列表的总页数 @@ -100,9 +129,6 @@ const getList = async () => { return []; } const params = cloneDeep(queryParams) as any; - if (params.birthday && Array.isArray(params.birthday)) { - params.birthday = (params.birthday as string[]).join(','); - } if (params.createTime && Array.isArray(params.createTime)) { params.createTime = (params.createTime as string[]).join(','); } @@ -200,9 +226,28 @@ onMounted(() => { > {{ $t('ui.actionTitle.create', ['学生']) }} + - + + diff --git a/apps/web-antd/src/views/infra/demo/general/demo03/erp/modules/form.vue b/apps/web-antd/src/views/infra/demo/general/demo03/erp/modules/form.vue index b88bb69b..6bec7dac 100644 --- a/apps/web-antd/src/views/infra/demo/general/demo03/erp/modules/form.vue +++ b/apps/web-antd/src/views/infra/demo/general/demo03/erp/modules/form.vue @@ -116,7 +116,7 @@ const [Modal, modalApi] = useVbenModal({ {{ dict.label }} diff --git a/apps/web-antd/src/views/infra/demo/general/demo03/inner/index.vue b/apps/web-antd/src/views/infra/demo/general/demo03/inner/index.vue index 71f005b8..edc1a9a4 100644 --- a/apps/web-antd/src/views/infra/demo/general/demo03/inner/index.vue +++ b/apps/web-antd/src/views/infra/demo/general/demo03/inner/index.vue @@ -4,16 +4,16 @@ import type { Demo03StudentApi } from '#/api/infra/demo/demo03/normal'; import { h, onMounted, reactive, ref } from 'vue'; import { Page, useVbenModal } from '@vben/common-ui'; -import { Download, Plus } from '@vben/icons'; +import { Download, Plus, Trash2 } from '@vben/icons'; import { cloneDeep, downloadFileFromBlobPart, formatDateTime, + isEmpty, } from '@vben/utils'; import { Button, - DatePicker, Form, Input, message, @@ -26,6 +26,7 @@ import { import { VxeColumn, VxeTable } from '#/adapter/vxe-table'; import { deleteDemo03Student, + deleteDemo03StudentListByIds, exportDemo03Student, getDemo03StudentPage, } from '#/api/infra/demo/demo03/normal'; @@ -52,7 +53,6 @@ const queryParams = reactive({ pageSize: 10, name: undefined, sex: undefined, - birthday: undefined, description: undefined, createTime: undefined, }); @@ -64,9 +64,6 @@ const getList = async () => { loading.value = true; try { const params = cloneDeep(queryParams) as any; - if (params.birthday && Array.isArray(params.birthday)) { - params.birthday = (params.birthday as string[]).join(','); - } if (params.createTime && Array.isArray(params.createTime)) { params.createTime = (params.createTime as string[]).join(','); } @@ -114,13 +111,41 @@ async function onDelete(row: Demo03StudentApi.Demo03Student) { }); try { await deleteDemo03Student(row.id as number); - message.success($t('ui.actionMessage.deleteSuccess', [row.id])); + message.success({ + content: $t('ui.actionMessage.deleteSuccess', [row.id]), + key: 'action_process_msg', + }); await getList(); - } catch { + } finally { hideLoading(); } } +/** 批量删除学生 */ +async function onDeleteBatch() { + const hideLoading = message.loading({ + content: $t('ui.actionMessage.deleting'), + duration: 0, + key: 'action_process_msg', + }); + try { + await deleteDemo03StudentListByIds(deleteIds.value); + message.success($t('ui.actionMessage.deleteSuccess')); + await getList(); + } finally { + hideLoading(); + } +} + +const deleteIds = ref([]); // 待删除学生 ID +function setDeleteIds({ + records, +}: { + records: Demo03StudentApi.Demo03Student[]; +}) { + deleteIds.value = records.map((item) => item.id); +} + /** 导出表格 */ async function onExport() { try { @@ -174,15 +199,6 @@ onMounted(() => { - - - { > {{ $t('ui.actionTitle.export') }} + - + + - + + diff --git a/apps/web-antd/src/views/infra/demo/general/demo03/normal/modules/form.vue b/apps/web-antd/src/views/infra/demo/general/demo03/normal/modules/form.vue index 4681d3f2..84169a29 100644 --- a/apps/web-antd/src/views/infra/demo/general/demo03/normal/modules/form.vue +++ b/apps/web-antd/src/views/infra/demo/general/demo03/normal/modules/form.vue @@ -83,7 +83,7 @@ const [Modal, modalApi] = useVbenModal({ const data = formData.value as Demo03StudentApi.Demo03Student; // 拼接子表的数据 data.demo03courses = demo03CourseFormRef.value?.getData(); - data.demo03grade = demo03GradeFormRef.value?.getValues(); + data.demo03grade = demo03GradeFormRef.value?.getValues() as any; try { await (formData.value?.id ? updateDemo03Student(data) @@ -135,7 +135,7 @@ const [Modal, modalApi] = useVbenModal({ {{ dict.label }} diff --git a/apps/web-antd/src/views/infra/file/data.ts b/apps/web-antd/src/views/infra/file/data.ts index 18d580cd..912e1c94 100644 --- a/apps/web-antd/src/views/infra/file/data.ts +++ b/apps/web-antd/src/views/infra/file/data.ts @@ -1,13 +1,8 @@ import type { VbenFormSchema } from '#/adapter/form'; -import type { OnActionClickFn, VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { InfraFileApi } from '#/api/infra/file'; - -import { useAccess } from '@vben/access'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import { getRangePickerDefaultProps } from '#/utils'; -const { hasAccessByCodes } = useAccess(); - /** 表单的字段 */ export function useFormSchema(): VbenFormSchema[] { return [ @@ -57,9 +52,7 @@ export function useGridFormSchema(): VbenFormSchema[] { } /** 列表的字段 */ -export function useGridColumns( - onActionClick: OnActionClickFn, -): VxeTableGridOptions['columns'] { +export function useGridColumns(): VxeTableGridOptions['columns'] { return [ { field: 'name', @@ -112,29 +105,10 @@ export function useGridColumns( formatter: 'formatDateTime', }, { - field: 'operation', title: '操作', width: 160, fixed: 'right', - align: 'center', - cellRender: { - attrs: { - nameField: 'name', - nameTitle: '文件', - onClick: onActionClick, - }, - name: 'CellOperation', - options: [ - { - code: 'copyUrl', - text: '复制链接', - }, - { - code: 'delete', - show: hasAccessByCodes(['infra:file:delete']), - }, - ], - }, + slots: { default: 'actions' }, }, ]; } diff --git a/apps/web-antd/src/views/infra/file/index.vue b/apps/web-antd/src/views/infra/file/index.vue index cd9bac16..6d55c409 100644 --- a/apps/web-antd/src/views/infra/file/index.vue +++ b/apps/web-antd/src/views/infra/file/index.vue @@ -1,18 +1,14 @@ diff --git a/apps/web-antd/src/views/infra/job/modules/detail.vue b/apps/web-antd/src/views/infra/job/modules/detail.vue index bd7f39b0..9a0c2f71 100644 --- a/apps/web-antd/src/views/infra/job/modules/detail.vue +++ b/apps/web-antd/src/views/infra/job/modules/detail.vue @@ -4,13 +4,11 @@ import type { InfraJobApi } from '#/api/infra/job'; import { ref } from 'vue'; import { useVbenModal } from '@vben/common-ui'; -import { formatDateTime } from '@vben/utils'; - -import { Descriptions, Timeline } from 'ant-design-vue'; import { getJob, getJobNextTimes } from '#/api/infra/job'; -import { DictTag } from '#/components/dict-tag'; -import { DICT_TYPE } from '#/utils'; +import { useDescription } from '#/components/description'; + +import { useDetailSchema } from '../data'; const formData = ref(); // 任务详情 const nextTimes = ref([]); // 下一次执行时间 @@ -31,11 +29,21 @@ const [Modal, modalApi] = useVbenModal({ formData.value = await getJob(data.id); // 获取下一次执行时间 nextTimes.value = await getJobNextTimes(data.id); + formData.value.nextTimes = nextTimes.value; } finally { modalApi.unlock(); } }, }); + +const [Description] = useDescription({ + componentProps: { + bordered: true, + column: 1, + class: 'mx-4', + }, + schema: useDetailSchema(), +}); diff --git a/apps/web-antd/src/views/infra/redis/index.vue b/apps/web-antd/src/views/infra/redis/index.vue index 687284db..d3bf1eda 100644 --- a/apps/web-antd/src/views/infra/redis/index.vue +++ b/apps/web-antd/src/views/infra/redis/index.vue @@ -17,16 +17,16 @@ import Memory from './modules/memory.vue'; const redisData = ref(); /** 统一加载 Redis 数据 */ -const loadRedisData = async () => { +async function loadRedisData() { try { redisData.value = await getRedisMonitorInfo(); } catch (error) { console.error('加载 Redis 数据失败', error); } -}; +} -onMounted(() => { - loadRedisData(); +onMounted(async () => { + await loadRedisData(); }); @@ -37,9 +37,11 @@ onMounted(() => { - - - +
+ + + +
diff --git a/apps/web-antd/src/views/infra/redis/modules/commands.vue b/apps/web-antd/src/views/infra/redis/modules/commands.vue index 5c7e375b..25c263e6 100644 --- a/apps/web-antd/src/views/infra/redis/modules/commands.vue +++ b/apps/web-antd/src/views/infra/redis/modules/commands.vue @@ -15,7 +15,7 @@ const chartRef = ref(); const { renderEcharts } = useEcharts(chartRef); /** 渲染命令统计图表 */ -const renderCommandStats = () => { +function renderCommandStats() { if (!props.redisData?.commandStats) { return; } @@ -76,7 +76,7 @@ const renderCommandStats = () => { }, ], }); -}; +} /** 监听数据变化,重新渲染图表 */ watch( @@ -97,7 +97,5 @@ onMounted(() => { diff --git a/apps/web-antd/src/views/infra/redis/modules/memory.vue b/apps/web-antd/src/views/infra/redis/modules/memory.vue index 04f26756..5220c463 100644 --- a/apps/web-antd/src/views/infra/redis/modules/memory.vue +++ b/apps/web-antd/src/views/infra/redis/modules/memory.vue @@ -15,7 +15,7 @@ const chartRef = ref(); const { renderEcharts } = useEcharts(chartRef); /** 解析内存值,移除单位,转为数字 */ -const parseMemoryValue = (memStr: string | undefined): number => { +function parseMemoryValue(memStr: string | undefined): number { if (!memStr) { return 0; } @@ -27,10 +27,10 @@ const parseMemoryValue = (memStr: string | undefined): number => { } catch { return 0; } -}; +} /** 渲染内存使用图表 */ -const renderMemoryChart = () => { +function renderMemoryChart() { if (!props.redisData?.info) { return; } @@ -94,7 +94,7 @@ const renderMemoryChart = () => { detail: { show: true, offsetCenter: [0, '50%'], - color: 'auto', + color: 'inherit', fontSize: 30, formatter: usedMemory, }, @@ -110,7 +110,7 @@ const renderMemoryChart = () => { }, ], }); -}; +} /** 监听数据变化,重新渲染图表 */ watch( @@ -131,7 +131,5 @@ onMounted(() => { diff --git a/apps/web-antd/src/views/infra/webSocket/index.vue b/apps/web-antd/src/views/infra/webSocket/index.vue index d3f00737..178300f9 100644 --- a/apps/web-antd/src/views/infra/webSocket/index.vue +++ b/apps/web-antd/src/views/infra/webSocket/index.vue @@ -100,7 +100,7 @@ watchEffect(() => { /** 发送消息 */ const sendText = ref(''); // 发送内容 const sendUserId = ref(''); // 发送人 -const handlerSend = () => { +function handlerSend() { if (!sendText.value.trim()) { message.warning('消息内容不能为空'); return; @@ -119,19 +119,19 @@ const handlerSend = () => { // 2. 最后发送消息 send(jsonMessage); sendText.value = ''; -}; +} /** 切换 websocket 连接状态 */ -const toggleConnectStatus = () => { +function toggleConnectStatus() { if (getIsOpen.value) { close(); } else { open(); } -}; +} /** 获取消息类型的徽标颜色 */ -const getMessageBadgeColor = (type?: string) => { +function getMessageBadgeColor(type?: string) { switch (type) { case 'group': { return 'green'; @@ -146,10 +146,10 @@ const getMessageBadgeColor = (type?: string) => { return 'default'; } } -}; +} /** 获取消息类型的文本 */ -const getMessageTypeText = (type?: string) => { +function getMessageTypeText(type?: string) { switch (type) { case 'group': { return '群发'; @@ -164,7 +164,7 @@ const getMessageTypeText = (type?: string) => { return '未知'; } } -}; +} /** 初始化 */ const userList = ref([]); // 用户列表 diff --git a/apps/web-antd/src/views/system/area/index.vue b/apps/web-antd/src/views/system/area/index.vue index 14d83fd1..da4ff8f6 100644 --- a/apps/web-antd/src/views/system/area/index.vue +++ b/apps/web-antd/src/views/system/area/index.vue @@ -24,7 +24,7 @@ function onRefresh() { } /** 查询 IP */ -function onQueryIp() { +function handleQueryIp() { formModalApi.setData(null).open(); } @@ -66,7 +66,7 @@ const [Grid, gridApi] = useVbenVxeGrid({