fenghe-auction/app/pages/signature/panel/index.vue

118 lines
2.7 KiB
Vue
Raw Normal View History

2025-04-10 07:47:40 +00:00
<script setup>
import {showToast,showLoadingToast } from 'vant';
import {onMounted, onUnmounted, ref} from 'vue';
import {signOffline, signOnline} from "~/api/goods/index.js";
import {VueSignaturePad} from "vue-signature-pad";
import {authStore} from "~/stores/auth/index.js";
import {useI18n} from "vue-i18n";
const router = useRouter();
const {t:$t} = useI18n()
definePageMeta({
layout: ''
})
const { payment} = authStore()
const signaturePad = ref(null);
const imgUrl = ref('')
const clearSignature = () => {
signaturePad.value?.clearSignature();
};
const toast=ref(false)
const submitSignature = () => {
if (signaturePad.value?.isEmpty()) {
showToast($t('collectCode.signature.pleaseSign'));
return;
}
toast.value=showLoadingToast({
message: $t('common.loading'),
forbidClick: true,
});
const { data } = signaturePad.value?.saveSignature(); // 返回 base64 格式的图片数据
imgUrl.value = data;
confirm()
};
const confirm = async () => {
const res = await signOnline({
auctionArtworkUuid:payment.value.auctionArtworkUuid,
signImgFileData: imgUrl.value
})
if (res.status===0){
await router.push('/payment')
toast.value?.close()
}
}
const goBack = () => {
router.back()
}
</script>
<template>
<div class="signature-container">
<div class="flex flex-col h-100vh px-20px py-20px bg-gray w-100vw">
<client-only>
<VueSignaturePad
width="100%"
height="93%"
class="signature bg-#fff rounded-10px mb-10px"
ref="signaturePad"
/>
</client-only>
<div class="flex justify-evenly">
<van-button class="!h-40px mr-15px" type="primary" @click="goBack">
{{ $t('collectCode.signature.back') }}
</van-button>
<van-button class="!h-40px" type="warning" @click="clearSignature">
{{ $t('collectCode.signature.clear') }}
</van-button>
<van-button class="!h-40px" type="primary" @click="submitSignature">
{{ $t('collectCode.signature.confirm') }}
</van-button>
</div>
</div>
</div>
</template>
<style scoped>
.signature-container {
position: fixed;
inset: 0;
padding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) 0;
}
:deep(.van-button--mini+.van-button--mini) {
margin: 0;
}
:deep(.van-dialog__content) {
display: flex;
justify-content: center;
}
.signature-content {
display: flex;
height: 100%;
}
.control-buttons {
display: flex;
flex-direction: column;
padding: 0 10px 0;
gap: 10px;
}
.control-button {
width: 40px;
}
.orientation-hint {
position: fixed;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
background-color: #fff;
font-size: 18px;
}
</style>