diff --git a/apps/web-antd/src/views/_core/profile/modules/user-social.vue b/apps/web-antd/src/views/_core/profile/modules/user-social.vue index 8a34b1779..ddb806567 100644 --- a/apps/web-antd/src/views/_core/profile/modules/user-social.vue +++ b/apps/web-antd/src/views/_core/profile/modules/user-social.vue @@ -100,7 +100,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ toolbarConfig: { enabled: false, }, - } as VxeTableGridOptions, + }, }); /** 解绑账号 */ diff --git a/apps/web-antd/src/views/mall/promotion/discountActivity/data.ts b/apps/web-antd/src/views/mall/promotion/discountActivity/data.ts index f9f170845..db639dcb2 100644 --- a/apps/web-antd/src/views/mall/promotion/discountActivity/data.ts +++ b/apps/web-antd/src/views/mall/promotion/discountActivity/data.ts @@ -73,7 +73,6 @@ export function useFormSchema(): VbenFormSchema[] { fieldName: 'spuIds', label: '活动商品', component: 'Input', - rules: 'required', formItemClass: 'col-span-2', }, ]; diff --git a/apps/web-antd/src/views/mall/promotion/discountActivity/modules/form.vue b/apps/web-antd/src/views/mall/promotion/discountActivity/modules/form.vue index 6f8bc9a47..62ed7a326 100644 --- a/apps/web-antd/src/views/mall/promotion/discountActivity/modules/form.vue +++ b/apps/web-antd/src/views/mall/promotion/discountActivity/modules/form.vue @@ -1,30 +1,52 @@ diff --git a/apps/web-antd/src/views/mall/promotion/rewardActivity/data.ts b/apps/web-antd/src/views/mall/promotion/rewardActivity/data.ts index 613a4a7e7..c1232e43f 100644 --- a/apps/web-antd/src/views/mall/promotion/rewardActivity/data.ts +++ b/apps/web-antd/src/views/mall/promotion/rewardActivity/data.ts @@ -138,6 +138,7 @@ export function useFormSchema(): VbenFormSchema[] { componentProps: { showTime: true, format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'x', placeholder: [ $t('utils.rangePicker.beginTime'), $t('utils.rangePicker.endTime'), @@ -217,13 +218,15 @@ export function useFormSchema(): VbenFormSchema[] { }, rules: 'required', }, - // TODO @puhui999:1)新增时:一直报:“请输入优惠设置”;2)修改老数据,出现报“请求参数类型错误:50.00”; { fieldName: 'rules', label: '优惠设置', component: 'Input', formItemClass: 'items-start', - rules: 'required', + rules: z + .array(z.any()) + .min(1, { message: '请添加至少一条优惠规则' }) + .default([]), }, { fieldName: 'productScopeValues', // 隐藏字段:用于自动同步 productScopeValues diff --git a/apps/web-antd/src/views/mall/promotion/rewardActivity/modules/form.vue b/apps/web-antd/src/views/mall/promotion/rewardActivity/modules/form.vue index 99e323193..de911c629 100644 --- a/apps/web-antd/src/views/mall/promotion/rewardActivity/modules/form.vue +++ b/apps/web-antd/src/views/mall/promotion/rewardActivity/modules/form.vue @@ -8,10 +8,9 @@ import { PromotionConditionTypeEnum, PromotionProductScopeEnum, } from '@vben/constants'; -import { convertToInteger, formatToFraction } from '@vben/utils'; +import { cloneDeep, convertToInteger, formatToFraction } from '@vben/utils'; import { message } from 'ant-design-vue'; -import dayjs from 'dayjs'; import { useVbenForm } from '#/adapter/form'; import { @@ -53,6 +52,8 @@ const [Form, formApi] = useVbenForm({ const [Modal, modalApi] = useVbenModal({ async onConfirm() { + // 在验证前同步 formData.rules 到表单中 + await formApi.setFieldValue('rules', formData.value.rules || []); const { valid } = await formApi.validate(); if (!valid) { return; @@ -61,18 +62,24 @@ const [Modal, modalApi] = useVbenModal({ // 提交表单 try { const values = await formApi.getValues(); - const data = { ...formData.value, ...values }; + // 使用 formData.value 作为基础,确保 rules 来自 formData + const data = { ...values, ...formData.value }; if (data.startAndEndTime && Array.isArray(data.startAndEndTime)) { data.startTime = data.startAndEndTime[0]; data.endTime = data.startAndEndTime[1]; delete data.startAndEndTime; } - data.rules?.forEach((item: any) => { + // 深拷贝 rules 避免修改原始数据 + const rules = cloneDeep( + data.rules, + ) as unknown as MallRewardActivityApi.RewardRule[]; + rules.forEach((item: any) => { item.discountPrice = convertToInteger(item.discountPrice || 0); if (data.conditionType === PromotionConditionTypeEnum.PRICE.type) { item.limit = convertToInteger(item.limit || 0); } }); + data.rules = rules; await (data.id ? updateRewardActivity(data as MallRewardActivityApi.RewardActivity) : createRewardActivity(data as MallRewardActivityApi.RewardActivity)); @@ -97,9 +104,10 @@ const [Modal, modalApi] = useVbenModal({ modalApi.lock(); try { const result = await getReward(data.id); + // valueFormat: 'x' 配置下,直接使用时间戳 result.startAndEndTime = [ - result.startTime ? dayjs(result.startTime) : undefined, - result.endTime ? dayjs(result.endTime) : undefined, + result.startTime ? String(result.startTime) : undefined, + result.endTime ? String(result.endTime) : undefined, ] as any[]; result.rules?.forEach((item: any) => { item.discountPrice = formatToFraction(item.discountPrice || 0); diff --git a/apps/web-ele/src/components/cropper/cropper-avatar.vue b/apps/web-ele/src/components/cropper/cropper-avatar.vue index e50085f3c..894169844 100644 --- a/apps/web-ele/src/components/cropper/cropper-avatar.vue +++ b/apps/web-ele/src/components/cropper/cropper-avatar.vue @@ -18,7 +18,7 @@ const props = withDefaults(defineProps(), { width: 200, value: '', showBtn: true, - btnProps: () => ({}), + btnProps: () => ({}) as any, btnText: '', uploadApi: () => Promise.resolve(), size: 5, @@ -27,14 +27,10 @@ const props = withDefaults(defineProps(), { const emit = defineEmits(['update:value', 'change']); const sourceValue = ref(props.value || ''); -// TODO @puhui999:这个有办法去掉么? -const prefixCls = 'cropper-avatar'; const [CropperModal, modalApi] = useVbenModal({ connectedComponent: cropperModal, }); -const getClass = computed(() => [prefixCls]); - const getWidth = computed(() => `${`${props.width}`.replace(/px/, '')}px`); const getIconWidth = computed( @@ -74,34 +70,41 @@ defineExpose({ - - diff --git a/apps/web-ele/src/components/cropper/cropper-modal.vue b/apps/web-ele/src/components/cropper/cropper-modal.vue index 1d949c0aa..2c631185c 100644 --- a/apps/web-ele/src/components/cropper/cropper-modal.vue +++ b/apps/web-ele/src/components/cropper/cropper-modal.vue @@ -36,7 +36,6 @@ const cropper = ref(); let scaleX = 1; let scaleY = 1; -const prefixCls = 'cropper-am'; const [Modal, modalApi] = useVbenModal({ onConfirm: handleOk, onOpenChange(isOpen) { @@ -120,11 +119,34 @@ async function handleOk() { :title="$t('ui.cropper.modalTitle')" class="w-[800px]" > -
+
-
+
-
+
-
+
-
+
-
+
- - diff --git a/apps/web-ele/src/components/cropper/cropper.vue b/apps/web-ele/src/components/cropper/cropper.vue index d371e4a45..5cdf1bc36 100644 --- a/apps/web-ele/src/components/cropper/cropper.vue +++ b/apps/web-ele/src/components/cropper/cropper.vue @@ -33,8 +33,6 @@ const imgElRef = ref>(); const cropper = ref(); const isReady = ref(false); -// TODO @puhui999:这个有办法去掉么? -const prefixCls = 'cropper-image'; const debounceRealTimeCropped = useDebounceFn(realTimeCropped, 80); const getImageStyle = computed((): CSSProperties => { @@ -47,10 +45,9 @@ const getImageStyle = computed((): CSSProperties => { const getClass = computed(() => { return [ - prefixCls, attrs.class, { - [`${prefixCls}--circled`]: props.circled, + 'cropper-image--circled': props.circled, }, ]; }); @@ -158,6 +155,7 @@ function getRoundedCanvas() { :crossorigin="crossorigin" :src="src" :style="getImageStyle" + class="h-auto max-w-full" />
diff --git a/apps/web-ele/src/components/form-create/rules/data.ts b/apps/web-ele/src/components/form-create/rules/data.ts index fa89ec654..2c6cee2ce 100644 --- a/apps/web-ele/src/components/form-create/rules/data.ts +++ b/apps/web-ele/src/components/form-create/rules/data.ts @@ -121,7 +121,7 @@ const apiSelectRule = [ field: 'data', title: '请求参数 JSON 格式', props: { - autosize: true, // TODO @puhui999:这里时 autoSize 还是 autosize 哈?和 antd 不同 + autosize: true, type: 'textarea', placeholder: '{"type": 1}', }, @@ -155,7 +155,7 @@ const apiSelectRule = [ info: `data 为接口返回值,需要写一个匿名函数解析返回值为选择器 options 列表 (data: any)=>{ label: string; value: any }[]`, props: { - autosize: true, // TODO @puhui999:这里时 autoSize 还是 autosize 哈?和 antd 不同 + autosize: true, rows: { minRows: 2, maxRows: 6 }, type: 'textarea', placeholder: ` diff --git a/apps/web-ele/src/components/form-create/rules/use-dict-select.ts b/apps/web-ele/src/components/form-create/rules/use-dict-select.ts index b77af4464..e9eb46e9d 100644 --- a/apps/web-ele/src/components/form-create/rules/use-dict-select.ts +++ b/apps/web-ele/src/components/form-create/rules/use-dict-select.ts @@ -39,7 +39,7 @@ export function useDictSelectRule() { title: label, info: '', $required: false, - // TODO @puhui999:vben 版本里,这里有个 modelField: 'value', 需要添加么? + modelField: 'model-value', }; }, props(_: any, { t }: any) { diff --git a/apps/web-ele/src/views/_core/profile/modules/base-info.vue b/apps/web-ele/src/views/_core/profile/modules/base-info.vue index c97d12646..39b5b4856 100644 --- a/apps/web-ele/src/views/_core/profile/modules/base-info.vue +++ b/apps/web-ele/src/views/_core/profile/modules/base-info.vue @@ -21,10 +21,13 @@ const emit = defineEmits<{ (e: 'success'): void; }>(); -// TODO @puhui999:展示貌似不太对;应该是左右,不是上下哈 const [Form, formApi] = useVbenForm({ commonConfig: { - labelWidth: 70, + componentProps: { + class: 'w-full', + }, + formItemClass: 'col-span-2', + labelWidth: 80, }, schema: [ { diff --git a/apps/web-ele/src/views/_core/profile/modules/profile-user.vue b/apps/web-ele/src/views/_core/profile/modules/profile-user.vue index 675bb131c..fbf7c6fc4 100644 --- a/apps/web-ele/src/views/_core/profile/modules/profile-user.vue +++ b/apps/web-ele/src/views/_core/profile/modules/profile-user.vue @@ -25,7 +25,6 @@ const avatar = computed( () => props.profile?.avatar || preferences.app.defaultAvatar, ); -// TODO @puhui999:头像上传没跑通 async function handelUpload({ file, filename, @@ -37,9 +36,9 @@ async function handelUpload({ const { httpRequest } = useUpload(); // 将 Blob 转换为 File const fileObj = new File([file], filename, { type: file.type }); - const avatar = await httpRequest(fileObj); - // 2. 更新用户头像 - await updateUserProfile({ avatar }); + const res = await httpRequest(fileObj); + // 2. 更新用户头像(httpRequest 返回 { url: string }) + await updateUserProfile({ avatar: res.url }); } @@ -57,8 +56,8 @@ async function handelUpload({
- - + + - {{ profile.posts.map((post) => post.name).join(',') }} + {{ + profile.posts && profile.posts.length > 0 + ? profile.posts.map((post) => post.name).join(',') + : '-' + }}