Browse Source

添加演示

liyongli 3 weeks ago
parent
commit
e5a21bfd5f

+ 3 - 0
src/config/page.json

@@ -87,5 +87,8 @@
     },
     "fenghui": {
         "title": "中拉互联网发展与合作论坛"
+    },
+    "fenghuitest": {
+        "title": "(演示)中拉互联网发展与合作论坛"
     }
 }

+ 380 - 0
src/view/fenghuitest/en.js

@@ -0,0 +1,380 @@
+export default {
+    "more": "View more meeting details",
+    "timesText": "Can be modified twice",
+    "searchText": "Only one chance to modify",
+    "technicalAdvice": "Technical Support:455769421@qq.com,+86-15809218541",
+    "level": "Position Level",
+    "levelContent": "Position Level",
+    "identityType": "Identity category",
+    "identityTypeContent": "Identity category",
+    "media": "For Chinese media",
+    "staff": "For Chinese staff",
+    "volunteer": "For Chinese volunteer",
+    "upRegistration": "Registration information updated successfully",
+    "active0": "Will you attend the opening ceremony on the morning of May 15th?",
+    "active": "Which of the sub-forums on May 15th will you attend?",
+    "active0Content": "Will you attend the opening ceremony on the morning of May 15th",
+    "active1": "Sharing Opportunities for the Digital Economy Development",
+    "active2": "Jointly Maintaining Safety in Cyberspace ",
+    "active3": "Jointly Promoting Artificial Intelligence Development and Governance",
+    "active4": "Watch OMNI Chang’An (China’s First Ever Site-specific Conceptual Theatre)",
+    "active5": "Visit the Western Technological Innovation Port in Xi’an Jiaotong University and eclicktech, an internet-based company",
+    "active6": "Visit the Emperor Qinshihuang’s Mausoleum Site Museum",
+    "active7": "Will not attend",
+    "activitiesAttended": "Which of the following activities on May 16th will you attend? (multiple selections allowed):",
+    "activitiesAttendedContent": "Activities to be attended",
+    "username": "Username",
+    "password": "Password",
+    "login": "Login",
+    "tologoText": "​​Login for Registered Users​",
+    "confirm": "Yes",
+    "cancel": "No",
+    "title": "China-CELAC Internet Development and Cooperation Forum",
+    "verificationCode": "Invitation Code",
+    "verificationCodeError": "Verification Failed",
+    "verificationCodeContent": "Please enter the invitation code",
+    "signUp": "Foreign Guests and Residents of HK, Macao, and Taiwan, China",
+    "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 Digital Development Opportunities<br />Jointly Building a Community with a Shared Future for China-CELAC in Cyberspace",
+    "organization": "Organizer",
+    "organizationSub1": "Hosts:",
+    "organizationSub2": "Cyberspace Administration of China<br />The People's Government of Shaanxi Province",
+    "organizationSub3": "Organizers:",
+    "organizationSub4": "Cyberspace Administration of Shaanxi Province<br />Foreign Affairs Office of Shaanxi Provincial People's Government",
+    "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": "Employer",
+    "companyContent": "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 IDs",
+    "conferenceTypeContent": "Type of IDs",
+    "unitType": "Employer Type",
+    "unitTypeContent": "Employer Type",
+    "orther": "Other Materials",
+    "ortherNotes": "Remarks",
+    "ortherNotesContent": "Remarks",
+    "submit": "Submit",
+    "fileSize": "Exceeds file size limit",
+    "upFileError": "Upload failed",
+    "upFileSusscess": "Upload successful",
+    "registration": "Registration successful",
+    "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": "Number",
+    "passport": "Number",
+    "IDcardNumber": "Number",
+    "IDcardNumberContent": "Number",
+    "workGroupText": "Working Group",
+    "workGroupTextContent": "Please select working group",
+    "belief": "Religious Belief",
+    "beliefContent": "Religious Belief",
+    "fax": "Fax/Email",
+    "faxContent": "Fax/Email",
+    "officeAddress": "Office Address",
+    "officeAddressContent": "Office Address",
+    "catering": "Dietary Restrictions",
+    "cateringContent": "Dietary Restrictions",
+    "emergencyContact": "Contact Person",
+    "emergencyContactContent": "Contact Person",
+    "emergencyContactPhone": "Contact Number",
+    "emergencyContactPhoneContent": "Contact Number",
+    "interview": "Would you like to be interviewed?",
+    "interviewContent": "Would you like to be interviewed?",
+    "reach": "Train/Flight Arriving in Xi’an",
+    "reachContent": "Train/Flight Arriving in Xi’an",
+    "reachTrainNumber": "Train/Flight Arriving in Xi’an",
+    "reachTrainNumberContent": "Train/Flight Arriving in Xi’an",
+    "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",
+    "careerList": [
+        { text: 'Provincial-Ministerial', value: '正部' },
+        { text: 'Sub-Provincial (Ministerial)', value: '副部' },
+        { text: 'Bureau-Director / Deputy-Bureau-Director', value: '司局' },
+        { text: 'Others', value: '其他' },
+    ],
+    "cardTypeList": [
+        // { "text": "ID Card", "value": "身份证" },
+        { "text": "Passport", "value": "护照" },
+        { "text": "Mainland Travel Permit for Hong Kong and Macao Residents", "value": "港澳居民通行证" },
+        { "text": "Mainland Travel Permit for Taiwan Residents", "value": "台湾居民通行证" }
+    ],
+    "dateList": ["Year", "Month", "Day", "Hour", "Minute"],
+    "distinguishedGuest": {
+        "fore25": "国外嘉宾",
+        "chin25": "国内嘉宾",
+        "work25": "工作人员",
+    },
+    "foreignCountryUnitType": [
+        { "text": "Government ", "value": "政府机构" },
+        { "text": "Enterprise/Corporation", "value": "企业/公司" },
+        { "text": "Academic Institution/University", "value": "学术机构/高校" },
+        { "text": "Non-Profit Organization", "value": "非营利组织" },
+        { "text": "International Organization", "value": "国际组织" },
+        { "text": "Media/Press", "value": "媒体机构" },
+        { "text": "Industry Association", "value": "行业协会" },
+        { "text": "Others", "value": "其他" }
+    ],
+    "workGroup": [
+        { "text": "Conference Affairs Group", "value": "会务组" },
+        { "text": "Reception Group", "value": "接待组" },
+        { "text": "News Promotion Group - News", "value": "新闻宣传组-新闻" },
+        { "text": "News Promotion Group - Media Personnel", "value": "新闻宣传组-媒体人员" },
+        { "text": "Comprehensive Support Group - Transportation and Medical Care", "value": "综合保障组-交通及医疗" },
+        { "text": "Comprehensive Support Group - Security", "value": "综合保障组-安保" },
+        { "text": "Comprehensive Support Group - Audio and Video Recording", "value": "综合保障组-音视频录制" },
+        { "text": "Comprehensive Support Group - Registration Channel Maintenance", "value": "综合保障组-报名通道维护" },
+        { "text": "Comprehensive Support Group - Volunteer", "value": "综合保障组-志愿者" },
+        { "text": "Foreign Affairs Group", "value": "外事组" },
+        { "text": "Comprehensive Support Group - Others", "value": "综合保障组-其他" }
+    ],
+    "countryRegionList": [
+        { "text": "Asia", "value": "亚洲", "disabled": true },
+        { "text": "Afghanistan", "value": "阿富汗" },
+        { "text": "UAE (United Arab Emirates)", "value": "阿联酋" },
+        { "text": "Oman", "value": "阿曼" },
+        { "text": "Azerbaijan", "value": "阿塞拜疆" },
+        { "text": "Pakistan", "value": "巴基斯坦" },
+        { "text": "Palestine", "value": "巴勒斯坦" },
+        { "text": "Bahrain", "value": "巴林" },
+        { "text": "Bhutan", "value": "不丹" },
+        { "text": "DPRK (Democratic People's Republic of Korea)", "value": "朝鲜" },
+        { "text": "Timor-Leste", "value": "东帝汶" },
+        { "text": "Philippines", "value": "菲律宾" },
+        { "text": "Georgia", "value": "格鲁吉亚" },
+        { "text": "Kazakhstan", "value": "哈萨克斯坦" },
+        { "text": "ROK (Republic of Korea)", "value": "韩国" },
+        { "text": "Kyrgyzstan", "value": "吉尔吉斯斯坦" },
+        { "text": "Cambodia", "value": "柬埔寨" },
+        { "text": "Qatar", "value": "卡塔尔" },
+        { "text": "Kuwait", "value": "科威特" },
+        { "text": "Laos", "value": "老挝" },
+        { "text": "Lebanon", "value": "黎巴嫩" },
+        { "text": "Maldives", "value": "马尔代夫" },
+        { "text": "Malaysia", "value": "马来西亚" },
+        { "text": "Mongolia", "value": "蒙古" },
+        { "text": "Bangladesh", "value": "孟加拉国" },
+        { "text": "Myanmar", "value": "缅甸" },
+        { "text": "Nepal", "value": "尼泊尔" },
+        { "text": "Japan", "value": "日本" },
+        { "text": "Saudi Arabia", "value": "沙特阿拉伯" },
+        { "text": "Sri Lanka", "value": "斯里兰卡" },
+        { "text": "Tajikistan", "value": "塔吉克斯坦" },
+        { "text": "Thailand", "value": "泰国" },
+        { "text": "Türkiye", "value": "土耳其" },
+        { "text": "Turkmenistan", "value": "土库曼斯坦" },
+        { "text": "Brunei", "value": "文莱" },
+        { "text": "Uzbekistan", "value": "乌兹别克斯坦" },
+        { "text": "Singapore", "value": "新加坡" },
+        { "text": "Syria", "value": "叙利亚" },
+        { "text": "Armenia", "value": "亚美尼亚" },
+        { "text": "Yemen", "value": "也门" },
+        { "text": "Iraq", "value": "伊拉克" },
+        { "text": "Iran", "value": "伊朗" },
+        { "text": "Israel", "value": "以色列" },
+        { "text": "India", "value": "印度" },
+        { "text": "Indonesia", "value": "印度尼西亚" },
+        { "text": "Jordan", "value": "约旦" },
+        { "text": "Viet Nam", "value": "越南" },
+        { "text": "The Chinese mainland", "value": "中国大陆" },
+        { "text": "Hong Kong, China", "value": "中国香港" },
+        { "text": "Macao, China", "value": "中国澳门" },
+        { "text": "Taiwan, China", "value": "中国台湾" },
+
+        { "text": "Africa", "value": "非洲", "disabled": true },
+        { "text": "Algeria", "value": "阿尔及利亚" },
+        { "text": "Egypt", "value": "埃及" },
+        { "text": "Ethiopia", "value": "埃塞俄比亚" },
+        { "text": "Angola", "value": "安哥拉" },
+        { "text": "Benin", "value": "贝宁" },
+        { "text": "Botswana", "value": "博茨瓦纳" },
+        { "text": "Burkina Faso", "value": "布基纳法索" },
+        { "text": "Burundi", "value": "布隆迪" },
+        { "text": "Equatorial Guinea", "value": "赤道几内亚" },
+        { "text": "Togo", "value": "多哥" },
+        { "text": "Eritrea", "value": "厄立特里亚" },
+        { "text": "Cabo Verde", "value": "佛得角" },
+        { "text": "Gambia", "value": "冈比亚" },
+        { "text": "Congo", "value": "刚果(布)" },
+        { "text": "DRC (Democratic Republic of the Congo)", "value": "刚果(金)" },
+        { "text": "Djibouti", "value": "吉布提" },
+        { "text": "Guinea", "value": "几内亚" },
+        { "text": "Guinea Bissau", "value": "几内亚比绍" },
+        { "text": "Ghana", "value": "加纳" },
+        { "text": "Gabon", "value": "加蓬" },
+        { "text": "Zimbabwe", "value": "津巴布韦" },
+        { "text": "Cameroon", "value": "喀麦隆" },
+        { "text": "Comoros", "value": "科摩罗" },
+        { "text": "Côte d'Ivoire", "value": "科特迪瓦" },
+        { "text": "Kenya", "value": "肯尼亚" },
+        { "text": "Lesotho", "value": "莱索托" },
+        { "text": "Liberia", "value": "利比里亚" },
+        { "text": "Libya", "value": "利比亚" },
+        { "text": "Rwanda", "value": "卢旺达" },
+        { "text": "Madagascar", "value": "马达加斯加" },
+        { "text": "Malawi", "value": "马拉维" },
+        { "text": "Mali", "value": "马里" },
+        { "text": "Mauritius", "value": "毛里求斯" },
+        { "text": "Mauritania", "value": "毛里塔尼亚" },
+        { "text": "Morocco", "value": "摩洛哥" },
+        { "text": "Mozambique", "value": "莫桑比克" },
+        { "text": "Namibia", "value": "纳米比亚" },
+        { "text": "South Africa", "value": "南非" },
+        { "text": "South Sudan", "value": "南苏丹" },
+        { "text": "Niger", "value": "尼日尔" },
+        { "text": "Nigeria", "value": "尼日利亚" },
+        { "text": "Sierra Leone", "value": "塞拉利昂" },
+        { "text": "Senegal", "value": "塞内加尔" },
+        { "text": "Seychelles", "value": "塞舌尔" },
+        { "text": "Sao Tome and Principe", "value": "圣多美和普林西比" },
+        { "text": "The Kingdom of Eswatini", "value": "斯威士兰" },
+        { "text": "Sudan", "value": "苏丹" },
+        { "text": "Somalia", "value": "索马里" },
+        { "text": "Tanzania", "value": "坦桑尼亚" },
+        { "text": "Tunisia", "value": "突尼斯" },
+        { "text": "Uganda", "value": "乌干达" },
+        { "text": "Zambia", "value": "赞比亚" },
+        { "text": "Chad", "value": "乍得" },
+        { "text": "Central African Republic", "value": "中非" },
+
+        { "text": "Europe", "value": "欧洲", "disabled": true },
+        { "text": "Albania", "value": "阿尔巴尼亚" },
+        { "text": "Ireland", "value": "爱尔兰" },
+        { "text": "Estonia", "value": "爱沙尼亚" },
+        { "text": "Andorra", "value": "安道尔" },
+        { "text": "Austria", "value": "奥地利" },
+        { "text": "Belarus", "value": "白俄罗斯" },
+        { "text": "Bulgaria", "value": "保加利亚" },
+        { "text": "North Macedonia", "value": "北马其顿" },
+        { "text": "Belgium", "value": "比利时" },
+        { "text": "Iceland", "value": "冰岛" },
+        { "text": "Bosnia and Herzegovina", "value": "波黑" },
+        { "text": "Poland", "value": "波兰" },
+        { "text": "Denmark", "value": "丹麦" },
+        { "text": "Germany", "value": "德国" },
+        { "text": "Russia", "value": "俄罗斯" },
+        { "text": "France", "value": "法国" },
+        { "text": "The Vatican City State", "value": "梵蒂冈" },
+        { "text": "Finland", "value": "芬兰" },
+        { "text": "Netherlands", "value": "荷兰" },
+        { "text": "Montenegro", "value": "黑山" },
+        { "text": "Czechia", "value": "捷克" },
+        { "text": "Croatia", "value": "克罗地亚" },
+        { "text": "Latvia", "value": "拉脱维亚" },
+        { "text": "Lithuania", "value": "立陶宛" },
+        { "text": "Liechtenstein", "value": "列支敦士登" },
+        { "text": "Luxembourg", "value": "卢森堡" },
+        { "text": "Romania", "value": "罗马尼亚" },
+        { "text": "Malta", "value": "马耳他" },
+        { "text": "Moldova", "value": "摩尔多瓦" },
+        { "text": "Monaco", "value": "摩纳哥" },
+        { "text": "Norway", "value": "挪威" },
+        { "text": "Portugal", "value": "葡萄牙" },
+        { "text": "Sweden", "value": "瑞典" },
+        { "text": "Switzerland", "value": "瑞士" },
+        { "text": "Serbia", "value": "塞尔维亚" },
+        { "text": "Cyprus", "value": "塞浦路斯" },
+        { "text": "San Marino", "value": "圣马力诺" },
+        { "text": "Slovakia", "value": "斯洛伐克" },
+        { "text": "Slovenia", "value": "斯洛文尼亚" },
+        { "text": "Ukraine", "value": "乌克兰" },
+        { "text": "Spain", "value": "西班牙" },
+        { "text": "Greece", "value": "希腊" },
+        { "text": "Hungary", "value": "匈牙利" },
+        { "text": "Italy", "value": "意大利" },
+        { "text": "United Kingdom", "value": "英国" },
+
+        { "text": "North America", "value": "北美洲", "disabled": true },
+        { "text": "Antigua and Barbuda", "value": "安提瓜和巴布达" },
+        { "text": "Barbados", "value": "巴巴多斯" },
+        { "text": "Bahamas", "value": "巴哈马" },
+        { "text": "Panama", "value": "巴拿马" },
+        { "text": "Belize", "value": "伯利兹" },
+        { "text": "Dominican Republic", "value": "多米尼加" },
+        { "text": "Dominica", "value": "多米尼克" },
+        { "text": "Grenada", "value": "格林纳达" },
+        { "text": "Costa Rica", "value": "哥斯达黎加" },
+        { "text": "Cuba", "value": "古巴" },
+        { "text": "The Republic of Haiti", "value": "海地" },
+        { "text": "Honduras", "value": "洪都拉斯" },
+        { "text": "Canada", "value": "加拿大" },
+        { "text": "United States of America", "value": "美国" },
+        { "text": "Mexico", "value": "墨西哥" },
+        { "text": "Nicaragua", "value": "尼加拉瓜" },
+        { "text": "The Republic of El Salvador", "value": "萨尔瓦多" },
+        { "text": "The Federation of Saint Kitts and Nevis", "value": "圣基茨和尼维斯" },
+        { "text": "Saint Lucia", "value": "圣卢西亚" },
+        { "text": "Saint Vincent and the Grenadines", "value": "圣文森特和格林纳丁斯" },
+        { "text": "Trinidad and Tobago", "value": "特立尼达和多巴哥" },
+        { "text": "The Republic of Guatemala", "value": "危地马拉" },
+        { "text": "Jamaica", "value": "牙买加" },
+
+        { "text": "South America", "value": "南美洲", "disabled": true },
+        { "text": "Argentina", "value": "阿根廷" },
+        { "text": "Republic of Paraguay", "value": "巴拉圭" },
+        { "text": "Brazil", "value": "巴西" },
+        { "text": "Peru", "value": "秘鲁" },
+        { "text": "Bolivia", "value": "玻利维亚" },
+        { "text": "Ecuador", "value": "厄瓜多尔" },
+        { "text": "Colombia", "value": "哥伦比亚" },
+        { "text": "Guyana", "value": "圭亚那" },
+        { "text": "Suriname", "value": "苏里南" },
+        { "text": "Venezuela", "value": "委内瑞拉" },
+        { "text": "Uruguay", "value": "乌拉圭" },
+        { "text": "Chile", "value": "智利" },
+
+        { "text": "Oceania", "value": "大洋洲", "disabled": true },
+        { "text": "Australia", "value": "澳大利亚" },
+        { "text": "Papua New Guinea", "value": "巴布亚新几内亚" },
+        { "text": "Fiji", "value": "斐济" },
+        { "text": "The Republic of Kiribati", "value": "基里巴斯" },
+        { "text": "Cook Islands", "value": "库克群岛" },
+        { "text": "The Republic of the Marshall Islands", "value": "马绍尔群岛" },
+        { "text": "Micronesia", "value": "密克罗尼西亚联邦" },
+        { "text": "The Republic of Nauru", "value": "瑙鲁" },
+        { "text": "Niue", "value": "纽埃" },
+        { "text": "The Republic of Palau", "value": "帕劳" },
+        { "text": "Samoa", "value": "萨摩亚" },
+        { "text": "Solomon Islands", "value": "所罗门群岛" },
+        { "text": "Tonga", "value": "汤加" },
+        { "text": "Tuvalu", "value": "图瓦卢" },
+        { "text": "Vanuatu", "value": "瓦努阿图" },
+        { "text": "New Zealand", "value": "新西兰" }
+    ]
+}

+ 380 - 0
src/view/fenghuitest/es.js

@@ -0,0 +1,380 @@
+export default {
+    "more": "Ver más detalles de la reunión",
+    "timesText": "Solo una oportunidad de modificación",
+    "searchText": "Por favor, introduzca la palabra clave de búsqueda",
+    "technicalAdvice": "Consultoría técnica: 455769421@qq.com",
+    "level": "Obligatorio- Nivel",
+    "levelContent": "Obligatorio- Nivel",
+    "identityType": "Categoría de identidad",
+    "identityTypeContent": "Categoría de identidad",
+    "media": "Medios de comunicación",
+    "staff": "Funcionarios",
+    "volunteer": "Voluntarios",
+    "active0": "¿Asistirás a la ceremonia de inauguración en la mañana del 15 de mayo?",
+    "active": "¿A cuál de las siguientes actividades asistirás el 15 de mayo?",
+    "active0Content": "¿Asistirás a la ceremonia de inauguración en la mañana del 15 de mayo?",
+    "active1": "Subforo I: Compartir oportunidades para el desarrollo de la economia digital",
+    "active2": "Subforo II: Colaborar en el mantenimiento la seguridad en el ciberespacio",
+    "active3": "Subforo III: Promover conjuntamente el desarrollo y la gobernanza de la inteligencia artificial",
+    "active4": "Ver OMNI Chang'An(el primer teatro conceptual de China)",
+    "active5": "Visitar el Puerto de Innovacion Tecnologica Occidental en la Universidad Jiaotong de Xi’an y eclicktech(una empresa basada en Internet)",
+    "active6": "Visitar el Museo del Mausoleo del Emperador Qinshihuang",
+    "active7": "no asistir",
+    "active1Content": "Subforo I: Compartir oportunidades para el desarrollo de la economia digital",
+    "activitiesAttended": "Actividades a las que asistirá?(Selección múltiple)",
+    "activitiesAttendedContent": "Seleccione las actividades a las que asistirá",
+    "username": "Nombre de usuario",
+    "password": "Contraseña",
+    "login": "Iniciar sesión",
+    "tologoText": "Sistema de Registro por iniciar la sesión",
+    "confirm": "Sí",
+    "cancel": "No",
+    "verificationCode": "Código de invitación",
+    "title": "Foro de Desarrollo y Cooperacion en Internet China-CELAC",
+    "verificationCodeError": "Error de verificación",
+    "verificationCodeContent": "Ingrese el código de invitación",
+    "signUp": "Registro de invitados internacionales",
+    "signUpZH": "Registro de invitados nacionales",
+    "signUpWK": "Registro de funcionarios",
+    "wrestleMania": "Fecha de celebración",
+    "wrestleManiaContent": "los dias 15 y 16 de mayo de 2025",
+    "venue": "Lugar de celebración",
+    "venueContent": "Centro Internacional de Conferencias de Xi’an<br />(No. 2626, Avenida Expo, Area Ecologica de Chanba, Distrito de Baqiao, Ciudad de Xi’an)",
+    "marst": "Tema del foro",
+    "marstContent": "Compartir las nuevas oportunidades de desarrollo digital<br />Construir conjuntamente una comunidad de destino compartido en el ciberespacio para China-CELAC",
+    "organization": "Organización",
+    "organizationSub1": "Anfitriones: ",
+    "organizationSub2": "Administracion del Ciberespacio de China<br />Gobierno Popular de la Provincia de Shaanxi",
+    "organizationSub3": "Organizadores: ",
+    "organizationSub4": "Administracion del Ciberespacio de la Provincia de Shaanxi<br />Oficina de Relaciones Exteriores del Gobierno Popular Provincial de Shaanxi",
+    "basicInformation": "Información personal básica",
+    "name": "Nombre",
+    "upFile": "Subiendo...",
+    "nameContent": "Ejemplo: Zhang San ZHANG SAN",
+    "lastName": "Apellido",
+    "lastNameContent": "Ingrese su apellido",
+    "firstName": "Nombre",
+    "firstNameContent": "Ingrese su nombre",
+    "career": "Cargo",
+    "careerContent": "Ingrese su cargo",
+    "contact": "Número de teléfono móvil",
+    "contactContent": "Ingrese su número de teléfono móvil",
+    "company": "Organización",
+    "companyContent": "Ingrese el nombre de su organización",
+    "companyB": "Organización y departamento",
+    "companyBContent": "Ingrese su organización y departamento",
+    "photo": "Foto",
+    "photoContent": "Seleccione una foto",
+    "photoSubContent": "Se admiten formatos como jpg, png, etc., con un tamaño máximo de 100M",
+    "conference": "Información de participación",
+    "conferenceType": "Tipo de documento",
+    "conferenceTypeContent": "Seleccione el tipo de documento",
+    "unitType": "Tipo de organización",
+    "unitTypeContent": "Seleccione el tipo de organización",
+    "orther": "Otros materiales",
+    "ortherNotes": "Notas",
+    "ortherNotesContent": "Requisitos especiales",
+    "submit": "Enviar solicitud",
+    "fileSize": "Tamaño de archivo excedido",
+    "networkError": "Error de red",
+    "upFileError": "Error al subir",
+    "upFileSusscess": "Subida exitosa",
+    "upRegistration": "Actualización de registro exitosa",
+    "registration": "Registro exitoso",
+    "gender": "Género",
+    "genderContent": "Ingrese su género",
+    "email": "Correo electrónico",
+    "emailContent": "Ingrese su correo electrónico",
+    "birthday": "Fecha de nacimiento",
+    "birthdayContent": "Ingrese su fecha de nacimiento",
+    "countryOrRegion": "País",
+    "countryOrRegionContent": "Seleccione un país",
+    "countryRegion": "País/Región",
+    "countryRegionContent": "Ingrese país/región",
+    "provinceCity": "Provincia/Ciudad",
+    "provinceCityContent": "Ingrese provincia/ciudad",
+    "passportContent": "Ingrese número de documento",
+    "passport": "Número de documento",
+    "IDcardNumber": "Número de documento de identidad",
+    "IDcardNumberContent": "Ingrese número de documento de identidad",
+    "workGroupText": "Equipo de trabajo",
+    "workGroupTextContent": "Seleccione equipo de trabajo",
+    "belief": "Creencias religiosas",
+    "beliefContent": "Ingrese sus creencias religiosas",
+    "fax": "Fax/Correo electrónico",
+    "faxContent": "Ingrese fax/correo electrónico",
+    "officeAddress": "Dirección de oficina",
+    "officeAddressContent": "Ingrese dirección de oficina",
+    "catering": "Requisitos dietéticos",
+    "cateringContent": "Ingrese requisitos dietéticos",
+    "emergencyContact": "Persona de contacto",
+    "emergencyContactContent": "Ingrese persona de contacto",
+    "emergencyContactPhone": "Teléfono",
+    "emergencyContactPhoneContent": "Teléfono",
+    "interview": "Acepta entrevistas",
+    "interviewContent": "Seleccione si acepta entrevistas",
+    "reach": "Medio de llegada a Xi’an",
+    "reachContent": "Ingrese medio de transporte a Xi’an",
+    "reachTrainNumber": "Tren/Vuelo de llegada",
+    "reachTrainNumberContent": "Ingrese tren/vuelo/matrícula de llegada",
+    "reachTime": "Hora de llegada a Xi’an",
+    "reachTimeContent": "Ingrese hora de llegada a Xi’an",
+    "leavingTrainNumber": "Tren/Vuelo de salida",
+    "leavingTrainNumberContent": "Ingrese tren/vuelo/matrícula de salida",
+    "leavingTime": "Hora de partida",
+    "leavingTimeContent": "Ingrese hora de partida",
+    "checkOutTime": "Hora de salida del hotel",
+    "checkOutTimeContent": "Ingrese hora de salida del hotel",
+    "careerList": [
+        { text: 'Nivel Provincial-Ministerial', value: '正部' },
+        { text: 'Nivel Subprovincial (ministerial)', value: '副部' },
+        { text: 'Nivel de Director de Buró/ Nivel de Director Adjunto de Buró', value: '司局' },
+        { text: 'Otros', value: '其他' },
+    ],
+    "cardTypeList": [
+        // { "text": "Documento de identidad", "value": "身份证" },
+        { "text": "Pasaporte", "value": "护照" },
+        { "text": "Tarjeta del permiso de viaje a China continental para residentes de Hong Kong y Macao", "value": "港澳居民通行证" },
+        { "text": "Tarjeta del permiso de viaje a China continental para residentes de Taiwan", "value": "台湾居民通行证" }
+    ],
+    "dateList": ["Año", "Mes", "Día", "Hora", "Minuto"],
+    "distinguishedGuest": {
+        "fore25": "国外嘉宾",
+        "chin25": "国内嘉宾",
+        "work25": "工作人员",
+    },
+    "foreignCountryUnitType": [
+        { "text": "Institución gubernamental", "value": "政府机构" },
+        { "text": "Empresa/Corporación", "value": "企业/公司" },
+        { "text": "Institución académica/Universidad", "value": "学术机构/高校" },
+        { "text": "Organización sin fines de lucro", "value": "非营利组织" },
+        { "text": "Organización internacional", "value": "国际组织" },
+        { "text": "Entidad de medios de comunicación", "value": "媒体机构" },
+        { "text": "Asociación industrial", "value": "行业协会" },
+        { "text": "Otros", "value": "其他" }
+    ],
+    "workGroup": [
+        { "text": "Equipo de Asuntos de Conferencias", "value": "会务组" },
+        { "text": "Equipo de Recepción", "value": "接待组" },
+        { "text": "Equipo de Prensa y Comunicación- Noticias", "value": "新闻宣传组-新闻" },
+        { "text": "Equipo de Prensa y Comunicación- Personal de los medios", "value": "新闻宣传组-媒体人员" },
+        { "text": "Equipo de Apoyo Integral- Transporte y Servicios Médicos", "value": "综合保障组-交通及医疗" },
+        { "text": "Equipo de Apoyo Integral- Grabación Audiovisual", "value": "综合保障组-音视频录制" },
+        { "text": "Equipo de Apoyo Integral- Mantenimiento del Sistema de Registro", "value": "综合保障组-报名通道维护" },
+        { "text": "Equipo de Apoyo Integral- Voluntarios", "value": "综合保障组-志愿者" },
+        { "text": "Equipo de Apoyo Integral-Otros", "value": "综合保障组-其他" }
+    ],
+    "countryRegionList": [
+        { "text": "África", "value": "非洲", "disabled": true },
+        { "text": "Angola", "value": "安哥拉" },
+        { "text": "Argelia", "value": "阿尔及利亚" },
+        { "text": "Benín", "value": "贝宁" },
+        { "text": "Botsuana", "value": "博茨瓦纳" },
+        { "text": "Burkina Faso", "value": "布基纳法索" },
+        { "text": "Burundi", "value": "布隆迪" },
+        { "text": "Cabo Verde", "value": "佛得角" },
+        { "text": "Camerún", "value": "喀麦隆" },
+        { "text": "Chad", "value": "乍得" },
+        { "text": "Comoras", "value": "科摩罗" },
+        { "text": "Costa de Marfil", "value": "科特迪瓦" },
+        { "text": "Egipto", "value": "埃及" },
+        { "text": "Eritrea", "value": "厄立特里亚" },
+        { "text": "Etiopía", "value": "埃塞俄比亚" },
+        { "text": "Gabón", "value": "加蓬" },
+        { "text": "Gambia", "value": "冈比亚" },
+        { "text": "Ghana", "value": "加纳" },
+        { "text": "Guinea", "value": "几内亚" },
+        { "text": "Guinea Ecuatorial", "value": "赤道几内亚" },
+        { "text": "Guinea-Bisáu", "value": "几内亚比绍" },
+        { "text": "Kenia", "value": "肯尼亚" },
+        { "text": "Lesoto", "value": "莱索托" },
+        { "text": "Liberia", "value": "利比里亚" },
+        { "text": "Libia", "value": "利比亚" },
+        { "text": "Madagascar", "value": "马达加斯加" },
+        { "text": "Malaui", "value": "马拉维" },
+        { "text": "Malí", "value": "马里" },
+        { "text": "Marruecos", "value": "摩洛哥" },
+        { "text": "Mauricio", "value": "毛里求斯" },
+        { "text": "Mauritania", "value": "毛里塔尼亚" },
+        { "text": "Mozambique", "value": "莫桑比克" },
+        { "text": "Namibia", "value": "纳米比亚" },
+        { "text": "Níger", "value": "尼日尔" },
+        { "text": "Nigeria", "value": "尼日利亚" },
+        { "text": "República Centroafricana", "value": "中非" },
+        { "text": "República del Congo", "value": "刚果(布)" },
+        { "text": "República Democrática del Congo", "value": "刚果(金)" },
+        { "text": "Ruanda", "value": "卢旺达" },
+        { "text": "Santo Tomé y Príncipe", "value": "圣多美和普林西比" },
+        { "text": "Senegal", "value": "塞内加尔" },
+        { "text": "Seychelles", "value": "塞舌尔" },
+        { "text": "Sierra Leona", "value": "塞拉利昂" },
+        { "text": "Somalia", "value": "索马里" },
+        { "text": "Suazilandia", "value": "斯威士兰" },
+        { "text": "Sudáfrica", "value": "南非" },
+        { "text": "Sudán", "value": "苏丹" },
+        { "text": "Sudán del Sur", "value": "南苏丹" },
+        { "text": "Tanzania", "value": "坦桑尼亚" },
+        { "text": "Togo", "value": "多哥" },
+        { "text": "Túnez", "value": "突尼斯" },
+        { "text": "Uganda", "value": "乌干达" },
+        { "text": "Yibuti", "value": "吉布提" },
+        { "text": "Zambia", "value": "赞比亚" },
+        { "text": "Zimbabue", "value": "津巴布韦" },
+
+        { "text": "Asia", "value": "亚洲", "disabled": true },
+        { "text": "Afganistán", "value": "阿富汗" },
+        { "text": "Arabia Saudita", "value": "沙特阿拉伯" },
+        { "text": "Armenia", "value": "亚美尼亚" },
+        { "text": "Azerbaiyán", "value": "阿塞拜疆" },
+        { "text": "Bangladés", "value": "孟加拉国" },
+        { "text": "Baréin", "value": "巴林" },
+        { "text": "Birmania", "value": "缅甸" },
+        { "text": "Brunéi", "value": "文莱" },
+        { "text": "Bután", "value": "不丹" },
+        { "text": "Camboya", "value": "柬埔寨" },
+        { "text": "Catar", "value": "卡塔尔" },
+        { "text": "Emiratos Árabes Unidos", "value": "阿联酋" },
+        { "text": "Estado de Palestina", "value": "巴勒斯坦" },
+        { "text": "Filipinas", "value": "菲律宾" },
+        { "text": "Georgia", "value": "格鲁吉亚" },
+        { "text": "India", "value": "印度" },
+        { "text": "Indonesia", "value": "印度尼西亚" },
+        { "text": "Irak", "value": "伊拉克" },
+        { "text": "Irán", "value": "伊朗" },
+        { "text": "Israel", "value": "以色列" },
+        { "text": "Japón", "value": "日本" },
+        { "text": "Jordania", "value": "约旦" },
+        { "text": "Kazajistán", "value": "哈萨克斯坦" },
+        { "text": "Kirguistán", "value": "吉尔吉斯斯坦" },
+        { "text": "Kuwait", "value": "科威特" },
+        { "text": "Laos", "value": "老挝" },
+        { "text": "Líbano", "value": "黎巴嫩" },
+        { "text": "Malasia", "value": "马来西亚" },
+        { "text": "Maldivas", "value": "马尔代夫" },
+        { "text": "Mongolia", "value": "蒙古" },
+        { "text": "Nepal", "value": "尼泊尔" },
+        { "text": "Omán", "value": "阿曼" },
+        { "text": "Pakistán", "value": "巴基斯坦" },
+        { "text": "República de Corea", "value": "韩国" },
+        { "text": "República Popular Democrática de Corea", "value": "朝鲜" },
+        { "text": "Singapur", "value": "新加坡" },
+        { "text": "Siria", "value": "叙利亚" },
+        { "text": "Sri Lanka", "value": "斯里兰卡" },
+        { "text": "Tailandia", "value": "泰国" },
+        { "text": "Tayikistán", "value": "塔吉克斯坦" },
+        { "text": "Timor Oriental", "value": "东帝汶" },
+        { "text": "Turkmenistán", "value": "土库曼斯坦" },
+        { "text": "Turquía", "value": "土耳其" },
+        { "text": "Uzbekistán", "value": "乌兹别克斯坦" },
+        { "text": "Vietnam", "value": "越南" },
+        { "text": "Yemen", "value": "也门" },
+        { "text": "China continental", "value": "中国大陆" },
+        { "text": "Hong Kong, China", "value": "中国香港" },
+        { "text": "Macao, China", "value": "中国澳门" },
+        { "text": "Taiwán, China", "value": "中国台湾" },
+
+        { "text": "Europa", "value": "欧洲", "disabled": true },
+        { "text": "Albania", "value": "阿尔巴尼亚" },
+        { "text": "Alemania", "value": "德国" },
+        { "text": "Andorra", "value": "安道尔" },
+        { "text": "Austria", "value": "奥地利" },
+        { "text": "Bélgica", "value": "比利时" },
+        { "text": "Bielorrusia", "value": "白俄罗斯" },
+        { "text": "Bosnia y Herzegovina", "value": "波黑" },
+        { "text": "Bulgaria", "value": "保加利亚" },
+        { "text": "Chipre", "value": "塞浦路斯" },
+        { "text": "Ciudad del Vaticano", "value": "梵蒂冈" },
+        { "text": "Croacia", "value": "克罗地亚" },
+        { "text": "Dinamarca", "value": "丹麦" },
+        { "text": "Eslovaquia", "value": "斯洛伐克" },
+        { "text": "Eslovenia", "value": "斯洛文尼亚" },
+        { "text": "España", "value": "西班牙" },
+        { "text": "Estonia", "value": "爱沙尼亚" },
+        { "text": "Finlandia", "value": "芬兰" },
+        { "text": "Francia", "value": "法国" },
+        { "text": "Grecia", "value": "希腊" },
+        { "text": "Hungría", "value": "匈牙利" },
+        { "text": "Irlanda", "value": "爱尔兰" },
+        { "text": "Islandia", "value": "冰岛" },
+        { "text": "Italia", "value": "意大利" },
+        { "text": "Letonia", "value": "拉脱维亚" },
+        { "text": "Liechtenstein", "value": "列支敦士登" },
+        { "text": "Lituania", "value": "立陶宛" },
+        { "text": "Luxemburgo", "value": "卢森堡" },
+        { "text": "Macedonia del Norte", "value": "北马其顿" },
+        { "text": "Malta", "value": "马耳他" },
+        { "text": "Moldavia", "value": "摩尔多瓦" },
+        { "text": "Mónaco", "value": "摩纳哥" },
+        { "text": "Montenegro", "value": "黑山" },
+        { "text": "Noruega", "value": "挪威" },
+        { "text": "Países Bajos", "value": "荷兰" },
+        { "text": "Polonia", "value": "波兰" },
+        { "text": "Portugal", "value": "葡萄牙" },
+        { "text": "Reino Unido", "value": "英国" },
+        { "text": "República Checa", "value": "捷克" },
+        { "text": "Rumanía", "value": "罗马尼亚" },
+        { "text": "Rusia", "value": "俄罗斯" },
+        { "text": "San Marino", "value": "圣马力诺" },
+        { "text": "Serbia", "value": "塞尔维亚" },
+        { "text": "Suecia", "value": "瑞典" },
+        { "text": "Suiza", "value": "瑞士" },
+        { "text": "Ucrania", "value": "乌克兰" },
+
+        { "text": "América del Norte", "value": "北美洲", "disabled": true },
+        { "text": "Antigua y Barbuda", "value": "安提瓜和巴布达" },
+        { "text": "Bahamas", "value": "巴哈马" },
+        { "text": "Barbados", "value": "巴巴多斯" },
+        { "text": "Belice", "value": "伯利兹" },
+        { "text": "Canadá", "value": "加拿大" },
+        { "text": "Costa Rica", "value": "哥斯达黎加" },
+        { "text": "Cuba", "value": "古巴" },
+        { "text": "Dominica", "value": "多米尼克" },
+        { "text": "El Salvador", "value": "萨尔瓦多" },
+        { "text": "Estados Unidos", "value": "美国" },
+        { "text": "Granada", "value": "格林纳达" },
+        { "text": "Guatemala", "value": "危地马拉" },
+        { "text": "Haití", "value": "海地" },
+        { "text": "Honduras", "value": "洪都拉斯" },
+        { "text": "Jamaica", "value": "牙买加" },
+        { "text": "México", "value": "墨西哥" },
+        { "text": "Nicaragua", "value": "尼加拉瓜" },
+        { "text": "Panamá", "value": "巴拿马" },
+        { "text": "República Dominicana", "value": "多米尼加" },
+        { "text": "San Cristóbal y Nieves", "value": "圣基茨和尼维斯" },
+        { "text": "San Vicente y las Granadinas", "value": "圣文森特和格林纳丁斯" },
+        { "text": "Santa Lucía", "value": "圣卢西亚" },
+        { "text": "Trinidad y Tobago", "value": "特立尼达和多巴哥" },
+
+        { "text": "Sudamérica", "value": "南美洲", "disabled": true },
+        { "text": "Argentina", "value": "阿根廷" },
+        { "text": "Bolivia", "value": "玻利维亚" },
+        { "text": "Brasil", "value": "巴西" },
+        { "text": "Chile", "value": "智利" },
+        { "text": "Colombia", "value": "哥伦比亚" },
+        { "text": "Ecuador", "value": "厄瓜多尔" },
+        { "text": "Guyana", "value": "圭亚那" },
+        { "text": "Paraguay", "value": "巴拉圭" },
+        { "text": "Perú", "value": "秘鲁" },
+        { "text": "Surinam", "value": "苏里南" },
+        { "text": "Uruguay", "value": "乌拉圭" },
+        { "text": "Venezuela", "value": "委内瑞拉" },
+
+        { "text": "Oceanía", "value": "大洋洲", "disabled": true },
+        { "text": "Australia", "value": "澳大利亚" },
+        { "text": "Estados Federados de Micronesia", "value": "密克罗尼西亚联邦" },
+        { "text": "Fiyi", "value": "斐济" },
+        { "text": "Islas Cook", "value": "库克群岛" },
+        { "text": "Islas Marshall", "value": "马绍尔群岛" },
+        { "text": "Islas Salomón", "value": "所罗门群岛" },
+        { "text": "Kiribati", "value": "基里巴斯" },
+        { "text": "Nauru", "value": "瑙鲁" },
+        { "text": "Niue", "value": "纽埃" },
+        { "text": "Nueva Zelanda", "value": "新西兰" },
+        { "text": "Palaos", "value": "帕劳" },
+        { "text": "Papúa Nueva Guinea", "value": "巴布亚新几内亚" },
+        { "text": "Samoa", "value": "萨摩亚" },
+        { "text": "Tonga", "value": "汤加" },
+        { "text": "Tuvalu", "value": "图瓦卢" },
+        { "text": "Vanuatu", "value": "瓦努阿图" }
+    ]
+}

+ 677 - 0
src/view/fenghuitest/form.vue

@@ -0,0 +1,677 @@
+<!-- 外国嘉宾 -->
+<template>
+    <div>
+
+        <van-nav-bar fixed :border="false">
+            <template #left>
+                <van-icon name="arrow-left" color="#3D3D3D" @click="onClickLeft" />
+            </template>
+            <template #title>
+                <p class="navTitle" v-text="lang[langType].signUp"></p>
+            </template>
+        </van-nav-bar>
+        <div class="form">
+            <van-form ref="form" @submit="onSubmit" label-width="8em">
+                <!-- 国家/地区 -->
+                <van-field size="large" input-align="right" clickable readonly
+                    @click="countryRegionList = lang[langType].countryRegionList, showCountryRegion = true"
+                    right-icon="arrow"
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].countryRegionContent }]"
+                    required v-model="formData.countryRegionName" :placeholder="lang[langType].countryRegionContent">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].countryRegion"></span>
+                    </template>
+                </van-field>
+                <van-popup v-model:show="showCountryRegion" destroy-on-close round position="bottom">
+                    <van-picker :confirm-button-text="lang[langType].confirm" :columns="countryRegionList"
+                        :cancel-button-text="lang[langType].cancel" @confirm="countryRegionConfirm"
+                        :title="lang[langType].countryRegion" @cancel="showCountryRegion = false">
+                        <template #columns-top>
+                            <van-search @update:model-value="input" v-model="searchConuntry"
+                                :placeholder="lang[langType].searchText" />
+                        </template>
+                    </van-picker>
+                </van-popup>
+
+                <!-- 姓 -->
+                <van-field size="large" 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 size="large" 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 size="large" 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 size="large" 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-button-text="lang[langType].confirm"
+                        :cancel-button-text="lang[langType].cancel" @confirm="packerConfirm"
+                        :title="lang[langType].birthday" @cancel="showBirthday = false" :min-date="new Date(1920, 0, 1)"
+                        :max-date="new Date()" />
+                </van-popup>
+
+                <!-- 照片 -->
+                <van-field size="large" 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 class="upFileSubtitle" v-text="lang[langType].photoSubContent"> </p>
+                    </template>
+                </van-field>
+
+                <!-- 手机号 -->
+                <van-field size="large" 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 size="large" 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 size="large" 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 size="large" input-align="right" v-model="formData.emergencyContactPhone" required
+                    type="number"
+                    :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 size="large" label-align="top" v-model="formData.cardType" clickable
+                    :rules="[{ required: true, trigger: 'onChange', message: lang[langType].conferenceTypeContent }]"
+                    :placeholder="lang[langType].conferenceTypeContent" required>
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].conferenceType"></span>
+                    </template>
+                    <template #input>
+                        <van-radio-group checked-color="#3F5AC8" style="width: 100%;" v-model="formData.cardType"
+                            :direction="langType == 'zh' ? 'horizontal' : 'vertical'">
+                            <template v-for="item in cardTypeList" :key="item.value">
+                                <van-radio v-if="item.value !== '身份证'"
+                                    :style="langType == 'zh' ? 'width: 50%;margin: 10px 0 0 0;' : 'margin: 10px 0 0 0;'"
+                                    :name="item.value">{{ item.text
+                                    }}</van-radio>
+                            </template>
+                        </van-radio-group>
+                    </template>
+                </van-field>
+
+                <!-- 证件 -->
+                <van-field size="large" 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 size="large" 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 size="large" input-align="right" v-model="formData.catering" rows="1" 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 size="large" input-align="right" v-model="formData.workUnit"
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].companyContent }]" required
+                    :placeholder="lang[langType].companyContent">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].company"></span>
+                    </template>
+                </van-field>
+
+                <!-- 单位类型 -->
+                <van-field size="large" 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 :confirm-button-text="lang[langType].confirm"
+                        :cancel-button-text="lang[langType].cancel" :columns="unitTypeList"
+                        @cancel="showUnitType = false" @confirm="onUnitTypeConfirm" />
+                </van-popup>
+
+                <!-- 职务 -->
+                <van-field size="large" 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 size="large" label-align="top" v-model="formData.level"
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].levelContent }]" required
+                    :placeholder="lang[langType].levelContent">
+                    <template #label>
+                        <span :style="langType === 'zh' ? 'text-align-last: justify;' : ''"
+                            :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].level"></span>
+                    </template>
+                    <template #input>
+                        <van-radio-group checked-color="#3F5AC8" style="width: 100%;" v-model="formData.level"
+                            :direction="langType == 'zh' ? 'horizontal' : 'vertical'">
+                            <van-radio style="flex: 1;margin-top: 10px " :name="item.value"
+                                v-for="item in lang[langType].careerList" :key="item.value">{{
+                                    item.text
+                                }}</van-radio>
+                        </van-radio-group>
+                    </template>
+                </van-field>
+
+                <!-- 传真 -->
+                <van-field size="large" input-align="right" v-model="formData.fax"
+                    :placeholder="lang[langType].faxContent">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].fax"></span>
+                    </template>
+                </van-field>
+
+                <!-- 办公地址 -->
+                <van-field size="large" input-align="right" v-model="formData.officeAddress" rows="1" autosize
+                    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 size="large" label-align="top" 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 checked-color="#3F5AC8" style="width: 100%;" v-model="formData.interview"
+                            direction="horizontal">
+                            <van-radio style="flex: 1;margin-top: 10px " name="是">{{ lang[langType].confirm
+                                }}</van-radio>
+                            <van-radio style="flex: 1;margin-top: 10px " name="否">{{ lang[langType].cancel
+                                }}</van-radio>
+                        </van-radio-group>
+                    </template>
+                </van-field>
+
+                <div style="background-color: #F7F7F7;height: 10px;"></div>
+
+                <!-- 是否参加开幕式 active0  -->
+                <van-field size="large" label-align="top" v-model="formData.active1" required
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].active0Content }]"
+                    :placeholder="lang[langType].active0Content">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].active0"></span>
+                    </template>
+                    <template #input>
+                        <van-radio-group checked-color="#3F5AC8" style="width: 100%;" v-model="formData.active1"
+                            direction="horizontal">
+                            <van-radio style="flex: 1;margin-top: 10px " name="是">{{ lang[langType].confirm
+                                }}</van-radio>
+                            <van-radio style="flex: 1;margin-top: 10px " name="否">{{ lang[langType].cancel
+                                }}</van-radio>
+                        </van-radio-group>
+                    </template>
+                </van-field>
+
+                <!-- 选择分论坛  -->
+                <van-field size="large" label-align="top" required
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].activeContent }]"
+                    :placeholder="lang[langType].activeContent" v-model="formData.active2">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].active"></span>
+                    </template>
+                    <template #input>
+                        <van-radio-group checked-color="#3F5AC8" style="width: 100%;padding-left: 16px;"
+                            v-model="formData.active2">
+                            <van-radio style="flex: 1;margin-top: 10px " name="共享数字经济发展机遇">
+                                {{ lang[langType].active1 }}
+                            </van-radio>
+                            <van-radio style="flex: 1;margin-top: 10px " name="共筑网络安全防线">
+                                {{ lang[langType].active2 }}
+                            </van-radio>
+                            <van-radio style="flex: 1;margin-top: 10px " name="共商人工智能发展治理">
+                                {{ lang[langType].active3 }}
+                            </van-radio>
+                        </van-radio-group>
+                    </template>
+                </van-field>
+
+                <!-- 拟参加的活动  -->
+                <van-field size="large" label-align="top" v-model="formData.activitiesAttended" required
+                    :placeholder="lang[langType].activitiesAttendedContent">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''"
+                            v-html="lang[langType].activitiesAttended"></span>
+                    </template>
+                    <template #input>
+                        <div>
+                            <van-checkbox-group :border="false" ref="checkbox" checked-color="#3F5AC8"
+                                v-model="activitiesAttended" @change="isGroup">
+                                <van-cell clickable :title="lang[langType].active4" @click="checkboxRefs[0].toggle()">
+                                    <template #icon>
+                                        <van-checkbox :ref="el => checkboxRefs[0] = el" style="margin-right: 5px;"
+                                            name="active4" @click.stop shape="square" />
+                                    </template>
+                                </van-cell>
+                                <van-cell clickable :title="lang[langType].active5" @click="checkboxRefs[1].toggle()">
+                                    <template #icon>
+                                        <van-checkbox :ref="el => checkboxRefs[1] = el" style="margin-right: 5px;"
+                                            name="active5" @click.stop shape="square" />
+                                    </template>
+                                </van-cell>
+                                <van-cell clickable :title="lang[langType].active6" @click="checkboxRefs[2].toggle()">
+                                    <template #icon>
+                                        <van-checkbox :ref="el => checkboxRefs[2] = el" style="margin-right: 5px;"
+                                            name="active6" @click.stop shape="square" />
+                                    </template>
+                                </van-cell>
+                            </van-checkbox-group>
+                            <van-cell clickable :title="lang[langType].active7"
+                                @click="() => isUndefined(checkboxRefs[3])">
+                                <template #icon>
+                                    <div class="noClcik">
+                                        <van-checkbox checked-color="#3F5AC8" v-model="selectunde"
+                                            style="margin-right: 5px;" :ref="el => checkboxRefs[3] = el" name="none"
+                                            @click.stop shape="square" />
+                                    </div>
+                                </template>
+                            </van-cell>
+                        </div>
+
+                    </template>
+                </van-field>
+
+                <div style="background-color: #F7F7F7;height: 10px;"></div>
+
+                <!--  抵达西安交通车次 -->
+                <van-field size="large" 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 size="large" 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 :confirm-button-text="lang[langType].confirm"
+                        :cancel-button-text="lang[langType].cancel" :title="lang[langType].reachTime"
+                        :columns="dateTimeColumns" @confirm="reachTimeConfirm" @cancel="showReachTime = false" />
+                </van-popup>
+
+                <!--  离开车次 -->
+                <van-field size="large" 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 size="large" 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 :confirm-button-text="lang[langType].confirm"
+                        :cancel-button-text="lang[langType].cancel" :title="lang[langType].leavingTime"
+                        :columns="dateTimeColumns" @confirm="leavingTimeConfirm" @cancel="showLeavingTime = false" />
+                </van-popup>
+
+                <!--  离店时间 -->
+                <van-field size="large" 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 :confirm-button-text="lang[langType].confirm"
+                        :cancel-button-text="lang[langType].cancel" :title="lang[langType].checkOutTime"
+                        :columns="dateTimeColumns" @confirm="checkOutTimeConfirm" @cancel="showCheckOutTime = false" />
+                </van-popup>
+
+                <van-field size="large" 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
+                    :loading="loading"
+                    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>
+    </div>
+</template>
+<script setup>
+import { defineProps, defineEmits, defineExpose, reactive, ref, computed } from 'vue';
+import { showToast, showDialog } from 'vant';
+import { saveData, uploadImage } from '@/api/2025.js';
+import lang from './lang.js';
+const props = defineProps(['langType', 'verificationCode', 'subData']);
+
+const emits = defineEmits(['closeComponent']);
+
+const loading = ref(false);
+const formData = reactive({})
+const activitiesAttended = ref([])
+const cardTypeList = computed(() => lang[props.langType].cardTypeList)
+const unitTypeList = computed(() => lang[props.langType].foreignCountryUnitType)
+const form = ref(null);
+const showBirthday = ref(false)
+const showReachTime = ref(false)
+const showLeavingTime = ref(false)
+const showCheckOutTime = ref(false)
+const showUnitType = ref(false)
+const showCountryRegion = ref(false)
+const selectunde = ref(false)
+const photo = ref([]);
+const checkboxRefs = ref([]);
+const checkbox = ref(null);
+
+const searchConuntry = ref('')
+const countryRegionList = ref([]);
+
+let t
+const input = (val) => {
+    if (t) clearTimeout(t);
+    t = setTimeout(() => {
+        countryRegionList.value = lang[props.langType].countryRegionList.filter(item => {
+            // 判断是否包含搜索的关键字,中英西班牙
+            if (props.langType === 'zh') return item.text.includes(val)
+            else return item.text.toLowerCase().includes(val.toLowerCase())
+        })
+        clearTimeout(t);
+    }, 200);
+}
+
+const onClickLeft = () => {
+    emits('closeComponent');
+};
+
+const isGroup = (val) => {
+    if (val.length > 0) {
+        formData.activitiesAttended = val.join(',')
+        selectunde.value = false
+    }
+}
+const isUndefined = (ele) => {
+    ele.toggle()
+    formData.activitiesAttended = selectunde.value ? 'none' : '';
+    activitiesAttended.value = []
+}
+
+const reset = () => {
+    form.value.resetValidation();
+}
+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.selectedOptions[0].value;
+    formData.unitTypeName = values.selectedOptions[0].text;
+}
+const countryRegionConfirm = (values) => {
+    showCountryRegion.value = false;
+    formData.countryRegionName = values.selectedOptions[0].text;
+    formData.countryRegion = values.selectedOptions[0].value;
+}
+
+// 上传
+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);
+    uploadImage(file).then(res => {
+        showToast(lang[props.langType].upFileSusscess);
+        formData.photoUrl = res
+        photo.value = [
+            {
+                url: res,
+                file: file.file,
+            }
+        ]
+    }).catch((res) => {
+        showToast(res.msg || lang[props.langType].upFileError);
+    })
+    return false;
+};
+
+
+let arrivalTime = []
+const dateTimeColumns = computed(() => {
+    const dateList = lang[props.langType].dateList;
+    const years = [{ text: dateList[0], value: '', disabled: true }, ...Array.from({ length: 10 }, (_, i) => {
+        const t = 2020 + i + ''
+        return {
+            text: t,
+            value: t
+        }
+    })];
+    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 onSubmit = () => {
+    if (loading.value) return
+    loading.value = true
+    const active = {
+        active2: '否',
+        active3: '否',
+        active4: '否',
+        active5: '否',
+        active6: '否',
+        active7: '否'
+    }
+    if (!selectunde.value) {
+        activitiesAttended.value.forEach((item) => {
+            active[item] = '是'
+        })
+    }
+    if (formData.active2.includes('共享数字经济发展机遇')) {
+        active.active7 = '是'
+    }
+    if (formData.active2.includes('共筑网络安全防线')) {
+        active.active2 = '是'
+    }
+    if (formData.active2.includes('共商人工智能发展治理')) {
+        active.active3 = '是'
+    }
+    saveData({
+        ...active,
+        active1: formData.active1 || '否',
+        code: props.verificationCode, // 邀请码
+        lastName: formData.lastName, // 姓
+        firstName: formData.firstName, // 名
+        level: formData.level, // 职级
+        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, // 紧急联系人电话
+        cardType: formData.cardType, // 证件类型
+        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((res) => {
+        if (!isNaN(res.code) && res.code !== 0) {
+            showToast(res.msg || lang[props.langType].networkError);
+            return;
+        }
+        // 清空表单内容 from
+        // Object.keys(from).forEach((key) => {
+        //     from[key] = '';
+        // });
+        loading.value = false
+        showDialog({
+            message: lang[props.langType].registration,
+        })
+    }).catch((res) => {
+        loading.value = false
+        showToast(res.msg || lang[props.langType].networkError);
+    });
+}
+defineExpose({ reset })
+</script>
+<style lang="scss"></style>

+ 664 - 0
src/view/fenghuitest/form1.vue

@@ -0,0 +1,664 @@
+<!-- 中国嘉宾 -->
+<template>
+    <div>
+        <van-nav-bar fixed :border="false">
+            <template #left>
+                <van-icon name="arrow-left" color="#3D3D3D" @click="onClickLeft" />
+            </template>
+            <template #title>
+                <p class="navTitle" v-text="lang[langType].signUpZH"></p>
+            </template>
+        </van-nav-bar>
+        <div class="form">
+            <van-form ref="form" @submit="onSubmit" label-width="8em">
+                <!-- 国家/地区 -->
+                <van-field size="large" input-align="right" clickable readonly
+                    @click="countryRegionList = lang[langType].countryRegionList, showCountryRegion = true"
+                    right-icon="arrow"
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].countryRegionContent }]"
+                    required v-model="formData.countryRegionName" :placeholder="lang[langType].countryRegionContent">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].countryRegion"></span>
+                    </template>
+                </van-field>
+                <van-popup v-model:show="showCountryRegion" destroy-on-close round position="bottom">
+                    <van-picker :confirm-button-text="lang[langType].confirm" :columns="countryRegionList"
+                        :cancel-button-text="lang[langType].cancel" @confirm="countryRegionConfirm"
+                        :title="lang[langType].countryRegion" @cancel="showCountryRegion = false">
+                        <template #columns-top>
+                            <van-search @update:model-value="input" v-model="searchConuntry"
+                                :placeholder="lang[langType].searchText" />
+                        </template>
+                    </van-picker>
+                </van-popup>
+
+                <!-- 姓名 -->
+                <van-field size="large" 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 size="large" 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 size="large" 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 size="large" 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-button-text="lang[langType].confirm"
+                        :cancel-button-text="lang[langType].cancel" @confirm="packerConfirm"
+                        :title="lang[langType].birthday" @cancel="showBirthday = false" :min-date="new Date(1920, 0, 1)"
+                        :max-date="new Date()" />
+                </van-popup>
+
+                <!-- 照片 -->
+                <van-field size="large" 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 class="upFileSubtitle" v-text="lang[langType].photoSubContent"> </p>
+                    </template>
+                </van-field>
+
+                <!-- 手机号 -->
+                <van-field size="large" 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 size="large" 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 size="large" 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 size="large" input-align="right" v-model="formData.emergencyContactPhone" required
+                    type="number"
+                    :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 size="large" label-align="top" v-model="formData.cardType" clickable
+                    :rules="[{ required: true, trigger: 'onChange', message: lang[langType].conferenceTypeContent }]"
+                    :placeholder="lang[langType].conferenceTypeContent" required>
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].conferenceType"></span>
+                    </template>
+                    <template #input>
+                        <van-radio-group checked-color="#3F5AC8" style="width: 100%;" v-model="formData.cardType"
+                            :direction="langType == 'zh' ? 'horizontal' : 'vertical'">
+                            <van-radio v-for="item in cardTypeList" :key="item.value"
+                                :style="langType == 'zh' ? 'width: 50%;margin: 10px 0 0 0;' : 'margin: 10px 0 0 0;'"
+                                :name="item.value">{{ item.text }}</van-radio>
+                        </van-radio-group>
+                    </template>
+                </van-field>
+
+                <!-- 证件 -->
+                <van-field size="large" 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 size="large" input-align="right" v-model="formData.catering" rows="1" 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 size="large" input-align="right" v-model="formData.workUnit"
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].companyContent }]" required
+                    :placeholder="lang[langType].companyContent">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].company"></span>
+                    </template>
+                </van-field>
+
+                <!-- 单位类型 -->
+                <van-field size="large" 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 :confirm-button-text="lang[langType].confirm"
+                        :cancel-button-text="lang[langType].cancel" :columns="unitTypeList"
+                        @cancel="showUnitType = false" @confirm="onUnitTypeConfirm" />
+                </van-popup>
+
+                <!-- 职务 -->
+                <van-field size="large" 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 size="large" label-align="top" input-align="right" v-model="formData.level"
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].levelContent }]" required
+                    :placeholder="lang[langType].levelContent">
+                    <template #label>
+                        <span :style="langType === 'zh' ? 'text-align-last: justify;' : ''"
+                            :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].level"></span>
+                    </template>
+                    <template #input>
+                        <van-radio-group checked-color="#3F5AC8" style="width: 100%;" v-model="formData.level"
+                            :direction="langType == 'zh' ? 'horizontal' : 'vertical'">
+                            <van-radio style="flex: 1;margin-top: 10px " :name="item.value"
+                                v-for="item in lang[langType].careerList" :key="item.value">{{
+                                    item.text
+                                }}</van-radio>
+                        </van-radio-group>
+                    </template>
+                </van-field>
+
+                <!-- 传真 -->
+                <van-field size="large" input-align="right" v-model="formData.fax"
+                    :placeholder="lang[langType].faxContent">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].fax"></span>
+                    </template>
+                </van-field>
+
+                <!-- 办公地址 -->
+                <van-field size="large" input-align="right" v-model="formData.officeAddress" rows="1" autosize
+                    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 size="large" v-model="formData.interview" required label-align="top"
+                    :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 checked-color="#3F5AC8" style="justify-content: flex-end;width: 100%;"
+                            v-model="formData.interview" direction="horizontal">
+                            <van-radio style="flex: 1;margin-top: 10px " name="是">{{ lang[langType].confirm
+                                }}</van-radio>
+                            <van-radio style="flex: 1;margin-top: 10px " name="否">{{ lang[langType].cancel
+                                }}</van-radio>
+                        </van-radio-group>
+                    </template>
+                </van-field>
+                <div style="background-color: #F7F7F7;height: 10px;"></div>
+
+                <!-- 是否参加开幕式 active0  -->
+                <van-field size="large" label-align="top" v-model="formData.active1" required
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].active0Content }]"
+                    :placeholder="lang[langType].active0Content">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].active0"></span>
+                    </template>
+                    <template #input>
+                        <van-radio-group checked-color="#3F5AC8" style="width: 100%;" v-model="formData.active1"
+                            direction="horizontal">
+                            <van-radio style="flex: 1;margin-top: 10px " name="是">{{ lang[langType].confirm
+                                }}</van-radio>
+                            <van-radio style="flex: 1;margin-top: 10px " name="否">{{ lang[langType].cancel
+                                }}</van-radio>
+                        </van-radio-group>
+                    </template>
+                </van-field>
+
+                <!-- 选择分论坛  -->
+                <van-field size="large" label-align="top" required
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].activeContent }]"
+                    :placeholder="lang[langType].activeContent">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].active"></span>
+                    </template>
+                    <template #input>
+                        <van-radio-group checked-color="#3F5AC8" style="width: 100%;padding-left: 16px;"
+                            v-model="formData.active2">
+                            <van-radio style="flex: 1;margin-top: 10px " name="共享数字经济发展机遇">
+                                {{ lang[langType].active1 }}
+                            </van-radio>
+                            <van-radio style="flex: 1;margin-top: 10px " name="共筑网络安全防线">
+                                {{ lang[langType].active2 }}
+                            </van-radio>
+                            <van-radio style="flex: 1;margin-top: 10px " name="共商人工智能发展治理">
+                                {{ lang[langType].active3 }}
+                            </van-radio>
+                        </van-radio-group>
+                    </template>
+                </van-field>
+
+                <!-- 拟参加的活动  -->
+                <van-field size="large" label-align="top" v-model="formData.activitiesAttended" required
+                    :placeholder="lang[langType].activitiesAttendedContent">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''"
+                            v-html="lang[langType].activitiesAttended"></span>
+                    </template>
+                    <template #input>
+                        <div>
+                            <van-checkbox-group :border="false" ref="checkbox" checked-color="#3F5AC8"
+                                v-model="activitiesAttended" @change="isGroup">
+                                <van-cell clickable :title="lang[langType].active4" @click="checkboxRefs[0].toggle()">
+                                    <template #icon>
+                                        <van-checkbox :ref="el => checkboxRefs[0] = el" style="margin-right: 5px;"
+                                            name="active4" @click.stop shape="square" />
+                                    </template>
+                                </van-cell>
+                                <van-cell clickable :title="lang[langType].active5" @click="checkboxRefs[1].toggle()">
+                                    <template #icon>
+                                        <van-checkbox :ref="el => checkboxRefs[1] = el" style="margin-right: 5px;"
+                                            name="active5" @click.stop shape="square" />
+                                    </template>
+                                </van-cell>
+                                <!-- <van-cell clickable :title="lang[langType].active6" @click="checkboxRefs[2].toggle()">
+                                    <template #icon>
+                                        <van-checkbox :ref="el => checkboxRefs[2] = el" style="margin-right: 5px;"
+                                            name="active6" @click.stop shape="square" />
+                                    </template>
+                                </van-cell> -->
+                            </van-checkbox-group>
+                            <van-cell clickable :title="lang[langType].active7"
+                                @click="() => isUndefined(checkboxRefs[3])">
+                                <template #icon>
+                                    <div class="noClcik">
+                                        <van-checkbox checked-color="#3F5AC8" v-model="selectunde"
+                                            style="margin-right: 5px;" :ref="el => checkboxRefs[3] = el" name="none"
+                                            @click.stop shape="square" />
+                                    </div>
+                                </template>
+                            </van-cell>
+                        </div>
+
+                    </template>
+                </van-field>
+
+
+                <div style="background-color: #F7F7F7;height: 10px;"></div>
+
+                <!--  抵达西安交通车次 -->
+                <van-field size="large" 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 size="large" 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 :confirm-button-text="lang[langType].confirm"
+                        :cancel-button-text="lang[langType].cancel" :title="lang[langType].reachTime"
+                        :columns="dateTimeColumns" @confirm="reachTimeConfirm" @cancel="showReachTime = false" />
+                </van-popup>
+
+                <!--  离开车次 -->
+                <van-field size="large" 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 size="large" 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 :confirm-button-text="lang[langType].confirm"
+                        :cancel-button-text="lang[langType].cancel" :title="lang[langType].leavingTime"
+                        :columns="dateTimeColumns" @confirm="leavingTimeConfirm" @cancel="showLeavingTime = false" />
+                </van-popup>
+
+                <!--  离店时间 -->
+                <van-field size="large" 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 :confirm-button-text="lang[langType].confirm"
+                        :cancel-button-text="lang[langType].cancel" :title="lang[langType].checkOutTime"
+                        :columns="dateTimeColumns" @confirm="checkOutTimeConfirm" @cancel="showCheckOutTime = false" />
+                </van-popup>
+
+                <van-field size="large" 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
+                    :loading="loading"
+                    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>
+    </div>
+
+</template>
+<script setup>
+import { defineProps, defineEmits, defineExpose, reactive, ref, computed } from 'vue';
+import { showToast, showDialog } from 'vant';
+import { saveData, uploadImage } from '@/api/2025.js';
+import lang from './lang.js';
+const props = defineProps(['langType', 'verificationCode', 'subData']);
+
+const emits = defineEmits(['closeComponent']);
+
+const loading = ref(false);
+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 showCountryRegion = ref(false)
+const showCheckOutTime = ref(false)
+const selectunde = ref(false)
+const activitiesAttended = ref([])
+const form = ref(null);
+const photo = ref([]);
+const checkbox = ref(null);
+const checkboxRefs = ref([]);
+const searchConuntry = ref('')
+const countryRegionList = ref([]);
+
+let t
+const input = (val) => {
+    if (t) clearTimeout(t);
+    t = setTimeout(() => {
+        countryRegionList.value = lang[props.langType].countryRegionList.filter(item => {
+            // 判断是否包含搜索的关键字,中英西班牙
+            if (props.langType === 'zh') return item.text.includes(val)
+            else return item.text.toLowerCase().includes(val.toLowerCase())
+        })
+        clearTimeout(t);
+    }, 200);
+}
+
+const reset = () => {
+    form.value.resetValidation();
+}
+
+
+const isGroup = (val) => {
+    formData.activitiesAttended = val.join(',')
+    if (val.length > 0) {
+        selectunde.value = false
+    }
+}
+const isUndefined = (ele) => {
+    ele.toggle()
+    formData.activitiesAttended = selectunde.value ? 'none' : '';
+    activitiesAttended.value = []
+}
+const countryRegionConfirm = (values) => {
+    showCountryRegion.value = false;
+    formData.countryRegionName = values.selectedOptions[0].text;
+    formData.countryRegion = values.selectedOptions[0].value;
+}
+
+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.selectedOptions[0].value;
+    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 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);
+    uploadImage(file).then(res => {
+        showToast(lang[props.langType].upFileSusscess);
+        formData.photoUrl = res
+        photo.value = [
+            {
+                url: res,
+                file: file.file,
+            }
+        ]
+    }).catch((res) => {
+        showToast(res.msg || lang[props.langType].upFileError);
+    })
+    return false;
+};
+
+
+let arrivalTime = []
+const dateTimeColumns = computed(() => {
+    const dateList = lang[props.langType].dateList;
+    const years = [{ text: dateList[0], value: '', disabled: true }, ...Array.from({ length: 10 }, (_, i) => {
+        const t = 2020 + i + ''
+        return {
+            text: t,
+            value: t
+        }
+    })];
+    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 onSubmit = () => {
+    if (loading.value) return
+    loading.value = true
+    const active = {
+        active2: '否',
+        active3: '否',
+        active4: '否',
+        active5: '否',
+        active6: '否',
+        active7: '否'
+    }
+    if (!selectunde.value) {
+        activitiesAttended.value.forEach((item) => {
+            active[item] = '是'
+        })
+    }
+    if (formData.active2.includes('共享数字经济发展机遇')) {
+        active.active7 = '是'
+    }
+    if (formData.active2.includes('共筑网络安全防线')) {
+        active.active2 = '是'
+    }
+    if (formData.active2.includes('共商人工智能发展治理')) {
+        active.active3 = '是'
+    }
+    saveData({
+        ...active,
+        active1: formData.active1 || '否',
+        code: props.verificationCode, // 邀请码
+        name: formData.name, // 姓名
+        provinceCity: formData.provinceCity, // 省市区
+        gender: formData.gender, // 性别
+        birthDate: formData.birthday, // 出生日期
+        photo: formData.photoUrl, // 照片
+        phone: formData.contact, // 手机号
+        level: formData.level, // 职级
+        email: formData.email, // 邮箱
+        emergencyContact: formData.emergencyContact, // 紧急联系人
+        emergencyContactPhone: formData.emergencyContactPhone, // 紧急联系人电话
+        cardType: formData.cardType, // 证件类型
+        idCard: formData.passport, // 证件号
+        dietaryRequirements: formData.catering, // 饮食要求
+        workUnit: formData.workUnit, // 工作单位
+        unitType: formData.unitType, // 单位类型
+        position: formData.career, // 职务
+        countryRegion: formData.countryRegion, // 国家/地区
+        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((res) => {
+        if (!isNaN(res.code) && res.code !== 0) {
+            showToast(res.msg || lang[props.langType].networkError);
+            return;
+        }
+        // 清空表单内容 from
+        // Object.keys(from).forEach((key) => {
+        //     from[key] = '';
+        // });
+        loading.value = false
+        showDialog({
+            message: lang[props.langType].registration,
+        })
+    }).catch((res) => {
+        loading.value = false
+        showToast(res.msg || lang[props.langType].networkError);
+    });
+}
+
+defineExpose({ reset })
+</script>

+ 751 - 0
src/view/fenghuitest/form1Recurrence.vue

@@ -0,0 +1,751 @@
+<!-- 中国嘉宾 -->
+<template>
+    <div>
+        <van-nav-bar fixed :border="false">
+            <template #left>
+                <van-icon name="arrow-left" color="#3D3D3D" @click="onClickLeft" />
+            </template>
+            <template #title>
+                <p class="navTitle" v-text="lang[langType].signUpZH"></p>
+            </template>
+        </van-nav-bar>
+        <div class="form">
+            <van-form ref="form" @submit="onSubmit" label-width="8em">
+                <!-- 国家/地区 -->
+                <van-field size="large" input-align="right" clickable readonly
+                    @click="countryRegionList = lang[langType].countryRegionList, showCountryRegion = true"
+                    right-icon="arrow"
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].countryRegionContent }]"
+                    required v-model="formData.countryRegionName" :placeholder="lang[langType].countryRegionContent">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].countryRegion"></span>
+                    </template>
+                </van-field>
+                <van-popup v-model:show="showCountryRegion" destroy-on-close round position="bottom">
+                    <van-picker :confirm-button-text="lang[langType].confirm" :columns="countryRegionList"
+                        :cancel-button-text="lang[langType].cancel" @confirm="countryRegionConfirm"
+                        :title="lang[langType].countryRegion" @cancel="showCountryRegion = false">
+                        <template #columns-top>
+                            <van-search @update:model-value="input" v-model="searchConuntry"
+                                :placeholder="lang[langType].searchText" />
+                        </template>
+                    </van-picker>
+                </van-popup>
+
+                <!-- 姓名 -->
+                <van-field size="large" 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 size="large" 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 size="large" 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 size="large" 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-button-text="lang[langType].confirm"
+                        :cancel-button-text="lang[langType].cancel" @confirm="packerConfirm"
+                        :title="lang[langType].birthday" @cancel="showBirthday = false" :min-date="new Date(1920, 0, 1)"
+                        :max-date="new Date()" />
+                </van-popup>
+
+                <!-- 照片 -->
+                <van-field size="large" 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 class="upFileSubtitle" v-text="lang[langType].photoSubContent"> </p>
+                    </template>
+                </van-field>
+
+                <!-- 手机号 -->
+                <van-field size="large" 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 size="large" 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 size="large" 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 size="large" input-align="right" v-model="formData.emergencyContactPhone" required
+                    type="number"
+                    :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 size="large" label-align="top" v-model="formData.cardType" clickable
+                    :rules="[{ required: true, trigger: 'onChange', message: lang[langType].conferenceTypeContent }]"
+                    :placeholder="lang[langType].conferenceTypeContent" required>
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].conferenceType"></span>
+                    </template>
+                    <template #input>
+                        <van-radio-group checked-color="#3F5AC8" style="width: 100%;" v-model="formData.cardType"
+                            :direction="langType == 'zh' ? 'horizontal' : 'vertical'">
+                            <van-radio v-for="item in cardTypeList" :key="item.value"
+                                :style="langType == 'zh' ? 'width: 50%;margin: 10px 0 0 0;' : 'margin: 10px 0 0 0;'"
+                                :name="item.value">{{ item.text
+                                }}</van-radio>
+                        </van-radio-group>
+                    </template>
+                </van-field>
+
+                <!-- 证件 -->
+                <van-field size="large" 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 size="large" input-align="right" v-model="formData.catering" rows="1" 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 size="large" input-align="right" v-model="formData.workUnit"
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].companyContent }]" required
+                    :placeholder="lang[langType].companyContent">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].company"></span>
+                    </template>
+                </van-field>
+
+                <!-- 单位类型 -->
+                <van-field size="large" 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 :confirm-button-text="lang[langType].confirm"
+                        :cancel-button-text="lang[langType].cancel" :columns="unitTypeList"
+                        @cancel="showUnitType = false" @confirm="onUnitTypeConfirm" />
+                </van-popup>
+
+                <!-- 职务 -->
+                <van-field size="large" 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 size="large" label-align="top" input-align="right" v-model="formData.level"
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].levelContent }]" required
+                    :placeholder="lang[langType].levelContent">
+                    <template #label>
+                        <span :style="langType === 'zh' ? 'text-align-last: justify;' : ''"
+                            :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].level"></span>
+                    </template>
+                    <template #input>
+                        <van-radio-group checked-color="#3F5AC8" style="width: 100%;" v-model="formData.level"
+                            :direction="langType == 'zh' ? 'horizontal' : 'vertical'">
+                            <van-radio style="flex: 1;margin-top: 10px " :name="item.value"
+                                v-for="item in lang[langType].careerList" :key="item.value">{{
+                                    item.text
+                                }}</van-radio>
+                        </van-radio-group>
+                    </template>
+                </van-field>
+
+                <!-- 传真 -->
+                <van-field size="large" input-align="right" v-model="formData.fax"
+                    :placeholder="lang[langType].faxContent">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].fax"></span>
+                    </template>
+                </van-field>
+
+                <!-- 办公地址 -->
+                <van-field size="large" input-align="right" v-model="formData.officeAddress" rows="1" autosize
+                    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 size="large" v-model="formData.interview" required label-align="top"
+                    :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 checked-color="#3F5AC8" style="justify-content: flex-end;width: 100%;"
+                            v-model="formData.interview" direction="horizontal">
+                            <van-radio style="flex: 1;margin-top: 10px " name="是">{{ lang[langType].confirm
+                            }}</van-radio>
+                            <van-radio style="flex: 1;margin-top: 10px " name="否">{{ lang[langType].cancel
+                            }}</van-radio>
+                        </van-radio-group>
+                    </template>
+                </van-field>
+                <div style="background-color: #F7F7F7;height: 10px;"></div>
+
+                <!-- 是否参加开幕式 active0  -->
+                <van-field size="large" label-align="top" v-model="formData.active1" required
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].active0Content }]"
+                    :placeholder="lang[langType].active0Content">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].active0"></span>
+                    </template>
+                    <template #input>
+                        <van-radio-group checked-color="#3F5AC8" style="width: 100%;" v-model="formData.active1"
+                            direction="horizontal">
+                            <van-radio style="flex: 1;margin-top: 10px " name="是">{{ lang[langType].confirm
+                                }}</van-radio>
+                            <van-radio style="flex: 1;margin-top: 10px " name="否">{{ lang[langType].cancel
+                                }}</van-radio>
+                        </van-radio-group>
+                    </template>
+                </van-field>
+
+                <!-- 选择分论坛  -->
+                <van-field size="large" label-align="top" required
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].activeContent }]"
+                    :placeholder="lang[langType].activeContent">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].active"></span>
+                    </template>
+                    <template #input>
+                        <van-radio-group checked-color="#3F5AC8" style="width: 100%;padding-left: 16px;"
+                            v-model="formData.active2">
+                            <van-radio style="flex: 1;margin-top: 10px " name="共享数字经济发展机遇">
+                                {{ lang[langType].active1 }}
+                            </van-radio>
+                            <van-radio style="flex: 1;margin-top: 10px " name="共筑网络安全防线">
+                                {{ lang[langType].active2 }}
+                            </van-radio>
+                            <van-radio style="flex: 1;margin-top: 10px " name="共商人工智能发展治理">
+                                {{ lang[langType].active3 }}
+                            </van-radio>
+                        </van-radio-group>
+                    </template>
+                </van-field>
+
+                <!-- 拟参加的活动  -->
+                <van-field size="large" label-align="top" v-model="formData.activitiesAttended" required
+                    :placeholder="lang[langType].activitiesAttendedContent">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''"
+                            v-html="lang[langType].activitiesAttended"></span>
+                    </template>
+                    <template #input>
+                        <div>
+                            <van-checkbox-group :border="false" ref="checkbox" checked-color="#3F5AC8"
+                                v-model="activitiesAttended" @change="isGroup">
+                                <van-cell clickable :title="lang[langType].active4" @click="checkboxRefs[0].toggle()">
+                                    <template #icon>
+                                        <van-checkbox :ref="el => checkboxRefs[0] = el" style="margin-right: 5px;"
+                                            name="active4" @click.stop shape="square" />
+                                    </template>
+                                </van-cell>
+                                <van-cell clickable :title="lang[langType].active5" @click="checkboxRefs[1].toggle()">
+                                    <template #icon>
+                                        <van-checkbox :ref="el => checkboxRefs[1] = el" style="margin-right: 5px;"
+                                            name="active5" @click.stop shape="square" />
+                                    </template>
+                                </van-cell>
+                                <!-- <van-cell clickable :title="lang[langType].active6" @click="checkboxRefs[2].toggle()">
+                                    <template #icon>
+                                        <van-checkbox :ref="el => checkboxRefs[2] = el" style="margin-right: 5px;"
+                                            name="active6" @click.stop shape="square" />
+                                    </template>
+                                </van-cell> -->
+                            </van-checkbox-group>
+                            <van-cell clickable :title="lang[langType].active7"
+                                @click="() => isUndefined(checkboxRefs[3])">
+                                <template #icon>
+                                    <div class="noClcik">
+                                        <van-checkbox checked-color="#3F5AC8" v-model="selectunde"
+                                            style="margin-right: 5px;" :ref="el => checkboxRefs[3] = el" name="none"
+                                            @click.stop shape="square" />
+                                    </div>
+                                </template>
+                            </van-cell>
+                        </div>
+
+                    </template>
+                </van-field>
+
+
+                <div style="background-color: #F7F7F7;height: 10px;"></div>
+
+                <!--  抵达西安交通车次 -->
+                <van-field size="large" 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 size="large" 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 :confirm-button-text="lang[langType].confirm"
+                        :cancel-button-text="lang[langType].cancel" :title="lang[langType].reachTime"
+                        :columns="dateTimeColumns" @confirm="reachTimeConfirm" @cancel="showReachTime = false" />
+                </van-popup>
+
+                <!--  离开车次 -->
+                <van-field size="large" 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 size="large" 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 :confirm-button-text="lang[langType].confirm"
+                        :cancel-button-text="lang[langType].cancel" :title="lang[langType].leavingTime"
+                        :columns="dateTimeColumns" @confirm="leavingTimeConfirm" @cancel="showLeavingTime = false" />
+                </van-popup>
+
+                <!--  离店时间 -->
+                <van-field size="large" 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 :confirm-button-text="lang[langType].confirm"
+                        :cancel-button-text="lang[langType].cancel" :title="lang[langType].checkOutTime"
+                        :columns="dateTimeColumns" @confirm="checkOutTimeConfirm" @cancel="showCheckOutTime = false" />
+                </van-popup>
+
+                <van-field size="large" 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
+                    :loading="loading"
+                    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>
+    </div>
+</template>
+<script setup>
+import { defineProps, defineEmits, defineExpose, reactive, ref, computed } from 'vue';
+import { showToast, showDialog } from 'vant';
+import { editData, uploadImage } from '@/api/2025.js';
+import lang from './lang.js';
+const props = defineProps(['langType', 'verificationCode', 'subData']);
+
+const emits = defineEmits(['closeComponent']);
+
+const formData = reactive({
+    active2: []
+})
+const loading = ref(false);
+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 showCountryRegion = ref(false)
+const showLeavingTime = ref(false)
+const showCheckOutTime = ref(false)
+const selectunde = ref(false)
+const form = ref(null);
+const activitiesAttended = ref([])
+const photo = ref([]);
+const checkbox = ref(null);
+const checkboxRefs = ref([]);
+const searchConuntry = ref('')
+const countryRegionList = ref([]);
+
+let t
+const input = (val) => {
+    if (t) clearTimeout(t);
+    t = setTimeout(() => {
+        countryRegionList.value = lang[props.langType].countryRegionList.filter(item => {
+            // 判断是否包含搜索的关键字,中英西班牙
+            if (props.langType === 'zh') return item.text.includes(val)
+            else return item.text.toLowerCase().includes(val.toLowerCase())
+        })
+        clearTimeout(t);
+    }, 200);
+}
+
+const countryRegionConfirm = (values) => {
+    showCountryRegion.value = false;
+    formData.countryRegionName = values.selectedOptions[0].text;
+    formData.countryRegion = values.selectedOptions[0].value;
+}
+
+/**
+ * 将subData数据转换为formData
+ */
+const initFormData = () => {
+    if (!props.subData) return;
+    const relationship = {
+        name: 'name', // 姓名
+        provinceCity: 'provinceCity', // 省市区
+        gender: 'gender', // 性别
+        birthDate: 'birthday', // 出生日期
+        photo: 'photoUrl', // 照片
+        level: 'level', // 职级
+        phone: 'contact', // 手机号
+        email: 'email', // 邮箱
+        emergencyContact: 'emergencyContact', // 紧急联系人
+        emergencyContactPhone: 'emergencyContactPhone', // 紧急联系人电话
+        cardType: 'cardType', // 证件类型
+        idCard: 'passport', // 证件号
+        countryRegion: 'countryRegion', // 国家/地区
+        dietaryRequirements: 'catering', // 饮食要求
+        workUnit: 'workUnit', // 工作单位
+        unitType: 'unitType', // 单位类型
+        position: 'career', // 职务
+        fax: 'fax', // fax
+        interviewIntention: 'interview', // 接受采访意向
+        officeAddress: 'officeAddress', // 办公地址
+        arrivalNumberXian: 'reachTrainNumber', // 抵达西安交通车次
+        arrivalTimeXian: 'reachTime', // 抵达西安时间
+        departureNumber: 'leavingTrainNumber', // 离开车次
+        departureTime: 'leavingTime', // 离开时间
+        checkOutTime: 'checkOutTime', // 离店时间
+        remarks: 'message', // 备注
+        active1: 'active1', // 共筑网络安全防线
+        active2: 'active2', // 共商人工智能发展治理
+        active3: 'active3', // 共筑网络安全防线
+    }
+    const subData = JSON.parse(JSON.stringify(props.subData))
+    const keys = Object.keys(subData || {});
+    subData.active4 === '是' && activitiesAttended.value.push('active4');
+    subData.active5 === '是' && activitiesAttended.value.push('active5');
+    subData.active6 === '是' && activitiesAttended.value.push('active6');
+    if (!formData.active2) {
+        formData.active2 = []
+    }
+    if(!activitiesAttended.value.length) selectunde.value = true;
+    for (let i = 0; i < keys.length; i++) {
+        const key = keys[i];
+        if (key === 'photo') {
+            photo.value.push({
+                url: subData[key],
+            })
+        }
+        if (key === 'unitType') {
+            try {
+                formData.unitTypeName = lang[props.langType].foreignCountryUnitType.filter(item => item.value === subData[key])[0].text;
+            } catch (err) {
+                formData.unitTypeName = '';
+            }
+        }
+        if (key === 'active7') {
+            subData[key] === '是' && formData.active2.push('共享数字经济发展机遇')
+            continue
+        }
+        if (key === 'active2') {
+            subData[key] === '是' && formData.active2.push('共筑网络安全防线')
+            continue
+        }
+        if (key === 'active3') {
+            subData[key] === '是' && formData.active2.push('共商人工智能发展治理')
+            continue
+        }
+        if (key === 'countryRegion') {
+            try {
+                formData.countryRegionName = lang[props.langType].countryRegionList.filter(item => item.value === subData[key])[0].text;
+            } catch (err) {
+                formData.countryRegionName = '';
+            }
+        }
+        formData[relationship[key]] = subData[key];
+    }
+}
+initFormData()
+const reset = () => {
+    form.value.resetValidation();
+}
+
+
+const isGroup = (val) => {
+    formData.activitiesAttended = val.join(',')
+    if (val.length > 0) {
+        selectunde.value = false
+    }
+}
+const isUndefined = (ele) => {
+    ele.toggle()
+    formData.activitiesAttended = selectunde.value ? 'none' : '';
+    activitiesAttended.value = []
+}
+
+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.selectedOptions[0].value;
+    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 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);
+    uploadImage(file).then(res => {
+        showToast(lang[props.langType].upFileSusscess);
+        formData.photoUrl = res
+        photo.value = [
+            {
+                url: res,
+                file: file.file,
+            }
+        ]
+    }).catch((res) => {
+        showToast(res.msg || lang[props.langType].upFileError);
+    })
+    return false;
+};
+
+
+let arrivalTime = []
+const dateTimeColumns = computed(() => {
+    const dateList = lang[props.langType].dateList;
+    const years = [{ text: dateList[0], value: '', disabled: true }, ...Array.from({ length: 10 }, (_, i) => {
+        const t = 2020 + i + ''
+        return {
+            text: t,
+            value: t
+        }
+    })];
+    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 onSubmit = () => {
+    if (loading.value) return
+    loading.value = true
+    const active = {
+        active2: '否',
+        active3: '否',
+        active4: '否',
+        active5: '否',
+        active6: '否',
+        active7: '否'
+    }
+    if (!selectunde.value) {
+        activitiesAttended.value.forEach((item) => {
+            active[item] = '是'
+        })
+    }
+    console.log(formData.active2.includes('共商人工智能发展治理'));
+    if (formData.active2.includes('共享数字经济发展机遇')) {
+        active.active7 = '是'
+    }
+    if (formData.active2.includes('共筑网络安全防线')) {
+        active.active2 = '是'
+    }
+    if (formData.active2.includes('共商人工智能发展治理')) {
+        active.active3 = '是'
+    }
+    editData({
+        ...active,
+        active1: formData.active1 || '否',
+        id: props.subData.id, // 人员id
+        countryRegion: formData.countryRegion, // 国家/地区
+        level: formData.level, // 职级
+        code: props.verificationCode, // 邀请码
+        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, // 紧急联系人电话
+        cardType: formData.cardType, // 证件类型
+        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((res) => {
+        if (!isNaN(res.code) && res.code !== 0) {
+            showToast(res.msg || lang[props.langType].networkError);
+            return;
+        }
+        // 清空表单内容 from
+        // Object.keys(from).forEach((key) => {
+        //     from[key] = '';
+        // });
+        loading.value = false
+        showDialog({
+            message: lang[props.langType].upRegistration,
+        })
+    }).catch((res) => {
+        loading.value = false
+        showToast(res.msg || lang[props.langType].networkError);
+    });
+}
+
+defineExpose({ reset })
+</script>

+ 198 - 0
src/view/fenghuitest/form2.vue

@@ -0,0 +1,198 @@
+<!-- 工作人员 -->
+<template>
+    <div>
+        <van-nav-bar fixed :border="false">
+            <template #left>
+                <van-icon name="arrow-left" color="#3D3D3D" @click="onClickLeft" />
+            </template>
+            <template #title>
+                <p class="navTitle" v-text="lang[langType].signUpWK"></p>
+            </template>
+        </van-nav-bar>
+        <div class="form">
+            <van-form ref="form" @submit="onSubmit" label-width="8em">
+                <!-- 姓名 -->
+                <van-field size="large" 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 size="large" 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 size="large" 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 class="upFileSubtitle" v-text="lang[langType].photoSubContent"> </p>
+                    </template>
+                </van-field>
+
+                <!-- 证件 -->
+                <van-field size="large" 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 size="large" v-model="formData.identityType" required label-align="top"
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].identityTypeContent }]"
+                    :placeholder="lang[langType].identityTypeContent">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].identityType"></span>
+                    </template>
+                    <template #input>
+                        <van-radio-group checked-color="#3F5AC8" style="justify-content: flex-end;width: 100%;"
+                            v-model="formData.identityType" :direction="langType === 'zh' ? 'horizontal' : 'vertical'">
+                            <van-radio style="flex: 1;margin-top: 10px; margin-bottom: 5px; " name="媒体">{{
+                                lang[langType].media }}</van-radio>
+                            <van-radio style="flex: 1;margin-top: 10px; margin-bottom: 5px; " name="工作人员">{{
+                                lang[langType].staff }}</van-radio>
+                            <van-radio style="flex: 1;margin-top: 10px; margin-bottom: 5px; " name="志愿者">{{
+                                lang[langType].volunteer }}</van-radio>
+                        </van-radio-group>
+                    </template>
+                </van-field>
+
+                <!-- 单位类型 -->
+                <van-field size="large " 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 :confirm-button-text="lang[langType].confirm"
+                        :cancel-button-text="lang[langType].cancel" :columns="unitTypeList"
+                        @cancel="showUnitType = false" @confirm="onUnitTypeConfirm" />
+                </van-popup>
+
+                <!-- 工作单位 -->
+                <van-field size="large" input-align="right" v-model="formData.workUnit"
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].companyContent }]" required
+                    :placeholder="lang[langType].companyBContent">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].companyB"></span>
+                    </template>
+                </van-field>
+                <br />
+                <van-button
+                    :loading="loading"
+                    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>
+    </div>
+</template>
+<script setup>
+import { defineProps, defineEmits, defineExpose, reactive, ref, computed } from 'vue';
+import { showToast, showDialog } from 'vant';
+import { saveData, uploadImage } from '@/api/2025.js';
+import lang from './lang.js';
+const props = defineProps(['langType', 'verificationCode', 'subData']);
+
+const emits = defineEmits(['closeComponent']);
+
+const loading = ref(false);
+const formData = reactive({})
+const unitTypeList = computed(() => lang[props.langType].workGroup)
+const showUnitType = ref(false)
+const form = ref(null); // 引入子组件的实例,用于调用子组件的方法
+const photo = ref([]);
+
+const reset = () => {
+    form.value.resetValidation();
+}
+
+const onClickLeft = () => {
+    emits('closeComponent');
+};
+
+const onUnitTypeConfirm = (values) => {
+    showUnitType.value = false;
+    formData.unitType = values.selectedOptions[0].value;
+    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);
+    uploadImage(file).then(res => {
+        showToast(lang[props.langType].upFileSusscess);
+        formData.photoUrl = res
+        photo.value = [
+            {
+                url: res,
+                file: file.file,
+            }
+        ]
+    }).catch((res) => {
+        showToast(res.msg || lang[props.langType].upFileError);
+    })
+    return false;
+};
+
+const onSubmit = () => {
+    if (loading.value) return
+    loading.value = true
+    saveData({
+        name: formData.name, // 姓名
+        code: props.verificationCode, // 邀请码
+        photo: formData.photoUrl, // 照片
+        phone: formData.contact, // 手机号
+        idCard: formData.passport, // 证件号
+        workUnit: formData.workUnit, // 工作单位
+        workGroup: formData.unitType, // 单位类型
+        identityType: formData.identityType, // 身份类别
+        userType: '工作人员'
+    }).then((res) => {
+        if (!isNaN(res.code) && res.code !== 0) {
+            showToast(res.msg || lang[props.langType].networkError);
+            return;
+        }
+        // 清空表单内容 from
+        // Object.keys(from).forEach((key) => {
+        //     from[key] = '';
+        // });
+        loading.value = false
+        showDialog({
+            message: lang[props.langType].registration,
+        })
+    }).catch((res) => {
+        loading.value = false
+        showToast(res.msg || lang[props.langType].networkError);
+    });
+}
+defineExpose({ reset })
+</script>
+<style lang="scss"></style>

+ 233 - 0
src/view/fenghuitest/form2Recurrence.vue

@@ -0,0 +1,233 @@
+<!-- 工作人员 -->
+<template>
+    <div>
+        <van-nav-bar fixed :border="false">
+            <template #left>
+                <van-icon name="arrow-left" color="#3D3D3D" @click="onClickLeft" />
+            </template>
+            <template #title>
+                <p class="navTitle" v-text="lang[langType].signUpWK"></p>
+            </template>
+        </van-nav-bar>
+        <div class="form">
+            <van-form ref="form" @submit="onSubmit" label-width="8em">
+                <!-- 姓名 -->
+                <van-field size="large" 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 size="large" 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 size="large" 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 class="upFileSubtitle" v-text="lang[langType].photoSubContent"> </p>
+                    </template>
+                </van-field>
+
+                <!-- 证件 -->
+                <van-field size="large" 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 size="large" v-model="formData.identityType" required label-align="top"
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].identityTypeContent }]"
+                    :placeholder="lang[langType].identityTypeContent">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].identityType"></span>
+                    </template>
+                    <template #input>
+                        <van-radio-group checked-color="#3F5AC8" style="justify-content: flex-end;width: 100%;"
+                            v-model="formData.identityType" direction="horizontal">
+                            <van-radio style="flex: 1;margin-top: 10px " name="媒体">{{ lang[langType].media
+                                }}</van-radio>
+                            <van-radio style="flex: 1;margin-top: 10px " name="工作人员">{{ lang[langType].staff
+                                }}</van-radio>
+                            <van-radio style="flex: 1;margin-top: 10px " name="志愿者">{{ lang[langType].volunteer
+                                }}</van-radio>
+                        </van-radio-group>
+                    </template>
+                </van-field>
+
+                <!-- 单位类型 -->
+                <van-field size="large" 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 :confirm-button-text="lang[langType].confirm"
+                        :cancel-button-text="lang[langType].cancel" :columns="unitTypeList"
+                        @cancel="showUnitType = false" @confirm="onUnitTypeConfirm" />
+                </van-popup>
+
+                <!-- 工作单位 -->
+                <van-field size="large" input-align="right"
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].companyContent }]" 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
+                    :loading="loading"
+                    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>
+    </div>
+</template>
+<script setup>
+import { defineProps, defineEmits, defineExpose, reactive, ref, computed } from 'vue';
+import { showToast, showDialog } from 'vant';
+import { editData, uploadImage } from '@/api/2025.js';
+import lang from './lang.js';
+const props = defineProps(['langType', 'verificationCode', 'subData']);
+
+const emits = defineEmits(['closeComponent']);
+const loading = ref(false);
+const formData = reactive({})
+const unitTypeList = computed(() => lang[props.langType].workGroup)
+const showUnitType = ref(false)
+const form = ref(null); // 引入子组件的实例,用于调用子组件的方法
+const photo = ref([]);
+
+/**
+ * 将subData数据转换为formData
+ */
+const initFormData = () => {
+    if (!props.subData) return;
+    const relationship = {
+        photo: 'photoUrl', // 照片
+        phone: 'contact', // 手机号
+        name: 'name', // 姓名
+        idCard: 'passport', // 证件号
+        workUnit: 'workUnit', // 工作单位
+        workGroup: 'unitType', // 单位类型
+        identityType: 'identityType', // 身份类别
+    }
+    const subData = JSON.parse(JSON.stringify(props.subData))
+    const keys = Object.keys(subData || {});
+    for (let i = 0; i < keys.length; i++) {
+        const key = keys[i];
+        if (key === 'photo') {
+            photo.value.push({
+                url: subData[key],
+            })
+        }
+        if (key === 'workGroup') {
+            try {
+                formData.unitTypeName = lang[props.langType].workGroup.filter(item => item.value === subData[key])[0].text;
+            } catch (err) {
+                formData.unitTypeName = '';
+            }
+        }
+        formData[relationship[key]] = subData[key];
+    }
+}
+initFormData()
+
+const reset = () => {
+    form.value.resetValidation();
+}
+
+const onClickLeft = () => {
+    emits('closeComponent');
+};
+
+const onUnitTypeConfirm = (values) => {
+    showUnitType.value = false;
+    formData.unitType = values.selectedOptions[0].value;
+    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);
+    uploadImage(file).then(res => {
+        showToast(lang[props.langType].upFileSusscess);
+        formData.photoUrl = res
+        photo.value = [
+            {
+                url: res,
+                file: file.file,
+            }
+        ]
+    }).catch((res) => {
+        showToast(res.msg || lang[props.langType].upFileError);
+    })
+    return false;
+};
+
+const onSubmit = () => {
+    if (loading.value) return
+    loading.value = true
+    editData({
+        id: props.subData.id, // 人员id
+        name: formData.name, // 姓名
+        code: props.verificationCode, // 邀请码
+        photo: formData.photoUrl, // 照片
+        phone: formData.contact, // 手机号
+        idCard: formData.passport, // 证件号
+        workUnit: formData.workUnit, // 工作单位
+        workGroup: formData.unitType, // 单位类型
+        identityType: formData.identityType, // 身份类别
+        userType: '工作人员'
+    }).then((res) => {
+        if (!isNaN(res.code) && res.code !== 0) {
+            showToast(res.msg || lang[props.langType].networkError);
+            return;
+        }
+        // 清空表单内容 from
+        // Object.keys(from).forEach((key) => {
+        //     from[key] = '';
+        // });
+        loading.value = false
+        showDialog({
+            message: lang[props.langType].upRegistration,
+        })
+    }).catch((res) => {
+        loading.value = false
+        showToast(res.msg || lang[props.langType].networkError);
+    });
+}
+defineExpose({ reset })
+</script>
+<style lang="scss"></style>

+ 759 - 0
src/view/fenghuitest/formRecurrence.vue

@@ -0,0 +1,759 @@
+<!-- 外国嘉宾 -->
+<template>
+    <div>
+        <van-nav-bar fixed :border="false">
+            <template #left>
+                <van-icon name="arrow-left" color="#3D3D3D" @click="onClickLeft" />
+            </template>
+            <template #title>
+                <p class="navTitle" v-text="lang[langType].signUp"></p>
+            </template>
+        </van-nav-bar>
+        <div class="form">
+            <van-form ref="form" @submit="onSubmit" label-width="8em">
+                <!-- 国家/地区 -->
+                <van-field size="large" input-align="right" clickable readonly
+                    @click="countryRegionList = lang[langType].countryRegionList, showCountryRegion = true"
+                    right-icon="arrow"
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].countryRegionContent }]"
+                    required v-model="formData.countryRegionName" :placeholder="lang[langType].countryRegionContent">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].countryRegion"></span>
+                    </template>
+                </van-field>
+                <van-popup v-model:show="showCountryRegion" destroy-on-close round position="bottom">
+                    <van-picker :confirm-button-text="lang[langType].confirm" :columns="countryRegionList"
+                        :cancel-button-text="lang[langType].cancel" @confirm="countryRegionConfirm"
+                        :title="lang[langType].countryRegion" @cancel="showCountryRegion = false">
+                        <template #columns-top>
+                            <van-search @update:model-value="input" v-model="searchConuntry"
+                                :placeholder="lang[langType].searchText" />
+                        </template>
+                    </van-picker>
+                </van-popup>
+
+                <!-- 姓 -->
+                <van-field size="large" 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 size="large" 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 size="large" 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 size="large" 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-button-text="lang[langType].confirm"
+                        :cancel-button-text="lang[langType].cancel" @confirm="packerConfirm"
+                        :title="lang[langType].birthday" @cancel="showBirthday = false" :min-date="new Date(1920, 0, 1)"
+                        :max-date="new Date()" />
+                </van-popup>
+
+                <!-- 照片 -->
+                <van-field size="large" 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 class="upFileSubtitle" v-text="lang[langType].photoSubContent"> </p>
+                    </template>
+                </van-field>
+
+                <!-- 手机号 -->
+                <van-field size="large" 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 size="large" 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 size="large" 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 size="large" input-align="right" v-model="formData.emergencyContactPhone" required
+                    type="number"
+                    :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 size="large" label-align="top" v-model="formData.cardType" clickable
+                    :rules="[{ required: true, trigger: 'onChange', message: lang[langType].conferenceTypeContent }]"
+                    :placeholder="lang[langType].conferenceTypeContent" required>
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].conferenceType"></span>
+                    </template>
+                    <template #input>
+                        <van-radio-group checked-color="#3F5AC8" style="width: 100%;" v-model="formData.cardType"
+                            :direction="langType == 'zh' ? 'horizontal' : 'vertical'">
+                            <template v-for="item in cardTypeList" :key="item.value">
+                                <van-radio v-if="item.value !== '身份证'"
+                                    :style="langType == 'zh' ? 'width: 50%;margin: 10px 0 0 0;' : 'margin: 10px 0 0 0;'"
+                                    :name="item.value">{{ item.text
+                                    }}</van-radio>
+                            </template>
+                        </van-radio-group>
+                    </template>
+                </van-field>
+
+                <!-- 证件 -->
+                <van-field size="large" 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 size="large" 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 size="large" input-align="right" v-model="formData.catering" rows="1" 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 size="large" input-align="right" v-model="formData.workUnit"
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].companyContent }]" required
+                    :placeholder="lang[langType].companyContent">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].company"></span>
+                    </template>
+                </van-field>
+
+                <!-- 单位类型 -->
+                <van-field size="large" 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 :confirm-button-text="lang[langType].confirm"
+                        :cancel-button-text="lang[langType].cancel" :columns="unitTypeList"
+                        @cancel="showUnitType = false" @confirm="onUnitTypeConfirm" />
+                </van-popup>
+
+                <!-- 职务 -->
+                <van-field size="large" 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 size="large" label-align="top" input-align="right" v-model="formData.level"
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].levelContent }]" required
+                    :placeholder="lang[langType].levelContent">
+                    <template #label>
+                        <span :style="langType === 'zh' ? 'text-align-last: justify;' : ''"
+                            :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].level"></span>
+                    </template>
+                    <template #input>
+                        <van-radio-group checked-color="#3F5AC8" style="width: 100%;" v-model="formData.level"
+                            :direction="langType == 'zh' ? 'horizontal' : 'vertical'">
+                            <van-radio style="flex: 1;margin-top: 10px " :name="item.value"
+                                v-for="item in lang[langType].careerList" :key="item.value">{{
+                                    item.text
+                                }}</van-radio>
+                        </van-radio-group>
+                    </template>
+                </van-field>
+
+                <!-- 传真 -->
+                <van-field size="large" input-align="right" v-model="formData.fax"
+                    :placeholder="lang[langType].faxContent">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].fax"></span>
+                    </template>
+                </van-field>
+
+                <!-- 办公地址 -->
+                <van-field size="large" input-align="right" v-model="formData.officeAddress" rows="1" autosize
+                    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 size="large" v-model="formData.interview" required label-align="top"
+                    :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 checked-color="#3F5AC8" style="justify-content: flex-end;width: 100%;"
+                            v-model="formData.interview" direction="horizontal">
+                            <van-radio style="flex: 1;margin-top: 10px " name="是">{{ lang[langType].confirm
+                            }}</van-radio>
+                            <van-radio style="flex: 1;margin-top: 10px " name="否">{{ lang[langType].cancel
+                            }}</van-radio>
+                        </van-radio-group>
+                    </template>
+                </van-field>
+
+                <div style="background-color: #F7F7F7;height: 10px;"></div>
+
+                <!-- 是否参加开幕式 active0  -->
+                <van-field size="large" label-align="top" v-model="formData.active1" required
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].active0Content }]"
+                    :placeholder="lang[langType].active0Content">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].active0"></span>
+                    </template>
+                    <template #input>
+                        <van-radio-group checked-color="#3F5AC8" style="width: 100%;" v-model="formData.active1"
+                            direction="horizontal">
+                            <van-radio style="flex: 1;margin-top: 10px " name="是">{{ lang[langType].confirm
+                                }}</van-radio>
+                            <van-radio style="flex: 1;margin-top: 10px " name="否">{{ lang[langType].cancel
+                                }}</van-radio>
+                        </van-radio-group>
+                    </template>
+                </van-field>
+
+                <!-- 选择分论坛  -->
+                <van-field size="large" label-align="top" required
+                    :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].activeContent }]"
+                    :placeholder="lang[langType].activeContent">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''" v-html="lang[langType].active"></span>
+                    </template>
+                    <template #input>
+                        <van-radio-group checked-color="#3F5AC8" style="width: 100%;padding-left: 16px;"
+                            v-model="formData.active2">
+                            <van-radio style="flex: 1;margin-top: 10px " name="共享数字经济发展机遇">
+                                {{ lang[langType].active1 }}
+                            </van-radio>
+                            <van-radio style="flex: 1;margin-top: 10px " name="共筑网络安全防线">
+                                {{ lang[langType].active2 }}
+                            </van-radio>
+                            <van-radio style="flex: 1;margin-top: 10px " name="共商人工智能发展治理">
+                                {{ lang[langType].active3 }}
+                            </van-radio>
+                        </van-radio-group>
+                    </template>
+                </van-field>
+
+                <!-- 拟参加的活动  -->
+                <van-field size="large" label-align="top" v-model="formData.activitiesAttended" required
+                    :placeholder="lang[langType].activitiesAttendedContent">
+                    <template #label>
+                        <span :class="langType === 'zh' ? 'label' : ''"
+                            v-html="lang[langType].activitiesAttended"></span>
+                    </template>
+                    <template #input>
+                        <div>
+                            <van-checkbox-group :border="false" ref="checkbox" checked-color="#3F5AC8"
+                                v-model="activitiesAttended" @change="isGroup">
+                                <van-cell clickable :title="lang[langType].active4" @click="checkboxRefs[0].toggle()">
+                                    <template #icon>
+                                        <van-checkbox :ref="el => checkboxRefs[0] = el" style="margin-right: 5px;"
+                                            name="active4" @click.stop shape="square" />
+                                    </template>
+                                </van-cell>
+                                <van-cell clickable :title="lang[langType].active5" @click="checkboxRefs[1].toggle()">
+                                    <template #icon>
+                                        <van-checkbox :ref="el => checkboxRefs[1] = el" style="margin-right: 5px;"
+                                            name="active5" @click.stop shape="square" />
+                                    </template>
+                                </van-cell>
+                                <van-cell clickable :title="lang[langType].active6" @click="checkboxRefs[2].toggle()">
+                                    <template #icon>
+                                        <van-checkbox :ref="el => checkboxRefs[2] = el" style="margin-right: 5px;"
+                                            name="active6" @click.stop shape="square" />
+                                    </template>
+                                </van-cell>
+                            </van-checkbox-group>
+                            <van-cell clickable :title="lang[langType].active7"
+                                @click="() => isUndefined(checkboxRefs[3])">
+                                <template #icon>
+                                    <div class="noClcik">
+                                        <van-checkbox checked-color="#3F5AC8" v-model="selectunde"
+                                            style="margin-right: 5px;" :ref="el => checkboxRefs[3] = el" name="none"
+                                            @click.stop shape="square" />
+                                    </div>
+                                </template>
+                            </van-cell>
+                        </div>
+
+                    </template>
+                </van-field>
+
+                <div style="background-color: #F7F7F7;height: 10px;"></div>
+
+                <!--  抵达西安交通车次 -->
+                <van-field size="large" 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 size="large" 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 :confirm-button-text="lang[langType].confirm"
+                        :cancel-button-text="lang[langType].cancel" :title="lang[langType].reachTime"
+                        :columns="dateTimeColumns" @confirm="reachTimeConfirm" @cancel="showReachTime = false" />
+                </van-popup>
+
+                <!--  离开车次 -->
+                <van-field size="large" 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 size="large" 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 :confirm-button-text="lang[langType].confirm"
+                        :cancel-button-text="lang[langType].cancel" :title="lang[langType].leavingTime"
+                        :columns="dateTimeColumns" @confirm="leavingTimeConfirm" @cancel="showLeavingTime = false" />
+                </van-popup>
+
+                <!--  离店时间 -->
+                <van-field size="large" 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 :confirm-button-text="lang[langType].confirm"
+                        :cancel-button-text="lang[langType].cancel" :title="lang[langType].checkOutTime"
+                        :columns="dateTimeColumns" @confirm="checkOutTimeConfirm" @cancel="showCheckOutTime = false" />
+                </van-popup>
+
+                <van-field size="large" 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
+                    :loading="loading"
+                    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>
+    </div>
+</template>
+<script setup>
+import { defineProps, defineEmits, defineExpose, reactive, ref, computed } from 'vue';
+import { showToast, showDialog } from 'vant';
+import { editData, uploadImage } from '@/api/2025.js';
+import lang from './lang.js';
+const props = defineProps(['langType', 'verificationCode', 'subData']);
+
+const emits = defineEmits(['closeComponent']);
+
+const formData = reactive({
+    active2: []
+})
+const cardTypeList = computed(() => lang[props.langType].cardTypeList)
+const unitTypeList = computed(() => lang[props.langType].foreignCountryUnitType)
+const loading = ref(false);
+const form = ref(null);
+const showBirthday = ref(false)
+const showReachTime = ref(false)
+const showLeavingTime = ref(false)
+const showCheckOutTime = ref(false)
+const showUnitType = ref(false)
+const selectunde = ref(false)
+const showCountryRegion = ref(false)
+const activitiesAttended = ref([])
+const photo = ref([]);
+const checkboxRefs = ref([]);
+const checkbox = ref(null);
+const searchConuntry = ref('')
+const countryRegionList = ref([]);
+
+let t
+const input = (val) => {
+    if (t) clearTimeout(t);
+    t = setTimeout(() => {
+        countryRegionList.value = lang[props.langType].countryRegionList.filter(item => {
+            // 判断是否包含搜索的关键字,中英西班牙
+            if (props.langType === 'zh') return item.text.includes(val)
+            else return item.text.toLowerCase().includes(val.toLowerCase())
+        })
+        clearTimeout(t);
+    }, 200);
+}
+
+const onClickLeft = () => {
+    emits('closeComponent');
+};
+
+
+const isGroup = (val) => {
+    formData.activitiesAttended = val.join(',')
+    if (val.length > 0) {
+        selectunde.value = false
+    }
+}
+const isUndefined = (ele) => {
+    ele.toggle()
+    formData.activitiesAttended = selectunde.value ? 'none' : '';
+    activitiesAttended.value = []
+}
+/**
+ * 将subData数据转换为formData
+ */
+const initFormData = () => {
+    if (!props.subData) return;
+    const relationship = {
+        lastName: 'lastName', // 姓
+        firstName: 'firstName', // 名
+        countryRegion: 'countryRegion', // 国家/地区
+        religion: 'belief', // 宗教
+        level: 'level', // 职级
+        gender: 'gender', // 性别
+        birthDate: 'birthday', // 出生日期
+        photo: 'photoUrl', // 照片
+        phone: 'contact', // 手机号
+        email: 'email', // 邮箱
+        emergencyContact: 'emergencyContact', // 紧急联系人
+        emergencyContactPhone: 'emergencyContactPhone', // 紧急联系人电话
+        cardType: 'cardType', // 证件类型
+        idCard: 'passport', // 证件号
+        dietaryRequirements: 'catering', // 饮食要求
+        workUnit: 'workUnit', // 工作单位
+        unitType: 'unitType', // 单位类型
+        position: 'career', // 职务
+        fax: 'fax', // fax
+        interviewIntention: 'interview', // 接受采访意向
+        officeAddress: 'officeAddress', // 办公地址
+        arrivalNumberXian: 'reachTrainNumber', // 抵达西安交通车次
+        arrivalTimeXian: 'reachTime', // 抵达西安时间
+        departureNumber: 'leavingTrainNumber', // 离开车次
+        departureTime: 'leavingTime', // 离开时间
+        checkOutTime: 'checkOutTime', // 离店时间
+        remarks: 'message', // 备注
+        active1: 'active1', // 共筑网络安全防线
+        active2: 'active2', // 共商人工智能发展治理
+        active3: 'active3', // 共筑网络安全防线
+    }
+    const subData = JSON.parse(JSON.stringify(props.subData))
+    const keys = Object.keys(subData || {});
+    subData.active4 === '是' && activitiesAttended.value.push('active4');
+    subData.active5 === '是' && activitiesAttended.value.push('active5');
+    subData.active6 === '是' && activitiesAttended.value.push('active6');
+    if (!formData.active2) {
+        formData.active2 = []
+    }
+    if(!activitiesAttended.value.length) selectunde.value = true;
+    for (let i = 0; i < keys.length; i++) {
+        const key = keys[i];
+        if (key === 'photo') {
+            photo.value.push({
+                url: subData[key],
+            })
+        }
+        if (key === 'unitType') {
+            try {
+                formData.unitTypeName = lang[props.langType].foreignCountryUnitType.filter(item => item.value === subData[key])[0].text;
+            } catch (err) {
+                formData.unitTypeName = '';
+            }
+        }
+        if (key === 'active7') {
+            subData[key] === '是' && formData.active2.push('共享数字经济发展机遇')
+            continue
+        }
+        if (key === 'active2') {
+            subData[key] === '是' && formData.active2.push('共筑网络安全防线')
+            continue
+        }
+        if (key === 'active3') {
+            subData[key] === '是' && formData.active2.push('共商人工智能发展治理')
+            continue
+        }
+        if (key === 'countryRegion') {
+            try {
+                formData.countryRegionName = lang[props.langType].countryRegionList.filter(item => item.value === subData[key])[0].text;
+            } catch (err) {
+                formData.countryRegionName = '';
+            }
+        }
+        formData[relationship[key]] = subData[key];
+    }
+}
+initFormData()
+const reset = () => {
+    form.value.resetValidation();
+}
+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.selectedOptions[0].value;
+    formData.unitTypeName = values.selectedOptions[0].text;
+}
+const countryRegionConfirm = (values) => {
+    showCountryRegion.value = false;
+    formData.countryRegionName = values.selectedOptions[0].text;
+    formData.countryRegion = values.selectedOptions[0].value;
+}
+
+// 上传
+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);
+    uploadImage(file).then(res => {
+        showToast(lang[props.langType].upFileSusscess);
+        formData.photoUrl = res
+        photo.value = [
+            {
+                url: res,
+                file: file.file,
+            }
+        ]
+    }).catch((res) => {
+        showToast(res.msg || lang[props.langType].upFileError);
+    })
+    return false;
+};
+
+
+let arrivalTime = []
+const dateTimeColumns = computed(() => {
+    const dateList = lang[props.langType].dateList;
+    const years = [{ text: dateList[0], value: '', disabled: true }, ...Array.from({ length: 10 }, (_, i) => {
+        const t = 2020 + i + ''
+        return {
+            text: t,
+            value: t
+        }
+    })];
+    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 onSubmit = () => {
+    if (loading.value) return
+    loading.value = true
+    const active = {
+        active2: '否',
+        active3: '否',
+        active4: '否',
+        active5: '否',
+        active6: '否',
+        active7: '否'
+    }
+    if (!selectunde.value) {
+        activitiesAttended.value.forEach((item) => {
+            active[item] = '是'
+        })
+    }
+    if (formData.active2.includes('共享数字经济发展机遇')) {
+        active.active7 = '是'
+    }
+    if (formData.active2.includes('共筑网络安全防线')) {
+        active.active2 = '是'
+    }
+    if (formData.active2.includes('共商人工智能发展治理')) {
+        active.active3 = '是'
+    }
+    editData({
+        ...active,
+        active1: formData.active1 || '否',
+        id: props.subData.id, // 人员id
+        code: props.verificationCode, // 邀请码
+        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, // 紧急联系人电话
+        cardType: formData.cardType, // 证件类型
+        idCard: formData.passport, // 证件号
+        dietaryRequirements: formData.catering, // 饮食要求
+        workUnit: formData.workUnit, // 工作单位
+        unitType: formData.unitType, // 单位类型
+        position: formData.career, // 职务
+        level: formData.level, // 职级
+        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((res) => {
+        if (!isNaN(res.code) && res.code !== 0) {
+            showToast(res.msg || lang[props.langType].networkError);
+            return;
+        }
+        // 清空表单内容 from
+        // Object.keys(from).forEach((key) => {
+        //     from[key] = '';
+        // });
+        loading.value = false
+        showDialog({
+            message: lang[props.langType].upRegistration,
+        })
+    }).catch((res) => {
+        loading.value = false
+        showToast(res.msg || lang[props.langType].networkError);
+    });
+}
+defineExpose({ reset })
+</script>
+<style lang="scss"></style>

+ 47 - 0
src/view/fenghuitest/index.js

@@ -0,0 +1,47 @@
+import App from "./index.vue";
+import "@/assets/js/common";
+import { createApp } from "vue";
+import { getPageParameters, environment } from "../../config/pageConfig";
+
+// 判断环境
+environment();
+window.$originData = getPageParameters();
+createApp(App).mount("#app")
+
+// 分享
+window.weixin_Share_Init(
+  window.$originData.orginParames.title || "",
+  "",
+  "https://cxzx.smcic.net/topic/tool/img/2025lm.png",
+  "https://cxzx.smcic.net/topic/activity/fenghui.html?" + Date.now()
+);
+
+// var SL = new window.SmcicLogger("special", "c6124e08");
+// SL.Util.SetUrl("https://collect.smcic.net:8443/");
+// SL.Systematic.Init({
+//   appid: "c6124e08",
+//   channel: "special",
+//   model: "",
+//   os: "",
+//   os_version: "",
+//   carrier: "",
+//   network_type: "",
+//   ip: "",
+//   app_name: "",
+//   app_version: "",
+//   build_version: "",
+//   platform_type: "",
+// });
+// SL.Content.CommodityDetail({
+//   commodity_detail_source: "活动",
+//   commodity_id: "",
+//   commodity_name: window.$originData.orginParames.title || "",
+//   publisher_name: "",
+//   publisher_id: "",
+//   review_count: 0,
+//   comment_count: 0,
+//   collect_count: 0,
+//   share_count: 0,
+//   like_count: 0,
+//   tag: [],
+// });

+ 267 - 0
src/view/fenghuitest/index.vue

@@ -0,0 +1,267 @@
+<template>
+    <div :class="{ fenghuitest: true, nozh: langSelect !== 'zh' }">
+        <div class="languageList">
+            <div @click="() => langChange({ selectedValues: [item.value] })"
+                :class="{ languageItem: true, 'languageItem-act': langSelect === item.value }" v-for="item in langObj"
+                v-text="item.text" :key="item.value"></div>
+        </div>
+        <div class="swith" v-show="componentId" :style="componentId !== '' ? 'position: fixed; color: #000000' : ''">
+            <div class="title" @click="showLange = true">
+                {{ langObjT[langSelect] }}
+                <van-icon name="arrow-down" />
+            </div>
+            <van-popup v-model:show="showLange" destroy-on-close round position="bottom">
+                <van-picker :confirm-button-text="lang[langSelect].confirm"
+                    :cancel-button-text="lang[langSelect].cancel" :model-value="[langSelect]" :columns="langObj"
+                    @cancel="showLange = false" @confirm="langChange" />
+            </van-popup>
+        </div>
+        <Introduction v-if="!componentId" :langType="langSelect" @saveData="saveData" />
+        <!-- 动态组件 -->
+        <Fore25 ref="fore25" v-if="componentId === 'fore25'" :verificationCode="verificationCode" :langType="langSelect"
+            @closeComponent="closeComponent" />
+        <Chin25 ref="chin25" v-if="componentId === 'chin25'" :verificationCode="verificationCode" :langType="langSelect"
+            @closeComponent="closeComponent" />
+        <Work25 ref="work25" v-if="componentId === 'work25'" :verificationCode="verificationCode" :langType="langSelect"
+            @closeComponent="closeComponent" />
+
+        <Fore25-recurrence ref="fore25Recurrence" v-if="componentId === 'fore25Recurrence'" :subData="subData"
+            :verificationCode="verificationCode" :langType="langSelect" @closeComponent="closeComponent" />
+        <Chin25-recurrence ref="chin25Recurrence" v-if="componentId === 'chin25Recurrence'" :subData="subData"
+            :verificationCode="verificationCode" :langType="langSelect" @closeComponent="closeComponent" />
+        <Work25-recurrence ref="work25Recurrence" v-if="componentId === 'work25Recurrence'" :subData="subData"
+            :verificationCode="verificationCode" :langType="langSelect" @closeComponent="closeComponent" />
+    </div>
+</template>
+<script setup>
+// 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';
+import Fore25Recurrence from './formRecurrence.vue';
+import Chin25Recurrence from './form1Recurrence.vue';
+import Work25Recurrence from './form2Recurrence.vue';
+import lang from './lang';
+const langSelect = ref(localStorage.getItem('langSelect') || 'zh');
+const componentId = ref('');
+const verificationCode = ref('');
+const showLange = ref(false);
+const fore25 = ref(null); // 引入子组件的实例,用于调用子组件的方法
+const chin25 = ref(null); // 引入子组件的实例,用于调用子组件的方法
+const work25 = ref(null); // 引入子组件的实例,用于调用子组件的方法
+const fore25Recurrence = ref(null); // 引入子组件的实例,用于调用子组件的方法
+const chin25Recurrence = ref(null); // 引入子组件的实例,用于调用子组件的方法
+const work25Recurrence = ref(null); // 引入子组件的实例,用于调用子组件的方法
+
+let langDefaute = true;
+let langDefauteType = langSelect.value;
+
+const subData = ref({})
+const langkeys = Object.keys(lang);
+// 如需要添加语言,需要在这里添加
+const langObjT = {
+    zh: '中文',
+    en: 'English',
+    es: 'Español',
+}
+const langObj = langkeys.map((item) => {
+    return { text: langObjT[item], value: item }
+})
+
+const saveData = (code, verification, data) => {
+    if (code !== undefined) {
+        componentId.value = code;
+        if (langDefaute) {
+            // 语言初始状态,需要判定是否是外国人的界面,是的话,需要设置英语 
+            const langList = ['fore25', 'fore25Recurrence']
+            langSelect.value = langList.includes(componentId.value) && langDefauteType !== undefined ? 'en' : langDefauteType
+        }
+    }
+    if (verification !== undefined) verificationCode.value = verification;
+    if (data !== undefined) subData.value = data;
+}
+
+const closeComponent = () => {
+    componentId.value = '';
+    if (langDefaute) langSelect.value = langDefauteType
+}
+
+const langChange = ({ selectedValues }) => {
+    langSelect.value = selectedValues[0];
+    langDefaute = false;
+    localStorage.setItem('langSelect', selectedValues[0]);
+    switch (componentId.value) {
+        case 'fore25':
+            fore25.value.reset(); // 调用子组件的方法
+            break;
+        case 'chin25':
+            chin25.value.reset(); // 调用子组件的方法
+            break;
+        case 'work25':
+            work25.value.reset(); // 调用子组件的方法
+            break;
+        case 'fore25Recurrence':
+            fore25Recurrence.value.reset(); // 调用子组件的方法
+            break;
+        case 'chin25Recurrence':
+            chin25Recurrence.value.reset(); // 调用子组件的方法
+            break;
+        case 'work25Recurrence':
+            work25Recurrence.value.reset(); // 调用子组件的方法
+            break;
+    }
+    showLange.value = false;
+};
+
+</script>
+<style lang="scss">
+// 引入自定义字体
+@font-face {
+    font-family: 'Source Han Sans CN';
+    src: url('https://cxzx.smcic.net/topic/tool/pkg/SourceHanSerifCN.otf') format('truetype');
+    font-weight: normal;
+    font-style: normal;
+    font-display: swap;
+}
+
+html {
+    font-size: 16px;
+}
+
+.fenghuitest {
+    overflow-x: hidden;
+    width: 100vw;
+    max-width: 750px;
+    margin: 0 auto;
+    min-height: 100vh;
+    font-weight: 400;
+    position: relative;
+    font-family: "Source Han Sans CN","Helvetica Neue",Helvetica,Arial,"Microsoft Yahei","Hiragino Sans GB","Heiti SC","WenQuanYi Micro Hei",sans-serif;
+    text-align: left;
+
+    .van-nav-bar__title {
+        margin: 0;
+    }
+
+    .noClcik {
+        position: relative;
+
+        &::after {
+            content: '';
+            position: absolute;
+            width: 100%;
+            height: 100%;
+            left: 0;
+            top: 0;
+        }
+    }
+
+    .languageList {
+        padding: 10px 20px;
+        font-size: 0.875rem;
+        color: #cbc9d6;
+        text-align: right;
+        position: absolute;
+        width: 100%;
+        z-index: 1;
+
+
+        .languageItem {
+            position: relative;
+            height: 2em;
+            display: inline-block;
+            margin-left: 15px;
+
+            &-act {
+                color: #fff;
+
+                &::after {
+                    content: '';
+                    position: absolute;
+                    width: 90%;
+                    height: 1px;
+                    background: #fff;
+                    bottom: 0;
+                    left: 5%
+                }
+            }
+        }
+    }
+
+    .swith {
+        position: absolute;
+        right: 10px;
+        top: 10px;
+        z-index: 999;
+        color: #fff;
+
+        .title {
+            cursor: pointer;
+        }
+    }
+
+    .upFileSubtitle {
+        font-size: 0.875rem;
+        color: #cbc9d6;
+    }
+
+    .navTitle {
+        padding-left: 3em;
+        font-size: 1.2rem;
+        overflow: hidden;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+    }
+
+    .form {
+        font-size: 0.875rem !important;
+        font-weight: 400;
+        padding: 46px 0 11px 0;
+
+        .van-cell {
+            font-size: 1rem;
+        }
+
+        .van-nav-bar {
+            .van-icon {
+                color: #3D3D3D
+            }
+        }
+
+        .van-field__label--top {
+            width: 100% !important;
+
+            .label {
+                -moz-text-align-last: left;
+                text-align-last: left;
+            }
+        }
+
+        .van-radio-group--horizontal {
+            padding: 0 16px;
+        }
+
+        .label {
+            min-width: 4em;
+            display: inline-block;
+            text-align: justify;
+            -moz-text-align-last: justify;
+            text-align-last: justify;
+        }
+
+        .van-cell--“large” {
+            padding: 16px 20px;
+        }
+    }
+}
+
+.nozh {
+    font-family: Arial Hebrew;
+
+    .text {
+        padding-left: 15px;
+    }
+}
+</style>

+ 349 - 0
src/view/fenghuitest/introduction.vue

@@ -0,0 +1,349 @@
+<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" style="font-size: 1.5rem;margin-top: 44px;" v-text="lang[langType].title"></h4>
+        <div style="font-size: 1rem;margin-bottom: 62px;margin-top: 19px;color: rgba(255,255,255,0.9);" class="text"
+            v-html="lang[langType].marstContent"></div>
+
+        <h4 class="text" style="font-size: 1.2rem;" v-text="lang[langType].wrestleMania"></h4>
+        <p class="text" style="color: rgba(255,255,255,0.9);" v-html="lang[langType].wrestleManiaContent"></p>
+        <div class="line"></div>
+        <h4 class="text" style="font-size: 1.2rem;" v-text="lang[langType].venue"></h4>
+        <p class="text" style="color: rgba(255,255,255,0.9);" v-html="lang[langType].venueContent"></p>
+        <div class="line"></div>
+        <h4 class="text" style="font-size: 1.2rem;color: rgba(255,255,255,0.9);" v-text="lang[langType].organization">
+        </h4>
+        <van-row style="color: rgba(255,255,255,0.9);">
+            <van-col span="8">
+                <div class="text" v-text="lang[langType].organizationSub1"></div>
+            </van-col>
+            <van-col span="16">
+                <div class="text" style="padding-left: 2px;" v-html="lang[langType].organizationSub2"></div>
+            </van-col>
+        </van-row>
+        <van-row>
+            <van-col span="8">
+                <div class="text" v-text="lang[langType].organizationSub3"></div>
+            </van-col>
+            <van-col span="16">
+                <div class="text" style="padding-left: 2px;" 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>
+
+        <p class="tologo" v-html="lang[langType].tologoText + '>>'" @click="showLogin = true"></p>
+        <p class="tologo" style="margin-top: 74px;margin-bottom: 1em;font-size: 0.9rem;color: rgba(255,255,255,0.8)">
+            {{ lang[langType].technicalAdvice }}
+        </p> 
+
+        <!-- 邀请码校验 -->
+        <van-dialog destroy-on-close :confirmButtonText="lang[langType].confirm"
+            :cancelButtonText="lang[langType].cancel" @confirm="checkVerificationCode" v-model:show="showCheck"
+            :title="lang[langType].verificationCode" show-cancel-button>
+            <van-field size="large" v-model="verificationCode" :placeholder="lang[langType].verificationCodeContent"
+                required
+                :rules="[{ required: true, trigger: 'onBlur', pattern: /[a-zA-Z0-9]/g, message: lang[langType].verificationCodeContent }]" />
+            />
+        </van-dialog>
+
+        <!-- 登录框 -->
+        <van-dialog close-on-click-overlay destroy-on-close :show-confirm-button="false" v-model:show="showLogin">
+            <br />
+            <van-form @submit="saveLogin">
+                <van-cell-group inset>
+                    <van-field size="large" v-model="form.verificationCode" name="verificationCode"
+                        :label="lang[langType].verificationCode" :placeholder="lang[langType].verificationCodeContent"
+                        required
+                        :rules="[{ required: true, trigger: 'onBlur', pattern: /[a-zA-Z0-9]/g, message: lang[langType].verificationCodeContent }]" />
+                    <van-field size="large" v-model="form.password" name="password" :label="lang[langType].passport"
+                        :placeholder="lang[langType].passportContent" required
+                        :rules="[{ required: true, message: lang[langType].passportContent }]" />
+                    <p style="color: red;font-size: 0.9rem;line-height: 1.5em;height: 1.5em;text-align: center;" v-text="lang[langType].timesText"></p>
+                </van-cell-group>
+                <div style="margin: 16px;">
+                    <van-button round block type="primary" size="small" native-type="submit">
+                        {{ lang[langType].login }}
+                    </van-button>
+                </div>
+            </van-form>
+        </van-dialog>
+    </div>
+</template>
+<script setup>
+import { defineProps, ref, defineEmits, reactive, onMounted } from 'vue';
+import { checkCode, getUserInfo } from '@/api/2025.js';
+import { showToast } from 'vant';
+import init, { encrypt, decrypt } from "./wasm_encrypt.min.js";
+import lang from './lang.js';
+const showCheck = ref(false);
+const verificationCode = ref('');
+const showLogin = ref(false);
+const form = reactive({})
+const props = defineProps(['langType']);
+const emits = defineEmits(['saveData']);
+let code = '';
+
+onMounted(async () => {
+    await init();
+})
+
+const checkVerificationCode = () => {
+    let userType = lang[props.langType].distinguishedGuest[code];
+    const RCode = Math.random().toString(32).substring(2, 15);
+    const data = encrypt({
+        code: verificationCode.value.toLowerCase().trim(),
+        userType,
+        randomCode: RCode
+    })
+    checkCode({
+        token: data
+    }).then((res) => {
+        const token = decrypt(res.token).randomCode
+        if (token !== RCode) {
+            showToast(lang[props.langType].verificationCodeError);
+            return;
+        }
+        emits('saveData', code, verificationCode.value.toLowerCase().trim());
+    }).catch((res) => {
+        console.log(res);
+        showToast(res.msg || lang[props.langType].verificationCodeError);
+    })
+}
+
+const saveLogin = () => {
+    const RCode = Math.random().toString(32).substring(2, 15);
+    const data = encrypt({
+        "code": form.verificationCode.toLowerCase().trim(),
+        "idCard": form.password,
+        randomCode: RCode
+    })
+    getUserInfo({
+        token: data
+    }).then((res) => {
+        const token = decrypt(res.token)
+        if (token.randomCode !== RCode) {
+            showToast(lang[props.langType].verificationCodeError);
+            return;
+        }
+        const userType = token.userType;
+        const keysList = Object.keys(lang[props.langType].distinguishedGuest); // 获取对象的所有键名组成的数组
+        for (let ii = 0; ii < keysList.length; ii++) {
+            const keys = keysList[ii];
+            const value = lang[props.langType].distinguishedGuest[keys];  // 获取对象的所有键名组成的数组
+            value === userType ? code = keys + 'Recurrence' : '';
+        }
+        emits('saveData', code, form.verificationCode.toLowerCase().trim(), token);
+    }).catch((res) => {
+        showToast(res.msg || lang[props.langType].networkError);
+    })
+}
+</script>
+
+<style lang="scss">
+.introduce {
+    padding-top: 30px;
+    box-sizing: border-box;
+    color: #ffffff;
+    padding-bottom: 10px;
+    overflow: hidden;
+    position: relative;
+    background: url('../../assets/img/2025lameifenghui.png') no-repeat 100% 100%;
+    width: 100%;
+    min-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: 4px 8px 0 30px;
+        line-height: 1.75em;
+        font-size: 1rem;
+    }
+
+    .line {
+        width: 16px;
+        height: 1px;
+        background-color: #FFFFFF00;
+        margin: 20px auto 20px 30px;
+    }
+
+    .btn_bottom {
+        background-color: #ffffff;
+        text-align: center;
+        color: #001770;
+        width: calc(100% - 40px);
+        margin: 24px auto 21px auto;
+        font-size: 1rem;
+    }
+
+    .tologo {
+        font-size: 1rem;
+        text-align: center;
+    }
+}
+</style>

+ 5 - 0
src/view/fenghuitest/lang.js

@@ -0,0 +1,5 @@
+import en from './en';
+import zh from './zh';
+import es from './es';
+
+export default { zh, en, es }

File diff suppressed because it is too large
+ 0 - 0
src/view/fenghuitest/wasm_encrypt.min.js


+ 375 - 0
src/view/fenghuitest/zh.js

@@ -0,0 +1,375 @@
+export default {
+    "more": "查看更多会议详情",
+    "timesText": "仅有一次修改机会",
+    "searchText": "请输入搜索关键词",
+    "technicalAdvice": "技术咨询:455769421@qq.com,+86-18502918086",
+    "identityType": "身份类别",
+    "identityTypeContent": "身份类别",
+    "media": "媒体",
+    "staff": "工作人员",
+    "volunteer": "志愿者",
+    "active0": "是否参加5月15日上午的开幕式",
+    "active": "是否参加5月15日下午的分论坛?",
+    "active1": "共享数字经济发展机遇",
+    "active2": "共同维护网络空间安全",
+    "active3": "共商人工智能发展治理",
+    "active4": "观看非遗科技展演《无界一长安》",
+    "active5": "参观西安交大创新港、互联网企业‘易点天下’",
+    "active6": "参观秦始皇兵马俑博物馆",
+    "active7": "不参加",
+    "active0Content": "是否参加5月15日开幕式(上午)",
+    "activitiesAttended": "拟参加的活动(多选)",
+    "activitiesAttendedContent": "选择拟参加的活动",
+    "username": "用户名",
+    "password": "密码",
+    "login": "登录",
+    "tologoText": "已报名登陆通道",
+    "confirm": "是",
+    "cancel": "否",
+    "verificationCode": "邀请码",
+    "title": "中拉互联网发展与合作论坛",
+    "verificationCodeError": "验证失败",
+    "verificationCodeContent": "请输入邀请码",
+    "signUp": "境外嘉宾注册",
+    "signUpZH": "国内嘉宾注册",
+    "signUpWK": "工作人员注册",
+    "wrestleMania": "举办时间",
+    "wrestleManiaContent": "2025年5⽉15⽇⾄16日",
+    "venue": "举办地点",
+    "venueContent": "西安国际会议中⼼<br />(西安市灞桥区浐灞⽣态区世博⼤道2626号)",
+    "marst": "论坛主题",
+    "marstContent": "共享数字发展新机遇<br />共建中拉网络空间命运共同体",
+    "organization": "组织机构",
+    "organizationSub1": "主办单位:",
+    "organizationSub2": "中国国家互联⽹信息办公室<br />陕西省⼈民政府",
+    "organizationSub3": "承办单位:",
+    "organizationSub4": "陕西省互联⽹信息办公室<br />陕西省外事办公室",
+    "basicInformation": "个人基本信息",
+    "name": "姓名",
+    "upFile": "上传中...",
+    "nameContent": "示例:张三 ZHANG SAN",
+    "lastName": "姓",
+    "lastNameContent": "请输入姓氏",
+    "firstName": "名",
+    "firstNameContent": "请输入名称",
+    "career": "职务",
+    "careerContent": "请输入职务",
+    "level": "职级",
+    "levelContent": "请选择职级",
+    "contact": "手机号码",
+    "contactContent": "请输入手机号",
+    "company": "工作单位",
+    "companyContent": "请输入工作单位",
+    "companyB": "工作单位及部门",
+    "companyBContent": "请填写您的工作单位及部门",
+    "photo": "照片",
+    "photoContent": "请选择照片",
+    "photoSubContent": "支持上传jpg,png等格式的图片,大小100M以内",
+    "conference": "参会信息",
+    "conferenceType": "证件类型",
+    "conferenceTypeContent": "请选择证件类型",
+    "unitType": "单位类型",
+    "unitTypeContent": "请选择单位类型",
+    "orther": "其他材料",
+    "ortherNotes": "备注",
+    "ortherNotesContent": "特殊需求",
+    "submit": "提交申请",
+    "fileSize": "超出文件大小限制",
+    "networkError": "网络错误",
+    "upFileError": "上传失败",
+    "upFileSusscess": "上传成功",
+    "upRegistration": "注册信息更新成功",
+    "registration": "注册成功",
+    "gender": "性别",
+    "genderContent": "请输入性别",
+    "email": "邮箱",
+    "emailContent": "请输入邮箱",
+    "birthday": "出生日期",
+    "birthdayContent": "请输入生日",
+    "countryOrRegion": "国家",
+    "countryOrRegionContent": "请选择国家",
+    "countryRegion": "国家/地区",
+    "countryRegionContent": "请输入国家/地区",
+    "provinceCity": "省市",
+    "provinceCityContent": "请输入省市",
+    "passportContent": "请输入证件号码",
+    "passport": "证件号码",
+    "IDcardNumber": "身份证号",
+    "IDcardNumberContent": "请输入身份证号",
+    "workGroupText": "工作组",
+    "workGroupTextContent": "请选择工作组",
+    "belief": "宗教信仰",
+    "beliefContent": "请输入宗教信仰",
+    "fax": "传真/邮箱",
+    "faxContent": "请输入传真/邮箱",
+    "officeAddress": "办公地址",
+    "officeAddressContent": "请输入办公地址",
+    "catering": "饮食禁忌",
+    "cateringContent": "请输入饮食禁忌",
+    "emergencyContact": "联系人",
+    "emergencyContactContent": "请输入联系人",
+    "emergencyContactPhone": "联系人电话",
+    "emergencyContactPhoneContent": "请输入联系人电话",
+    "interview": "接受采访意向",
+    "interviewContent": "请选择接受采访意向",
+    "reach": "到达西安方式",
+    "reachContent": "请输入到达西安交通方式",
+    "reachTrainNumber": "到达车次/航班",
+    "reachTrainNumberContent": "请输入到达车次/航班/车牌号",
+    "reachTime": "到达西安时间",
+    "reachTimeContent": "请输入到达西安时间",
+    "leavingTrainNumber": "离开车次/航班",
+    "leavingTrainNumberContent": "请输入离开车次/航班/车牌号",
+    "leavingTime": "送站时间",
+    "leavingTimeContent": "请输入送站时间",
+    "checkOutTime": "退房时间",
+    "checkOutTimeContent": "请输入退房时间",
+    "careerList": [
+        { text: '正部', value: '正部' },
+        { text: '副部', value: '副部' },
+        { text: '司局', value: '司局' },
+        { text: '其他', value: '其他' },
+    ],
+    "cardTypeList": [
+        { text: '身份证', value: '身份证' },
+        { text: '护照', value: '护照' },
+        { text: '港澳居民通行证', value: '港澳居民通行证' },
+        { 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: '综合保障组-其他' },
+    ],
+    "countryRegionList": [
+        { "text": "亚洲", "value": "亚洲", "disabled": true },
+        { "text": "阿富汗", "value": "阿富汗" },
+        { "text": "阿联酋", "value": "阿联酋" },
+        { "text": "阿曼", "value": "阿曼" },
+        { "text": "阿塞拜疆", "value": "阿塞拜疆" },
+        { "text": "巴基斯坦", "value": "巴基斯坦" },
+        { "text": "巴勒斯坦", "value": "巴勒斯坦" },
+        { "text": "巴林", "value": "巴林" },
+        { "text": "不丹", "value": "不丹" },
+        { "text": "朝鲜", "value": "朝鲜" },
+        { "text": "东帝汶", "value": "东帝汶" },
+        { "text": "菲律宾", "value": "菲律宾" },
+        { "text": "格鲁吉亚", "value": "格鲁吉亚" },
+        { "text": "哈萨克斯坦", "value": "哈萨克斯坦" },
+        { "text": "韩国", "value": "韩国" },
+        { "text": "吉尔吉斯斯坦", "value": "吉尔吉斯斯坦" },
+        { "text": "柬埔寨", "value": "柬埔寨" },
+        { "text": "卡塔尔", "value": "卡塔尔" },
+        { "text": "科威特", "value": "科威特" },
+        { "text": "老挝", "value": "老挝" },
+        { "text": "黎巴嫩", "value": "黎巴嫩" },
+        { "text": "马尔代夫", "value": "马尔代夫" },
+        { "text": "马来西亚", "value": "马来西亚" },
+        { "text": "蒙古", "value": "蒙古" },
+        { "text": "孟加拉国", "value": "孟加拉国" },
+        { "text": "缅甸", "value": "缅甸" },
+        { "text": "尼泊尔", "value": "尼泊尔" },
+        { "text": "日本", "value": "日本" },
+        { "text": "沙特阿拉伯", "value": "沙特阿拉伯" },
+        { "text": "斯里兰卡", "value": "斯里兰卡" },
+        { "text": "塔吉克斯坦", "value": "塔吉克斯坦" },
+        { "text": "泰国", "value": "泰国" },
+        { "text": "土耳其", "value": "土耳其" },
+        { "text": "土库曼斯坦", "value": "土库曼斯坦" },
+        { "text": "文莱", "value": "文莱" },
+        { "text": "乌兹别克斯坦", "value": "乌兹别克斯坦" },
+        { "text": "新加坡", "value": "新加坡" },
+        { "text": "叙利亚", "value": "叙利亚" },
+        { "text": "亚美尼亚", "value": "亚美尼亚" },
+        { "text": "也门", "value": "也门" },
+        { "text": "伊拉克", "value": "伊拉克" },
+        { "text": "伊朗", "value": "伊朗" },
+        { "text": "以色列", "value": "以色列" },
+        { "text": "印度", "value": "印度" },
+        { "text": "印度尼西亚", "value": "印度尼西亚" },
+        { "text": "约旦", "value": "约旦" },
+        { "text": "越南", "value": "越南" },
+        { "text": "中国大陆", "value": "中国大陆" },
+        { "text": "中国香港", "value": "中国香港" },
+        { "text": "中国澳门", "value": "中国澳门" },
+        { "text": "中国台湾", "value": "中国台湾" },
+
+        { "text": "非洲", "value": "非洲", "disabled": true },
+        { "text": "阿尔及利亚", "value": "阿尔及利亚" },
+        { "text": "埃及", "value": "埃及" },
+        { "text": "埃塞俄比亚", "value": "埃塞俄比亚" },
+        { "text": "安哥拉", "value": "安哥拉" },
+        { "text": "贝宁", "value": "贝宁" },
+        { "text": "博茨瓦纳", "value": "博茨瓦纳" },
+        { "text": "布基纳法索", "value": "布基纳法索" },
+        { "text": "布隆迪", "value": "布隆迪" },
+        { "text": "赤道几内亚", "value": "赤道几内亚" },
+        { "text": "多哥", "value": "多哥" },
+        { "text": "厄立特里亚", "value": "厄立特里亚" },
+        { "text": "佛得角", "value": "佛得角" },
+        { "text": "冈比亚", "value": "冈比亚" },
+        { "text": "刚果(布)", "value": "刚果(布)" },
+        { "text": "刚果(金)", "value": "刚果(金)" },
+        { "text": "吉布提", "value": "吉布提" },
+        { "text": "几内亚", "value": "几内亚" },
+        { "text": "几内亚比绍", "value": "几内亚比绍" },
+        { "text": "加纳", "value": "加纳" },
+        { "text": "加蓬", "value": "加蓬" },
+        { "text": "津巴布韦", "value": "津巴布韦" },
+        { "text": "喀麦隆", "value": "喀麦隆" },
+        { "text": "科摩罗", "value": "科摩罗" },
+        { "text": "科特迪瓦", "value": "科特迪瓦" },
+        { "text": "肯尼亚", "value": "肯尼亚" },
+        { "text": "莱索托", "value": "莱索托" },
+        { "text": "利比里亚", "value": "利比里亚" },
+        { "text": "利比亚", "value": "利比亚" },
+        { "text": "卢旺达", "value": "卢旺达" },
+        { "text": "马达加斯加", "value": "马达加斯加" },
+        { "text": "马拉维", "value": "马拉维" },
+        { "text": "马里", "value": "马里" },
+        { "text": "毛里求斯", "value": "毛里求斯" },
+        { "text": "毛里塔尼亚", "value": "毛里塔尼亚" },
+        { "text": "摩洛哥", "value": "摩洛哥" },
+        { "text": "莫桑比克", "value": "莫桑比克" },
+        { "text": "纳米比亚", "value": "纳米比亚" },
+        { "text": "南非", "value": "南非" },
+        { "text": "南苏丹", "value": "南苏丹" },
+        { "text": "尼日尔", "value": "尼日尔" },
+        { "text": "尼日利亚", "value": "尼日利亚" },
+        { "text": "塞拉利昂", "value": "塞拉利昂" },
+        { "text": "塞内加尔", "value": "塞内加尔" },
+        { "text": "塞舌尔", "value": "塞舌尔" },
+        { "text": "圣多美和普林西比", "value": "圣多美和普林西比" },
+        { "text": "斯威士兰", "value": "斯威士兰" },
+        { "text": "苏丹", "value": "苏丹" },
+        { "text": "索马里", "value": "索马里" },
+        { "text": "坦桑尼亚", "value": "坦桑尼亚" },
+        { "text": "突尼斯", "value": "突尼斯" },
+        { "text": "乌干达", "value": "乌干达" },
+        { "text": "赞比亚", "value": "赞比亚" },
+        { "text": "乍得", "value": "乍得" },
+        { "text": "中非", "value": "中非" },
+        { "text": "欧洲", "value": "欧洲", "disabled": true },
+        { "text": "阿尔巴尼亚", "value": "阿尔巴尼亚" },
+        { "text": "爱尔兰", "value": "爱尔兰" },
+        { "text": "爱沙尼亚", "value": "爱沙尼亚" },
+        { "text": "安道尔", "value": "安道尔" },
+        { "text": "奥地利", "value": "奥地利" },
+        { "text": "白俄罗斯", "value": "白俄罗斯" },
+        { "text": "保加利亚", "value": "保加利亚" },
+        { "text": "北马其顿", "value": "北马其顿" },
+        { "text": "比利时", "value": "比利时" },
+        { "text": "冰岛", "value": "冰岛" },
+        { "text": "波黑", "value": "波黑" },
+        { "text": "波兰", "value": "波兰" },
+        { "text": "丹麦", "value": "丹麦" },
+        { "text": "德国", "value": "德国" },
+        { "text": "俄罗斯", "value": "俄罗斯" },
+        { "text": "法国", "value": "法国" },
+        { "text": "梵蒂冈", "value": "梵蒂冈" },
+        { "text": "芬兰", "value": "芬兰" },
+        { "text": "荷兰", "value": "荷兰" },
+        { "text": "黑山", "value": "黑山" },
+        { "text": "捷克", "value": "捷克" },
+        { "text": "克罗地亚", "value": "克罗地亚" },
+        { "text": "拉脱维亚", "value": "拉脱维亚" },
+        { "text": "立陶宛", "value": "立陶宛" },
+        { "text": "列支敦士登", "value": "列支敦士登" },
+        { "text": "卢森堡", "value": "卢森堡" },
+        { "text": "罗马尼亚", "value": "罗马尼亚" },
+        { "text": "马耳他", "value": "马耳他" },
+        { "text": "摩尔多瓦", "value": "摩尔多瓦" },
+        { "text": "摩纳哥", "value": "摩纳哥" },
+        { "text": "挪威", "value": "挪威" },
+        { "text": "葡萄牙", "value": "葡萄牙" },
+        { "text": "瑞典", "value": "瑞典" },
+        { "text": "瑞士", "value": "瑞士" },
+        { "text": "塞尔维亚", "value": "塞尔维亚" },
+        { "text": "塞浦路斯", "value": "塞浦路斯" },
+        { "text": "圣马力诺", "value": "圣马力诺" },
+        { "text": "斯洛伐克", "value": "斯洛伐克" },
+        { "text": "斯洛文尼亚", "value": "斯洛文尼亚" },
+        { "text": "乌克兰", "value": "乌克兰" },
+        { "text": "西班牙", "value": "西班牙" },
+        { "text": "希腊", "value": "希腊" },
+        { "text": "匈牙利", "value": "匈牙利" },
+        { "text": "意大利", "value": "意大利" },
+        { "text": "英国", "value": "英国" },
+        { "text": "北美洲", "value": "北美洲", "disabled": true },
+        { "text": "安提瓜和巴布达", "value": "安提瓜和巴布达" },
+        { "text": "巴巴多斯", "value": "巴巴多斯" },
+        { "text": "巴哈马", "value": "巴哈马" },
+        { "text": "巴拿马", "value": "巴拿马" },
+        { "text": "伯利兹", "value": "伯利兹" },
+        { "text": "多米尼加", "value": "多米尼加" },
+        { "text": "多米尼克", "value": "多米尼克" },
+        { "text": "格林纳达", "value": "格林纳达" },
+        { "text": "哥斯达黎加", "value": "哥斯达黎加" },
+        { "text": "古巴", "value": "古巴" },
+        { "text": "海地", "value": "海地" },
+        { "text": "洪都拉斯", "value": "洪都拉斯" },
+        { "text": "加拿大", "value": "加拿大" },
+        { "text": "美国", "value": "美国" },
+        { "text": "墨西哥", "value": "墨西哥" },
+        { "text": "尼加拉瓜", "value": "尼加拉瓜" },
+        { "text": "萨尔瓦多", "value": "萨尔瓦多" },
+        { "text": "圣基茨和尼维斯", "value": "圣基茨和尼维斯" },
+        { "text": "圣卢西亚", "value": "圣卢西亚" },
+        { "text": "圣文森特和格林纳丁斯", "value": "圣文森特和格林纳丁斯" },
+        { "text": "特立尼达和多巴哥", "value": "特立尼达和多巴哥" },
+        { "text": "危地马拉", "value": "危地马拉" },
+        { "text": "牙买加", "value": "牙买加" },
+        { "text": "南美洲", "value": "南美洲", "disabled": true },
+        { "text": "阿根廷", "value": "阿根廷" },
+        { "text": "巴拉圭", "value": "巴拉圭" },
+        { "text": "巴西", "value": "巴西" },
+        { "text": "秘鲁", "value": "秘鲁" },
+        { "text": "玻利维亚", "value": "玻利维亚" },
+        { "text": "厄瓜多尔", "value": "厄瓜多尔" },
+        { "text": "哥伦比亚", "value": "哥伦比亚" },
+        { "text": "圭亚那", "value": "圭亚那" },
+        { "text": "苏里南", "value": "苏里南" },
+        { "text": "委内瑞拉", "value": "委内瑞拉" },
+        { "text": "乌拉圭", "value": "乌拉圭" },
+        { "text": "智利", "value": "智利" },
+        { "text": "大洋洲", "value": "大洋洲", "disabled": true },
+        { "text": "澳大利亚", "value": "澳大利亚" },
+        { "text": "巴布亚新几内亚", "value": "巴布亚新几内亚" },
+        { "text": "斐济", "value": "斐济" },
+        { "text": "基里巴斯", "value": "基里巴斯" },
+        { "text": "库克群岛", "value": "库克群岛" },
+        { "text": "马绍尔群岛", "value": "马绍尔群岛" },
+        { "text": "密克罗尼西亚联邦", "value": "密克罗尼西亚联邦" },
+        { "text": "瑙鲁", "value": "瑙鲁" },
+        { "text": "纽埃", "value": "纽埃" },
+        { "text": "帕劳", "value": "帕劳" },
+        { "text": "萨摩亚", "value": "萨摩亚" },
+        { "text": "所罗门群岛", "value": "所罗门群岛" },
+        { "text": "汤加", "value": "汤加" },
+        { "text": "图瓦卢", "value": "图瓦卢" },
+        { "text": "瓦努阿图", "value": "瓦努阿图" },
+        { "text": "新西兰", "value": "新西兰" }
+    ],
+}

Some files were not shown because too many files changed in this diff