登录
注册
开发环境验证码:888888(上线后对接真实短信)
—— 测试快捷登录(正式上线后关闭) ——
function switchTab(tab) { document.querySelectorAll('.tab-item').forEach(t => t.classList.toggle('active', t.dataset.tab === tab)); document.getElementById('loginForm').style.display = tab === 'login' ? 'block' : 'none'; document.getElementById('registerForm').style.display = tab === 'register' ? 'block' : 'none'; document.getElementById('loginErr').textContent = ''; document.getElementById('regErr').textContent = ''; } let smsCountdown = 0; function sendSms() { const phone = document.getElementById('regPhone').value.trim(); if (!/^1[3-9]\d{9}$/.test(phone)) { document.getElementById('regErr').textContent = '请输入正确的手机号'; return; } const btn = document.getElementById('smsBtn'); btn.disabled = true; fetch('/api/member/sms/send', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ phone, purpose: 'register' }) }).then(r => r.json()).then(j => { if (j.ok) { if (j.dev) { document.getElementById('regErr').textContent = ''; document.getElementById('regCode').value = j.devCode; } smsCountdown = 60; const timer = setInterval(() => { smsCountdown--; btn.textContent = smsCountdown + 's后重发'; if (smsCountdown <= 0) { clearInterval(timer); btn.textContent = '获取验证码'; btn.disabled = false; } }, 1000); } else { document.getElementById('regErr').textContent = j.error || '发送失败'; btn.disabled = false; } }).catch(() => { document.getElementById('regErr').textContent = '网络错误,请稍后重试'; btn.disabled = false; }); } function doLogin(e) { e.preventDefault(); const phone = document.getElementById('loginPhone').value.trim(); const password = document.getElementById('loginPassword').value; const btn = document.getElementById('loginBtn'); const err = document.getElementById('loginErr'); btn.disabled = true; btn.textContent = '登录中…'; err.textContent = ''; fetch('/api/member/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ phone, password }) }).then(r => r.json()).then(j => { if (j.token) { localStorage.setItem('zsm_token', j.token); localStorage.setItem('zsm_user', JSON.stringify(j.user)); location.href = '/member/index.html'; } else { err.textContent = j.error || '登录失败'; btn.disabled = false; btn.textContent = '登 录'; } }).catch(() => { err.textContent = '网络错误,请稍后重试'; btn.disabled = false; btn.textContent = '登 录'; }); return false; } function doRegister(e) { e.preventDefault(); const body = { phone: document.getElementById('regPhone').value.trim(), code: document.getElementById('regCode').value.trim(), password: document.getElementById('regPassword').value, name: document.getElementById('regName').value.trim(), company: document.getElementById('regCompany').value.trim(), occupation: document.getElementById('regOccupation').value, version_intent: 'saas_1y', message: '官网注册试用' }; const btn = document.getElementById('regBtn'); const err = document.getElementById('regErr'); btn.disabled = true; btn.textContent = '注册中…'; err.textContent = ''; fetch('/api/member/register', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }).then(r => r.json()).then(j => { if (j.token) { localStorage.setItem('zsm_token', j.token); localStorage.setItem('zsm_user', JSON.stringify(j.user)); location.href = '/member/index.html'; } else { err.textContent = j.error || '注册失败'; btn.disabled = false; btn.textContent = '注册并提交试用申请'; } }).catch(() => { err.textContent = '网络错误,请稍后重试'; btn.disabled = false; btn.textContent = '注册并提交试用申请'; }); return false; } // 已登录则直接跳转 if (localStorage.getItem('zsm_token')) { location.href = '/member/index.html'; }