From 4978bbbcf12d0b3d901f0edd10cce167f0e3c201 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 7 Oct 2025 17:10:54 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E3=80=90antd=E3=80=91=E3=80=90mem?= =?UTF-8?q?ber=20=E4=BC=9A=E5=91=98=E3=80=91=E5=AE=8C=E6=88=90=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E7=95=8C=E9=9D=A2=E7=9A=84=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/router/routes/modules/member.ts | 1 + .../src/views/member/user/detail/index.vue | 49 ++++++++++--------- ...user-account-info.vue => account-info.vue} | 3 +- ...user-address-list.vue => address-list.vue} | 8 +++ ...user-balance-list.vue => balance-list.vue} | 13 +++-- .../{user-basic-info.vue => basic-info.vue} | 13 +++-- ...rd-list.vue => experience-record-list.vue} | 19 +++++-- .../{user-point-list.vue => point-list.vue} | 15 +++--- .../{user-sign-list.vue => sign-list.vue} | 8 +-- .../src/router/routes/modules/member.ts | 1 + 10 files changed, 79 insertions(+), 51 deletions(-) rename apps/web-antd/src/views/member/user/detail/modules/{user-account-info.vue => account-info.vue} (95%) rename apps/web-antd/src/views/member/user/detail/modules/{user-address-list.vue => address-list.vue} (90%) rename apps/web-antd/src/views/member/user/detail/modules/{user-balance-list.vue => balance-list.vue} (86%) rename apps/web-antd/src/views/member/user/detail/modules/{user-basic-info.vue => basic-info.vue} (92%) rename apps/web-antd/src/views/member/user/detail/modules/{user-experience-record-list.vue => experience-record-list.vue} (89%) rename apps/web-antd/src/views/member/user/detail/modules/{user-point-list.vue => point-list.vue} (90%) rename apps/web-antd/src/views/member/user/detail/modules/{user-sign-list.vue => sign-list.vue} (91%) diff --git a/apps/web-antd/src/router/routes/modules/member.ts b/apps/web-antd/src/router/routes/modules/member.ts index 2bb68a3d7..fc8bece08 100644 --- a/apps/web-antd/src/router/routes/modules/member.ts +++ b/apps/web-antd/src/router/routes/modules/member.ts @@ -8,6 +8,7 @@ const routes: RouteRecordRaw[] = [ meta: { title: '会员详情', icon: 'lucide:user', + activePath: '/member/user', hideInMenu: true, }, }, diff --git a/apps/web-antd/src/views/member/user/detail/index.vue b/apps/web-antd/src/views/member/user/detail/index.vue index 205c89ac4..af5789699 100644 --- a/apps/web-antd/src/views/member/user/detail/index.vue +++ b/apps/web-antd/src/views/member/user/detail/index.vue @@ -15,13 +15,13 @@ import { getWallet } from '#/api/pay/wallet/balance'; import { $t } from '#/locales'; import Form from '../modules/form.vue'; -import UserAccountInfo from './modules/user-account-info.vue'; -import UserAddressList from './modules/user-address-list.vue'; -import UserBalanceList from './modules/user-balance-list.vue'; -import UserBasicInfo from './modules/user-basic-info.vue'; -import UserExperienceRecordList from './modules/user-experience-record-list.vue'; -import UserPointList from './modules/user-point-list.vue'; -import UserSignList from './modules/user-sign-list.vue'; +import AccountInfo from './modules/account-info.vue'; +import AddressList from './modules/address-list.vue'; +import BalanceList from './modules/balance-list.vue'; +import BasicInfo from './modules/basic-info.vue'; +import ExperienceRecordList from './modules/experience-record-list.vue'; +import PointList from './modules/point-list.vue'; +import SignList from './modules/sign-list.vue'; const route = useRoute(); const { closeCurrentTab, refreshTab } = useTabs(); @@ -34,27 +34,28 @@ const [FormModal, formModalApi] = useVbenModal({ const userId = Number(route.query.id); const user = ref(); const wallet = ref(); -/* 钱包初始化数据 */ -const WALLET_INIT_DATA = { - balance: 0, - totalExpense: 0, - totalRecharge: 0, -} as PayWalletApi.Wallet; +/** 获取会员详情 */ async function getUserDetail() { if (!userId) { message.error('参数错误,会员编号不能为空!'); - closeCurrentTab(); + await closeCurrentTab(); return; } user.value = await getUser(userId); - wallet.value = (await getWallet({ userId })) || WALLET_INIT_DATA; + wallet.value = (await getWallet({ userId })) || { + balance: 0, + totalExpense: 0, + totalRecharge: 0, + }; } +/** 编辑会员 */ function handleEdit() { formModalApi.setData(user.value).open(); } +/** 初始化 */ onMounted(async () => { await getUserDetail(); }); @@ -63,40 +64,40 @@ onMounted(async () => {
- + - - + - +
- + - + - + - + - + diff --git a/apps/web-antd/src/views/member/user/detail/modules/user-account-info.vue b/apps/web-antd/src/views/member/user/detail/modules/account-info.vue similarity index 95% rename from apps/web-antd/src/views/member/user/detail/modules/user-account-info.vue rename to apps/web-antd/src/views/member/user/detail/modules/account-info.vue index 4bc7ec4e0..ba6978bf9 100644 --- a/apps/web-antd/src/views/member/user/detail/modules/user-account-info.vue +++ b/apps/web-antd/src/views/member/user/detail/modules/account-info.vue @@ -21,14 +21,13 @@ withDefaults( const [Descriptions] = useDescription({ componentProps: { - bordered: false, class: 'mx-4', }, schema: [ { field: 'levelName', label: '等级', - content: (data) => data.levelName || '无', + content: (data) => data.levelName || '-', }, { field: 'experience', diff --git a/apps/web-antd/src/views/member/user/detail/modules/user-address-list.vue b/apps/web-antd/src/views/member/user/detail/modules/address-list.vue similarity index 90% rename from apps/web-antd/src/views/member/user/detail/modules/user-address-list.vue rename to apps/web-antd/src/views/member/user/detail/modules/address-list.vue index af46eeba8..e94e2b19f 100644 --- a/apps/web-antd/src/views/member/user/detail/modules/user-address-list.vue +++ b/apps/web-antd/src/views/member/user/detail/modules/address-list.vue @@ -19,26 +19,32 @@ const [Grid] = useVbenVxeGrid({ { field: 'id', title: '地址编号', + minWidth: 100, }, { field: 'name', title: '收件人名称', + minWidth: 120, }, { field: 'mobile', title: '手机号', + minWidth: 130, }, { field: 'areaId', title: '地区编码', + minWidth: 120, }, { field: 'detailAddress', title: '收件详细地址', + minWidth: 200, }, { field: 'defaultStatus', title: '是否默认', + minWidth: 100, slots: { default: ({ row }) => { return h( @@ -55,6 +61,7 @@ const [Grid] = useVbenVxeGrid({ { field: 'createTime', title: '创建时间', + minWidth: 180, formatter: 'formatDateTime', }, ], @@ -73,6 +80,7 @@ const [Grid] = useVbenVxeGrid({ }, rowConfig: { keyField: 'id', + isHover: true, }, toolbarConfig: { refresh: true, diff --git a/apps/web-antd/src/views/member/user/detail/modules/user-balance-list.vue b/apps/web-antd/src/views/member/user/detail/modules/balance-list.vue similarity index 86% rename from apps/web-antd/src/views/member/user/detail/modules/user-balance-list.vue rename to apps/web-antd/src/views/member/user/detail/modules/balance-list.vue index 35853c2ec..76d805f19 100644 --- a/apps/web-antd/src/views/member/user/detail/modules/user-balance-list.vue +++ b/apps/web-antd/src/views/member/user/detail/modules/balance-list.vue @@ -15,31 +15,33 @@ const [Grid] = useVbenVxeGrid({ { field: 'id', title: '编号', + minWidth: 100, }, { field: 'title', title: '关联业务标题', + minWidth: 200, }, { field: 'price', title: '交易金额', - formatter: 'formatAmount2', + minWidth: 120, + formatter: 'formatFenToYuanAmount', }, { field: 'balance', title: '钱包余额', - formatter: 'formatAmount2', + minWidth: 120, + formatter: 'formatFenToYuanAmount', }, { field: 'createTime', title: '交易时间', + minWidth: 180, formatter: 'formatDateTime', }, ], keepSource: true, - pagerConfig: { - pageSize: 10, - }, proxyConfig: { ajax: { query: async ({ page }, formValues) => { @@ -54,6 +56,7 @@ const [Grid] = useVbenVxeGrid({ }, rowConfig: { keyField: 'id', + isHover: true, }, toolbarConfig: { refresh: true, diff --git a/apps/web-antd/src/views/member/user/detail/modules/user-basic-info.vue b/apps/web-antd/src/views/member/user/detail/modules/basic-info.vue similarity index 92% rename from apps/web-antd/src/views/member/user/detail/modules/user-basic-info.vue rename to apps/web-antd/src/views/member/user/detail/modules/basic-info.vue index 3411096cf..06d8b01ce 100644 --- a/apps/web-antd/src/views/member/user/detail/modules/user-basic-info.vue +++ b/apps/web-antd/src/views/member/user/detail/modules/basic-info.vue @@ -20,7 +20,6 @@ withDefaults( const [Descriptions] = useDescription({ componentProps: { - bordered: false, class: 'mx-4', }, schema: [ @@ -56,17 +55,17 @@ const [Descriptions] = useDescription({ { field: 'birthday', label: '生日', - content: (data) => formatDate(data.birthday)?.toString() || '空', + content: (data) => formatDate(data.birthday)?.toString() || '-', }, { field: 'createTime', label: '注册时间', - content: (data) => formatDate(data.createTime)?.toString() || '空', + content: (data) => formatDate(data.createTime)?.toString() || '-', }, { field: 'loginDate', label: '最后登录时间', - content: (data) => formatDate(data.loginDate)?.toString() || '空', + content: (data) => formatDate(data.loginDate)?.toString() || '-', }, ], }); @@ -81,10 +80,10 @@ const [Descriptions] = useDescription({ - - + + - + diff --git a/apps/web-antd/src/views/member/user/detail/modules/user-experience-record-list.vue b/apps/web-antd/src/views/member/user/detail/modules/experience-record-list.vue similarity index 89% rename from apps/web-antd/src/views/member/user/detail/modules/user-experience-record-list.vue rename to apps/web-antd/src/views/member/user/detail/modules/experience-record-list.vue index eb7ad7946..9c9674266 100644 --- a/apps/web-antd/src/views/member/user/detail/modules/user-experience-record-list.vue +++ b/apps/web-antd/src/views/member/user/detail/modules/experience-record-list.vue @@ -25,17 +25,22 @@ const [Grid] = useVbenVxeGrid({ label: '业务类型', component: 'Select', componentProps: { - allowClear: true, options: getDictOptions( DICT_TYPE.MEMBER_EXPERIENCE_BIZ_TYPE, 'number', ), + placeholder: '请选择业务类型', + allowClear: true, }, }, { fieldName: 'title', label: '标题', component: 'Input', + componentProps: { + placeholder: '请输入标题', + allowClear: true, + }, }, { fieldName: 'createDate', @@ -53,15 +58,18 @@ const [Grid] = useVbenVxeGrid({ { field: 'id', title: '编号', + minWidth: 100, }, { field: 'createTime', title: '获得时间', + minWidth: 180, formatter: 'formatDateTime', }, { field: 'experience', title: '经验', + minWidth: 100, slots: { default: ({ row }) => { return h( @@ -79,22 +87,27 @@ const [Grid] = useVbenVxeGrid({ { field: 'totalExperience', title: '总经验', + minWidth: 100, }, { field: 'title', title: '标题', + minWidth: 200, }, { field: 'description', title: '描述', + minWidth: 250, }, { field: 'bizId', title: '业务编号', + minWidth: 120, }, { field: 'bizType', title: '业务类型', + minWidth: 120, cellRender: { name: 'CellDict', props: { type: DICT_TYPE.MEMBER_EXPERIENCE_BIZ_TYPE }, @@ -102,9 +115,6 @@ const [Grid] = useVbenVxeGrid({ }, ], keepSource: true, - pagerConfig: { - pageSize: 10, - }, proxyConfig: { ajax: { query: async ({ page }, formValues) => { @@ -119,6 +129,7 @@ const [Grid] = useVbenVxeGrid({ }, rowConfig: { keyField: 'id', + isHover: true, }, toolbarConfig: { refresh: true, diff --git a/apps/web-antd/src/views/member/user/detail/modules/user-point-list.vue b/apps/web-antd/src/views/member/user/detail/modules/point-list.vue similarity index 90% rename from apps/web-antd/src/views/member/user/detail/modules/user-point-list.vue rename to apps/web-antd/src/views/member/user/detail/modules/point-list.vue index cddd60db4..77e698eb9 100644 --- a/apps/web-antd/src/views/member/user/detail/modules/user-point-list.vue +++ b/apps/web-antd/src/views/member/user/detail/modules/point-list.vue @@ -2,11 +2,11 @@ import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { MemberPointRecordApi } from '#/api/member/point/record'; -import { useVbenVxeGrid } from '#/adapter/vxe-table'; -import { getRecordPage } from '#/api/member/point/record'; import { DICT_TYPE } from '@vben/constants'; import { getDictOptions } from '@vben/hooks'; +import { useVbenVxeGrid } from '#/adapter/vxe-table'; +import { getRecordPage } from '#/api/member/point/record'; import { getRangePickerDefaultProps } from '#/utils'; import { useGridColumns } from '#/views/member/point/record/data'; @@ -22,14 +22,19 @@ const [Grid] = useVbenVxeGrid({ label: '业务类型', component: 'Select', componentProps: { - allowClear: true, options: getDictOptions(DICT_TYPE.MEMBER_POINT_BIZ_TYPE, 'number'), + placeholder: '请选择业务类型', + allowClear: true, }, }, { fieldName: 'title', label: '积分标题', component: 'Input', + componentProps: { + placeholder: '请输入积分标题', + allowClear: true, + }, }, { fieldName: 'createDate', @@ -45,9 +50,6 @@ const [Grid] = useVbenVxeGrid({ gridOptions: { columns: useGridColumns(), keepSource: true, - pagerConfig: { - pageSize: 10, - }, proxyConfig: { ajax: { query: async ({ page }, formValues) => { @@ -62,6 +64,7 @@ const [Grid] = useVbenVxeGrid({ }, rowConfig: { keyField: 'id', + isHover: true, }, toolbarConfig: { refresh: true, diff --git a/apps/web-antd/src/views/member/user/detail/modules/user-sign-list.vue b/apps/web-antd/src/views/member/user/detail/modules/sign-list.vue similarity index 91% rename from apps/web-antd/src/views/member/user/detail/modules/user-sign-list.vue rename to apps/web-antd/src/views/member/user/detail/modules/sign-list.vue index 59ba62dd2..5b46aa29c 100644 --- a/apps/web-antd/src/views/member/user/detail/modules/user-sign-list.vue +++ b/apps/web-antd/src/views/member/user/detail/modules/sign-list.vue @@ -18,6 +18,10 @@ const [Grid] = useVbenVxeGrid({ fieldName: 'day', label: '签到天数', component: 'Input', + componentProps: { + placeholder: '请输入签到天数', + allowClear: true, + }, }, { fieldName: 'createTime', @@ -33,9 +37,6 @@ const [Grid] = useVbenVxeGrid({ gridOptions: { columns: useGridColumns(), keepSource: true, - pagerConfig: { - pageSize: 10, - }, proxyConfig: { ajax: { query: async ({ page }, formValues) => { @@ -50,6 +51,7 @@ const [Grid] = useVbenVxeGrid({ }, rowConfig: { keyField: 'id', + isHover: true, }, toolbarConfig: { refresh: true, diff --git a/apps/web-ele/src/router/routes/modules/member.ts b/apps/web-ele/src/router/routes/modules/member.ts index 4f4e81723..d5f72eee2 100644 --- a/apps/web-ele/src/router/routes/modules/member.ts +++ b/apps/web-ele/src/router/routes/modules/member.ts @@ -8,6 +8,7 @@ const routes: RouteRecordRaw[] = [ meta: { title: '会员详情', icon: 'lucide:user', + activeMenu: '/member/user', hideInMenu: true, }, },