推广用户
diff --git a/apps/web-antd/src/views/member/user/components/user-account-info.vue b/apps/web-antd/src/views/member/user/detail/modules/account-info.vue
similarity index 93%
rename from apps/web-antd/src/views/member/user/components/user-account-info.vue
rename to apps/web-antd/src/views/member/user/detail/modules/account-info.vue
index 4bc7ec4e0d5134445abb33061dcf5f8eb8a37f1b..9007df933cea9fd62c0dace67aafe92a2114fac5 100644
--- a/apps/web-antd/src/views/member/user/components/user-account-info.vue
+++ b/apps/web-antd/src/views/member/user/detail/modules/account-info.vue
@@ -20,15 +20,11 @@ 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/components/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/components/user-address-list.vue
rename to apps/web-antd/src/views/member/user/detail/modules/address-list.vue
index af46eeba8b6af70347dfd14a2f859ed83fa4a3f1..e94e2b19f45e2c57255e97b7242bf0a35fa5d16a 100644
--- a/apps/web-antd/src/views/member/user/components/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-ele/src/views/member/user/components/user-balance-list.vue b/apps/web-antd/src/views/member/user/detail/modules/balance-list.vue
similarity index 86%
rename from apps/web-ele/src/views/member/user/components/user-balance-list.vue
rename to apps/web-antd/src/views/member/user/detail/modules/balance-list.vue
index 35853c2ec352b3c604f86e3cca9ee6bcba369bc7..76d805f1956d695480cb8d3ea0ec34ec292ac591 100644
--- a/apps/web-ele/src/views/member/user/components/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/components/user-basic-info.vue b/apps/web-antd/src/views/member/user/detail/modules/basic-info.vue
similarity index 90%
rename from apps/web-antd/src/views/member/user/components/user-basic-info.vue
rename to apps/web-antd/src/views/member/user/detail/modules/basic-info.vue
index 3411096cf21339d078e667830fffee45ed2da4d9..e19dd298f96ecb63a2a28e518301c1b61fd96eba 100644
--- a/apps/web-antd/src/views/member/user/components/user-basic-info.vue
+++ b/apps/web-antd/src/views/member/user/detail/modules/basic-info.vue
@@ -19,10 +19,6 @@ withDefaults(
);
const [Descriptions] = useDescription({
- componentProps: {
- bordered: false,
- class: 'mx-4',
- },
schema: [
{
field: 'name',
@@ -56,17 +52,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 +77,10 @@ const [Descriptions] = useDescription({
-
-
+
+
-
+
diff --git a/apps/web-antd/src/views/member/user/components/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/components/user-experience-record-list.vue
rename to apps/web-antd/src/views/member/user/detail/modules/experience-record-list.vue
index eb7ad79462bbdc293c77d53315e75643e6893249..9c967426619f6286609e484bda605e2ecdb67c68 100644
--- a/apps/web-antd/src/views/member/user/components/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/components/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/components/user-point-list.vue
rename to apps/web-antd/src/views/member/user/detail/modules/point-list.vue
index cddd60db49b8fceb49415bdd19165a45cbd8b271..77e698eb9c4a3d94ef5d947ab73510f91f132501 100644
--- a/apps/web-antd/src/views/member/user/components/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/components/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/components/user-sign-list.vue
rename to apps/web-antd/src/views/member/user/detail/modules/sign-list.vue
index 59ba62dd25f921050987f9cc3ec925e1fd275d5f..5b46aa29cc51cc6cc8784156746cdf6236718ef3 100644
--- a/apps/web-antd/src/views/member/user/components/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-antd/src/views/member/user/index.vue b/apps/web-antd/src/views/member/user/index.vue
index 854160f21f93bfbdb4db7a217809120f49abd5a9..1c25480d5ecf7ffb42fb0a7088d873a25a89cc93 100644
--- a/apps/web-antd/src/views/member/user/index.vue
+++ b/apps/web-antd/src/views/member/user/index.vue
@@ -6,11 +6,13 @@ import { ref } from 'vue';
import { useRouter } from 'vue-router';
import { DocAlert, Page, useVbenModal } from '@vben/common-ui';
+import { isEmpty } from '@vben/utils';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { getUserPage } from '#/api/member/user';
import { $t } from '#/locales';
+import { CouponSendForm } from '../../mall/promotion/coupon/components';
import { useGridColumns, useGridFormSchema } from './data';
import BalanceForm from './modules/balance-form.vue';
import Form from './modules/form.vue';
@@ -39,21 +41,14 @@ const [LevelFormModal, levelFormModalApi] = useVbenModal({
destroyOnClose: true,
});
-/** 刷新表格数据 */
-function onRefresh() {
- gridApi.query();
-}
-
-/** 设置选中 ID */
-const checkedIds = ref
([]);
-function setCheckedIds({ records }: { records: MemberUserApi.User[] }) {
- checkedIds.value = records.map((item) => item.id!);
-}
+const [CouponSendFormModal, couponSendFormModalApi] = useVbenModal({
+ connectedComponent: CouponSendForm,
+ destroyOnClose: true,
+});
-/** 发送优惠券 */
-// TODO @xingyu:这个功能没开发对,是发送优惠劵哈;
-function handleSendCoupon() {
- formModalApi.setData(null).open();
+/** 刷新表格 */
+function handleRefresh() {
+ gridApi.query();
}
/** 编辑会员 */
@@ -76,6 +71,24 @@ function handleUpdateBalance(row: MemberUserApi.User) {
balanceFormModalApi.setData(row).open();
}
+/** 发送优惠券 */
+async function handleSendCoupon() {
+ couponSendFormModalApi
+ .setData({
+ userIds: checkedIds.value,
+ })
+ .open();
+}
+
+const checkedIds = ref([]);
+function handleRowCheckboxChange({
+ records,
+}: {
+ records: MemberUserApi.User[];
+}) {
+ checkedIds.value = records.map((item) => item.id!);
+}
+
/** 查看会员详情 */
function handleViewDetail(row: MemberUserApi.User) {
router.push({
@@ -86,17 +99,12 @@ function handleViewDetail(row: MemberUserApi.User) {
});
}
-// 表格实例
const [Grid, gridApi] = useVbenVxeGrid({
formOptions: {
schema: useGridFormSchema(),
},
gridOptions: {
columns: useGridColumns(),
- checkboxConfig: {
- highlight: true,
- labelField: 'checkbox',
- },
height: 'auto',
keepSource: true,
proxyConfig: {
@@ -112,6 +120,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
},
rowConfig: {
keyField: 'id',
+ isHover: true,
},
toolbarConfig: {
refresh: true,
@@ -119,8 +128,8 @@ const [Grid, gridApi] = useVbenVxeGrid({
},
} as VxeTableGridOptions,
gridEvents: {
- checkboxAll: setCheckedIds,
- checkboxChange: setCheckedIds,
+ checkboxAll: handleRowCheckboxChange,
+ checkboxChange: handleRowCheckboxChange,
},
});
@@ -134,10 +143,11 @@ const [Grid, gridApi] = useVbenVxeGrid({
/>
-
-
-
-
+
+
+
+
+
import type { MemberUserApi } from '#/api/member/user';
-import { ref } from 'vue';
+import { computed, ref } from 'vue';
import { useVbenModal } from '@vben/common-ui';
@@ -15,6 +15,11 @@ import { useFormSchema } from '../data';
const emit = defineEmits(['success']);
const formData = ref();
+const getTitle = computed(() => {
+ return formData.value?.id
+ ? $t('ui.actionTitle.edit', ['会员'])
+ : $t('ui.actionTitle.create', ['会员']);
+});
const [Form, formApi] = useVbenForm({
commonConfig: {
@@ -71,7 +76,7 @@ const [Modal, modalApi] = useVbenModal({
-
+
diff --git a/apps/web-antd/src/views/member/user/modules/level-form.vue b/apps/web-antd/src/views/member/user/modules/level-form.vue
index 1b299c9778e609761802ace9c777950bbc19eb77..2a2c8b2ca1d20ccc0442fab9a84caab077e80b97 100644
--- a/apps/web-antd/src/views/member/user/modules/level-form.vue
+++ b/apps/web-antd/src/views/member/user/modules/level-form.vue
@@ -1,20 +1,23 @@
-
+
diff --git a/apps/web-antd/src/views/member/user/modules/point-form.vue b/apps/web-antd/src/views/member/user/modules/point-form.vue
index c86c84e29bf978d6e9ec6cf4468820aa4af9ea8a..da6c88e8d8c6e93507885b91d450ec3f0f485b9f 100644
--- a/apps/web-antd/src/views/member/user/modules/point-form.vue
+++ b/apps/web-antd/src/views/member/user/modules/point-form.vue
@@ -1,20 +1,23 @@
-
+
diff --git a/apps/web-antd/src/views/system/dept/data.ts b/apps/web-antd/src/views/system/dept/data.ts
index c94cb93fc5b9ce139228082a153d22416529aaeb..4a995e666883241259e3139139e1051d9603151c 100644
--- a/apps/web-antd/src/views/system/dept/data.ts
+++ b/apps/web-antd/src/views/system/dept/data.ts
@@ -58,7 +58,6 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'InputNumber',
componentProps: {
min: 0,
- controlsPosition: 'right',
placeholder: '请输入显示顺序',
},
rules: 'required',
diff --git a/apps/web-antd/src/views/system/menu/data.ts b/apps/web-antd/src/views/system/menu/data.ts
index 477c91f7b9214948dedcb072d5e3227a25c9d477..3226f0c4182cf414a57d4f96dbebde13cd11c16c 100644
--- a/apps/web-antd/src/views/system/menu/data.ts
+++ b/apps/web-antd/src/views/system/menu/data.ts
@@ -202,7 +202,6 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'InputNumber',
componentProps: {
min: 0,
- controlsPosition: 'right',
placeholder: '请输入显示顺序',
},
rules: 'required',
diff --git a/apps/web-antd/src/views/system/oauth2/client/data.ts b/apps/web-antd/src/views/system/oauth2/client/data.ts
index ba546ef4f5bc79182aeb86b7778a2a0ffd6c5767..b5bc683c0ead9056e244a21754d1d05810c724d4 100644
--- a/apps/web-antd/src/views/system/oauth2/client/data.ts
+++ b/apps/web-antd/src/views/system/oauth2/client/data.ts
@@ -76,7 +76,6 @@ export function useFormSchema(): VbenFormSchema[] {
componentProps: {
placeholder: '请输入访问令牌的有效期,单位:秒',
min: 0,
- controlsPosition: 'right',
},
rules: 'required',
},
@@ -87,7 +86,6 @@ export function useFormSchema(): VbenFormSchema[] {
componentProps: {
placeholder: '请输入刷新令牌的有效期,单位:秒',
min: 0,
- controlsPosition: 'right',
},
rules: 'required',
},
diff --git a/apps/web-antd/src/views/system/role/data.ts b/apps/web-antd/src/views/system/role/data.ts
index bb30d37f359d7ea36eab6c1ff7dd7d8664df11a0..d9da8fa904a55a352db795a844bd1863d38a1d7d 100644
--- a/apps/web-antd/src/views/system/role/data.ts
+++ b/apps/web-antd/src/views/system/role/data.ts
@@ -40,7 +40,6 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'InputNumber',
componentProps: {
min: 0,
- controlsPosition: 'right',
placeholder: '请输入显示顺序',
},
rules: 'required',
diff --git a/apps/web-antd/src/views/system/user/data.ts b/apps/web-antd/src/views/system/user/data.ts
index 97f2d56a55c6a13d24e618324d012be701bb6030..a568e23bf3d62cbde3f5535a1532dfd294b53953 100644
--- a/apps/web-antd/src/views/system/user/data.ts
+++ b/apps/web-antd/src/views/system/user/data.ts
@@ -79,11 +79,17 @@ export function useFormSchema(): VbenFormSchema[] {
label: '邮箱',
component: 'Input',
rules: z.string().email('邮箱格式不正确').or(z.literal('')).optional(),
+ componentProps: {
+ placeholder: '请输入邮箱',
+ },
},
{
fieldName: 'mobile',
label: '手机号码',
component: 'Input',
+ componentProps: {
+ placeholder: '请输入手机号码',
+ },
},
{
fieldName: 'sex',
diff --git a/apps/web-ele/src/api/mall/promotion/coupon/coupon.ts b/apps/web-ele/src/api/mall/promotion/coupon/coupon.ts
index 6cba23c16e1d8e26ec979de6155962b4f6648c25..52bc962909ce980d6339e0d063a61e3e8775b472 100644
--- a/apps/web-ele/src/api/mall/promotion/coupon/coupon.ts
+++ b/apps/web-ele/src/api/mall/promotion/coupon/coupon.ts
@@ -40,9 +40,9 @@ export namespace MallCouponApi {
}
/** 发送优惠券 */
- export interface SendCoupon {
+ export interface CouponSendReqVO {
/** 优惠券编号 */
- couponId: number;
+ templateId: number;
/** 用户编号数组 */
userIds: number[];
}
@@ -62,6 +62,6 @@ export function getCouponPage(params: PageParam) {
}
/** 发送优惠券 */
-export function sendCoupon(data: MallCouponApi.SendCoupon) {
+export function sendCoupon(data: MallCouponApi.CouponSendReqVO) {
return requestClient.post('/promotion/coupon/send', data);
}
diff --git a/apps/web-ele/src/api/member/level/index.ts b/apps/web-ele/src/api/member/level/index.ts
index 850d9b8203190cef38d0139dbd8e5ee0e7799152..a856e505b682b42e51e3bf4ec6b2278bee624d12 100644
--- a/apps/web-ele/src/api/member/level/index.ts
+++ b/apps/web-ele/src/api/member/level/index.ts
@@ -11,6 +11,7 @@ export namespace MemberLevelApi {
icon: string;
bgUrl: string;
status: number;
+ createTime?: Date;
}
}
diff --git a/apps/web-ele/src/api/member/user/index.ts b/apps/web-ele/src/api/member/user/index.ts
index e8a5a35b71ee21c140d5f9c2bb852af44ebfd74c..e02f332eddfeca9a56c7f1066fd28e73b8654574 100644
--- a/apps/web-ele/src/api/member/user/index.ts
+++ b/apps/web-ele/src/api/member/user/index.ts
@@ -20,20 +20,20 @@ export namespace MemberUserApi {
status: number;
areaId?: number;
areaName?: string;
- levelName: null | string;
- point?: null | number;
- totalPoint?: null | number;
- experience?: null | number;
+ levelName: string;
+ point?: number;
+ totalPoint?: number;
+ experience?: number;
}
/** 会员用户等级更新信息 */
- export interface UserLevelUpdate {
+ export interface UserUpdateLevelReqVO {
id: number;
levelId: number;
}
/** 会员用户积分更新信息 */
- export interface UserPointUpdate {
+ export interface UserPointUpdateReqVO {
id: number;
point: number;
}
@@ -60,11 +60,11 @@ export function updateUser(data: MemberUserApi.User) {
}
/** 修改会员用户等级 */
-export function updateUserLevel(data: MemberUserApi.UserLevelUpdate) {
+export function updateUserLevel(data: MemberUserApi.UserUpdateLevelReqVO) {
return requestClient.put('/member/user/update-level', data);
}
/** 修改会员用户积分 */
-export function updateUserPoint(data: MemberUserApi.UserPointUpdate) {
+export function updateUserPoint(data: MemberUserApi.UserPointUpdateReqVO) {
return requestClient.put('/member/user/update-point', data);
}
diff --git a/apps/web-ele/src/api/pay/wallet/balance/index.ts b/apps/web-ele/src/api/pay/wallet/balance/index.ts
index e3440f9117821268608ebf2f46223f1ae7269149..fc061d6d8c6b93ba0c7708add4bdc03e4dbbbaee 100644
--- a/apps/web-ele/src/api/pay/wallet/balance/index.ts
+++ b/apps/web-ele/src/api/pay/wallet/balance/index.ts
@@ -28,6 +28,12 @@ export namespace PayWalletApi {
totalRecharge?: number;
freezePrice?: number;
}
+
+ /** 钱包修改余额 */
+ export interface PayWalletUpdateBalanceReqVO {
+ userId: number;
+ balance: number;
+ }
}
/** 查询用户钱包详情 */
@@ -48,6 +54,8 @@ export function getWalletPage(params: PayWalletApi.WalletPageReqVO) {
}
/** 修改会员钱包余额 */
-export function updateWalletBalance(data: PayWalletApi.Wallet) {
+export function updateWalletBalance(
+ data: PayWalletApi.PayWalletUpdateBalanceReqVO,
+) {
return requestClient.put('/pay/wallet/update-balance', data);
}
diff --git a/apps/web-ele/src/router/routes/modules/member.ts b/apps/web-ele/src/router/routes/modules/member.ts
index 4f4e81723922facf951bb8c543bb17622a6bbf73..fc8bece088067ac33c36254abfa49c191f92a53a 100644
--- a/apps/web-ele/src/router/routes/modules/member.ts
+++ b/apps/web-ele/src/router/routes/modules/member.ts
@@ -3,11 +3,12 @@ import type { RouteRecordRaw } from 'vue-router';
const routes: RouteRecordRaw[] = [
{
path: '/member/user/detail',
- component: () => import('#/views/member/user/modules/detail.vue'),
+ component: () => import('#/views/member/user/detail/index.vue'),
name: 'MemberUserDetail',
meta: {
title: '会员详情',
icon: 'lucide:user',
+ activePath: '/member/user',
hideInMenu: true,
},
},
diff --git a/apps/web-ele/src/views/infra/fileConfig/data.ts b/apps/web-ele/src/views/infra/fileConfig/data.ts
index 6f5e691c7a053861bc1c60229ba3528fb0491af7..ec13e43372634082d189ba026b43f0112be6cddb 100644
--- a/apps/web-ele/src/views/infra/fileConfig/data.ts
+++ b/apps/web-ele/src/views/infra/fileConfig/data.ts
@@ -83,8 +83,9 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'InputNumber',
componentProps: {
min: 0,
- controlsPosition: 'right',
placeholder: '请输入主机端口',
+ controlsPosition: 'right',
+ class: '!w-full',
},
rules: 'required',
dependencies: {
diff --git a/apps/web-ele/src/views/mall/promotion/coupon/components/data.ts b/apps/web-ele/src/views/mall/promotion/coupon/components/data.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6961bfa74dccdceadca82f64c5013d727be5a7a8
--- /dev/null
+++ b/apps/web-ele/src/views/mall/promotion/coupon/components/data.ts
@@ -0,0 +1,64 @@
+import type { VbenFormSchema } from '#/adapter/form';
+import type { VxeGridProps } from '#/adapter/vxe-table';
+
+import {
+ discountFormat,
+ remainedCountFormat,
+ usePriceFormat,
+ validityTypeFormat,
+} from '../formatter';
+
+/** 搜索表单的 schema */
+export function useFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ component: 'Input',
+ fieldName: 'name',
+ label: '优惠券名称',
+ componentProps: {
+ placeholder: '请输入优惠券名称',
+ clearable: true,
+ },
+ },
+ ];
+}
+
+/** 表格列配置 */
+export function useGridColumns(): VxeGridProps['columns'] {
+ return [
+ {
+ title: '优惠券名称',
+ field: 'name',
+ minWidth: 120,
+ },
+ {
+ title: '优惠金额 / 折扣',
+ field: 'discount',
+ minWidth: 120,
+ formatter: ({ row }) => discountFormat(row),
+ },
+ {
+ title: '最低消费',
+ field: 'usePrice',
+ minWidth: 100,
+ formatter: ({ row }) => usePriceFormat(row),
+ },
+ {
+ title: '有效期限',
+ field: 'validityType',
+ minWidth: 140,
+ formatter: ({ row }) => validityTypeFormat(row),
+ },
+ {
+ title: '剩余数量',
+ minWidth: 100,
+ formatter: ({ row }) => remainedCountFormat(row),
+ },
+ {
+ title: '操作',
+ width: 100,
+ fixed: 'right',
+ slots: { default: 'actions' },
+ },
+ ];
+}
diff --git a/apps/web-ele/src/views/mall/promotion/coupon/components/index.ts b/apps/web-ele/src/views/mall/promotion/coupon/components/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..00a6c3f32dced4bdc26a3606d68723fe1488f89f
--- /dev/null
+++ b/apps/web-ele/src/views/mall/promotion/coupon/components/index.ts
@@ -0,0 +1,2 @@
+export * from './data';
+export { default as CouponSendForm } from './send-form.vue';
diff --git a/apps/web-ele/src/views/mall/promotion/coupon/components/send-form.vue b/apps/web-ele/src/views/mall/promotion/coupon/components/send-form.vue
new file mode 100644
index 0000000000000000000000000000000000000000..83e989227e8ae2f0c2ee5190ef228a6c8119e498
--- /dev/null
+++ b/apps/web-ele/src/views/mall/promotion/coupon/components/send-form.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/mall/trade/config/index.vue b/apps/web-ele/src/views/mall/trade/config/index.vue
index d8a01553883f78218a2c1a297af3c58715357fa1..f276321958781e59a78ee56bd42a50911d8fb86e 100644
--- a/apps/web-ele/src/views/mall/trade/config/index.vue
+++ b/apps/web-ele/src/views/mall/trade/config/index.vue
@@ -60,7 +60,6 @@ onMounted(() => {
const [Form, formApi] = useVbenForm({
wrapperClass: 'grid-cols-1',
- actionWrapperClass: 'text-center',
handleSubmit: onSubmit,
layout: 'horizontal',
resetButtonOptions: {
diff --git a/apps/web-ele/src/views/member/config/data.ts b/apps/web-ele/src/views/member/config/data.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7f168418cc30a3680f73fe4d2032c6384342619c
--- /dev/null
+++ b/apps/web-ele/src/views/member/config/data.ts
@@ -0,0 +1,52 @@
+import type { VbenFormSchema } from '#/adapter/form';
+
+export const schema: VbenFormSchema[] = [
+ {
+ component: 'Input',
+ fieldName: 'id',
+ dependencies: {
+ triggerFields: [''],
+ show: () => false,
+ },
+ },
+ {
+ component: 'Switch',
+ fieldName: 'pointTradeDeductEnable',
+ label: '积分抵扣',
+ help: '下单积分是否抵用订单金额',
+ },
+ {
+ component: 'InputNumber',
+ fieldName: 'pointTradeDeductUnitPrice',
+ label: '积分抵扣',
+ help: '积分抵用比例(1 积分抵多少金额),单位:元',
+ componentProps: {
+ min: 0,
+ precision: 2,
+ class: 'w-full',
+ placeholder: '请输入积分抵扣单价',
+ },
+ },
+ {
+ component: 'InputNumber',
+ fieldName: 'pointTradeDeductMaxPrice',
+ label: '积分抵扣最大值',
+ help: '单次下单积分使用上限,0 不限制',
+ componentProps: {
+ min: 0,
+ class: 'w-full',
+ placeholder: '请输入积分抵扣最大值',
+ },
+ },
+ {
+ component: 'InputNumber',
+ fieldName: 'pointTradeGivePoint',
+ label: '1 元赠送多少分',
+ help: '下单支付金额按比例赠送积分(实际支付 1 元赠送多少积分)',
+ componentProps: {
+ min: 0,
+ class: 'w-full',
+ placeholder: '请输入赠送积分比例',
+ },
+ },
+];
diff --git a/apps/web-ele/src/views/member/config/index.vue b/apps/web-ele/src/views/member/config/index.vue
index cd102234f9ddbd7910cd3c293172764d3fcf8649..a3eefd2588316586e76e9692104851a90c230030 100644
--- a/apps/web-ele/src/views/member/config/index.vue
+++ b/apps/web-ele/src/views/member/config/index.vue
@@ -4,6 +4,7 @@ import type { MemberConfigApi } from '#/api/member/config';
import { onMounted, ref } from 'vue';
import { Page } from '@vben/common-ui';
+import { fenToYuan, yuanToFen } from '@vben/utils';
import { ElCard, ElMessage } from 'element-plus';
@@ -11,95 +12,47 @@ import { useVbenForm } from '#/adapter/form';
import { getConfig, saveConfig } from '#/api/member/config';
import { $t } from '#/locales';
-const emit = defineEmits(['success']);
+import { schema } from './data';
+
const formData = ref();
const [Form, formApi] = useVbenForm({
commonConfig: {
- // 所有表单项
- labelClass: 'w-2/6',
+ labelWidth: 120,
},
layout: 'horizontal',
- wrapperClass: 'grid-cols-1',
- actionWrapperClass: 'text-center',
- schema: [
- {
- component: 'Input',
- fieldName: 'id',
- dependencies: {
- triggerFields: [''],
- show: () => false,
- },
- },
- {
- component: 'Switch',
- fieldName: 'pointTradeDeductEnable',
- label: '积分抵扣',
- help: '开启后,用户可以积分抵扣',
- },
- {
- component: 'InputNumber',
- fieldName: 'pointTradeDeductUnitPrice',
- label: '积分抵扣单价',
- help: '用户每消费1元,可以抵扣多少积分',
- componentProps: {
- min: 0,
- precision: 2,
- class: 'w-full',
- },
- },
- {
- component: 'InputNumber',
- fieldName: 'pointTradeDeductMaxPrice',
- label: '积分抵扣最大值',
- help: '单次下单积分使用上限,0 不限制',
- componentProps: {
- min: 0,
- class: 'w-full',
- },
- },
- {
- component: 'InputNumber',
- fieldName: 'pointTradeGivePoint',
- label: '1 元赠送多少分',
- help: '下单支付金额按比例赠送积分(实际支付 1 元赠送多少积分)',
- componentProps: {
- min: 0,
- class: 'w-full',
- },
- },
- ],
- // 提交函数
- handleSubmit: onSubmit,
+ schema,
+ handleSubmit,
});
-async function onSubmit() {
+/** 提交表单 */
+async function handleSubmit() {
const { valid } = await formApi.validate();
if (!valid) {
return;
}
// 提交表单
const data = (await formApi.getValues()) as MemberConfigApi.Config;
- formApi.setState({ commonConfig: { disabled: true } });
- try {
- await saveConfig(data);
- // 关闭并提示
- emit('success');
- ElMessage.success($t('ui.actionMessage.operationSuccess'));
- } finally {
- formApi.setState({ commonConfig: { disabled: false } });
- }
+ // 转换金额单位
+ data.pointTradeDeductUnitPrice = yuanToFen(data.pointTradeDeductUnitPrice);
+ await saveConfig(data);
+ // 关闭并提示
+ ElMessage.success($t('ui.actionMessage.operationSuccess'));
}
+/** 获取配置 */
async function getConfigInfo() {
- try {
- const res = await getConfig();
- formData.value = res;
- } catch (error) {
- console.error(error);
- }
+ const res = await getConfig();
+ formData.value = res;
+ // 转换金额单位
+ res.pointTradeDeductUnitPrice = Number.parseFloat(
+ fenToYuan(res.pointTradeDeductUnitPrice),
+ );
+ // 设置到 values
+ await formApi.setValues(res);
}
+/** 初始化 */
onMounted(() => {
getConfigInfo();
});
diff --git a/apps/web-ele/src/views/member/group/data.ts b/apps/web-ele/src/views/member/group/data.ts
index 2edab3943e6e71cc5b1ff25ae32d0f5d031bf98a..7f8c1afcde200051d793591edd8e9dfbddf6ed63 100644
--- a/apps/web-ele/src/views/member/group/data.ts
+++ b/apps/web-ele/src/views/member/group/data.ts
@@ -10,17 +10,18 @@ import { z } from '#/adapter/form';
export function useFormSchema(): VbenFormSchema[] {
return [
{
- component: 'Input',
fieldName: 'id',
+ component: 'Input',
dependencies: {
triggerFields: [''],
show: () => false,
},
},
{
- component: 'Input',
fieldName: 'name',
label: '分组名称',
+ component: 'Input',
+ rules: 'required',
},
{
fieldName: 'status',
@@ -33,6 +34,14 @@ export function useFormSchema(): VbenFormSchema[] {
},
rules: z.number().default(CommonStatusEnum.ENABLE),
},
+ {
+ fieldName: 'remark',
+ label: '备注',
+ component: 'Textarea',
+ componentProps: {
+ placeholder: '请输入备注',
+ },
+ },
];
}
@@ -43,14 +52,28 @@ export function useGridFormSchema(): VbenFormSchema[] {
fieldName: 'name',
label: '分组名称',
component: 'Input',
+ componentProps: {
+ placeholder: '请输入分组名称',
+ allowClear: true,
+ },
},
{
fieldName: 'status',
label: '状态',
component: 'Select',
componentProps: {
- clearable: true,
options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'),
+ placeholder: '请选择状态',
+ allowClear: true,
+ },
+ },
+ {
+ fieldName: 'createTime',
+ label: '创建时间',
+ component: 'RangePicker',
+ componentProps: {
+ placeholder: ['开始日期', '结束日期'],
+ allowClear: true,
},
},
];
@@ -62,14 +85,23 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{
field: 'id',
title: '编号',
+ minWidth: 100,
},
{
field: 'name',
title: '分组名称',
+ minWidth: 150,
+ },
+ {
+ field: 'remark',
+ title: '备注',
+ minWidth: 200,
+ showOverflow: 'tooltip',
},
{
field: 'status',
title: '状态',
+ minWidth: 100,
cellRender: {
name: 'CellDict',
props: { type: DICT_TYPE.COMMON_STATUS },
@@ -78,6 +110,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{
field: 'createTime',
title: '创建时间',
+ minWidth: 180,
formatter: 'formatDateTime',
},
{
diff --git a/apps/web-ele/src/views/member/group/index.vue b/apps/web-ele/src/views/member/group/index.vue
index e87baf7f25b9f3fbe69ee311397c401d5d951703..e7e06ed05840474cd73e81a21691f4980a137563 100644
--- a/apps/web-ele/src/views/member/group/index.vue
+++ b/apps/web-ele/src/views/member/group/index.vue
@@ -19,7 +19,7 @@ const [FormModal, formModalApi] = useVbenModal({
});
/** 刷新表格 */
-function onRefresh() {
+function handleRefresh() {
gridApi.query();
}
@@ -39,9 +39,9 @@ async function handleDelete(row: MemberGroupApi.Group) {
text: $t('ui.actionMessage.deleting', [row.name]),
});
try {
- await deleteGroup(row.id as number);
+ await deleteGroup(row.id!);
ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name]));
- onRefresh();
+ handleRefresh();
} finally {
loadingInstance.close();
}
@@ -68,6 +68,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
},
rowConfig: {
keyField: 'id',
+ isHover: true,
},
toolbarConfig: {
refresh: true,
@@ -79,7 +80,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
-
+
();
const getTitle = computed(() => {
return formData.value?.id
- ? $t('ui.actionTitle.edit', ['会员分组'])
- : $t('ui.actionTitle.create', ['会员分组']);
+ ? $t('ui.actionTitle.edit', ['分组'])
+ : $t('ui.actionTitle.create', ['分组']);
});
const [Form, formApi] = useVbenForm({
@@ -76,7 +76,7 @@ const [Modal, modalApi] = useVbenModal({
-
+
diff --git a/apps/web-ele/src/views/member/level/data.ts b/apps/web-ele/src/views/member/level/data.ts
index a9f4fcbd8f953d3bc012789035ea94212812366e..0d72df1152d9a12963e907436a6fc6c7025f1ad4 100644
--- a/apps/web-ele/src/views/member/level/data.ts
+++ b/apps/web-ele/src/views/member/level/data.ts
@@ -5,31 +5,40 @@ import { CommonStatusEnum, DICT_TYPE } from '@vben/constants';
import { getDictOptions } from '@vben/hooks';
import { z } from '#/adapter/form';
+import { getRangePickerDefaultProps } from '#/utils';
/** 新增/修改的表单 */
export function useFormSchema(): VbenFormSchema[] {
return [
{
- component: 'Input',
fieldName: 'id',
+ component: 'Input',
dependencies: {
triggerFields: [''],
show: () => false,
},
},
{
- component: 'Input',
fieldName: 'name',
label: '等级名称',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入等级名称',
+ },
+ rules: 'required',
},
{
- component: 'InputNumber',
fieldName: 'level',
label: '等级',
+ component: 'InputNumber',
componentProps: {
min: 0,
precision: 0,
+ placeholder: '请输入等级',
+ controlsPosition: 'right',
+ class: '!w-full',
},
+ rules: 'required',
},
{
fieldName: 'experience',
@@ -38,7 +47,11 @@ export function useFormSchema(): VbenFormSchema[] {
componentProps: {
min: 0,
precision: 0,
+ placeholder: '请输入升级经验',
+ controlsPosition: 'right',
+ class: '!w-full',
},
+ rules: 'required',
},
{
fieldName: 'discountPercent',
@@ -48,17 +61,21 @@ export function useFormSchema(): VbenFormSchema[] {
min: 0,
max: 100,
precision: 0,
+ placeholder: '请输入享受折扣',
+ controlsPosition: 'right',
+ class: '!w-full',
},
+ rules: 'required',
},
{
- component: 'ImageUpload',
fieldName: 'icon',
label: '等级图标',
+ component: 'ImageUpload',
},
{
- component: 'ImageUpload',
fieldName: 'backgroundUrl',
label: '等级背景图',
+ component: 'ImageUpload',
},
{
fieldName: 'status',
@@ -81,16 +98,30 @@ export function useGridFormSchema(): VbenFormSchema[] {
fieldName: 'name',
label: '等级名称',
component: 'Input',
+ componentProps: {
+ placeholder: '请输入等级名称',
+ clearable: true,
+ },
},
{
fieldName: 'status',
label: '状态',
component: 'Select',
componentProps: {
+ placeholder: '请选择状态',
clearable: true,
options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'),
},
},
+ {
+ fieldName: 'createTime',
+ label: '创建时间',
+ component: 'RangePicker',
+ componentProps: {
+ ...getRangePickerDefaultProps(),
+ allowClear: true,
+ },
+ },
];
}
@@ -99,11 +130,13 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
return [
{
field: 'id',
- title: '编号',
+ title: '等级编号',
+ minWidth: 80,
},
{
field: 'icon',
title: '等级图标',
+ minWidth: 100,
cellRender: {
name: 'CellImage',
},
@@ -111,6 +144,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{
field: 'backgroundUrl',
title: '等级背景图',
+ minWidth: 120,
cellRender: {
name: 'CellImage',
},
@@ -118,22 +152,27 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{
field: 'name',
title: '等级名称',
+ minWidth: 120,
},
{
field: 'level',
title: '等级',
+ minWidth: 80,
},
{
field: 'experience',
title: '升级经验',
+ minWidth: 100,
},
{
field: 'discountPercent',
title: '享受折扣(%)',
+ minWidth: 120,
},
{
field: 'status',
title: '状态',
+ minWidth: 80,
cellRender: {
name: 'CellDict',
props: { type: DICT_TYPE.COMMON_STATUS },
@@ -142,11 +181,12 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{
field: 'createTime',
title: '创建时间',
+ minWidth: 180,
formatter: 'formatDateTime',
},
{
title: '操作',
- width: 130,
+ width: 180,
fixed: 'right',
slots: { default: 'actions' },
},
diff --git a/apps/web-ele/src/views/member/level/index.vue b/apps/web-ele/src/views/member/level/index.vue
index 4bd017921d6f944804936a1fdbdaab3afa1fa973..de500e2c9f060cd56f9a06fa7fc9adaa9b9cca99 100644
--- a/apps/web-ele/src/views/member/level/index.vue
+++ b/apps/web-ele/src/views/member/level/index.vue
@@ -2,7 +2,7 @@
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { MemberLevelApi } from '#/api/member/level';
-import { Page, useVbenModal } from '@vben/common-ui';
+import { DocAlert, Page, useVbenModal } from '@vben/common-ui';
import { ElLoading, ElMessage } from 'element-plus';
@@ -19,7 +19,7 @@ const [FormModal, formModalApi] = useVbenModal({
});
/** 刷新表格 */
-function onRefresh() {
+function handleRefresh() {
gridApi.query();
}
@@ -41,7 +41,7 @@ async function handleDelete(row: MemberLevelApi.Level) {
try {
await deleteLevel(row.id as number);
ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name]));
- onRefresh();
+ handleRefresh();
} finally {
loadingInstance.close();
}
@@ -60,7 +60,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
},
proxyConfig: {
ajax: {
- query: async (_params, formValues) => {
+ query: async (_, formValues) => {
return await getLevelList({
...formValues,
});
@@ -69,6 +69,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
},
rowConfig: {
keyField: 'id',
+ isHover: true,
},
toolbarConfig: {
refresh: true,
@@ -80,7 +81,12 @@ const [Grid, gridApi] = useVbenVxeGrid({
-
+
+
+
-
+
diff --git a/apps/web-ele/src/views/member/point/record/data.ts b/apps/web-ele/src/views/member/point/record/data.ts
index f2496892c72cf53cc10b540764e6e3582c2c28d0..0ddb072728359b59a7998898a904bbe9eb789fa2 100644
--- a/apps/web-ele/src/views/member/point/record/data.ts
+++ b/apps/web-ele/src/views/member/point/record/data.ts
@@ -3,11 +3,11 @@ import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import { h } from 'vue';
-import { ElTag } from 'element-plus';
-
import { DICT_TYPE } from '@vben/constants';
import { getDictOptions } from '@vben/hooks';
+import { ElTag } from 'element-plus';
+
import { getRangePickerDefaultProps } from '#/utils';
/** 列表的搜索表单 */
@@ -17,12 +17,17 @@ export function useGridFormSchema(): VbenFormSchema[] {
fieldName: 'nickname',
label: '用户',
component: 'Input',
+ componentProps: {
+ placeholder: '请输入用户昵称',
+ clearable: true,
+ },
},
{
fieldName: 'bizType',
label: '业务类型',
component: 'Select',
componentProps: {
+ placeholder: '请选择业务类型',
clearable: true,
options: getDictOptions(DICT_TYPE.MEMBER_POINT_BIZ_TYPE, 'number'),
},
@@ -31,6 +36,10 @@ export function useGridFormSchema(): VbenFormSchema[] {
fieldName: 'title',
label: '积分标题',
component: 'Input',
+ componentProps: {
+ placeholder: '请输入积分标题',
+ clearable: true,
+ },
},
{
fieldName: 'createDate',
@@ -50,26 +59,29 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{
field: 'id',
title: '编号',
+ minWidth: 100,
},
{
field: 'createTime',
title: '获得时间',
+ minWidth: 180,
formatter: 'formatDateTime',
},
{
field: 'nickname',
title: '用户',
+ minWidth: 150,
},
{
field: 'point',
title: '获得积分',
+ minWidth: 120,
slots: {
default: ({ row }) => {
return h(
ElTag,
{
- class: 'mr-1',
- color: row.point > 0 ? 'blue' : 'red',
+ type: row.point > 0 ? 'primary' : 'danger',
},
() => (row.point > 0 ? `+${row.point}` : row.point),
);
@@ -79,22 +91,27 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{
field: 'totalPoint',
title: '总积分',
+ minWidth: 100,
},
{
field: 'title',
title: '标题',
+ minWidth: 200,
},
{
field: 'description',
title: '描述',
+ minWidth: 200,
},
{
field: 'bizId',
title: '业务编码',
+ minWidth: 120,
},
{
field: 'bizType',
title: '业务类型',
+ minWidth: 120,
cellRender: {
name: 'CellDict',
props: { type: DICT_TYPE.MEMBER_POINT_BIZ_TYPE },
diff --git a/apps/web-ele/src/views/member/point/record/index.vue b/apps/web-ele/src/views/member/point/record/index.vue
index 15d1a8135a4f462d11271f5a1d3d35785c0f0b5d..921f0df6d5b9e44d35313d2089ca1ded478317d9 100644
--- a/apps/web-ele/src/views/member/point/record/index.vue
+++ b/apps/web-ele/src/views/member/point/record/index.vue
@@ -2,7 +2,7 @@
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { MemberPointRecordApi } from '#/api/member/point/record';
-import { Page } from '@vben/common-ui';
+import { DocAlert, Page } from '@vben/common-ui';
import { useVbenVxeGrid } from '#/adapter/vxe-table';
import { getRecordPage } from '#/api/member/point/record';
@@ -30,6 +30,7 @@ const [Grid] = useVbenVxeGrid({
},
rowConfig: {
keyField: 'id',
+ isHover: true,
},
toolbarConfig: {
refresh: true,
@@ -41,6 +42,11 @@ const [Grid] = useVbenVxeGrid({
+
+
diff --git a/apps/web-ele/src/views/member/signin/config/data.ts b/apps/web-ele/src/views/member/signin/config/data.ts
index c1237cdd7bcc122d8910e95e55b243fe361e8af7..f9b5af4f0f9e9d27c300b113dbf0467cd7586235 100644
--- a/apps/web-ele/src/views/member/signin/config/data.ts
+++ b/apps/web-ele/src/views/member/signin/config/data.ts
@@ -26,7 +26,11 @@ export function useFormSchema(): VbenFormSchema[] {
min: 1,
max: 7,
precision: 0,
+ placeholder: '请输入签到天数',
+ controlsPosition: 'right',
+ class: '!w-full',
},
+ rules: z.number().min(1).max(7, '签到天数必须在 1-7 之间'),
},
{
component: 'InputNumber',
@@ -35,7 +39,11 @@ export function useFormSchema(): VbenFormSchema[] {
componentProps: {
min: 0,
precision: 0,
+ placeholder: '请输入获得积分',
+ controlsPosition: 'right',
+ class: '!w-full',
},
+ rules: z.number().min(0, '获得积分不能小于 0'),
},
{
component: 'InputNumber',
@@ -44,7 +52,11 @@ export function useFormSchema(): VbenFormSchema[] {
componentProps: {
min: 0,
precision: 0,
+ placeholder: '请输入奖励经验',
+ controlsPosition: 'right',
+ class: '!w-full',
},
+ rules: z.number().min(0, '奖励经验不能小于 0'),
},
{
fieldName: 'status',
@@ -63,39 +75,34 @@ export function useFormSchema(): VbenFormSchema[] {
/** 列表的字段 */
export function useGridColumns(): VxeTableGridOptions['columns'] {
return [
- {
- field: 'id',
- title: '编号',
- },
{
field: 'day',
title: '签到天数',
+ minWidth: 120,
formatter: ({ cellValue }) => ['第', cellValue, '天'].join(' '),
},
{
field: 'point',
title: '获得积分',
+ minWidth: 120,
},
{
field: 'experience',
title: '奖励经验',
+ minWidth: 120,
},
{
field: 'status',
title: '状态',
+ minWidth: 100,
cellRender: {
name: 'CellDict',
props: { type: DICT_TYPE.COMMON_STATUS },
},
},
- {
- field: 'createTime',
- title: '创建时间',
- formatter: 'formatDateTime',
- },
{
title: '操作',
- width: 130,
+ width: 150,
fixed: 'right',
slots: { default: 'actions' },
},
diff --git a/apps/web-ele/src/views/member/signin/config/index.vue b/apps/web-ele/src/views/member/signin/config/index.vue
index 3110f6505ac5a49fcd61c5677e4459f9d9a5942d..3b253a40ba0549c2733db69866c8f817cfb640b1 100644
--- a/apps/web-ele/src/views/member/signin/config/index.vue
+++ b/apps/web-ele/src/views/member/signin/config/index.vue
@@ -2,7 +2,7 @@
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { MemberSignInConfigApi } from '#/api/member/signin/config';
-import { Page, useVbenModal } from '@vben/common-ui';
+import { DocAlert, Page, useVbenModal } from '@vben/common-ui';
import { ElLoading, ElMessage } from 'element-plus';
@@ -22,7 +22,7 @@ const [FormModal, formModalApi] = useVbenModal({
});
/** 刷新表格 */
-function onRefresh() {
+function handleRefresh() {
gridApi.query();
}
@@ -44,7 +44,7 @@ async function handleDelete(row: MemberSignInConfigApi.SignInConfig) {
try {
await deleteSignInConfig(row.id as number);
ElMessage.success($t('ui.actionMessage.deleteSuccess'));
- onRefresh();
+ handleRefresh();
} finally {
loadingInstance.close();
}
@@ -67,6 +67,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
},
rowConfig: {
keyField: 'id',
+ isHover: true,
},
toolbarConfig: {
refresh: true,
@@ -78,7 +79,14 @@ const [Grid, gridApi] = useVbenVxeGrid({
-
+
+
+
+
+
['第', cellValue, '天'].join(' '),
},
{
field: 'point',
title: '获得积分',
+ minWidth: 120,
slots: {
default: ({ row }) => {
return h(
ElTag,
{
- class: 'mr-5px',
- color: row.point > 0 ? 'blue' : 'red',
+ type: row.point > 0 ? 'primary' : 'danger',
},
() => (row.point > 0 ? `+${row.point}` : row.point),
);
@@ -67,6 +78,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{
field: 'createTime',
title: '签到时间',
+ minWidth: 180,
formatter: 'formatDateTime',
},
];
diff --git a/apps/web-ele/src/views/member/signin/record/index.vue b/apps/web-ele/src/views/member/signin/record/index.vue
index a89b1210e0f62e99604b3959b7fec4d096146aed..d5a36b78bd7670954cf43c7aef726a3429f7e6c2 100644
--- a/apps/web-ele/src/views/member/signin/record/index.vue
+++ b/apps/web-ele/src/views/member/signin/record/index.vue
@@ -2,7 +2,7 @@
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { MemberSignInRecordApi } from '#/api/member/signin/record';
-import { Page } from '@vben/common-ui';
+import { DocAlert, Page } from '@vben/common-ui';
import { useVbenVxeGrid } from '#/adapter/vxe-table';
import { getSignInRecordPage } from '#/api/member/signin/record';
@@ -30,6 +30,7 @@ const [Grid] = useVbenVxeGrid({
},
rowConfig: {
keyField: 'id',
+ isHover: true,
},
toolbarConfig: {
refresh: true,
@@ -41,6 +42,12 @@ const [Grid] = useVbenVxeGrid({
+
+
+
diff --git a/apps/web-ele/src/views/member/tag/data.ts b/apps/web-ele/src/views/member/tag/data.ts
index c0da8541e1ff8a49dfda69ca792dae9a18402d15..d5e24d1ab793d2347253dc1d818bb08b63645d6b 100644
--- a/apps/web-ele/src/views/member/tag/data.ts
+++ b/apps/web-ele/src/views/member/tag/data.ts
@@ -18,6 +18,9 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'Input',
fieldName: 'name',
label: '标签名称',
+ componentProps: {
+ placeholder: '请输入标签名称',
+ },
rules: 'required',
},
];
@@ -30,6 +33,10 @@ export function useGridFormSchema(): VbenFormSchema[] {
fieldName: 'name',
label: '标签名称',
component: 'Input',
+ componentProps: {
+ placeholder: '请输入标签名称',
+ clearable: true,
+ },
},
{
fieldName: 'createTime',
@@ -37,6 +44,7 @@ export function useGridFormSchema(): VbenFormSchema[] {
component: 'RangePicker',
componentProps: {
...getRangePickerDefaultProps(),
+ placeholder: ['开始日期', '结束日期'],
},
},
];
@@ -48,14 +56,17 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{
field: 'id',
title: '编号',
+ minWidth: 100,
},
{
field: 'name',
title: '标签名称',
+ minWidth: 200,
},
{
field: 'createTime',
title: '创建时间',
+ minWidth: 180,
formatter: 'formatDateTime',
},
{
diff --git a/apps/web-ele/src/views/member/tag/index.vue b/apps/web-ele/src/views/member/tag/index.vue
index 2457a375610eed7410918e1b2a8047ecef900168..6bc412497684b91d90cb731312feb3be4c548918 100644
--- a/apps/web-ele/src/views/member/tag/index.vue
+++ b/apps/web-ele/src/views/member/tag/index.vue
@@ -19,7 +19,7 @@ const [FormModal, formModalApi] = useVbenModal({
});
/** 刷新表格 */
-function onRefresh() {
+function handleRefresh() {
gridApi.query();
}
@@ -41,7 +41,7 @@ async function handleDelete(row: MemberTagApi.Tag) {
try {
await deleteMemberTag(row.id as number);
ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name]));
- onRefresh();
+ handleRefresh();
} finally {
loadingInstance.close();
}
@@ -68,6 +68,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
},
rowConfig: {
keyField: 'id',
+ isHover: true,
},
toolbarConfig: {
refresh: true,
@@ -85,7 +86,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
url="https://doc.iocoder.cn/member/user/"
/>
-
+
false,
},
},
{
- component: 'Input',
fieldName: 'mobile',
label: '手机号',
+ component: 'Input',
rules: 'required',
},
{
@@ -45,19 +45,25 @@ export function useFormSchema(): VbenFormSchema[] {
rules: z.number().default(CommonStatusEnum.ENABLE).optional(),
},
{
- component: 'Input',
fieldName: 'nickname',
label: '用户昵称',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入用户昵称',
+ },
},
{
- component: 'ImageUpload',
fieldName: 'avatar',
label: '头像',
+ component: 'ImageUpload',
},
{
- component: 'Input',
fieldName: 'name',
label: '真实名字',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入真实名字',
+ },
},
{
fieldName: 'sex',
@@ -70,49 +76,57 @@ export function useFormSchema(): VbenFormSchema[] {
},
},
{
- component: 'DatePicker',
fieldName: 'birthday',
label: '出生日期',
+ component: 'DatePicker',
componentProps: {
format: 'YYYY-MM-DD',
+ valueFormat: 'x',
+ placeholder: '请选择出生日期',
},
},
{
- component: 'ApiTreeSelect',
fieldName: 'areaId',
label: '所在地',
+ component: 'ApiTreeSelect',
componentProps: {
api: () => getAreaTree(),
labelField: 'name',
valueField: 'id',
childrenField: 'children',
+ placeholder: '请选择所在地',
},
},
{
- component: 'ApiSelect',
fieldName: 'tagIds',
label: '用户标签',
+ component: 'ApiSelect',
componentProps: {
api: () => getSimpleTagList(),
labelField: 'name',
valueField: 'id',
- mode: 'multiple',
+ multiple: true,
+ placeholder: '请选择用户标签',
},
},
{
- component: 'ApiSelect',
fieldName: 'groupId',
label: '用户分组',
+ component: 'ApiSelect',
componentProps: {
api: () => getSimpleGroupList(),
labelField: 'name',
valueField: 'id',
+ placeholder: '请选择用户分组',
},
},
{
- component: 'Textarea',
fieldName: 'mark',
label: '会员备注',
+ component: 'Textarea',
+ componentProps: {
+ placeholder: '请输入会员备注',
+ },
},
];
}
@@ -124,11 +138,19 @@ export function useGridFormSchema(): VbenFormSchema[] {
fieldName: 'nickname',
label: '用户昵称',
component: 'Input',
+ componentProps: {
+ placeholder: '请输入用户昵称',
+ clearable: true,
+ },
},
{
fieldName: 'mobile',
label: '手机号',
component: 'Input',
+ componentProps: {
+ placeholder: '请输入手机号',
+ clearable: true,
+ },
},
{
fieldName: 'loginDate',
@@ -136,6 +158,7 @@ export function useGridFormSchema(): VbenFormSchema[] {
component: 'RangePicker',
componentProps: {
...getRangePickerDefaultProps(),
+ clearable: true,
},
},
{
@@ -144,6 +167,7 @@ export function useGridFormSchema(): VbenFormSchema[] {
component: 'RangePicker',
componentProps: {
...getRangePickerDefaultProps(),
+ clearable: true,
},
},
{
@@ -154,7 +178,9 @@ export function useGridFormSchema(): VbenFormSchema[] {
api: () => getSimpleTagList(),
labelField: 'name',
valueField: 'id',
- mode: 'multiple',
+ multiple: true,
+ placeholder: '请选择用户标签',
+ clearable: true,
},
},
{
@@ -165,6 +191,8 @@ export function useGridFormSchema(): VbenFormSchema[] {
api: () => getSimpleLevelList(),
labelField: 'name',
valueField: 'id',
+ placeholder: '请选择用户等级',
+ clearable: true,
},
},
{
@@ -175,6 +203,8 @@ export function useGridFormSchema(): VbenFormSchema[] {
api: () => getSimpleGroupList(),
labelField: 'name',
valueField: 'id',
+ placeholder: '请选择用户分组',
+ clearable: true,
},
},
];
@@ -190,38 +220,40 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{
field: 'id',
title: '用户编号',
+ minWidth: 100,
},
{
field: 'avatar',
title: '头像',
- slots: {
- default: ({ row }) => {
- return h('img', {
- src: row.avatar,
- style: { width: '40px' },
- });
- },
+ minWidth: 80,
+ cellRender: {
+ name: 'CellImage',
},
},
{
field: 'mobile',
title: '手机号',
+ minWidth: 120,
},
{
field: 'nickname',
title: '昵称',
+ minWidth: 120,
},
{
field: 'levelName',
title: '等级',
+ minWidth: 100,
},
{
field: 'groupName',
title: '分组',
+ minWidth: 100,
},
{
field: 'tagNames',
title: '用户标签',
+ minWidth: 150,
slots: {
default: ({ row }) => {
return row.tagNames?.map((tagName: string, index: number) => {
@@ -230,7 +262,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{
key: index,
class: 'mr-1',
- color: 'blue',
+ type: 'primary',
},
() => tagName,
);
@@ -241,10 +273,12 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{
field: 'point',
title: '积分',
+ minWidth: 80,
},
{
field: 'status',
title: '状态',
+ minWidth: 80,
cellRender: {
name: 'CellDict',
props: { type: DICT_TYPE.COMMON_STATUS },
@@ -253,11 +287,13 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{
field: 'loginDate',
title: '登录时间',
+ minWidth: 160,
formatter: 'formatDateTime',
},
{
field: 'createTime',
title: '注册时间',
+ minWidth: 160,
formatter: 'formatDateTime',
},
{
@@ -270,38 +306,43 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
}
/** 修改用户等级 */
-export function useLeavelFormSchema(): VbenFormSchema[] {
+export function useLevelFormSchema(): VbenFormSchema[] {
return [
{
- component: 'Input',
fieldName: 'id',
label: '用户编号',
+ component: 'Input',
componentProps: {
disabled: true,
},
},
{
- component: 'Input',
fieldName: 'nickname',
label: '用户昵称',
+ component: 'Input',
componentProps: {
disabled: true,
},
},
{
- fieldName: 'point',
+ fieldName: 'levelId',
label: '用户等级',
component: 'ApiSelect',
componentProps: {
api: () => getSimpleLevelList(),
labelField: 'name',
valueField: 'id',
+ placeholder: '请选择用户等级',
+ clearable: true,
},
},
{
- component: 'Textarea',
fieldName: 'reason',
label: '修改原因',
+ component: 'Textarea',
+ componentProps: {
+ placeholder: '请输入修改原因',
+ },
rules: 'required',
},
];
@@ -311,33 +352,33 @@ export function useLeavelFormSchema(): VbenFormSchema[] {
export function useBalanceFormSchema(): VbenFormSchema[] {
return [
{
- component: 'Input',
fieldName: 'id',
label: '用户编号',
+ component: 'Input',
componentProps: {
disabled: true,
},
},
{
- component: 'Input',
fieldName: 'nickname',
label: '用户昵称',
+ component: 'Input',
componentProps: {
disabled: true,
},
},
{
- component: 'Input',
fieldName: 'balance',
label: '变动前余额(元)',
+ component: 'Input',
componentProps: {
disabled: true,
},
},
{
- component: 'RadioGroup',
fieldName: 'changeType',
label: '变动类型',
+ component: 'RadioGroup',
componentProps: {
options: [
{ label: '增加', value: 1 },
@@ -349,23 +390,26 @@ export function useBalanceFormSchema(): VbenFormSchema[] {
defaultValue: 1,
},
{
- component: 'InputNumber',
fieldName: 'changeBalance',
label: '变动余额(元)',
+ component: 'InputNumber',
rules: 'required',
componentProps: {
min: 0,
precision: 2,
step: 0.1,
+ placeholder: '请输入变动余额',
+ controlsPosition: 'right',
+ class: '!w-full',
},
defaultValue: 0,
},
{
- component: 'Input',
fieldName: 'balanceResult',
label: '变动后余额(元)',
+ component: 'Input',
dependencies: {
- triggerFields: ['changeBalance', 'changeType'],
+ triggerFields: ['balance', 'changeBalance', 'changeType'],
disabled: true,
trigger(values, form) {
form.setFieldValue(
@@ -385,33 +429,33 @@ export function useBalanceFormSchema(): VbenFormSchema[] {
export function usePointFormSchema(): VbenFormSchema[] {
return [
{
- component: 'Input',
fieldName: 'id',
label: '用户编号',
+ component: 'Input',
componentProps: {
disabled: true,
},
},
{
- component: 'Input',
fieldName: 'nickname',
label: '用户昵称',
+ component: 'Input',
componentProps: {
disabled: true,
},
},
{
- component: 'Input',
fieldName: 'point',
label: '变动前积分',
+ component: 'Input',
componentProps: {
disabled: true,
},
},
{
- component: 'RadioGroup',
fieldName: 'changeType',
label: '变动类型',
+ component: 'RadioGroup',
componentProps: {
options: [
{ label: '增加', value: 1 },
@@ -423,22 +467,27 @@ export function usePointFormSchema(): VbenFormSchema[] {
defaultValue: 1,
},
{
- component: 'InputNumber',
fieldName: 'changePoint',
label: '变动积分',
+ component: 'InputNumber',
rules: 'required',
componentProps: {
min: 0,
precision: 0,
+ placeholder: '请输入变动积分',
+ controlsPosition: 'right',
+ class: '!w-full',
},
- defaultValue: 0,
},
{
- component: 'Input',
fieldName: 'pointResult',
label: '变动后积分',
+ component: 'Input',
+ componentProps: {
+ placeholder: '',
+ },
dependencies: {
- triggerFields: ['changePoint', 'changeType'],
+ triggerFields: ['point', 'changePoint', 'changeType'],
disabled: true,
trigger(values, form) {
form.setFieldValue(
diff --git a/apps/web-ele/src/views/member/user/modules/detail.vue b/apps/web-ele/src/views/member/user/detail/index.vue
similarity index 57%
rename from apps/web-ele/src/views/member/user/modules/detail.vue
rename to apps/web-ele/src/views/member/user/detail/index.vue
index 54f556795febdcd529dd955928beb96fd1fd550e..19d3b5e694bae2710865abf3e07f54cfc4c99a62 100644
--- a/apps/web-ele/src/views/member/user/modules/detail.vue
+++ b/apps/web-ele/src/views/member/user/detail/index.vue
@@ -14,19 +14,19 @@ import { getUser } from '#/api/member/user';
import { getWallet } from '#/api/pay/wallet/balance';
import { $t } from '#/locales';
-import UserAccountInfo from '../components/user-account-info.vue';
-import UserAddressList from '../components/user-address-list.vue';
-import UserAfterSaleList from '../components/user-after-sale-list.vue';
-import UserBalanceList from '../components/user-balance-list.vue';
-import UserBasicInfo from '../components/user-basic-info.vue';
-import UserBrokerageList from '../components/user-brokerage-list.vue';
-import UserCouponList from '../components/user-coupon-list.vue';
-import UserExperienceRecordList from '../components/user-experience-record-list.vue';
-import UserFavoriteList from '../components/user-favorite-list.vue';
-import UserOrderList from '../components/user-order-list.vue';
-import UserPointList from '../components/user-point-list.vue';
-import UserSignList from '../components/user-sign-list.vue';
-import Form from './form.vue';
+import Form from '../modules/form.vue';
+import AccountInfo from './modules/account-info.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';
+import UserAddressList from './modules/user-address-list.vue';
+import UserAfterSaleList from './modules/user-after-sale-list.vue';
+import UserBrokerageList from './modules/user-brokerage-list.vue';
+import UserCouponList from './modules/user-coupon-list.vue';
+import UserFavoriteList from './modules/user-favorite-list.vue';
+import UserOrderList from './modules/user-order-list.vue';
const route = useRoute();
const { closeCurrentTab, refreshTab } = useTabs();
@@ -39,28 +39,29 @@ const [FormModal, formModalApi] = useVbenModal({
const userId = Number(route.query.id);
const user = ref();
const wallet = ref();
-const activeName = ref('UserPointList');
-/* 钱包初始化数据 */
-const WALLET_INIT_DATA = {
- balance: 0,
- totalExpense: 0,
- totalRecharge: 0,
-} as PayWalletApi.Wallet;
+const activeName = ref('PointList');
+/** 获取会员详情 */
async function getUserDetail() {
if (!userId) {
ElMessage.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();
});
@@ -69,66 +70,66 @@ onMounted(async () => {
-
+
基本信息
{{ $t('common.edit') }}
-
-
+
账户信息
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/apps/web-ele/src/views/member/user/components/user-account-info.vue b/apps/web-ele/src/views/member/user/detail/modules/account-info.vue
similarity index 92%
rename from apps/web-ele/src/views/member/user/components/user-account-info.vue
rename to apps/web-ele/src/views/member/user/detail/modules/account-info.vue
index 16a282989a7dca323946bcb8346c3961498333a9..5976680903e155efab4816860653d5a6a71a0445 100644
--- a/apps/web-ele/src/views/member/user/components/user-account-info.vue
+++ b/apps/web-ele/src/views/member/user/detail/modules/account-info.vue
@@ -19,12 +19,12 @@ withDefaults(
},
);
-const [Description] = useDescription({
+const [Descriptions] = useDescription({
componentProps: {
border: false,
column: 2,
direction: 'horizontal',
- labelWidth: 100,
+ labelWidth: 140,
title: '',
extra: '',
},
@@ -32,7 +32,7 @@ const [Description] = useDescription({
{
field: 'levelName',
label: '等级',
- content: (data) => data.levelName || '无',
+ content: (data) => data.levelName || '-',
},
{
field: 'experience',
@@ -76,7 +76,7 @@ const [Description] = useDescription({
-
-
-
+
+
-
-
+
+
-
+
diff --git a/apps/web-ele/src/views/member/user/components/user-experience-record-list.vue b/apps/web-ele/src/views/member/user/detail/modules/experience-record-list.vue
similarity index 87%
rename from apps/web-ele/src/views/member/user/components/user-experience-record-list.vue
rename to apps/web-ele/src/views/member/user/detail/modules/experience-record-list.vue
index bbb0cc8fcf5ec8597830c57a88a0062ea6f066c0..9f038594fcf85f32ee4cf5c8aac3973c6961ef9e 100644
--- a/apps/web-ele/src/views/member/user/components/user-experience-record-list.vue
+++ b/apps/web-ele/src/views/member/user/detail/modules/experience-record-list.vue
@@ -4,13 +4,13 @@ import type { MemberExperienceRecordApi } from '#/api/member/experience-record';
import { h } from 'vue';
+import { DICT_TYPE } from '@vben/constants';
+import { getDictOptions } from '@vben/hooks';
+
import { ElTag } from 'element-plus';
import { useVbenVxeGrid } from '#/adapter/vxe-table';
import { getExperienceRecordPage } from '#/api/member/experience-record';
-import { DICT_TYPE } from '@vben/constants';
-import { getDictOptions } from '@vben/hooks';
-
import { getRangePickerDefaultProps } from '#/utils';
const props = defineProps<{
@@ -25,17 +25,22 @@ const [Grid] = useVbenVxeGrid({
label: '业务类型',
component: 'Select',
componentProps: {
- clearable: true,
options: getDictOptions(
DICT_TYPE.MEMBER_EXPERIENCE_BIZ_TYPE,
'number',
),
+ placeholder: '请选择业务类型',
+ clearable: true,
},
},
{
fieldName: 'title',
label: '标题',
component: 'Input',
+ componentProps: {
+ placeholder: '请输入标题',
+ clearable: true,
+ },
},
{
fieldName: 'createDate',
@@ -53,22 +58,24 @@ 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(
ElTag,
{
- class: 'mr-1',
- color: row.experience > 0 ? 'blue' : 'red',
+ type: row.point > 0 ? 'primary' : 'danger',
},
() =>
row.experience > 0 ? `+${row.experience}` : row.experience,
@@ -79,22 +86,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 +114,6 @@ const [Grid] = useVbenVxeGrid({
},
],
keepSource: true,
- pagerConfig: {
- pageSize: 10,
- },
proxyConfig: {
ajax: {
query: async ({ page }, formValues) => {
@@ -119,6 +128,7 @@ const [Grid] = useVbenVxeGrid({
},
rowConfig: {
keyField: 'id',
+ isHover: true,
},
toolbarConfig: {
refresh: true,
diff --git a/apps/web-ele/src/views/member/user/components/user-point-list.vue b/apps/web-ele/src/views/member/user/detail/modules/point-list.vue
similarity index 97%
rename from apps/web-ele/src/views/member/user/components/user-point-list.vue
rename to apps/web-ele/src/views/member/user/detail/modules/point-list.vue
index c3bba26882207d67870e85245cd6d1dfb0719dc1..9f782017ed2fe777d7e7942a616ffd7756ea7d10 100644
--- a/apps/web-ele/src/views/member/user/components/user-point-list.vue
+++ b/apps/web-ele/src/views/member/user/detail/modules/point-list.vue
@@ -23,6 +23,7 @@ const [Grid] = useVbenVxeGrid({
component: 'Select',
componentProps: {
clearable: true,
+ placeholder: '请选择业务类型',
options: getDictOptions(DICT_TYPE.MEMBER_POINT_BIZ_TYPE, 'number'),
},
},
diff --git a/apps/web-ele/src/views/member/user/components/user-sign-list.vue b/apps/web-ele/src/views/member/user/detail/modules/sign-list.vue
similarity index 91%
rename from apps/web-ele/src/views/member/user/components/user-sign-list.vue
rename to apps/web-ele/src/views/member/user/detail/modules/sign-list.vue
index 432d4fa9a57aeb507c5ba3bc66f6576905ef36da..39e31190f2ad94ccd8155465de7aa3d3b33eba59 100644
--- a/apps/web-ele/src/views/member/user/components/user-sign-list.vue
+++ b/apps/web-ele/src/views/member/user/detail/modules/sign-list.vue
@@ -18,6 +18,10 @@ const [Grid] = useVbenVxeGrid({
fieldName: 'day',
label: '签到天数',
component: 'Input',
+ componentProps: {
+ placeholder: '请输入签到天数',
+ clearable: 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/views/member/user/components/user-address-list.vue b/apps/web-ele/src/views/member/user/detail/modules/user-address-list.vue
similarity index 88%
rename from apps/web-ele/src/views/member/user/components/user-address-list.vue
rename to apps/web-ele/src/views/member/user/detail/modules/user-address-list.vue
index a839c5b04868de5adc8d3711a896c0d0da07ad17..a897234fdfd2e79ba29ef689f9e27763562c9053 100644
--- a/apps/web-ele/src/views/member/user/components/user-address-list.vue
+++ b/apps/web-ele/src/views/member/user/detail/modules/user-address-list.vue
@@ -19,33 +19,39 @@ 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(
ElTag,
{
class: 'mr-1',
- color: row.defaultStatus ? 'blue' : 'red',
+ type: row.defaultStatus ? 'primary' : 'danger',
},
() => (row.defaultStatus ? '是' : '否'),
);
@@ -56,6 +62,7 @@ const [Grid] = useVbenVxeGrid({
field: 'createTime',
title: '创建时间',
formatter: 'formatDateTime',
+ minWidth: 160,
},
],
keepSource: true,
diff --git a/apps/web-ele/src/views/member/user/components/user-after-sale-list.vue b/apps/web-ele/src/views/member/user/detail/modules/user-after-sale-list.vue
similarity index 100%
rename from apps/web-ele/src/views/member/user/components/user-after-sale-list.vue
rename to apps/web-ele/src/views/member/user/detail/modules/user-after-sale-list.vue
diff --git a/apps/web-ele/src/views/member/user/components/user-brokerage-list.vue b/apps/web-ele/src/views/member/user/detail/modules/user-brokerage-list.vue
similarity index 100%
rename from apps/web-ele/src/views/member/user/components/user-brokerage-list.vue
rename to apps/web-ele/src/views/member/user/detail/modules/user-brokerage-list.vue
diff --git a/apps/web-ele/src/views/member/user/components/user-coupon-list.vue b/apps/web-ele/src/views/member/user/detail/modules/user-coupon-list.vue
similarity index 100%
rename from apps/web-ele/src/views/member/user/components/user-coupon-list.vue
rename to apps/web-ele/src/views/member/user/detail/modules/user-coupon-list.vue
index 91915f709f7cde998231eb9bee1ab50bd9bf1682..a83c1e410f885478956148fffc318412c1eba32d 100644
--- a/apps/web-ele/src/views/member/user/components/user-coupon-list.vue
+++ b/apps/web-ele/src/views/member/user/detail/modules/user-coupon-list.vue
@@ -4,6 +4,9 @@ import type { MallCouponApi } from '#/api/mall/promotion/coupon/coupon';
import { ref, watch } from 'vue';
+import { DICT_TYPE } from '@vben/constants';
+import { getDictOptions } from '@vben/hooks';
+
import { ElLoading, ElMessage, ElTabPane, ElTabs } from 'element-plus';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
@@ -11,9 +14,6 @@ import {
deleteCoupon,
getCouponPage,
} from '#/api/mall/promotion/coupon/coupon';
-import { DICT_TYPE } from '@vben/constants';
-import { getDictOptions } from '@vben/hooks';
-
import { getRangePickerDefaultProps } from '#/utils';
const props = defineProps<{
diff --git a/apps/web-ele/src/views/member/user/components/user-favorite-list.vue b/apps/web-ele/src/views/member/user/detail/modules/user-favorite-list.vue
similarity index 100%
rename from apps/web-ele/src/views/member/user/components/user-favorite-list.vue
rename to apps/web-ele/src/views/member/user/detail/modules/user-favorite-list.vue
diff --git a/apps/web-ele/src/views/member/user/components/user-order-list.vue b/apps/web-ele/src/views/member/user/detail/modules/user-order-list.vue
similarity index 100%
rename from apps/web-ele/src/views/member/user/components/user-order-list.vue
rename to apps/web-ele/src/views/member/user/detail/modules/user-order-list.vue
diff --git a/apps/web-ele/src/views/member/user/index.vue b/apps/web-ele/src/views/member/user/index.vue
index 8dc3e510829f34cec8646ac938fe6ad882ed551d..6e166cd463f73b533a7035e608f29ff4e087f5cb 100644
--- a/apps/web-ele/src/views/member/user/index.vue
+++ b/apps/web-ele/src/views/member/user/index.vue
@@ -6,15 +6,17 @@ import { ref } from 'vue';
import { useRouter } from 'vue-router';
import { DocAlert, Page, useVbenModal } from '@vben/common-ui';
+import { isEmpty } from '@vben/utils';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { getUserPage } from '#/api/member/user';
import { $t } from '#/locales';
+import { CouponSendForm } from '../../mall/promotion/coupon/components';
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 LevelForm from './modules/level-form.vue';
import PointForm from './modules/point-form.vue';
const router = useRouter();
@@ -34,27 +36,19 @@ const [BalanceFormModal, balanceFormModalApi] = useVbenModal({
destroyOnClose: true,
});
-// TODO @霖:拼写错误;
-const [LeavelFormModal, leavelFormModalApi] = useVbenModal({
- connectedComponent: LeavelForm,
+const [LevelFormModal, levelFormModalApi] = useVbenModal({
+ connectedComponent: LevelForm,
destroyOnClose: true,
});
-/** 刷新表格数据 */
-function onRefresh() {
- gridApi.query();
-}
-
-/** 设置选中 ID */
-const checkedIds = ref([]);
-function setCheckedIds({ records }: { records: MemberUserApi.User[] }) {
- checkedIds.value = records.map((item) => item.id!);
-}
+const [CouponSendFormModal, couponSendFormModalApi] = useVbenModal({
+ connectedComponent: CouponSendForm,
+ destroyOnClose: true,
+});
-/** 发送优惠券 */
-// TODO @霖:这个功能没开发对,是发送优惠劵哈;
-function handleSendCoupon() {
- formModalApi.setData(null).open();
+/** 刷新表格 */
+function handleRefresh() {
+ gridApi.query();
}
/** 编辑会员 */
@@ -64,7 +58,7 @@ function handleEdit(row: MemberUserApi.User) {
/** 修改会员等级 */
function handleUpdateLevel(row: MemberUserApi.User) {
- leavelFormModalApi.setData(row).open();
+ levelFormModalApi.setData(row).open();
}
/** 修改会员积分 */
@@ -77,6 +71,24 @@ function handleUpdateBalance(row: MemberUserApi.User) {
balanceFormModalApi.setData(row).open();
}
+/** 发送优惠券 */
+async function handleSendCoupon() {
+ couponSendFormModalApi
+ .setData({
+ userIds: checkedIds.value,
+ })
+ .open();
+}
+
+const checkedIds = ref([]);
+function handleRowCheckboxChange({
+ records,
+}: {
+ records: MemberUserApi.User[];
+}) {
+ checkedIds.value = records.map((item) => item.id!);
+}
+
/** 查看会员详情 */
function handleViewDetail(row: MemberUserApi.User) {
router.push({
@@ -87,17 +99,12 @@ function handleViewDetail(row: MemberUserApi.User) {
});
}
-// 表格实例
const [Grid, gridApi] = useVbenVxeGrid({
formOptions: {
schema: useGridFormSchema(),
},
gridOptions: {
columns: useGridColumns(),
- checkboxConfig: {
- highlight: true,
- labelField: 'checkbox',
- },
height: 'auto',
keepSource: true,
proxyConfig: {
@@ -113,6 +120,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
},
rowConfig: {
keyField: 'id',
+ isHover: true,
},
toolbarConfig: {
refresh: true,
@@ -120,8 +128,8 @@ const [Grid, gridApi] = useVbenVxeGrid({
},
} as VxeTableGridOptions,
gridEvents: {
- checkboxAll: setCheckedIds,
- checkboxChange: setCheckedIds,
+ checkboxAll: handleRowCheckboxChange,
+ checkboxChange: handleRowCheckboxChange,
},
});
@@ -135,10 +143,11 @@ const [Grid, gridApi] = useVbenVxeGrid({
/>
-
-
-
-
+
+
+
+
+
import type { MemberUserApi } from '#/api/member/user';
-import { ref } from 'vue';
+import { computed, ref } from 'vue';
import { useVbenModal } from '@vben/common-ui';
@@ -15,6 +15,11 @@ import { useFormSchema } from '../data';
const emit = defineEmits(['success']);
const formData = ref();
+const getTitle = computed(() => {
+ return formData.value?.id
+ ? $t('ui.actionTitle.edit', ['会员'])
+ : $t('ui.actionTitle.create', ['会员']);
+});
const [Form, formApi] = useVbenForm({
commonConfig: {
@@ -71,7 +76,7 @@ const [Modal, modalApi] = useVbenModal({
-
+
diff --git a/apps/web-ele/src/views/member/user/modules/leavel-form.vue b/apps/web-ele/src/views/member/user/modules/level-form.vue
similarity index 77%
rename from apps/web-ele/src/views/member/user/modules/leavel-form.vue
rename to apps/web-ele/src/views/member/user/modules/level-form.vue
index 9f41e3cc8a08b4427d809ae5ecc0dc2e602520cb..50d5c6f86fc4593b56c4dd06efe440fa16997208 100644
--- a/apps/web-ele/src/views/member/user/modules/leavel-form.vue
+++ b/apps/web-ele/src/views/member/user/modules/level-form.vue
@@ -1,20 +1,23 @@
-
+
diff --git a/apps/web-ele/src/views/member/user/modules/point-form.vue b/apps/web-ele/src/views/member/user/modules/point-form.vue
index a99e2e21b175020fc3a0dd6d0247310bab5f7437..16d810dba7dedf73f2348c40fb26b3b826e869e7 100644
--- a/apps/web-ele/src/views/member/user/modules/point-form.vue
+++ b/apps/web-ele/src/views/member/user/modules/point-form.vue
@@ -1,20 +1,23 @@
-
+
diff --git a/apps/web-ele/src/views/system/dept/data.ts b/apps/web-ele/src/views/system/dept/data.ts
index a6a132e90421c97e5df8761772247593ba8a8d48..530f309a6ac582541f27d70d6688cff60b8670cf 100644
--- a/apps/web-ele/src/views/system/dept/data.ts
+++ b/apps/web-ele/src/views/system/dept/data.ts
@@ -58,8 +58,9 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'InputNumber',
componentProps: {
min: 0,
- controlsPosition: 'right',
placeholder: '请输入显示顺序',
+ controlsPosition: 'right',
+ class: '!w-full',
},
rules: 'required',
},
diff --git a/apps/web-ele/src/views/system/menu/data.ts b/apps/web-ele/src/views/system/menu/data.ts
index cf86582613c7484fa877ed5709675541dee86ad2..15dffdd231dafe73cd3a4e3c3828e504c8e4aa6f 100644
--- a/apps/web-ele/src/views/system/menu/data.ts
+++ b/apps/web-ele/src/views/system/menu/data.ts
@@ -202,8 +202,9 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'InputNumber',
componentProps: {
min: 0,
- controlsPosition: 'right',
placeholder: '请输入显示顺序',
+ controlsPosition: 'right',
+ class: '!w-full',
},
rules: 'required',
},
diff --git a/apps/web-ele/src/views/system/oauth2/client/data.ts b/apps/web-ele/src/views/system/oauth2/client/data.ts
index a6511cf9caf0b48afede964d08dd00dc603acd0e..d90bf0054c3e08f70d579bbf5a8c5f72f13c4f08 100644
--- a/apps/web-ele/src/views/system/oauth2/client/data.ts
+++ b/apps/web-ele/src/views/system/oauth2/client/data.ts
@@ -77,6 +77,7 @@ export function useFormSchema(): VbenFormSchema[] {
placeholder: '请输入访问令牌的有效期,单位:秒',
min: 0,
controlsPosition: 'right',
+ class: '!w-full',
},
rules: 'required',
},
@@ -88,6 +89,7 @@ export function useFormSchema(): VbenFormSchema[] {
placeholder: '请输入刷新令牌的有效期,单位:秒',
min: 0,
controlsPosition: 'right',
+ class: '!w-full',
},
rules: 'required',
},
diff --git a/apps/web-ele/src/views/system/role/data.ts b/apps/web-ele/src/views/system/role/data.ts
index cef1fd4e17d93ad37d57021447eaf32f9c3c1abd..fabb16b8d0f03813995c6dcfdd8f75342aa6fe3f 100644
--- a/apps/web-ele/src/views/system/role/data.ts
+++ b/apps/web-ele/src/views/system/role/data.ts
@@ -40,8 +40,9 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'InputNumber',
componentProps: {
min: 0,
- controlsPosition: 'right',
placeholder: '请输入显示顺序',
+ controlsPosition: 'right',
+ class: '!w-full',
},
rules: 'required',
},
diff --git a/apps/web-ele/src/views/system/user/data.ts b/apps/web-ele/src/views/system/user/data.ts
index 097730c568d3e12bc8995afae552b55390f702ed..c1283b47bd805608b0849b13601d5cbfee4cce44 100644
--- a/apps/web-ele/src/views/system/user/data.ts
+++ b/apps/web-ele/src/views/system/user/data.ts
@@ -73,7 +73,7 @@ export function useFormSchema(): VbenFormSchema[] {
api: getSimplePostList,
labelField: 'name',
valueField: 'id',
- mode: 'multiple',
+ multiple: true,
placeholder: '请选择岗位',
},
},
@@ -82,11 +82,17 @@ export function useFormSchema(): VbenFormSchema[] {
label: '邮箱',
component: 'Input',
rules: z.string().email('邮箱格式不正确').or(z.literal('')).optional(),
+ componentProps: {
+ placeholder: '请输入邮箱',
+ },
},
{
fieldName: 'mobile',
label: '手机号码',
component: 'Input',
+ componentProps: {
+ placeholder: '请输入手机号码',
+ },
},
{
fieldName: 'sex',
@@ -213,7 +219,7 @@ export function useAssignRoleFormSchema(): VbenFormSchema[] {
api: getSimpleRoleList,
labelField: 'name',
valueField: 'id',
- mode: 'multiple',
+ multiple: true,
placeholder: '请选择角色',
},
},
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index aa641f376505d28719df44d5fa44d9e3381d6e89..9749837f6701e8e03236d837ed5037006a51b1c2 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -544,8 +544,8 @@ catalogs:
specifier: ^4.15.1
version: 4.15.1
vite:
- specifier: ^7.1.2
- version: 7.1.6
+ specifier: ^5.4.10
+ version: 5.4.20
vite-plugin-compression:
specifier: ^0.5.1
version: 0.5.1
@@ -669,10 +669,10 @@ importers:
version: link:scripts/vsh
'@vitejs/plugin-vue':
specifier: 'catalog:'
- version: 6.0.1(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))
+ version: 6.0.1(vite@5.4.20(@types/node@22.18.6)(less@4.4.1)(sass@1.92.1)(terser@5.44.0))(vue@3.5.21(typescript@5.9.2))
'@vitejs/plugin-vue-jsx':
specifier: 'catalog:'
- version: 5.1.1(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))
+ version: 5.1.1(vite@5.4.20(@types/node@22.18.6)(less@4.4.1)(sass@1.92.1)(terser@5.44.0))(vue@3.5.21(typescript@5.9.2))
'@vue/test-utils':
specifier: 'catalog:'
version: 2.4.6
@@ -714,7 +714,7 @@ importers:
version: 3.6.1(sass@1.92.1)(typescript@5.9.2)(vue-tsc@2.2.10(typescript@5.9.2))(vue@3.5.21(typescript@5.9.2))
vite:
specifier: 'catalog:'
- version: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)
+ version: 5.4.20(@types/node@22.18.6)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)
vitest:
specifier: 'catalog:'
version: 3.2.4(@types/node@22.18.6)(happy-dom@17.6.3)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)
@@ -1311,7 +1311,7 @@ importers:
version: link:../../packages/types
vite:
specifier: 'catalog:'
- version: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)
+ version: 5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)
internal/vite-config:
dependencies:
@@ -1341,10 +1341,10 @@ importers:
version: 2.0.3
vite-plugin-pwa:
specifier: 'catalog:'
- version: 1.0.3(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))(workbox-build@7.3.0)(workbox-window@7.3.0)
+ version: 1.0.3(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0))(workbox-build@7.3.0)(workbox-window@7.3.0)
vite-plugin-vue-devtools:
specifier: 'catalog:'
- version: 7.7.7(rollup@4.50.2)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))
+ version: 7.7.7(rollup@4.50.2)(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0))(vue@3.5.21(typescript@5.9.2))
devDependencies:
'@pnpm/workspace.read-manifest':
specifier: 'catalog:'
@@ -1360,10 +1360,10 @@ importers:
version: link:../node-utils
'@vitejs/plugin-vue':
specifier: 'catalog:'
- version: 6.0.1(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))
+ version: 6.0.1(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0))(vue@3.5.21(typescript@5.9.2))
'@vitejs/plugin-vue-jsx':
specifier: 'catalog:'
- version: 5.1.1(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))
+ version: 5.1.1(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0))(vue@3.5.21(typescript@5.9.2))
dayjs:
specifier: 'catalog:'
version: 1.11.18
@@ -1381,16 +1381,16 @@ importers:
version: 1.92.1
vite:
specifier: 'catalog:'
- version: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)
+ version: 5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)
vite-plugin-compression:
specifier: 'catalog:'
- version: 0.5.1(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))
+ version: 0.5.1(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0))
vite-plugin-dts:
specifier: 'catalog:'
- version: 4.5.4(@types/node@24.5.2)(rollup@4.50.2)(typescript@5.9.2)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))
+ version: 4.5.4(@types/node@24.5.2)(rollup@4.50.2)(typescript@5.9.2)(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0))
vite-plugin-html:
specifier: 'catalog:'
- version: 3.2.2(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))
+ version: 3.2.2(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0))
vite-plugin-lazy-import:
specifier: 'catalog:'
version: 1.0.7
@@ -15110,26 +15110,26 @@ snapshots:
dependencies:
vite-plugin-pwa: 1.0.3(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0))(workbox-build@7.3.0)(workbox-window@7.3.0)
- '@vitejs/plugin-vue-jsx@5.1.1(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))':
+ '@vitejs/plugin-vue-jsx@5.1.1(vite@5.4.20(@types/node@22.18.6)(less@4.4.1)(sass@1.92.1)(terser@5.44.0))(vue@3.5.21(typescript@5.9.2))':
dependencies:
'@babel/core': 7.28.4
'@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4)
'@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4)
'@rolldown/pluginutils': 1.0.0-beta.38
'@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.4)
- vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)
+ vite: 5.4.20(@types/node@22.18.6)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)
vue: 3.5.21(typescript@5.9.2)
transitivePeerDependencies:
- supports-color
- '@vitejs/plugin-vue-jsx@5.1.1(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))':
+ '@vitejs/plugin-vue-jsx@5.1.1(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0))(vue@3.5.21(typescript@5.9.2))':
dependencies:
'@babel/core': 7.28.4
'@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4)
'@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4)
'@rolldown/pluginutils': 1.0.0-beta.38
'@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.4)
- vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)
+ vite: 5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)
vue: 3.5.21(typescript@5.9.2)
transitivePeerDependencies:
- supports-color
@@ -15139,16 +15139,16 @@ snapshots:
vite: 5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)
vue: 3.5.21(typescript@5.9.2)
- '@vitejs/plugin-vue@6.0.1(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))':
+ '@vitejs/plugin-vue@6.0.1(vite@5.4.20(@types/node@22.18.6)(less@4.4.1)(sass@1.92.1)(terser@5.44.0))(vue@3.5.21(typescript@5.9.2))':
dependencies:
'@rolldown/pluginutils': 1.0.0-beta.29
- vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)
+ vite: 5.4.20(@types/node@22.18.6)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)
vue: 3.5.21(typescript@5.9.2)
- '@vitejs/plugin-vue@6.0.1(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))':
+ '@vitejs/plugin-vue@6.0.1(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0))(vue@3.5.21(typescript@5.9.2))':
dependencies:
'@rolldown/pluginutils': 1.0.0-beta.29
- vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)
+ vite: 5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)
vue: 3.5.21(typescript@5.9.2)
'@vitest/expect@3.2.4':
@@ -15167,6 +15167,15 @@ snapshots:
optionalDependencies:
vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)
+ '@vitest/mocker@3.2.4(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))':
+ dependencies:
+ '@vitest/spy': 3.2.4
+ estree-walker: 3.0.3
+ magic-string: 0.30.19
+ optionalDependencies:
+ vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)
+ optional: true
+
'@vitest/pretty-format@3.2.4':
dependencies:
tinyrainbow: 2.0.0
@@ -15275,14 +15284,14 @@ snapshots:
dependencies:
'@vue/devtools-kit': 7.7.7
- '@vue/devtools-core@7.7.7(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))':
+ '@vue/devtools-core@7.7.7(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0))(vue@3.5.21(typescript@5.9.2))':
dependencies:
'@vue/devtools-kit': 7.7.7
'@vue/devtools-shared': 7.7.7
mitt: 3.0.1
nanoid: 5.1.5
pathe: 2.0.3
- vite-hot-client: 2.1.0(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))
+ vite-hot-client: 2.1.0(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0))
vue: 3.5.21(typescript@5.9.2)
transitivePeerDependencies:
- vite
@@ -21590,9 +21599,9 @@ snapshots:
'@types/unist': 3.0.3
vfile-message: 4.0.3
- vite-hot-client@2.1.0(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)):
+ vite-hot-client@2.1.0(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)):
dependencies:
- vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)
+ vite: 5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)
vite-node@3.2.4(@types/node@22.18.6)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1):
dependencies:
@@ -21637,16 +21646,16 @@ snapshots:
- yaml
optional: true
- vite-plugin-compression@0.5.1(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)):
+ vite-plugin-compression@0.5.1(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)):
dependencies:
chalk: 4.1.2
debug: 4.4.3
fs-extra: 10.1.0
- vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)
+ vite: 5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)
transitivePeerDependencies:
- supports-color
- vite-plugin-dts@4.5.4(@types/node@24.5.2)(rollup@4.50.2)(typescript@5.9.2)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)):
+ vite-plugin-dts@4.5.4(@types/node@24.5.2)(rollup@4.50.2)(typescript@5.9.2)(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)):
dependencies:
'@microsoft/api-extractor': 7.52.13(@types/node@24.5.2)
'@rollup/pluginutils': 5.3.0(rollup@4.50.2)
@@ -21659,13 +21668,13 @@ snapshots:
magic-string: 0.30.19
typescript: 5.9.2
optionalDependencies:
- vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)
+ vite: 5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)
transitivePeerDependencies:
- '@types/node'
- rollup
- supports-color
- vite-plugin-html@3.2.2(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)):
+ vite-plugin-html@3.2.2(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)):
dependencies:
'@rollup/pluginutils': 4.2.1
colorette: 2.0.20
@@ -21679,9 +21688,9 @@ snapshots:
html-minifier-terser: 6.1.0
node-html-parser: 5.4.2
pathe: 0.2.0
- vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)
+ vite: 5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)
- vite-plugin-inspect@0.8.9(rollup@4.50.2)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)):
+ vite-plugin-inspect@0.8.9(rollup@4.50.2)(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)):
dependencies:
'@antfu/utils': 0.7.10
'@rollup/pluginutils': 5.3.0(rollup@4.50.2)
@@ -21692,7 +21701,7 @@ snapshots:
perfect-debounce: 1.0.0
picocolors: 1.1.1
sirv: 3.0.2
- vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)
+ vite: 5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)
transitivePeerDependencies:
- rollup
- supports-color
@@ -21715,34 +21724,23 @@ snapshots:
transitivePeerDependencies:
- supports-color
- vite-plugin-pwa@1.0.3(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))(workbox-build@7.3.0)(workbox-window@7.3.0):
+ vite-plugin-vue-devtools@7.7.7(rollup@4.50.2)(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0))(vue@3.5.21(typescript@5.9.2)):
dependencies:
- debug: 4.4.3
- pretty-bytes: 6.1.1
- tinyglobby: 0.2.15
- vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)
- workbox-build: 7.3.0
- workbox-window: 7.3.0
- transitivePeerDependencies:
- - supports-color
-
- vite-plugin-vue-devtools@7.7.7(rollup@4.50.2)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)):
- dependencies:
- '@vue/devtools-core': 7.7.7(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))
+ '@vue/devtools-core': 7.7.7(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0))(vue@3.5.21(typescript@5.9.2))
'@vue/devtools-kit': 7.7.7
'@vue/devtools-shared': 7.7.7
execa: 9.6.0
sirv: 3.0.2
- vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)
- vite-plugin-inspect: 0.8.9(rollup@4.50.2)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))
- vite-plugin-vue-inspector: 5.3.2(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))
+ vite: 5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)
+ vite-plugin-inspect: 0.8.9(rollup@4.50.2)(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0))
+ vite-plugin-vue-inspector: 5.3.2(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0))
transitivePeerDependencies:
- '@nuxt/kit'
- rollup
- supports-color
- vue
- vite-plugin-vue-inspector@5.3.2(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)):
+ vite-plugin-vue-inspector@5.3.2(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)):
dependencies:
'@babel/core': 7.28.4
'@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.4)
@@ -21753,10 +21751,22 @@ snapshots:
'@vue/compiler-dom': 3.5.21
kolorist: 1.8.0
magic-string: 0.30.19
- vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1)
+ vite: 5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)
transitivePeerDependencies:
- supports-color
+ vite@5.4.20(@types/node@22.18.6)(less@4.4.1)(sass@1.92.1)(terser@5.44.0):
+ dependencies:
+ esbuild: 0.25.3
+ postcss: 8.5.6
+ rollup: 4.50.2
+ optionalDependencies:
+ '@types/node': 22.18.6
+ fsevents: 2.3.3
+ less: 4.4.1
+ sass: 1.92.1
+ terser: 5.44.0
+
vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0):
dependencies:
esbuild: 0.25.3
@@ -21802,6 +21812,7 @@ snapshots:
sass: 1.92.1
terser: 5.44.0
yaml: 2.8.1
+ optional: true
vitepress-plugin-group-icons@1.6.3(markdown-it@14.1.0)(vite@5.4.20(@types/node@24.5.2)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)):
dependencies:
@@ -21908,7 +21919,7 @@ snapshots:
dependencies:
'@types/chai': 5.2.2
'@vitest/expect': 3.2.4
- '@vitest/mocker': 3.2.4(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))
+ '@vitest/mocker': 3.2.4(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(less@4.4.1)(sass@1.92.1)(terser@5.44.0)(yaml@2.8.1))
'@vitest/pretty-format': 3.2.4
'@vitest/runner': 3.2.4
'@vitest/snapshot': 3.2.4
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index ca8204c8ff393871b72f457c9294763ba807b117..66110d70a7105d760238ca9cfadf52cbb6280eb0 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -197,7 +197,7 @@ catalog:
unbuild: ^3.6.1
unplugin-element-plus: ^0.10.0
vee-validate: ^4.15.1
- vite: ^7.1.2
+ vite: ^5.4.10
vite-plugin-compression: ^0.5.1
vite-plugin-dts: ^4.5.4
vite-plugin-html: ^3.2.2