Merge branch 'fix/promotion-datetime-format'

This commit is contained in:
田香琪
2026-07-28 10:30:44 +08:00
3 changed files with 89 additions and 14 deletions

View File

@@ -197,6 +197,7 @@ export default {
mobile: "", mobile: "",
}, },
verifyStatus: false, // 是否图片验证通过 verifyStatus: false, // 是否图片验证通过
codeSent: false, // 是否已成功发送短信验证码
ruleInline: { ruleInline: {
// 验证规则 // 验证规则
username: [{required: true, message: "请输入用户名"}], username: [{required: true, message: "请输入用户名"}],
@@ -237,7 +238,15 @@ export default {
if (this.type) { if (this.type) {
this.$refs.verify?.init(); this.$refs.verify?.init();
} else { } else {
let data = JSON.parse(JSON.stringify(this.formSms)); if (!this.verifyStatus) {
Message.warning("请先完成安全验证");
return;
}
if (!this.codeSent) {
Message.warning("请先获取短信验证码");
return;
}
const data = JSON.parse(JSON.stringify(this.formSms));
apiLogin.smsLogin(data).then((res) => { apiLogin.smsLogin(data).then((res) => {
this.hideVerify(); this.hideVerify();
if (res.success) { if (res.success) {
@@ -262,7 +271,7 @@ export default {
} else { } else {
Message.error(res.message); Message.error(res.message);
} }
}); }).catch(() => {});
} }
} }
}); });
@@ -285,6 +294,7 @@ export default {
sendSms(params).then((res) => { sendSms(params).then((res) => {
if (res.success) { if (res.success) {
Message.success("验证码发送成功"); Message.success("验证码发送成功");
this.codeSent = true;
let that = this; let that = this;
this.interval = setInterval(() => { this.interval = setInterval(() => {
that.time--; that.time--;
@@ -292,6 +302,7 @@ export default {
that.time = 60; that.time = 60;
that.codeMsg = "重新发送"; that.codeMsg = "重新发送";
that.verifyStatus = false; that.verifyStatus = false;
that.codeSent = false;
clearInterval(that.interval); clearInterval(that.interval);
} else { } else {
that.codeMsg = that.time; that.codeMsg = that.time;
@@ -300,7 +311,7 @@ export default {
} else { } else {
Message.warning(res.message); Message.warning(res.message);
} }
}); }).catch(() => {});
} }
}, },
verifyChange(con) { verifyChange(con) {
@@ -453,11 +464,19 @@ export default {
this.$refs.formSms.resetFields(); this.$refs.formSms.resetFields();
} }
this.verifyStatus = false; this.verifyStatus = false;
this.codeSent = false;
this.hideVerify(); this.hideVerify();
clearInterval(this.interval); clearInterval(this.interval);
this.codeMsg = "发送验证码"; this.codeMsg = "发送验证码";
this.time = 60; this.time = 60;
}, },
"formSms.mobile"() {
this.codeSent = false;
this.verifyStatus = false;
clearInterval(this.interval);
this.codeMsg = "发送验证码";
this.time = 60;
},
}, },
}; };
</script> </script>

View File

@@ -6,7 +6,14 @@
<el-input v-model="form.promotionName" style="width: 320px" /> <el-input v-model="form.promotionName" style="width: 320px" />
</el-form-item> </el-form-item>
<el-form-item label="活动时间" required> <el-form-item label="活动时间" required>
<el-date-picker v-model="form.rangeTime" type="datetimerange" style="width: 360px" /> <el-date-picker
v-model="form.rangeTime"
class="flash-discount-range-picker"
type="datetimerange"
format="YYYY-MM-DD HH:mm:ss"
start-placeholder="开始时间"
end-placeholder="结束时间"
/>
</el-form-item> </el-form-item>
<el-form-item label="限购数量"> <el-form-item label="限购数量">
<el-input-number v-model="form.limitNum" :min="0" /> <span class="tip">0 表示不限</span> <el-input-number v-model="form.limitNum" :min="0" /> <span class="tip">0 表示不限</span>
@@ -16,12 +23,17 @@
</el-form-item> </el-form-item>
<el-form-item label="活动商品"> <el-form-item label="活动商品">
<el-button type="primary" @click="openGoods">选择商品</el-button> <el-button type="primary" @click="openGoods">选择商品</el-button>
<el-table v-if="form.promotionGoodsList.length" :data="form.promotionGoodsList" border class="mt_10"> <el-table
<el-table-column prop="goodsName" label="商品" /> v-if="form.promotionGoodsList.length"
<el-table-column prop="originalPrice" label="原价" width="100" /> :data="form.promotionGoodsList"
<el-table-column label="活动价" width="140"> border
class="mt_10 flash-discount-goods-table"
>
<el-table-column prop="goodsName" label="商品" width="180" show-overflow-tooltip />
<el-table-column prop="originalPrice" label="原价" width="90" align="center" />
<el-table-column label="活动价" width="150" align="center">
<template #default="{ row }"> <template #default="{ row }">
<el-input-number v-model="row.price" :min="0.01" :precision="2" /> <el-input-number v-model="row.price" :min="0.01" :precision="2" size="small" />
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -83,9 +95,18 @@ export default {
submit() { submit() {
const payload = { ...this.form }; const payload = { ...this.form };
if (payload.rangeTime && payload.rangeTime.length === 2) { if (payload.rangeTime && payload.rangeTime.length === 2) {
payload.startTime = payload.rangeTime[0]; const start =
payload.endTime = payload.rangeTime[1]; payload.rangeTime[0] instanceof Date
? payload.rangeTime[0]
: new Date(payload.rangeTime[0]);
const end =
payload.rangeTime[1] instanceof Date
? payload.rangeTime[1]
: new Date(payload.rangeTime[1]);
payload.startTime = this.$filters.unixToDate(start.getTime() / 1000);
payload.endTime = this.$filters.unixToDate(end.getTime() / 1000);
} }
delete payload.rangeTime;
const req = payload.id ? editFlashDiscount(payload) : saveFlashDiscount(payload); const req = payload.id ? editFlashDiscount(payload) : saveFlashDiscount(payload);
req.then((res) => { req.then((res) => {
if (res.success) { if (res.success) {
@@ -101,4 +122,16 @@ export default {
<style scoped> <style scoped>
.tip { margin-left: 8px; color: #999; } .tip { margin-left: 8px; color: #999; }
.mt_10 { margin-top: 10px; } .mt_10 { margin-top: 10px; }
:deep(.flash-discount-range-picker.el-date-editor--datetimerange) {
width: 380px;
max-width: 380px;
flex-grow: 0;
--el-date-editor-width: 380px;
}
.flash-discount-goods-table {
width: fit-content;
max-width: 100%;
}
</style> </style>

View File

@@ -6,7 +6,14 @@
<el-input v-model="form.promotionName" style="width: 320px" /> <el-input v-model="form.promotionName" style="width: 320px" />
</el-form-item> </el-form-item>
<el-form-item label="活动时间" required> <el-form-item label="活动时间" required>
<el-date-picker v-model="form.rangeTime" type="datetimerange" style="width: 360px" /> <el-date-picker
v-model="form.rangeTime"
class="nth-item-range-picker"
type="datetimerange"
format="YYYY-MM-DD HH:mm:ss"
start-placeholder="开始时间"
end-placeholder="结束时间"
/>
</el-form-item> </el-form-item>
<el-form-item label="第N件" required> <el-form-item label="第N件" required>
<el-input-number v-model="form.nthNum" :min="2" /> <el-input-number v-model="form.nthNum" :min="2" />
@@ -92,9 +99,18 @@ export default {
submit() { submit() {
const payload = { ...this.form }; const payload = { ...this.form };
if (payload.rangeTime && payload.rangeTime.length === 2) { if (payload.rangeTime && payload.rangeTime.length === 2) {
payload.startTime = payload.rangeTime[0]; const start =
payload.endTime = payload.rangeTime[1]; payload.rangeTime[0] instanceof Date
? payload.rangeTime[0]
: new Date(payload.rangeTime[0]);
const end =
payload.rangeTime[1] instanceof Date
? payload.rangeTime[1]
: new Date(payload.rangeTime[1]);
payload.startTime = this.$filters.unixToDate(start.getTime() / 1000);
payload.endTime = this.$filters.unixToDate(end.getTime() / 1000);
} }
delete payload.rangeTime;
const req = payload.id ? editNthItemDiscount(payload) : saveNthItemDiscount(payload); const req = payload.id ? editNthItemDiscount(payload) : saveNthItemDiscount(payload);
req.then((res) => { req.then((res) => {
if (res.success) { if (res.success) {
@@ -110,4 +126,11 @@ export default {
<style scoped> <style scoped>
.tip { margin-left: 8px; color: #999; } .tip { margin-left: 8px; color: #999; }
.mt_10 { margin-top: 10px; } .mt_10 { margin-top: 10px; }
:deep(.nth-item-range-picker.el-date-editor--datetimerange) {
width: 380px;
max-width: 380px;
flex-grow: 0;
--el-date-editor-width: 380px;
}
</style> </style>