From f2f1675087bcacbcf400d5582f1b67e2523212ea Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 20 Oct 2025 22:22:49 +0800 Subject: [PATCH 01/30] =?UTF-8?q?feat=EF=BC=9A=E3=80=90ele=E3=80=91bpm=20f?= =?UTF-8?q?orm=20=E7=9A=84=E8=BF=81=E7=A7=BB=2050%=20=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-ele/src/views/bpm/form/data.ts | 61 ++++++ .../src/views/bpm/form/designer/data.ts | 46 +++++ .../src/views/bpm/form/designer/index.vue | 155 +++++++++++++++ .../views/bpm/form/designer/modules/form.vue | 111 +++++++++++ apps/web-ele/src/views/bpm/form/index.vue | 185 ++++++++++++++++++ .../src/views/bpm/form/modules/detail.vue | 49 +++++ 6 files changed, 607 insertions(+) create mode 100644 apps/web-ele/src/views/bpm/form/data.ts create mode 100644 apps/web-ele/src/views/bpm/form/designer/data.ts create mode 100644 apps/web-ele/src/views/bpm/form/designer/index.vue create mode 100644 apps/web-ele/src/views/bpm/form/designer/modules/form.vue create mode 100644 apps/web-ele/src/views/bpm/form/index.vue create mode 100644 apps/web-ele/src/views/bpm/form/modules/detail.vue diff --git a/apps/web-ele/src/views/bpm/form/data.ts b/apps/web-ele/src/views/bpm/form/data.ts new file mode 100644 index 000000000..315c41db6 --- /dev/null +++ b/apps/web-ele/src/views/bpm/form/data.ts @@ -0,0 +1,61 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; + +import { DICT_TYPE } from '@vben/constants'; + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'name', + label: '表单名称', + component: 'Input', + componentProps: { + placeholder: '请输入表单名称', + clearable: true, + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'id', + title: '编号', + minWidth: 100, + }, + { + field: 'name', + title: '表单名称', + minWidth: 200, + }, + { + field: 'status', + title: '状态', + minWidth: 200, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'remark', + title: '备注', + minWidth: 200, + }, + { + field: 'createTime', + title: '创建时间', + minWidth: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 240, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-ele/src/views/bpm/form/designer/data.ts b/apps/web-ele/src/views/bpm/form/designer/data.ts new file mode 100644 index 000000000..20740cbbb --- /dev/null +++ b/apps/web-ele/src/views/bpm/form/designer/data.ts @@ -0,0 +1,46 @@ +import type { VbenFormSchema } from '#/adapter/form'; + +import { CommonStatusEnum, DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { z } from '#/adapter/form'; + +/** 新增/修改的表单 */ +export function useFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'name', + label: '表单名称', + component: 'Input', + componentProps: { + placeholder: '请输入表单名称', + }, + rules: 'required', + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + placeholder: '请输入备注', + }, + }, + ]; +} diff --git a/apps/web-ele/src/views/bpm/form/designer/index.vue b/apps/web-ele/src/views/bpm/form/designer/index.vue new file mode 100644 index 000000000..d5eb7c269 --- /dev/null +++ b/apps/web-ele/src/views/bpm/form/designer/index.vue @@ -0,0 +1,155 @@ + + + diff --git a/apps/web-ele/src/views/bpm/form/designer/modules/form.vue b/apps/web-ele/src/views/bpm/form/designer/modules/form.vue new file mode 100644 index 000000000..a67b22ead --- /dev/null +++ b/apps/web-ele/src/views/bpm/form/designer/modules/form.vue @@ -0,0 +1,111 @@ + + + diff --git a/apps/web-ele/src/views/bpm/form/index.vue b/apps/web-ele/src/views/bpm/form/index.vue new file mode 100644 index 000000000..4b4083a99 --- /dev/null +++ b/apps/web-ele/src/views/bpm/form/index.vue @@ -0,0 +1,185 @@ + + + diff --git a/apps/web-ele/src/views/bpm/form/modules/detail.vue b/apps/web-ele/src/views/bpm/form/modules/detail.vue new file mode 100644 index 000000000..ad23d235b --- /dev/null +++ b/apps/web-ele/src/views/bpm/form/modules/detail.vue @@ -0,0 +1,49 @@ + + + From 39508453fac5ff4ccfd2d006833cbd7a13d75d90 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 20 Oct 2025 22:22:56 +0800 Subject: [PATCH 02/30] =?UTF-8?q?feat=EF=BC=9A=E3=80=90ele=E3=80=91bpm=20f?= =?UTF-8?q?orm=20=E7=9A=84=E8=BF=81=E7=A7=BB=2050%=20=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-ele/src/api/bpm/form/index.ts | 4 +- apps/web-ele/src/router/routes/modules/bpm.ts | 117 ++++++++++++++++++ 2 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 apps/web-ele/src/router/routes/modules/bpm.ts diff --git a/apps/web-ele/src/api/bpm/form/index.ts b/apps/web-ele/src/api/bpm/form/index.ts index 0789071b2..99c1299e9 100644 --- a/apps/web-ele/src/api/bpm/form/index.ts +++ b/apps/web-ele/src/api/bpm/form/index.ts @@ -5,7 +5,7 @@ import { requestClient } from '#/api/request'; export namespace BpmFormApi { /** 流程表单 */ export interface Form { - id?: number | undefined; + id?: number; name: string; conf: string; fields: string[]; @@ -23,7 +23,7 @@ export async function getFormPage(params: PageParam) { } /** 获取表单详情 */ -export async function getFormDetail(id: number) { +export async function getForm(id: number) { return requestClient.get(`/bpm/form/get?id=${id}`); } diff --git a/apps/web-ele/src/router/routes/modules/bpm.ts b/apps/web-ele/src/router/routes/modules/bpm.ts new file mode 100644 index 000000000..c6bbc66c2 --- /dev/null +++ b/apps/web-ele/src/router/routes/modules/bpm.ts @@ -0,0 +1,117 @@ +import type { RouteRecordRaw } from 'vue-router'; + +const routes: RouteRecordRaw[] = [ + { + path: '/bpm', + name: 'bpm', + meta: { + title: '工作流', + hideInMenu: true, + }, + children: [ + // { + // path: 'task', + // name: 'BpmTask', + // meta: { + // title: '审批中心', + // icon: 'ant-design:history-outlined', + // }, + // children: [ + // { + // path: 'my', + // name: 'BpmTaskMy', + // component: () => import('#/views/bpm/processInstance/index.vue'), + // meta: { + // title: '我的流程', + // }, + // }, + // ], + // }, + // { + // path: 'process-instance/detail', + // component: () => import('#/views/bpm/processInstance/detail/index.vue'), + // name: 'BpmProcessInstanceDetail', + // meta: { + // title: '流程详情', + // activePath: '/bpm/task/my', + // icon: 'ant-design:history-outlined', + // keepAlive: false, + // hideInMenu: true, + // }, + // props: (route) => { + // return { + // id: route.query.id, + // taskId: route.query.taskId, + // activityId: route.query.activityId, + // }; + // }, + // }, + { + path: '/bpm/manager/form/edit', + name: 'BpmFormEditor', + component: () => import('#/views/bpm/form/designer/index.vue'), + meta: { + title: '设计流程表单', + activePath: '/bpm/manager/form', + }, + props: (route) => { + return { + id: route.query.id, + type: route.query.type, + copyId: route.query.copyId, + }; + }, + }, + // { + // path: 'manager/model/create', + // component: () => import('#/views/bpm/model/form/index.vue'), + // name: 'BpmModelCreate', + // meta: { + // title: '创建流程', + // activePath: '/bpm/manager/model', + // icon: 'carbon:flow-connection', + // hideInMenu: true, + // keepAlive: true, + // }, + // }, + // { + // path: 'manager/model/:type/:id', + // component: () => import('#/views/bpm/model/form/index.vue'), + // name: 'BpmModelUpdate', + // meta: { + // title: '修改流程', + // activePath: '/bpm/manager/model', + // icon: 'carbon:flow-connection', + // hideInMenu: true, + // keepAlive: true, + // }, + // }, + // { + // path: 'manager/definition', + // component: () => import('#/views/bpm/model/definition/index.vue'), + // name: 'BpmProcessDefinition', + // meta: { + // title: '流程定义', + // activePath: '/bpm/manager/model', + // icon: 'carbon:flow-modeler', + // hideInMenu: true, + // keepAlive: true, + // }, + // }, + // { + // path: 'process-instance/report', + // component: () => import('#/views/bpm/processInstance/report/index.vue'), + // name: 'BpmProcessInstanceReport', + // meta: { + // title: '数据报表', + // activePath: '/bpm/manager/model', + // icon: 'carbon:data-2', + // hideInMenu: true, + // keepAlive: true, + // }, + // }, + ], + }, +]; + +export default routes; From 337c695b1dca6f1a9e154d7a5b8c76df8146bc44 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 20 Oct 2025 22:33:55 +0800 Subject: [PATCH 03/30] =?UTF-8?q?feat=EF=BC=9A=E3=80=90ele=E3=80=91bpm=20f?= =?UTF-8?q?orm=20=E7=9A=84=E8=BF=81=E7=A7=BB=20100%=20=E5=B7=B2=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-ele/src/views/bpm/form/designer/index.vue | 2 +- apps/web-ele/src/views/bpm/form/designer/modules/form.vue | 2 +- apps/web-ele/src/views/bpm/form/index.vue | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/web-ele/src/views/bpm/form/designer/index.vue b/apps/web-ele/src/views/bpm/form/designer/index.vue index d5eb7c269..bed5d62ac 100644 --- a/apps/web-ele/src/views/bpm/form/designer/index.vue +++ b/apps/web-ele/src/views/bpm/form/designer/index.vue @@ -5,7 +5,7 @@ import { Page, useVbenModal } from '@vben/common-ui'; import { useTabs } from '@vben/hooks'; import { IconifyIcon } from '@vben/icons'; -import FcDesigner from '@form-create/element-ui/designer'; +import FcDesigner from '@form-create/designer'; import { ElButton, ElMessage } from 'element-plus'; import { getForm } from '#/api/bpm/form'; diff --git a/apps/web-ele/src/views/bpm/form/designer/modules/form.vue b/apps/web-ele/src/views/bpm/form/designer/modules/form.vue index a67b22ead..9b9587030 100644 --- a/apps/web-ele/src/views/bpm/form/designer/modules/form.vue +++ b/apps/web-ele/src/views/bpm/form/designer/modules/form.vue @@ -1,5 +1,5 @@ + + diff --git a/apps/web-ele/src/views/bpm/processExpression/modules/form.vue b/apps/web-ele/src/views/bpm/processExpression/modules/form.vue new file mode 100644 index 000000000..9fb981483 --- /dev/null +++ b/apps/web-ele/src/views/bpm/processExpression/modules/form.vue @@ -0,0 +1,82 @@ + + + From 412982436ab266ee49371b649e0cff3ac99af9ee Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 20 Oct 2025 23:09:07 +0800 Subject: [PATCH 07/30] =?UTF-8?q?feat=EF=BC=9A=E3=80=90ele=E3=80=91bpm=20p?= =?UTF-8?q?rocessListener=20=E7=9A=84=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/bpm/processListener/data.ts | 15 +++++++++++++-- .../src/views/bpm/processListener/index.vue | 7 +++---- .../views/bpm/processListener/modules/form.vue | 4 +--- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/apps/web-antd/src/views/bpm/processListener/data.ts b/apps/web-antd/src/views/bpm/processListener/data.ts index 95b7bb39b..69f7d7c89 100644 --- a/apps/web-antd/src/views/bpm/processListener/data.ts +++ b/apps/web-antd/src/views/bpm/processListener/data.ts @@ -64,6 +64,7 @@ export function useFormSchema(): VbenFormSchema[] { component: 'Select', componentProps: { options: getDictOptions(DICT_TYPE.BPM_PROCESS_LISTENER_TYPE, 'string'), + placeholder: '请选择类型', allowClear: true, }, rules: 'required', @@ -74,6 +75,7 @@ export function useFormSchema(): VbenFormSchema[] { component: 'Select', componentProps: { options: EVENT_OPTIONS, + placeholder: '请选择事件', allowClear: true, }, rules: 'required', @@ -97,6 +99,7 @@ export function useFormSchema(): VbenFormSchema[] { DICT_TYPE.BPM_PROCESS_LISTENER_VALUE_TYPE, 'string', ), + placeholder: '请选择值类型', allowClear: true, }, rules: 'required', @@ -165,6 +168,15 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { props: { type: DICT_TYPE.BPM_PROCESS_LISTENER_TYPE }, }, }, + { + field: 'status', + title: '状态', + minWidth: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, { field: 'event', title: '事件', @@ -191,9 +203,8 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { formatter: 'formatDateTime', }, { - field: 'actions', title: '操作', - minWidth: 180, + width: 180, fixed: 'right', slots: { default: 'actions' }, }, diff --git a/apps/web-antd/src/views/bpm/processListener/index.vue b/apps/web-antd/src/views/bpm/processListener/index.vue index 91efc2fdf..a624f2948 100644 --- a/apps/web-antd/src/views/bpm/processListener/index.vue +++ b/apps/web-antd/src/views/bpm/processListener/index.vue @@ -44,11 +44,9 @@ async function handleDelete(row: BpmProcessListenerApi.ProcessListener) { }); try { await deleteProcessListener(row.id as number); - message.success({ - content: $t('ui.actionMessage.deleteSuccess', [row.name]), - }); + message.success($t('ui.actionMessage.deleteSuccess', [row.name])); handleRefresh(); - } catch { + } finally { hideLoading(); } } @@ -74,6 +72,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ }, rowConfig: { keyField: 'id', + isHover: true, }, toolbarConfig: { refresh: true, diff --git a/apps/web-antd/src/views/bpm/processListener/modules/form.vue b/apps/web-antd/src/views/bpm/processListener/modules/form.vue index ef56d794c..dc0cee273 100644 --- a/apps/web-antd/src/views/bpm/processListener/modules/form.vue +++ b/apps/web-antd/src/views/bpm/processListener/modules/form.vue @@ -55,9 +55,7 @@ const [Modal, modalApi] = useVbenModal({ // 关闭并提示 await modalApi.close(); emit('success'); - message.success({ - content: $t('ui.actionMessage.operationSuccess'), - }); + message.success($t('ui.actionMessage.operationSuccess')); } finally { modalApi.unlock(); } From 002ac223f065eab59a6e10544af09085b4d7fbc6 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 20 Oct 2025 23:12:24 +0800 Subject: [PATCH 08/30] =?UTF-8?q?feat=EF=BC=9A=E3=80=90ele=E3=80=91bpm=20p?= =?UTF-8?q?rocessListener=20=E7=9A=84=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/bpm/processListener/data.ts | 210 ++++++++++++++++++ .../src/views/bpm/processListener/index.vue | 135 +++++++++++ .../bpm/processListener/modules/form.vue | 89 ++++++++ 3 files changed, 434 insertions(+) create mode 100644 apps/web-ele/src/views/bpm/processListener/data.ts create mode 100644 apps/web-ele/src/views/bpm/processListener/index.vue create mode 100644 apps/web-ele/src/views/bpm/processListener/modules/form.vue diff --git a/apps/web-ele/src/views/bpm/processListener/data.ts b/apps/web-ele/src/views/bpm/processListener/data.ts new file mode 100644 index 000000000..339f2b8bf --- /dev/null +++ b/apps/web-ele/src/views/bpm/processListener/data.ts @@ -0,0 +1,210 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; + +import { CommonStatusEnum, DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { z } from '#/adapter/form'; + +export const EVENT_EXECUTION_OPTIONS = [ + { + label: 'start', + value: 'start', + }, + { + label: 'end', + value: 'end', + }, +]; + +export const EVENT_OPTIONS = [ + { label: 'create', value: 'create' }, + { label: 'assignment', value: 'assignment' }, + { label: 'complete', value: 'complete' }, + { label: 'delete', value: 'delete' }, + { label: 'update', value: 'update' }, + { label: 'timeout', value: 'timeout' }, +]; + +/** 新增/修改的表单 */ +export function useFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'name', + label: '名字', + component: 'Input', + componentProps: { + placeholder: '请输入名字', + }, + rules: 'required', + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择状态', + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + { + fieldName: 'type', + label: '类型', + component: 'Select', + componentProps: { + options: getDictOptions(DICT_TYPE.BPM_PROCESS_LISTENER_TYPE, 'string'), + placeholder: '请选择类型', + allowClear: true, + }, + rules: 'required', + }, + { + fieldName: 'event', + label: '事件', + component: 'Select', + componentProps: { + options: EVENT_OPTIONS, + placeholder: '请选择事件', + allowClear: true, + }, + rules: 'required', + dependencies: { + triggerFields: ['type'], + trigger: (values) => (values.event = undefined), + componentProps: (values) => ({ + options: + values.type === 'execution' + ? EVENT_EXECUTION_OPTIONS + : EVENT_OPTIONS, + }), + }, + }, + { + fieldName: 'valueType', + label: '值类型', + component: 'Select', + componentProps: { + options: getDictOptions( + DICT_TYPE.BPM_PROCESS_LISTENER_VALUE_TYPE, + 'string', + ), + placeholder: '请选择值类型', + allowClear: true, + }, + rules: 'required', + }, + { + fieldName: 'value', + label: '类路径|表达式', + component: 'Input', + rules: 'required', + dependencies: { + triggerFields: ['valueType'], + trigger: (values) => (values.value = undefined), + componentProps: (values) => ({ + placeholder: + values.valueType === 'class' ? '请输入类路径' : '请输入表达式', + }), + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'name', + label: '名字', + component: 'Input', + componentProps: { + placeholder: '请输入名字', + allowClear: true, + }, + }, + { + fieldName: 'type', + label: '类型', + component: 'Select', + componentProps: { + placeholder: '请选择类型', + options: getDictOptions(DICT_TYPE.BPM_PROCESS_LISTENER_TYPE, 'string'), + allowClear: true, + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'id', + title: '编号', + minWidth: 100, + }, + { + field: 'name', + title: '名字', + minWidth: 200, + }, + { + field: 'type', + title: '类型', + minWidth: 200, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.BPM_PROCESS_LISTENER_TYPE }, + }, + }, + { + field: 'status', + title: '状态', + minWidth: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'event', + title: '事件', + minWidth: 200, + }, + { + field: 'valueType', + title: '值类型', + minWidth: 200, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.BPM_PROCESS_LISTENER_VALUE_TYPE }, + }, + }, + { + field: 'value', + title: '值', + minWidth: 200, + }, + { + field: 'createTime', + title: '创建时间', + minWidth: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 180, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-ele/src/views/bpm/processListener/index.vue b/apps/web-ele/src/views/bpm/processListener/index.vue new file mode 100644 index 000000000..fee637190 --- /dev/null +++ b/apps/web-ele/src/views/bpm/processListener/index.vue @@ -0,0 +1,135 @@ + + + diff --git a/apps/web-ele/src/views/bpm/processListener/modules/form.vue b/apps/web-ele/src/views/bpm/processListener/modules/form.vue new file mode 100644 index 000000000..0e9a92672 --- /dev/null +++ b/apps/web-ele/src/views/bpm/processListener/modules/form.vue @@ -0,0 +1,89 @@ + + + From 3b4c01cedfcb2cc909b13d196625b401bdd6f672 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 20 Oct 2025 23:33:52 +0800 Subject: [PATCH 09/30] =?UTF-8?q?feat=EF=BC=9A=E3=80=90antd=E3=80=91bpm=20?= =?UTF-8?q?task=20=E7=9A=84=E9=83=A8=E5=88=86=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/api/bpm/definition/index.ts | 1 + apps/web-antd/src/api/bpm/task/index.ts | 1 + .../src/views/bpm/task/copy/index.vue | 4 +-- apps/web-antd/src/views/bpm/task/done/data.ts | 21 ++++++++++++--- .../src/views/bpm/task/done/index.vue | 26 +++++++++++++------ .../src/views/bpm/task/manager/index.vue | 5 ++-- apps/web-antd/src/views/bpm/task/todo/data.ts | 21 ++++++++++++--- .../src/views/bpm/task/todo/index.vue | 7 ++--- 8 files changed, 61 insertions(+), 25 deletions(-) diff --git a/apps/web-antd/src/api/bpm/definition/index.ts b/apps/web-antd/src/api/bpm/definition/index.ts index c7facf6ec..502d5e366 100644 --- a/apps/web-antd/src/api/bpm/definition/index.ts +++ b/apps/web-antd/src/api/bpm/definition/index.ts @@ -6,6 +6,7 @@ export namespace BpmProcessDefinitionApi { /** 流程定义 */ export interface ProcessDefinition { id: string; + key?: string; version: number; name: string; description: string; diff --git a/apps/web-antd/src/api/bpm/task/index.ts b/apps/web-antd/src/api/bpm/task/index.ts index 1ab011925..63e1af886 100644 --- a/apps/web-antd/src/api/bpm/task/index.ts +++ b/apps/web-antd/src/api/bpm/task/index.ts @@ -13,6 +13,7 @@ export namespace BpmTaskApi { status: number; // 监听器状态 event: string; // 监听事件 valueType: string; // 监听器值类型 + processInstance?: BpmProcessInstanceApi.ProcessInstance; // 流程实例 } // 流程任务 diff --git a/apps/web-antd/src/views/bpm/task/copy/index.vue b/apps/web-antd/src/views/bpm/task/copy/index.vue index 437f2551d..e13cf923c 100644 --- a/apps/web-antd/src/views/bpm/task/copy/index.vue +++ b/apps/web-antd/src/views/bpm/task/copy/index.vue @@ -46,14 +46,12 @@ const [Grid] = useVbenVxeGrid({ }, rowConfig: { keyField: 'id', + isHover: true, }, toolbarConfig: { refresh: true, search: true, }, - cellConfig: { - height: 64, - }, } as VxeTableGridOptions, }); diff --git a/apps/web-antd/src/views/bpm/task/done/data.ts b/apps/web-antd/src/views/bpm/task/done/data.ts index 9491148ec..f15df3548 100644 --- a/apps/web-antd/src/views/bpm/task/done/data.ts +++ b/apps/web-antd/src/views/bpm/task/done/data.ts @@ -19,13 +19,22 @@ export function useGridFormSchema(): VbenFormSchema[] { allowClear: true, }, }, + // TODO @AI:是不是直接 import 下,不要动态; { - fieldName: 'processDefinitionId', + fieldName: 'processDefinitionKey', label: '所属流程', - component: 'Input', + component: 'ApiSelect', componentProps: { - placeholder: '请输入流程定义的编号', + placeholder: '请选择流程定义', allowClear: true, + api: async () => { + const { getSimpleProcessDefinitionList } = await import( + '#/api/bpm/definition' + ); + return await getSimpleProcessDefinitionList(); + }, + labelField: 'name', + valueField: 'key', }, }, { @@ -88,6 +97,12 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { title: '发起人', minWidth: 120, }, + { + field: 'processInstance.createTime', + title: '发起时间', + minWidth: 180, + formatter: 'formatDateTime', + }, { field: 'name', title: '当前任务', diff --git a/apps/web-antd/src/views/bpm/task/done/index.vue b/apps/web-antd/src/views/bpm/task/done/index.vue index abd6fcbf6..0ea9e6670 100644 --- a/apps/web-antd/src/views/bpm/task/done/index.vue +++ b/apps/web-antd/src/views/bpm/task/done/index.vue @@ -6,6 +6,8 @@ import { DocAlert, Page } from '@vben/common-ui'; import { message } from 'ant-design-vue'; +import { $t } from '#/locales'; + import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { getTaskDonePage, withdrawTask } from '#/api/bpm/task'; import { router } from '#/router'; @@ -27,10 +29,17 @@ function handleHistory(row: BpmTaskApi.TaskManager) { /** 撤回任务 */ async function handleWithdraw(row: BpmTaskApi.TaskManager) { - await withdrawTask(row.id); - message.success('撤回成功'); - // 刷新表格数据 - await gridApi.query(); + const hideLoading = message.loading({ + content: '正在撤回中...', + duration: 0, + }); + try { + await withdrawTask(row.id); + message.success('撤回成功'); + await gridApi.query(); + } finally { + hideLoading(); + } } const [Grid, gridApi] = useVbenVxeGrid({ @@ -54,14 +63,12 @@ const [Grid, gridApi] = useVbenVxeGrid({ }, rowConfig: { keyField: 'id', + isHover: true, }, toolbarConfig: { refresh: true, search: true, }, - cellConfig: { - height: 64, - }, } as VxeTableGridOptions, }); @@ -90,7 +97,10 @@ const [Grid, gridApi] = useVbenVxeGrid({ type: 'link', icon: ACTION_ICON.EDIT, color: 'warning', - onClick: handleWithdraw.bind(null, row), + popConfirm: { + title: '确定要撤回该任务吗?', + confirm: handleWithdraw.bind(null, row), + }, }, { label: '历史', diff --git a/apps/web-antd/src/views/bpm/task/manager/index.vue b/apps/web-antd/src/views/bpm/task/manager/index.vue index dd47e9dcd..47496e1e7 100644 --- a/apps/web-antd/src/views/bpm/task/manager/index.vue +++ b/apps/web-antd/src/views/bpm/task/manager/index.vue @@ -43,14 +43,12 @@ const [Grid] = useVbenVxeGrid({ }, rowConfig: { keyField: 'id', + isHover: true, }, toolbarConfig: { refresh: true, search: true, }, - cellConfig: { - height: 64, - }, } as VxeTableGridOptions, }); @@ -60,6 +58,7 @@ const [Grid] = useVbenVxeGrid({ + + - - - + diff --git a/apps/web-ele/src/views/pay/order/data.ts b/apps/web-ele/src/views/pay/order/data.ts index 259137ef4..ff55e09f6 100644 --- a/apps/web-ele/src/views/pay/order/data.ts +++ b/apps/web-ele/src/views/pay/order/data.ts @@ -1,6 +1,5 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { PayOrderApi } from '#/api/pay/order'; import type { DescriptionItemSchema } from '#/components/description'; import { h } from 'vue'; @@ -184,53 +183,46 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'status', label: '支付状态', - content: (data: any) => + render: (val) => h(DictTag, { type: DICT_TYPE.PAY_ORDER_STATUS, - value: data?.status, + value: val, }), }, { field: 'price', label: '支付金额', - content: (data: PayOrderApi.Order) => - `¥${erpPriceInputFormatter(data?.price)}`, + render: (val) => `¥${erpPriceInputFormatter(val)}`, }, { field: 'channelFeePrice', label: '手续费', - content: (data: PayOrderApi.Order) => - `¥${erpPriceInputFormatter(data?.channelFeePrice)}`, + render: (val) => `¥${erpPriceInputFormatter(val)}`, }, { field: 'channelFeeRate', label: '手续费比例', - content: (data: PayOrderApi.Order) => - `${erpPriceInputFormatter(data?.channelFeeRate)}%`, + render: (val) => `${erpPriceInputFormatter(val)}%`, }, { field: 'successTime', label: '支付时间', - content: (data: PayOrderApi.Order) => - formatDateTime(data?.successTime) as string, + render: (val) => formatDateTime(val) as string, }, { field: 'expireTime', label: '失效时间', - content: (data: PayOrderApi.Order) => - formatDateTime(data?.expireTime) as string, + render: (val) => formatDateTime(val) as string, }, { field: 'createTime', label: '创建时间', - content: (data: PayOrderApi.Order) => - formatDateTime(data?.createTime) as string, + render: (val) => formatDateTime(val) as string, }, { field: 'updateTime', label: '更新时间', - content: (data: PayOrderApi.Order) => - formatDateTime(data?.updateTime) as string, + render: (val) => formatDateTime(val) as string, }, { field: 'subject', @@ -243,10 +235,10 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'channelCode', label: '支付渠道', - content: (data: PayOrderApi.Order) => + render: (val) => h(DictTag, { type: DICT_TYPE.PAY_CHANNEL_CODE, - value: data?.channelCode, + value: val, }), }, { @@ -256,10 +248,7 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'channelOrderNo', label: '渠道单号', - content: (data: PayOrderApi.Order) => - data?.channelOrderNo - ? h(ElTag, { color: 'green' }, () => data.channelOrderNo) - : '', + render: (val) => (val ? h(ElTag, { color: 'green' }, () => val) : ''), }, { field: 'channelUserId', @@ -268,8 +257,7 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'refundPrice', label: '退款金额', - content: (data: PayOrderApi.Order) => - `¥${erpPriceInputFormatter(data?.refundPrice)}`, + render: (val) => `¥${erpPriceInputFormatter(val)}`, }, { field: 'notifyUrl', diff --git a/apps/web-ele/src/views/pay/order/modules/detail.vue b/apps/web-ele/src/views/pay/order/modules/detail.vue index 7f52112ee..4072e4e45 100644 --- a/apps/web-ele/src/views/pay/order/modules/detail.vue +++ b/apps/web-ele/src/views/pay/order/modules/detail.vue @@ -13,14 +13,8 @@ import { useDetailSchema } from '../data'; const formData = ref(); const [Descriptions] = useDescription({ - componentProps: { - border: true, - column: 2, - direction: 'horizontal', - labelWidth: 140, - title: '', - extra: '', - }, + column: 2, + labelWidth: 140, schema: useDetailSchema(), }); diff --git a/apps/web-ele/src/views/pay/refund/data.ts b/apps/web-ele/src/views/pay/refund/data.ts index db140679f..8e1afd615 100644 --- a/apps/web-ele/src/views/pay/refund/data.ts +++ b/apps/web-ele/src/views/pay/refund/data.ts @@ -1,6 +1,5 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { PayRefundApi } from '#/api/pay/refund'; import type { DescriptionItemSchema } from '#/components/description'; import { h } from 'vue'; @@ -173,26 +172,22 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'merchantRefundId', label: '商户退款单号', - content: (data: PayRefundApi.Refund) => - h(ElTag, {}, () => data?.merchantRefundId || '-'), + render: (val) => h(ElTag, {}, () => val || '-'), }, { field: 'channelRefundNo', label: '渠道退款单号', - content: (data: PayRefundApi.Refund) => - h(ElTag, { type: 'success' }, () => data?.channelRefundNo || '-'), + render: (val) => h(ElTag, { type: 'success' }, () => val || '-'), }, { field: 'merchantOrderId', label: '商户支付单号', - content: (data: PayRefundApi.Refund) => - h(ElTag, {}, () => data?.merchantOrderId || '-'), + render: (val) => h(ElTag, {}, () => val || '-'), }, { field: 'channelOrderNo', label: '渠道支付单号', - content: (data: PayRefundApi.Refund) => - h(ElTag, { type: 'success' }, () => data?.channelOrderNo || '-'), + render: (val) => h(ElTag, { type: 'success' }, () => val || '-'), }, { field: 'appId', @@ -205,58 +200,55 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'payPrice', label: '支付金额', - content: (data: PayRefundApi.Refund) => + render: (val) => h( ElTag, { type: 'success' }, - () => `¥${erpPriceInputFormatter(data?.payPrice || 0)}`, + () => `¥${erpPriceInputFormatter(val || 0)}`, ), }, { field: 'refundPrice', label: '退款金额', - content: (data: PayRefundApi.Refund) => + render: (val) => h( ElTag, { type: 'danger' }, - () => `¥${erpPriceInputFormatter(data?.refundPrice || 0)}`, + () => `¥${erpPriceInputFormatter(val || 0)}`, ), }, { field: 'status', label: '退款状态', - content: (data: any) => + render: (val) => h(DictTag, { type: DICT_TYPE.PAY_REFUND_STATUS, - value: data?.status, + value: val, }), }, { field: 'successTime', label: '退款时间', - content: (data: PayRefundApi.Refund) => - formatDateTime(data?.successTime) as string, + render: (val) => formatDateTime(val) as string, }, { field: 'createTime', label: '创建时间', - content: (data: PayRefundApi.Refund) => - formatDateTime(data?.createTime) as string, + render: (val) => formatDateTime(val) as string, }, { field: 'updateTime', label: '更新时间', - content: (data: PayRefundApi.Refund) => - formatDateTime(data?.updateTime) as string, + render: (val) => formatDateTime(val) as string, }, // 渠道信息部分 { field: 'channelCode', label: '退款渠道', - content: (data: PayRefundApi.Refund) => + render: (val) => h(DictTag, { type: DICT_TYPE.PAY_CHANNEL_CODE, - value: data?.channelCode, + value: val, }), }, { diff --git a/apps/web-ele/src/views/pay/refund/modules/detail.vue b/apps/web-ele/src/views/pay/refund/modules/detail.vue index 1f3e380cb..7b02d9889 100644 --- a/apps/web-ele/src/views/pay/refund/modules/detail.vue +++ b/apps/web-ele/src/views/pay/refund/modules/detail.vue @@ -13,14 +13,8 @@ import { useDetailSchema } from '../data'; const formData = ref(); const [Descriptions] = useDescription({ - componentProps: { - border: true, - column: 2, - direction: 'horizontal', - labelWidth: 140, - title: '', - extra: '', - }, + column: 2, + labelWidth: 140, schema: useDetailSchema(), }); diff --git a/apps/web-ele/src/views/pay/transfer/data.ts b/apps/web-ele/src/views/pay/transfer/data.ts index 3ddbb0ea4..0e3b1a04c 100644 --- a/apps/web-ele/src/views/pay/transfer/data.ts +++ b/apps/web-ele/src/views/pay/transfer/data.ts @@ -1,6 +1,5 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { PayTransferApi } from '#/api/pay/transfer'; import type { DescriptionItemSchema } from '#/components/description'; import { h } from 'vue'; @@ -191,14 +190,12 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'merchantTransferId', label: '商户单号', - content: (data: PayTransferApi.Transfer) => - h(ElTag, {}, () => data?.merchantTransferId), + render: (val) => h(ElTag, {}, () => val), }, { field: 'no', label: '转账单号', - content: (data: PayTransferApi.Transfer) => - h(ElTag, { color: 'orange' }, () => data?.no), + render: (val) => h(ElTag, { color: 'orange' }, () => val), }, { field: 'appId', @@ -207,33 +204,31 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'status', label: '转账状态', - content: (data: any) => + render: (val) => h(DictTag, { type: DICT_TYPE.PAY_TRANSFER_STATUS, - value: data?.status, + value: val, }), }, { field: 'price', label: '转账金额', - content: (data: PayTransferApi.Transfer) => + render: (val) => h( ElTag, { color: 'success' }, - () => `¥${erpPriceInputFormatter(data?.price || 0)}`, + () => `¥${erpPriceInputFormatter(val || 0)}`, ), }, { field: 'successTime', label: '转账时间', - content: (data: PayTransferApi.Transfer) => - formatDateTime(data?.successTime) as string, + render: (val) => formatDateTime(val) as string, }, { field: 'createTime', label: '创建时间', - content: (data: PayTransferApi.Transfer) => - formatDateTime(data?.createTime) as string, + render: (val) => formatDateTime(val) as string, }, { field: 'userName', @@ -246,10 +241,10 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'channelCode', label: '支付渠道', - content: (data: PayTransferApi.Transfer) => + render: (val) => h(DictTag, { type: DICT_TYPE.PAY_CHANNEL_CODE, - value: data?.channelCode, + value: val, }), }, { @@ -259,10 +254,7 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'channelTransferNo', label: '渠道单号', - content: (data: PayTransferApi.Transfer) => - data?.channelTransferNo - ? h(ElTag, { color: 'success' }, () => data.channelTransferNo) - : '', + render: (val) => (val ? h(ElTag, { color: 'success' }, () => val) : ''), }, { field: 'notifyUrl', diff --git a/apps/web-ele/src/views/pay/transfer/modules/detail.vue b/apps/web-ele/src/views/pay/transfer/modules/detail.vue index 301f7aea1..deb23fabf 100644 --- a/apps/web-ele/src/views/pay/transfer/modules/detail.vue +++ b/apps/web-ele/src/views/pay/transfer/modules/detail.vue @@ -13,14 +13,8 @@ import { useDetailSchema } from '../data'; const formData = ref(); const [Descriptions] = useDescription({ - componentProps: { - border: true, - column: 2, - direction: 'horizontal', - labelWidth: 140, - title: '', - extra: '', - }, + column: 2, + labelWidth: 140, schema: useDetailSchema(), }); diff --git a/apps/web-ele/src/views/system/loginlog/data.ts b/apps/web-ele/src/views/system/loginlog/data.ts index e30d26076..2be5cdf1c 100644 --- a/apps/web-ele/src/views/system/loginlog/data.ts +++ b/apps/web-ele/src/views/system/loginlog/data.ts @@ -1,6 +1,5 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { SystemLoginLogApi } from '#/api/system/login-log'; import type { DescriptionItemSchema } from '#/components/description'; import { h } from 'vue'; @@ -110,10 +109,10 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'logType', label: '操作类型', - content: (data: SystemLoginLogApi.LoginLog) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.SYSTEM_LOGIN_TYPE, - value: data?.logType, + value: val, }); }, }, @@ -132,19 +131,17 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'result', label: '登录结果', - content: (data: SystemLoginLogApi.LoginLog) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.SYSTEM_LOGIN_RESULT, - value: data?.result, + value: val, }); }, }, { field: 'createTime', label: '登录日期', - content: (data: SystemLoginLogApi.LoginLog) => { - return formatDateTime(data?.createTime || '') as string; - }, + render: (val) => formatDateTime(val) as string, }, ]; } diff --git a/apps/web-ele/src/views/system/loginlog/modules/detail.vue b/apps/web-ele/src/views/system/loginlog/modules/detail.vue index 17b0a2f61..773069b9f 100644 --- a/apps/web-ele/src/views/system/loginlog/modules/detail.vue +++ b/apps/web-ele/src/views/system/loginlog/modules/detail.vue @@ -12,14 +12,8 @@ import { useDetailSchema } from '../data'; const formData = ref(); const [Descriptions] = useDescription({ - componentProps: { - border: true, - column: 1, - direction: 'horizontal', - labelWidth: 110, - title: '', - extra: '', - }, + column: 1, + labelWidth: 110, schema: useDetailSchema(), }); diff --git a/apps/web-ele/src/views/system/mail/log/data.ts b/apps/web-ele/src/views/system/mail/log/data.ts index 660760750..0eefc0087 100644 --- a/apps/web-ele/src/views/system/mail/log/data.ts +++ b/apps/web-ele/src/views/system/mail/log/data.ts @@ -1,6 +1,5 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { SystemMailLogApi } from '#/api/system/mail/log'; import type { DescriptionItemSchema } from '#/components/description'; import { h } from 'vue'; @@ -164,9 +163,7 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'createTime', label: '创建时间', - content: (data: SystemMailLogApi.MailLog) => { - return formatDateTime(data?.createTime || '') as string; - }, + render: (val) => formatDateTime(val) as string, }, { field: 'fromMail', @@ -175,14 +172,14 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'userId', label: '接收用户', - content: (data: SystemMailLogApi.MailLog) => { - if (data?.userType && data?.userId) { + render: (val, data) => { + if (data?.userType && val) { return h('div', [ h(DictTag, { type: DICT_TYPE.USER_TYPE, value: data.userType, }), - ` (${data.userId})`, + ` (${val})`, ]); } return '无'; @@ -191,10 +188,10 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'toMails', label: '接收信息', - content: (data: SystemMailLogApi.MailLog) => { + render: (val, data) => { const lines: string[] = []; - if (data?.toMails && data.toMails.length > 0) { - lines.push(`收件:${data.toMails.join('、')}`); + if (val && val.length > 0) { + lines.push(`收件:${val.join('、')}`); } if (data?.ccMails && data.ccMails.length > 0) { lines.push(`抄送:${data.ccMails.join('、')}`); @@ -227,28 +224,26 @@ export function useDetailSchema(): DescriptionItemSchema[] { field: 'templateContent', label: '邮件内容', span: 2, - content: (data: SystemMailLogApi.MailLog) => { + render: (val) => { return h('div', { - innerHTML: data?.templateContent || '', + innerHTML: val || '', }); }, }, { field: 'sendStatus', label: '发送状态', - content: (data: SystemMailLogApi.MailLog) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.SYSTEM_MAIL_SEND_STATUS, - value: data?.sendStatus, + value: val, }); }, }, { field: 'sendTime', label: '发送时间', - content: (data: SystemMailLogApi.MailLog) => { - return formatDateTime(data?.sendTime || '') as string; - }, + render: (val) => formatDateTime(val) as string, }, { field: 'sendMessageId', diff --git a/apps/web-ele/src/views/system/mail/log/modules/detail.vue b/apps/web-ele/src/views/system/mail/log/modules/detail.vue index c177f4adf..e70243d8b 100644 --- a/apps/web-ele/src/views/system/mail/log/modules/detail.vue +++ b/apps/web-ele/src/views/system/mail/log/modules/detail.vue @@ -12,14 +12,8 @@ import { useDetailSchema } from '../data'; const formData = ref(); const [Descriptions] = useDescription({ - componentProps: { - border: true, - column: 2, - direction: 'horizontal', - labelWidth: 140, - title: '', - extra: '', - }, + column: 2, + labelWidth: 140, schema: useDetailSchema(), }); diff --git a/apps/web-ele/src/views/system/notify/message/data.ts b/apps/web-ele/src/views/system/notify/message/data.ts index 5954d8989..c786ee144 100644 --- a/apps/web-ele/src/views/system/notify/message/data.ts +++ b/apps/web-ele/src/views/system/notify/message/data.ts @@ -1,6 +1,5 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { SystemNotifyMessageApi } from '#/api/system/notify/message'; import type { DescriptionItemSchema } from '#/components/description'; import { h } from 'vue'; @@ -166,10 +165,10 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'userType', label: '用户类型', - content: (data: SystemNotifyMessageApi.NotifyMessage) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.USER_TYPE, - value: data?.userType, + value: val, }); }, }, @@ -196,9 +195,9 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'templateParams', label: '模版参数', - content: (data: SystemNotifyMessageApi.NotifyMessage) => { + render: (val) => { try { - return JSON.stringify(data?.templateParams); + return JSON.stringify(val); } catch { return ''; } @@ -207,36 +206,32 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'templateType', label: '模版类型', - content: (data: SystemNotifyMessageApi.NotifyMessage) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.SYSTEM_NOTIFY_TEMPLATE_TYPE, - value: data?.templateType, + value: val, }); }, }, { field: 'readStatus', label: '是否已读', - content: (data: SystemNotifyMessageApi.NotifyMessage) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.INFRA_BOOLEAN_STRING, - value: data?.readStatus, + value: val, }); }, }, { field: 'readTime', label: '阅读时间', - content: (data: SystemNotifyMessageApi.NotifyMessage) => { - return formatDateTime(data?.readTime || '') as string; - }, + render: (val) => formatDateTime(val) as string, }, { field: 'createTime', label: '创建时间', - content: (data: SystemNotifyMessageApi.NotifyMessage) => { - return formatDateTime(data?.createTime || '') as string; - }, + render: (val) => formatDateTime(val) as string, }, ]; } diff --git a/apps/web-ele/src/views/system/notify/message/modules/detail.vue b/apps/web-ele/src/views/system/notify/message/modules/detail.vue index dda2cdffd..8d9385ab9 100644 --- a/apps/web-ele/src/views/system/notify/message/modules/detail.vue +++ b/apps/web-ele/src/views/system/notify/message/modules/detail.vue @@ -12,14 +12,8 @@ import { useDetailSchema } from '../data'; const formData = ref(); const [Descriptions] = useDescription({ - componentProps: { - border: true, - column: 1, - direction: 'horizontal', - labelWidth: 140, - title: '', - extra: '', - }, + column: 1, + labelWidth: 140, schema: useDetailSchema(), }); diff --git a/apps/web-ele/src/views/system/notify/my/data.ts b/apps/web-ele/src/views/system/notify/my/data.ts index f57aa9294..21f051d6d 100644 --- a/apps/web-ele/src/views/system/notify/my/data.ts +++ b/apps/web-ele/src/views/system/notify/my/data.ts @@ -1,6 +1,5 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { SystemNotifyMessageApi } from '#/api/system/notify/message'; import type { DescriptionItemSchema } from '#/components/description'; import { h } from 'vue'; @@ -103,36 +102,32 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'createTime', label: '发送时间', - content: (data: SystemNotifyMessageApi.NotifyMessage) => { - return formatDateTime(data?.createTime || '') as string; - }, + render: (val) => formatDateTime(val) as string, }, { field: 'templateType', label: '消息类型', - content: (data: SystemNotifyMessageApi.NotifyMessage) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.SYSTEM_NOTIFY_TEMPLATE_TYPE, - value: data?.templateType, + value: val, }); }, }, { field: 'readStatus', label: '是否已读', - content: (data: SystemNotifyMessageApi.NotifyMessage) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.INFRA_BOOLEAN_STRING, - value: data?.readStatus, + value: val, }); }, }, { field: 'readTime', label: '阅读时间', - content: (data: SystemNotifyMessageApi.NotifyMessage) => { - return formatDateTime(data?.readTime || '') as string; - }, + render: (val) => formatDateTime(val) as string, }, { field: 'templateContent', diff --git a/apps/web-ele/src/views/system/notify/my/modules/detail.vue b/apps/web-ele/src/views/system/notify/my/modules/detail.vue index dda2cdffd..8d9385ab9 100644 --- a/apps/web-ele/src/views/system/notify/my/modules/detail.vue +++ b/apps/web-ele/src/views/system/notify/my/modules/detail.vue @@ -12,14 +12,8 @@ import { useDetailSchema } from '../data'; const formData = ref(); const [Descriptions] = useDescription({ - componentProps: { - border: true, - column: 1, - direction: 'horizontal', - labelWidth: 140, - title: '', - extra: '', - }, + column: 1, + labelWidth: 140, schema: useDetailSchema(), }); diff --git a/apps/web-ele/src/views/system/operatelog/data.ts b/apps/web-ele/src/views/system/operatelog/data.ts index 93d054b98..731f79a5b 100644 --- a/apps/web-ele/src/views/system/operatelog/data.ts +++ b/apps/web-ele/src/views/system/operatelog/data.ts @@ -1,6 +1,5 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { SystemOperateLogApi } from '#/api/system/operate-log'; import type { DescriptionItemSchema } from '#/components/description'; import { formatDateTime } from '@vben/utils'; @@ -134,7 +133,7 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'traceId', label: '链路追踪', - hidden: (data: SystemOperateLogApi.OperateLog) => !data?.traceId, + show: (val) => !val, }, { field: 'userId', @@ -167,13 +166,14 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'extra', label: '操作拓展参数', - hidden: (data: SystemOperateLogApi.OperateLog) => !data?.extra, + show: (val) => !val, }, { label: '请求 URL', - content: (data: SystemOperateLogApi.OperateLog) => { - if (data?.requestMethod && data?.requestUrl) { - return `${data.requestMethod} ${data.requestUrl}`; + field: 'requestUrl', + render: (val, data) => { + if (data?.requestMethod && val) { + return `${data.requestMethod} ${val}`; } return ''; }, @@ -181,9 +181,7 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'createTime', label: '操作时间', - content: (data: SystemOperateLogApi.OperateLog) => { - return formatDateTime(data?.createTime || '') as string; - }, + render: (val) => formatDateTime(val) as string, }, { field: 'bizId', diff --git a/apps/web-ele/src/views/system/operatelog/modules/detail.vue b/apps/web-ele/src/views/system/operatelog/modules/detail.vue index 890674b3c..cf892c0f1 100644 --- a/apps/web-ele/src/views/system/operatelog/modules/detail.vue +++ b/apps/web-ele/src/views/system/operatelog/modules/detail.vue @@ -12,14 +12,9 @@ import { useDetailSchema } from '../data'; const formData = ref(); const [Descriptions] = useDescription({ - componentProps: { - border: true, - column: 1, - direction: 'horizontal', - labelWidth: 110, - title: '', - extra: '', - }, + column: 1, + direction: 'horizontal', + labelWidth: 110, schema: useDetailSchema(), }); diff --git a/apps/web-ele/src/views/system/sms/log/data.ts b/apps/web-ele/src/views/system/sms/log/data.ts index 77c606d5f..3657516b6 100644 --- a/apps/web-ele/src/views/system/sms/log/data.ts +++ b/apps/web-ele/src/views/system/sms/log/data.ts @@ -1,6 +1,5 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { SystemSmsLogApi } from '#/api/system/sms/log'; import type { DescriptionItemSchema } from '#/components/description'; import { h } from 'vue'; @@ -179,9 +178,7 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'createTime', label: '创建时间', - content: (data: SystemSmsLogApi.SmsLog) => { - return formatDateTime(data?.createTime || '') as string; - }, + render: (val) => formatDateTime(val) as string, }, { field: 'mobile', @@ -198,10 +195,10 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'templateType', label: '模板类型', - content: (data: SystemSmsLogApi.SmsLog) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.SYSTEM_SMS_TEMPLATE_TYPE, - value: data?.templateType, + value: val, }); }, }, @@ -212,19 +209,17 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'sendStatus', label: '发送状态', - content: (data: SystemSmsLogApi.SmsLog) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.SYSTEM_SMS_SEND_STATUS, - value: data?.sendStatus, + value: val, }); }, }, { field: 'sendTime', label: '发送时间', - content: (data: SystemSmsLogApi.SmsLog) => { - return formatDateTime(data?.sendTime || '') as string; - }, + render: (val) => formatDateTime(val) as string, }, { field: 'apiSendCode', @@ -237,19 +232,17 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'receiveStatus', label: '接收状态', - content: (data: SystemSmsLogApi.SmsLog) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.SYSTEM_SMS_RECEIVE_STATUS, - value: data?.receiveStatus, + value: val, }); }, }, { field: 'receiveTime', label: '接收时间', - content: (data: SystemSmsLogApi.SmsLog) => { - return formatDateTime(data?.receiveTime || '') as string; - }, + render: (val) => formatDateTime(val) as string, }, { field: 'apiReceiveCode', diff --git a/apps/web-ele/src/views/system/sms/log/modules/detail.vue b/apps/web-ele/src/views/system/sms/log/modules/detail.vue index 622efdb8f..4fcd48df9 100644 --- a/apps/web-ele/src/views/system/sms/log/modules/detail.vue +++ b/apps/web-ele/src/views/system/sms/log/modules/detail.vue @@ -12,14 +12,9 @@ import { useDetailSchema } from '../data'; const formData = ref(); const [Descriptions] = useDescription({ - componentProps: { - border: true, - column: 2, - direction: 'horizontal', - labelWidth: 140, - title: '', - extra: '', - }, + column: 2, + direction: 'horizontal', + labelWidth: 140, schema: useDetailSchema(), }); diff --git a/apps/web-ele/src/views/system/social/user/data.ts b/apps/web-ele/src/views/system/social/user/data.ts index b3db14baf..77847d0a0 100644 --- a/apps/web-ele/src/views/system/social/user/data.ts +++ b/apps/web-ele/src/views/system/social/user/data.ts @@ -1,6 +1,5 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { SystemSocialUserApi } from '#/api/system/social/user'; import type { DescriptionItemSchema } from '#/components/description'; import { h } from 'vue'; @@ -8,6 +7,8 @@ import { h } from 'vue'; import { DICT_TYPE } from '@vben/constants'; import { getDictOptions } from '@vben/hooks'; +import { ElImage } from 'element-plus'; + import { DictTag } from '#/components/dict-tag'; import { getRangePickerDefaultProps } from '#/utils'; @@ -111,10 +112,10 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'type', label: '社交平台', - content: (data: SystemSocialUserApi.SocialUser) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.SYSTEM_SOCIAL_TYPE, - value: data?.type, + value: val, }); }, }, @@ -125,16 +126,13 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'avatar', label: '用户头像', - // TODO @芋艿:使用 antd 的 Image 组件 - content: (data: SystemSocialUserApi.SocialUser) => { - if (data?.avatar) { - return h('img', { - src: data.avatar, - style: 'width: 30px; height: 30px; cursor: pointer;', - onClick: () => { - // 可以添加图片预览功能 - window.open(data.avatar, '_blank'); - }, + render: (val) => { + if (val) { + return h(ElImage, { + src: val, + previewSrcList: [val], + class: 'w-10 h-10 cursor-pointer', + previewTeleported: true, }); } return '无'; diff --git a/apps/web-ele/src/views/system/social/user/modules/detail.vue b/apps/web-ele/src/views/system/social/user/modules/detail.vue index aa9caec0a..ffae89ce5 100644 --- a/apps/web-ele/src/views/system/social/user/modules/detail.vue +++ b/apps/web-ele/src/views/system/social/user/modules/detail.vue @@ -14,14 +14,8 @@ import { useDetailSchema } from '../data'; const formData = ref(); const [Descriptions] = useDescription({ - componentProps: { - border: true, - column: 1, - direction: 'horizontal', - title: '', - extra: '', - labelWidth: 185, - }, + column: 1, + labelWidth: 185, schema: useDetailSchema(), }); From 4726238e9a80f5e930201b40c34f7ac39d31a551 Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Tue, 21 Oct 2025 16:38:24 +0800 Subject: [PATCH 27/30] fix: desc --- apps/web-antd/src/views/infra/apiErrorLog/data.ts | 4 ++-- apps/web-antd/src/views/system/operatelog/data.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/web-antd/src/views/infra/apiErrorLog/data.ts b/apps/web-antd/src/views/infra/apiErrorLog/data.ts index 60d09ed07..1a8c545fe 100644 --- a/apps/web-antd/src/views/infra/apiErrorLog/data.ts +++ b/apps/web-antd/src/views/infra/apiErrorLog/data.ts @@ -176,8 +176,8 @@ export function useDetailSchema(): DescriptionItemSchema[] { field: 'requestMethod', label: '请求信息', render: (val, data) => { - if (data?.requestMethod && data?.requestUrl) { - return `${val.requestMethod} ${val.requestUrl}`; + if (val && data?.requestUrl) { + return `${val} ${data.requestUrl}`; } return ''; }, diff --git a/apps/web-antd/src/views/system/operatelog/data.ts b/apps/web-antd/src/views/system/operatelog/data.ts index 262cc7c30..3144daa90 100644 --- a/apps/web-antd/src/views/system/operatelog/data.ts +++ b/apps/web-antd/src/views/system/operatelog/data.ts @@ -166,7 +166,7 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'extra', label: '操作拓展参数', - show: (data) => !data?.extra, + show: (val) => !val, }, { field: 'requestUrl', From 4959a8f401adeb7a00250d662348f062ab5811cc Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Tue, 21 Oct 2025 16:38:39 +0800 Subject: [PATCH 28/30] fix: desc --- apps/web-ele/src/components/description/description.vue | 1 - apps/web-ele/src/components/description/typing.ts | 2 -- apps/web-ele/src/views/infra/apiAccessLog/data.ts | 4 ++-- apps/web-ele/src/views/infra/apiErrorLog/data.ts | 2 +- 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/apps/web-ele/src/components/description/description.vue b/apps/web-ele/src/components/description/description.vue index 63a9f2a5d..f4b420d86 100644 --- a/apps/web-ele/src/components/description/description.vue +++ b/apps/web-ele/src/components/description/description.vue @@ -29,7 +29,6 @@ const props = { ['default', 'middle', 'small', undefined].includes(v), }, title: { default: '', type: String }, - useCard: { default: true, type: Boolean }, direction: { default: 'horizontal', type: String }, }; diff --git a/apps/web-ele/src/components/description/typing.ts b/apps/web-ele/src/components/description/typing.ts index 9cb6b8b71..eb16c33d2 100644 --- a/apps/web-ele/src/components/description/typing.ts +++ b/apps/web-ele/src/components/description/typing.ts @@ -28,8 +28,6 @@ export interface DescriptionItemSchema { } export interface DescriptionProps extends ElDescriptionProps { - // 是否包含卡片组件 - useCard?: boolean; // 描述项配置 schema: DescriptionItemSchema[]; // 数据 diff --git a/apps/web-ele/src/views/infra/apiAccessLog/data.ts b/apps/web-ele/src/views/infra/apiAccessLog/data.ts index 12e9e806d..f10d3be8e 100644 --- a/apps/web-ele/src/views/infra/apiAccessLog/data.ts +++ b/apps/web-ele/src/views/infra/apiAccessLog/data.ts @@ -196,10 +196,10 @@ export function useDetailSchema(): DescriptionItemSchema[] { label: '用户 UA', }, { - label: '请求信息', field: 'requestMethod', + label: '请求信息', render: (val, data) => { - if (data?.requestMethod && data?.requestUrl) { + if (val && data?.requestUrl) { return `${val} ${data.requestUrl}`; } return ''; diff --git a/apps/web-ele/src/views/infra/apiErrorLog/data.ts b/apps/web-ele/src/views/infra/apiErrorLog/data.ts index f58c29383..a681bccc9 100644 --- a/apps/web-ele/src/views/infra/apiErrorLog/data.ts +++ b/apps/web-ele/src/views/infra/apiErrorLog/data.ts @@ -176,7 +176,7 @@ export function useDetailSchema(): DescriptionItemSchema[] { field: 'requestMethod', label: '请求信息', render: (val, data) => { - if (data?.requestMethod && data?.requestUrl) { + if (val && data?.requestUrl) { return `${val} ${data.requestUrl}`; } return ''; From bb9cb64c6473536bcd48c65865d5dc682d8c20d7 Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Tue, 21 Oct 2025 16:39:15 +0800 Subject: [PATCH 29/30] refactor: refactor naive desc comp --- .../components/description/description.vue | 248 +++++++++++++----- .../src/components/description/typing.ts | 54 ++-- .../components/description/use-description.ts | 80 ++---- 3 files changed, 237 insertions(+), 145 deletions(-) diff --git a/apps/web-naive/src/components/description/description.vue b/apps/web-naive/src/components/description/description.vue index ef0239933..51f0df4d3 100644 --- a/apps/web-naive/src/components/description/description.vue +++ b/apps/web-naive/src/components/description/description.vue @@ -1,80 +1,198 @@ diff --git a/apps/web-naive/src/components/description/typing.ts b/apps/web-naive/src/components/description/typing.ts index 7aadf72dd..9ee489678 100644 --- a/apps/web-naive/src/components/description/typing.ts +++ b/apps/web-naive/src/components/description/typing.ts @@ -1,27 +1,41 @@ -import type { DescriptionsProps } from 'naive-ui'; +import type { DescriptionsProps as NDescriptionsProps } from 'naive-ui'; +import type { JSX } from 'vue/jsx-runtime'; import type { CSSProperties, VNode } from 'vue'; -// TODO @xingyu:【content】这个纠结下;1)vben2.0 是 render;https://doc.vvbin.cn/components/desc.html#usage 2) -// TODO @xingyu:vben2.0 还有 sapn【done】、labelMinWidth、contentMinWidth -// TODO @xingyu:【hidden】这个纠结下;1)vben2.0 是 show; +import type { Recordable } from '@vben/types'; + export interface DescriptionItemSchema { - label: string | VNode; // 内容的描述 - field?: string; // 对应 data 中的字段名 - content?: ((data: any) => string | VNode) | string | VNode; // 自定义需要展示的内容,比如说 dict-tag - span?: number; // 包含列的数量 - labelStyle?: CSSProperties; // 自定义标签样式 - contentStyle?: CSSProperties; // 自定义内容样式 - hidden?: ((data: any) => boolean) | boolean; // 是否显示 + labelMinWidth?: number; + contentMinWidth?: number; + // 自定义标签样式 + labelStyle?: CSSProperties; + // 对应 data 中的字段名 + field: string; + // 内容的描述 + label: JSX.Element | string | VNode; + // 包含列的数量 + span?: number; + // 是否显示 + show?: (...arg: any) => boolean; + // 插槽名称 + slot?: string; + // 自定义需要展示的内容 + render?: ( + val: any, + data?: Recordable, + ) => Element | JSX.Element | number | string | undefined | VNode; } -// TODO @xingyu:vben2.0 还有 title【done】、bordered【done】d、useCollapse、collapseOptions -// TODO @xingyu:from 5.0:bordered 默认为 true -// TODO @xingyu:from 5.0:column 默认为 lg: 3, md: 3, sm: 2, xl: 3, xs: 1, xxl: 4 -// TODO @xingyu:from 5.0:size 默认为 small;有 'default', 'middle', 'small', undefined -// TODO @xingyu:from 5.0:useCollapse 默认为 true -export interface DescriptionsOptions { - data?: Record; // 数据 - schema?: DescriptionItemSchema[]; // 描述项配置 - componentProps?: DescriptionsProps; // antd Descriptions 组件参数 +export interface DescriptionProps extends NDescriptionsProps { + // 是否包含卡片组件 + useCard?: boolean; + // 描述项配置 + schema: DescriptionItemSchema[]; + // 数据 + data: Recordable; +} + +export interface DescInstance { + setDescProps(descProps: Partial): void; } diff --git a/apps/web-naive/src/components/description/use-description.ts b/apps/web-naive/src/components/description/use-description.ts index 7f99238bf..fd24920f0 100644 --- a/apps/web-naive/src/components/description/use-description.ts +++ b/apps/web-naive/src/components/description/use-description.ts @@ -1,71 +1,31 @@ -import type { DescriptionsOptions } from './typing'; +import type { Component } from 'vue'; -import { defineComponent, h, isReactive, reactive, watch } from 'vue'; +import type { DescInstance, DescriptionProps } from './typing'; + +import { h, reactive } from 'vue'; import Description from './description.vue'; -/** 描述列表 api 定义 */ -class DescriptionApi { - private state = reactive>({}); +export function useDescription(options?: Partial) { + const propsState = reactive>(options || {}); - constructor(options: DescriptionsOptions) { - this.state = { ...options }; - } + const api: DescInstance = { + setDescProps: (descProps: Partial): void => { + Object.assign(propsState, descProps); + }, + }; - getState(): DescriptionsOptions { - return this.state as DescriptionsOptions; - } - - // TODO @xingyu:【setState】纠结下:1)vben2.0 是 data https://doc.vvbin.cn/components/desc.html#usage; - setState(newState: Partial) { - this.state = { ...this.state, ...newState }; - } -} - -export type ExtendedDescriptionApi = DescriptionApi; - -export function useDescription(options: DescriptionsOptions) { - const IS_REACTIVE = isReactive(options); - const api = new DescriptionApi(options); - // 扩展 API - const extendedApi: ExtendedDescriptionApi = api as never; - const Desc = defineComponent({ + // 创建一个包装组件,将 propsState 合并到 props 中 + const DescriptionWrapper: Component = { name: 'UseDescription', inheritAttrs: false, - setup(_, { attrs, slots }) { - // 合并props和attrs到state - api.setState({ ...attrs }); - - return () => - h( - Description, - { - ...api.getState(), - ...attrs, - }, - slots, - ); + setup(_props, { attrs, slots }) { + return () => { + // @ts-ignore - 避免类型实例化过深 + return h(Description, { ...propsState, ...attrs }, slots); + }; }, - }); + }; - // 响应式支持 - if (IS_REACTIVE) { - watch( - () => options.schema, - (newSchema) => { - api.setState({ schema: newSchema }); - }, - { immediate: true, deep: true }, - ); - - watch( - () => options.data, - (newData) => { - api.setState({ data: newData }); - }, - { immediate: true, deep: true }, - ); - } - - return [Desc, extendedApi] as const; + return [DescriptionWrapper, api] as const; } From 985ce257e02382457c900c73cfadfe5a5c0f4bf0 Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Tue, 21 Oct 2025 16:39:35 +0800 Subject: [PATCH 30/30] feat: use desc comp --- .../src/views/infra/apiAccessLog/data.ts | 43 ++++++++++--------- .../infra/apiAccessLog/modules/detail.vue | 6 +-- .../src/views/infra/apiErrorLog/data.ts | 42 +++++++++--------- .../infra/apiErrorLog/modules/detail.vue | 6 +-- apps/web-naive/src/views/infra/job/data.ts | 23 +++++----- .../src/views/infra/job/logger/data.ts | 15 +++---- .../views/infra/job/logger/modules/detail.vue | 6 +-- .../src/views/infra/job/modules/detail.vue | 6 +-- .../src/views/system/loginlog/data.ts | 13 +++--- .../views/system/loginlog/modules/detail.vue | 6 +-- .../src/views/system/mail/log/data.ts | 31 +++++-------- .../views/system/mail/log/modules/detail.vue | 6 +-- .../src/views/system/notify/message/data.ts | 25 +++++------ .../system/notify/message/modules/detail.vue | 6 +-- .../src/views/system/notify/my/data.ts | 17 +++----- .../views/system/notify/my/modules/detail.vue | 6 +-- .../src/views/system/operatelog/data.ts | 16 +++---- .../system/operatelog/modules/detail.vue | 6 +-- .../src/views/system/sms/log/data.ts | 25 ++++------- .../views/system/sms/log/modules/detail.vue | 6 +-- .../src/views/system/social/user/data.ts | 20 ++++----- .../system/social/user/modules/detail.vue | 9 +--- 22 files changed, 128 insertions(+), 211 deletions(-) diff --git a/apps/web-naive/src/views/infra/apiAccessLog/data.ts b/apps/web-naive/src/views/infra/apiAccessLog/data.ts index f4fc9f088..706928895 100644 --- a/apps/web-naive/src/views/infra/apiAccessLog/data.ts +++ b/apps/web-naive/src/views/infra/apiAccessLog/data.ts @@ -1,6 +1,5 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { InfraApiAccessLogApi } from '#/api/infra/api-access-log'; import type { DescriptionItemSchema } from '#/components/description'; import { h } from 'vue'; @@ -181,10 +180,10 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'userType', label: '用户类型', - content: (data: InfraApiAccessLogApi.ApiAccessLog) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.USER_TYPE, - value: data.userType, + value: val, }); }, }, @@ -197,10 +196,11 @@ export function useDetailSchema(): DescriptionItemSchema[] { label: '用户 UA', }, { + field: 'requestMethod', label: '请求信息', - content: (data: InfraApiAccessLogApi.ApiAccessLog) => { - if (data?.requestMethod && data?.requestUrl) { - return `${data.requestMethod} ${data.requestUrl}`; + render: (val, data) => { + if (val && data?.requestUrl) { + return `${val} ${data.requestUrl}`; } return ''; }, @@ -208,10 +208,10 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'requestParams', label: '请求参数', - content: (data: InfraApiAccessLogApi.ApiAccessLog) => { - if (data.requestParams) { + render: (val) => { + if (val) { return h(JsonViewer, { - value: JSON.parse(data.requestParams), + value: JSON.parse(val), previewMode: true, }); } @@ -224,26 +224,29 @@ export function useDetailSchema(): DescriptionItemSchema[] { }, { label: '请求时间', - content: (data: InfraApiAccessLogApi.ApiAccessLog) => { - if (data?.beginTime && data?.endTime) { - return `${formatDateTime(data.beginTime)} ~ ${formatDateTime(data.endTime)}`; + field: 'beginTime', + render: (val, data) => { + if (val && data?.endTime) { + return `${formatDateTime(val)} ~ ${formatDateTime(data.endTime)}`; } return ''; }, }, { label: '请求耗时', - content: (data: InfraApiAccessLogApi.ApiAccessLog) => { - return data?.duration ? `${data.duration} ms` : ''; + field: 'duration', + render: (val) => { + return val ? `${val} ms` : ''; }, }, { label: '操作结果', - content: (data: InfraApiAccessLogApi.ApiAccessLog) => { - if (data?.resultCode === 0) { + field: 'resultCode', + render: (val, data) => { + if (val === 0) { return '正常'; - } else if (data && data.resultCode > 0) { - return `失败 | ${data.resultCode} | ${data.resultMsg}`; + } else if (val > 0 && data?.resultMsg) { + return `失败 | ${val} | ${data.resultMsg}`; } return ''; }, @@ -259,10 +262,10 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'operateType', label: '操作类型', - content: (data: InfraApiAccessLogApi.ApiAccessLog) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.INFRA_OPERATE_TYPE, - value: data?.operateType, + value: val, }); }, }, diff --git a/apps/web-naive/src/views/infra/apiAccessLog/modules/detail.vue b/apps/web-naive/src/views/infra/apiAccessLog/modules/detail.vue index 70869fe38..5fd1e5eeb 100644 --- a/apps/web-naive/src/views/infra/apiAccessLog/modules/detail.vue +++ b/apps/web-naive/src/views/infra/apiAccessLog/modules/detail.vue @@ -12,11 +12,7 @@ import { useDetailSchema } from '../data'; const formData = ref(); const [Descriptions] = useDescription({ - componentProps: { - bordered: true, - column: 1, - contentClass: 'mx-4', - }, + column: 1, schema: useDetailSchema(), }); diff --git a/apps/web-naive/src/views/infra/apiErrorLog/data.ts b/apps/web-naive/src/views/infra/apiErrorLog/data.ts index fcd977971..87316a97e 100644 --- a/apps/web-naive/src/views/infra/apiErrorLog/data.ts +++ b/apps/web-naive/src/views/infra/apiErrorLog/data.ts @@ -1,6 +1,5 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { InfraApiErrorLogApi } from '#/api/infra/api-error-log'; import type { DescriptionItemSchema } from '#/components/description'; import { h } from 'vue'; @@ -158,10 +157,10 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'userType', label: '用户类型', - content: (data: InfraApiErrorLogApi.ApiErrorLog) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.USER_TYPE, - value: data.userType, + value: val, }); }, }, @@ -176,9 +175,9 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'requestMethod', label: '请求信息', - content: (data: InfraApiErrorLogApi.ApiErrorLog) => { - if (data?.requestMethod && data?.requestUrl) { - return `${data.requestMethod} ${data.requestUrl}`; + render: (val, data) => { + if (val && data?.requestUrl) { + return `${val} ${data.requestUrl}`; } return ''; }, @@ -186,10 +185,10 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'requestParams', label: '请求参数', - content: (data: InfraApiErrorLogApi.ApiErrorLog) => { - if (data.requestParams) { + render: (val) => { + if (val) { return h(JsonViewer, { - value: JSON.parse(data.requestParams), + value: JSON.parse(val), previewMode: true, }); } @@ -199,8 +198,8 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'exceptionTime', label: '异常时间', - content: (data: InfraApiErrorLogApi.ApiErrorLog) => { - return formatDateTime(data?.exceptionTime || '') as string; + render: (val) => { + return formatDateTime(val) as string; }, }, { @@ -210,12 +209,11 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'exceptionStackTrace', label: '异常堆栈', - hidden: (data: InfraApiErrorLogApi.ApiErrorLog) => - !data?.exceptionStackTrace, - content: (data: InfraApiErrorLogApi.ApiErrorLog) => { - if (data?.exceptionStackTrace) { + show: (val) => !val, + render: (val) => { + if (val) { return h('textarea', { - value: data.exceptionStackTrace, + value: val, style: 'width: 100%; min-height: 200px; max-height: 400px; resize: vertical;', readonly: true, @@ -227,24 +225,24 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'processStatus', label: '处理状态', - content: (data: InfraApiErrorLogApi.ApiErrorLog) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.INFRA_API_ERROR_LOG_PROCESS_STATUS, - value: data?.processStatus, + value: val, }); }, }, { field: 'processUserId', label: '处理人', - hidden: (data: InfraApiErrorLogApi.ApiErrorLog) => !data?.processUserId, + show: (val) => !val, }, { field: 'processTime', label: '处理时间', - hidden: (data: InfraApiErrorLogApi.ApiErrorLog) => !data?.processTime, - content: (data: InfraApiErrorLogApi.ApiErrorLog) => { - return formatDateTime(data?.processTime || '') as string; + show: (val) => !val, + render: (val) => { + return formatDateTime(val) as string; }, }, ]; diff --git a/apps/web-naive/src/views/infra/apiErrorLog/modules/detail.vue b/apps/web-naive/src/views/infra/apiErrorLog/modules/detail.vue index 3d4836696..b46a368e8 100644 --- a/apps/web-naive/src/views/infra/apiErrorLog/modules/detail.vue +++ b/apps/web-naive/src/views/infra/apiErrorLog/modules/detail.vue @@ -12,11 +12,7 @@ import { useDetailSchema } from '../data'; const formData = ref(); const [Descriptions] = useDescription({ - componentProps: { - bordered: true, - column: 1, - contentClass: 'mx-4', - }, + column: 1, schema: useDetailSchema(), }); diff --git a/apps/web-naive/src/views/infra/job/data.ts b/apps/web-naive/src/views/infra/job/data.ts index 5a72b3ead..e62160b82 100644 --- a/apps/web-naive/src/views/infra/job/data.ts +++ b/apps/web-naive/src/views/infra/job/data.ts @@ -1,6 +1,5 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { InfraJobApi } from '#/api/infra/job'; import type { DescriptionItemSchema } from '#/components/description'; import { h, markRaw } from 'vue'; @@ -191,10 +190,10 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'status', label: '任务状态', - content: (data: InfraJobApi.Job) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.INFRA_JOB_STATUS, - value: data?.status, + value: val, }); }, }, @@ -216,27 +215,27 @@ export function useDetailSchema(): DescriptionItemSchema[] { }, { label: '重试间隔', - content: (data: InfraJobApi.Job) => { - return data?.retryInterval ? `${data.retryInterval} 毫秒` : '无间隔'; + field: 'retryInterval', + render: (val) => { + return val ? `${val} 毫秒` : '无间隔'; }, }, { label: '监控超时时间', - content: (data: InfraJobApi.Job) => { - return data?.monitorTimeout && data.monitorTimeout > 0 - ? `${data.monitorTimeout} 毫秒` - : '未开启'; + field: 'monitorTimeout', + render: (val) => { + return val && val > 0 ? `${val} 毫秒` : '未开启'; }, }, { field: 'nextTimes', label: '后续执行时间', - content: (data: InfraJobApi.Job) => { - if (!data?.nextTimes || data.nextTimes.length === 0) { + render: (val) => { + if (!val || val.length === 0) { return '无后续执行时间'; } return h(NTimeline, {}, () => - data.nextTimes?.map((time: Date) => + val?.map((time: Date) => h(NTimelineItem, {}, () => formatDateTime(time)), ), ); diff --git a/apps/web-naive/src/views/infra/job/logger/data.ts b/apps/web-naive/src/views/infra/job/logger/data.ts index cf1ec6d88..f39199f57 100644 --- a/apps/web-naive/src/views/infra/job/logger/data.ts +++ b/apps/web-naive/src/views/infra/job/logger/data.ts @@ -1,6 +1,5 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { InfraJobLogApi } from '#/api/infra/job-log'; import type { DescriptionItemSchema } from '#/components/description'; import { h } from 'vue'; @@ -148,9 +147,9 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'beginTime', label: '执行时间', - content: (data: InfraJobLogApi.JobLog) => { - if (data?.beginTime && data?.endTime) { - return `${formatDateTime(data.beginTime)} ~ ${formatDateTime(data.endTime)}`; + render: (val, data) => { + if (val && data?.endTime) { + return `${formatDateTime(val)} ~ ${formatDateTime(data.endTime)}`; } return ''; }, @@ -158,17 +157,15 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'duration', label: '执行时长', - content: (data: InfraJobLogApi.JobLog) => { - return data?.duration ? `${data.duration} 毫秒` : ''; - }, + render: (val) => (val ? `${val} 毫秒` : ''), }, { field: 'status', label: '任务状态', - content: (data: InfraJobLogApi.JobLog) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.INFRA_JOB_LOG_STATUS, - value: data?.status, + value: val, }); }, }, diff --git a/apps/web-naive/src/views/infra/job/logger/modules/detail.vue b/apps/web-naive/src/views/infra/job/logger/modules/detail.vue index 75b26d90a..a63352a78 100644 --- a/apps/web-naive/src/views/infra/job/logger/modules/detail.vue +++ b/apps/web-naive/src/views/infra/job/logger/modules/detail.vue @@ -13,11 +13,7 @@ import { useDetailSchema } from '../data'; const formData = ref(); const [Descriptions] = useDescription({ - componentProps: { - bordered: true, - column: 1, - contentClass: 'mx-4', - }, + column: 1, schema: useDetailSchema(), }); diff --git a/apps/web-naive/src/views/infra/job/modules/detail.vue b/apps/web-naive/src/views/infra/job/modules/detail.vue index 0a8078ce5..4d58ca0a0 100644 --- a/apps/web-naive/src/views/infra/job/modules/detail.vue +++ b/apps/web-naive/src/views/infra/job/modules/detail.vue @@ -14,11 +14,7 @@ const formData = ref(); // 任务详情 const nextTimes = ref([]); // 下一次执行时间 const [Descriptions] = useDescription({ - componentProps: { - bordered: true, - column: 1, - contentClass: 'mx-4', - }, + column: 1, schema: useDetailSchema(), }); diff --git a/apps/web-naive/src/views/system/loginlog/data.ts b/apps/web-naive/src/views/system/loginlog/data.ts index 03704e311..dfef348df 100644 --- a/apps/web-naive/src/views/system/loginlog/data.ts +++ b/apps/web-naive/src/views/system/loginlog/data.ts @@ -1,6 +1,5 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { SystemLoginLogApi } from '#/api/system/login-log'; import type { DescriptionItemSchema } from '#/components/description'; import { h } from 'vue'; @@ -110,10 +109,10 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'logType', label: '操作类型', - content: (data: SystemLoginLogApi.LoginLog) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.SYSTEM_LOGIN_TYPE, - value: data?.logType, + value: val, }); }, }, @@ -132,19 +131,17 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'result', label: '登录结果', - content: (data: SystemLoginLogApi.LoginLog) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.SYSTEM_LOGIN_RESULT, - value: data?.result, + value: val, }); }, }, { field: 'createTime', label: '登录日期', - content: (data: SystemLoginLogApi.LoginLog) => { - return formatDateTime(data?.createTime || '') as string; - }, + render: (val) => formatDateTime(val) as string, }, ]; } diff --git a/apps/web-naive/src/views/system/loginlog/modules/detail.vue b/apps/web-naive/src/views/system/loginlog/modules/detail.vue index 9d3ceed35..4904fd4ad 100644 --- a/apps/web-naive/src/views/system/loginlog/modules/detail.vue +++ b/apps/web-naive/src/views/system/loginlog/modules/detail.vue @@ -12,11 +12,7 @@ import { useDetailSchema } from '../data'; const formData = ref(); const [Descriptions] = useDescription({ - componentProps: { - bordered: true, - column: 1, - contentClass: 'mx-4', - }, + column: 1, schema: useDetailSchema(), }); diff --git a/apps/web-naive/src/views/system/mail/log/data.ts b/apps/web-naive/src/views/system/mail/log/data.ts index 775bd8668..d61137560 100644 --- a/apps/web-naive/src/views/system/mail/log/data.ts +++ b/apps/web-naive/src/views/system/mail/log/data.ts @@ -1,6 +1,5 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { SystemMailLogApi } from '#/api/system/mail/log'; import type { DescriptionItemSchema } from '#/components/description'; import { h } from 'vue'; @@ -164,9 +163,7 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'createTime', label: '创建时间', - content: (data: SystemMailLogApi.MailLog) => { - return formatDateTime(data?.createTime || '') as string; - }, + render: (val) => formatDateTime(val) as string, }, { field: 'fromMail', @@ -175,12 +172,12 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'userId', label: '接收用户', - content: (data: SystemMailLogApi.MailLog) => { - if (data?.userType && data?.userId) { + render: (val, data) => { + if (val && data?.userId) { return h('div', [ h(DictTag, { type: DICT_TYPE.USER_TYPE, - value: data.userType, + value: val, }), ` (${data.userId})`, ]); @@ -191,10 +188,10 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'toMails', label: '接收信息', - content: (data: SystemMailLogApi.MailLog) => { + render: (val, data) => { const lines: string[] = []; - if (data?.toMails && data.toMails.length > 0) { - lines.push(`收件:${data.toMails.join('、')}`); + if (val && val.length > 0) { + lines.push(`收件:${val.join('、')}`); } if (data?.ccMails && data.ccMails.length > 0) { lines.push(`抄送:${data.ccMails.join('、')}`); @@ -227,28 +224,22 @@ export function useDetailSchema(): DescriptionItemSchema[] { field: 'templateContent', label: '邮件内容', span: 2, - content: (data: SystemMailLogApi.MailLog) => { - return h('div', { - innerHTML: data?.templateContent || '', - }); - }, + render: (val) => h('div', { innerHTML: val || '' }), }, { field: 'sendStatus', label: '发送状态', - content: (data: SystemMailLogApi.MailLog) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.SYSTEM_MAIL_SEND_STATUS, - value: data?.sendStatus, + value: val, }); }, }, { field: 'sendTime', label: '发送时间', - content: (data: SystemMailLogApi.MailLog) => { - return formatDateTime(data?.sendTime || '') as string; - }, + render: (val) => formatDateTime(val) as string, }, { field: 'sendMessageId', diff --git a/apps/web-naive/src/views/system/mail/log/modules/detail.vue b/apps/web-naive/src/views/system/mail/log/modules/detail.vue index 8775e691d..63ad9ad09 100644 --- a/apps/web-naive/src/views/system/mail/log/modules/detail.vue +++ b/apps/web-naive/src/views/system/mail/log/modules/detail.vue @@ -12,11 +12,7 @@ import { useDetailSchema } from '../data'; const formData = ref(); const [Descriptions] = useDescription({ - componentProps: { - bordered: true, - column: 2, - contentClass: 'mx-4', - }, + column: 2, schema: useDetailSchema(), }); diff --git a/apps/web-naive/src/views/system/notify/message/data.ts b/apps/web-naive/src/views/system/notify/message/data.ts index 951671dd9..72d423d75 100644 --- a/apps/web-naive/src/views/system/notify/message/data.ts +++ b/apps/web-naive/src/views/system/notify/message/data.ts @@ -1,6 +1,5 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { SystemNotifyMessageApi } from '#/api/system/notify/message'; import type { DescriptionItemSchema } from '#/components/description'; import { h } from 'vue'; @@ -166,10 +165,10 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'userType', label: '用户类型', - content: (data: SystemNotifyMessageApi.NotifyMessage) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.USER_TYPE, - value: data?.userType, + value: val, }); }, }, @@ -196,9 +195,9 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'templateParams', label: '模版参数', - content: (data: SystemNotifyMessageApi.NotifyMessage) => { + render: (val) => { try { - return JSON.stringify(data?.templateParams); + return JSON.stringify(val); } catch { return ''; } @@ -207,36 +206,32 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'templateType', label: '模版类型', - content: (data: SystemNotifyMessageApi.NotifyMessage) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.SYSTEM_NOTIFY_TEMPLATE_TYPE, - value: data?.templateType, + value: val, }); }, }, { field: 'readStatus', label: '是否已读', - content: (data: SystemNotifyMessageApi.NotifyMessage) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.INFRA_BOOLEAN_STRING, - value: data?.readStatus, + value: val, }); }, }, { field: 'readTime', label: '阅读时间', - content: (data: SystemNotifyMessageApi.NotifyMessage) => { - return formatDateTime(data?.readTime || '') as string; - }, + render: (val) => formatDateTime(val) as string, }, { field: 'createTime', label: '创建时间', - content: (data: SystemNotifyMessageApi.NotifyMessage) => { - return formatDateTime(data?.createTime || '') as string; - }, + render: (val) => formatDateTime(val) as string, }, ]; } diff --git a/apps/web-naive/src/views/system/notify/message/modules/detail.vue b/apps/web-naive/src/views/system/notify/message/modules/detail.vue index 6e4c26eab..8305d2470 100644 --- a/apps/web-naive/src/views/system/notify/message/modules/detail.vue +++ b/apps/web-naive/src/views/system/notify/message/modules/detail.vue @@ -12,11 +12,7 @@ import { useDetailSchema } from '../data'; const formData = ref(); const [Descriptions] = useDescription({ - componentProps: { - bordered: true, - column: 1, - contentClass: 'mx-4', - }, + column: 1, schema: useDetailSchema(), }); diff --git a/apps/web-naive/src/views/system/notify/my/data.ts b/apps/web-naive/src/views/system/notify/my/data.ts index 119f9097e..ca56be57b 100644 --- a/apps/web-naive/src/views/system/notify/my/data.ts +++ b/apps/web-naive/src/views/system/notify/my/data.ts @@ -1,6 +1,5 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { SystemNotifyMessageApi } from '#/api/system/notify/message'; import type { DescriptionItemSchema } from '#/components/description'; import { h } from 'vue'; @@ -103,36 +102,32 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'createTime', label: '发送时间', - content: (data: SystemNotifyMessageApi.NotifyMessage) => { - return formatDateTime(data?.createTime || '') as string; - }, + render: (val) => formatDateTime(val) as string, }, { field: 'templateType', label: '消息类型', - content: (data: SystemNotifyMessageApi.NotifyMessage) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.SYSTEM_NOTIFY_TEMPLATE_TYPE, - value: data?.templateType, + value: val, }); }, }, { field: 'readStatus', label: '是否已读', - content: (data: SystemNotifyMessageApi.NotifyMessage) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.INFRA_BOOLEAN_STRING, - value: data?.readStatus, + value: val, }); }, }, { field: 'readTime', label: '阅读时间', - content: (data: SystemNotifyMessageApi.NotifyMessage) => { - return formatDateTime(data?.readTime || '') as string; - }, + render: (val) => formatDateTime(val) as string, }, { field: 'templateContent', diff --git a/apps/web-naive/src/views/system/notify/my/modules/detail.vue b/apps/web-naive/src/views/system/notify/my/modules/detail.vue index 6e4c26eab..8305d2470 100644 --- a/apps/web-naive/src/views/system/notify/my/modules/detail.vue +++ b/apps/web-naive/src/views/system/notify/my/modules/detail.vue @@ -12,11 +12,7 @@ import { useDetailSchema } from '../data'; const formData = ref(); const [Descriptions] = useDescription({ - componentProps: { - bordered: true, - column: 1, - contentClass: 'mx-4', - }, + column: 1, schema: useDetailSchema(), }); diff --git a/apps/web-naive/src/views/system/operatelog/data.ts b/apps/web-naive/src/views/system/operatelog/data.ts index 23db3b442..fd4eed9f0 100644 --- a/apps/web-naive/src/views/system/operatelog/data.ts +++ b/apps/web-naive/src/views/system/operatelog/data.ts @@ -1,6 +1,5 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { SystemOperateLogApi } from '#/api/system/operate-log'; import type { DescriptionItemSchema } from '#/components/description'; import { formatDateTime } from '@vben/utils'; @@ -134,7 +133,7 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'traceId', label: '链路追踪', - hidden: (data: SystemOperateLogApi.OperateLog) => !data?.traceId, + show: (val) => !val, }, { field: 'userId', @@ -167,13 +166,14 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'extra', label: '操作拓展参数', - hidden: (data: SystemOperateLogApi.OperateLog) => !data?.extra, + show: (val) => !val, }, { + field: 'requestUrl', label: '请求 URL', - content: (data: SystemOperateLogApi.OperateLog) => { - if (data?.requestMethod && data?.requestUrl) { - return `${data.requestMethod} ${data.requestUrl}`; + render: (val, data) => { + if (data?.requestMethod && val) { + return `${data.requestMethod} ${val}`; } return ''; }, @@ -181,9 +181,7 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'createTime', label: '操作时间', - content: (data: SystemOperateLogApi.OperateLog) => { - return formatDateTime(data?.createTime || '') as string; - }, + render: (val) => formatDateTime(val) as string, }, { field: 'bizId', diff --git a/apps/web-naive/src/views/system/operatelog/modules/detail.vue b/apps/web-naive/src/views/system/operatelog/modules/detail.vue index daa439f00..94f1c1059 100644 --- a/apps/web-naive/src/views/system/operatelog/modules/detail.vue +++ b/apps/web-naive/src/views/system/operatelog/modules/detail.vue @@ -12,11 +12,7 @@ import { useDetailSchema } from '../data'; const formData = ref(); const [Descriptions] = useDescription({ - componentProps: { - bordered: true, - column: 1, - contentClass: 'mx-4', - }, + column: 1, schema: useDetailSchema(), }); diff --git a/apps/web-naive/src/views/system/sms/log/data.ts b/apps/web-naive/src/views/system/sms/log/data.ts index 4ea28ba50..6fea4bb36 100644 --- a/apps/web-naive/src/views/system/sms/log/data.ts +++ b/apps/web-naive/src/views/system/sms/log/data.ts @@ -1,6 +1,5 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { SystemSmsLogApi } from '#/api/system/sms/log'; import type { DescriptionItemSchema } from '#/components/description'; import { h } from 'vue'; @@ -179,9 +178,7 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'createTime', label: '创建时间', - content: (data: SystemSmsLogApi.SmsLog) => { - return formatDateTime(data?.createTime || '') as string; - }, + render: (val) => formatDateTime(val) as string, }, { field: 'mobile', @@ -198,10 +195,10 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'templateType', label: '模板类型', - content: (data: SystemSmsLogApi.SmsLog) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.SYSTEM_SMS_TEMPLATE_TYPE, - value: data?.templateType, + value: val, }); }, }, @@ -212,19 +209,17 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'sendStatus', label: '发送状态', - content: (data: SystemSmsLogApi.SmsLog) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.SYSTEM_SMS_SEND_STATUS, - value: data?.sendStatus, + value: val, }); }, }, { field: 'sendTime', label: '发送时间', - content: (data: SystemSmsLogApi.SmsLog) => { - return formatDateTime(data?.sendTime || '') as string; - }, + render: (val) => formatDateTime(val) as string, }, { field: 'apiSendCode', @@ -237,19 +232,17 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'receiveStatus', label: '接收状态', - content: (data: SystemSmsLogApi.SmsLog) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.SYSTEM_SMS_RECEIVE_STATUS, - value: data?.receiveStatus, + value: val, }); }, }, { field: 'receiveTime', label: '接收时间', - content: (data: SystemSmsLogApi.SmsLog) => { - return formatDateTime(data?.receiveTime || '') as string; - }, + render: (val) => formatDateTime(val) as string, }, { field: 'apiReceiveCode', diff --git a/apps/web-naive/src/views/system/sms/log/modules/detail.vue b/apps/web-naive/src/views/system/sms/log/modules/detail.vue index fcc8bfc94..79c4ddcb7 100644 --- a/apps/web-naive/src/views/system/sms/log/modules/detail.vue +++ b/apps/web-naive/src/views/system/sms/log/modules/detail.vue @@ -12,11 +12,7 @@ import { useDetailSchema } from '../data'; const formData = ref(); const [Descriptions] = useDescription({ - componentProps: { - bordered: true, - column: 2, - contentClass: 'mx-4', - }, + column: 2, schema: useDetailSchema(), }); diff --git a/apps/web-naive/src/views/system/social/user/data.ts b/apps/web-naive/src/views/system/social/user/data.ts index da5cba3d7..a8fdc904a 100644 --- a/apps/web-naive/src/views/system/social/user/data.ts +++ b/apps/web-naive/src/views/system/social/user/data.ts @@ -1,6 +1,5 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { SystemSocialUserApi } from '#/api/system/social/user'; import type { DescriptionItemSchema } from '#/components/description'; import { h } from 'vue'; @@ -8,6 +7,8 @@ import { h } from 'vue'; import { DICT_TYPE } from '@vben/constants'; import { getDictOptions } from '@vben/hooks'; +import { NImage } from 'naive-ui'; + import { DictTag } from '#/components/dict-tag'; import { getRangePickerDefaultProps } from '#/utils'; @@ -111,10 +112,10 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'type', label: '社交平台', - content: (data: SystemSocialUserApi.SocialUser) => { + render: (val) => { return h(DictTag, { type: DICT_TYPE.SYSTEM_SOCIAL_TYPE, - value: data?.type, + value: val, }); }, }, @@ -125,16 +126,11 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'avatar', label: '用户头像', - // TODO @芋艿:使用 antd 的 Image 组件 - content: (data: SystemSocialUserApi.SocialUser) => { - if (data?.avatar) { - return h('img', { - src: data.avatar, + render: (val) => { + if (val) { + return h(NImage, { + src: val, style: 'width: 30px; height: 30px; cursor: pointer;', - onClick: () => { - // 可以添加图片预览功能 - window.open(data.avatar, '_blank'); - }, }); } return '无'; diff --git a/apps/web-naive/src/views/system/social/user/modules/detail.vue b/apps/web-naive/src/views/system/social/user/modules/detail.vue index 6234ae279..8faeec7b3 100644 --- a/apps/web-naive/src/views/system/social/user/modules/detail.vue +++ b/apps/web-naive/src/views/system/social/user/modules/detail.vue @@ -14,13 +14,8 @@ import { useDetailSchema } from '../data'; const formData = ref(); const [Descriptions] = useDescription({ - componentProps: { - bordered: true, - column: 1, - size: 'middle', - class: 'mx-4', - labelStyle: { width: '185px' }, - }, + column: 1, + size: 'medium', schema: useDetailSchema(), });