From 6922ab13fc03a578dcdfff08cb1e4b8cc770ebc6 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Sat, 20 Dec 2025 08:24:30 +0800 Subject: [PATCH 01/16] =?UTF-8?q?feat=EF=BC=9A=E3=80=90antd=E3=80=91?= =?UTF-8?q?=E3=80=90mall=E3=80=91bargain=20=E4=BC=98=E5=8C=96=E5=AE=8C?= =?UTF-8?q?=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/product/comment/modules/form.vue | 6 +- .../product/spu/components/spu-showcase.vue | 9 +- .../src/views/mall/product/spu/form/index.vue | 58 ++- .../mall/promotion/bargain/activity/data.ts | 53 +-- .../bargain/activity/modules/form.vue | 390 ++++++++++-------- 5 files changed, 275 insertions(+), 241 deletions(-) diff --git a/apps/web-antd/src/views/mall/product/comment/modules/form.vue b/apps/web-antd/src/views/mall/product/comment/modules/form.vue index 3ff475282..0599f5977 100644 --- a/apps/web-antd/src/views/mall/product/comment/modules/form.vue +++ b/apps/web-antd/src/views/mall/product/comment/modules/form.vue @@ -99,16 +99,14 @@ const [Modal, modalApi] = useVbenModal({ }, async onOpenChange(isOpen: boolean) { if (!isOpen) { + // 关闭时重置表单状态 selectedSku.value = undefined; + await formApi.setValues({ spuId: undefined, skuId: undefined }); return; } // 加载数据 const data = modalApi.getData(); if (!data || !data.id) { - // 新建模式:重置表单 - // TODO @puhui999:这里的重置,可以统一到 103 行那么? - selectedSku.value = undefined; - await formApi.setValues({ spuId: undefined, skuId: undefined }); return; } // 编辑模式:加载数据 diff --git a/apps/web-antd/src/views/mall/product/spu/components/spu-showcase.vue b/apps/web-antd/src/views/mall/product/spu/components/spu-showcase.vue index 1c508cc7e..17e405bfb 100644 --- a/apps/web-antd/src/views/mall/product/spu/components/spu-showcase.vue +++ b/apps/web-antd/src/views/mall/product/spu/components/spu-showcase.vue @@ -4,7 +4,7 @@ import type { MallSpuApi } from '#/api/mall/product/spu'; import { computed, ref, watch } from 'vue'; -import { CloseCircleFilled, PlusOutlined } from '@vben/icons'; +import { IconifyIcon } from '@vben/icons'; import { Image, Tooltip } from 'ant-design-vue'; @@ -110,9 +110,9 @@ function emitSpuChange() { class="h-full w-full rounded-lg object-cover" /> - - @@ -126,8 +126,7 @@ function emitSpuChange() { class="flex h-[60px] w-[60px] cursor-pointer items-center justify-center rounded-lg border-2 border-dashed transition-colors hover:border-primary hover:bg-primary/5" @click="handleOpenSpuSelect" > - - + diff --git a/apps/web-antd/src/views/mall/product/spu/form/index.vue b/apps/web-antd/src/views/mall/product/spu/form/index.vue index c2f5e3061..0d654b318 100644 --- a/apps/web-antd/src/views/mall/product/spu/form/index.vue +++ b/apps/web-antd/src/views/mall/product/spu/form/index.vue @@ -32,30 +32,6 @@ const spuId = ref(); const { params, name } = useRoute(); const { closeCurrentTab } = useTabs(); const activeTabName = ref('info'); -// TODO @puhui999:这个要不要类似 ele 里,直接写到 html 里? -const tabList = ref([ - { - key: 'info', - tab: '基础设置', - }, - { - key: 'sku', - tab: '价格库存', - }, - { - key: 'delivery', - tab: '物流设置', - }, - { - key: 'description', - tab: '商品详情', - }, - { - key: 'other', - tab: '其它设置', - }, -]); - const formLoading = ref(false); // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用 const isDetail = ref(name === 'ProductSpuDetail'); // 是否查看详情 const skuListRef = ref(); // 商品属性列表 Ref @@ -95,22 +71,22 @@ const propertyList = ref([]); // 商品属性列表 const ruleConfig: RuleConfig[] = [ { name: 'stock', - rule: (arg) => arg >= 0, + rule: (arg: number) => arg >= 0, message: '商品库存必须大于等于 1 !!!', }, { name: 'price', - rule: (arg) => arg >= 0.01, + rule: (arg: number) => arg >= 0.01, message: '商品销售价格必须大于等于 0.01 元!!!', }, { name: 'marketPrice', - rule: (arg) => arg >= 0.01, + rule: (arg: number) => arg >= 0.01, message: '商品市场价格必须大于等于 0.01 元!!!', }, { name: 'costPrice', - rule: (arg) => arg >= 0.01, + rule: (arg: number) => arg >= 0.01, message: '商品成本价格必须大于等于 0.00 元!!!', }, ]; // sku 相关属性校验规则 @@ -222,7 +198,7 @@ async function handleSubmit() { item.secondBrokeragePrice = convertToInteger(item.secondBrokeragePrice); }); } - // 处理轮播图列表 TODO @puhui999:这个是必须的哇? + // 处理轮播图列表:上传组件可能返回对象或字符串,统一处理成字符串数组 const newSliderPicUrls: any[] = []; values.sliderPicUrls!.forEach((item: any) => { // 如果是前端选的图 @@ -344,7 +320,28 @@ onMounted(async () => { @@ -410,7 +407,6 @@ onMounted(async () => { diff --git a/apps/web-ele/src/views/mall/product/spu/form/modules/product-attributes.vue b/apps/web-ele/src/views/mall/product/spu/form/modules/product-attributes.vue index a81137fd0..e92e00237 100644 --- a/apps/web-ele/src/views/mall/product/spu/form/modules/product-attributes.vue +++ b/apps/web-ele/src/views/mall/product/spu/form/modules/product-attributes.vue @@ -215,18 +215,17 @@ async function getAttributeOptions(propertyId: number) {
- + 添加
diff --git a/apps/web-ele/src/views/mall/product/spu/form/modules/product-property-add-form.vue b/apps/web-ele/src/views/mall/product/spu/form/modules/product-property-add-form.vue index b45bd92c9..789ecd139 100644 --- a/apps/web-ele/src/views/mall/product/spu/form/modules/product-property-add-form.vue +++ b/apps/web-ele/src/views/mall/product/spu/form/modules/product-property-add-form.vue @@ -61,9 +61,9 @@ const formSchema: VbenFormSchema[] = [ })); }, filterable: true, + allowCreate: true, placeholder: '请选择属性名称。如果不存在,可手动输入选择', multiple: true, - allowCreate: true, clearable: true, }, rules: 'required', From d3a7a874a6d0c0e328e224b71891e4ee9f3f0df3 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Sat, 20 Dec 2025 10:04:24 +0800 Subject: [PATCH 07/16] =?UTF-8?q?feat=EF=BC=9A=E3=80=90ele=E3=80=91?= =?UTF-8?q?=E3=80=90mall=E3=80=91comment=20=E4=BB=A3=E7=A0=81=E5=AF=B9?= =?UTF-8?q?=E9=BD=90=20antd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/mall/product/comment/data.ts | 22 +++-- .../src/views/mall/product/comment/index.vue | 21 ++-- .../mall/product/comment/modules/form.vue | 96 ++++++++++++++++++- 3 files changed, 115 insertions(+), 24 deletions(-) diff --git a/apps/web-ele/src/views/mall/product/comment/data.ts b/apps/web-ele/src/views/mall/product/comment/data.ts index 7a3641ef2..e3f895801 100644 --- a/apps/web-ele/src/views/mall/product/comment/data.ts +++ b/apps/web-ele/src/views/mall/product/comment/data.ts @@ -3,7 +3,6 @@ import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { MallCommentApi } from '#/api/mall/product/comment'; import { z } from '#/adapter/form'; -import { getSpuSimpleList } from '#/api/mall/product/spu'; import { getRangePickerDefaultProps } from '#/utils'; /** 新增/修改的表单 */ @@ -17,19 +16,28 @@ export function useFormSchema(): VbenFormSchema[] { show: () => false, }, }, - // TODO @puhui999:商品的选择 { fieldName: 'spuId', label: '商品', - component: 'ApiSelect', + component: 'Input', componentProps: { - api: getSpuSimpleList, - labelField: 'name', - valueField: 'id', placeholder: '请选择商品', }, rules: 'required', }, + { + fieldName: 'skuId', + label: '商品规格', + component: 'Input', + componentProps: { + placeholder: '请选择商品规格', + }, + dependencies: { + triggerFields: ['spuId'], + show: (values) => !!values.spuId, + }, + rules: 'required', + }, { fieldName: 'userAvatar', label: '用户头像', @@ -88,7 +96,7 @@ export function useGridFormSchema(): VbenFormSchema[] { { fieldName: 'replyStatus', label: '回复状态', - component: 'Select', + component: 'RadioGroup', componentProps: { options: [ { label: '已回复', value: true }, diff --git a/apps/web-ele/src/views/mall/product/comment/index.vue b/apps/web-ele/src/views/mall/product/comment/index.vue index 373dbe7c0..3c39a767c 100644 --- a/apps/web-ele/src/views/mall/product/comment/index.vue +++ b/apps/web-ele/src/views/mall/product/comment/index.vue @@ -2,8 +2,6 @@ import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { MallCommentApi } from '#/api/mall/product/comment'; -import { h } from 'vue'; - import { confirm, DocAlert, Page, prompt, useVbenModal } from '@vben/common-ui'; import { ElInput, ElMessage, ElRate } from 'element-plus'; @@ -37,17 +35,17 @@ function handleCreate() { /** 回复评价 */ function handleReply(row: MallCommentApi.Comment) { prompt({ - component: () => { - return h(ElInput, { - type: 'textarea', - placeholder: '请输入回复内容', - }); + component: ElInput, + componentProps: { + type: 'textarea', + placeholder: '请输入回复内容', + rows: 4, }, content: row.content ? `用户评论:${row.content}\n请输入回复内容:` : '请输入回复内容:', title: '回复评论', - modelPropName: 'value', + modelPropName: 'modelValue', }).then(async (val) => { if (val) { await replyComment({ @@ -127,10 +125,10 @@ const [Grid, gridApi] = useVbenVxeGrid({