import React, { useState, useEffect } from 'react' import { useNavigate } from 'react-router-dom' export default function Settings() { const [loading, setLoading] = useState(true) const [saving, setSaving] = useState(false) const [error, setError] = useState('') const [success, setSuccess] = useState('') const [form, setForm] = useState({ username: '', email: '', phone: '', avatar: '', address: '', bio: '' }) // 手机验证码相关状态 const [phoneChanged, setPhoneChanged] = useState(false) const [newPhone, setNewPhone] = useState('') const [verifyCode, setVerifyCode] = useState('') const [sendingCode, setSendingCode] = useState(false) const [codeCountdown, setCodeCountdown] = useState(0) const [passwordForm, setPasswordForm] = useState({ oldPassword: '', newPassword: '', confirmPassword: '' }) const navigate = useNavigate() const token = localStorage.getItem('token') useEffect(() => { fetchUserInfo() }, []) // 验证码倒计时 useEffect(() => { if (codeCountdown > 0) { const timer = setTimeout(() => setCodeCountdown(codeCountdown - 1), 1000) return () => clearTimeout(timer) } }, [codeCountdown]) const fetchUserInfo = async () => { try { const res = await fetch('/api/users/me', { headers: { 'Authorization': 'Bearer ' + token } }) if (res.ok) { const data = await res.json() console.log('用户信息:', data) setForm({ username: data.username || '', email: data.email || '', phone: data.phone || '', avatar: data.avatar || '', address: data.address || '', bio: data.bio || '' }) setNewPhone(data.phone || '') } } catch (e) { console.error('获取用户信息异常:', e) const userStr = localStorage.getItem('user') if (userStr) { try { const user = JSON.parse(userStr) setForm({ username: user.username || '', email: user.email || '', phone: user.phone || '', avatar: user.avatar || '', address: user.address || '', bio: user.bio || '' }) setNewPhone(user.phone || '') } catch (e2) { setError('获取用户信息失败') } } } finally { setLoading(false) } } // 发送手机验证码 const handleSendCode = async () => { if (!newPhone) { setError('请输入手机号') return } const phoneRegex = /^1[3-9]\d{9}$/ if (!phoneRegex.test(newPhone)) { setError('请输入正确的手机号') return } setSendingCode(true) setError('') try { const res = await fetch('/api/auth/send-verification-code', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ phone: newPhone }) }) const data = await res.json() if (data.success) { setPhoneChanged(true) setCodeCountdown(60) setSuccess('验证码已发送到 ' + newPhone.substring(0,3) + '****' + newPhone.substring(7)) } else { setError(data.message || '发送失败') } } catch (err) { setError('发送失败,请稍后重试') } finally { setSendingCode(false) } } const handleSubmit = async (e) => { e.preventDefault() setError('') setSuccess('') // 如果更换了手机号,需要验证码 if (newPhone !== form.phone) { if (!verifyCode) { setError('请输入手机验证码') return } } setSaving(true) try { const updateData = { username: form.username, email: form.email || null, phone: newPhone, address: form.address, bio: form.bio } // 如果更换了手机号,添加验证码 if (newPhone !== form.phone) { updateData.verifyCode = verifyCode } const res = await fetch('/api/users/me', { method: 'PUT', headers: { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' }, body: JSON.stringify(updateData) }) if (res.ok) { const data = await res.json() setSuccess('保存成功!') setForm({...form, phone: newPhone}) setVerifyCode('') setPhoneChanged(false) // 更新本地存储 const userStr = localStorage.getItem('user') if (userStr) { const user = JSON.parse(userStr) user.username = data.username || user.username user.email = data.email || user.email user.phone = data.phone || user.phone localStorage.setItem('user', JSON.stringify(user)) } } else { const data = await res.json() setError(data.error?.message || data.detail || '保存失败') } } catch (e) { setError('保存失败,请重试') } finally { setSaving(false) } } const handlePasswordChange = async (e) => { e.preventDefault() setError('') setSuccess('') if (!passwordForm.oldPassword) { setError('请输入当前密码') return } if (passwordForm.newPassword !== passwordForm.confirmPassword) { setError('两次输入的密码不一致') return } if (passwordForm.newPassword.length < 8) { setError('密码至少8位,需包含大写+小写+数字') return } setSaving(true) try { const res = await fetch('/api/auth/change-password', { method: 'POST', headers: { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' }, body: JSON.stringify({ old_password: passwordForm.oldPassword, new_password: passwordForm.newPassword }) }) const data = await res.json() if (res.ok) { setSuccess('密码修改成功!') setPasswordForm({ oldPassword: '', newPassword: '', confirmPassword: '' }) } else { setError(data.error?.message || data.detail || '密码修改失败') } } catch (e) { setError('密码修改失败,请重试') } finally { setSaving(false) } } if (loading) { return (