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 [passwordForm, setPasswordForm] = useState({ oldPassword: '', newPassword: '', confirmPassword: '' }) const navigate = useNavigate() const token = localStorage.getItem('token') useEffect(() => { fetchUserInfo() }, []) 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 || '' }) } else { console.error('获取用户信息失败:', res.status) } } 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 || '' }) } catch (e2) { setError('获取用户信息失败') } } } finally { setLoading(false) } } const handleSubmit = async (e) => { e.preventDefault() setError('') setSuccess('') setSaving(true) try { const res = await fetch('/api/users/me', { method: 'PUT', headers: { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' }, body: JSON.stringify(form) }) if (res.ok) { const data = await res.json() setSuccess('保存成功!') // 更新本地存储的用户信息 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 || '保存失败') } } 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 < 6) { setError('密码长度至少6位') return } setSaving(true) console.log('开始修改密码...') try { console.log('发送请求到 /api/auth/change-password') 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 }) }) console.log('响应状态:', res.status) const data = await res.json() console.log('响应数据:', data) if (res.ok) { setSuccess('密码修改成功!') setPasswordForm({ oldPassword: '', newPassword: '', confirmPassword: '' }) } else { setError(data.error?.message || data.detail || '密码修改失败') } } catch (e) { setError('密码修改失败,请重试') } finally { setSaving(false) } } if (loading) { return (
加载中...
) } return (
{/* 顶部导航 */}
window.history.back()} style={{ cursor: 'pointer', fontSize: '20px', color: '#fff' }}>←
个人设置
{error &&
{error}
} {success &&
{success}
} {/* 基本信息 */}
基本信息
setForm({ ...form, username: e.target.value })} style={{ width: '100%', padding: '12px', borderRadius: '8px', border: '1px solid #334155', background: '#0f172a', color: '#fff' }} />
setForm({ ...form, email: e.target.value })} style={{ width: '100%', padding: '12px', borderRadius: '8px', border: '1px solid #334155', background: '#0f172a', color: '#fff' }} />
setForm({ ...form, phone: e.target.value })} style={{ width: '100%', padding: '12px', borderRadius: '8px', border: '1px solid #334155', background: '#0f172a', color: '#fff' }} />
setForm({ ...form, address: e.target.value })} style={{ width: '100%', padding: '12px', borderRadius: '8px', border: '1px solid #334155', background: '#0f172a', color: '#fff' }} />