Files
cashier_app/pageMarket/points/components/setting.vue
2025-12-12 11:31:53 +08:00

298 lines
6.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view class="form">
<u-form ref="formRef" :model="form" :rules="rules" label-width="200px" label-position="top">
<view class="card">
<u-form-item>
<view class="switch-wrap">
<view class="top">
<text class="t">开启积分</text>
<u-switch v-model="form.enableRewards" :active-value="1" :inactive-value="0"></u-switch>
</view>
<view class="info">
<text class="t">开启后所有用户可通过消费获得积分及可用积分抵扣支付</text>
</view>
</view>
</u-form-item>
</view>
<view class="card">
<u-form-item prop="consumeAmount">
<view class="switch-wrap">
<view class="top">
<text class="t">消费送积分</text>
</view>
<view class="info">
<text class="i">每消费</text>
<view class="ipt">
<u-input placeholder="请输入" :maxlength="8" v-model="form.consumeAmount" @change="consumeAmountInput">
<template #suffix>
<text></text>
</template>
</u-input>
</view>
<text class="i">获得1积分</text>
</view>
</view>
</u-form-item>
<u-form-item prop="minPaymentAmount">
<view class="switch-wrap">
<view class="top">
<text class="t">可抵扣门槛</text>
</view>
<view class="info">
<view class="ipt">
<u-input placeholder="请输入" :maxlength="8" v-model="form.minPaymentAmount" @change="minPaymentAmountInput">
<template #suffix>
<text></text>
</template>
</u-input>
</view>
</view>
</view>
</u-form-item>
<u-form-item prop="maxDeductionRatio">
<view class="switch-wrap">
<view class="top">
<text class="t">最高抵扣比例</text>
</view>
<view class="info">
<view class="ipt">
<u-input placeholder="请输入" :maxlength="8" v-model="form.maxDeductionRatio" @change="maxDeductionRatioInput">
<template #suffix>
<text>%</text>
</template>
</u-input>
</view>
</view>
</view>
</u-form-item>
<u-form-item prop="equivalentPoints">
<view class="switch-wrap">
<view class="top">
<text class="t">抵扣积分比例</text>
</view>
<view class="info">
<text class="i">1元等于</text>
<view class="ipt">
<u-input placeholder="请输入" :maxlength="8" v-model="form.equivalentPoints" @change="equivalentPointsInput">
<template #suffix>
<text>积分</text>
</template>
</u-input>
</view>
</view>
</view>
</u-form-item>
</view>
<view class="card">
<u-form-item>
<view class="switch-wrap">
<view class="top">
<text class="t">开启积分商城</text>
<u-switch v-model="form.enablePointsMall" :active-value="1" :inactive-value="0"></u-switch>
</view>
</view>
</u-form-item>
</view>
</u-form>
</view>
</template>
<script setup>
import { ref, onMounted } from 'vue';
import { filterNumberInput } from '@/utils/index.js';
import { pointsConfigPost, pointsConfigGet } from '@/http/api/market/point.js';
const formRef = ref(null);
const formObj = {
enableRewards: 0,
consumeAmount: '', // 每消费xx元赠送1积分
minPaymentAmount: '', // 下单实付抵扣门槛
maxDeductionRatio: 100, // 下单最高抵扣比例
equivalentPoints: '', // 下单抵扣积分比例 1元=?积分
enablePointsMall: 0 // 开启积分商城
};
const form = ref({ ...formObj });
const rules = ref({
consumeAmount: [
{
required: true,
trigger: ['blur'],
message: '请输入',
validator: (rule, value, callback) => {
if (form.value.consumeAmount < 0 || form.value.consumeAmount === '') {
return false;
} else {
return true;
}
}
}
],
minPaymentAmount: [
{
required: true,
trigger: ['blur'],
message: '请输入',
validator: (rule, value, callback) => {
if (form.value.minPaymentAmount < 0 || form.value.minPaymentAmount === '') {
return false;
} else {
return true;
}
}
}
],
maxDeductionRatio: [
{
required: true,
trigger: ['blur'],
message: '请输入',
validator: (rule, value, callback) => {
if (form.value.maxDeductionRatio < 0 || form.value.maxDeductionRatio === '') {
return false;
} else {
return true;
}
}
}
],
equivalentPoints: [
{
required: true,
trigger: ['blur'],
message: '请输入',
validator: (rule, value, callback) => {
if (form.value.equivalentPoints < 0 || form.value.equivalentPoints === '') {
return false;
} else {
return true;
}
}
}
]
});
function consumeAmountInput(e) {
setTimeout(() => {
form.value.consumeAmount = filterNumberInput(e);
}, 50);
}
function minPaymentAmountInput(e) {
setTimeout(() => {
form.value.minPaymentAmount = filterNumberInput(e);
}, 50);
}
function maxDeductionRatioInput(e) {
setTimeout(() => {
form.value.maxDeductionRatio = filterNumberInput(e, 1);
if (form.value.maxDeductionRatio > 100) {
form.value.maxDeductionRatio = 100;
}
}, 50);
}
function equivalentPointsInput(e) {
setTimeout(() => {
form.value.equivalentPoints = filterNumberInput(e, 1);
}, 50);
}
// 提交
function submitHandle() {
formRef.value
.validate()
.then(async () => {
try {
uni.showLoading({
title: '保存中...',
mask: true
});
await pointsConfigPost(form.value);
setTimeout(() => {
uni.showToast({
title: '保存成功',
icon: 'none'
});
}, 300);
} catch (error) {
console.log(error);
}
uni.hideLoading();
})
.catch(() => {});
}
// 获取配置
async function pointsConfigGetAjax() {
try {
uni.showLoading({
title: '加载中...',
mask: true
});
const res = await pointsConfigGet();
if (res == null || !res) {
form.value = { ...formObj };
} else {
form.value = res;
}
} catch (error) {
console.log(error);
}
setTimeout(() => {
uni.hideLoading();
}, 300);
}
defineExpose({
submitHandle
});
onMounted(() => {
pointsConfigGetAjax();
});
</script>
<style scoped lang="scss">
.card {
background-color: #fff;
border-radius: 20px;
padding: 28upx;
&:not(:last-child) {
margin-bottom: 28upx;
}
}
.switch-wrap {
flex: 1;
width: 100%;
.top {
display: flex;
align-items: center;
justify-content: space-between;
.t {
font-size: 32upx;
color: #333;
font-weight: bold;
}
}
.info {
padding-top: 16upx;
display: flex;
align-items: center;
gap: 16upx;
.i {
font-size: 28upx;
color: #666;
}
.ipt {
flex: 1;
}
.t {
font-size: 24upx;
color: #666;
}
}
}
</style>