import React from 'react'; import { ContentTemplate } from '@/components/templates'; import { SectionHead, FieldText, FieldSelect, FieldCheck, Button, Icon } from '@/components/atoms'; import AuthGate from '@/components/AuthGate'; import { getUser, updateProfile, bindPhone, unbind, sendCode, me } from '@/services/auth'; import { BK_STATUS_OPTIONS, BK_TOPIC_OPTIONS, BK_SOURCE_OPTIONS } from '@/data/booking'; import '@/styles/booking.css'; /* 个人中心:报名资料设置(姓名/状态/主题/来源),报名时自动带入 + 登录方式绑定 */ export default function Profile() { const [authed, setAuthed] = React.useState(!!getUser()); const user = getUser() || {}; const [form, setForm] = React.useState({ name: user.name || '', status: user.status || '', topics: user.topics || [], source: user.source || '' }); const [msg, setMsg] = React.useState(''); const [err, setErr] = React.useState(''); const [busy, setBusy] = React.useState(false); const set = (k) => (v) => setForm((f) => ({ ...f, [k]: v })); /* 绑定管理 */ const [bind, setBind] = React.useState({ phone: '', phoneBound: false, wxBound: false, wxMiniBound: false }); const [bphone, setBphone] = React.useState(''); const [bcode, setBcode] = React.useState(''); const [cd, setCd] = React.useState(0); const [bindMsg, setBindMsg] = React.useState(''); const [bindErr, setBindErr] = React.useState(''); const [binding, setBinding] = React.useState(false); const refreshBind = async () => { try { const p = await me(); setBind({ phone: p.phone || '', phoneBound: !!p.phoneBound, wxBound: !!p.wxBound, wxMiniBound: !!p.wxMiniBound, }); } catch (e) { /* 未登录 */ } }; React.useEffect(() => { if (authed) void refreshBind(); }, [authed]); const send = async () => { setBindErr(''); if (!/^1\d{10}$/.test(bphone)) { setBindErr('请输入 11 位手机号'); return; } setBinding(true); try { const r = await sendCode(bphone); setBindMsg(`验证码已发送${r.debugCode ? `(演示:${r.debugCode})` : ''}`); setCd(60); const t = window.setInterval(() => setCd((c) => (c <= 1 ? (window.clearInterval(t), 0) : c - 1)), 1000); } catch (e) { setBindErr((e && e.message) || '发送失败'); } finally { setBinding(false); } }; const doBind = async (e) => { e.preventDefault(); setBindErr(''); setBindMsg(''); if (!/^1\d{10}$/.test(bphone)) { setBindErr('请输入 11 位手机号'); return; } if (!bcode) { setBindErr('请输入验证码'); return; } setBinding(true); try { await bindPhone(bphone, bcode); // 可能合并成另一账号并切换新令牌 setBindMsg('绑定成功'); setBphone(''); setBcode(''); setAuthed(true); await refreshBind(); } catch (ex) { setBindErr((ex && ex.message) || '绑定失败'); } finally { setBinding(false); } }; const doUnbind = async (type) => { setBinding(true); setBindErr(''); try { await unbind(type); setBindMsg('已解绑'); await refreshBind(); } catch (ex) { setBindErr((ex && ex.message) || '解绑失败'); } finally { setBinding(false); } }; if (!authed) { return (
setAuthed(true)} /> {err &&
{err}
}
); } return (
{msg &&
{msg}
} {err &&
{err}
}
{/* 登录方式绑定 */}
手机号 {bind.phoneBound ? {bind.phone} : (
setBphone(e.target.value)} placeholder="11 位手机号" /> setBcode(e.target.value)} placeholder="验证码" style={{ width: 100 }} />
)}
小程序 {bind.wxMiniBound ? '已绑定' : '未绑定'} {bind.wxMiniBound && }
微信(开放平台) {bind.wxBound ? '已绑定' : '未绑定'} {bind.wxBound && }
{bindMsg &&
{bindMsg}
} {bindErr &&
{bindErr}
}

小程序绑定:用同一手机号登录过小程序(微信)后会自动与当前账号合并为同一账号。

); }