index.vue 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766
  1. <template>
  2. <div class="fenghui">
  3. <!-- <div class="swith">
  4. <div class="title" @click="showLange = true">
  5. {{ langObjT[langType] }}
  6. <van-icon name="arrow-down" />
  7. </div>
  8. <van-popup v-model:show="showLange" destroy-on-close round position="bottom">
  9. <van-picker :model-value="[langType]" :columns="langObj" @cancel="showLange = false"
  10. @confirm="langChange" />
  11. </van-popup>
  12. </div> -->
  13. <van-image style="width: 100%;" :src="soundbyteJpg" />
  14. <br />
  15. <van-form @submit="onSubmit">
  16. <div class="submit">
  17. <div class="introduce">
  18. <h4 class="text" v-text="lang[langType].forumTopic"> </h4>
  19. <p class="text" v-text="lang[langType].forumTopicContent"></p>
  20. <h4 class="text" v-text="lang[langType].wrestleMania"></h4>
  21. <p class="text" v-text="lang[langType].wrestleManiaContent"></p>
  22. <h4 class="text" v-text="lang[langType].venue"></h4>
  23. <p class="text" v-text="lang[langType].venueContent"></p>
  24. <h4 class="text" v-text="lang[langType].organization"></h4>
  25. <div class="text" v-text="lang[langType].organizationSub1"></div>
  26. <div class="text" v-text="lang[langType].organizationSub2"></div>
  27. <h4 class="text" v-text="lang[langType].scale"></h4>
  28. <div class="text" style="text-indent: 2em;" v-text="lang[langType].scaleContent"></div>
  29. </div>
  30. <van-cell-group inset v-if="showForm">
  31. <!-- <h4 class="title" v-text="lang[langType].basicInformation"></h4> -->
  32. <h4 class="text" v-text="lang[langType].signUp"></h4>
  33. <!-- 姓名 -->
  34. <van-field label-width="7em" size="large"
  35. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].nameContent }]" required
  36. v-model="from.name" :placeholder="lang[langType].nameContent">
  37. <template #label>
  38. <span class="label" v-html="lang[langType].name"></span>
  39. </template>
  40. </van-field>
  41. <!-- 拼音 -->
  42. <van-field label-width="7em" size="large"
  43. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].pinyinContent }]"
  44. v-model="from.pinyin" required :placeholder="lang[langType].pinyinContent">
  45. <template #label>
  46. <span class="label" v-html="lang[langType].pinyin"></span>
  47. </template>
  48. </van-field>
  49. <!-- 性别 -->
  50. <van-field label-width="7em" size="large"
  51. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].genderContent }]"
  52. v-model="from.gender" required :placeholder="lang[langType].genderContent">
  53. <template #label>
  54. <span class="label" v-html="lang[langType].gender"></span>
  55. </template>
  56. </van-field>
  57. <!-- 照片 -->
  58. <van-field label-width="7em" size="large" :placeholder="lang[langType].photoContent" required
  59. :rules="[{ required: true, trigger: 'onChange', message: lang[langType].photoContent }]"
  60. v-model="from.fileUrl">
  61. <template #label>
  62. <span class="label" v-html="lang[langType].photo"></span>
  63. </template>
  64. <template #input>
  65. <van-uploader :preview-full-image="false" accept="image/*" v-model="photo" :max-count="1"
  66. :max-size="524288000" @oversize="filesize" :after-read="beforeRead" result-type="file">
  67. </van-uploader>
  68. <p style="font-size: 12px;" v-text="lang[langType].photoSubContent"> </p>
  69. </template>
  70. </van-field>
  71. <!-- 手机号 -->
  72. <van-field label-width="7em" size="large"
  73. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].genderContent }]"
  74. v-model="from.contact" :label="lang[langType].contact" type="number" required
  75. :placeholder="lang[langType].contactContent" />
  76. <!-- 邮箱 -->
  77. <van-field label-width="7em" size="large"
  78. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].emailContent }]" required
  79. v-model="from.email" :placeholder="lang[langType].emailContent">
  80. <template #label>
  81. <span class="label" v-html="lang[langType].email"></span>
  82. </template>
  83. </van-field>
  84. <!-- 生日 -->
  85. <van-field label-width="7em" size="large"
  86. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].birthdayContent }]"
  87. is-link readonly @click="showBirthday = true" v-model="from.birthday" required
  88. :placeholder="lang[langType].birthdayContent">
  89. <template #label>
  90. <span class="label" v-html="lang[langType].birthday"></span>
  91. </template>
  92. </van-field>
  93. <van-popup v-model:show="showBirthday" destroy-on-close round position="bottom">
  94. <van-date-picker @confirm="packerConfirm" :title="lang[langType].birthday"
  95. @cancal="showBirthday = false" :min-date="new Date(1970, 0, 1)" :max-date="new Date()" />
  96. </van-popup>
  97. <!-- 工作单位 -->
  98. <van-field label-width="7em" size="large"
  99. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].workUnit }]" required
  100. v-model="from.workUnit" :label="lang[langType].company"
  101. :placeholder="lang[langType].companyContent" />
  102. <!-- 国家/地区 -->
  103. <van-field label-width="7em" size="large"
  104. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].CountryOrRegionContent }]"
  105. v-model="from.CountryOrRegion" :label="lang[langType].CountryOrRegion" required
  106. :placeholder="lang[langType].CountryOrRegionContent" />
  107. <!-- 省市 -->
  108. <van-field label-width="7em" size="large"
  109. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].provinceCityContent }]"
  110. v-model="from.provinceCity" required :placeholder="lang[langType].provinceCityContent">
  111. <template #label>
  112. <span class="label" v-html="lang[langType].provinceCity"></span>
  113. </template>
  114. </van-field>
  115. <!-- 单位类型 -->
  116. <van-field label-width="7em" size="large"
  117. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].unitTypeContent }]"
  118. v-model="from.unitType" :label="lang[langType].unitType" required
  119. :placeholder="lang[langType].unitTypeContent" />
  120. <!-- jobLevel 职务级别 -->
  121. <van-field label-width="7em" size="large"
  122. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].jobLevelContent }]"
  123. v-model="from.jobLevel" :label="lang[langType].jobLevel" required
  124. :placeholder="lang[langType].jobLevelContent" />
  125. <!-- title 称谓 -->
  126. <van-field label-width="7em" size="large" required
  127. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].titleContent }]"
  128. v-model="from.title" :placeholder="lang[langType].titleContent">
  129. <template #label>
  130. <span class="label" v-html="lang[langType].title"></span>
  131. </template>
  132. </van-field>
  133. <!-- otherTitle 其他称谓 -->
  134. <van-field label-width="7em" size="large" required
  135. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].otherTitleContent }]"
  136. v-model="from.otherTitle" :label="lang[langType].otherTitle"
  137. :placeholder="lang[langType].otherTitleContent" />
  138. <!-- chineseName 中文名 -->
  139. <van-field label-width="7em" size="large"
  140. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].chineseNameContent }]"
  141. v-model="from.chineseName" :label="lang[langType].chineseName" required
  142. :placeholder="lang[langType].chineseNameContent" />
  143. <!-- 身份证 -->
  144. <!-- <van-field label-width="7em" size="large"
  145. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].idCardContent }]"
  146. v-model="from.idCard" :label="lang[langType].idCard" required
  147. :placeholder="lang[langType].idCardContent" /> -->
  148. <!-- 证件类型 -->
  149. <van-field label-width="7em" size="large" v-model="from.cardTypeName" is-link readonly
  150. :label="lang[langType].conferenceType" :placeholder="lang[langType].conferenceTypeContent"
  151. @click="showCardType = true" required />
  152. <van-popup v-model:show="showCardType" destroy-on-close round position="bottom">
  153. <van-picker :model-value="from.cardType" :columns="cardTypeList" @cancel="showCardType = false"
  154. @confirm="onConfirm" />
  155. </van-popup>
  156. <!-- 证件 -->
  157. <van-field label-width="7em" size="large"
  158. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].passportContent }]"
  159. v-model="from.passport" :label="lang[langType].passport" required
  160. :placeholder="lang[langType].passportContent" />
  161. <!-- 宗教 -->
  162. <van-field label-width="7em" size="large"
  163. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].beliefContent }]"
  164. v-model="from.belief" :label="lang[langType].belief" required
  165. :placeholder="lang[langType].beliefContent" />
  166. <!-- 外交职衔 -->
  167. <van-field label-width="7em" size="large"
  168. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].diplomaticRankContent }]"
  169. v-model="from.diplomaticRank" :label="lang[langType].diplomaticRank" required
  170. :placeholder="lang[langType].diplomaticRankContent" />
  171. <!-- 主要成就 -->
  172. <van-field label-width="7em" size="large" v-model="from.mainAchievements"
  173. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].mainAchievementsContent }]"
  174. :label="lang[langType].mainAchievements" required
  175. :placeholder="lang[langType].mainAchievementsContent" />
  176. <!-- 职务 -->
  177. <van-field label-width="7em" size="large" v-model="from.career"
  178. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].careerContent }]" required
  179. :placeholder="lang[langType].careerContent">
  180. <template #label>
  181. <span class="label" v-html="lang[langType].career"></span>
  182. </template>
  183. </van-field>
  184. <div style="background-color: #F7F7F7;height: 10px;"></div>
  185. <!-- 固话 -->
  186. <van-field label-width="7em" size="large"
  187. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].fixedLineContent }]"
  188. v-model="from.fixedLine" :label="lang[langType].fixedLine" type="number" required
  189. :placeholder="lang[langType].fixedLineContent" />
  190. <!-- 传真 -->
  191. <van-field label-width="7em" size="large"
  192. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].faxContent }]"
  193. v-model="from.fax" type="number" required :placeholder="lang[langType].faxContent">
  194. <template #label>
  195. <span class="label" v-html="lang[langType].fax"></span>
  196. </template>
  197. </van-field>
  198. <!-- 办公地址 -->
  199. <van-field label-width="7em" size="large" v-model="from.officeAddress" rows="3" autosize required
  200. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].officeAddressContent }]"
  201. :label="lang[langType].officeAddress" type="textarea"
  202. :placeholder="lang[langType].officeAddressContent" />
  203. <!-- 饮食要求 -->
  204. <van-field label-width="7em" size="large" v-model="from.catering" rows="3" autosize
  205. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].cateringContent }]"
  206. :label="lang[langType].catering" type="textarea" required
  207. :placeholder="lang[langType].cateringContent" />
  208. <!-- 过敏源 -->
  209. <van-field label-width="7em" size="large" v-model="from.allergen" rows="3" autosize
  210. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].allergenContent }]"
  211. :label="lang[langType].allergen" type="textarea" required
  212. :placeholder="lang[langType].allergenContent" />
  213. <!-- 紧急联系人 -->
  214. <van-field label-width="7em" size="large" v-model="from.emergencyContact"
  215. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].emergencyContactContent }]"
  216. :label="lang[langType].emergencyContact" required
  217. :placeholder="lang[langType].emergencyContactContent" />
  218. <!-- 紧急联系人电话 -->
  219. <van-field label-width="7em" size="large" v-model="from.emergencyContactPhone" required
  220. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].emergencyContactPhoneContent }]"
  221. :label="lang[langType].emergencyContactPhone"
  222. :placeholder="lang[langType].emergencyContactPhoneContent" />
  223. <!-- 接受采访意向 -->
  224. <van-field label-width="7em" size="large" v-model="from.interview" :label="lang[langType].interview"
  225. required
  226. :rules="[{ required: true, trigger: 'onBlur', message: lang[langType].interviewContent }]"
  227. :placeholder="lang[langType].interviewContent">
  228. <template #input>
  229. <van-radio-group v-model="from.interview" direction="horizontal">
  230. <van-radio name="同意">同意</van-radio>
  231. <van-radio name="拒绝">拒绝</van-radio>
  232. </van-radio-group>
  233. </template>
  234. </van-field>
  235. <!-- 媒体类别 -->
  236. <van-field label-width="7em" size="large" v-model="from.media" :label="lang[langType].media"
  237. :placeholder="lang[langType].mediaContent" />
  238. <div style="background-color: #F7F7F7;height: 10px;"></div>
  239. <!-- 抵达中国航班 -->
  240. <van-field label-width="7em" size="large" v-model="from.flight" :label="lang[langType].flight"
  241. :placeholder="lang[langType].flightContent" />
  242. <!-- 抵达中国地点 -->
  243. <van-field label-width="7em" size="large" v-model="from.arrivalLocation"
  244. :label="lang[langType].arrivalLocation" :placeholder="lang[langType].arrivalLocationContent" />
  245. <!-- 抵达中国时间 -->
  246. <van-field label-width="7em" size="large" v-model="from.arrivalTime" is-link readonly
  247. @click="showArrivalTime = true" :label="lang[langType].arrivalTime"
  248. :placeholder="lang[langType].arrivalTimeContent" />
  249. <van-popup v-model:show="showArrivalTime" destroy-on-close round position="bottom">
  250. <van-picker :title="lang[langType].arrivalTime" :columns="dateTimeColumns"
  251. @confirm="handleConfirm" @calcan="showArrivalTime = false" />
  252. </van-popup>
  253. <!-- 中转交通方式 -->
  254. <van-field label-width="7em" size="large" v-model="from.transfer" :label="lang[langType].transfer"
  255. :placeholder="lang[langType].transferContent" />
  256. <!-- 中转时间 -->
  257. <van-field label-width="7em" size="large" v-model="from.transferTime"
  258. @click="showTransferTime = true" is-link readonly :label="lang[langType].transferTime"
  259. :placeholder="lang[langType].transferTimeContent" />
  260. <van-popup v-model:show="showTransferTime" destroy-on-close round position="bottom">
  261. <van-picker :title="lang[langType].arrivalTime" :columns="dateTimeColumns"
  262. @confirm="transferTimeConfirm" @calcan="showTransferTime = false" />
  263. </van-popup>
  264. <!-- 抵达西安交通方式 -->
  265. <van-field label-width="7em" size="large" v-model="from.reach" :label="lang[langType].reach"
  266. :placeholder="lang[langType].reachContent" />
  267. <!-- 抵达西安交通车次 -->
  268. <van-field label-width="7em" size="large" v-model="from.reachTrainNumber"
  269. :label="lang[langType].reachTrainNumber"
  270. :placeholder="lang[langType].reachTrainNumberContent" />
  271. <!-- 抵达西安地点 -->
  272. <van-field label-width="7em" size="large" v-model="from.reachLocation"
  273. :label="lang[langType].reachLocation" :placeholder="lang[langType].reachLocationContent" />
  274. <!-- 抵达西安时间 -->
  275. <van-field label-width="7em" size="large" v-model="from.reachTime" is-link readonly
  276. @click="showReachTime = true" :label="lang[langType].reachTime"
  277. :placeholder="lang[langType].reachTimeContent" />
  278. <van-popup v-model:show="showReachTime" destroy-on-close round position="bottom">
  279. <van-picker :title="lang[langType].reachTime" :columns="dateTimeColumns"
  280. @confirm="reachTimeConfirm" @calcan="showReachTime = false" />
  281. </van-popup>
  282. <!-- 接站地点 -->
  283. <van-field label-width="7em" size="large" v-model="from.pickUpLocation"
  284. :label="lang[langType].pickUpLocation" :placeholder="lang[langType].pickUpLocationContent" />
  285. <!-- 离开交通方式 -->
  286. <van-field label-width="7em" size="large" v-model="from.leavingTransportationMode"
  287. :label="lang[langType].leavingTransportationMode"
  288. :placeholder="lang[langType].leavingTransportationModeContent" />
  289. <!-- 离开车次 -->
  290. <van-field label-width="7em" size="large" v-model="from.leavingTrainNumber"
  291. :label="lang[langType].leavingTrainNumber"
  292. :placeholder="lang[langType].leavingTrainNumberContent" />
  293. <!-- 离开地点 -->
  294. <van-field label-width="7em" size="large" v-model="from.leavingLocation"
  295. :label="lang[langType].leavingLocation" :placeholder="lang[langType].leavingLocationContent" />
  296. <!-- 离开时间 -->
  297. <van-field label-width="7em" size="large" v-model="from.leavingTime" is-link readonly
  298. @click="showLeavingTime = true" :label="lang[langType].leavingTime"
  299. :placeholder="lang[langType].leavingTimeContent" />
  300. <van-popup v-model:show="showLeavingTime" destroy-on-close round position="bottom">
  301. <van-picker :title="lang[langType].leavingTime" :columns="dateTimeColumns"
  302. @confirm="leavingTimeConfirm" @calcan="showLeavingTime = false" />
  303. </van-popup>
  304. <!-- 入住时间 -->
  305. <van-field label-width="7em" size="large" v-model="from.checkInTime" is-link readonly
  306. @click="showCheckInTime = true" :label="lang[langType].checkInTime"
  307. :placeholder="lang[langType].checkInTimeContent" />
  308. <van-popup v-model:show="showCheckInTime" destroy-on-close round position="bottom">
  309. <van-picker :title="lang[langType].checkInTime" :columns="dateTimeColumns"
  310. @confirm="checkInTimeConfirm" @calcan="showCheckInTime = false" />
  311. </van-popup>
  312. <!-- 离店时间 -->
  313. <van-field label-width="7em" size="large" v-model="from.checkOutTime" is-link readonly
  314. @click="showCheckOutTime = true" :label="lang[langType].checkOutTime"
  315. :placeholder="lang[langType].checkOutTimeContent" />
  316. <van-popup v-model:show="showCheckOutTime" destroy-on-close round position="bottom">
  317. <van-picker :title="lang[langType].checkOutTime" :columns="dateTimeColumns"
  318. @confirm="checkOutTimeConfirm" @calcan="showCheckOutTime = false" />
  319. </van-popup>
  320. <!-- <br /> -->
  321. <!-- <h4 class="title" v-text="lang[langType].conference"></h4> -->
  322. <!-- <br /> -->
  323. <!-- <h4 class="title" v-text="lang[langType].orther"></h4> -->
  324. <van-field label-width="7em" size="large" v-model="from.message" rows="3" autosize
  325. type="textarea"
  326. :placeholder="lang[langType].ortherNotesContent">
  327. <template #label>
  328. <span class="label" v-html="lang[langType].ortherNotes"></span>
  329. </template>
  330. </van-field>
  331. </van-cell-group>
  332. </div>
  333. <br />
  334. <van-button class="btn_bottom" block type="primary" native-type="submit">
  335. {{ lang[langType].signUp }}
  336. </van-button>
  337. <div style="text-align: center;line-height: 2.5em;font-size: 12px;" v-text="lang[langType].copyright"></div>
  338. </van-form>
  339. </div>
  340. </template>
  341. <script setup>
  342. // import { onMounted, reactive } from "vue";
  343. import { ref, reactive, onBeforeUpdate, computed } from 'vue';
  344. import { showToast } from 'vant';
  345. import axios from 'axios';
  346. import config from '@/config/index.js';
  347. import soundbyteJpg from '../../assets/img/2025lameifenghui.png';
  348. import { saveData } from '@/api/2025.js';
  349. import langpkg from './lang.js';
  350. let arrivalTime = []
  351. const dateTimeColumns = computed(() => {
  352. const now = new Date();
  353. const years = Array.from({ length: Number(now.getFullYear()) + 1 - 1970 }, (_, i) => {
  354. const t = 1970 + i + ''
  355. return {
  356. text: t,
  357. value: t
  358. }
  359. }).reverse();
  360. const months = Array.from({ length: 12 }, (_, i) => {
  361. const m = (i + 1).toString().padStart(2, '0')
  362. return {
  363. text: m,
  364. value: m
  365. }
  366. });
  367. // 动态计算当前选中年月对应的天数
  368. const daysInMonth = new Date(
  369. parseInt(arrivalTime[0] || '0'),
  370. parseInt(arrivalTime[1] || '0'),
  371. 0
  372. ).getDate();
  373. const days = Array.from({ length: daysInMonth }, (_, i) => {
  374. const d = (i + 1).toString().padStart(2, '0')
  375. return {
  376. text: d,
  377. value: d
  378. }
  379. });
  380. const hours = Array.from({ length: 24 }, (_, i) => {
  381. const h = i.toString().padStart(2, '0')
  382. return {
  383. text: h,
  384. value: h
  385. }
  386. });
  387. const minutes = Array.from({ length: 60 }, (_, i) => {
  388. const m = i.toString().padStart(2, '0')
  389. return {
  390. text: m,
  391. value: m
  392. }
  393. });
  394. const seconds = Array.from({ length: 60 }, (_, i) => {
  395. const s = i.toString().padStart(2, '0')
  396. return {
  397. text: s,
  398. value: s
  399. }
  400. });
  401. return [years, months, days, hours, minutes, seconds];
  402. });
  403. /** const langObj = [
  404. { text: '中文', value: 'zh' },
  405. { text: 'English', value: 'en' },
  406. ]
  407. const langObjT = {
  408. zh: '中文',
  409. en: 'English',
  410. } */
  411. // import en from './en.json';
  412. /**
  413. * window.$originData.orginParames.title 页面标题
  414. * window.$originData.orginParames.parameters 固定参数值
  415. * window.$originData.urlParames url参数
  416. */
  417. const lang = ref(langpkg);
  418. const langType = ref(localStorage.getItem('langType') || 'zh');
  419. // const showLange = ref(false);
  420. const showCardType = ref(false);
  421. const showArrivalTime = ref(false);
  422. const showTransferTime = ref(false);
  423. const showReachTime = ref(false);
  424. const showLeavingTime = ref(false);
  425. const showBirthday = ref(false);
  426. const showCheckInTime = ref(false);
  427. const showCheckOutTime = ref(false);
  428. // 展示表单
  429. const showForm = ref(false);
  430. const cardTypeList = ref([
  431. { text: '身份证', value: '身份证' },
  432. { text: '护照', value: '护照' },
  433. { text: '港澳居民通行证', value: '港澳居民通行证' },
  434. { text: '台湾居民通行证', value: '台湾居民通行证' },
  435. ])
  436. const photo = ref([])
  437. const isFile = () => {
  438. return photo.value && photo.value.length;
  439. };
  440. // const langChange = ({ selectedValues }) => {
  441. // langType.value = selectedValues[0];
  442. // localStorage.setItem('langType', selectedValues[0]);
  443. // showLange.value = false;
  444. // };
  445. const from = reactive({
  446. name: '',
  447. idCard: '',
  448. career: '',
  449. contact: '',
  450. photoUrl: [],
  451. cardType: [],
  452. photo: [],
  453. birthday: '',
  454. message: '',
  455. arrivalTime: ''
  456. });
  457. onBeforeUpdate(() => { });
  458. // getJoinType().then((res) => {
  459. // cardTypeList.value = res.map((item) => {
  460. // return {
  461. // text: item.dictLabel,
  462. // value: item.dictValue,
  463. // }
  464. // })
  465. // })
  466. const filesize = () => showToast(lang.value[langType.value].fileSize);
  467. const packerConfirm = (values) => {
  468. showBirthday.value = false;
  469. from.birthday = values.selectedValues.join('-');
  470. }
  471. const handleConfirm = ({ selectedValues }) => {
  472. showArrivalTime.value = false;
  473. arrivalTime = selectedValues;
  474. from.arrivalTime = selectedValues.slice(0, 3).join('-') + ' ' + selectedValues.slice(3).join(':');
  475. }
  476. const transferTimeConfirm = ({ selectedValues }) => {
  477. showTransferTime.value = false;
  478. from.transferTime = selectedValues.slice(0, 3).join('-') + ' ' + selectedValues.slice(3).join(':');
  479. }
  480. const reachTimeConfirm = ({ selectedValues }) => {
  481. showReachTime.value = false;
  482. from.reachTime = selectedValues.slice(0, 3).join('-') + ' ' + selectedValues.slice(3).join(':');
  483. }
  484. const leavingTimeConfirm = ({ selectedValues }) => {
  485. showLeavingTime.value = false;
  486. from.leavingTime = selectedValues.slice(0, 3).join('-') + ' ' + selectedValues.slice(3).join(':');
  487. }
  488. const checkInTimeConfirm = ({ selectedValues }) => {
  489. showCheckInTime.value = false;
  490. from.checkInTime = selectedValues.slice(0, 3).join('-') + ' ' + selectedValues.slice(3).join(':');
  491. }
  492. const checkOutTimeConfirm = ({ selectedValues }) => {
  493. showCheckOutTime.value = false;
  494. from.checkOutTime = selectedValues.slice(0, 3).join('-') + ' ' + selectedValues.slice(3).join(':');
  495. }
  496. // 选择证件类型
  497. const onConfirm = ({ selectedValues, selectedOptions }) => {
  498. showCardType.value = false;
  499. from.cardType = selectedValues;
  500. from.cardTypeName = selectedOptions[0].text;
  501. };
  502. const beforeRead = () => {
  503. if (!isFile()) showToast(lang.value[langType.value].changePhono);
  504. const item = photo.value[0]
  505. const oriData = new FormData();
  506. oriData.append('file', item.file);
  507. axios({
  508. method: 'post',
  509. url: config.base.Url2025 + 'dev/file/uploadDynamicReturnUrl',
  510. headers: {
  511. 'Content-Type': 'multipart/form-data',
  512. },
  513. data: oriData,
  514. }).then(res => {
  515. if (res.status !== 200 || res.data.code !== 0) {
  516. showToast(lang.value[langType.value].upFileError);
  517. from.photoUrl = []
  518. return
  519. }
  520. showToast(lang.value[langType.value].upFileSusscess);
  521. from.photoUrl = [{ url: res.data.data }]
  522. photo.value = [
  523. {
  524. url: res.data.data,
  525. file: item.file,
  526. }
  527. ]
  528. })
  529. return false;
  530. };
  531. // 选择权限范围
  532. const onSubmit = () => {
  533. if (!showForm.value) {
  534. showForm.value = true;
  535. return;
  536. }
  537. if (!isFile()) showToast(lang.value[langType.value].selectFile);
  538. saveData({
  539. name: from.name,
  540. photo: from.photoUrl[0].url,
  541. namePinyin: from.pinyin,
  542. gender: from.gender,
  543. phone: from.contact,
  544. email: from.email,
  545. birthday: from.birthday,
  546. workUnit: from.workUnit,
  547. countryRegion: from.CountryOrRegion,
  548. provinceCity: from.provinceCity,
  549. unitType: from.unitType,
  550. jobLevel: from.jobLevel,
  551. title: from.title,
  552. otherTitle: from.otherTitle,
  553. chineseName: from.chineseName,
  554. idCard: from.idCard,
  555. passportNumber: from.passport,
  556. religion: from.belief,
  557. diplomaticRank: from.diplomaticRank,
  558. majorAchievements: from.mainAchievements,
  559. position: from.career,
  560. telephone: from.fixedLine,
  561. fax: from.fax,
  562. officeAddress: from.officeAddress,
  563. dietaryRequirements: from.catering,
  564. allergen: from.allergies,
  565. emergencyContact: from.emergencyContact,
  566. emergencyContactPhone: from.emergencyContactPhone,
  567. interviewIntention: from.interview,
  568. mediaCategory: from.media,
  569. arrivalFlightChina: from.flight,
  570. arrivalLocationChina: from.arrivalLocation,
  571. arrivalTimeChina: from.arrivalTime,
  572. transferMode: from.transfer,
  573. transferTime: from.transferTime,
  574. arrivalModeXian: from.reach,
  575. arrivalNumberXian: from.reachTrainNumber,
  576. arrivalLocationXian: from.reachLocation,
  577. arrivalTimeXian: from.reachTime,
  578. pickupLocation: from.pickUpLocation,
  579. departureMode: from.leavingTransportationMode,
  580. departureNumber: from.leavingTrainNumber,
  581. departureLocation: from.leavingLocation,
  582. departureTime: from.leavingTime,
  583. checkInTime: from.checkInTime,
  584. checkOutTime: from.checkOutTime,
  585. remarks: from.message,
  586. cardType: from.cardType,
  587. }).then(() => {
  588. showToast(lang.value[langType.value].registration);
  589. // 清空表单内容 from
  590. Object.keys(from).forEach((key) => {
  591. from[key] = '';
  592. });
  593. }).catch(() => {
  594. showToast(lang.value[langType.value].registrationError);
  595. });
  596. };
  597. </script>
  598. <style lang="scss">
  599. .fenghui {
  600. overflow-x: hidden;
  601. width: 100vw;
  602. max-width: 750px;
  603. margin: 0 auto;
  604. min-height: 100vh;
  605. // background: linear-gradient(270deg, #1C4DD6 0%, #1D18BC 100%);
  606. font-weight: 400;
  607. position: relative;
  608. font-family: Source Han Serif CN !important;
  609. .swith {
  610. position: absolute;
  611. right: 10px;
  612. top: 10px;
  613. z-index: 999;
  614. color: #fff;
  615. .title {
  616. cursor: pointer;
  617. }
  618. }
  619. input {
  620. text-align: right;
  621. }
  622. .text {
  623. padding: 8px 8px 0 8px;
  624. text-align: justify;
  625. line-height: 1.8em;
  626. font-size: 16px;
  627. color: #3D3D3D;
  628. }
  629. .label {
  630. width: 5em;
  631. }
  632. h4 {
  633. color: #031280 !important;
  634. }
  635. .introduce {
  636. background-color: #FAFAFA;
  637. padding-bottom: 10px;
  638. overflow: hidden;
  639. }
  640. .van-hairline--bottom:after {
  641. border-bottom-width: 0px;
  642. }
  643. .van-button__text {
  644. font-size: 15px;
  645. font-weight: 400;
  646. color: #031280;
  647. }
  648. .icon {
  649. position: absolute;
  650. right: 10px;
  651. top: 50%;
  652. transform: translateY(-50%);
  653. }
  654. .btn_bottom {
  655. color: #ffffff;
  656. text-align: center;
  657. background: linear-gradient(270deg, #1D19BC 0%, #1C4CD5 100%);
  658. width: calc(100% - 80px);
  659. margin: 0 auto;
  660. .van-button__text {
  661. color: #ffffff;
  662. }
  663. }
  664. .submit {
  665. .title {
  666. padding: 0 16px;
  667. }
  668. .van-cell-group,
  669. .van-cell {
  670. margin: 0%;
  671. }
  672. .van-field__body input {
  673. &::placeholder,
  674. &::-webkit-input-placeholder,
  675. &:-moz-placeholder,
  676. &::-moz-placeholder,
  677. &:-ms-input-placeholder {
  678. color: rgba(255, 255, 255, 0.6);
  679. }
  680. }
  681. }
  682. }
  683. </style>