From 6236f594736e2a381b3b6b8a66c59a14f6129f88 Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Wed, 28 May 2025 11:36:52 +0800 Subject: [PATCH 01/25] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=98=BE=E7=A4=BA=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infra/apiAccessLog/modules/detail.vue | 4 +- .../infra/apiErrorLog/modules/detail.vue | 12 ++-- .../infra/dataSourceConfig/modules/form.vue | 2 +- apps/web-antd/src/views/pay/order/data.ts | 3 +- apps/web-antd/src/views/pay/order/index.vue | 29 +++++--- apps/web-antd/src/views/pay/refund/data.ts | 67 +++++-------------- .../system/oauth2/client/modules/form.vue | 4 +- .../src/views/system/sms/channel/data.ts | 33 ++++----- .../views/system/sms/channel/modules/form.vue | 4 +- .../web-antd/src/views/system/sms/log/data.ts | 20 ++---- .../src/views/system/sms/template/data.ts | 18 ++--- .../system/sms/template/modules/form.vue | 4 +- .../system/sms/template/modules/send-form.vue | 2 +- 13 files changed, 72 insertions(+), 130 deletions(-) diff --git a/apps/web-antd/src/views/infra/apiAccessLog/modules/detail.vue b/apps/web-antd/src/views/infra/apiAccessLog/modules/detail.vue index dcac73c0d..b09c1bf29 100644 --- a/apps/web-antd/src/views/infra/apiAccessLog/modules/detail.vue +++ b/apps/web-antd/src/views/infra/apiAccessLog/modules/detail.vue @@ -3,7 +3,7 @@ import type { InfraApiAccessLogApi } from '#/api/infra/api-access-log'; import { ref } from 'vue'; -import { useVbenModal } from '@vben/common-ui'; +import { JsonViewer, useVbenModal } from '@vben/common-ui'; import { formatDateTime } from '@vben/utils'; import { Descriptions } from 'ant-design-vue'; @@ -71,7 +71,7 @@ const [Modal, modalApi] = useVbenModal({ {{ formData?.requestMethod }} {{ formData?.requestUrl }} - {{ formData?.requestParams }} + {{ formData?.responseBody }} diff --git a/apps/web-antd/src/views/infra/apiErrorLog/modules/detail.vue b/apps/web-antd/src/views/infra/apiErrorLog/modules/detail.vue index 9b9257c34..ff5aba82e 100644 --- a/apps/web-antd/src/views/infra/apiErrorLog/modules/detail.vue +++ b/apps/web-antd/src/views/infra/apiErrorLog/modules/detail.vue @@ -3,10 +3,10 @@ import type { InfraApiErrorLogApi } from '#/api/infra/api-error-log'; import { ref } from 'vue'; -import { useVbenModal } from '@vben/common-ui'; +import { JsonViewer, useVbenModal } from '@vben/common-ui'; import { formatDateTime } from '@vben/utils'; -import { Descriptions, Input } from 'ant-design-vue'; +import { Descriptions } from 'ant-design-vue'; import { DictTag } from '#/components/dict-tag'; import { DICT_TYPE } from '#/utils'; @@ -71,7 +71,7 @@ const [Modal, modalApi] = useVbenModal({ {{ formData?.requestMethod }} {{ formData?.requestUrl }} - {{ formData?.requestParams }} + {{ formatDateTime(formData?.exceptionTime || '') }} @@ -80,11 +80,7 @@ const [Modal, modalApi] = useVbenModal({ {{ formData?.exceptionName }} - + diff --git a/apps/web-antd/src/views/pay/order/data.ts b/apps/web-antd/src/views/pay/order/data.ts index b52b5bf26..9a05cc0cd 100644 --- a/apps/web-antd/src/views/pay/order/data.ts +++ b/apps/web-antd/src/views/pay/order/data.ts @@ -116,7 +116,6 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { { title: '支付时间', field: 'successTime', - minWidth: 180, formatter: 'formatDateTime', }, { @@ -129,7 +128,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { }, { title: '操作', - width: 80, + width: 100, fixed: 'right', slots: { default: 'actions' }, }, diff --git a/apps/web-antd/src/views/pay/order/index.vue b/apps/web-antd/src/views/pay/order/index.vue index 47eac2349..96432d852 100644 --- a/apps/web-antd/src/views/pay/order/index.vue +++ b/apps/web-antd/src/views/pay/order/index.vue @@ -31,8 +31,12 @@ function handleDetail(row: PayOrderApi.Order) { const [Grid, gridApi] = useVbenVxeGrid({ formOptions: { schema: useGridFormSchema(), + collapsed: false, }, gridOptions: { + cellConfig: { + height: 80, + }, columns: useGridColumns(), height: 'auto', keepSource: true, @@ -49,6 +53,9 @@ const [Grid, gridApi] = useVbenVxeGrid({ }, rowConfig: { keyField: 'id', + isCurrent: true, + isHover: true, + resizable: true, }, toolbarConfig: { refresh: { code: 'query' }, @@ -90,16 +97,18 @@ const [Grid, gridApi] = useVbenVxeGrid({ /> diff --git a/apps/web-antd/src/views/pay/refund/data.ts b/apps/web-antd/src/views/pay/refund/data.ts index 010777464..835860a7a 100644 --- a/apps/web-antd/src/views/pay/refund/data.ts +++ b/apps/web-antd/src/views/pay/refund/data.ts @@ -80,76 +80,41 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { { field: 'id', title: '编号', - minWidth: 100, - }, - { - field: 'createTime', - title: '创建时间', - minWidth: 180, - formatter: 'formatDateTime', - }, - { - field: 'payPrice', - title: '支付金额', - minWidth: 120, - cellRender: { - name: 'CellTag', - props: { - type: 'success', - content: '¥{payPrice}', - formatter: (value: number) => (value / 100).toFixed(2), - }, - }, - }, - { - field: 'refundPrice', - title: '退款金额', - minWidth: 120, - cellRender: { - name: 'CellTag', - props: { - type: 'danger', - content: '¥{refundPrice}', - formatter: (value: number) => (value / 100).toFixed(2), - }, - }, }, { field: 'merchantRefundId', title: '退款订单号', - minWidth: 300, - cellRender: { - name: 'CellTag', - props: { - type: 'info', - content: '商户 {merchantRefundId}', - }, - }, }, { field: 'channelRefundNo', title: '渠道退款单号', - minWidth: 200, - cellRender: { - name: 'CellTag', - props: { - type: 'success', - content: '{channelRefundNo}', - }, - }, + }, + { + field: 'payPrice', + title: '支付金额', + formatter: 'formatFraction', + }, + { + field: 'refundPrice', + title: '退款金额', + formatter: 'formatFraction', }, { field: 'status', title: '退款状态', - minWidth: 120, cellRender: { name: 'CellDict', props: { type: DICT_TYPE.PAY_REFUND_STATUS }, }, }, + { + field: 'createTime', + title: '创建时间', + formatter: 'formatDateTime', + }, { title: '操作', - width: 80, + width: 100, fixed: 'right', slots: { default: 'actions' }, }, diff --git a/apps/web-antd/src/views/system/oauth2/client/modules/form.vue b/apps/web-antd/src/views/system/oauth2/client/modules/form.vue index 53415b618..d32ae3c68 100644 --- a/apps/web-antd/src/views/system/oauth2/client/modules/form.vue +++ b/apps/web-antd/src/views/system/oauth2/client/modules/form.vue @@ -31,7 +31,7 @@ const [Form, formApi] = useVbenForm({ class: 'w-full', }, formItemClass: 'col-span-2', - labelWidth: 80, + labelWidth: 140, }, layout: 'horizontal', schema: useFormSchema(), @@ -83,7 +83,7 @@ const [Modal, modalApi] = useVbenModal({ diff --git a/apps/web-antd/src/views/system/sms/channel/data.ts b/apps/web-antd/src/views/system/sms/channel/data.ts index 2956cd236..18efe62f0 100644 --- a/apps/web-antd/src/views/system/sms/channel/data.ts +++ b/apps/web-antd/src/views/system/sms/channel/data.ts @@ -50,14 +50,6 @@ export function useFormSchema(): VbenFormSchema[] { }, rules: z.number().default(CommonStatusEnum.ENABLE), }, - { - fieldName: 'remark', - label: '备注', - component: 'Textarea', - componentProps: { - placeholder: '请输入备注', - }, - }, { fieldName: 'apiKey', label: '短信 API 的账号', @@ -83,6 +75,14 @@ export function useFormSchema(): VbenFormSchema[] { placeholder: '请输入短信发送回调 URL', }, }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + placeholder: '请输入备注', + }, + }, ]; } @@ -135,17 +135,14 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { { field: 'id', title: '编号', - minWidth: 100, }, { field: 'signature', title: '短信签名', - minWidth: 120, }, { field: 'code', title: '渠道编码', - minWidth: 120, cellRender: { name: 'CellDict', props: { type: DICT_TYPE.SYSTEM_SMS_CHANNEL_CODE }, @@ -154,38 +151,32 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { { field: 'status', title: '启用状态', - minWidth: 100, cellRender: { name: 'CellDict', props: { type: DICT_TYPE.COMMON_STATUS }, }, }, - { - field: 'remark', - title: '备注', - minWidth: 120, - }, { field: 'apiKey', title: '短信 API 的账号', - minWidth: 180, }, { field: 'apiSecret', title: '短信 API 的密钥', - minWidth: 180, }, { field: 'callbackUrl', title: '短信发送回调 URL', - minWidth: 180, }, { field: 'createTime', title: '创建时间', - minWidth: 180, formatter: 'formatDateTime', }, + { + field: 'remark', + title: '备注', + }, { title: '操作', width: 130, diff --git a/apps/web-antd/src/views/system/sms/channel/modules/form.vue b/apps/web-antd/src/views/system/sms/channel/modules/form.vue index d1efa610b..7c15b2a89 100644 --- a/apps/web-antd/src/views/system/sms/channel/modules/form.vue +++ b/apps/web-antd/src/views/system/sms/channel/modules/form.vue @@ -31,7 +31,7 @@ const [Form, formApi] = useVbenForm({ class: 'w-full', }, formItemClass: 'col-span-2', - labelWidth: 80, + labelWidth: 120, }, layout: 'horizontal', schema: useFormSchema(), @@ -82,7 +82,7 @@ const [Modal, modalApi] = useVbenModal({ diff --git a/apps/web-antd/src/views/system/sms/log/data.ts b/apps/web-antd/src/views/system/sms/log/data.ts index b4f5de358..4b4d632b0 100644 --- a/apps/web-antd/src/views/system/sms/log/data.ts +++ b/apps/web-antd/src/views/system/sms/log/data.ts @@ -84,18 +84,10 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { { field: 'id', title: '编号', - minWidth: 100, - }, - { - field: 'createTime', - title: '创建时间', - minWidth: 180, - formatter: 'formatDateTime', }, { field: 'mobile', title: '手机号', - minWidth: 120, }, { field: 'templateContent', @@ -105,7 +97,6 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { { field: 'sendStatus', title: '发送状态', - minWidth: 120, cellRender: { name: 'CellDict', props: { type: DICT_TYPE.SYSTEM_SMS_SEND_STATUS }, @@ -114,13 +105,11 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { { field: 'sendTime', title: '发送时间', - minWidth: 180, formatter: 'formatDateTime', }, { field: 'receiveStatus', title: '接收状态', - minWidth: 120, cellRender: { name: 'CellDict', props: { type: DICT_TYPE.SYSTEM_SMS_RECEIVE_STATUS }, @@ -129,13 +118,11 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { { field: 'receiveTime', title: '接收时间', - minWidth: 180, formatter: 'formatDateTime', }, { field: 'channelCode', title: '短信渠道', - minWidth: 120, cellRender: { name: 'CellDict', props: { type: DICT_TYPE.SYSTEM_SMS_CHANNEL_CODE }, @@ -144,17 +131,20 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { { field: 'templateId', title: '模板编号', - minWidth: 100, }, { field: 'templateType', title: '短信类型', - minWidth: 100, cellRender: { name: 'CellDict', props: { type: DICT_TYPE.SYSTEM_SMS_TEMPLATE_TYPE }, }, }, + { + field: 'createTime', + title: '创建时间', + formatter: 'formatDateTime', + }, { title: '操作', width: 80, diff --git a/apps/web-antd/src/views/system/sms/template/data.ts b/apps/web-antd/src/views/system/sms/template/data.ts index f24f7cfd2..f56273cdb 100644 --- a/apps/web-antd/src/views/system/sms/template/data.ts +++ b/apps/web-antd/src/views/system/sms/template/data.ts @@ -78,6 +78,7 @@ export function useFormSchema(): VbenFormSchema[] { component: 'Textarea', componentProps: { placeholder: '请输入模板内容', + rows: 4, }, rules: 'required', }, @@ -204,12 +205,10 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { { field: 'id', title: '编号', - minWidth: 100, }, { field: 'type', title: '短信类型', - minWidth: 120, cellRender: { name: 'CellDict', props: { type: DICT_TYPE.SYSTEM_SMS_TEMPLATE_TYPE }, @@ -218,12 +217,10 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { { field: 'name', title: '模板名称', - minWidth: 120, }, { field: 'code', title: '模板编码', - minWidth: 120, }, { field: 'content', @@ -233,26 +230,18 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { { field: 'status', title: '开启状态', - minWidth: 100, cellRender: { name: 'CellDict', props: { type: DICT_TYPE.COMMON_STATUS }, }, }, - { - field: 'remark', - title: '备注', - minWidth: 120, - }, { field: 'apiTemplateId', title: '短信 API 的模板编号', - minWidth: 180, }, { field: 'channelCode', title: '短信渠道', - minWidth: 100, cellRender: { name: 'CellDict', props: { type: DICT_TYPE.SYSTEM_SMS_CHANNEL_CODE }, @@ -261,9 +250,12 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { { field: 'createTime', title: '创建时间', - minWidth: 180, formatter: 'formatDateTime', }, + { + field: 'remark', + title: '备注', + }, { title: '操作', width: 220, diff --git a/apps/web-antd/src/views/system/sms/template/modules/form.vue b/apps/web-antd/src/views/system/sms/template/modules/form.vue index 8edbc735c..2bca1fd5f 100644 --- a/apps/web-antd/src/views/system/sms/template/modules/form.vue +++ b/apps/web-antd/src/views/system/sms/template/modules/form.vue @@ -31,7 +31,7 @@ const [Form, formApi] = useVbenForm({ class: 'w-full', }, formItemClass: 'col-span-2', - labelWidth: 80, + labelWidth: 120, }, layout: 'horizontal', schema: useFormSchema(), @@ -83,7 +83,7 @@ const [Modal, modalApi] = useVbenModal({ diff --git a/apps/web-antd/src/views/system/sms/template/modules/send-form.vue b/apps/web-antd/src/views/system/sms/template/modules/send-form.vue index ff495de5d..ae82a3b32 100644 --- a/apps/web-antd/src/views/system/sms/template/modules/send-form.vue +++ b/apps/web-antd/src/views/system/sms/template/modules/send-form.vue @@ -103,7 +103,7 @@ const buildFormSchema = () => { From da45d15f0d6a2949901adb87174dbd77c5cb6dc9 Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Wed, 28 May 2025 18:26:38 +0800 Subject: [PATCH 02/25] perf: utils --- apps/web-antd/src/utils/download.ts | 1 + apps/web-antd/src/utils/index.ts | 1 - apps/web-antd/src/utils/validator.ts | 17 ----------------- 3 files changed, 1 insertion(+), 18 deletions(-) delete mode 100644 apps/web-antd/src/utils/validator.ts diff --git a/apps/web-antd/src/utils/download.ts b/apps/web-antd/src/utils/download.ts index acb0129c8..f7cf56596 100644 --- a/apps/web-antd/src/utils/download.ts +++ b/apps/web-antd/src/utils/download.ts @@ -2,6 +2,7 @@ * 下载工具模块 * 提供多种文件格式的下载功能 */ +// 请使用 @vben/utils/download 代替 packages/@core/base/shared/src/utils/download.ts /** * 图片下载配置接口 diff --git a/apps/web-antd/src/utils/index.ts b/apps/web-antd/src/utils/index.ts index 479a35472..b33984b78 100644 --- a/apps/web-antd/src/utils/index.ts +++ b/apps/web-antd/src/utils/index.ts @@ -6,4 +6,3 @@ export * from './formatTime'; export * from './formCreate'; export * from './rangePickerProps'; export * from './routerHelper'; -export * from './validator'; diff --git a/apps/web-antd/src/utils/validator.ts b/apps/web-antd/src/utils/validator.ts deleted file mode 100644 index 3ae62f787..000000000 --- a/apps/web-antd/src/utils/validator.ts +++ /dev/null @@ -1,17 +0,0 @@ -// 参数校验,对标 Hutool 的 Validator 工具类 - -/** 手机号正则表达式(中国) */ -const MOBILE_REGEX = /(?:0|86|\+86)?1[3-9]\d{9}/; - -/** - * 验证是否为手机号码(中国) - * - * @param value 值 - * @returns 是否为手机号码(中国) - */ -export function isMobile(value?: null | string): boolean { - if (!value) { - return false; - } - return MOBILE_REGEX.test(value); -} From 089d3bbd9b00a054fa00f27582f9392c5128eeaf Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Wed, 28 May 2025 19:00:21 +0800 Subject: [PATCH 03/25] feat: add member config --- apps/web-antd/src/api/member/config/index.ts | 22 +++ .../src/views/member/config/index.vue | 130 ++++++++++++++---- 2 files changed, 127 insertions(+), 25 deletions(-) create mode 100644 apps/web-antd/src/api/member/config/index.ts diff --git a/apps/web-antd/src/api/member/config/index.ts b/apps/web-antd/src/api/member/config/index.ts new file mode 100644 index 000000000..073110d66 --- /dev/null +++ b/apps/web-antd/src/api/member/config/index.ts @@ -0,0 +1,22 @@ +import { requestClient } from '#/api/request'; + +export namespace MemberConfigApi { + /** 积分设置信息 */ + export interface Config { + id?: number; + pointTradeDeductEnable: number; + pointTradeDeductUnitPrice: number; + pointTradeDeductMaxPrice: number; + pointTradeGivePoint: number; + } +} + +/** 查询积分设置详情 */ +export function getConfig() { + return requestClient.get('/member/config/get'); +} + +/** 新增修改积分设置 */ +export function saveConfig(data: MemberConfigApi.Config) { + return requestClient.put('/member/config/save', data); +} diff --git a/apps/web-antd/src/views/member/config/index.vue b/apps/web-antd/src/views/member/config/index.vue index 3bcd2e0a5..b0e17b485 100644 --- a/apps/web-antd/src/views/member/config/index.vue +++ b/apps/web-antd/src/views/member/config/index.vue @@ -1,34 +1,114 @@ From 643b44862ac046853a961688ac347996880753f7 Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Wed, 28 May 2025 20:05:46 +0800 Subject: [PATCH 04/25] =?UTF-8?q?fix:=20=E6=96=87=E6=9C=AC=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/views/infra/config/index.vue | 2 +- apps/web-antd/src/views/system/notify/template/index.vue | 2 +- apps/web-antd/src/views/system/post/index.vue | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/web-antd/src/views/infra/config/index.vue b/apps/web-antd/src/views/infra/config/index.vue index d51cea7bb..9d4d6d0ca 100644 --- a/apps/web-antd/src/views/infra/config/index.vue +++ b/apps/web-antd/src/views/infra/config/index.vue @@ -97,7 +97,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ -import { Page } from '@vben/common-ui'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MemberTagApi } from '#/api/member/tag'; -import { Button } from 'ant-design-vue'; +import { Page, useVbenModal } from '@vben/common-ui'; +import { message } from 'ant-design-vue'; + +import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; +import { deleteMemberTag, getMemberTagPage } from '#/api/member/tag'; import { DocAlert } from '#/components/doc-alert'; +import { $t } from '#/locales'; + +import { useGridColumns, useGridFormSchema } from './data'; +import Form from './modules/form.vue'; + +const [FormModal, formModalApi] = useVbenModal({ + connectedComponent: Form, + destroyOnClose: true, +}); + +/** 刷新表格 */ +function onRefresh() { + gridApi.query(); +} + +/** 创建会员标签 */ +function handleCreate() { + formModalApi.setData(null).open(); +} + +/** 编辑会员标签 */ +function handleEdit(row: MemberTagApi.Tag) { + formModalApi.setData(row).open(); +} + +/** 删除会员标签 */ +async function handleDelete(row: MemberTagApi.Tag) { + const hideLoading = message.loading({ + content: $t('ui.actionMessage.deleting', [row.name]), + key: 'action_key_msg', + }); + try { + await deleteMemberTag(row.id as number); + message.success({ + content: $t('ui.actionMessage.deleteSuccess', [row.name]), + key: 'action_key_msg', + }); + onRefresh(); + } finally { + hideLoading(); + } +} + +const [Grid, gridApi] = useVbenVxeGrid({ + formOptions: { + schema: useGridFormSchema(), + }, + gridOptions: { + columns: useGridColumns(), + height: 'auto', + keepSource: true, + proxyConfig: { + ajax: { + query: async ({ page }, formValues) => { + return await getMemberTagPage({ + pageNo: page.currentPage, + pageSize: page.pageSize, + ...formValues, + }); + }, + }, + }, + rowConfig: { + keyField: 'id', + }, + toolbarConfig: { + refresh: { code: 'query' }, + search: true, + }, + } as VxeTableGridOptions, +}); diff --git a/apps/web-antd/src/views/member/tag/modules/form.vue b/apps/web-antd/src/views/member/tag/modules/form.vue new file mode 100644 index 000000000..267bcde26 --- /dev/null +++ b/apps/web-antd/src/views/member/tag/modules/form.vue @@ -0,0 +1,88 @@ + + + From 5718bf6de6059dcab9b2246fef9969494eaf8e1c Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Wed, 28 May 2025 20:43:35 +0800 Subject: [PATCH 06/25] =?UTF-8?q?feat:=20=E4=BC=9A=E5=91=98=E5=88=97?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/api/member/level/index.ts | 49 ++++++ apps/web-antd/src/views/member/level/data.ts | 158 ++++++++++++++++++ .../web-antd/src/views/member/level/index.vue | 146 +++++++++++++--- .../src/views/member/level/modules/form.vue | 82 +++++++++ 4 files changed, 409 insertions(+), 26 deletions(-) create mode 100644 apps/web-antd/src/api/member/level/index.ts create mode 100644 apps/web-antd/src/views/member/level/data.ts create mode 100644 apps/web-antd/src/views/member/level/modules/form.vue diff --git a/apps/web-antd/src/api/member/level/index.ts b/apps/web-antd/src/api/member/level/index.ts new file mode 100644 index 000000000..850d9b820 --- /dev/null +++ b/apps/web-antd/src/api/member/level/index.ts @@ -0,0 +1,49 @@ +import { requestClient } from '#/api/request'; + +export namespace MemberLevelApi { + /** 会员等级信息 */ + export interface Level { + id?: number; + name: string; + experience: number; + value: number; + discountPercent: number; + icon: string; + bgUrl: string; + status: number; + } +} + +/** 查询会员等级列表 */ +export function getLevelList(params: MemberLevelApi.Level) { + return requestClient.get('/member/level/list', { + params, + }); +} + +/** 查询会员等级详情 */ +export function getLevel(id: number) { + return requestClient.get(`/member/level/get?id=${id}`); +} + +/** 查询会员等级 - 精简信息列表 */ +export function getSimpleLevelList() { + return requestClient.get( + '/member/level/list-all-simple', + ); +} + +/** 新增会员等级 */ +export function createLevel(data: MemberLevelApi.Level) { + return requestClient.post('/member/level/create', data); +} + +/** 修改会员等级 */ +export function updateLevel(data: MemberLevelApi.Level) { + return requestClient.put('/member/level/update', data); +} + +/** 删除会员等级 */ +export function deleteLevel(id: number) { + return requestClient.delete(`/member/level/delete?id=${id}`); +} diff --git a/apps/web-antd/src/views/member/level/data.ts b/apps/web-antd/src/views/member/level/data.ts new file mode 100644 index 000000000..f9597b326 --- /dev/null +++ b/apps/web-antd/src/views/member/level/data.ts @@ -0,0 +1,158 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; + +import { z } from '#/adapter/form'; +import { CommonStatusEnum, DICT_TYPE, getDictOptions } from '#/utils'; + +/** 新增/修改的表单 */ +export function useFormSchema(): VbenFormSchema[] { + return [ + { + component: 'Input', + fieldName: 'id', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + component: 'Input', + fieldName: 'name', + label: '等级名称', + }, + { + component: 'InputNumber', + fieldName: 'level', + label: '等级', + componentProps: { + min: 0, + precision: 0, + }, + }, + { + fieldName: 'experience', + label: '升级经验', + component: 'InputNumber', + componentProps: { + min: 0, + precision: 0, + }, + }, + { + fieldName: 'discountPercent', + label: '享受折扣(%)', + component: 'InputNumber', + componentProps: { + min: 0, + max: 100, + precision: 0, + }, + }, + { + component: 'ImageUpload', + fieldName: 'icon', + label: '等级图标', + componentProps: { + maxSize: 1, + }, + }, + { + component: 'ImageUpload', + fieldName: 'backgroundUrl', + label: '等级背景图', + componentProps: { + maxSize: 1, + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + buttonStyle: 'solid', + optionType: 'button', + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'name', + label: '等级名称', + component: 'Input', + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'id', + title: '编号', + }, + { + field: 'icon', + title: '等级图标', + cellRender: { + name: 'CellImage', + }, + }, + { + field: 'backgroundUrl', + title: '等级背景图', + cellRender: { + name: 'CellImage', + }, + }, + { + field: 'name', + title: '等级名称', + }, + { + field: 'level', + title: '等级', + }, + { + field: 'experience', + title: '升级经验', + }, + { + field: 'discountPercent', + title: '享受折扣(%)', + }, + { + field: 'status', + title: '状态', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'createTime', + title: '创建时间', + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 130, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antd/src/views/member/level/index.vue b/apps/web-antd/src/views/member/level/index.vue index 70fdaaf1c..a2dec54f7 100644 --- a/apps/web-antd/src/views/member/level/index.vue +++ b/apps/web-antd/src/views/member/level/index.vue @@ -1,34 +1,128 @@ diff --git a/apps/web-antd/src/views/member/level/modules/form.vue b/apps/web-antd/src/views/member/level/modules/form.vue new file mode 100644 index 000000000..a47230a9b --- /dev/null +++ b/apps/web-antd/src/views/member/level/modules/form.vue @@ -0,0 +1,82 @@ + + + From 0b3b5799eac2684b10bc08f08fd579f440df607e Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Wed, 28 May 2025 20:50:11 +0800 Subject: [PATCH 07/25] =?UTF-8?q?feat:=20=E4=BC=9A=E5=91=98=E5=88=86?= =?UTF-8?q?=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/views/member/group/data.ts | 88 +++++++++++ .../web-antd/src/views/member/group/index.vue | 145 ++++++++++++++---- .../src/views/member/group/modules/form.vue | 82 ++++++++++ 3 files changed, 289 insertions(+), 26 deletions(-) create mode 100644 apps/web-antd/src/views/member/group/data.ts create mode 100644 apps/web-antd/src/views/member/group/modules/form.vue diff --git a/apps/web-antd/src/views/member/group/data.ts b/apps/web-antd/src/views/member/group/data.ts new file mode 100644 index 000000000..e7466bd3e --- /dev/null +++ b/apps/web-antd/src/views/member/group/data.ts @@ -0,0 +1,88 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; + +import { z } from '#/adapter/form'; +import { CommonStatusEnum, DICT_TYPE, getDictOptions } from '#/utils'; + +/** 新增/修改的表单 */ +export function useFormSchema(): VbenFormSchema[] { + return [ + { + component: 'Input', + fieldName: 'id', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + component: 'Input', + fieldName: 'name', + label: '分组名称', + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + buttonStyle: 'solid', + optionType: 'button', + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'name', + label: '分组名称', + component: 'Input', + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'id', + title: '编号', + }, + { + field: 'name', + title: '分组名称', + }, + { + field: 'status', + title: '状态', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'createTime', + title: '创建时间', + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 130, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antd/src/views/member/group/index.vue b/apps/web-antd/src/views/member/group/index.vue index 692c3f277..b4de637e7 100644 --- a/apps/web-antd/src/views/member/group/index.vue +++ b/apps/web-antd/src/views/member/group/index.vue @@ -1,34 +1,127 @@ diff --git a/apps/web-antd/src/views/member/group/modules/form.vue b/apps/web-antd/src/views/member/group/modules/form.vue new file mode 100644 index 000000000..19f88b3e7 --- /dev/null +++ b/apps/web-antd/src/views/member/group/modules/form.vue @@ -0,0 +1,82 @@ + + + From d1ae887eba0c8e9081837f8d3df4afd0a5c53a60 Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Wed, 28 May 2025 20:59:02 +0800 Subject: [PATCH 08/25] =?UTF-8?q?feat:=20=E4=BC=9A=E5=91=98=E7=A7=AF?= =?UTF-8?q?=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/api/member/address/index.ts | 25 ++++++ .../src/api/member/experience-record/index.ts | 33 +++++++ apps/web-antd/src/api/member/group/index.ts | 50 +++++++++++ .../src/api/member/point/record/index.ts | 28 ++++++ .../src/api/member/signin/config/index.ts | 41 +++++++++ .../src/api/member/signin/record/index.ts | 23 +++++ apps/web-antd/src/api/member/user/index.ts | 70 +++++++++++++++ .../src/views/member/point/record/data.ts | 87 +++++++++++++++++++ .../src/views/member/point/record/index.vue | 70 +++++++++------ 9 files changed, 402 insertions(+), 25 deletions(-) create mode 100644 apps/web-antd/src/api/member/address/index.ts create mode 100644 apps/web-antd/src/api/member/experience-record/index.ts create mode 100644 apps/web-antd/src/api/member/group/index.ts create mode 100644 apps/web-antd/src/api/member/point/record/index.ts create mode 100644 apps/web-antd/src/api/member/signin/config/index.ts create mode 100644 apps/web-antd/src/api/member/signin/record/index.ts create mode 100644 apps/web-antd/src/api/member/user/index.ts create mode 100644 apps/web-antd/src/views/member/point/record/data.ts diff --git a/apps/web-antd/src/api/member/address/index.ts b/apps/web-antd/src/api/member/address/index.ts new file mode 100644 index 000000000..2c44c2ff2 --- /dev/null +++ b/apps/web-antd/src/api/member/address/index.ts @@ -0,0 +1,25 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MemberAddressApi { + /** 收件地址信息 */ + export interface Address { + id?: number; + name: string; + mobile: string; + areaId: number; + detailAddress: string; + defaultStatus: boolean; + } +} + +/** 查询用户收件地址列表 */ +export function getAddressList(params: PageParam) { + return requestClient.get>( + '/member/address/list', + { + params, + }, + ); +} diff --git a/apps/web-antd/src/api/member/experience-record/index.ts b/apps/web-antd/src/api/member/experience-record/index.ts new file mode 100644 index 000000000..f36297f1e --- /dev/null +++ b/apps/web-antd/src/api/member/experience-record/index.ts @@ -0,0 +1,33 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MemberExperienceRecordApi { + /** 会员经验记录信息 */ + export interface ExperienceRecord { + id?: number; + userId: number; + bizId: string; + bizType: number; + title: string; + description: string; + experience: number; + totalExperience: number; + } +} + +/** 查询会员经验记录列表 */ +export function getExperienceRecordPage(params: PageParam) { + return requestClient.get< + PageResult + >('/member/experience-record/page', { + params, + }); +} + +/** 查询会员经验记录详情 */ +export function getExperienceRecord(id: number) { + return requestClient.get( + `/member/experience-record/get?id=${id}`, + ); +} diff --git a/apps/web-antd/src/api/member/group/index.ts b/apps/web-antd/src/api/member/group/index.ts new file mode 100644 index 000000000..93c2ca3e9 --- /dev/null +++ b/apps/web-antd/src/api/member/group/index.ts @@ -0,0 +1,50 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MemberGroupApi { + /** 用户分组信息 */ + export interface Group { + id?: number; + name: string; + remark: string; + status: number; + } +} + +/** 查询用户分组列表 */ +export function getGroupPage(params: PageParam) { + return requestClient.get>( + '/member/group/page', + { + params, + }, + ); +} + +/** 查询用户分组详情 */ +export function getGroup(id: number) { + return requestClient.get(`/member/group/get?id=${id}`); +} + +/** 新增用户分组 */ +export function createGroup(data: MemberGroupApi.Group) { + return requestClient.post('/member/group/create', data); +} + +/** 查询用户分组 - 精简信息列表 */ +export function getSimpleGroupList() { + return requestClient.get( + '/member/group/list-all-simple', + ); +} + +/** 修改用户分组 */ +export function updateGroup(data: MemberGroupApi.Group) { + return requestClient.put('/member/group/update', data); +} + +/** 删除用户分组 */ +export function deleteGroup(id: number) { + return requestClient.delete(`/member/group/delete?id=${id}`); +} diff --git a/apps/web-antd/src/api/member/point/record/index.ts b/apps/web-antd/src/api/member/point/record/index.ts new file mode 100644 index 000000000..7f6797e8a --- /dev/null +++ b/apps/web-antd/src/api/member/point/record/index.ts @@ -0,0 +1,28 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MemberPointRecordApi { + /** 用户积分记录信息 */ + export interface Record { + id?: number; + bizId: string; + bizType: string; + title: string; + description: string; + point: number; + totalPoint: number; + userId: number; + createDate: Date; + } +} + +/** 查询用户积分记录列表 */ +export function getRecordPage(params: PageParam) { + return requestClient.get>( + '/member/point/record/page', + { + params, + }, + ); +} diff --git a/apps/web-antd/src/api/member/signin/config/index.ts b/apps/web-antd/src/api/member/signin/config/index.ts new file mode 100644 index 000000000..cf113b781 --- /dev/null +++ b/apps/web-antd/src/api/member/signin/config/index.ts @@ -0,0 +1,41 @@ +import { requestClient } from '#/api/request'; + +export namespace MemberSignInConfigApi { + /** 积分签到规则信息 */ + export interface SignInConfig { + id?: number; + day?: number; + point?: number; + experience?: number; + status?: number; + } +} + +/** 查询积分签到规则列表 */ +export function getSignInConfigList() { + return requestClient.get( + '/member/sign-in/config/list', + ); +} + +/** 查询积分签到规则详情 */ +export function getSignInConfig(id: number) { + return requestClient.get( + `/member/sign-in/config/get?id=${id}`, + ); +} + +/** 新增积分签到规则 */ +export function createSignInConfig(data: MemberSignInConfigApi.SignInConfig) { + return requestClient.post('/member/sign-in/config/create', data); +} + +/** 修改积分签到规则 */ +export function updateSignInConfig(data: MemberSignInConfigApi.SignInConfig) { + return requestClient.put('/member/sign-in/config/update', data); +} + +/** 删除积分签到规则 */ +export function deleteSignInConfig(id: number) { + return requestClient.delete(`/member/sign-in/config/delete?id=${id}`); +} diff --git a/apps/web-antd/src/api/member/signin/record/index.ts b/apps/web-antd/src/api/member/signin/record/index.ts new file mode 100644 index 000000000..7d5766d66 --- /dev/null +++ b/apps/web-antd/src/api/member/signin/record/index.ts @@ -0,0 +1,23 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MemberSignInRecordApi { + /** 用户签到积分信息 */ + export interface SignInRecord { + id?: number; + userId: number; + day: number; + point: number; + } +} + +/** 查询用户签到积分列表 */ +export function getSignInRecordPage(params: PageParam) { + return requestClient.get>( + '/member/sign-in/record/page', + { + params, + }, + ); +} diff --git a/apps/web-antd/src/api/member/user/index.ts b/apps/web-antd/src/api/member/user/index.ts new file mode 100644 index 000000000..e8a5a35b7 --- /dev/null +++ b/apps/web-antd/src/api/member/user/index.ts @@ -0,0 +1,70 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MemberUserApi { + /** 会员用户信息 */ + export interface User { + id?: number; + avatar?: string; + birthday?: number; + createTime?: number; + loginDate?: number; + loginIp: string; + mark: string; + mobile: string; + name?: string; + nickname?: string; + registerIp: string; + sex: number; + status: number; + areaId?: number; + areaName?: string; + levelName: null | string; + point?: null | number; + totalPoint?: null | number; + experience?: null | number; + } + + /** 会员用户等级更新信息 */ + export interface UserLevelUpdate { + id: number; + levelId: number; + } + + /** 会员用户积分更新信息 */ + export interface UserPointUpdate { + id: number; + point: number; + } +} + +/** 查询会员用户列表 */ +export function getUserPage(params: PageParam) { + return requestClient.get>( + '/member/user/page', + { + params, + }, + ); +} + +/** 查询会员用户详情 */ +export function getUser(id: number) { + return requestClient.get(`/member/user/get?id=${id}`); +} + +/** 修改会员用户 */ +export function updateUser(data: MemberUserApi.User) { + return requestClient.put('/member/user/update', data); +} + +/** 修改会员用户等级 */ +export function updateUserLevel(data: MemberUserApi.UserLevelUpdate) { + return requestClient.put('/member/user/update-level', data); +} + +/** 修改会员用户积分 */ +export function updateUserPoint(data: MemberUserApi.UserPointUpdate) { + return requestClient.put('/member/user/update-point', data); +} diff --git a/apps/web-antd/src/views/member/point/record/data.ts b/apps/web-antd/src/views/member/point/record/data.ts new file mode 100644 index 000000000..7363c3ba4 --- /dev/null +++ b/apps/web-antd/src/views/member/point/record/data.ts @@ -0,0 +1,87 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; + +import { DICT_TYPE, getDictOptions } from '#/utils'; + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'nickname', + label: '用户', + component: 'Input', + }, + { + fieldName: 'bizType', + label: '业务类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MEMBER_POINT_BIZ_TYPE, 'number'), + }, + }, + { + fieldName: 'title', + label: '积分标题', + component: 'Input', + }, + { + fieldName: 'createDate', + label: '获得时间', + component: 'DatePicker', + componentProps: { + type: 'daterange', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + defaultTime: [new Date('1 00:00:00'), new Date('1 23:59:59')], + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'id', + title: '编号', + }, + { + field: 'createTime', + title: '获得时间', + formatter: 'formatDateTime', + }, + { + field: 'nickname', + title: '用户', + }, + { + field: 'point', + title: '获得积分', + slots: { default: 'point' }, + }, + { + field: 'totalPoint', + title: '总积分', + }, + { + field: 'title', + title: '标题', + }, + { + field: 'description', + title: '描述', + }, + { + field: 'bizId', + title: '业务编码', + }, + { + field: 'bizType', + title: '业务类型', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MEMBER_POINT_BIZ_TYPE }, + }, + }, + ]; +} diff --git a/apps/web-antd/src/views/member/point/record/index.vue b/apps/web-antd/src/views/member/point/record/index.vue index 50ce2e1aa..afd775de6 100644 --- a/apps/web-antd/src/views/member/point/record/index.vue +++ b/apps/web-antd/src/views/member/point/record/index.vue @@ -1,34 +1,54 @@ From 2e3c43091a0b713d50f336eb6c7e2fbf742ceb46 Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Wed, 28 May 2025 21:06:48 +0800 Subject: [PATCH 09/25] =?UTF-8?q?feat:=20=E7=AD=BE=E5=88=B0=E8=AE=B0?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/member/signin/record/data.ts | 58 +++++++++++++++ .../src/views/member/signin/record/index.vue | 70 ++++++++++++------- 2 files changed, 103 insertions(+), 25 deletions(-) create mode 100644 apps/web-antd/src/views/member/signin/record/data.ts diff --git a/apps/web-antd/src/views/member/signin/record/data.ts b/apps/web-antd/src/views/member/signin/record/data.ts new file mode 100644 index 000000000..c5e3f5433 --- /dev/null +++ b/apps/web-antd/src/views/member/signin/record/data.ts @@ -0,0 +1,58 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; + +import { getRangePickerDefaultProps } from '#/utils'; + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'nickname', + label: '签到用户', + component: 'Input', + }, + { + fieldName: 'day', + label: '签到天数', + component: 'Input', + }, + { + fieldName: 'createTime', + label: '签到时间', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + allowClear: true, + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'id', + title: '编号', + }, + { + field: 'nickname', + title: '签到用户', + }, + { + field: 'day', + title: '签到天数', + formatter: ({ cellValue }) => ['第', cellValue, '天'].join(' '), + }, + { + field: 'point', + title: '获得积分', + slots: { default: 'point' }, + }, + { + field: 'createTime', + title: '签到时间', + formatter: 'formatDateTime', + }, + ]; +} diff --git a/apps/web-antd/src/views/member/signin/record/index.vue b/apps/web-antd/src/views/member/signin/record/index.vue index 06baddb46..d1595cfcf 100644 --- a/apps/web-antd/src/views/member/signin/record/index.vue +++ b/apps/web-antd/src/views/member/signin/record/index.vue @@ -1,34 +1,54 @@ From d7b1939ab7e3b89a1cb10b6551f37532a575107a Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Wed, 28 May 2025 21:06:58 +0800 Subject: [PATCH 10/25] =?UTF-8?q?fix:=20=E6=97=A5=E6=9C=9F=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web-antd/src/views/member/point/record/data.ts | 9 ++++----- apps/web-antd/src/views/pay/notify/data.ts | 9 ++++----- apps/web-antd/src/views/pay/refund/data.ts | 14 +++++++++----- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/apps/web-antd/src/views/member/point/record/data.ts b/apps/web-antd/src/views/member/point/record/data.ts index 7363c3ba4..a1fb6cb4b 100644 --- a/apps/web-antd/src/views/member/point/record/data.ts +++ b/apps/web-antd/src/views/member/point/record/data.ts @@ -1,7 +1,7 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import { DICT_TYPE, getDictOptions } from '#/utils'; +import { DICT_TYPE, getDictOptions, getRangePickerDefaultProps } from '#/utils'; /** 列表的搜索表单 */ export function useGridFormSchema(): VbenFormSchema[] { @@ -28,11 +28,10 @@ export function useGridFormSchema(): VbenFormSchema[] { { fieldName: 'createDate', label: '获得时间', - component: 'DatePicker', + component: 'RangePicker', componentProps: { - type: 'daterange', - valueFormat: 'YYYY-MM-DD HH:mm:ss', - defaultTime: [new Date('1 00:00:00'), new Date('1 23:59:59')], + ...getRangePickerDefaultProps(), + allowClear: true, }, }, ]; diff --git a/apps/web-antd/src/views/pay/notify/data.ts b/apps/web-antd/src/views/pay/notify/data.ts index adb419578..7fc2e6354 100644 --- a/apps/web-antd/src/views/pay/notify/data.ts +++ b/apps/web-antd/src/views/pay/notify/data.ts @@ -2,7 +2,7 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import { getAppList } from '#/api/pay/app'; -import { DICT_TYPE, getDictOptions } from '#/utils'; +import { DICT_TYPE, getDictOptions, getRangePickerDefaultProps } from '#/utils'; /** 列表的搜索表单 */ export function useGridFormSchema(): VbenFormSchema[] { @@ -54,11 +54,10 @@ export function useGridFormSchema(): VbenFormSchema[] { { fieldName: 'createTime', label: '创建时间', - component: 'DatePicker', + component: 'RangePicker', componentProps: { - type: 'daterange', - valueFormat: 'YYYY-MM-DD HH:mm:ss', - defaultTime: [new Date('1 00:00:00'), new Date('1 23:59:59')], + ...getRangePickerDefaultProps(), + allowClear: true, }, }, ]; diff --git a/apps/web-antd/src/views/pay/refund/data.ts b/apps/web-antd/src/views/pay/refund/data.ts index 835860a7a..9a02febef 100644 --- a/apps/web-antd/src/views/pay/refund/data.ts +++ b/apps/web-antd/src/views/pay/refund/data.ts @@ -2,7 +2,12 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import { getAppList } from '#/api/pay/app'; -import { DICT_TYPE, getIntDictOptions, getStrDictOptions } from '#/utils'; +import { + DICT_TYPE, + getIntDictOptions, + getRangePickerDefaultProps, + getStrDictOptions, +} from '#/utils'; /** 列表的搜索表单 */ export function useGridFormSchema(): VbenFormSchema[] { @@ -64,11 +69,10 @@ export function useGridFormSchema(): VbenFormSchema[] { { fieldName: 'createTime', label: '创建时间', - component: 'DatePicker', + component: 'RangePicker', componentProps: { - type: 'daterange', - valueFormat: 'YYYY-MM-DD HH:mm:ss', - defaultTime: [new Date('1 00:00:00'), new Date('1 23:59:59')], + ...getRangePickerDefaultProps(), + allowClear: true, }, }, ]; From dbf948020efd83b23f3d768550cc781fd2f7271a Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Wed, 28 May 2025 21:22:34 +0800 Subject: [PATCH 11/25] =?UTF-8?q?feat:=20=E7=AD=BE=E5=88=B0=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/member/signin/config/data.ts | 101 ++++++++++++ .../src/views/member/signin/config/index.vue | 144 ++++++++++++++---- .../member/signin/config/modules/form.vue | 89 +++++++++++ 3 files changed, 308 insertions(+), 26 deletions(-) create mode 100644 apps/web-antd/src/views/member/signin/config/data.ts create mode 100644 apps/web-antd/src/views/member/signin/config/modules/form.vue diff --git a/apps/web-antd/src/views/member/signin/config/data.ts b/apps/web-antd/src/views/member/signin/config/data.ts new file mode 100644 index 000000000..be1d8e272 --- /dev/null +++ b/apps/web-antd/src/views/member/signin/config/data.ts @@ -0,0 +1,101 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; + +import { z } from '#/adapter/form'; +import { CommonStatusEnum, DICT_TYPE, getDictOptions } from '#/utils'; + +/** 新增/修改的表单 */ +export function useFormSchema(): VbenFormSchema[] { + return [ + { + component: 'Input', + fieldName: 'id', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + component: 'InputNumber', + fieldName: 'day', + label: '签到天数', + help: '只允许设置 1-7,默认签到 7 天为一个周期', + componentProps: { + min: 1, + max: 7, + precision: 0, + }, + }, + { + component: 'InputNumber', + fieldName: 'point', + label: '获得积分', + componentProps: { + min: 0, + precision: 0, + }, + }, + { + component: 'InputNumber', + fieldName: 'experience', + label: '奖励经验', + componentProps: { + min: 0, + precision: 0, + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + buttonStyle: 'solid', + optionType: 'button', + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'id', + title: '编号', + }, + { + field: 'day', + title: '签到天数', + formatter: ({ cellValue }) => ['第', cellValue, '天'].join(' '), + }, + { + field: 'point', + title: '获得积分', + }, + { + field: 'experience', + title: '奖励经验', + }, + { + field: 'status', + title: '状态', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'createTime', + title: '创建时间', + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 130, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antd/src/views/member/signin/config/index.vue b/apps/web-antd/src/views/member/signin/config/index.vue index 1f2de1f06..42b5ef26b 100644 --- a/apps/web-antd/src/views/member/signin/config/index.vue +++ b/apps/web-antd/src/views/member/signin/config/index.vue @@ -1,34 +1,126 @@ diff --git a/apps/web-antd/src/views/member/signin/config/modules/form.vue b/apps/web-antd/src/views/member/signin/config/modules/form.vue new file mode 100644 index 000000000..f95f33adb --- /dev/null +++ b/apps/web-antd/src/views/member/signin/config/modules/form.vue @@ -0,0 +1,89 @@ + + + From 693595b334c7b91783e1563fb2bae138090f429c Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Wed, 28 May 2025 21:59:47 +0800 Subject: [PATCH 12/25] feat: add member detail --- .../web-antd/src/router/routes/modules/member.ts | 16 ++++++++++++++++ .../src/views/member/user/modules/detail.vue | 5 +++++ 2 files changed, 21 insertions(+) create mode 100644 apps/web-antd/src/router/routes/modules/member.ts create mode 100644 apps/web-antd/src/views/member/user/modules/detail.vue diff --git a/apps/web-antd/src/router/routes/modules/member.ts b/apps/web-antd/src/router/routes/modules/member.ts new file mode 100644 index 000000000..4f4e81723 --- /dev/null +++ b/apps/web-antd/src/router/routes/modules/member.ts @@ -0,0 +1,16 @@ +import type { RouteRecordRaw } from 'vue-router'; + +const routes: RouteRecordRaw[] = [ + { + path: '/member/user/detail', + component: () => import('#/views/member/user/modules/detail.vue'), + name: 'MemberUserDetail', + meta: { + title: '会员详情', + icon: 'lucide:user', + hideInMenu: true, + }, + }, +]; + +export default routes; diff --git a/apps/web-antd/src/views/member/user/modules/detail.vue b/apps/web-antd/src/views/member/user/modules/detail.vue new file mode 100644 index 000000000..17ace2fc3 --- /dev/null +++ b/apps/web-antd/src/views/member/user/modules/detail.vue @@ -0,0 +1,5 @@ + From 564fd5b64c738fd7d3d7ed925b3ebc972fc34ab8 Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Wed, 28 May 2025 22:19:12 +0800 Subject: [PATCH 13/25] fix: getAreaTree --- apps/web-antd/src/views/crm/clue/data.ts | 6 ++++-- apps/web-antd/src/views/crm/customer/data.ts | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/apps/web-antd/src/views/crm/clue/data.ts b/apps/web-antd/src/views/crm/clue/data.ts index 74edf0faf..28e561915 100644 --- a/apps/web-antd/src/views/crm/clue/data.ts +++ b/apps/web-antd/src/views/crm/clue/data.ts @@ -8,6 +8,7 @@ import { h } from 'vue'; import { useAccess } from '@vben/access'; import { formatDateTime } from '@vben/utils'; +import { getAreaTree } from '#/api/system/area'; import { DictTag } from '#/components/dict-tag'; import { DICT_TYPE, getDictOptions, getRangePickerDefaultProps } from '#/utils'; @@ -92,9 +93,10 @@ export function useFormSchema(): VbenFormSchema[] { { fieldName: 'areaId', label: '地址', - component: 'Cascader', + component: 'ApiTreeSelect', componentProps: { - api: 'getAreaTree', + api: () => getAreaTree(), + fieldNames: { label: 'name', value: 'id', children: 'children' }, }, }, { diff --git a/apps/web-antd/src/views/crm/customer/data.ts b/apps/web-antd/src/views/crm/customer/data.ts index 87cdb42df..6ca6636ff 100644 --- a/apps/web-antd/src/views/crm/customer/data.ts +++ b/apps/web-antd/src/views/crm/customer/data.ts @@ -8,6 +8,7 @@ import { h } from 'vue'; import { useAccess } from '@vben/access'; import { formatDateTime } from '@vben/utils'; +import { getAreaTree } from '#/api/system/area'; import { DictTag } from '#/components/dict-tag'; import { DICT_TYPE, getDictOptions, getRangePickerDefaultProps } from '#/utils'; @@ -92,9 +93,10 @@ export function useFormSchema(): VbenFormSchema[] { { fieldName: 'areaId', label: '地址', - component: 'Cascader', + component: 'ApiTreeSelect', componentProps: { - api: 'getAreaTree', + api: () => getAreaTree(), + fieldNames: { label: 'name', value: 'id', children: 'children' }, }, }, { From 868c0f822f9a3f27cb295e9ee338878640e5e5f6 Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Wed, 28 May 2025 22:26:42 +0800 Subject: [PATCH 14/25] feat: member user --- apps/web-antd/src/views/member/user/data.ts | 267 ++++++++++++++++++ apps/web-antd/src/views/member/user/index.vue | 186 ++++++++++-- .../src/views/member/user/modules/form.vue | 77 +++++ 3 files changed, 505 insertions(+), 25 deletions(-) create mode 100644 apps/web-antd/src/views/member/user/data.ts create mode 100644 apps/web-antd/src/views/member/user/modules/form.vue diff --git a/apps/web-antd/src/views/member/user/data.ts b/apps/web-antd/src/views/member/user/data.ts new file mode 100644 index 000000000..c70937dca --- /dev/null +++ b/apps/web-antd/src/views/member/user/data.ts @@ -0,0 +1,267 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; + +import { h } from 'vue'; + +import { Tag } from 'ant-design-vue'; + +import { z } from '#/adapter/form'; +import { getSimpleGroupList } from '#/api/member/group'; +import { getSimpleLevelList } from '#/api/member/level'; +import { getSimpleTagList } from '#/api/member/tag'; +import { getAreaTree } from '#/api/system/area'; +import { + CommonStatusEnum, + DICT_TYPE, + getDictOptions, + getRangePickerDefaultProps, +} from '#/utils'; + +/** 修改的表单 */ +export function useFormSchema(): VbenFormSchema[] { + return [ + { + component: 'Input', + fieldName: 'id', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + component: 'Input', + fieldName: 'mobile', + label: '手机号', + rules: 'required', + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + buttonStyle: 'solid', + optionType: 'button', + }, + rules: z.number().default(CommonStatusEnum.ENABLE).optional(), + }, + { + component: 'Input', + fieldName: 'nickname', + label: '用户昵称', + }, + { + component: 'ImageUpload', + fieldName: 'avatar', + label: '头像', + componentProps: { + maxSize: 1, + }, + }, + { + component: 'Input', + fieldName: 'name', + label: '真实名字', + }, + { + fieldName: 'sex', + label: '用户性别', + component: 'RadioGroup', + componentProps: { + options: getDictOptions(DICT_TYPE.SYSTEM_USER_SEX, 'number'), + buttonStyle: 'solid', + optionType: 'button', + }, + }, + { + component: 'DatePicker', + fieldName: 'birthday', + label: '出生日期', + componentProps: { + format: 'YYYY-MM-DD', + }, + }, + { + component: 'ApiTreeSelect', + fieldName: 'areaId', + label: '所在地', + componentProps: { + api: () => getAreaTree(), + fieldNames: { label: 'name', value: 'id', children: 'children' }, + }, + }, + { + component: 'ApiSelect', + fieldName: 'tagIds', + label: '用户标签', + componentProps: { + api: () => getSimpleTagList(), + fieldNames: { label: 'name', value: 'id' }, + mode: 'multiple', + }, + }, + { + component: 'ApiSelect', + fieldName: 'groupId', + label: '用户分组', + componentProps: { + api: () => getSimpleGroupList(), + fieldNames: { label: 'name', value: 'id' }, + }, + }, + { + component: 'Textarea', + fieldName: 'mark', + label: '会员备注', + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'nickname', + label: '用户昵称', + component: 'Input', + }, + { + fieldName: 'mobile', + label: '手机号', + component: 'Input', + }, + { + fieldName: 'loginDate', + label: '登录时间', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + }, + }, + { + fieldName: 'createTime', + label: '注册时间', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + }, + }, + { + fieldName: 'tagIds', + label: '用户标签', + component: 'ApiSelect', + componentProps: { + api: () => getSimpleTagList(), + fieldNames: { label: 'name', value: 'id' }, + mode: 'multiple', + }, + }, + { + fieldName: 'levelId', + label: '用户等级', + component: 'ApiSelect', + componentProps: { + api: () => getSimpleLevelList(), + fieldNames: { label: 'name', value: 'id' }, + }, + }, + { + fieldName: 'groupId', + label: '用户分组', + component: 'ApiSelect', + componentProps: { + api: () => getSimpleGroupList(), + fieldNames: { label: 'name', value: 'id' }, + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + type: 'checkbox', + width: 50, + }, + { + field: 'id', + title: '用户编号', + }, + { + field: 'avatar', + title: '头像', + slots: { + default: ({ row }) => { + return h('img', { + src: row.avatar, + style: { width: '40px' }, + }); + }, + }, + }, + { + field: 'mobile', + title: '手机号', + }, + { + field: 'nickname', + title: '昵称', + }, + { + field: 'levelName', + title: '等级', + }, + { + field: 'groupName', + title: '分组', + }, + { + field: 'tagNames', + title: '用户标签', + slots: { + default: ({ row }) => { + return row.tagNames?.map((tagName: string, index: number) => { + return h( + Tag, + { + key: index, + class: 'mr-5px', + color: 'blue', + }, + () => tagName, + ); + }); + }, + }, + }, + { + field: 'point', + title: '积分', + }, + { + field: 'status', + title: '状态', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'loginDate', + title: '登录时间', + formatter: 'formatDateTime', + }, + { + field: 'createTime', + title: '注册时间', + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 200, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antd/src/views/member/user/index.vue b/apps/web-antd/src/views/member/user/index.vue index 19068b619..adc253da9 100644 --- a/apps/web-antd/src/views/member/user/index.vue +++ b/apps/web-antd/src/views/member/user/index.vue @@ -1,34 +1,170 @@ diff --git a/apps/web-antd/src/views/member/user/modules/form.vue b/apps/web-antd/src/views/member/user/modules/form.vue new file mode 100644 index 000000000..6ad5e675e --- /dev/null +++ b/apps/web-antd/src/views/member/user/modules/form.vue @@ -0,0 +1,77 @@ + + + From 09f26320f78ea8f97a1563e9098a2cba75abe31a Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Wed, 28 May 2025 22:57:58 +0800 Subject: [PATCH 15/25] feat: member user --- apps/web-antd/src/views/member/user/data.ts | 185 ++++++++++++++++++ apps/web-antd/src/views/member/user/index.vue | 27 ++- .../member/user/modules/balance-form.vue | 93 +++++++++ .../views/member/user/modules/leavel-form.vue | 77 ++++++++ .../views/member/user/modules/point-form.vue | 77 ++++++++ 5 files changed, 456 insertions(+), 3 deletions(-) create mode 100644 apps/web-antd/src/views/member/user/modules/balance-form.vue create mode 100644 apps/web-antd/src/views/member/user/modules/leavel-form.vue create mode 100644 apps/web-antd/src/views/member/user/modules/point-form.vue diff --git a/apps/web-antd/src/views/member/user/data.ts b/apps/web-antd/src/views/member/user/data.ts index c70937dca..1232cca3a 100644 --- a/apps/web-antd/src/views/member/user/data.ts +++ b/apps/web-antd/src/views/member/user/data.ts @@ -12,7 +12,9 @@ import { getSimpleTagList } from '#/api/member/tag'; import { getAreaTree } from '#/api/system/area'; import { CommonStatusEnum, + convertToInteger, DICT_TYPE, + formatToFraction, getDictOptions, getRangePickerDefaultProps, } from '#/utils'; @@ -265,3 +267,186 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { }, ]; } + +/** 修改用户等级 */ +export function useLeavelFormSchema(): VbenFormSchema[] { + return [ + { + component: 'Input', + fieldName: 'id', + label: '用户编号', + componentProps: { + disabled: true, + }, + }, + { + component: 'Input', + fieldName: 'nickname', + label: '用户昵称', + componentProps: { + disabled: true, + }, + }, + { + fieldName: 'point', + label: '用户等级', + component: 'ApiSelect', + componentProps: { + api: () => getSimpleLevelList(), + fieldNames: { label: 'name', value: 'id' }, + }, + }, + { + component: 'Textarea', + fieldName: 'reason', + label: '修改原因', + rules: 'required', + }, + ]; +} + +/** 修改用户余额 */ +export function useBalanceFormSchema(): VbenFormSchema[] { + return [ + { + component: 'Input', + fieldName: 'id', + label: '用户编号', + componentProps: { + disabled: true, + }, + }, + { + component: 'Input', + fieldName: 'nickname', + label: '用户昵称', + componentProps: { + disabled: true, + }, + }, + { + component: 'Input', + fieldName: 'balance', + label: '变动前余额(元)', + componentProps: { + disabled: true, + }, + }, + { + component: 'RadioGroup', + fieldName: 'changeType', + label: '变动类型', + componentProps: { + options: [ + { label: '增加', value: 1 }, + { label: '减少', value: -1 }, + ], + buttonStyle: 'solid', + optionType: 'button', + }, + defaultValue: 1, + }, + { + component: 'InputNumber', + fieldName: 'changeBalance', + label: '变动余额(元)', + rules: 'required', + componentProps: { + min: 0, + precision: 2, + step: 0.1, + }, + defaultValue: 0, + }, + { + component: 'Input', + fieldName: 'balanceResult', + label: '变动后余额(元)', + dependencies: { + triggerFields: ['changeBalance', 'changeType'], + disabled: true, + trigger(values, form) { + form.setFieldValue( + 'balanceResult', + formatToFraction( + convertToInteger(values.balance) + + convertToInteger(values.changeBalance) * values.changeType, + ), + ); + }, + }, + }, + ]; +} + +/** 修改用户积分 */ +export function usePointFormSchema(): VbenFormSchema[] { + return [ + { + component: 'Input', + fieldName: 'id', + label: '用户编号', + componentProps: { + disabled: true, + }, + }, + { + component: 'Input', + fieldName: 'nickname', + label: '用户昵称', + componentProps: { + disabled: true, + }, + }, + { + component: 'Input', + fieldName: 'point', + label: '变动前积分', + componentProps: { + disabled: true, + }, + }, + { + component: 'RadioGroup', + fieldName: 'changeType', + label: '变动类型', + componentProps: { + options: [ + { label: '增加', value: 1 }, + { label: '减少', value: -1 }, + ], + buttonStyle: 'solid', + optionType: 'button', + }, + defaultValue: 1, + }, + { + component: 'InputNumber', + fieldName: 'changePoint', + label: '变动积分', + rules: 'required', + componentProps: { + min: 0, + precision: 0, + }, + defaultValue: 0, + }, + { + component: 'Input', + fieldName: 'pointResult', + label: '变动后积分', + dependencies: { + triggerFields: ['changePoint', 'changeType'], + disabled: true, + trigger(values, form) { + form.setFieldValue( + 'pointResult', + values.point + values.changePoint * values.changeType || + values.point, + ); + }, + }, + rules: z.number().min(0), + }, + ]; +} diff --git a/apps/web-antd/src/views/member/user/index.vue b/apps/web-antd/src/views/member/user/index.vue index adc253da9..656f3b503 100644 --- a/apps/web-antd/src/views/member/user/index.vue +++ b/apps/web-antd/src/views/member/user/index.vue @@ -13,7 +13,10 @@ import { DocAlert } from '#/components/doc-alert'; import { $t } from '#/locales'; import { useGridColumns, useGridFormSchema } from './data'; +import BalanceForm from './modules/balance-form.vue'; import Form from './modules/form.vue'; +import LeavelForm from './modules/leavel-form.vue'; +import PointForm from './modules/point-form.vue'; const router = useRouter(); @@ -22,6 +25,21 @@ const [FormModal, formModalApi] = useVbenModal({ destroyOnClose: true, }); +const [PointFormModal, pointFormModalApi] = useVbenModal({ + connectedComponent: PointForm, + destroyOnClose: true, +}); + +const [BalanceFormModal, balanceFormModalApi] = useVbenModal({ + connectedComponent: BalanceForm, + destroyOnClose: true, +}); + +const [LeavelFormModal, leavelFormModalApi] = useVbenModal({ + connectedComponent: LeavelForm, + destroyOnClose: true, +}); + /** 刷新表格数据 */ function onRefresh() { gridApi.query(); @@ -45,17 +63,17 @@ function handleEdit(row: MemberUserApi.User) { /** 修改会员等级 */ function handleUpdateLevel(row: MemberUserApi.User) { - formModalApi.setData(row).open(); + leavelFormModalApi.setData(row).open(); } /** 修改会员积分 */ function handleUpdatePoint(row: MemberUserApi.User) { - formModalApi.setData(row).open(); + pointFormModalApi.setData(row).open(); } /** 修改会员余额 */ function handleUpdateBalance(row: MemberUserApi.User) { - formModalApi.setData(row).open(); + balanceFormModalApi.setData(row).open(); } /** 查看会员详情 */ @@ -112,6 +130,9 @@ const [Grid, gridApi] = useVbenVxeGrid({ + + +