Skip to content

Commit 27defa7

Browse files
YunaiVgitee-org
authored andcommitted
!291 满减页面布局
Merge pull request !291 from Bluemark/mall-backed
2 parents 188de10 + 7c8f7d5 commit 27defa7

File tree

2 files changed

+408
-0
lines changed

2 files changed

+408
-0
lines changed
Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
<template>
2+
<Dialog :title="dialogTitle" v-model="dialogVisible">
3+
<el-form
4+
ref="formRef"
5+
:model="formData"
6+
:rules="formRules"
7+
label-width="80px"
8+
v-loading="formLoading"
9+
>
10+
<el-form-item label="活动名称" prop="name">
11+
<el-input v-model="formData.name" placeholder="请输入活动名称" />
12+
</el-form-item>
13+
<el-form-item label="活动时间" prop="startAndEndTime">
14+
<el-date-picker
15+
v-model="formData.startAndEndTime"
16+
type="datetimerange"
17+
range-separator="-"
18+
:start-placeholder="t('common.startTimeText')"
19+
:end-placeholder="t('common.endTimeText')"
20+
/>
21+
</el-form-item>
22+
<el-form-item label="条件类型" prop="conditionType">
23+
<el-radio-group v-model="formData.conditionType">
24+
<el-radio
25+
v-for="dict in getIntDictOptions(DICT_TYPE.PROMOTION_CONDITION_TYPE)"
26+
:key="dict.value"
27+
:label="parseInt(dict.value)"
28+
>{{ dict.label }}</el-radio
29+
>
30+
</el-radio-group>
31+
</el-form-item>
32+
<el-form-item label="优惠设置">
33+
<!-- TODO 芋艿:待实现! -->
34+
</el-form-item>
35+
<el-form-item label="活动商品" prop="productScope">
36+
<el-radio-group v-model="formData.productScope">
37+
<el-radio
38+
v-for="dict in getIntDictOptions(DICT_TYPE.PROMOTION_PRODUCT_SCOPE)"
39+
:key="dict.value"
40+
:label="parseInt(dict.value)"
41+
>{{ dict.label }}</el-radio
42+
>
43+
</el-radio-group>
44+
</el-form-item>
45+
<el-form-item
46+
v-if="formData.productScope === PromotionProductScopeEnum.SPU.scope"
47+
prop="productSpuIds"
48+
>
49+
<el-select
50+
v-model="formData.productSpuIds"
51+
placeholder="请选择活动商品"
52+
clearable
53+
size="small"
54+
multiple
55+
filterable
56+
style="width: 400px"
57+
>
58+
<el-option v-for="item in productSpus" :key="item.id" :label="item.name" :value="item.id">
59+
<span style="float: left">{{ item.name }}</span>
60+
<span style="float: right; font-size: 13px; color: #8492a6"
61+
>¥{{ (item.price / 100.0).toFixed(2) }}</span
62+
>
63+
</el-option>
64+
</el-select>
65+
</el-form-item>
66+
<el-form-item label="备注" prop="remark">
67+
<el-input v-model="formData.remark" placeholder="请输入备注" />
68+
</el-form-item>
69+
</el-form>
70+
<template #footer>
71+
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
72+
<el-button @click="dialogVisible = false">取 消</el-button>
73+
</template>
74+
</Dialog>
75+
</template>
76+
<script lang="ts" setup>
77+
import { getSpuSimpleList } from '@/api/mall/product/spu'
78+
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
79+
import { CommonStatusEnum } from '@/utils/constants'
80+
import * as ProductBrandApi from '@/api/mall/product/brand'
81+
import {
82+
PromotionConditionTypeEnum,
83+
PromotionProductScopeEnum,
84+
PromotionActivityStatusEnum
85+
} from '@/utils/constants'
86+
// 商品数据
87+
const productSpus = ref<any[]>([])
88+
89+
/** 初始化 **/
90+
onMounted(() => {
91+
getSpuSimpleList().then((response) => {
92+
productSpus.value = response
93+
})
94+
})
95+
defineOptions({ name: 'ProductBrandForm' })
96+
97+
const { t } = useI18n() // 国际化
98+
const message = useMessage() // 消息弹窗
99+
100+
const dialogVisible = ref(false) // 弹窗的是否展示
101+
const dialogTitle = ref('') // 弹窗的标题
102+
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
103+
const formType = ref('') // 表单的类型:create - 新增;update - 修改
104+
const formData = ref({
105+
id: undefined,
106+
name: undefined,
107+
startAndEndTime: undefined,
108+
startTime: undefined,
109+
endTime: undefined,
110+
conditionType: PromotionConditionTypeEnum.PRICE.type,
111+
remark: undefined,
112+
productScope: PromotionProductScopeEnum.ALL.scope,
113+
productSpuIds: undefined,
114+
rules: undefined
115+
})
116+
const formRules = reactive({
117+
name: [{ required: true, message: '活动名称不能为空', trigger: 'blur' }],
118+
startAndEndTime: [{ required: true, message: '活动时间不能为空', trigger: 'blur' }],
119+
conditionType: [{ required: true, message: '条件类型不能为空', trigger: 'change' }],
120+
productScope: [{ required: true, message: '商品范围不能为空', trigger: 'blur' }],
121+
productSpuIds: [{ required: true, message: '商品范围不能为空', trigger: 'blur' }]
122+
})
123+
const formRef = ref() // 表单 Ref
124+
125+
/** 打开弹窗 */
126+
const open = async (type: string, id?: number) => {
127+
dialogVisible.value = true
128+
dialogTitle.value = t('action.' + type)
129+
formType.value = type
130+
resetForm()
131+
// 修改时,设置数据
132+
if (id) {
133+
formLoading.value = true
134+
try {
135+
// formData.value = await ProductBrandApi.getBrand(id)
136+
formData.value = {
137+
conditionType: 10,
138+
description: '',
139+
id: undefined,
140+
name: '测试活动',
141+
picUrl: '',
142+
productScope: 2,
143+
productSpuIds: [634],
144+
remark: '测试备注',
145+
startAndEndTime: [new Date(), new Date('2023-12-31')],
146+
status: 0
147+
}
148+
} finally {
149+
formLoading.value = false
150+
}
151+
}
152+
}
153+
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
154+
155+
/** 提交表单 */
156+
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
157+
const submitForm = async () => {
158+
// 校验表单
159+
if (!formRef) return
160+
const valid = await formRef.value.validate()
161+
if (!valid) return
162+
console.log(formData.value)
163+
message.success('已在控制台打印数据')
164+
return
165+
// 提交请求
166+
formLoading.value = true
167+
try {
168+
const data = formData.value as ProductBrandApi.BrandVO
169+
if (formType.value === 'create') {
170+
await ProductBrandApi.createBrand(data)
171+
message.success(t('common.createSuccess'))
172+
} else {
173+
await ProductBrandApi.updateBrand(data)
174+
message.success(t('common.updateSuccess'))
175+
}
176+
dialogVisible.value = false
177+
// 发送操作成功的事件
178+
emit('success')
179+
} finally {
180+
formLoading.value = false
181+
}
182+
}
183+
184+
/** 重置表单 */
185+
const resetForm = () => {
186+
formData.value = {
187+
id: undefined,
188+
name: '',
189+
picUrl: '',
190+
status: CommonStatusEnum.ENABLE,
191+
description: ''
192+
}
193+
formRef.value?.resetFields()
194+
}
195+
</script>

0 commit comments

Comments
 (0)