liyongli 1 долоо хоног өмнө
parent
commit
d4b505116c

BIN
src/assets/img/2025lameifenghui.png


BIN
src/assets/img/2025logo.png


+ 491 - 0
src/view/fenghui/form.vue

@@ -0,0 +1,491 @@
+<!-- 外国嘉宾 -->
+<template>
+    <van-nav-bar :title="lang[langType].signUp" left-arrow @click-left="onClickLeft" />
+    <div class="form">
+        <div>
+            <span style="font-size: 16px;margin-left: 10px;" v-text="lang[langType].signUp"></span>
+        </div>
+        <van-form @submit="onSubmit" label-width="8em">
+            <!-- 国家/地区 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].countryRegionContent }]" required
+                v-model="formData.countryRegion" :placeholder="lang[langType].countryRegionContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].countryRegion"></span>
+                </template>
+            </van-field>
+
+            <!-- 姓 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].lastNameContent }]" required
+                v-model="formData.lastName" :placeholder="lang[langType].lastNameContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].lastName"></span>
+                </template>
+            </van-field>
+
+            <!-- 名 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].firstNameContent }]" required
+                v-model="formData.firstName" :placeholder="lang[langType].firstNameContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].firstName"></span>
+                </template>
+            </van-field>
+
+            <!-- 性别 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].genderContent }]"
+                v-model="formData.gender" required :placeholder="lang[langType].genderContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].gender"></span>
+                </template>
+            </van-field>
+
+            <!-- 生日 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].birthdayContent }]" clickable
+                right-icon="calendar-o" readonly @click="showBirthday = true" v-model="formData.birthday" required
+                :placeholder="lang[langType].birthdayContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].birthday"></span>
+                </template>
+            </van-field>
+            <van-popup v-model:show="showBirthday" destroy-on-close round position="bottom">
+                <van-date-picker @confirm="packerConfirm" :title="lang[langType].birthday"
+                    @cancel="showBirthday = false" :min-date="new Date(1970, 0, 1)" :max-date="new Date()" />
+            </van-popup>
+
+            <!-- 照片 -->
+            <van-field input-align="right" :placeholder="lang[langType].photoContent" required
+                :rules="[{ required: true, trigger: 'onChange', message: lang[langType].photoContent }]"
+                v-model="formData.photoUrl">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].photo"></span>
+                </template>
+                <template #input>
+                    <van-uploader :preview-full-image="false" accept="image/*" v-model="photo"
+                        :before-delete="beforeDelete" :max-count="1" :max-size="524288000" @oversize="filesize"
+                        :after-read="beforeRead" result-type="file">
+                    </van-uploader>
+                    <p style="font-size: 12px;" v-text="lang[langType].photoSubContent"> </p>
+                </template>
+            </van-field>
+
+            <!-- 手机号 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].contactContent }]"
+                v-model="formData.contact" type="number" required :placeholder="lang[langType].contactContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].contact"></span>
+                </template>
+            </van-field>
+
+            <!-- 邮箱 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].emailContent }]" required
+                v-model="formData.email" :placeholder="lang[langType].emailContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].email"></span>
+                </template>
+            </van-field>
+
+            <!-- 紧急联系人 -->
+            <van-field input-align="right" v-model="formData.emergencyContact"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].emergencyContactContent }]"
+                required :placeholder="lang[langType].emergencyContactContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].emergencyContact"></span>
+                </template>
+            </van-field>
+
+            <!-- 紧急联系人电话 -->
+            <van-field input-align="right" v-model="formData.emergencyContactPhone" required
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].emergencyContactPhoneContent }]"
+                :placeholder="lang[langType].emergencyContactPhoneContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].emergencyContactPhone"></span>
+                </template>
+            </van-field>
+
+            <!-- 证件类型 -->
+            <van-field input-align="right" v-model="formData.cardTypeName" clickable
+                :rules="[{ required: true, trigger: 'onChange', message: lang[langType].conferenceTypeContent }]"
+                right-icon="calendar-o" readonly :placeholder="lang[langType].conferenceTypeContent"
+                @click="showCardType = true" required>
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].conferenceType"></span>
+                </template>
+            </van-field>
+            <van-popup v-model:show="showCardType" destroy-on-close round position="bottom">
+                <van-picker :model-value="formData.cardType" :columns="cardTypeList" @cancel="showCardType = false"
+                    @confirm="onConfirm" />
+            </van-popup>
+
+            <!-- 证件 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].passportContent }]"
+                v-model="formData.passport" required :placeholder="lang[langType].passportContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].passport"></span>
+                </template>
+            </van-field>
+
+            <!-- 宗教 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].beliefContent }]"
+                v-model="formData.belief" required :placeholder="lang[langType].beliefContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].belief"></span>
+                </template>
+            </van-field>
+
+            <!-- 饮食要求 -->
+            <van-field input-align="right" v-model="formData.catering" rows="3" autosize
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].cateringContent }]"
+                type="textarea" required :placeholder="lang[langType].cateringContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].catering"></span>
+                </template>
+            </van-field>
+
+            <div style="background-color: #F7F7F7;height: 10px;"></div>
+
+            <!-- 工作单位 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].workUnit }]" required
+                v-model="formData.workUnit" :placeholder="lang[langType].companyContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].company"></span>
+                </template>
+            </van-field>
+
+            <!-- 单位类型 -->
+            <van-field input-align="right" v-model="formData.unitTypeName" clickable
+                :rules="[{ required: true, trigger: 'onChange', message: lang[langType].unitTypeContent }]"
+                right-icon="calendar-o" readonly :placeholder="lang[langType].unitTypeContent"
+                @click="showUnitType = true" required>
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].unitType"></span>
+                </template>
+            </van-field>
+            <van-popup v-model:show="showUnitType" destroy-on-close round position="bottom">
+                <van-picker :model-value="formData.unitType" :columns="unitTypeList" @cancel="showUnitType = false"
+                    @confirm="onUnitTypeConfirm" />
+            </van-popup>
+
+            <!-- 职务 -->
+            <van-field input-align="right" v-model="formData.career"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].careerContent }]" required
+                :placeholder="lang[langType].careerContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].career"></span>
+                </template>
+            </van-field>
+
+            <!-- 传真 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].faxContent }]"
+                v-model="formData.fax" type="number" required :placeholder="lang[langType].faxContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].fax"></span>
+                </template>
+            </van-field>
+
+            <!-- 办公地址 -->
+            <van-field input-align="right" v-model="formData.officeAddress" rows="3" autosize required
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].officeAddressContent }]"
+                type="textarea" :placeholder="lang[langType].officeAddressContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].officeAddress"></span>
+                </template>
+            </van-field>
+
+            <div style="background-color: #F7F7F7;height: 10px;"></div>
+            <!-- 接受采访意向  -->
+            <van-field input-align="right" v-model="formData.interview" required
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].interviewContent }]"
+                :placeholder="lang[langType].interviewContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].interview"></span>
+                </template>
+                <template #input>
+                    <van-radio-group style="justify-content: flex-end;width: 100%;" v-model="formData.interview"
+                        direction="horizontal">
+                        <van-radio :name="lang[langType].confirm">{{ lang[langType].confirm }}</van-radio>
+                        <van-radio :name="lang[langType].cancel">{{ lang[langType].cancel }}</van-radio>
+                    </van-radio-group>
+                </template>
+            </van-field>
+
+            <div style="background-color: #F7F7F7;height: 10px;"></div>
+
+            <!--  抵达西安交通车次 -->
+            <van-field input-align="right" v-model="formData.reachTrainNumber"
+                :placeholder="lang[langType].reachTrainNumberContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].reachTrainNumber"></span>
+                </template>
+            </van-field>
+
+            <!--  抵达西安时间 -->
+            <van-field input-align="right" v-model="formData.reachTime" clickable right-icon="calendar-o" readonly
+                @click="showReachTime = true" :placeholder="lang[langType].reachTimeContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].reachTime"></span>
+                </template>
+            </van-field>
+            <van-popup v-model:show="showReachTime" destroy-on-close round position="bottom">
+                <van-picker :title="lang[langType].reachTime" :columns="dateTimeColumns" @confirm="reachTimeConfirm"
+                    @cancel="showReachTime = false" />
+            </van-popup>
+
+            <!--  离开车次 -->
+            <van-field input-align="right" v-model="formData.leavingTrainNumber"
+                :placeholder="lang[langType].leavingTrainNumberContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].leavingTrainNumber"></span>
+                </template>
+            </van-field>
+
+            <!--  离开时间 -->
+            <van-field input-align="right" v-model="formData.leavingTime" clickable right-icon="calendar-o" readonly
+                @click="showLeavingTime = true" :placeholder="lang[langType].leavingTimeContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].leavingTime"></span>
+                </template>
+            </van-field>
+            <van-popup v-model:show="showLeavingTime" destroy-on-close round position="bottom">
+                <van-picker :title="lang[langType].leavingTime" :columns="dateTimeColumns" @confirm="leavingTimeConfirm"
+                    @cancel="showLeavingTime = false" />
+            </van-popup>
+
+            <!--  离店时间 -->
+            <van-field input-align="right" v-model="formData.checkOutTime" clickable right-icon="calendar-o" readonly
+                @click="showCheckOutTime = true" :placeholder="lang[langType].checkOutTimeContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].checkOutTime"></span>
+                </template>
+            </van-field>
+            <van-popup v-model:show="showCheckOutTime" destroy-on-close round position="bottom">
+                <van-picker :title="lang[langType].checkOutTime" :columns="dateTimeColumns"
+                    @confirm="checkOutTimeConfirm" @cancel="showCheckOutTime = false" />
+            </van-popup>
+
+            <van-field input-align="right" v-model="formData.message" rows="3" autosize type="textarea"
+                :placeholder="lang[langType].ortherNotesContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].ortherNotes"></span>
+                </template>
+            </van-field>
+            <br />
+            <van-button
+                style="background: linear-gradient(270deg, #1D19BC 0%, #1C4CD5 100%);margin: 0 auto;width: calc(100% - 40px);"
+                block type="primary" native-type="submit">
+                {{lang[langType].submit}}
+            </van-button>
+        </van-form>
+    </div>
+</template>
+<script setup>
+import { defineEmits, defineProps, reactive, ref, computed } from 'vue';
+import { showLoadingToast, showToast, showDialog } from 'vant';
+import { saveData } from '@/api/2025.js';
+import config from '@/config/index.js';
+import axios from 'axios';
+import lang from './lang.js';
+const props = defineProps(['langType']);
+
+const emits = defineEmits(['closeComponent']);
+
+const formData = reactive({})
+const cardTypeList = computed(() => lang[props.langType].cardTypeList)
+const unitTypeList = computed(() => lang[props.langType].foreignCountryUnitType)
+const showBirthday = ref(false)
+const showReachTime = ref(false)
+const showLeavingTime = ref(false)
+const showCardType = ref(false)
+const showCheckOutTime = ref(false)
+const showUnitType = ref(false)
+const photo = ref([]);
+
+const onClickLeft = () => {
+    emits('closeComponent');
+};
+
+const createTextDate = values => values.slice(0, 3).join('-') + ' ' + values.slice(3).join(':');
+const packerConfirm = (values) => {
+    showBirthday.value = false;
+    formData.birthday = createTextDate(values.selectedValues);
+}
+const leavingTimeConfirm = ({ selectedValues }) => {
+    showLeavingTime.value = false;
+    formData.leavingTime = createTextDate(selectedValues);
+}
+const reachTimeConfirm = ({ selectedValues }) => {
+    showReachTime.value = false;
+    formData.reachTime = createTextDate(selectedValues);
+}
+const checkOutTimeConfirm = ({ selectedValues }) => {
+    showCheckOutTime.value = false;
+    formData.checkOutTime = createTextDate(selectedValues);
+}
+const onUnitTypeConfirm = (values) => {
+    showUnitType.value = false;
+    formData.unitType = values.selectedValues;
+    formData.unitTypeName = values.selectedOptions[0].text;
+}
+const onConfirm = (values) => {
+    showCardType.value = false;
+    formData.cardType = values.selectedValues;
+    formData.cardTypeName = values.selectedOptions[0].text;
+}
+
+// 上传
+const beforeDelete = (index) => {
+    photo.value.splice(index, 1);
+    formData.photoUrl = '';
+    return false;
+}
+const filesize = () => showToast(lang[props.langType].fileSize);
+const beforeRead = (file) => {
+    if (!file) showToast(lang[props.langType].photoContent);
+    console.log(file);
+    const oriData = new FormData();
+    oriData.append('file', file.file);
+
+    const loading = showLoadingToast({
+        message: lang[props.langType].upFile,
+        forbidClick: true,
+        loadingType: 'spinner',
+        duration: 0
+    })
+    axios({
+        method: 'post',
+        url: config.base.Url2025 + 'dev/file/uploadDynamicReturnUrl',
+        headers: {
+            'Content-Type': 'multipart/form-data',
+        },
+        data: oriData,
+    }).then(res => {
+        loading.close();
+        if (res.status !== 200 || res.data.code !== 0) {
+            showToast(lang[props.langType].upFileError);
+            formData.photoUrl = ''
+            return
+        }
+        showToast(lang[props.langType].upFileSusscess);
+        formData.photoUrl = res.data.data
+        photo.value = [
+            {
+                url: res.data.data,
+                file: file.file,
+            }
+        ]
+    }).catch(() => {
+        loading.close();
+        showToast(lang[props.langType].upFileError);
+    })
+    return false;
+};
+
+
+let arrivalTime = []
+const dateTimeColumns = computed(() => {
+    const now = new Date();
+    const dateList = lang[props.langType].dateList;
+    const years = [{ text: dateList[0], value: '', disabled: true }, ...Array.from({ length: Number(now.getFullYear()) + 1 - 1970 }, (_, i) => {
+        const t = 1970 + i + ''
+        return {
+            text: t,
+            value: t
+        }
+    }).reverse()];
+    const months = [{ text: dateList[1], value: '', disabled: true }, ...Array.from({ length: 12 }, (_, i) => {
+        const m = (i + 1).toString().padStart(2, '0')
+        return {
+            text: m,
+            value: m
+        }
+    })];
+
+    // 动态计算当前选中年月对应的天数
+    const daysInMonth = new Date(
+        parseInt(arrivalTime[0] || '0'),
+        parseInt(arrivalTime[1] || '0'),
+        0
+    ).getDate();
+    const days = [{ text: dateList[2], value: '', disabled: true }, ...Array.from({ length: daysInMonth }, (_, i) => {
+        const d = (i + 1).toString().padStart(2, '0')
+        return {
+            text: d,
+            value: d
+        }
+    })];
+
+    const hours = [{ text: dateList[3], value: '', disabled: true }, ...Array.from({ length: 24 }, (_, i) => {
+        const h = i.toString().padStart(2, '0')
+        return {
+            text: h,
+            value: h
+        }
+    })];
+    const minutes = [{ text: dateList[4], value: '', disabled: true }, ...Array.from({ length: 60 }, (_, i) => {
+        const m = i.toString().padStart(2, '0')
+        return {
+            text: m,
+            value: m
+        }
+    })];
+    return [years, months, days, hours, minutes];
+});
+
+
+let loading = false
+const onSubmit = () => {
+    if (loading) return
+    loading = true
+    saveData({
+        lastName: formData.lastName, // 姓
+        firstName: formData.firstName, // 名
+        gender: formData.gender, // 性别
+        birthDate: formData.birthday, // 出生日期
+        photo: formData.photoUrl, // 照片
+        phone: formData.contact, // 手机号
+        countryRegion: formData.countryRegion, // 国家/地区
+        email: formData.email, // 邮箱
+        religion: formData.belief, // 宗教
+        emergencyContact: formData.emergencyContact, // 紧急联系人
+        emergencyContactPhone: formData.emergencyContactPhone, // 紧急联系人电话
+        cardTypeName: formData.cardTypeName, // 证件类型
+        idCard: formData.passport, // 证件号
+        dietaryRequirements: formData.catering, // 饮食要求
+        workUnit: formData.workUnit, // 工作单位
+        unitType: formData.unitType, // 单位类型
+        position: formData.career, // 职务
+        fax: formData.fax, // fax
+        interviewIntention: formData.interview, // 接受采访意向
+        officeAddress: formData.officeAddress, // 办公地址
+        arrivalNumberXian: formData.reachTrainNumber, // 抵达西安交通车次
+        arrivalTimeXian: formData.reachTime, // 抵达西安时间
+        departureNumber: formData.leavingTrainNumber, // 离开车次
+        departureTime: formData.leavingTime, // 离开时间
+        checkOutTime: formData.checkOutTime, // 离店时间
+        remarks: formData.message, // 备注
+        userType: '国外嘉宾'
+    }).then(() => {
+        // 清空表单内容 from
+        // Object.keys(from).forEach((key) => {
+        //     from[key] = '';
+        // });
+        loading = false
+        showDialog({
+            message: lang[props.langType].registration,
+        })
+    }).catch(() => {
+        loading = false
+        showToast(lang[props.langType].registrationError);
+    });
+}
+</script>
+<style lang="scss"></style>

+ 471 - 0
src/view/fenghui/form1.vue

@@ -0,0 +1,471 @@
+<!-- 中国嘉宾 -->
+<template>
+    <van-nav-bar :title="lang[langType].signUpZH" left-arrow
+        @click-left="onClickLeft" />
+    <div class="form">
+        <div>
+            <span style="font-size: 16px;margin-left: 10px;" v-text="lang[langType].signUpZH"></span>
+        </div>
+        <van-form @submit="onSubmit" label-width="8em">
+            <!-- 姓名 -->
+            <van-field input-align="right"
+                :rules="[{ required: formData, trigger: 'onBlur', message: lang[langType].nameContent }]" required
+                v-model="formData.name" :placeholder="lang[langType].nameContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].name"></span>
+                </template>
+            </van-field>
+
+            <!-- 省市 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].provinceCityContent }]"
+                v-model="formData.provinceCity" required :placeholder="lang[langType].provinceCityContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].provinceCity"></span>
+                </template>
+            </van-field>
+
+            <!-- 性别 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].genderContent }]"
+                v-model="formData.gender" required :placeholder="lang[langType].genderContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].gender"></span>
+                </template>
+            </van-field>
+
+            <!-- 生日 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].birthdayContent }]" clickable
+                right-icon="calendar-o" readonly @click="showBirthday = true" v-model="formData.birthday" required
+                :placeholder="lang[langType].birthdayContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].birthday"></span>
+                </template>
+            </van-field>
+            <van-popup v-model:show="showBirthday" destroy-on-close round position="bottom">
+                <van-date-picker @confirm="packerConfirm" :title="lang[langType].birthday"
+                    @cancel="showBirthday = false" :min-date="new Date(1970, 0, 1)" :max-date="new Date()" />
+            </van-popup>
+
+            <!-- 照片 -->
+            <van-field input-align="right" :placeholder="lang[langType].photoContent" required
+                :rules="[{ required: true, trigger: 'onChange', message: lang[langType].photoContent }]"
+                v-model="formData.photoUrl">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].photo"></span>
+                </template>
+                <template #input>
+                    <van-uploader :preview-full-image="false" accept="image/*" v-model="photo"
+                        :before-delete="beforeDelete" :max-count="1" :max-size="524288000" @oversize="filesize"
+                        :after-read="beforeRead" result-type="file">
+                    </van-uploader>
+                    <p style="font-size: 12px;" v-text="lang[langType].photoSubContent"> </p>
+                </template>
+            </van-field>
+
+            <!-- 手机号 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].contactContent }]"
+                v-model="formData.contact" type="number" required :placeholder="lang[langType].contactContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].contact"></span>
+                </template>
+            </van-field>
+
+            <!-- 邮箱 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].emailContent }]" required
+                v-model="formData.email" :placeholder="lang[langType].emailContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].email"></span>
+                </template>
+            </van-field>
+
+            <!-- 紧急联系人 -->
+            <van-field input-align="right" v-model="formData.emergencyContact"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].emergencyContactContent }]"
+                required :placeholder="lang[langType].emergencyContactContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].emergencyContact"></span>
+                </template>
+            </van-field>
+
+            <!-- 紧急联系人电话 -->
+            <van-field input-align="right" v-model="formData.emergencyContactPhone" required
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].emergencyContactPhoneContent }]"
+                :placeholder="lang[langType].emergencyContactPhoneContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].emergencyContactPhone"></span>
+                </template>
+            </van-field>
+
+            <!-- 证件类型 -->
+            <van-field input-align="right" v-model="formData.cardTypeName" clickable
+                :rules="[{ required: true, trigger: 'onChange', message: lang[langType].conferenceTypeContent }]"
+                right-icon="calendar-o" readonly :placeholder="lang[langType].conferenceTypeContent"
+                @click="showCardType = true" required>
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].conferenceType"></span>
+                </template>
+            </van-field>
+            <van-popup v-model:show="showCardType" destroy-on-close round position="bottom">
+                <van-picker :model-value="formData.cardType" :columns="cardTypeList" @cancel="showCardType = false"
+                    @confirm="onConfirm" />
+            </van-popup>
+
+            <!-- 证件 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].passportContent }]"
+                v-model="formData.passport" required :placeholder="lang[langType].passportContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].passport"></span>
+                </template>
+            </van-field>
+
+            <!-- 饮食要求 -->
+            <van-field input-align="right" v-model="formData.catering" rows="3" autosize
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].cateringContent }]"
+                type="textarea" required :placeholder="lang[langType].cateringContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].catering"></span>
+                </template>
+            </van-field>
+
+            <div style="background-color: #F7F7F7;height: 10px;"></div>
+
+            <!-- 工作单位 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].workUnit }]" required
+                v-model="formData.workUnit" :placeholder="lang[langType].companyContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].company"></span>
+                </template>
+            </van-field>
+
+            <!-- 单位类型 -->
+            <van-field input-align="right" v-model="formData.unitTypeName" clickable
+                :rules="[{ required: true, trigger: 'onChange', message: lang[langType].unitTypeContent }]"
+                right-icon="calendar-o" readonly :placeholder="lang[langType].unitTypeContent"
+                @click="showUnitType = true" required>
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].unitType"></span>
+                </template>
+            </van-field>
+            <van-popup v-model:show="showUnitType" destroy-on-close round position="bottom">
+                <van-picker :model-value="formData.unitType" :columns="unitTypeList" @cancel="showUnitType = false"
+                    @confirm="onUnitTypeConfirm" />
+            </van-popup>
+
+            <!-- 职务 -->
+            <van-field input-align="right" v-model="formData.career"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].careerContent }]" required
+                :placeholder="lang[langType].careerContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].career"></span>
+                </template>
+            </van-field>
+
+            <!-- 传真 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].faxContent }]"
+                v-model="formData.fax" type="number" required :placeholder="lang[langType].faxContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].fax"></span>
+                </template>
+            </van-field>
+
+            <!-- 办公地址 -->
+            <van-field input-align="right" v-model="formData.officeAddress" rows="3" autosize required
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].officeAddressContent }]"
+                type="textarea" :placeholder="lang[langType].officeAddressContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].officeAddress"></span>
+                </template>
+            </van-field>
+
+            <div style="background-color: #F7F7F7;height: 10px;"></div>
+            <!-- 接受采访意向  -->
+            <van-field input-align="right" v-model="formData.interview" required
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].interviewContent }]"
+                :placeholder="lang[langType].interviewContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].interview"></span>
+                </template>
+                <template #input>
+                    <van-radio-group style="justify-content: flex-end;width: 100%;" v-model="formData.interview"
+                        direction="horizontal">
+                        <van-radio :name="lang[langType].confirm">{{ lang[langType].confirm }}</van-radio>
+                        <van-radio :name="lang[langType].cancel">{{ lang[langType].cancel }}</van-radio>
+                    </van-radio-group>
+                </template>
+            </van-field>
+
+            <div style="background-color: #F7F7F7;height: 10px;"></div>
+
+            <!--  抵达西安交通车次 -->
+            <van-field input-align="right" v-model="formData.reachTrainNumber"
+                :placeholder="lang[langType].reachTrainNumberContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].reachTrainNumber"></span>
+                </template>
+            </van-field>
+
+            <!--  抵达西安时间 -->
+            <van-field input-align="right" v-model="formData.reachTime" clickable right-icon="calendar-o" readonly
+                @click="showReachTime = true" :placeholder="lang[langType].reachTimeContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].reachTime"></span>
+                </template>
+            </van-field>
+            <van-popup v-model:show="showReachTime" destroy-on-close round position="bottom">
+                <van-picker :title="lang[langType].reachTime" :columns="dateTimeColumns" @confirm="reachTimeConfirm"
+                    @cancel="showReachTime = false" />
+            </van-popup>
+
+            <!--  离开车次 -->
+            <van-field input-align="right" v-model="formData.leavingTrainNumber"
+                :placeholder="lang[langType].leavingTrainNumberContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].leavingTrainNumber"></span>
+                </template>
+            </van-field>
+
+            <!--  离开时间 -->
+            <van-field input-align="right" v-model="formData.leavingTime" clickable right-icon="calendar-o" readonly
+                @click="showLeavingTime = true" :placeholder="lang[langType].leavingTimeContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].leavingTime"></span>
+                </template>
+            </van-field>
+            <van-popup v-model:show="showLeavingTime" destroy-on-close round position="bottom">
+                <van-picker :title="lang[langType].leavingTime" :columns="dateTimeColumns" @confirm="leavingTimeConfirm"
+                    @cancel="showLeavingTime = false" />
+            </van-popup>
+
+            <!--  离店时间 -->
+            <van-field input-align="right" v-model="formData.checkOutTime" clickable right-icon="calendar-o" readonly
+                @click="showCheckOutTime = true" :placeholder="lang[langType].checkOutTimeContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].checkOutTime"></span>
+                </template>
+            </van-field>
+            <van-popup v-model:show="showCheckOutTime" destroy-on-close round position="bottom">
+                <van-picker :title="lang[langType].checkOutTime" :columns="dateTimeColumns"
+                    @confirm="checkOutTimeConfirm" @cancel="showCheckOutTime = false" />
+            </van-popup>
+
+            <van-field input-align="right" v-model="formData.message" rows="3" autosize type="textarea"
+                :placeholder="lang[langType].ortherNotesContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].ortherNotes"></span>
+                </template>
+            </van-field>
+            <br />
+            <van-button
+                style="background: linear-gradient(270deg, #1D19BC 0%, #1C4CD5 100%);margin: 0 auto;width: calc(100% - 40px);"
+                block type="primary" native-type="submit">
+                {{lang[langType].submit}}
+            </van-button>
+        </van-form>
+    </div>
+</template>
+<script setup>
+import { defineEmits, defineProps, reactive, ref, computed } from 'vue';
+import { showLoadingToast, showToast, showDialog } from 'vant';
+import { saveData } from '@/api/2025.js';
+import config from '@/config/index.js';
+import axios from 'axios';
+import lang from './lang.js';
+const props = defineProps(['langType']);
+
+const emits = defineEmits(['closeComponent']);
+
+const formData = reactive({})
+const cardTypeList = computed(() => lang[props.langType].cardTypeList)
+const unitTypeList = computed(() => lang[props.langType].foreignCountryUnitType)
+const showBirthday = ref(false)
+const showReachTime = ref(false)
+const showUnitType = ref(false)
+const showLeavingTime = ref(false)
+const showCardType = ref(false)
+const showCheckOutTime = ref(false)
+const photo = ref([]);
+
+const onClickLeft = () => {
+    emits('closeComponent');
+};
+
+const createTextDate = values => values.slice(0, 3).join('-') + ' ' + values.slice(3).join(':');
+const packerConfirm = (values) => {
+    showBirthday.value = false;
+    formData.birthday = createTextDate(values.selectedValues);
+}
+const leavingTimeConfirm = ({ selectedValues }) => {
+    showLeavingTime.value = false;
+    formData.leavingTime = createTextDate(selectedValues);
+}
+const onUnitTypeConfirm = (values) => {
+    showUnitType.value = false;
+    formData.unitType = values.selectedValues;
+    formData.unitTypeName = values.selectedOptions[0].text; 
+}
+const reachTimeConfirm = ({ selectedValues }) => {
+    showReachTime.value = false;
+    formData.reachTime = createTextDate(selectedValues);
+}
+const checkOutTimeConfirm = ({ selectedValues }) => {
+    showCheckOutTime.value = false;
+    formData.checkOutTime = createTextDate(selectedValues);
+}
+const onConfirm = (values) => {
+    showCardType.value = false;
+    formData.cardType = values.selectedValues;
+    formData.cardTypeName = values.selectedOptions[0].text;
+}
+
+// 上传
+const beforeDelete = (index) => {
+    photo.value.splice(index, 1);
+    formData.photoUrl = '';
+    return false;
+}
+const filesize = () => showToast(lang[props.langType].fileSize);
+const beforeRead = (file) => {
+    if (!file) showToast(lang[props.langType].photoContent);
+    console.log(file);
+    const oriData = new FormData();
+    oriData.append('file', file.file);
+
+    const loading = showLoadingToast({
+        message: lang[props.langType].upFile,
+        forbidClick: true,
+        loadingType: 'spinner',
+        duration: 0
+    })
+    axios({
+        method: 'post',
+        url: config.base.Url2025 + 'dev/file/uploadDynamicReturnUrl',
+        headers: {
+            'Content-Type': 'multipart/form-data',
+        },
+        data: oriData,
+    }).then(res => {
+        loading.close();
+        if (res.status !== 200 || res.data.code !== 0) {
+            showToast(lang[props.langType].upFileError);
+            formData.photoUrl = ''
+            return
+        }
+        showToast(lang[props.langType].upFileSusscess);
+        formData.photoUrl = res.data.data
+        photo.value = [
+            {
+                url: res.data.data,
+                file: file.file,
+            }
+        ]
+    }).catch(() => {
+        loading.close();
+        showToast(lang[props.langType].upFileError);
+    })
+    return false;
+};
+
+
+let arrivalTime = []
+const dateTimeColumns = computed(() => {
+    const now = new Date();
+    const dateList = lang[props.langType].dateList;
+    const years = [{ text: dateList[0], value: '', disabled: true }, ...Array.from({ length: Number(now.getFullYear()) + 1 - 1970 }, (_, i) => {
+        const t = 1970 + i + ''
+        return {
+            text: t,
+            value: t
+        }
+    }).reverse()];
+    const months = [{ text: dateList[1], value: '', disabled: true }, ...Array.from({ length: 12 }, (_, i) => {
+        const m = (i + 1).toString().padStart(2, '0')
+        return {
+            text: m,
+            value: m
+        }
+    })];
+
+    // 动态计算当前选中年月对应的天数
+    const daysInMonth = new Date(
+        parseInt(arrivalTime[0] || '0'),
+        parseInt(arrivalTime[1] || '0'),
+        0
+    ).getDate();
+    const days = [{ text: dateList[2], value: '', disabled: true }, ...Array.from({ length: daysInMonth }, (_, i) => {
+        const d = (i + 1).toString().padStart(2, '0')
+        return {
+            text: d,
+            value: d
+        }
+    })];
+
+    const hours = [{ text: dateList[3], value: '', disabled: true }, ...Array.from({ length: 24 }, (_, i) => {
+        const h = i.toString().padStart(2, '0')
+        return {
+            text: h,
+            value: h
+        }
+    })];
+    const minutes = [{ text: dateList[4], value: '', disabled: true }, ...Array.from({ length: 60 }, (_, i) => {
+        const m = i.toString().padStart(2, '0')
+        return {
+            text: m,
+            value: m
+        }
+    })];
+    return [years, months, days, hours, minutes];
+});
+
+
+let loading = false
+const onSubmit = () => {
+    if (loading) return
+    loading = true
+    saveData({
+        name: formData.name, // 姓名
+        provinceCity: formData.provinceCity, // 省市区
+        gender: formData.gender, // 性别
+        birthDate: formData.birthday, // 出生日期
+        photo: formData.photoUrl, // 照片
+        phone: formData.contact, // 手机号
+        email: formData.email, // 邮箱
+        emergencyContact: formData.emergencyContact, // 紧急联系人
+        emergencyContactPhone: formData.emergencyContactPhone, // 紧急联系人电话
+        cardTypeName: formData.cardTypeName, // 证件类型
+        idCard: formData.passport, // 证件号
+        dietaryRequirements: formData.catering, // 饮食要求
+        workUnit: formData.workUnit, // 工作单位
+        unitType: formData.unitType, // 单位类型
+        position: formData.career, // 职务
+        fax: formData.fax, // fax
+        interviewIntention: formData.interview, // 接受采访意向
+        officeAddress: formData.officeAddress, // 办公地址
+        arrivalNumberXian: formData.reachTrainNumber, // 抵达西安交通车次
+        arrivalTimeXian: formData.reachTime, // 抵达西安时间
+        departureNumber: formData.leavingTrainNumber, // 离开车次
+        departureTime: formData.leavingTime, // 离开时间
+        checkOutTime: formData.checkOutTime, // 离店时间
+        remarks: formData.message, // 备注
+        userType: '国内嘉宾'
+    }).then(() => {
+        // 清空表单内容 from
+        // Object.keys(from).forEach((key) => {
+        //     from[key] = '';
+        // });
+        loading = false
+        showDialog({
+            message: lang[props.langType].registration,
+        })
+    }).catch(() => {
+        loading = false
+        showToast(lang[props.langType].registrationError);
+    });
+}
+</script>

+ 184 - 0
src/view/fenghui/form2.vue

@@ -0,0 +1,184 @@
+<!-- 工作人员 -->
+<template>
+    <van-nav-bar :title="lang[langType].signUpWK" left-arrow
+        @click-left="onClickLeft" />
+    <div class="form">
+        <div>
+            <span style="font-size: 16px;margin-left: 10px;" v-text="lang[langType].signUpWK"></span>
+        </div>
+        <van-form @submit="onSubmit" label-width="8em">
+            <!-- 姓名 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].nameContent }]" required
+                v-model="formData.name" :placeholder="lang[langType].nameContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].name"></span>
+                </template>
+            </van-field>
+
+            <!-- 手机号 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].contactContent }]"
+                v-model="formData.contact" type="number" required :placeholder="lang[langType].contactContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].contact"></span>
+                </template>
+            </van-field>
+
+            <!-- 照片 -->
+            <van-field input-align="right" :placeholder="lang[langType].photoContent" required
+                :rules="[{ required: true, trigger: 'onChange', message: lang[langType].photoContent }]"
+                v-model="formData.photoUrl">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].photo"></span>
+                </template>
+                <template #input>
+                    <van-uploader :preview-full-image="false" accept="image/*" v-model="photo"
+                        :before-delete="beforeDelete" :max-count="1" :max-size="524288000" @oversize="filesize"
+                        :after-read="beforeRead" result-type="file">
+                    </van-uploader>
+                    <p style="font-size: 12px;" v-text="lang[langType].photoSubContent"> </p>
+                </template>
+            </van-field>
+
+            <!-- 证件 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].IDcardNumberContent }]"
+                v-model="formData.passport" required :placeholder="lang[langType].IDcardNumberContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].IDcardNumber"></span>
+                </template>
+            </van-field>
+
+            <!-- 单位类型 -->
+            <van-field input-align="right" v-model="formData.unitTypeName" clickable
+                :rules="[{ required: true, trigger: 'onChange', message: lang[langType].workGroupTextContent }]"
+                right-icon="calendar-o" readonly :placeholder="lang[langType].workGroupTextContent"
+                @click="showUnitType = true" required>
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].workGroupText"></span>
+                </template>
+            </van-field>
+            <van-popup v-model:show="showUnitType" destroy-on-close round position="bottom">
+                <van-picker :model-value="formData.unitType" :columns="unitTypeList" @cancel="showUnitType = false"
+                    @confirm="onUnitTypeConfirm" />
+            </van-popup>
+
+            <!-- 工作单位 -->
+            <van-field input-align="right"
+                :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].companyB }]" required
+                v-model="formData.workUnit" :placeholder="lang[langType].companyBContent">
+                <template #label>
+                    <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].companyB"></span>
+                </template>
+            </van-field>
+            <br />
+            <van-button
+                style="background: linear-gradient(270deg, #1D19BC 0%, #1C4CD5 100%);margin: 0 auto;width: calc(100% - 40px);"
+                block type="primary" native-type="submit">
+                {{lang[langType].submit}}
+            </van-button>
+        </van-form>
+    </div>
+</template>
+<script setup>
+import { defineEmits, defineProps, reactive, ref, computed } from 'vue';
+import { showLoadingToast, showToast, showDialog } from 'vant';
+import { saveData } from '@/api/2025.js';
+import config from '@/config/index.js';
+import axios from 'axios';
+import lang from './lang.js';
+const props = defineProps(['langType']);
+
+const emits = defineEmits(['closeComponent']);
+
+const formData = reactive({})
+const unitTypeList = computed(() => lang[props.langType].workGroup)
+const showUnitType = ref(false)
+const photo = ref([]);
+
+const onClickLeft = () => {
+    emits('closeComponent');
+};
+
+const onUnitTypeConfirm = (values) => {
+    showUnitType.value = false;
+    formData.unitType = values.selectedValues;
+    formData.unitTypeName = values.selectedOptions[0].text;
+}
+
+// 上传
+const beforeDelete = (index) => {
+    photo.value.splice(index, 1);
+    formData.photoUrl = '';
+    return false;
+}
+const filesize = () => showToast(lang[props.langType].fileSize);
+const beforeRead = (file) => {
+    if (!file) showToast(lang[props.langType].photoContent);
+    const oriData = new FormData();
+    oriData.append('file', file.file);
+
+    const loading = showLoadingToast({
+        message: lang[props.langType].upFile,
+        forbidClick: true,
+        loadingType: 'spinner',
+        duration: 0
+    })
+    axios({
+        method: 'post',
+        url: config.base.Url2025 + 'dev/file/uploadDynamicReturnUrl',
+        headers: {
+            'Content-Type': 'multipart/form-data',
+        },
+        data: oriData,
+    }).then(res => {
+        loading.close();
+        if (res.status !== 200 || res.data.code !== 0) {
+            showToast(lang[props.langType].upFileError);
+            formData.photoUrl = ''
+            return
+        }
+        showToast(lang[props.langType].upFileSusscess);
+        formData.photoUrl = res.data.data
+        photo.value = [
+            {
+                url: res.data.data,
+                file: file.file,
+            }
+        ]
+    }).catch(() => {
+        loading.close();
+        showToast(lang[props.langType].upFileError);
+    })
+    return false;
+};
+
+let loading = false
+const onSubmit = () => {
+    if (loading) return
+    loading = true
+    saveData({
+        name: formData.name, // 姓名
+        photo: formData.photoUrl, // 照片
+        phone: formData.contact, // 手机号
+        idCard: formData.passport, // 证件号
+        workUnit: formData.workUnit, // 工作单位
+        workGroup: formData.unitType, // 单位类型
+        userType: '工作人员'
+    }).then(() => {
+        // 清空表单内容 from
+        // Object.keys(from).forEach((key) => {
+        //     from[key] = '';
+        // });
+        loading = false
+        showDialog({
+            message: lang[props.langType].registration,
+        })
+    }).catch(() => {
+        loading = false
+        showToast(lang[props.langType].registrationError);
+    });
+}
+</script>
+<style lang="scss"></style>

+ 42 - 661
src/view/fenghui/index.vue

@@ -1,613 +1,57 @@
 <template>
     <div class="fenghui">
-        <!-- <div class="swith">
+        <div class="swith" :style="componentId !== '' ? 'color: #000000' : ''">
             <div class="title" @click="showLange = true">
-                {{ langObjT[langType] }}
+                {{ langObjT[langSelect] }}
                 <van-icon name="arrow-down" />
             </div>
             <van-popup v-model:show="showLange" destroy-on-close round position="bottom">
-                <van-picker :model-value="[langType]" :columns="langObj" @cancel="showLange = false"
+                <van-picker :model-value="[langSelect]" :columns="langObj" @cancel="showLange = false"
                     @confirm="langChange" />
             </van-popup>
-        </div> -->
-        <van-image style="width: 100%;" :src="soundbyteJpg" />
-        <br />
-        <van-form label-width="8em" @submit="onSubmit">
-            <div class="submit">
-                <div class="introduce">
-                    <h4 class="text" v-text="lang[langType].marst"></h4>
-                    <p class="text" v-html="lang[langType].marstContent"></p>
-                    <h4 class="text" v-text="lang[langType].wrestleMania"></h4>
-                    <p class="text" v-html="lang[langType].wrestleManiaContent"></p>
-                    <h4 class="text" v-text="lang[langType].venue"></h4>
-                    <p class="text" v-html="lang[langType].venueContent"></p>
-                    <h4 class="text" v-text="lang[langType].organization"></h4>
-                    <van-row>
-                        <van-col span="6">
-                            <div class="text" v-text="lang[langType].organizationSub1"></div>
-                        </van-col>
-                        <van-col span="18">
-                            <div class="text" v-html="lang[langType].organizationSub2"></div>
-                        </van-col>
-                    </van-row>
-                    <van-row>
-                        <van-col span="6">
-                            <div class="text" v-text="lang[langType].organizationSub3"></div>
-                        </van-col>
-                        <van-col span="18">
-                            <div class="text" v-html="lang[langType].organizationSub4"></div>
-                        </van-col>
-                    </van-row>
-                    <h4 class="text" v-text="lang[langType].scale"></h4>
-                    <div class="text" style="text-indent: 2em;" v-text="lang[langType].scaleContent"></div>
-                </div>
-                <van-cell-group inset v-if="showForm">
-                    <!-- <h4 class="title" v-text="lang[langType].basicInformation"></h4> -->
-                    <h4 class="text" v-text="lang[langType].signUp"></h4>
-                    <!-- 国家 -->
-                    <van-field input-align="right" size="large" v-model="from.countryOrRegion" clickable
-                        right-icon="location-o" readonly :placeholder="lang[langType].countryOrRegionContent"
-                        @click="showCountryOrRegion = true" required>
-                        <template #label>
-                            <span class="label" v-html="lang[langType].countryOrRegion"></span>
-                        </template>
-                    </van-field>
-                    <van-popup v-model:show="showCountryOrRegion" destroy-on-close round position="bottom">
-                        <van-picker :columns="countryOrRegionList" @cancel="showCountryOrRegion = false"
-                            @confirm="onCountryOrRegionConfirm" />
-                    </van-popup>
-
-                    <!-- 姓名 -->
-                    <van-field input-align="right" size="large" v-show="from.countryOrRegion === '中国'"
-                        :rules="[{ required: from.countryOrRegion === '中国', trigger: 'onBlur', message: lang[langType].nameContent }]"
-                        :required="from.countryOrRegion === '中国'" v-model="from.name"
-                        :placeholder="lang[langType].nameContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].name"></span>
-                        </template>
-                    </van-field>
-
-
-                    <!-- 省市 -->
-                    <van-field input-align="right" size="large" v-show="from.countryOrRegion === '中国'"
-                        :rules="[{ required: from.countryOrRegion === '中国', trigger: 'onBlur', message: lang[langType].provinceCityContent }]"
-                        v-model="from.provinceCity" :required="from.countryOrRegion === '中国'"
-                        :placeholder="lang[langType].provinceCityContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].provinceCity"></span>
-                        </template>
-                    </van-field>
-
-                    <!-- 姓 -->
-                    <van-field input-align="right" size="large" v-show="from.countryOrRegion === '其他国家'"
-                        :rules="[{ required: from.countryOrRegion === '其他国家', trigger: 'onBlur', message: lang[langType].nameContent }]"
-                        :required="from.countryOrRegion === '其他国家'" v-model="from.lastName"
-                        :placeholder="lang[langType].lastNameContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].lastName"></span>
-                        </template>
-                    </van-field>
-
-                    <!-- 名 -->
-                    <van-field input-align="right" size="large" v-show="from.countryOrRegion === '其他国家'"
-                        :rules="[{ required: from.countryOrRegion === '其他国家', trigger: 'onBlur', message: lang[langType].nameContent }]"
-                        :required="from.countryOrRegion === '其他国家'" v-model="from.firstName"
-                        :placeholder="lang[langType].firstNameContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].firstName"></span>
-                        </template>
-                    </van-field>
-
-                    <!-- 国家/地区 -->
-                    <van-field input-align="right" size="large" v-show="from.countryOrRegion === '其他国家'"
-                        :rules="[{ required: from.countryOrRegion === '其他国家', trigger: 'onBlur', message: lang[langType].countryRegionContent }]"
-                        :required="from.countryOrRegion === '其他国家'" v-model="from.countryRegion"
-                        :placeholder="lang[langType].countryRegionContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].countryRegion"></span>
-                        </template>
-                    </van-field>
-
-                    <div style="background-color: #F7F7F7;height: 10px;"></div>
-
-                    <!-- 性别 -->
-                    <van-field input-align="right" size="large"
-                        :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].genderContent }]"
-                        v-model="from.gender" required :placeholder="lang[langType].genderContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].gender"></span>
-                        </template>
-                    </van-field>
-
-                    <!-- 生日 -->
-                    <van-field input-align="right" size="large"
-                        :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].birthdayContent }]"
-                        clickable right-icon="calendar-o" readonly @click="showBirthday = true" v-model="from.birthday"
-                        required :placeholder="lang[langType].birthdayContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].birthday"></span>
-                        </template>
-                    </van-field>
-                    <van-popup v-model:show="showBirthday" destroy-on-close round position="bottom">
-                        <van-date-picker @confirm="packerConfirm" :title="lang[langType].birthday"
-                            @cancel="showBirthday = false" :min-date="new Date(1970, 0, 1)" :max-date="new Date()" />
-                    </van-popup>
-
-                    <!-- 照片 -->
-                    <van-field input-align="right" size="large" :placeholder="lang[langType].photoContent" required
-                        :rules="[{ required: true, trigger: 'onChange', message: lang[langType].photoContent }]"
-                        v-model="from.photoUrl">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].photo"></span>
-                        </template>
-                        <template #input>
-                            <van-uploader :preview-full-image="false" accept="image/*" v-model="photo"
-                                :before-delete="beforeDelete" :max-count="1" :max-size="524288000" @oversize="filesize"
-                                :after-read="beforeRead" result-type="file">
-                            </van-uploader>
-                            <p style="font-size: 12px;" v-text="lang[langType].photoSubContent"> </p>
-                        </template>
-                    </van-field>
-
-                    <!-- 手机号 -->
-                    <van-field input-align="right" size="large"
-                        :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].genderContent }]"
-                        v-model="from.contact" type="number" required :placeholder="lang[langType].contactContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].contact"></span>
-                        </template>
-                    </van-field>
-
-                    <!-- 邮箱 -->
-                    <van-field input-align="right" size="large"
-                        :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].emailContent }]" required
-                        v-model="from.email" :placeholder="lang[langType].emailContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].email"></span>
-                        </template>
-                    </van-field>
-
-                    <!-- 紧急联系人 -->
-                    <van-field input-align="right" size="large" v-model="from.emergencyContact"
-                        :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].emergencyContactContent }]"
-                        required :placeholder="lang[langType].emergencyContactContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].emergencyContact"></span>
-                        </template>
-                    </van-field>
-
-                    <!-- 紧急联系人电话 -->
-                    <van-field input-align="right" size="large" v-model="from.emergencyContactPhone" required
-                        :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].emergencyContactPhoneContent }]"
-                        :placeholder="lang[langType].emergencyContactPhoneContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].emergencyContactPhone"></span>
-                        </template>
-                    </van-field>
-
-                    <!-- 证件类型 -->
-                    <van-field input-align="right" size="large" v-model="from.cardTypeName" clickable
-                        right-icon="calendar-o" readonly :placeholder="lang[langType].conferenceTypeContent"
-                        @click="showCardType = true" required>
-                        <template #label>
-                            <span class="label" v-html="lang[langType].conferenceType"></span>
-                        </template>
-                    </van-field>
-                    <van-popup v-model:show="showCardType" destroy-on-close round position="bottom">
-                        <van-picker :model-value="from.cardType" :columns="cardTypeList" @cancel="showCardType = false"
-                            @confirm="onConfirm" />
-                    </van-popup>
-
-                    <!-- 证件 -->
-                    <van-field input-align="right" size="large"
-                        :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].passportContent }]"
-                        v-model="from.passport" required :placeholder="lang[langType].passportContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].passport"></span>
-                        </template>
-                    </van-field>
-
-                    <!-- 宗教 -->
-                    <van-field input-align="right" size="large"
-                        :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].beliefContent }]"
-                        v-model="from.belief" required :placeholder="lang[langType].beliefContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].belief"></span>
-                        </template>
-                    </van-field>
-
-                    <!-- 饮食要求 -->
-                    <van-field input-align="right" size="large" v-model="from.catering" rows="3" autosize
-                        :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].cateringContent }]"
-                        type="textarea" required :placeholder="lang[langType].cateringContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].catering"></span>
-                        </template>
-                    </van-field>
-
-                    <div style="background-color: #F7F7F7;height: 10px;"></div>
-
-                    <!-- 工作单位 -->
-                    <van-field input-align="right" size="large"
-                        :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].workUnit }]" required
-                        v-model="from.workUnit" :placeholder="lang[langType].companyContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].company"></span>
-                        </template>
-                    </van-field>
-
-                    <!-- 单位类型 -->
-                    <van-field input-align="right" size="large"
-                        :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].unitTypeContent }]"
-                        v-model="from.unitType" required :placeholder="lang[langType].unitTypeContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].unitType"></span>
-                        </template>
-                    </van-field>
-
-                    <!-- 职务 -->
-                    <van-field input-align="right" size="large" v-model="from.career"
-                        :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].careerContent }]" required
-                        :placeholder="lang[langType].careerContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].career"></span>
-                        </template>
-                    </van-field>
-
-                    <!-- 传真 -->
-                    <van-field input-align="right" size="large"
-                        :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].faxContent }]"
-                        v-model="from.fax" type="number" required :placeholder="lang[langType].faxContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].fax"></span>
-                        </template>
-                    </van-field>
-
-                    <!-- 办公地址 -->
-                    <van-field input-align="right" size="large" v-model="from.officeAddress" rows="3" autosize required
-                        :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].officeAddressContent }]"
-                        type="textarea" :placeholder="lang[langType].officeAddressContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].officeAddress"></span>
-                        </template>
-                    </van-field>
-
-                    <div style="background-color: #F7F7F7;height: 10px;"></div>
-
-                    <!-- 接受采访意向  -->
-                    <van-field input-align="right" size="large" v-model="from.interview" required
-                        :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].interviewContent }]"
-                        :placeholder="lang[langType].interviewContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].interview"></span>
-                        </template>
-                        <template #input>
-                            <van-radio-group style="justify-content: flex-end;width: 100%;" v-model="from.interview"
-                                direction="horizontal">
-                                <van-radio name="同意">同意</van-radio>
-                                <van-radio name="拒绝">拒绝</van-radio>
-                            </van-radio-group>
-                        </template>
-                    </van-field>
-
-                    <div style="background-color: #F7F7F7;height: 10px;"></div>
-
-                    <!--  抵达西安交通车次 -->
-                    <van-field input-align="right" size="large" v-model="from.reachTrainNumber"
-                        :placeholder="lang[langType].reachTrainNumberContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].reachTrainNumber"></span>
-                        </template>
-                    </van-field>
-
-                    <!--  抵达西安时间 -->
-                    <van-field input-align="right" size="large" v-model="from.reachTime" clickable
-                        right-icon="calendar-o" readonly @click="showReachTime = true"
-                        :placeholder="lang[langType].reachTimeContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].reachTime"></span>
-                        </template>
-                    </van-field>
-                    <van-popup v-model:show="showReachTime" destroy-on-close round position="bottom">
-                        <van-picker :title="lang[langType].reachTime" :columns="dateTimeColumns"
-                            @confirm="reachTimeConfirm" @cancel="showReachTime = false" />
-                    </van-popup>
-
-                    <!--  离开车次 -->
-                    <van-field input-align="right" size="large" v-model="from.leavingTrainNumber"
-                        :placeholder="lang[langType].leavingTrainNumberContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].leavingTrainNumber"></span>
-                        </template>
-                    </van-field>
-
-                    <!--  离开时间 -->
-                    <van-field input-align="right" size="large" v-model="from.leavingTime" clickable
-                        right-icon="calendar-o" readonly @click="showLeavingTime = true"
-                        :placeholder="lang[langType].leavingTimeContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].leavingTime"></span>
-                        </template>
-                    </van-field>
-                    <van-popup v-model:show="showLeavingTime" destroy-on-close round position="bottom">
-                        <van-picker :title="lang[langType].leavingTime" :columns="dateTimeColumns"
-                            @confirm="leavingTimeConfirm" @cancel="showLeavingTime = false" />
-                    </van-popup>
-
-                    <!--  离店时间 -->
-                    <van-field input-align="right" size="large" v-model="from.checkOutTime" clickable
-                        right-icon="calendar-o" readonly @click="showCheckOutTime = true"
-                        :placeholder="lang[langType].checkOutTimeContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].checkOutTime"></span>
-                        </template>
-                    </van-field>
-                    <van-popup v-model:show="showCheckOutTime" destroy-on-close round position="bottom">
-                        <van-picker :title="lang[langType].checkOutTime" :columns="dateTimeColumns"
-                            @confirm="checkOutTimeConfirm" @cancel="showCheckOutTime = false" />
-                    </van-popup>
-
-                    <!-- <br /> -->
-                    <!-- <h4 class="title" v-text="lang[langType].conference"></h4> -->
-                    <!-- <br /> -->
-                    <!-- <h4 class="title" v-text="lang[langType].orther"></h4> -->
-                    <div style="background-color: #F7F7F7;height: 10px;"></div>
-                    <van-field input-align="right" size="large" v-model="from.message" rows="3" autosize type="textarea"
-                        :placeholder="lang[langType].ortherNotesContent">
-                        <template #label>
-                            <span class="label" v-html="lang[langType].ortherNotes"></span>
-                        </template>
-                    </van-field>
-                </van-cell-group>
-            </div>
-
-            <br />
-            <van-button class="btn_bottom" block type="primary" native-type="submit">
-                {{ lang[langType].signUp }}
-            </van-button>
-            <div style="text-align: center;line-height: 2.5em;font-size: 12px;" v-text="lang[langType].copyright"></div>
-        </van-form>
+        </div>
+        <Introduction v-if="!componentId" :langType="langSelect" @checkVerificationCode="checkVerificationCode" />
+        <!-- 动态组件 -->
+        <Fore25 v-if="componentId === 'fore25'" :langType="langSelect" @closeComponent="closeComponent" />
+        <Chin25 v-if="componentId === 'chin25'" :langType="langSelect" @closeComponent="closeComponent" />
+        <Work25 v-if="componentId === 'work25'" :langType="langSelect" @closeComponent="closeComponent" />
     </div>
 </template>
 <script setup>
-import { ref, reactive, computed } from 'vue';
-import { showToast, showDialog } from 'vant';
-import axios from 'axios';
-import config from '@/config/index.js';
-import soundbyteJpg from '../../assets/img/2025lameifenghui.png';
-
-import { saveData } from '@/api/2025.js';
-
-import langpkg from './lang.js';
-
-let arrivalTime = []
-const dateTimeColumns = computed(() => {
-    const now = new Date();
-    const dateList = lang.value[langType.value].dateList;
-    const years = [{ text: dateList[0], value: '', disabled: true }, ...Array.from({ length: Number(now.getFullYear()) + 1 - 1970 }, (_, i) => {
-        const t = 1970 + i + ''
-        return {
-            text: t,
-            value: t
-        }
-    }).reverse()];
-    const months = [{ text: dateList[1], value: '', disabled: true }, ...Array.from({ length: 12 }, (_, i) => {
-        const m = (i + 1).toString().padStart(2, '0')
-        return {
-            text: m,
-            value: m
-        }
-    })];
-
-    // 动态计算当前选中年月对应的天数
-    const daysInMonth = new Date(
-        parseInt(arrivalTime[0] || '0'),
-        parseInt(arrivalTime[1] || '0'),
-        0
-    ).getDate();
-    const days = [{ text: dateList[2], value: '', disabled: true }, ...Array.from({ length: daysInMonth }, (_, i) => {
-        const d = (i + 1).toString().padStart(2, '0')
-        return {
-            text: d,
-            value: d
-        }
-    })];
-
-    const hours = [{ text: dateList[3], value: '', disabled: true }, ...Array.from({ length: 24 }, (_, i) => {
-        const h = i.toString().padStart(2, '0')
-        return {
-            text: h,
-            value: h
-        }
-    })];
-    const minutes = [{ text: dateList[4], value: '', disabled: true }, ...Array.from({ length: 60 }, (_, i) => {
-        const m = i.toString().padStart(2, '0')
-        return {
-            text: m,
-            value: m
-        }
-    })];
-    return [years, months, days, hours, minutes];
-});
-/** const langObj = [
+// import { ref, reactive, computed } from 'vue';
+import { ref } from 'vue';
+import Introduction from './introduction.vue';
+import Fore25 from './form.vue';
+import Chin25 from './form1.vue';
+import Work25 from './form2.vue';
+const langSelect = ref(localStorage.getItem('langSelect') || 'zh');
+const componentId = ref('work25');
+const showLange = ref(false);
+
+const langObj = [
     { text: '中文', value: 'zh' },
     { text: 'English', value: 'en' },
 ]
 const langObjT = {
     zh: '中文',
     en: 'English',
-} */
-
-// import en from './en.json';
-/**
- * window.$originData.orginParames.title 页面标题
- * window.$originData.orginParames.parameters 固定参数值
- * window.$originData.urlParames url参数
- */
-
-const lang = ref(langpkg);
-const langType = ref(localStorage.getItem('langType') || 'zh');
-// const showLange = ref(false);
-const showCardType = ref(false);
-const showReachTime = ref(false);
-const showLeavingTime = ref(false);
-const showBirthday = ref(false);
-const showCheckOutTime = ref(false);
-const showCountryOrRegion = ref(false);
-
-// 展示表单
-const showForm = ref(false);
-
-const cardTypeList = ref(lang.value[langType.value].cardTypeList)
-const countryOrRegionList = ref(lang.value[langType.value].countryOrRegionList)
-const photo = ref([])
-const isFile = () => {
-    return photo.value && photo.value.length;
-};
-// const langChange = ({ selectedValues }) => {
-//     langType.value = selectedValues[0];
-//     localStorage.setItem('langType', selectedValues[0]);
-//      const cardTypeList = ref(lang.value[langType.value].cardTypeList)
-//      const countryOrRegionList = ref(lang.value[langType.value].countryOrRegionList)
-//     showLange.value = false;
-// };
-
-const from = reactive({
-    name: '',
-    idCard: '',
-    career: '',
-    contact: '',
-    photoUrl: '',
-    cardType: [],
-    birthday: '',
-    message: '',
-    arrivalTime: ''
-});
-
-const beforeDelete = () => {
-    from.photoUrl = '';
-    photo.value = [];
-}
-const filesize = () => showToast(lang.value[langType.value].fileSize);
-const createTextDate = values => values.slice(0, 3).join('-') + ' ' + values.slice(3).join(':');
-const packerConfirm = (values) => {
-    showBirthday.value = false;
-    from.birthday = createTextDate(values.selectedValues);
-}
-const reachTimeConfirm = ({ selectedValues }) => {
-    showReachTime.value = false;
-    from.reachTime = createTextDate(selectedValues);
-}
-const leavingTimeConfirm = ({ selectedValues }) => {
-    showLeavingTime.value = false;
-    from.leavingTime = createTextDate(selectedValues);
 }
-const checkOutTimeConfirm = ({ selectedValues }) => {
-    showCheckOutTime.value = false;
-    from.checkOutTime = createTextDate(selectedValues);
-}
-const onCountryOrRegionConfirm = ({ selectedValues }) => {
-    showCountryOrRegion.value = false;
-    from.name = '';
-    from.provinceCity = '';
-    from.lastName = '';
-    from.firstName = '';
-    from.countryRegion = '';
-    from.countryOrRegion = selectedValues[0];
+const checkVerificationCode = (code) => {
+    componentId.value = code;
 }
 
-// 选择证件类型
-const onConfirm = ({ selectedValues }) => {
-    showCardType.value = false;
-    from.cardType = selectedValues;
-    from.cardTypeName = selectedValues[0];
-};
+const closeComponent = () => {
+    componentId.value = '';
+}
 
-const beforeRead = () => {
-    if (!isFile()) showToast(lang.value[langType.value].changePhono);
-    const item = photo.value[0]
-    const oriData = new FormData();
-    oriData.append('file', item.file);
-    axios({
-        method: 'post',
-        url: config.base.Url2025 + 'dev/file/uploadDynamicReturnUrl',
-        headers: {
-            'Content-Type': 'multipart/form-data',
-        },
-        data: oriData,
-    }).then(res => {
-        if (res.status !== 200 || res.data.code !== 0) {
-            showToast(lang.value[langType.value].upFileError);
-            from.photoUrl = ''
-            return
-        }
-        showToast(lang.value[langType.value].upFileSusscess);
-        from.photoUrl = res.data.data
-        photo.value = [
-            {
-                url: res.data.data,
-                file: item.file,
-            }
-        ]
-    })
-    return false;
+const langChange = ({ selectedValues }) => {
+    langSelect.value = selectedValues[0];
+    localStorage.setItem('langSelect', selectedValues[0]);
+    // const cardTypeList = ref(lang.value[langSelect.value].cardTypeList)
+    // const countryOrRegionList = ref(lang.value[langSelect.value].countryOrRegionList)
+    showLange.value = false;
 };
 
-// 选择权限范围
-let loading= false
-const onSubmit = () => {
-    if (loading) return
-    loading = true
-    if (!showForm.value) {
-        showForm.value = true;
-        return;
-    }
-    if (!isFile()) showToast(lang.value[langType.value].selectFile);
-    saveData({
-        countryOrRegion: from.countryOrRegion, // 国家/地区
-        name: from.name, // 姓名
-        lastName: from.lastName, // 姓
-        firstName: from.firstName, // 名
-        photo: from.photoUrl, // 照片
-        gender: from.gender, // 性别
-        phone: from.contact, // 手机号
-        email: from.email, // 邮箱
-        birthDate: from.birthday, // 出生日期
-        workUnit: from.workUnit, // 工作单位
-        countryRegion: from.countryRegion, // 国家/地区
-        provinceCity: from.provinceCity, // 省市区
-        cardTypeName: from.cardTypeName, // 证件类型
-        unitType: from.unitType, // 单位类型
-        idCard: from.passport, // 证件号
-        religion: from.belief, // 宗教
-        position: from.career, // 职务
-        fax: from.fax, // fax
-        officeAddress: from.officeAddress, // 办公地址
-        dietaryRequirements: from.catering, // 饮食要求
-        emergencyContact: from.emergencyContact, // 紧急联系人
-        emergencyContactPhone: from.emergencyContactPhone, // 紧急联系人电话
-        interviewIntention: from.interview, // 接受采访意向
-        arrivalNumberXian: from.reachTrainNumber, // 抵达西安交通车次
-        arrivalTimeXian: from.reachTime, // 抵达西安时间
-        departureNumber: from.leavingTrainNumber, // 离开车次
-        departureTime: from.leavingTime, // 离开时间
-        checkOutTime: from.checkOutTime, // 离店时间
-        remarks: from.message, // 备注
-    }).then(() => {
-        // 清空表单内容 from
-        // Object.keys(from).forEach((key) => {
-        //     from[key] = '';
-        // });
-        loading = false
-        showDialog({
-            message: lang.value[langType.value].registration,
-        })
-    }).catch((err) => {
-        console.log(err);
-        loading = false
-        showToast(lang.value[langType.value].registrationError);
-    });
-};
 </script>
 <style lang="scss">
 .fenghui {
@@ -620,6 +64,7 @@ const onSubmit = () => {
     position: relative;
     font-family: Source Han Sans CN !important;
 
+
     .swith {
         position: absolute;
         right: 10px;
@@ -632,82 +77,18 @@ const onSubmit = () => {
         }
     }
 
-    .text {
-        padding: 8px 8px 0 8px;
-        text-align: justify;
-        line-height: 1.75em;
-        font-size: 16px;
-        color: #3D3D3D;
-    }
-
-    h4 {
-        color: #031280 !important;
-    }
-
-    .introduce {
-        background-color: #FAFAFA;
-        padding-bottom: 10px;
-        overflow: hidden;
-        font-family: Source Han Serif CN !important;
-    }
-
-    .label {
-        min-width: 4em;
-        display: inline-block;
-        text-align: justify;
-        text-align-last: justify;
-    }
-
-
-    .van-hairline--bottom:after {
-        border-bottom-width: 0px;
-    }
-
-    .van-button__text {
-        font-size: 15px;
-        font-weight: 400;
-        color: #031280;
-    }
-
-    .icon {
-        position: absolute;
-        right: 10px;
-        top: 50%;
-        transform: translateY(-50%);
-    }
-
-    .btn_bottom {
-        color: #ffffff;
-        text-align: center;
-        background: linear-gradient(270deg, #1D19BC 0%, #1C4CD5 100%);
-        width: calc(100% - 80px);
-        margin: 0 auto;
-
-        .van-button__text {
-            color: #ffffff;
-        }
-    }
-
-    .submit {
-        .title {
-            padding: 0 16px;
-        }
-
-        .van-cell-group,
-        .van-cell {
-            margin: 0%;
-        }
-
-        .van-field__body input {
 
-            &::placeholder,
-            &::-webkit-input-placeholder,
-            &:-moz-placeholder,
-            &::-moz-placeholder,
-            &:-ms-input-placeholder {
-                color: rgba(255, 255, 255, 0.6);
-            }
+    .form {
+        font-size: 14px;
+        font-weight: 400 !important;
+        padding: 11px 0;
 
+        .label {
+            min-width: 4em;
+            display: inline-block;
+            text-align: justify;
+            -moz-text-align-last: justify;
+            text-align-last: justify;
         }
     }
 }

+ 263 - 0
src/view/fenghui/introduction.vue

@@ -0,0 +1,263 @@
+<template>
+    <div class="introduce">
+        <svg xmlns="http://www.w3.org/2000/svg" class="img" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none"
+            version="1.1" width="32" height="33" viewBox="0 0 32 33">
+            <defs>
+                <clipPath id="master_svg0_28_400">
+                    <rect x="0" y="0" width="32" height="33" rx="0" />
+                </clipPath>
+            </defs>
+            <g clip-path="url(#master_svg0_28_400)">
+                <g>
+                    <g>
+                        <g>
+                            <g>
+                                <g>
+                                    <path
+                                        d="M9.21835866821289,1.9825439453125C8.99650866821289,2.1213209453125,8.77466866821289,2.2637019453125,8.556428668212892,2.4168969453124998C3.9048636682128905,5.6430039453125005,1.7855986682128906,10.6317539453125,3.8255036682128907,13.5604439453125C4.177208668212891,14.0669439453125,4.6335286682128904,14.4760439453125,5.167408668212891,14.7932439453125C3.562173668212891,12.0141439453125,5.205278668212891,6.7207739453125,9.21835866821289,1.9825439453125Z"
+                                        fill="#F8B62D" fill-opacity="1" style="mix-blend-mode:passthrough" />
+                                </g>
+                            </g>
+                        </g>
+                        <g>
+                            <g>
+                                <path
+                                    d="M13.242306057739258,1.52114C13.842916057739258,0.975041,14.456156057739257,0.468596,15.072996057739259,0C10.791176057739257,1.7302,7.669096057739258,5.10229,6.2135630577392575,8.29055C5.843819057739258,9.15025,5.575077057739258,9.98471,5.412751057739258,10.7741C4.987094057739258,13.1549,5.730190057739258,15.1014,7.901756057739258,15.6619C7.887326057739258,15.6475,7.872906057739257,15.6349,7.858476057739258,15.6187C5.326176757739258,12.8431,7.735826057739258,6.53331,13.242306057739258,1.52114Z"
+                                    fill="#F8B62D" fill-opacity="1" style="mix-blend-mode:passthrough" />
+                            </g>
+                        </g>
+                        <g>
+                            <path
+                                d="M13.10150351196289,12.066364038085938C12.11491351196289,10.166764038085937,14.37486351196289,7.048754038085938,18.146293511962888,5.100474038085937C19.414193511962893,4.446244038085937,20.69299351196289,4.0064840380859374,21.86899351196289,3.7848040380859373C21.75889351196289,3.1630140380859375,21.531693511962892,2.5826740380859374,21.17279351196289,2.0672140380859374C21.16189351196289,2.0527940380859375,21.149293511962888,2.0383840380859377,21.138493511962892,2.0221640380859376C20.095993511962888,2.3213440380859374,19.029993511962893,2.7016240380859373,17.96409351196289,3.1630140380859375C15.39391351196289,4.275024038085937,13.179063511962891,5.702444038085938,11.494473511962891,7.232594038085938C12.793083511962891,5.610524038085938,14.49931351196289,4.0064840380859374,16.53020351196289,2.5898840380859376C17.55829351196289,1.8725740380859375,18.60259351196289,1.2507740380859376,19.641493511962892,0.7245080380859374C18.97589351196289,0.3676540380859375,18.19679351196289,0.1477741380859375,17.34364351196289,0.0612640380859375C16.59333351196289,0.4938150380859375,15.84302351196289,0.9750270380859375,15.101733511962891,1.5085040380859376C9.05416351196289,5.852034038085938,5.932073511962891,11.842864038085937,8.12889651196289,14.890564038085937C8.329099511962891,15.168064038085937,8.56717351196289,15.411364038085937,8.839523511962891,15.622264038085937C8.91888351196289,15.683564038085937,9.00185351196289,15.741264038085937,9.086623511962891,15.797064038085937C9.164183511962891,15.797064038085937,9.24354351196289,15.795264038085937,9.32290351196289,15.791664038085937C11.41691351196289,15.715964038085938,13.81754351196289,14.931964038085937,16.06667351196289,13.461364038085938C14.65082351196289,13.418064038085937,13.56143351196289,12.953064038085937,13.10150351196289,12.066364038085938Z"
+                                fill="#C30D23" fill-opacity="1" style="mix-blend-mode:passthrough" />
+                        </g>
+                        <g>
+                            <g>
+                                <g>
+                                    <path
+                                        d="M22.779983520507812,18.925861895751954C23.001830520507813,18.787061895751954,23.223677520507813,18.644661895751952,23.441915520507813,18.491561895751953C28.093483520507814,15.265411895751953,30.212743520507814,10.276661895751953,28.17283352050781,7.3479318957519535C27.82112352050781,6.841485895751953,27.364813520507813,6.432364895751953,26.830933520507813,6.115161895751953C28.43797352050781,8.894301895751953,26.79486352050781,14.187631895751952,22.779983520507812,18.925861895751954Z"
+                                        fill="#00913A" fill-opacity="1" style="mix-blend-mode:passthrough" />
+                                </g>
+                            </g>
+                            <g>
+                                <g>
+                                    <path
+                                        d="M18.757935556640625,19.387292385864257C18.157325556640625,19.93339238586426,17.544090556640626,20.43979238586426,16.925445556640625,20.908392385864257C21.207265556640625,19.178192385864257,24.329345556640625,15.806092385864257,25.784875556640625,12.617872385864258C26.154615556640625,11.758182385864258,26.423355556640622,10.923722385864258,26.585685556640627,10.134312385864257C27.011345556640627,7.753482385864258,26.268245556640625,5.807005385864258,24.096675556640626,5.246492385864258C24.111105556640624,5.260910685864258,24.125535556640624,5.273526685864258,24.139965556640625,5.289747385864258C26.672265556640625,8.065282385864258,24.262615556640625,14.376912385864259,18.757935556640625,19.387292385864257Z"
+                                        fill="#00913A" fill-opacity="1" style="mix-blend-mode:passthrough" />
+                                </g>
+                            </g>
+                            <g>
+                                <path
+                                    d="M18.898375668945313,8.843871032714844C19.884965668945313,10.743491032714843,17.625015668945313,13.861451032714843,13.853625668945313,15.809721032714844C12.585675668945314,16.463921032714843,11.306905668945312,16.90372103271484,10.130935668945312,17.125421032714844C10.240957668945313,17.747221032714844,10.468214668945313,18.32752103271484,10.827136668945313,18.843021032714844C10.837958668945312,18.857421032714846,10.850584668945313,18.87182103271484,10.861405668945313,18.888021032714846C11.903905668945313,18.588821032714844,12.969845668945313,18.208621032714845,14.035795668945312,17.747221032714844C16.605965668945313,16.635221032714846,18.82082566894531,15.207721032714844,20.50543566894531,13.677621032714844C19.206805668945314,15.299721032714844,17.500565668945313,16.90372103271484,15.469685668945313,18.320321032714844C14.441615668945312,19.037621032714846,13.397315668945312,19.659421032714846,12.358415668945312,20.185721032714845C13.023955668945312,20.542521032714845,13.803125668945313,20.762421032714844,14.656245668945314,20.84892103271484C15.406555668945312,20.416421032714844,16.15686566894531,19.935221032714843,16.898155668945314,19.401721032714846C22.94573566894531,15.058181032714844,26.067835668945314,9.067351032714843,23.87103566894531,6.019675032714844C23.670835668945312,5.742121032714843,23.432735668945313,5.498812032714843,23.160335668945315,5.287943032714844C23.08103566894531,5.226665032714844,22.998035668945313,5.1689920327148435,22.913235668945312,5.113121032714844C22.83573566894531,5.113121032714844,22.75633566894531,5.114923362714844,22.67703566894531,5.118528042714844C20.58293566894531,5.194224432714844,18.182345668945313,5.978222032714844,15.933215668945312,7.448891032714844C17.349065668945315,7.490351032714844,18.436655668945313,7.955341032714844,18.898375668945313,8.843871032714844Z"
+                                    fill="#172A88" fill-opacity="1" style="mix-blend-mode:passthrough" />
+                            </g>
+                        </g>
+                    </g>
+                </g>
+                <g>
+                    <g>
+                        <path
+                            d="M3.8093366622924805,24.36883544921875L4.15563366229248,24.36883544921875L4.15563366229248,25.88997544921875L5.94302666229248,25.88997544921875L5.94302666229248,24.36883544921875L6.28932666229248,24.36883544921875L6.28932666229248,27.82022544921875L5.94302666229248,27.82022544921875L5.94302666229248,26.20176544921875L4.15563366229248,26.20176544921875L4.15563366229248,27.82022544921875L3.8093366622924805,27.82022544921875L3.8093366622924805,24.36883544921875Z"
+                            fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough" />
+                    </g>
+                    <g>
+                        <path
+                            d="M6.9980573654174805,24.36883544921875L7.34435436541748,24.36883544921875L7.34435436541748,27.82022544921875L6.9980573654174805,27.82022544921875L6.9980573654174805,24.36883544921875Z"
+                            fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough" />
+                    </g>
+                    <g>
+                        <path
+                            d="M8.04773998260498,24.36883544921875L8.514879982604981,24.36883544921875L10.44295998260498,27.23267544921875L10.45197998260498,27.23267544921875L10.45197998260498,24.36883544921875L10.798279982604981,24.36883544921875L10.798279982604981,27.82022544921875L10.45197998260498,27.82022544921875L8.40305498260498,24.78336044921875L8.39403698260498,24.78336044921875L8.39403698260498,27.82022544921875L8.04774067063498,27.82022544921875L8.04773998260498,24.36883544921875Z"
+                            fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough" />
+                    </g>
+                    <g>
+                        <path
+                            d="M12.68314416229248,24.36883544921875L13.070924162292481,24.36883544921875L14.55531416229248,27.82022544921875L14.176554162292481,27.82022544921875L13.67694416229248,26.65774544921875L12.07171416229248,26.65774544921875L11.566697162292481,27.82022544921875L11.20777416229248,27.82022544921875L12.68314416229248,24.36883544921875ZM12.20337916229248,26.34775544921875L13.54347416229248,26.34775544921875L12.87974416229248,24.76173444921875L12.20337916229248,26.34775544921875Z"
+                            fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough" />
+                    </g>
+                    <g>
+                        <path
+                            d="M20.94031810760498,24.36883544921875L22.83051810760498,24.36883544921875L22.83051810760498,24.68063144921875L21.28481210760498,24.68063144921875L21.28481210760498,25.92241544921875L22.77821810760498,25.92241544921875L22.77821810760498,26.23420544921875L21.28481210760498,26.23420544921875L21.28481210760498,27.50843544921875L22.83051810760498,27.50843544921875L22.83051810760498,27.82022544921875L20.94031810760498,27.82022544921875L20.94031810760498,24.36883544921875Z"
+                            fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough" />
+                    </g>
+                    <g>
+                        <path
+                            d="M23.49769115447998,24.36883544921875L23.84398815447998,24.36883544921875L23.84398815447998,27.50843544921875L25.27246115447998,27.50843544921875L25.27246115447998,27.82022544921875L23.49769115447998,27.82022544921875L23.49769115447998,24.36883544921875Z"
+                            fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough" />
+                    </g>
+                    <g>
+                        <path
+                            d="M26.803749631042482,24.36883544921875L27.19152963104248,24.36883544921875L28.67591963104248,27.82022544921875L28.29715963104248,27.82022544921875L27.79754963104248,26.65774544921875L26.19231963104248,26.65774544921875L25.68730263104248,27.82022544921875L25.32837963104248,27.82022544921875L26.803749631042482,24.36883544921875ZM26.322184631042482,26.34775544921875L27.66227963104248,26.34775544921875L26.99854963104248,24.76173444921875L26.322184631042482,26.34775544921875Z"
+                            fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough" />
+                    </g>
+                    <g>
+                        <rect x="14.74634838104248" y="25.92242431640625" width="1.8397027254104614"
+                            height="0.31179681420326233" rx="0" fill="#FFFFFF" fill-opacity="1"
+                            style="mix-blend-mode:passthrough" />
+                    </g>
+                    <g>
+                        <g>
+                            <path
+                                d="M1.7277373654174806,27.472394375C0.9648023654174804,27.472394375,0.3461573654174805,26.854204375000002,0.3461573654174805,26.091834375C0.3461573654174805,25.329465375,0.9648033654174805,24.711277375,1.7277373654174806,24.711277375C2.1858573654174807,24.711277375,2.5916773654174805,24.934762375,2.8423773654174807,25.278998375L3.2499973654174803,25.278998375C2.9596173654174804,24.734705375,2.3860673654174804,24.365234375,1.7259373654174806,24.365234375C0.7718143654174805,24.365234375,-0.0019426345825195312,25.138417375,-0.0019426345825195312,26.091834375C-0.0019426345825195312,27.045244375,0.7718143654174805,27.818434375,1.7259373654174806,27.818434375C2.3914773654174803,27.818434375,2.9686373654174805,27.441754375,3.2572173654174805,26.890254375L2.8532073654174805,26.890254375C2.6043073654174806,27.241694375,2.1930773654174804,27.472394375,1.7277373654174806,27.472394375Z"
+                                fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough" />
+                        </g>
+                    </g>
+                    <g>
+                        <g>
+                            <path
+                                d="M18.885826049499514,27.472394375C18.122889049499513,27.472394375,17.504245049499513,26.854204375000002,17.504245049499513,26.091834375C17.504245049499513,25.329465375,18.12289004949951,24.711277375,18.885826049499514,24.711277375C19.34394604949951,24.711277375,19.749766049499513,24.934762375,20.00046604949951,25.278998375L20.408086049499513,25.278998375C20.11770604949951,24.734705375,19.544156049499513,24.365234375,18.88402604949951,24.365234375C17.92990304949951,24.365234375,17.15614604949951,25.138417375,17.15614604949951,26.091834375C17.15614604949951,27.045244375,17.92990304949951,27.818434375,18.88402604949951,27.818434375C19.54956604949951,27.818434375,20.12672604949951,27.441754375,20.415306049499513,26.890254375L20.011296049499514,26.890254375C19.76238604949951,27.241694375,19.35296604949951,27.472394375,18.885826049499514,27.472394375Z"
+                                fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough" />
+                        </g>
+                    </g>
+                    <g>
+                        <g>
+                            <path
+                                d="M30.468826232604982,27.472394375C29.70589123260498,27.472394375,29.08724623260498,26.854204375000002,29.08724623260498,26.091834375C29.08724623260498,25.329465375,29.70589223260498,24.711277375,30.468826232604982,24.711277375C30.92694623260498,24.711277375,31.332766232604982,24.934762375,31.58346623260498,25.278998375L31.99108623260498,25.278998375C31.70070623260498,24.734705375,31.12715623260498,24.365234375,30.46702623260498,24.365234375C29.51290323260498,24.365234375,28.73914623260498,25.138417375,28.73914623260498,26.091834375C28.73914623260498,27.045244375,29.51290323260498,27.818434375,30.46702623260498,27.818434375C31.13256623260498,27.818434375,31.70972623260498,27.441754375,31.998306232604982,26.890254375L31.594296232604982,26.890254375C31.34539623260498,27.241694375,30.93416623260498,27.472394375,30.468826232604982,27.472394375Z"
+                                fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough" />
+                        </g>
+                    </g>
+                </g>
+                <g>
+                    <g>
+                        <path
+                            d="M17.513444479003905,29.548583984375L17.513444479003905,31.639243984375C17.513444479003905,31.891563984375,17.551320479003905,32.120453984375,17.630681479003908,32.264643984375C17.839902479003907,32.652133984375,18.180793479003906,32.689983984375,18.344913479003907,32.689983984375C18.509053479003907,32.689983984375,18.849933479003905,32.652133984375,19.059153479003907,32.264643984375C19.138513479003905,32.120453984375,19.176393479003906,31.891563984375,19.176393479003906,31.639243984375L19.176393479003906,29.548583984375L19.522693479003905,29.548583984375L19.522693479003905,31.639243984375C19.522693479003905,31.927613984375,19.475793479003904,32.176323984375,19.392823479003905,32.358363984375C19.154743479003905,32.875623984375,18.669573479003905,33.001783984375,18.346723479003906,33.001783984375C18.023871479003905,33.001783984375,17.538694479003905,32.875623984375,17.300615479003906,32.358363984375C17.215844179003906,32.176333984375,17.170753479003906,31.929413984375,17.170753479003906,31.639243984375L17.170753479003906,29.548583984375L17.513444479003905,29.548583984375Z"
+                            fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough" />
+                    </g>
+                    <g>
+                        <path
+                            d="M8.188575744628906,29.546783447265625L9.934485744628907,29.546783447265625L9.934485744628907,29.858579447265626L8.533068744628906,29.858579447265626L8.533068744628906,31.109373447265625L9.882185744628906,31.109373447265625L9.882185744628906,31.421163447265624L8.533068744628906,31.421163447265624L8.533068744628906,32.99817344726563L8.188575744628906,32.99817344726563L8.188575744628906,29.546783447265625Z"
+                            fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough" />
+                    </g>
+                    <g>
+                        <path
+                            d="M14.310157775878906,29.548583984375L15.188525775878906,29.548583984375C15.650257775878906,29.548583984375,15.879317775878906,29.604454684375,16.038037775878905,29.678348984375C16.425817775878905,29.860379984375,16.654877775878905,30.238862984375,16.654877775878905,30.662403984375C16.654877775878905,31.161633984375,16.295957775878907,31.669883984375,15.628607775878907,31.711343984375L16.604377775878906,32.998173984375L16.169697775878905,32.998173984375L14.997340775878905,31.435583984375C15.435617775878907,31.435583984375,15.585327775878905,31.430183984375,15.740437775878906,31.385123984375C16.119197775878906,31.276983984375,16.310387775878908,30.959783984375,16.310387775878908,30.653393984375C16.310387775878908,30.383049984375,16.157077775878907,30.103693984375,15.931617775878905,29.990150984375C15.726007775878907,29.882011984375,15.549247775878907,29.860385984375,15.258867775878906,29.860385984375L14.656455775878907,29.860385984375L14.656455775878907,32.999983984375L14.310159151938906,32.999983984375L14.310157775878906,29.548583984375Z"
+                            fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough" />
+                    </g>
+                    <g>
+                        <path
+                            d="M20.229443634628907,29.548583984375L20.761514244628906,29.548583984375L22.016838244628907,32.488123984375L23.277578244628906,29.548583984375L23.809648244628907,29.548583984375L23.809648244628907,32.999973984375L23.463348244628907,32.999973984375L23.463348244628907,29.925262984375L23.454328244628908,29.925262984375L22.161128244628905,32.999973984375L21.867138244628904,32.999973984375L20.582953244628907,29.925262984375L20.573935244628906,29.925262984375L20.573935244628906,32.999973984375L20.227638244628906,32.999973984375L20.227638244628906,29.548583984375L20.229443634628907,29.548583984375Z"
+                            fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough" />
+                    </g>
+                    <g>
+                        <g>
+                            <path
+                                d="M12.055257319335938,29.548568725585938C11.101134319335937,29.548568725585938,10.327377319335938,30.321751725585937,10.327377319335938,31.27516872558594C10.327377319335938,32.22857872558594,11.101134319335937,33.00176872558594,12.055257319335938,33.00176872558594C13.009377319335938,33.00176872558594,13.783137319335937,32.22857872558594,13.783137319335937,31.27516872558594C13.783137319335937,30.321754725585937,13.009377319335938,29.548568725585938,12.055257319335938,29.548568725585938ZM12.055257319335938,32.65572872558594C11.292320319335937,32.65572872558594,10.673674319335937,32.03753872558594,10.673674319335937,31.27516872558594C10.673674319335937,30.512796725585936,11.292320319335937,29.894608725585936,12.055257319335938,29.894608725585936C12.818187319335937,29.894608725585936,13.436837319335938,30.512794725585938,13.436837319335938,31.27516872558594C13.436837319335938,32.03753872558594,12.818187319335937,32.65572872558594,12.055257319335938,32.65572872558594Z"
+                                fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough" />
+                        </g>
+                    </g>
+                </g>
+            </g>
+        </svg>
+        <h4 class="text" v-text="lang[langType].title"></h4>
+        <div style="font-size: 14px;margin-bottom: 40px" class="text" v-html="lang[langType].marstContent"></div>
+
+        <h4 class="text" v-text="lang[langType].wrestleMania"></h4>
+        <p class="text" v-html="lang[langType].wrestleManiaContent"></p>
+        <div class="line"></div>
+        <h4 class="text" v-text="lang[langType].venue"></h4>
+        <p class="text" v-html="lang[langType].venueContent"></p>
+        <div class="line"></div>
+        <h4 class="text" v-text="lang[langType].organization"></h4>
+        <van-row>
+            <van-col span="7">
+                <div class="text" v-text="lang[langType].organizationSub1"></div>
+            </van-col>
+            <van-col span="17">
+                <div class="text" v-html="lang[langType].organizationSub2"></div>
+            </van-col>
+        </van-row>
+        <van-row>
+            <van-col span="7">
+                <div class="text" v-text="lang[langType].organizationSub3"></div>
+            </van-col>
+            <van-col span="17">
+                <div class="text" v-html="lang[langType].organizationSub4"></div>
+            </van-col>
+        </van-row>
+        <van-button class="btn_bottom" block type="primary" @click="showCheck = true, code = 'fore25'">
+            {{ lang[langType].signUp }}
+        </van-button>
+        <van-button class="btn_bottom" block type="primary" @click="showCheck = true, code = 'chin25'">
+            {{ lang[langType].signUpZH }}
+        </van-button>
+        <van-button class="btn_bottom" block type="primary" @click="showCheck = true, code = 'work25'">
+            {{ lang[langType].signUpWK }}
+        </van-button>
+
+        <van-dialog :confirmButtonText="lang[langType].confirm" :cancelButtonText="lang[langType].cancel" @confirm="checkVerificationCode" v-model:show="showCheck" :title="lang[langType].verificationCode"
+            show-cancel-button>
+            <van-field v-model="verificationCode" :placeholder="lang[langType].verificationCodeContent" />
+        </van-dialog>
+    </div>
+</template>
+<script setup>
+import { defineProps, ref, defineEmits } from 'vue';
+import { showToast } from 'vant';
+import lang from './lang.js';
+const showCheck = ref(false);
+const verificationCode = ref('');
+const prprs = defineProps(['langType']);
+const emits = defineEmits(['checkVerificationCode']);
+let code = ''
+
+const checkVerificationCode = () => {
+    if (code !== verificationCode.value) {
+        showToast({
+            message: lang[prprs.langType].verificationCodeError,
+            type: 'fail',
+        });
+        return
+    }
+    emits('checkVerificationCode', code);
+}
+</script>
+
+<style lang="scss">
+.introduce {
+    box-sizing: border-box;
+    color: #ffffff;
+    padding-bottom: 10px;
+    overflow: hidden;
+    font-family: Source Han Serif CN !important;
+    position: relative;
+    background: url('../../assets/img/2025lameifenghui.png') no-repeat 100% 100%;
+    width: 100%;
+    height: 100vh;
+    overflow-y: scroll;
+    background-size: 100% 100%;
+
+    .img {
+        box-sizing: border-box;
+        position: relative;
+        top: 24px;
+        left: 26px;
+        width: 32px;
+        height: 32px;
+        margin-bottom: 16px;
+    }
+
+    .text {
+        box-sizing: border-box;
+        padding: 8px 8px 0 30px;
+        text-align: justify;
+        line-height: 1.75em;
+        font-size: 14px;
+    }
+
+    .line {
+        width: 16px;
+        height: 1px;
+        background-color: #FFFFFF;
+        margin: 17px auto 17px 30px;
+    }
+
+    .btn_bottom {
+        background-color: #ffffff;
+        text-align: center;
+        color: #001770;
+        width: calc(100% - 40px);
+        margin: 24px auto 21px auto;
+        font-size: 16px;
+    }
+}
+</style>

+ 184 - 18
src/view/fenghui/lang.js

@@ -1,34 +1,41 @@
 export default {
     "zh": {
-        "signUp": "我要报名",
+        "confirm": "同意",
+        "cancel": "拒绝",
+        "verificationCode": "邀请码",
+        "title": "2025中拉互联网发展与合作论坛",
+        "verificationCodeError": "验证失败",
+        "verificationCodeContent": "请输入邀请码",
+        "signUp": "国外嘉宾注册",
+        "signUpZH": "国内嘉宾注册",
+        "signUpWK": "工作人员注册",
         "wrestleMania": "举办时间",
-        "wrestleManiaContent": "2025年5⽉15⽇⾄16⽇(会期2天,不含报到和离会)",
+        "wrestleManiaContent": "2025年5⽉15⽇⾄16⽇(会期2天)",
         "venue": "举办地点",
         "venueContent": "西安国际会议中⼼<br />(西安市灞桥区浐灞⽣态区世博⼤道2626号)",
         "marst": "论坛主题",
-        "marstContent": "共享数字发展新机遇  共建中拉网络空间命运共同体",
+        "marstContent": "共享数字发展新机遇<br />共建中拉网络空间命运共同体",
         "organization": "组织机构",
         "organizationSub1": "主办单位:",
         "organizationSub2": "国家互联⽹信息办公室<br />陕西省⼈民政府",
         "organizationSub3": "承办单位:",
         "organizationSub4": "陕西省互联⽹信息办公室<br />陕西省外事办公室",
-        "scale": "参会嘉宾及论坛规模",
-        "scaleContent": "拟邀请中国及拉美和加勒⽐国家政府部门代表、驻华使节,国际组织、⽹信企业、智库、媒体及机构代表等,论坛参会论坛规模约300⼈。其中外宾约150⼈,包含拉美国家⽹络安全研修班30余名外籍学员。",
         "basicInformation": "个人基本信息",
-        "name": "姓名(含大写)",
+        "name": "姓名",
+        "upFile": "上传中...",
         "nameContent": "示例:张三 ZHANG SAN",
         "lastName": "姓",
         "lastNameContent": "请输入姓氏",
         "firstName": "名",
         "firstNameContent": "请输入名称",
-        "idCard": "身份证",
-        "idCardContent": "请输入身份证",
         "career": "职务",
         "careerContent": "请输入职务",
         "contact": "手机号码",
         "contactContent": "请输入手机号",
         "company": "工作单位",
         "companyContent": "请输入工作单位",
+        "companyB": "工作单位及部门",
+        "companyBContent": "请填写您的工作单位及部门",
         "photo": "照片",
         "photoContent": "请选择照片",
         "photoSubContent": "支持上传jpg,png等格式的图片,大小100M以内",
@@ -41,14 +48,11 @@ export default {
         "ortherNotes": "备注",
         "ortherNotesContent": "特殊需求",
         "submit": "提交申请",
-        "copyright": "由陕西广电融媒体集团技术研究院提供计算服务",
         "fileSize": "超出文件大小限制",
         "upFileError": "上传失败",
         "upFileSusscess": "上传成功",
-        "changePhono": "请选择照片",
-        "selectFile": "请选择照片",
-        "registration": "报名成功",
-        "registrationError": "报名失败",
+        "registration": "注册成功",
+        "registrationError": "注册失败",
         "gender": "性别",
         "genderContent": "请输入性别",
         "email": "邮箱",
@@ -61,14 +65,16 @@ export default {
         "countryRegionContent": "请输入国家/地区",
         "provinceCity": "省市",
         "provinceCityContent": "请输入省市",
-        "passportContent": "证件号码不能为空",
+        "passportContent": "请输入证件号码",
         "passport": "证件号码",
+        "IDcardNumber": "身份证号",
+        "IDcardNumberContent": "请输入身份证号",
+        "workGroupText": "工作组",
+        "workGroupContent": "请选择工作组",
         "belief": "宗教信仰",
         "beliefContent": "请输入宗教信仰",
-        "cardTyep": "证件类型",
-        "cardTyepContent": "请选择证件类型",
-        "fax": "传真",
-        "faxContent": "请输入传真",
+        "fax": "传真/邮箱",
+        "faxContent": "请输入传真/邮箱",
         "officeAddress": "办公地址",
         "officeAddressContent": "请输入办公地址",
         "catering": "饮食要求",
@@ -102,7 +108,167 @@ export default {
             { text: '其他国家', value: '其他国家' },
         ],
         "dateList": ['年', '月', '日', '时', '分'],
+        "distinguishedGuest": {
+            "fore25": "国外嘉宾",
+            "chin25": "国内嘉宾",
+            "work25": "工作人员",
+        },
+        "foreignCountryUnitType": [
+            { text: '政府机构', value: '政府机构' },
+            { text: '企业/公司', value: '企业/公司' },
+            { text: '学术机构/高校', value: '学术机构/高校' },
+            { text: '非营利组织', value: '非营利组织' },
+            { text: '国际组织', value: '国际组织' },
+            { text: '媒体机构', value: '媒体机构' },
+            { text: '行业协会', value: '行业协会' },
+            { text: '其他', value: '其他' },
+        ],
+        "workGroup": [
+            { text: '会务组', value: '会务组' },
+            { text: '接待组', value: '接待组' },
+            { text: '新闻宣传组-新闻', value: '新闻宣传组-新闻' },
+            { text: '新闻宣传组-媒体人员', value: '新闻宣传组-媒体人员' },
+            { text: '综合保障组-交通及医疗', value: '综合保障组-交通及医疗' },
+            { text: '综合保障组-音视频录制', value: '综合保障组-音视频录制' },
+            { text: '综合保障组-报名通道维护', value: '综合保障组-报名通道维护' },
+            { text: '综合保障组-志愿者', value: '综合保障组-志愿者' },
+            { text: '综合保障组-其他', value: '综合保障组-其他' },
+        ]
     },
     "en": {
+        "confirm": "Yes",
+        "cancel": "No",
+        "title": "2025 China-Latin America Forum on Internet Development and Cooperation",
+        "verificationCode": "Invitation Code",
+        "verificationCodeError": "Verification Failed",
+        "verificationCodeContent": "Please enter the invitation code",
+        "signUp": "Overseas Guests",
+        "signUpZH": "Domestic Guests",
+        "signUpWK": "Staff Members",
+        "wrestleMania": "Date",
+        "wrestleManiaContent": "May 15 - 16, 2025",
+        "venue": "Venue",
+        "venueContent": "Xi’an International Convention Center<br />(No. 2626, Expo Avenue, Chanba Ecological Area, Baqiao District, Xi’an City)",
+        "marst": "Forum Theme",
+        "marstContent": "Sharing New Opportunities in Digital Development<br />Building a China-Latin America Community with a Shared Future in Cyberspace",
+        "organization": "Organizer",
+        "organizationSub1": "Organizers:",
+        "organizationSub2": "Cyberspace Administration of China<br />The People’s Government of Shaanxi Province",
+        "organizationSub3": "Undertakers:",
+        "organizationSub4": "Cyberspace Administration of Shaanxi Province<br />Foreign Affairs Office of Shaanxi Province",
+        "basicInformation": "Personal Basic Information",
+        "name": "Name",
+        "upFile": "Uploading...",
+        "nameContent": "Name",
+        "lastName": "Last Name",
+        "lastNameContent": "Last Name",
+        "firstName": "First Name",
+        "firstNameContent": "First Name",
+        "career": "Position",
+        "careerContent": "Position",
+        "contact": "Mobile Phone Number",
+        "contactContent": "Mobile Phone Number",
+        "company": "Name of Employer",
+        "companyContent": "Name of Employer",
+        "companyB": "Employer and Department",
+        "companyBContent": "Employer and Department",
+        "photo": "Photo",
+        "photoContent": "Photo",
+        "photoSubContent": "Supports uploading images in jpg, png and other formats, up to 100M in size",
+        "conference": "Conference Information",
+        "conferenceType": "Type of ID Document",
+        "conferenceTypeContent": "Type of ID Document",
+        "unitType": "Organization Type",
+        "unitTypeContent": "Organization Type",
+        "orther": "Other Materials",
+        "ortherNotes": "Remarks",
+        "ortherNotesContent": "Remarks",
+        "submit": "Submit",
+        "fileSize": "Exceeds file size limit",
+        "upFileError": "Upload failed",
+        "upFileSusscess": "Upload successful",
+        "registration": "Registration successful",
+        "registrationError": "Registration failed",
+        "gender": "Gender",
+        "genderContent": "Gender",
+        "email": "Email",
+        "emailContent": "Email",
+        "birthday": "Date of Birth",
+        "birthdayContent": "Date of Birth",
+        "countryOrRegion": "Country",
+        "countryOrRegionContent": "Please select country",
+        "countryRegion": "Country/Region",
+        "countryRegionContent": "Country/Region",
+        "provinceCity": "Province/City",
+        "provinceCityContent": "Province/City",
+        "passportContent": "Fill in according to the option",
+        "passport": "Fill in according to the option",
+        "IDcardNumber": "ID Card Number",
+        "IDcardNumberContent": "ID Card Number",
+        "workGroupText": "Working Group",
+        "workGroupContent": "Please select working group",
+        "belief": "Religious Belief",
+        "beliefContent": "Religious Belief",
+        "fax": "Fax/Email",
+        "faxContent": "Fax/Email",
+        "officeAddress": "Office Address",
+        "officeAddressContent": "Office Address",
+        "catering": "Dietary Requirements",
+        "cateringContent": "Dietary Requirements",
+        "emergencyContact": "Emergency Contact Name",
+        "emergencyContactContent": "Emergency Contact Name",
+        "emergencyContactPhone": "Emergency Contact Phone",
+        "emergencyContactPhoneContent": "Emergency Contact Phone",
+        "interview": "Willingness to be Interviewed",
+        "interviewContent": "Willingness to be Interviewed",
+        "reach": "Train/Flight Arriving in Xi’an",
+        "reachContent": "Train/Flight Arriving in Xi’an",
+        "reachTrainNumber": "Departing Train/Flight",
+        "reachTrainNumberContent": "Departing Train/Flight",
+        "reachTime": "Arrival Time in Xi’an",
+        "reachTimeContent": "Arrival Time in Xi’an",
+        "leavingTrainNumber": "Departing Train/Flight",
+        "leavingTrainNumberContent": "Departing Train/Flight",
+        "leavingTime": "Drop-off Time(Return Time)",
+        "leavingTimeContent": "Drop-off Time(Return Time)",
+        "checkOutTime": "Check-out Time",
+        "checkOutTimeContent": "Check-out Time",
+        "cardTypeList": [
+            { "text": "ID Card", "value": "身份证" },
+            { "text": "Passport", "value": "护照" },
+            { "text": "Hong Kong and Macao Residents’ Travel Permit", "value": "港澳居民通行证" },
+            { "text": "Taiwan Residents’ Travel Permit", "value": "台湾居民通行证" }
+        ],
+        "countryOrRegionList": [
+            { "text": "China", "value": "中国" },
+            { "text": "Other Countries", "value": "其他国家" }
+        ],
+        "dateList": ["Year", "Month", "Day", "Hour", "Minute"],
+        "distinguishedGuest": {
+            "fore25": "Foreign Guests",
+            "chin25": "Domestic Guests",
+            "work25": "Staff Members"
+        },
+        "foreignCountryUnitType": [
+            { "text": "Government Agency", "value": "Government Agency" },
+            { "text": "Enterprise/Corporation", "value": "Enterprise/Corporation" },
+            { "text": "Academic Institution/University", "value": "Academic Institution/University" },
+            { "text": "Non-Profit Organization", "value": "Non-Profit Organization" },
+            { "text": "International Organization", "value": "International Organization" },
+            { "text": "Media/Press", "value": "Media/Press" },
+            { "text": "Industry Association", "value": "Industry Association" },
+            { "text": "Other", "value": "Other" }
+        ],
+        "workGroup": [
+            { "text": "Conference Affairs Group", "value": "会务组" },
+            { "text": "Reception Group", "value": "接待组" },
+            { "text": "News and Publicity Group - News", "value": "新闻宣传组-新闻" },
+            { "text": "News and Publicity Group - Media Personnel", "value": "新闻宣传组-媒体人员" },
+            { "text": "Comprehensive Support Group - Transportation and Medical", "value": "综合保障组-交通及医疗" },
+            { "text": "Comprehensive Support Group - Audio-Visual Recording", "value": "综合保障组-音视频录制" },
+            { "text": "Comprehensive Support Group - Registration Channel Maintenance", "value": "综合保障组-报名通道维护" },
+            { "text": "Comprehensive Support Group - Volunteers", "value": "综合保障组-志愿者" },
+            { "text": "Comprehensive Support Group - Others", "value": "综合保障组-其他" }
+        ]
     }
 }