index.vue 4.75 KB
<!--
 * @Date: 2024-01-15 16:35:10
 * @LastEditors: hookehuyr hookehuyr@gmail.com
 * @LastEditTime: 2026-01-06 23:28:40
 * @FilePath: /xyxBooking-weapp/src/pages/addVisitor/index.vue
 * @Description: 添加参观者
-->
<template>
    <view class="add-visitor-page">
        <nut-form>
            <nut-form-item label="姓名">
                <nut-input v-model="name" placeholder="请输入参观者姓名" type="text" />
            </nut-form-item>
            <nut-form-item label="证件类型">
                <view style="padding: 20rpx 0;">身份证</view>
            </nut-form-item>
            <nut-form-item label="证件号">
                <nut-input v-model="id_number" placeholder="请输入参观者证件号" type="idcard" />
            </nut-form-item>
        </nut-form>

        <view style="padding: 32rpx;">
            <nut-button type="primary" block color="#A67939" @click="save">保存</nut-button>
        </view>

        <view v-if="visitorList.length" class="history-list">
            <view class="title">历史参观者</view>
            <view v-for="(item, index) in visitorList" :key="index" class="item">
                <view class="info">
                    <view class="name">{{ item.name }}</view>
                    <view class="id">{{ formatId(item.id_number) }}</view>
                </view>
                <view class="action" @tap="delVisitor(item.id)">删除</view>
            </view>
        </view>
    </view>
</template>

<script setup>
import { ref } from 'vue'
import Taro, { useDidShow } from '@tarojs/taro'
import { personListAPI, addPersonAPI, delPersonAPI } from '@/api/index'

const name = ref('');
const id_number = ref('');
const visitorList = ref([]);

// 身份证校验
const checkIDCard = (idcode) => {
    // 简单校验
    return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(idcode);
}

function replaceMiddleCharacters(inputString) {
    if (!inputString || inputString.length < 15) {
        return inputString;
    }
    const start = Math.floor((inputString.length - 8) / 2);
    const end = start + 8;
    const replacement = '*'.repeat(8);
    return inputString.substring(0, start) + replacement + inputString.substring(end);
}

const formatId = (id) => replaceMiddleCharacters(id);

const loadList = async () => {
    const { code, data } = await personListAPI({});
    if (code) {
        visitorList.value = data || [];
    }
}

const save = async () => {
    if (!name.value) {
        Taro.showToast({ title: '请输入姓名', icon: 'none' });
        return;
    }
    if (!checkIDCard(id_number.value)) {
        Taro.showToast({ title: '请输入正确的身份证号', icon: 'none' });
        return;
    }

    Taro.showLoading({ title: '保存中' });
    const { code, msg } = await addPersonAPI({
        name: name.value,
        id_type: 1, // 身份证
        id_number: id_number.value
    });
    Taro.hideLoading();

    if (code) {
        Taro.showToast({ title: '添加成功' });
        name.value = '';
        id_number.value = '';
        loadList();
        // 自动返回上一页? H5 没有自动返回
        Taro.navigateBack();
    } else {
        Taro.showToast({ title: msg || '添加失败', icon: 'none' });
    }
}

const delVisitor = async (id) => {
    const { confirm } = await Taro.showModal({ title: '提示', content: '确定删除该参观者吗?' });
    if (confirm) {
        const { code, msg } = await delPersonAPI({ person_id: id });
        if (code) {
            Taro.showToast({ title: '删除成功' });
            loadList();
        } else {
            Taro.showToast({ title: msg || '删除失败', icon: 'none' });
        }
    }
}

useDidShow(() => {
    loadList();
})
</script>

<style lang="less">
.add-visitor-page {
    min-height: 100vh;
    background-color: #F6F6F6;
    padding-top: 2rpx;

    .history-list {
        margin-top: 32rpx;
        background-color: #FFF;
        padding: 32rpx;

        .title {
            font-size: 32rpx;
            color: #333;
            margin-bottom: 32rpx;
            border-left: 6rpx solid #A67939;
            padding-left: 16rpx;
        }

        .item {
            display: flex;
            justify-content: space-between;
            align-items: center;
            padding: 32rpx 0;
            border-bottom: 2rpx solid #EEE;

            &:last-child {
                border-bottom: none;
            }

            .info {
                .name {
                    font-size: 32rpx;
                    color: #333;
                    margin-bottom: 10rpx;
                }

                .id {
                    font-size: 29rpx;
                    color: #999;
                }
            }

            .action {
                color: #FF0000;
                font-size: 29rpx;
            }
        }
    }
}
</style>