'use client' import { useState, useEffect } from 'react' import { User, Mail, Phone, MapPin, Save, Edit, Key } from 'lucide-react' interface UserProfile { id: string email: string username: string name?: string phone?: string address?: string } interface UserStats { user: { id: string username: string email: string memberSince: string } orderStats: { total: number byStatus: { PENDING: number CONFIRMED: number SHIPPED: number DELIVERED: number CANCELLED: number } totalSpent: number } recentOrders: Array<{ id: string status: string totalAmount: number createdAt: string }> favoriteComponentType: string | null summary: { totalOrders: number totalSpent: number pendingOrders: number completedOrders: number cartItems: number } } export default function ProfilePage() { const [user, setUser] = useState(null) const [userStats, setUserStats] = useState(null) const [isEditing, setIsEditing] = useState(false) const [isLoading, setIsLoading] = useState(true) const [isSaving, setIsSaving] = useState(false) const [formData, setFormData] = useState({ name: '', phone: '', address: '' }) const [passwordForm, setPasswordForm] = useState({ currentPassword: '', newPassword: '', confirmPassword: '' }) const [showPasswordForm, setShowPasswordForm] = useState(false) useEffect(() => { loadUserProfile() loadUserStats() }, []) const loadUserProfile = async () => { try { const token = localStorage.getItem('token') if (!token) { window.location.href = '/login' return } const response = await fetch('/api/user/profile', { headers: { 'Authorization': `Bearer ${token}` } }) if (response.ok) { const userData = await response.json() setUser(userData) setFormData({ name: userData.name || '', phone: userData.phone || '', address: userData.address || '' }) } else if (response.status === 401) { localStorage.removeItem('token') localStorage.removeItem('user') window.location.href = '/login' } } catch (error) { console.error('加载用户资料失败:', error) } finally { setIsLoading(false) } } const loadUserStats = async () => { try { const token = localStorage.getItem('token') if (!token) { return } const response = await fetch('/api/user/stats', { headers: { 'Authorization': `Bearer ${token}` } }) if (response.ok) { const stats = await response.json() setUserStats(stats) } } catch (error) { console.error('加载用户统计失败:', error) } } const handleSaveProfile = async () => { setIsSaving(true) try { const token = localStorage.getItem('token') const response = await fetch('/api/user/profile', { method: 'PUT', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, body: JSON.stringify(formData) }) if (response.ok) { const updatedUser = await response.json() setUser(updatedUser) setIsEditing(false) // 更新localStorage中的用户信息 localStorage.setItem('user', JSON.stringify(updatedUser)) alert('资料更新成功!') } else { alert('更新失败,请重试') } } catch (error) { console.error('更新用户资料失败:', error) alert('更新失败,请重试') } finally { setIsSaving(false) } } const handleChangePassword = async () => { if (passwordForm.newPassword !== passwordForm.confirmPassword) { alert('新密码和确认密码不匹配') return } if (passwordForm.newPassword.length < 6) { alert('新密码长度至少6位') return } try { const token = localStorage.getItem('token') const response = await fetch('/api/user/change-password', { method: 'PUT', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, body: JSON.stringify({ currentPassword: passwordForm.currentPassword, newPassword: passwordForm.newPassword }) }) if (response.ok) { alert('密码修改成功!') setPasswordForm({ currentPassword: '', newPassword: '', confirmPassword: '' }) setShowPasswordForm(false) } else { const error = await response.json() alert(error.message || '密码修改失败') } } catch (error) { console.error('修改密码失败:', error) alert('修改失败,请重试') } } const handleCancel = () => { setFormData({ name: user?.name || '', phone: user?.phone || '', address: user?.address || '' }) setIsEditing(false) } if (isLoading) { return (

加载中...

) } return (
{/* Header */}

{user?.name || user?.username}

{user?.email}

{/* Profile Info */}

个人资料

{!isEditing ? ( ) : (
)}
{/* Email (readonly) */}

邮箱地址不可修改

{/* Username (readonly) */}

用户名不可修改

{/* Name */}
setFormData({...formData, name: e.target.value})} disabled={!isEditing} className={`w-full px-3 py-2 border border-gray-300 rounded-lg ${ isEditing ? 'focus:ring-2 focus:ring-blue-500 focus:border-blue-500' : 'bg-gray-50' }`} placeholder="请输入真实姓名" />
{/* Phone */}
setFormData({...formData, phone: e.target.value})} disabled={!isEditing} className={`w-full px-3 py-2 border border-gray-300 rounded-lg ${ isEditing ? 'focus:ring-2 focus:ring-blue-500 focus:border-blue-500' : 'bg-gray-50' }`} placeholder="请输入手机号码" />
{/* Address */}