import { useEffect, useState } from 'react'; import { View, Text, Input, Button } from '@tarojs/components'; import Taro from '@tarojs/taro'; import { request, saveToken, toast } from '../../lib/api'; import { bindHqWechatAfterSmsLogin, handleHqWechatCallback, handleHqWechatLoginResult, loginHqWithWechat, } from '../../lib/wechat'; import { isWechatEnv } from '../../lib/weixin'; import { WECHAT_INAPP_REQUIRED_MSG } from '@dukang/weixin-sdk'; import { clearHqAccountCache } from '../../lib/session'; import './index.css'; const DEMO_PHONE = '13600000001'; const REMEMBER_PHONE_KEY = 'hq_remember_phone'; const REMEMBER_FLAG_KEY = 'hq_remember_account'; function loadRememberedPhone(): { phone: string; remember: boolean } { try { const remember = Taro.getStorageSync(REMEMBER_FLAG_KEY) === '1'; const phone = remember ? Taro.getStorageSync(REMEMBER_PHONE_KEY) || '' : ''; return { phone, remember }; } catch { return { phone: '', remember: false }; } } function WechatIcon() { if (process.env.TARO_ENV === 'h5') { return ( ); } return ; } export default function LoginPage() { const remembered = loadRememberedPhone(); const [phone, setPhone] = useState(remembered.phone || DEMO_PHONE); const [code, setCode] = useState('123456'); const [rememberAccount, setRememberAccount] = useState(remembered.remember); const [agreed, setAgreed] = useState(false); const [cooldown, setCooldown] = useState(0); const [loading, setLoading] = useState(false); const [wxLoading, setWxLoading] = useState(false); const [msg, setMsg] = useState(''); useEffect(() => { if (!isWechatEnv()) return; void handleHqWechatCallback() .then((result) => { if (!result) return; if (handleHqWechatLoginResult(result)) enterApp(); }) .catch((e) => setMsg(formatWechatError(e))); }, []); function formatWechatError(e: unknown): string { const text = e instanceof Error ? e.message : '微信登录失败'; if (text.includes('首次登录') || text.includes('手机验证码')) { return '该微信尚未绑定管理员账号,请先使用手机验证码登录,登录后将自动关联微信'; } return text; } function ensureAgreed(): boolean { if (!agreed) { setMsg('请先勾选并同意用户协议'); return false; } return true; } function persistRememberAccount(nextPhone: string) { try { if (rememberAccount) { Taro.setStorageSync(REMEMBER_FLAG_KEY, '1'); Taro.setStorageSync(REMEMBER_PHONE_KEY, nextPhone); } else { Taro.removeStorageSync(REMEMBER_FLAG_KEY); Taro.removeStorageSync(REMEMBER_PHONE_KEY); } } catch { /* ignore */ } } function enterApp() { clearHqAccountCache(); Taro.reLaunch({ url: '/pages/dashboard/index' }); } async function sendCode() { if (!ensureAgreed()) return; if (cooldown > 0) return; setMsg(''); try { await request('/admin/auth/sms/send', { method: 'POST', data: { phone, scene: 'HQ_LOGIN' }, }); toast('验证码已发送(Mock:123456)', 'success'); setCooldown(60); const t = setInterval(() => { setCooldown((s) => { if (s <= 1) { clearInterval(t); return 0; } return s - 1; }); }, 1000); } catch (e) { setMsg(e instanceof Error ? e.message : '发送失败'); } } async function smsLogin() { if (!ensureAgreed()) return; setLoading(true); setMsg(''); try { const data = await request<{ accessToken: string }>('/admin/auth/login/sms', { method: 'POST', data: { phone, code }, }); saveToken(data.accessToken); persistRememberAccount(phone); if (isWechatEnv() || process.env.TARO_ENV === 'weapp') { setMsg('登录成功,正在关联微信…'); await bindHqWechatAfterSmsLogin(); if (process.env.TARO_ENV === 'weapp') { enterApp(); } return; } enterApp(); } catch (e) { setMsg(e instanceof Error ? e.message : '登录失败'); } finally { setLoading(false); } } async function wechatLogin() { if (!ensureAgreed()) return; setMsg(''); if (!isWechatEnv()) { setMsg(WECHAT_INAPP_REQUIRED_MSG); return; } setWxLoading(true); try { const ok = await loginHqWithWechat(); if (ok) enterApp(); } catch (e) { setMsg(formatWechatError(e)); } finally { setWxLoading(false); } } return ( local_bar 杜康好客 总部管理中心 管理员登录 smartphone setPhone(e.detail.value)} /> shield setCode(e.detail.value)} /> 0 ? ' is-disabled' : ''}`} onClick={sendCode} > {cooldown > 0 ? `${cooldown}s 后重发` : '获取验证码'} setRememberAccount((v) => !v)}> 记住账号 {msg ? {msg} : null} 其他登录方式 {wxLoading ? '登录中...' : '微信一键授权'} setAgreed((v) => !v)}> 我已阅读并同意 { e.stopPropagation(); Taro.navigateTo({ url: '/pages/user-agreement/index' }); }} > 《用户协议》 { e.stopPropagation(); Taro.navigateTo({ url: '/pages/privacy-policy/index' }); }} > 《隐私政策》 verified_user 杜康好客 · 传承千年 ); }