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/processInstance/index.ts b/apps/web-antd/src/api/bpm/processInstance/index.ts index 32e0075b9..ecbc03855 100644 --- a/apps/web-antd/src/api/bpm/processInstance/index.ts +++ b/apps/web-antd/src/api/bpm/processInstance/index.ts @@ -15,6 +15,7 @@ export namespace BpmProcessInstanceApi { export interface Task { id: number; name: string; + assigneeUser?: User; } export interface User { @@ -51,6 +52,7 @@ export namespace BpmProcessInstanceApi { export interface ProcessInstance { businessKey: string; category: string; + categoryName?: string; createTime: string; endTime: string; fields: string[]; @@ -64,6 +66,10 @@ export namespace BpmProcessInstanceApi { startTime?: Date; startUser?: User; status: number; + summary?: { + key: string; + value: string; + }[]; tasks?: BpmProcessInstanceApi.Task[]; } 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/components/description/description.vue b/apps/web-antd/src/components/description/description.vue index c3f54695f..057f9db03 100644 --- a/apps/web-antd/src/components/description/description.vue +++ b/apps/web-antd/src/components/description/description.vue @@ -1,82 +1,196 @@ diff --git a/apps/web-antd/src/components/description/typing.ts b/apps/web-antd/src/components/description/typing.ts index a0e997770..378f4a2ad 100644 --- a/apps/web-antd/src/components/description/typing.ts +++ b/apps/web-antd/src/components/description/typing.ts @@ -1,27 +1,56 @@ -import type { DescriptionsProps } from 'ant-design-vue'; +import type { DescriptionsProps } from 'ant-design-vue/es/descriptions'; +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 DescriptionsProps { + // 是否包含卡片组件 + useCard?: boolean; + // 描述项配置 + schema: DescriptionItemSchema[]; + // 数据 + data: Recordable; + // 标题 + title?: string; + // 是否包含边框 + bordered?: boolean; + // 列数 + column?: + | number + | { + lg: number; + md: number; + sm: number; + xl: number; + xs: number; + xxl: number; + }; +} + +export interface DescInstance { + setDescProps(descProps: Partial): void; } diff --git a/apps/web-antd/src/components/description/use-description.ts b/apps/web-antd/src/components/description/use-description.ts index 7f99238bf..fd24920f0 100644 --- a/apps/web-antd/src/components/description/use-description.ts +++ b/apps/web-antd/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; } diff --git a/apps/web-antd/src/views/ai/chat/manager/data.ts b/apps/web-antd/src/views/ai/chat/manager/data.ts index 5990e515e..e9379d911 100644 --- a/apps/web-antd/src/views/ai/chat/manager/data.ts +++ b/apps/web-antd/src/views/ai/chat/manager/data.ts @@ -109,7 +109,7 @@ export function useGridFormSchemaMessage(): VbenFormSchema[] { label: '用户编号', component: 'ApiSelect', componentProps: { - api: () => getSimpleUserList(), + api: getSimpleUserList, labelField: 'nickname', valueField: 'id', }, diff --git a/apps/web-antd/src/views/ai/image/manager/data.ts b/apps/web-antd/src/views/ai/image/manager/data.ts index d5e39b76b..9875ed7d7 100644 --- a/apps/web-antd/src/views/ai/image/manager/data.ts +++ b/apps/web-antd/src/views/ai/image/manager/data.ts @@ -15,7 +15,7 @@ export function useGridFormSchema(): VbenFormSchema[] { label: '用户编号', component: 'ApiSelect', componentProps: { - api: () => getSimpleUserList(), + api: getSimpleUserList, labelField: 'nickname', valueField: 'id', }, diff --git a/apps/web-antd/src/views/ai/mindmap/manager/data.ts b/apps/web-antd/src/views/ai/mindmap/manager/data.ts index eb56c92a9..3889353cf 100644 --- a/apps/web-antd/src/views/ai/mindmap/manager/data.ts +++ b/apps/web-antd/src/views/ai/mindmap/manager/data.ts @@ -12,7 +12,7 @@ export function useGridFormSchema(): VbenFormSchema[] { label: '用户编号', component: 'ApiSelect', componentProps: { - api: () => getSimpleUserList(), + api: getSimpleUserList, labelField: 'nickname', valueField: 'id', }, diff --git a/apps/web-antd/src/views/ai/model/chatRole/data.ts b/apps/web-antd/src/views/ai/model/chatRole/data.ts index f06a832bf..2e1bc63bf 100644 --- a/apps/web-antd/src/views/ai/model/chatRole/data.ts +++ b/apps/web-antd/src/views/ai/model/chatRole/data.ts @@ -93,7 +93,7 @@ export function useFormSchema(): VbenFormSchema[] { component: 'ApiSelect', componentProps: { placeholder: '请选择引用知识库', - api: () => getSimpleKnowledgeList(), + api: getSimpleKnowledgeList, labelField: 'name', mode: 'multiple', valueField: 'id', @@ -106,7 +106,7 @@ export function useFormSchema(): VbenFormSchema[] { component: 'ApiSelect', componentProps: { placeholder: '请选择引用工具', - api: () => getToolSimpleList(), + api: getToolSimpleList, mode: 'multiple', labelField: 'name', valueField: 'id', diff --git a/apps/web-antd/src/views/ai/model/model/data.ts b/apps/web-antd/src/views/ai/model/model/data.ts index 9dfe948f4..31f3ab05b 100644 --- a/apps/web-antd/src/views/ai/model/model/data.ts +++ b/apps/web-antd/src/views/ai/model/model/data.ts @@ -48,7 +48,7 @@ export function useFormSchema(): VbenFormSchema[] { component: 'ApiSelect', componentProps: { placeholder: '请选择API 秘钥', - api: () => getApiKeySimpleList(), + api: getApiKeySimpleList, labelField: 'name', valueField: 'id', allowClear: true, diff --git a/apps/web-antd/src/views/ai/music/manager/data.ts b/apps/web-antd/src/views/ai/music/manager/data.ts index d6468eb0d..162e7a196 100644 --- a/apps/web-antd/src/views/ai/music/manager/data.ts +++ b/apps/web-antd/src/views/ai/music/manager/data.ts @@ -15,7 +15,7 @@ export function useGridFormSchema(): VbenFormSchema[] { label: '用户编号', component: 'ApiSelect', componentProps: { - api: () => getSimpleUserList(), + api: getSimpleUserList, labelField: 'nickname', valueField: 'id', }, diff --git a/apps/web-antd/src/views/ai/write/manager/data.ts b/apps/web-antd/src/views/ai/write/manager/data.ts index 7c1768f64..d878d28ee 100644 --- a/apps/web-antd/src/views/ai/write/manager/data.ts +++ b/apps/web-antd/src/views/ai/write/manager/data.ts @@ -15,7 +15,7 @@ export function useGridFormSchema(): VbenFormSchema[] { label: '用户编号', component: 'ApiSelect', componentProps: { - api: () => getSimpleUserList(), + api: getSimpleUserList, labelField: 'nickname', valueField: 'id', }, diff --git a/apps/web-antd/src/views/bpm/form/designer/index.vue b/apps/web-antd/src/views/bpm/form/designer/index.vue index 266fe51e6..17bc6bd7d 100644 --- a/apps/web-antd/src/views/bpm/form/designer/index.vue +++ b/apps/web-antd/src/views/bpm/form/designer/index.vue @@ -138,11 +138,7 @@ onMounted(() => { - + - - + + - + diff --git a/apps/web-ele/src/views/member/user/detail/modules/user-order-list.vue b/apps/web-ele/src/views/member/user/detail/modules/user-order-list.vue index e19da013f..c00784265 100644 --- a/apps/web-ele/src/views/member/user/detail/modules/user-order-list.vue +++ b/apps/web-ele/src/views/member/user/detail/modules/user-order-list.vue @@ -104,7 +104,7 @@ const [Grid] = useVbenVxeGrid({ component: 'ApiSelect', componentProps: { clearable: true, - api: () => getSimpleDeliveryExpressList(), + api: getSimpleDeliveryExpressList, labelField: 'name', valueField: 'id', placeholder: '全部', @@ -120,7 +120,7 @@ const [Grid] = useVbenVxeGrid({ label: '自提门店', component: 'ApiSelect', componentProps: { - api: () => getSimpleDeliveryPickUpStoreList(), + api: getSimpleDeliveryPickUpStoreList, labelField: 'name', valueField: 'id', }, diff --git a/apps/web-ele/src/views/pay/notify/data.ts b/apps/web-ele/src/views/pay/notify/data.ts index 2dd815227..8d301628d 100644 --- a/apps/web-ele/src/views/pay/notify/data.ts +++ b/apps/web-ele/src/views/pay/notify/data.ts @@ -21,7 +21,7 @@ export function useGridFormSchema(): VbenFormSchema[] { label: '应用编号', component: 'ApiSelect', componentProps: { - api: () => getAppList(), + api: getAppList, labelField: 'name', valueField: 'id', autoSelect: 'first', 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/dept/data.ts b/apps/web-ele/src/views/system/dept/data.ts index 7e4a6d611..0bc18c1bc 100644 --- a/apps/web-ele/src/views/system/dept/data.ts +++ b/apps/web-ele/src/views/system/dept/data.ts @@ -74,7 +74,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '负责人', component: 'ApiSelect', componentProps: { - api: () => getSimpleUserList(), + api: getSimpleUserList, labelField: 'nickname', valueField: 'id', placeholder: '请选择负责人', diff --git a/apps/web-ele/src/views/system/dict/data.ts b/apps/web-ele/src/views/system/dict/data.ts index 566c2f7a8..70775d4e7 100644 --- a/apps/web-ele/src/views/system/dict/data.ts +++ b/apps/web-ele/src/views/system/dict/data.ts @@ -183,7 +183,7 @@ export function useDataFormSchema(): VbenFormSchema[] { component: 'ApiSelect', componentProps: (values) => { return { - api: () => getSimpleDictTypeList(), + api: getSimpleDictTypeList, placeholder: '请输入字典类型', labelField: 'name', valueField: 'type', 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 ad0c5de7d..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'; @@ -59,7 +58,7 @@ export function useGridFormSchema(): VbenFormSchema[] { label: '邮箱账号', component: 'ApiSelect', componentProps: { - api: () => getSimpleMailAccountList(), + api: getSimpleMailAccountList, labelField: 'mail', valueField: 'id', clearable: true, @@ -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/mail/template/data.ts b/apps/web-ele/src/views/system/mail/template/data.ts index d567e3468..e57e92f17 100644 --- a/apps/web-ele/src/views/system/mail/template/data.ts +++ b/apps/web-ele/src/views/system/mail/template/data.ts @@ -42,7 +42,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '邮箱账号', component: 'ApiSelect', componentProps: { - api: () => getSimpleMailAccountList(), + api: getSimpleMailAccountList, labelField: 'mail', valueField: 'id', placeholder: '请选择邮箱账号', @@ -177,7 +177,7 @@ export function useGridFormSchema(): VbenFormSchema[] { label: '邮箱账号', component: 'ApiSelect', componentProps: { - api: () => getSimpleMailAccountList(), + api: getSimpleMailAccountList, labelField: 'mail', valueField: 'id', clearable: true, 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/notify/template/data.ts b/apps/web-ele/src/views/system/notify/template/data.ts index 285f83a7e..5aedc89dc 100644 --- a/apps/web-ele/src/views/system/notify/template/data.ts +++ b/apps/web-ele/src/views/system/notify/template/data.ts @@ -193,7 +193,7 @@ export function useSendNotifyFormSchema(): VbenFormSchema[] { label: '接收人', component: 'ApiSelect', componentProps: { - api: () => getSimpleUserList(), + api: getSimpleUserList, labelField: 'nickname', valueField: 'id', placeholder: '请选择接收人', diff --git a/apps/web-ele/src/views/system/operatelog/data.ts b/apps/web-ele/src/views/system/operatelog/data.ts index 31c808d8a..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'; @@ -16,7 +15,7 @@ export function useGridFormSchema(): VbenFormSchema[] { label: '操作人', component: 'ApiSelect', componentProps: { - api: () => getSimpleUserList(), + api: getSimpleUserList, labelField: 'nickname', valueField: 'id', clearable: true, @@ -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 52a36a3af..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'; @@ -30,7 +29,7 @@ export function useGridFormSchema(): VbenFormSchema[] { label: '短信渠道', component: 'ApiSelect', componentProps: { - api: () => getSimpleSmsChannelList(), + api: getSimpleSmsChannelList, labelField: 'signature', valueField: 'id', clearable: true, @@ -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/sms/template/data.ts b/apps/web-ele/src/views/system/sms/template/data.ts index 54701404d..0a3d3e814 100644 --- a/apps/web-ele/src/views/system/sms/template/data.ts +++ b/apps/web-ele/src/views/system/sms/template/data.ts @@ -52,7 +52,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '短信渠道', component: 'ApiSelect', componentProps: { - api: () => getSimpleSmsChannelList(), + api: getSimpleSmsChannelList, labelField: 'signature', valueField: 'id', placeholder: '请选择短信渠道', @@ -144,7 +144,7 @@ export function useGridFormSchema(): VbenFormSchema[] { label: '短信渠道', component: 'ApiSelect', componentProps: { - api: () => getSimpleSmsChannelList(), + api: getSimpleSmsChannelList, labelField: 'signature', valueField: 'id', clearable: true, 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(), }); diff --git a/apps/web-ele/src/views/system/tenant/data.ts b/apps/web-ele/src/views/system/tenant/data.ts index ecacc0401..94d005338 100644 --- a/apps/web-ele/src/views/system/tenant/data.ts +++ b/apps/web-ele/src/views/system/tenant/data.ts @@ -35,7 +35,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '租户套餐', component: 'ApiSelect', componentProps: { - api: () => getTenantPackageList(), + api: getTenantPackageList, labelField: 'name', valueField: 'id', placeholder: '请选择租户套餐', diff --git a/apps/web-ele/src/views/system/user/data.ts b/apps/web-ele/src/views/system/user/data.ts index d0f5ba5c1..43fc5e49a 100644 --- a/apps/web-ele/src/views/system/user/data.ts +++ b/apps/web-ele/src/views/system/user/data.ts @@ -70,7 +70,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '岗位', component: 'ApiSelect', componentProps: { - api: () => getSimplePostList(), + api: getSimplePostList, labelField: 'name', valueField: 'id', multiple: true, @@ -212,7 +212,7 @@ export function useAssignRoleFormSchema(): VbenFormSchema[] { label: '角色', component: 'ApiSelect', componentProps: { - api: () => getSimpleRoleList(), + api: getSimpleRoleList, labelField: 'name', valueField: 'id', multiple: true, 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; } 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/codegen/data.ts b/apps/web-naive/src/views/infra/codegen/data.ts index 2810eaa01..ed742d84f 100644 --- a/apps/web-naive/src/views/infra/codegen/data.ts +++ b/apps/web-naive/src/views/infra/codegen/data.ts @@ -25,7 +25,7 @@ export function useImportTableFormSchema(): VbenFormSchema[] { label: '数据源', component: 'ApiSelect', componentProps: { - api: () => getDataSourceConfigList(), + api: getDataSourceConfigList, labelField: 'name', valueField: 'id', autoSelect: 'first', 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/infra/redis/modules/memory.vue b/apps/web-naive/src/views/infra/redis/modules/memory.vue index 6eeda8958..5220c4631 100644 --- a/apps/web-naive/src/views/infra/redis/modules/memory.vue +++ b/apps/web-naive/src/views/infra/redis/modules/memory.vue @@ -94,7 +94,7 @@ function renderMemoryChart() { detail: { show: true, offsetCenter: [0, '50%'], - color: 'auto', + color: 'inherit', fontSize: 30, formatter: usedMemory, }, diff --git a/apps/web-naive/src/views/system/dept/data.ts b/apps/web-naive/src/views/system/dept/data.ts index ae9a462c6..b81ccbc2f 100644 --- a/apps/web-naive/src/views/system/dept/data.ts +++ b/apps/web-naive/src/views/system/dept/data.ts @@ -75,7 +75,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '负责人', component: 'ApiSelect', componentProps: { - api: () => getSimpleUserList(), + api: getSimpleUserList, labelField: 'nickname', valueField: 'id', placeholder: '请选择负责人', diff --git a/apps/web-naive/src/views/system/dict/data.ts b/apps/web-naive/src/views/system/dict/data.ts index 76d5be456..6049b56a1 100644 --- a/apps/web-naive/src/views/system/dict/data.ts +++ b/apps/web-naive/src/views/system/dict/data.ts @@ -186,7 +186,7 @@ export function useDataFormSchema(): VbenFormSchema[] { component: 'ApiSelect', componentProps: (values) => { return { - api: () => getSimpleDictTypeList(), + api: getSimpleDictTypeList, placeholder: '请输入字典类型', labelField: 'name', valueField: 'type', 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 3297b8eb4..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'; @@ -59,7 +58,7 @@ export function useGridFormSchema(): VbenFormSchema[] { label: '邮箱账号', component: 'ApiSelect', componentProps: { - api: () => getSimpleMailAccountList(), + api: getSimpleMailAccountList, labelField: 'mail', valueField: 'id', clearable: true, @@ -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/mail/template/data.ts b/apps/web-naive/src/views/system/mail/template/data.ts index 01aded480..fa20c0554 100644 --- a/apps/web-naive/src/views/system/mail/template/data.ts +++ b/apps/web-naive/src/views/system/mail/template/data.ts @@ -42,7 +42,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '邮箱账号', component: 'ApiSelect', componentProps: { - api: () => getSimpleMailAccountList(), + api: getSimpleMailAccountList, labelField: 'mail', valueField: 'id', placeholder: '请选择邮箱账号', @@ -187,7 +187,7 @@ export function useGridFormSchema(): VbenFormSchema[] { label: '邮箱账号', component: 'ApiSelect', componentProps: { - api: () => getSimpleMailAccountList(), + api: getSimpleMailAccountList, labelField: 'mail', valueField: 'id', clearable: true, 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/notify/template/data.ts b/apps/web-naive/src/views/system/notify/template/data.ts index 398239bf2..67e09176b 100644 --- a/apps/web-naive/src/views/system/notify/template/data.ts +++ b/apps/web-naive/src/views/system/notify/template/data.ts @@ -196,7 +196,7 @@ export function useSendNotifyFormSchema(): VbenFormSchema[] { label: '接收人', component: 'ApiSelect', componentProps: { - api: () => getSimpleUserList(), + api: getSimpleUserList, labelField: 'nickname', valueField: 'id', placeholder: '请选择接收人', diff --git a/apps/web-naive/src/views/system/operatelog/data.ts b/apps/web-naive/src/views/system/operatelog/data.ts index 096103466..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'; @@ -16,7 +15,7 @@ export function useGridFormSchema(): VbenFormSchema[] { label: '操作人', component: 'ApiSelect', componentProps: { - api: () => getSimpleUserList(), + api: getSimpleUserList, labelField: 'nickname', valueField: 'id', clearable: true, @@ -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 a18d2e6dc..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'; @@ -30,7 +29,7 @@ export function useGridFormSchema(): VbenFormSchema[] { label: '短信渠道', component: 'ApiSelect', componentProps: { - api: () => getSimpleSmsChannelList(), + api: getSimpleSmsChannelList, labelField: 'signature', valueField: 'id', clearable: true, @@ -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/sms/template/data.ts b/apps/web-naive/src/views/system/sms/template/data.ts index 268c67ac6..d8b381040 100644 --- a/apps/web-naive/src/views/system/sms/template/data.ts +++ b/apps/web-naive/src/views/system/sms/template/data.ts @@ -52,7 +52,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '短信渠道', component: 'ApiSelect', componentProps: { - api: () => getSimpleSmsChannelList(), + api: getSimpleSmsChannelList, labelField: 'signature', valueField: 'id', placeholder: '请选择短信渠道', @@ -146,7 +146,7 @@ export function useGridFormSchema(): VbenFormSchema[] { label: '短信渠道', component: 'ApiSelect', componentProps: { - api: () => getSimpleSmsChannelList(), + api: getSimpleSmsChannelList, labelField: 'signature', valueField: 'id', clearable: true, 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(), }); diff --git a/apps/web-naive/src/views/system/tenant/data.ts b/apps/web-naive/src/views/system/tenant/data.ts index 4b583a978..cc8cdb22e 100644 --- a/apps/web-naive/src/views/system/tenant/data.ts +++ b/apps/web-naive/src/views/system/tenant/data.ts @@ -39,7 +39,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '租户套餐', component: 'ApiSelect', componentProps: { - api: () => getTenantPackageList(), + api: getTenantPackageList, labelField: 'name', valueField: 'id', placeholder: '请选择租户套餐', diff --git a/apps/web-naive/src/views/system/user/data.ts b/apps/web-naive/src/views/system/user/data.ts index a6b896579..cf093063f 100644 --- a/apps/web-naive/src/views/system/user/data.ts +++ b/apps/web-naive/src/views/system/user/data.ts @@ -70,7 +70,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '岗位', component: 'ApiSelect', componentProps: { - api: () => getSimplePostList(), + api: getSimplePostList, labelField: 'name', valueField: 'id', tag: true, @@ -216,7 +216,7 @@ export function useAssignRoleFormSchema(): VbenFormSchema[] { label: '角色', component: 'ApiSelect', componentProps: { - api: () => getSimpleRoleList(), + api: getSimpleRoleList, labelField: 'name', valueField: 'id', tag: true, diff --git a/packages/@core/base/shared/src/utils/util.ts b/packages/@core/base/shared/src/utils/util.ts index fd202ed50..1bb980ef0 100644 --- a/packages/@core/base/shared/src/utils/util.ts +++ b/packages/@core/base/shared/src/utils/util.ts @@ -48,22 +48,22 @@ export function getNestedValue(obj: T, path: string): any { * @param key 参数键名 * @param urlStr 链接地址,默认为当前浏览器的地址 */ -export const getUrlNumberValue = ( +export function getUrlNumberValue( key: string, urlStr: string = location.href, -): number => { +): number { return Number(getUrlValue(key, urlStr)); -}; +} /** * 获取链接的参数值 * @param key 参数键名 * @param urlStr 链接地址,默认为当前浏览器的地址 */ -export const getUrlValue = ( +export function getUrlValue( key: string, urlStr: string = location.href, -): string => { +): string { if (!urlStr || !key) return ''; const url = new URL(decodeURIComponent(urlStr)); return url.searchParams.get(key) ?? ''; @@ -74,7 +74,7 @@ export const getUrlValue = ( * @param target 目标对象 * @param source 源对象 */ -export const copyValueToTarget = (target: any, source: any) => { +export function copyValueToTarget(target: any, source: any) { const newObj = Object.assign({}, target, source); // 删除多余属性 Object.keys(newObj).forEach((key) => { @@ -86,4 +86,4 @@ export const copyValueToTarget = (target: any, source: any) => { }); // 更新目标对象值 Object.assign(target, newObj); -}; +} diff --git a/packages/constants/src/dict-enum.ts b/packages/constants/src/dict-enum.ts index 06c4182dd..7ced37eb7 100644 --- a/packages/constants/src/dict-enum.ts +++ b/packages/constants/src/dict-enum.ts @@ -59,6 +59,7 @@ const PAY_DICT = { PAY_NOTIFY_STATUS: 'pay_notify_status', // 商户支付回调状态 PAY_NOTIFY_TYPE: 'pay_notify_type', // 商户支付回调状态 PAY_TRANSFER_STATUS: 'pay_transfer_status', // 转账订单状态 + PAY_TRANSFER_TYPE: 'pay_transfer_type', // 转账类型 } as const; /** ========== MP - 公众号模块 ========== */