'use client'; import { useEffect, useState } from 'react'; import { useRouter } from 'next/navigation'; import { useAuth } from '@/components/admin/auth-context'; import { adminApi } from '@/lib/admin-api'; import { toast } from '@/components/ui/sonner'; import { Save } from 'lucide-react'; interface ZoneItem { itemId: string; sortOrder: number; variant: string; } interface Zone { id: string; code: string; name: string; pageCode: string; zoneKey: string; allowedModels: string[]; items: ZoneItem[]; settings: Record; } export default function ZonesPage() { const { user, loading: authLoading } = useAuth(); const router = useRouter(); const [zones, setZones] = useState([]); const [loading, setLoading] = useState(true); const [editingZone, setEditingZone] = useState(null); const [saving, setSaving] = useState(false); const [error, setError] = useState(''); useEffect(() => { if (!authLoading && !user) { router.push('/admin/login'); return; } if (user) { adminApi.getZones().then((res) => { setZones((res as Zone[]) || []); setError(''); }).catch((err) => setError(err instanceof Error ? err.message : '加载失败')).finally(() => setLoading(false)); } }, [user, authLoading, router]); const handleSave = async () => { if (!editingZone) return; setSaving(true); try { await adminApi.saveZone({ id: editingZone.id, code: editingZone.code, name: editingZone.name, pageCode: editingZone.pageCode, zoneKey: editingZone.zoneKey, allowedModels: editingZone.allowedModels, items: editingZone.items, settings: editingZone.settings, }); setEditingZone(null); toast.success('页面区域保存成功'); // 重新加载 const res = await adminApi.getZones(); setZones((res as Zone[]) || []); } catch (err) { const message = err instanceof Error ? err.message : '保存失败'; toast.error(message); } finally { setSaving(false); } }; if (authLoading || loading) { return (
); } return (

页面区域配置

管理系统各页面的内容区域布局

{error && (
{error}
)}
{zones.map((zone) => (

{zone.name}

Code: {zone.code} | 页面: {zone.pageCode || '-'} | 区域: {zone.zoneKey || '-'}

允许模型: {zone.allowedModels?.join(', ') || '-'} | 内容数: {zone.items?.length || 0}

{editingZone?.id === zone.id && (
setEditingZone({ ...editingZone, name: e.target.value })} className="w-full px-3 py-1.5 border border-border-secondary rounded text-sm" />
setEditingZone({ ...editingZone, pageCode: e.target.value })} className="w-full px-3 py-1.5 border border-border-secondary rounded text-sm" />
)}
))}
); }