市场夺宝奇兵
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

623 lines
28 KiB

10 hours ago
10 hours ago
11 hours ago
11 hours ago
10 hours ago
10 hours ago
10 hours ago
10 hours ago
10 hours ago
10 hours ago
10 hours ago
11 hours ago
10 hours ago
10 hours ago
11 hours ago
11 hours ago
11 hours ago
11 hours ago
10 hours ago
11 hours ago
11 hours ago
11 hours ago
11 hours ago
11 hours ago
11 hours ago
10 hours ago
10 hours ago
10 hours ago
10 hours ago
10 hours ago
10 hours ago
10 hours ago
10 hours ago
10 hours ago
11 hours ago
10 hours ago
10 hours ago
10 hours ago
10 hours ago
11 hours ago
10 hours ago
10 hours ago
11 hours ago
10 hours ago
11 hours ago
10 hours ago
11 hours ago
10 hours ago
10 hours ago
10 hours ago
11 hours ago
10 hours ago
11 hours ago
10 hours ago
11 hours ago
10 hours ago
11 hours ago
10 hours ago
11 hours ago
10 hours ago
10 hours ago
10 hours ago
11 hours ago
11 hours ago
11 hours ago
10 hours ago
10 hours ago
10 hours ago
10 hours ago
10 hours ago
11 hours ago
10 hours ago
10 hours ago
10 hours ago
11 hours ago
11 hours ago
10 hours ago
10 hours ago
10 hours ago
11 hours ago
10 hours ago
11 hours ago
10 hours ago
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <meta http-equiv="pragma" content="no-cache">
  8. <meta http-equiv="cache-control" content="no-cache">
  9. <meta http-equiv="expires" content="0">
  10. <link rel="shortcut icon" href="dbqb_favicon.ico" />
  11. <link rel="Bookmark" href="dbqb_favicon.ico" />
  12. <meta http-equiv="keywords" content="夺宝奇兵,homilychart,homilylink,DeepChart">
  13. <meta http-equiv="description" content="HomilyLink">
  14. <title>夺宝奇兵免费体验</title>
  15. <!-- 引入外部资源 -->
  16. <script src="https://cdn.tailwindcss.com?v=3.3.5"></script>
  17. <link href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" rel="stylesheet">
  18. <!-- 基础样式配置 -->
  19. <script>
  20. tailwind.config = {
  21. theme: {
  22. extend: {
  23. colors: {
  24. primary: '#3B82F6',
  25. secondary: '#8B5CF6'
  26. }
  27. }
  28. }
  29. }
  30. </script>
  31. <style type="text/tailwindcss">
  32. @layer utilities {
  33. .card-hover {
  34. @apply transition-all duration-300 hover:shadow-xl;
  35. }
  36. .btn-effect {
  37. @apply relative overflow-hidden transition-all duration-300;
  38. }
  39. .btn-effect::after {
  40. content: '';
  41. @apply absolute top-0 left-[-100%] w-full h-full bg-white/20 transform skew-x-12 transition-all duration-500;
  42. }
  43. .btn-effect:hover::after {
  44. @apply left-[100%];
  45. }
  46. .input-focus {
  47. @apply focus:border-primary focus:ring-2 focus:ring-primary/20 focus:outline-none;
  48. }
  49. .form-icon-container {
  50. @apply absolute inset-y-0 left-0 flex items-center pl-3.5 pointer-events-none z-10;
  51. }
  52. .form-icon {
  53. @apply text-gray-500 text-base;
  54. }
  55. .form-group {
  56. @apply mb-5 relative;
  57. }
  58. .form-label {
  59. @apply block text-gray-700 font-medium mb-2;
  60. }
  61. .form-control {
  62. @apply w-full pl-10 py-3 border border-gray-300 rounded-lg input-focus transition-colors;
  63. height: 54px;
  64. }
  65. .form-select {
  66. @apply form-control pr-8 appearance-none bg-white;
  67. background-image: url('data:image/svg+xml;charset=US-ASCII,<svg width=\"20\" height=\"20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z\" fill=\"%23333\"/></svg>');
  68. background-repeat: no-repeat;
  69. background-position: right 0.5rem center;
  70. background-size: 1em;
  71. }
  72. }
  73. </style>
  74. <style>
  75. @keyframes fadeIn {
  76. from {
  77. opacity: 0;
  78. transform: translateY(10px);
  79. }
  80. to {
  81. opacity: 1;
  82. transform: translateY(0);
  83. }
  84. }
  85. .fade-in {
  86. animation: fadeIn 0.5s ease-out forwards;
  87. }
  88. .delay-100 {
  89. animation-delay: 0.1s;
  90. }
  91. .delay-200 {
  92. animation-delay: 0.2s;
  93. }
  94. .delay-300 {
  95. animation-delay: 0.3s;
  96. }
  97. input.form-control,
  98. select.form-select {
  99. box-sizing: border-box;
  100. vertical-align: middle;
  101. }
  102. select.form-select {
  103. -webkit-appearance: none;
  104. -moz-appearance: none;
  105. appearance: none;
  106. }
  107. .loading-overlay {
  108. position: fixed;
  109. top: 0;
  110. left: 0;
  111. right: 0;
  112. bottom: 0;
  113. background: rgba(0, 0, 0, 0.6);
  114. display: flex;
  115. align-items: center;
  116. justify-content: center;
  117. z-index: 9999;
  118. flex-direction: column;
  119. }
  120. .spinner {
  121. width: 50px;
  122. height: 50px;
  123. border: 4px solid #f3f3f3;
  124. border-top: 4px solid #3B82F6;
  125. border-radius: 50%;
  126. animation: spin 1s linear infinite;
  127. }
  128. @keyframes spin {
  129. 0% {
  130. transform: rotate(0deg);
  131. }
  132. 100% {
  133. transform: rotate(360deg);
  134. }
  135. }
  136. .loading-text {
  137. color: white;
  138. margin-top: 15px;
  139. font-size: 16px;
  140. }
  141. </style>
  142. </head>
  143. <body class="bg-gray-50 text-gray-800 font-sans">
  144. <!-- 导航栏 -->
  145. <header class="fixed top-0 left-0 right-0 bg-white/95 shadow-sm z-50">
  146. <div class="container mx-auto px-4 py-4 flex justify-between items-center">
  147. <div class="flex items-center space-x-2">
  148. <div
  149. class="w-10 h-10 rounded-lg bg-gradient-to-r from-primary to-secondary flex items-center justify-center">
  150. <img alt="夺宝奇兵" src="https://hc.homilychart.com/hc/250121/img/20230711171637.png"
  151. style="width: 40px;height: 40px;">
  152. </div>
  153. <span
  154. class="text-xl font-bold bg-clip-text text-transparent bg-gradient-to-r from-primary to-secondary">夺宝奇兵免费体验</span>
  155. </div>
  156. <nav class="hidden md:flex items-center space-x-8">
  157. <a href="hkhcdbqb.html" class="hover:text-primary transition-colors">首页</a>
  158. <a href="hkhcdbqbDownload.html" class="hover:text-primary transition-colors">下载中心</a>
  159. <a href="hkhcdbqbGuide.html" class="text-primary font-medium">操作指南</a>
  160. <a href="https://wa.me/85269518757?text=我要了解夺宝奇兵" target="_blank"
  161. class="px-5 py-2 rounded-full bg-gradient-to-r from-primary to-secondary text-white hover:shadow-lg transition-all">联系我们</a>
  162. </nav>
  163. <button id="mobileMenuBtn" class="md:hidden text-xl">
  164. <i class="fa fa-bars"></i>
  165. </button>
  166. </div>
  167. <div id="mobileMenu" class="md:hidden hidden bg-white border-t">
  168. <div class="container mx-auto px-4 py-3 flex flex-col space-y-3">
  169. <a href="hkhcdbqb.html" class="py-2 hover:text-primary transition-colors">首页</a>
  170. <a href="hkhcdbqbDownload.html" class="py-2 hover:text-primary transition-colors">下载中心</a>
  171. <a href="hkhcdbqbGuide.html" class="py-2 text-primary">操作指南</a>
  172. <a href="https://wa.me/85269518757?text=我要了解夺宝奇兵" target="_blank"
  173. class="py-2 mt-2 rounded-full bg-gradient-to-r from-primary to-secondary text-white text-center">联系我们</a>
  174. </div>
  175. </div>
  176. </header>
  177. <!-- 主要内容 -->
  178. <main class="pt-28 pb-16 px-4">
  179. <div class="container mx-auto max-w-6xl">
  180. <div class="text-center mb-12 fade-in">
  181. <h1 class="text-[clamp(1.8rem,4vw,2.5rem)] font-bold mb-4">夺宝奇兵+内部班级课程<br />免费体验</h1>
  182. <p class="text-gray-600 max-w-2xl mx-auto">AD粉报名即可获得体验的机会!<br />超级云脑 夺宝利剑 AI预测大模型</p>
  183. </div>
  184. <div class="grid grid-cols-1 lg:grid-cols-5 gap-8 max-w-5xl mx-auto">
  185. <!-- 注册表单 -->
  186. <div class="lg:col-span-3 fade-in delay-100">
  187. <div class="bg-white rounded-xl shadow-md p-6 md:p-8 card-hover">
  188. <!-- 注意:移除了 action 和 method,由JS处理 -->
  189. <form id="registrationForm">
  190. <div class="form-group">
  191. <label class="form-label">姓名 <span class="text-red-500">*</span></label>
  192. <div class="relative">
  193. <div class="form-icon-container">
  194. <i class="form-icon fa fa-user"></i>
  195. </div>
  196. <input type="text" id="unameinfo" name="unameinfo" class="form-control"
  197. autocomplete="off" placeholder="请输入您的姓名">
  198. </div>
  199. <div id="nameError" class="text-red-500 text-sm mt-1" style="display: none;">请输入您的姓名
  200. </div>
  201. </div>
  202. <div class="form-group">
  203. <label class="form-label">手机号码 <span class="text-red-500">*</span></label>
  204. <input type="hidden" name="zbtype" id="zbtype" value="2">
  205. <div class="flex gap-3">
  206. <div class="w-30 relative">
  207. <div class="form-icon-container">
  208. <i class="form-icon fa fa-globe"></i>
  209. </div>
  210. <select name="countryinfo" id="countryinfo" class="form-select">
  211. <option value="+65">+65 新加坡</option>
  212. <option value="+60">+60 马来西亚</option>
  213. <option value="+852">+852 香港</option>
  214. <option value="+1" selected="selected">+1 美国</option>
  215. <option value="+62">+62 印尼</option>
  216. <option value="+61">+61 澳大利亚</option>
  217. <option value="+673">+673 文莱</option>
  218. <option value="+886">+886 台湾</option>
  219. <option value="+86">+86 中国</option>
  220. <option value="+0">+0 其他</option>
  221. <option value="+64">+64 新西兰</option>
  222. <option value="+44">+44 英国</option>
  223. <option value="+81">+81 日本</option>
  224. <option value="+49">+49 德国</option>
  225. <option value="+82">+82 韩国</option>
  226. <option value="+84">+84 越南</option>
  227. <option value="+971">+971 阿联酋</option>
  228. <option value="+45">+45 丹麦</option>
  229. <option value="+853">+853 澳门</option>
  230. <option value="+66">+66 泰国</option>
  231. <option value="+91">+91 印度</option>
  232. <option value="+41">+41 瑞士</option>
  233. <option value="+358">+358 芬兰</option>
  234. <option value="+33">+33 法国</option>
  235. <option value="+63">+63 菲律宾</option>
  236. <option value="+31">+31 荷兰</option>
  237. <option value="+46">+46 瑞典</option>
  238. <option value="+34">+34 西班牙</option>
  239. <option value="+54">+54 阿根廷</option>
  240. <option value="+39">+39 意大利</option>
  241. <option value="+7">+7 俄罗斯</option>
  242. <option value="+420">+420 捷克</option>
  243. </select>
  244. </div>
  245. <div class="flex-1 relative">
  246. <div class="form-icon-container">
  247. <i class="form-icon fa fa-whatsapp"></i>
  248. </div>
  249. <input type="tel" id="umoblie" name="umoblie" class="form-control"
  250. onkeyup="value=value.replace(/[^\d]/g,'').replace(/^0/g,'')"
  251. autocomplete="off" placeholder="不带国家编号的纯机号">
  252. </div>
  253. </div>
  254. <div id="phoneError" class="text-red-500 text-sm mt-1" style="display: none;">
  255. 请输入正确的手机号(纯手机号,不含国家编号)</div>
  256. </div>
  257. <div class="form-group">
  258. <label class="form-label">微信ID</label>
  259. <div class="relative">
  260. <div class="form-icon-container">
  261. <i class="form-icon fa fa-weixin"></i>
  262. </div>
  263. <input type="text" id="uwechat" name="uwechat" class="form-control"
  264. placeholder="微信ID(如没有WhatsApp)" autocomplete="off">
  265. </div>
  266. </div>
  267. <div class="form-group mb-6">
  268. <label class="form-label">邮箱地址 <span class="text-red-500">*</span></label>
  269. <div class="relative">
  270. <div class="form-icon-container">
  271. <i class="form-icon fa fa-envelope"></i>
  272. </div>
  273. <input type="email" id="uemail" name="uemail" class="form-control"
  274. autocomplete="off" placeholder="请输入您的邮箱地址">
  275. </div>
  276. <div id="emailError" class="text-red-500 text-sm mt-1" style="display: none;">
  277. 请输入您的有效邮箱地址</div>
  278. </div>
  279. <button type="submit" id="submitBtn"
  280. class="btn-effect w-full py-3 rounded-lg bg-gradient-to-r from-primary to-secondary text-white font-medium text-lg">
  281. <i class="fa fa-check-circle mr-2"></i>提交注册
  282. </button>
  283. <p class="text-center text-gray-500 text-sm mt-4">
  284. 如需帮助?<a href="https://wa.me/85269518757?text=我要体验DEEPCHART" target="_blank"
  285. class="text-primary hover:underline">点击发WhatsApp</a>
  286. </p>
  287. </form>
  288. </div>
  289. </div>
  290. <!-- 注册说明 -->
  291. <div class="lg:col-span-2 fade-in delay-200">
  292. <div class="bg-white rounded-xl shadow-md p-6 md:p-8 h-full card-hover">
  293. <h3 class="text-xl font-bold mb-5 flex items-center">
  294. <i class="fa fa-info-circle text-primary mr-2"></i>注册说明
  295. </h3>
  296. <div class="space-y-4 text-gray-600">
  297. <div class="flex">
  298. <div
  299. class="w-8 h-8 rounded-full bg-primary/10 flex items-center justify-center text-primary flex-shrink-0 mr-3 mt-0.5">
  300. <i class="fa fa-user"></i>
  301. </div>
  302. <p>请填写方便称呼您的姓名信息。</p>
  303. </div>
  304. <div class="flex">
  305. <div
  306. class="w-8 h-8 rounded-full bg-primary/10 flex items-center justify-center text-primary flex-shrink-0 mr-3 mt-0.5">
  307. <i class="fa fa-whatsapp"></i>
  308. </div>
  309. <p>手机号码最好支持WhatsApp联系。</p>
  310. </div>
  311. <div class="flex">
  312. <div
  313. class="w-8 h-8 rounded-full bg-primary/10 flex items-center justify-center text-primary flex-shrink-0 mr-3 mt-0.5">
  314. <i class="fa fa-weixin"></i>
  315. </div>
  316. <p>微信的联系方式我们也支持。</p>
  317. </div>
  318. <div class="flex">
  319. <div
  320. class="w-8 h-8 rounded-full bg-primary/10 flex items-center justify-center text-primary flex-shrink-0 mr-3 mt-0.5">
  321. <i class="fa fa-envelope"></i>
  322. </div>
  323. <p>邮箱作为联系您的备用联系方式。</p>
  324. </div>
  325. <div class="mt-6 pt-5 border-t border-gray-100">
  326. <h4 class="font-semibold mb-3 text-gray-700">温馨提示</h4>
  327. <p class="text-sm">
  328. AD粉可以进入HomilyLink内部班级群<br />免费学习。<br />
  329. 免费体验包括:夺宝奇兵三大模板<br />
  330. 铁粉可以体验部分DeepChart功能!
  331. </p>
  332. </div>
  333. <div class="mt-6 pt-5 border-t border-gray-100">
  334. <h4 class="font-semibold mb-3 text-gray-700">郑重声明</h4>
  335. <p class="text-sm">我们将严格保护您的个人信息安全,绝对不会向第三方泄露。</p>
  336. </div>
  337. </div>
  338. </div>
  339. </div>
  340. </div>
  341. </div>
  342. </main>
  343. <!-- 页脚 -->
  344. <footer class="bg-gray-900 text-white py-10 px-4 mt-16">
  345. <div class="container mx-auto max-w-6xl text-center">
  346. <div class="mb-6">
  347. <div class="inline-flex items-center space-x-2">
  348. <div class="w-10 h-10 rounded-lg gradient-bg flex items-center justify-center">
  349. <img alt="夺宝奇兵" src="https://hc.homilychart.com/hc/250121/img/20230711171637.png"
  350. style="width: 40px;height: 40px;">
  351. </div>
  352. <span class="font-bold">夺宝奇兵免费体验</span>
  353. </div>
  354. </div>
  355. <p class="text-gray-400 text-sm mb-4">Copyright 2026.Capitalmaster Pte Ltd All Rights Reserved.</p>
  356. </div>
  357. </footer>
  358. <!-- 交互脚本 - 使用 type="module" 保留原有API导入 -->
  359. <script type="module">
  360. // 从外部文件导入 registerMemberApi 函数(保持原有方式)
  361. import { registerMemberApi } from './src/api/hkmember.js';
  362. // 获取表单元素
  363. const form = document.getElementById('registrationForm');
  364. const submitBtn = document.getElementById('submitBtn');
  365. // 错误提示元素
  366. const nameError = document.getElementById('nameError');
  367. const phoneError = document.getElementById('phoneError');
  368. const emailError = document.getElementById('emailError');
  369. // 隐藏所有错误提示
  370. function hideAllErrors() {
  371. if (nameError) nameError.style.display = 'none';
  372. if (phoneError) phoneError.style.display = 'none';
  373. if (emailError) emailError.style.display = 'none';
  374. }
  375. // 显示错误
  376. function showError(element) {
  377. if (element) element.style.display = 'block';
  378. }
  379. // 邮箱校验
  380. function isValidEmail(email) {
  381. if (!email || email.trim() === '') return false;
  382. const emailRegex = /^[^\s@]+@([^\s@]+\.)+[^\s@]+$/;
  383. if (!emailRegex.test(email)) return false;
  384. if (email.length > 254) return false;
  385. if (email.includes('..')) return false;
  386. return true;
  387. }
  388. // 手机号校验
  389. function isValidPhone(phone) {
  390. if (!phone || phone.trim() === '') return false;
  391. const digitsOnly = phone.replace(/[^\d]/g, '');
  392. if (digitsOnly.length < 4 || digitsOnly.length > 20) return false;
  393. return true;
  394. }
  395. // 清理手机号
  396. function cleanPhoneNumber(phone) {
  397. if (!phone) return '';
  398. let cleaned = phone.replace(/[^\d]/g, '');
  399. cleaned = cleaned.replace(/^(00)/, '');
  400. return cleaned;
  401. }
  402. // 显示加载状态
  403. function showLoading() {
  404. const loadingDiv = document.createElement('div');
  405. loadingDiv.id = 'loadingOverlay';
  406. loadingDiv.className = 'loading-overlay';
  407. loadingDiv.innerHTML = '<div class="spinner"></div><div class="loading-text">正在提交注册信息...</div>';
  408. document.body.appendChild(loadingDiv);
  409. if (submitBtn) {
  410. submitBtn.disabled = true;
  411. submitBtn.style.opacity = '0.6';
  412. submitBtn.innerHTML = '<i class="fa fa-spinner fa-spin mr-2"></i>提交中...';
  413. }
  414. }
  415. // 隐藏加载状态
  416. function hideLoading() {
  417. const loadingDiv = document.getElementById('loadingOverlay');
  418. if (loadingDiv) loadingDiv.remove();
  419. if (submitBtn) {
  420. submitBtn.disabled = false;
  421. submitBtn.style.opacity = '1';
  422. submitBtn.innerHTML = '<i class="fa fa-check-circle mr-2"></i>提交注册';
  423. }
  424. }
  425. // 使用 GET 方式跳转到提示页面(避免 Nginx 405 错误)
  426. function redirectToSuccessPage(formData) {
  427. const params = new URLSearchParams();
  428. params.set('unameinfo', formData.name);
  429. params.set('countryinfo', formData.countryCode);
  430. params.set('umoblie', formData.phone);
  431. params.set('uemail', formData.email);
  432. if (formData.wechat) params.set('uwechat', formData.wechat);
  433. params.set('zbtype', formData.zbtype);
  434. // GET 方式跳转,不会出现 405 错误
  435. window.location.href = `./hkRegisterTip.html?${params.toString()}`;
  436. }
  437. // 表单提交处理 - 先调用API保存数据,然后GET跳转
  438. form.addEventListener('submit', async function (e) {
  439. // 阻止默认提交
  440. e.preventDefault();
  441. // 前端校验
  442. hideAllErrors();
  443. const name = document.getElementById('unameinfo').value.trim();
  444. const countryCode = document.getElementById('countryinfo').value;
  445. const phoneRaw = document.getElementById('umoblie').value.trim();
  446. const wechat = document.getElementById('uwechat').value.trim();
  447. const email = document.getElementById('uemail').value.trim();
  448. const zbtype = document.getElementById('zbtype').value;
  449. let isValid = true;
  450. if (!name) {
  451. showError(nameError);
  452. isValid = false;
  453. }
  454. if (!phoneRaw || !isValidPhone(phoneRaw)) {
  455. showError(phoneError);
  456. isValid = false;
  457. }
  458. if (!email || !isValidEmail(email)) {
  459. showError(emailError);
  460. isValid = false;
  461. }
  462. if (!isValid) {
  463. return;
  464. }
  465. // 清理手机号
  466. const cleanedPhone = cleanPhoneNumber(phoneRaw);
  467. // 组装请求参数(与原来保持一致)
  468. const requestData = {
  469. name: name,
  470. code: countryCode,
  471. tel: cleanedPhone,
  472. email: email
  473. };
  474. if (wechat) {
  475. requestData.weChat = wechat;
  476. }
  477. // 保存表单数据用于跳转
  478. const formData = {
  479. name: name,
  480. countryCode: countryCode,
  481. phone: cleanedPhone,
  482. wechat: wechat,
  483. email: email,
  484. zbtype: zbtype
  485. };
  486. // 显示加载状态
  487. showLoading();
  488. try {
  489. // 调用原有的 API 接口保存数据
  490. const result = await registerMemberApi(requestData);
  491. if (result.code === 200) {
  492. // API调用成功,GET方式跳转到提示页面
  493. redirectToSuccessPage(formData);
  494. } else {
  495. hideLoading();
  496. alert('注册失败:' + (result.msg || '未知错误,请稍后重试'));
  497. }
  498. } catch (error) {
  499. console.error('提交注册出错:', error);
  500. hideLoading();
  501. // API失败时,询问是否继续(数据未保存到后端)
  502. if (confirm('网络错误,注册失败。请检查网络后重试。\n\n是否返回表单重新提交?')) {
  503. // 用户选择重试,停留在当前页面
  504. return;
  505. }
  506. }
  507. });
  508. // 移动端菜单切换
  509. const mobileMenuBtn = document.getElementById('mobileMenuBtn');
  510. if (mobileMenuBtn) {
  511. mobileMenuBtn.addEventListener('click', function () {
  512. const menu = document.getElementById('mobileMenu');
  513. if (menu) {
  514. menu.classList.toggle('hidden');
  515. const icon = this.querySelector('i');
  516. if (icon.classList.contains('fa-bars')) {
  517. icon.classList.replace('fa-bars', 'fa-times');
  518. } else {
  519. icon.classList.replace('fa-times', 'fa-bars');
  520. }
  521. }
  522. });
  523. }
  524. // 页面加载动画
  525. document.addEventListener('DOMContentLoaded', function () {
  526. document.querySelectorAll('.fade-in').forEach(el => {
  527. el.style.opacity = '1';
  528. });
  529. });
  530. // 输入框实时验证
  531. const nameInput = document.getElementById('unameinfo');
  532. const phoneInput = document.getElementById('umoblie');
  533. const emailInput = document.getElementById('uemail');
  534. if (nameInput) {
  535. nameInput.addEventListener('blur', function () {
  536. if (this.value.trim()) nameError.style.display = 'none';
  537. });
  538. }
  539. if (phoneInput) {
  540. phoneInput.addEventListener('blur', function () {
  541. if (this.value.trim() && isValidPhone(this.value.trim())) phoneError.style.display = 'none';
  542. });
  543. }
  544. if (emailInput) {
  545. emailInput.addEventListener('blur', function () {
  546. if (this.value.trim() && isValidEmail(this.value.trim())) emailError.style.display = 'none';
  547. });
  548. }
  549. </script>
  550. </body>
  551. </html>