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
杜康好客 · 传承千年
);
}