ykt-wxapp/pages/archive/verify-popup.vue

108 lines
2.8 KiB
Vue
Raw Permalink Normal View History

2026-01-19 18:52:18 +08:00
<template>
<uni-popup ref="popup" type="center" :mask-click="false">
<view class="bg-white rounded overflow-hidden" style="width: 690rpx;">
<view class="flex items-center justify-between px-15 py-12 border-b">
<view class="text-lg font-semibold text-dark">身份校验</view>
<uni-icons type="closeempty" :size="24" color="#999" @click="close"></uni-icons>
</view>
<view class="mt-15 px-15 pt-15 text-base text-dark">
请填写档案人身份证号后四位以确认身份
</view>
<view class="relative flex justify-between mt-15 px-15 py-12 overflow-hidden">
<view v-for="i in 4" :key="i"
class="flex items-center justify-center code-cell text-large font-semibold border-auto text-gray rounded"
:class="i === activeIndex ? 'text-primary' : 'text-gray'">
<text :class="i === activeIndex ? 'text-primary' : 'text-dark'">{{ validCodes[i - 1] || '' }}</text>
</view>
<input class="code-input" type="idcard" :focus="focus" @focus="onFocus" @blur="onBlur" v-model="codes" />
</view>
<view class="footer-buttons">
<button-footer hideden-shadow confirmText="确定" :showCancel="false" @confirm="confirm()" />
</view>
</view>
</uni-popup>
</template>
<script setup>
import { computed, ref, watch } from 'vue';
import { toast } from '@/utils/widget';
import ButtonFooter from '@/components/button-footer.vue';
const emits = defineEmits(['close', 'confirm'])
const props = defineProps({
corpName: {
type: String,
default: ''
},
customers: {
type: Array,
default: () => []
},
visible: {
type: Boolean,
default: false
}
})
const popup = ref()
const codes = ref('');
const validCodes = computed(() => codes.value.replace(/\s/g, '').split('').slice(0, 4));
const codeStr = computed(() => validCodes.value.join(''));
const activeIndex = computed(() => Math.min(validCodes.value.length + 1, 4))
const focus = ref(false)
const timer = ref(null)
function close() {
emits('close')
}
function confirm() {
if (props.customers.some(i => i._id === id.value && id.value)) {
emits('confirm', id.value)
} else {
toast('请选择档案')
}
}
function onFocus() {
focus.value = true
}
function onBlur() {
focus.value = false
}
watch(() => props.visible, n => {
if (n) {
codes.value = '';
popup.value && popup.value.open();
focus.value = false;
setTimeout(() => focus.value = true, 500)
} else {
popup.value && popup.value.close()
}
})
watch(codes, n => {
if (timer.value) clearTimeout(timer.value);
timer.value = setTimeout(() => {
codes.value = codeStr.value;
}, 500)
})
</script>
<style lang="scss" scoped>
.code-cell {
width: 120rpx;
height: 120rpx;
font-size: 52rpx;
}
.code-input {
position: absolute;
width: 200%;
height: 100%;
top: 0;
left: -100%;
}
</style>