市场夺宝奇兵
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.
 
 

580 lines
27 KiB

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<link rel="shortcut icon" href="dbqb_favicon.ico" />
<link rel="Bookmark" href="dbqb_favicon.ico" />
<meta http-equiv="keywords" content="夺宝奇兵,homilychart,homilylink,DeepChart">
<meta http-equiv="description" content="HomilyLink">
<title>夺宝奇兵免费体验</title>
<script src="https://cdn.tailwindcss.com?v=3.3.5"></script>
<link href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" rel="stylesheet">
<script>
tailwind.config = {
theme: {
extend: {
colors: {
primary: '#3B82F6',
secondary: '#8B5CF6'
}
}
}
}
</script>
<style type="text/tailwindcss">
@layer utilities {
.card-hover {
@apply transition-all duration-300 hover:shadow-xl;
}
.btn-effect {
@apply relative overflow-hidden transition-all duration-300;
}
.btn-effect::after {
content: '';
@apply absolute top-0 left-[-100%] w-full h-full bg-white/20 transform skew-x-12 transition-all duration-500;
}
.btn-effect:hover::after {
@apply left-[100%];
}
.input-focus {
@apply focus:border-primary focus:ring-2 focus:ring-primary/20 focus:outline-none;
}
.form-icon-container {
@apply absolute inset-y-0 left-0 flex items-center pl-3.5 pointer-events-none z-10;
}
.form-icon {
@apply text-gray-500 text-base;
}
.form-group {
@apply mb-5 relative;
}
.form-label {
@apply block text-gray-700 font-medium mb-2;
}
.form-control {
@apply w-full pl-10 py-3 border border-gray-300 rounded-lg input-focus transition-colors;
height: 54px;
}
.form-select {
@apply form-control pr-8 appearance-none bg-white;
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>');
background-repeat: no-repeat;
background-position: right 0.5rem center;
background-size: 1em;
}
}
</style>
<style>
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.fade-in {
animation: fadeIn 0.5s ease-out forwards;
}
.delay-100 {
animation-delay: 0.1s;
}
.delay-200 {
animation-delay: 0.2s;
}
.delay-300 {
animation-delay: 0.3s;
}
input.form-control,
select.form-select {
box-sizing: border-box;
vertical-align: middle;
}
select.form-select {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}
.loading-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.6);
display: flex;
align-items: center;
justify-content: center;
z-index: 9999;
flex-direction: column;
}
.spinner {
width: 50px;
height: 50px;
border: 4px solid #f3f3f3;
border-top: 4px solid #3B82F6;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.loading-text {
color: white;
margin-top: 15px;
font-size: 16px;
}
button:disabled {
cursor: not-allowed;
}
</style>
</head>
<body class="bg-gray-50 text-gray-800 font-sans">
<header class="fixed top-0 left-0 right-0 bg-white/95 shadow-sm z-50">
<div class="container mx-auto px-4 py-4 flex justify-between items-center">
<div class="flex items-center space-x-2">
<div
class="w-10 h-10 rounded-lg bg-gradient-to-r from-primary to-secondary flex items-center justify-center">
<img alt="夺宝奇兵" src="https://hc.homilychart.com/hc/250121/img/20230711171637.png"
style="width: 40px;height: 40px;">
</div>
<span
class="text-xl font-bold bg-clip-text text-transparent bg-gradient-to-r from-primary to-secondary">夺宝奇兵免费体验</span>
</div>
<nav class="hidden md:flex items-center space-x-8">
<a href="hkhcdbqb.html" class="hover:text-primary transition-colors">首页</a>
<a href="hkhcdbqbDownload.html" class="hover:text-primary transition-colors">下载中心</a>
<a href="hkhcdbqbGuide.html" class="text-primary font-medium">操作指南</a>
<a href="https://wa.me/85269518757?text=我要了解夺宝奇兵" target="_blank"
class="px-5 py-2 rounded-full bg-gradient-to-r from-primary to-secondary text-white hover:shadow-lg transition-all">联系我们</a>
</nav>
<button id="mobileMenuBtn" class="md:hidden text-xl">
<i class="fa fa-bars"></i>
</button>
</div>
<div id="mobileMenu" class="md:hidden hidden bg-white border-t">
<div class="container mx-auto px-4 py-3 flex flex-col space-y-3">
<a href="hkhcdbqb.html" class="py-2 hover:text-primary transition-colors">首页</a>
<a href="hkhcdbqbDownload.html" class="py-2 hover:text-primary transition-colors">下载中心</a>
<a href="hkhcdbqbGuide.html" class="py-2 text-primary">操作指南</a>
<a href="https://wa.me/85269518757?text=我要了解夺宝奇兵" target="_blank"
class="py-2 mt-2 rounded-full bg-gradient-to-r from-primary to-secondary text-white text-center">联系我们</a>
</div>
</div>
</header>
<main class="pt-28 pb-16 px-4">
<div class="container mx-auto max-w-6xl">
<div class="text-center mb-12 fade-in">
<h1 class="text-[clamp(1.8rem,4vw,2.5rem)] font-bold mb-4">夺宝奇兵+内部班级课程<br />免费体验</h1>
<p class="text-gray-600 max-w-2xl mx-auto">AD粉报名即可获得体验的机会!<br />超级云脑 夺宝利剑 AI预测大模型</p>
</div>
<div class="grid grid-cols-1 lg:grid-cols-5 gap-8 max-w-5xl mx-auto">
<div class="lg:col-span-3 fade-in delay-100">
<div class="bg-white rounded-xl shadow-md p-6 md:p-8 card-hover">
<!-- 保持原有 action 和 method,但用 JS 拦截处理 -->
<form id="registrationForm" action="./hkRegisterTip.html" method="post">
<div class="form-group">
<label class="form-label">姓名 <span class="text-red-500">*</span></label>
<div class="relative">
<div class="form-icon-container">
<i class="form-icon fa fa-user"></i>
</div>
<input type="text" id="unameinfo" name="unameinfo" class="form-control"
autocomplete="off" placeholder="请输入您的姓名">
</div>
<div id="nameError" class="text-red-500 text-sm mt-1" style="display: none;">请输入您的姓名
</div>
</div>
<div class="form-group">
<label class="form-label">手机号码 <span class="text-red-500">*</span></label>
<input type="hidden" name="zbtype" id="zbtype" value="2">
<div class="flex gap-3">
<div class="w-30 relative">
<div class="form-icon-container">
<i class="form-icon fa fa-globe"></i>
</div>
<select name="countryinfo" id="countryinfo" class="form-select">
<option value="+65">+65 新加坡</option>
<option value="+60">+60 马来西亚</option>
<option value="+852">+852 香港</option>
<option value="+1" selected="selected">+1 美国</option>
<option value="+62">+62 印尼</option>
<option value="+61">+61 澳大利亚</option>
<option value="+673">+673 文莱</option>
<option value="+886">+886 台湾</option>
<option value="+86">+86 中国</option>
<option value="+0">+0 其他</option>
<option value="+64">+64 新西兰</option>
<option value="+44">+44 英国</option>
<option value="+81">+81 日本</option>
<option value="+49">+49 德国</option>
<option value="+82">+82 韩国</option>
<option value="+84">+84 越南</option>
<option value="+971">+971 阿联酋</option>
<option value="+45">+45 丹麦</option>
<option value="+853">+853 澳门</option>
<option value="+66">+66 泰国</option>
<option value="+91">+91 印度</option>
<option value="+41">+41 瑞士</option>
<option value="+358">+358 芬兰</option>
<option value="+33">+33 法国</option>
<option value="+63">+63 菲律宾</option>
<option value="+31">+31 荷兰</option>
<option value="+46">+46 瑞典</option>
<option value="+34">+34 西班牙</option>
<option value="+54">+54 阿根廷</option>
<option value="+39">+39 意大利</option>
<option value="+7">+7 俄罗斯</option>
<option value="+420">+420 捷克</option>
</select>
</div>
<div class="flex-1 relative">
<div class="form-icon-container">
<i class="form-icon fa fa-whatsapp"></i>
</div>
<input type="tel" id="umoblie" name="umoblie" class="form-control"
onkeyup="value=value.replace(/[^\d]/g,'').replace(/^0/g,'')"
autocomplete="off" placeholder="不带国家编号的纯机号">
</div>
</div>
<div id="phoneError" class="text-red-500 text-sm mt-1" style="display: none;">
请输入正确的手机号(纯手机号,不含国家编号)</div>
</div>
<div class="form-group">
<label class="form-label">微信ID</label>
<div class="relative">
<div class="form-icon-container">
<i class="form-icon fa fa-weixin"></i>
</div>
<input type="text" id="uwechat" name="uwechat" class="form-control"
placeholder="微信ID(如没有WhatsApp)" autocomplete="off">
</div>
</div>
<div class="form-group mb-6">
<label class="form-label">邮箱地址 <span class="text-red-500">*</span></label>
<div class="relative">
<div class="form-icon-container">
<i class="form-icon fa fa-envelope"></i>
</div>
<input type="email" id="uemail" name="uemail" class="form-control"
autocomplete="off" placeholder="请输入您的邮箱地址">
</div>
<div id="emailError" class="text-red-500 text-sm mt-1" style="display: none;">
请输入您的有效邮箱地址</div>
</div>
<button type="submit" id="submitBtn"
class="btn-effect w-full py-3 rounded-lg bg-gradient-to-r from-primary to-secondary text-white font-medium text-lg">
<i class="fa fa-check-circle mr-2"></i>提交注册
</button>
<p class="text-center text-gray-500 text-sm mt-4">
如需帮助?<a href="https://wa.me/85269518757?text=我要体验DEEPCHART" target="_blank"
class="text-primary hover:underline">点击发WhatsApp</a>
</p>
</form>
</div>
</div>
<div class="lg:col-span-2 fade-in delay-200">
<div class="bg-white rounded-xl shadow-md p-6 md:p-8 h-full card-hover">
<h3 class="text-xl font-bold mb-5 flex items-center">
<i class="fa fa-info-circle text-primary mr-2"></i>注册说明
</h3>
<div class="space-y-4 text-gray-600">
<div class="flex">
<div
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">
<i class="fa fa-user"></i>
</div>
<p>请填写方便称呼您的姓名信息。</p>
</div>
<div class="flex">
<div
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">
<i class="fa fa-whatsapp"></i>
</div>
<p>手机号码最好支持WhatsApp联系。</p>
</div>
<div class="flex">
<div
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">
<i class="fa fa-weixin"></i>
</div>
<p>微信的联系方式我们也支持。</p>
</div>
<div class="flex">
<div
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">
<i class="fa fa-envelope"></i>
</div>
<p>邮箱作为联系您的备用联系方式。</p>
</div>
<div class="mt-6 pt-5 border-t border-gray-100">
<h4 class="font-semibold mb-3 text-gray-700">温馨提示</h4>
<p class="text-sm">
AD粉可以进入HomilyLink内部班级群<br />免费学习。<br />免费体验包括:夺宝奇兵三大模板<br />铁粉可以体验部分DeepChart功能!</p>
</div>
<div class="mt-6 pt-5 border-t border-gray-100">
<h4 class="font-semibold mb-3 text-gray-700">郑重声明</h4>
<p class="text-sm">我们将严格保护您的个人信息安全,绝对不会向第三方泄露。</p>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<footer class="bg-gray-900 text-white py-10 px-4 mt-16">
<div class="container mx-auto max-w-6xl text-center">
<div class="mb-6">
<div class="inline-flex items-center space-x-2">
<div class="w-10 h-10 rounded-lg gradient-bg flex items-center justify-center">
<img alt="夺宝奇兵" src="https://hc.homilychart.com/hc/250121/img/20230711171637.png"
style="width: 40px;height: 40px;">
</div>
<span class="font-bold">夺宝奇兵免费体验</span>
</div>
</div>
<p class="text-gray-400 text-sm mb-4">Copyright 2026.Capitalmaster Pte Ltd All Rights Reserved.</p>
</div>
</footer>
<script type="module">
import { registerMemberApi } from './src/api/hkmember.js';
const form = document.getElementById('registrationForm');
const submitBtn = document.getElementById('submitBtn');
const nameError = document.getElementById('nameError');
const phoneError = document.getElementById('phoneError');
const emailError = document.getElementById('emailError');
// ========== 清理残留loading ==========
function cleanupLoading() {
const existingOverlay = document.getElementById('loadingOverlay');
if (existingOverlay) existingOverlay.remove();
if (submitBtn) {
submitBtn.disabled = false;
submitBtn.style.opacity = '1';
submitBtn.innerHTML = '<i class="fa fa-check-circle mr-2"></i>提交注册';
}
sessionStorage.removeItem('isSubmitting');
}
function hideAllErrors() {
if (nameError) nameError.style.display = 'none';
if (phoneError) phoneError.style.display = 'none';
if (emailError) emailError.style.display = 'none';
}
function showError(element) {
if (element) element.style.display = 'block';
}
function isValidEmail(email) {
if (!email || email.trim() === '') return false;
const emailRegex = /^[^\s@]+@([^\s@]+\.)+[^\s@]+$/;
if (!emailRegex.test(email)) return false;
if (email.length > 254) return false;
if (email.includes('..')) return false;
return true;
}
function isValidPhone(phone) {
if (!phone || phone.trim() === '') return false;
const digitsOnly = phone.replace(/[^\d]/g, '');
if (digitsOnly.length < 4 || digitsOnly.length > 20) return false;
return true;
}
function cleanPhoneNumber(phone) {
if (!phone) return '';
let cleaned = phone.replace(/[^\d]/g, '');
cleaned = cleaned.replace(/^(00)/, '');
return cleaned;
}
function showLoading() {
if (document.getElementById('loadingOverlay')) return;
const loadingDiv = document.createElement('div');
loadingDiv.id = 'loadingOverlay';
loadingDiv.className = 'loading-overlay';
loadingDiv.innerHTML = '<div class="spinner"></div><div class="loading-text">正在提交注册信息...</div>';
document.body.appendChild(loadingDiv);
if (submitBtn) {
submitBtn.disabled = true;
submitBtn.style.opacity = '0.6';
submitBtn.innerHTML = '<i class="fa fa-spinner fa-spin mr-2"></i>提交中...';
}
sessionStorage.setItem('isSubmitting', 'true');
}
function hideLoading() {
const loadingDiv = document.getElementById('loadingOverlay');
if (loadingDiv) loadingDiv.remove();
if (submitBtn) {
submitBtn.disabled = false;
submitBtn.style.opacity = '1';
submitBtn.innerHTML = '<i class="fa fa-check-circle mr-2"></i>提交注册';
}
sessionStorage.removeItem('isSubmitting');
}
let isSubmitting = false;
// 表单提交 - 先调API,成功后继续表单提交(保持原有跳转)
form.addEventListener('submit', async function (e) {
// 先进行前端校验
hideAllErrors();
const name = document.getElementById('unameinfo').value.trim();
const countryCode = document.getElementById('countryinfo').value;
const phoneRaw = document.getElementById('umoblie').value.trim();
const wechat = document.getElementById('uwechat').value.trim();
const email = document.getElementById('uemail').value.trim();
let isValid = true;
if (!name) {
showError(nameError);
isValid = false;
}
if (!phoneRaw || !isValidPhone(phoneRaw)) {
showError(phoneError);
isValid = false;
}
if (!email || !isValidEmail(email)) {
showError(emailError);
isValid = false;
}
if (!isValid) {
e.preventDefault();
return;
}
// 防止重复提交
if (isSubmitting) {
e.preventDefault();
return;
}
e.preventDefault();
isSubmitting = true;
const cleanedPhone = cleanPhoneNumber(phoneRaw);
const requestData = {
name: name,
code: countryCode,
tel: cleanedPhone,
email: email
};
if (wechat) {
requestData.weChat = wechat;
}
showLoading();
try {
const result = await registerMemberApi(requestData);
if (result.code === 200) {
// API调用成功,继续原有的表单提交(POST到hkRegisterTip.html)
hideLoading();
// 重新提交表单(不再拦截)
isSubmitting = false;
form.submit();
} else {
hideLoading();
isSubmitting = false;
alert('注册失败:' + (result.msg || '未知错误,请稍后重试'));
}
} catch (error) {
console.error('提交注册出错:', error);
hideLoading();
isSubmitting = false;
alert('网络错误或接口异常,请稍后重试');
}
});
// 移动端菜单切换
document.getElementById('mobileMenuBtn').addEventListener('click', function () {
const menu = document.getElementById('mobileMenu');
menu.classList.toggle('hidden');
const icon = this.querySelector('i');
if (icon.classList.contains('fa-bars')) {
icon.classList.replace('fa-bars', 'fa-times');
} else {
icon.classList.replace('fa-times', 'fa-bars');
}
});
// 页面加载动画 + 清理残留loading
document.addEventListener('DOMContentLoaded', function () {
document.querySelectorAll('.fade-in').forEach(el => {
el.style.opacity = '1';
});
cleanupLoading();
});
// 处理浏览器后退/前进时的残留loading
window.addEventListener('pageshow', function (event) {
if (event.persisted) {
cleanupLoading();
}
});
window.addEventListener('popstate', function () {
cleanupLoading();
});
// 实时验证
document.getElementById('unameinfo')?.addEventListener('blur', function () {
if (this.value.trim()) nameError.style.display = 'none';
});
document.getElementById('umoblie')?.addEventListener('blur', function () {
if (this.value.trim() && isValidPhone(this.value.trim())) phoneError.style.display = 'none';
});
document.getElementById('uemail')?.addEventListener('blur', function () {
if (this.value.trim() && isValidEmail(this.value.trim())) emailError.style.display = 'none';
});
</script>
</body>
</html>