'use client' import { useState } from 'react' import { useRouter, useParams } from 'next/navigation' import { useToast } from '@/components/ui/Toast' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card' import { Button } from '@/components/ui/Button' import { Input } from '@/components/ui/Input' import { ArrowLeft, FileText, Shield, Settings, Plus, Trash2, AlertTriangle, CheckCircle, Video, Bot, Users, Save, Upload, Download, ChevronDown, ChevronUp } from 'lucide-react' // 模拟数据 const mockData = { project: { id: 'proj-001', name: 'XX品牌618推广', }, brief: { title: 'XX品牌618推广Brief', description: '本次618大促营销活动,需要达人围绕夏日护肤、美妆新品进行内容创作。', requirements: [ '视频时长:60-90秒', '必须展示产品使用过程', '需要口播品牌slogan:"XX品牌,夏日焕新"', '背景音乐需使用品牌指定曲库', ], keywords: ['夏日护肤', '清爽', '补水', '防晒', '焕新'], forbiddenWords: ['最好', '第一', '绝对', '100%'], referenceLinks: [ { title: '品牌视觉指南', url: 'https://example.com/brand-guide.pdf' }, { title: '产品资料包', url: 'https://example.com/product-pack.zip' }, ], deadline: '2026-06-10', }, rules: { aiReview: { enabled: true, strictness: 'medium', // low, medium, high checkItems: [ { id: 'forbidden_words', name: '违禁词检测', enabled: true }, { id: 'competitor', name: '竞品提及检测', enabled: true }, { id: 'brand_tone', name: '品牌调性检测', enabled: true }, { id: 'duration', name: '视频时长检测', enabled: true }, { id: 'music', name: '背景音乐检测', enabled: false }, ], }, manualReview: { scriptRequired: true, videoRequired: true, agencyCanApprove: true, // 代理商是否有终审权限 brandFinalReview: true, // 品牌方是否需要终审 }, appealRules: { maxAppeals: 3, // 最大申诉次数 appealDeadline: 48, // 申诉处理时限(小时) }, }, } // 严格程度选项 const strictnessOptions = [ { value: 'low', label: '宽松', description: '仅检测明显违规内容' }, { value: 'medium', label: '标准', description: '平衡检测,推荐使用' }, { value: 'high', label: '严格', description: '严格检测,可能有较多误判' }, ] export default function ProjectConfigPage() { const router = useRouter() const params = useParams() const toast = useToast() const projectId = params.id as string const [brief, setBrief] = useState(mockData.brief) const [rules, setRules] = useState(mockData.rules) const [isSaving, setIsSaving] = useState(false) const [activeSection, setActiveSection] = useState('brief') // 新增需求 const [newRequirement, setNewRequirement] = useState('') // 新增关键词 const [newKeyword, setNewKeyword] = useState('') // 新增违禁词 const [newForbiddenWord, setNewForbiddenWord] = useState('') const handleSave = async () => { setIsSaving(true) await new Promise(resolve => setTimeout(resolve, 1000)) setIsSaving(false) toast.success('配置已保存') } const addRequirement = () => { if (newRequirement.trim()) { setBrief({ ...brief, requirements: [...brief.requirements, newRequirement.trim()] }) setNewRequirement('') } } const removeRequirement = (index: number) => { setBrief({ ...brief, requirements: brief.requirements.filter((_, i) => i !== index) }) } const addKeyword = () => { if (newKeyword.trim() && !brief.keywords.includes(newKeyword.trim())) { setBrief({ ...brief, keywords: [...brief.keywords, newKeyword.trim()] }) setNewKeyword('') } } const removeKeyword = (keyword: string) => { setBrief({ ...brief, keywords: brief.keywords.filter(k => k !== keyword) }) } const addForbiddenWord = () => { if (newForbiddenWord.trim() && !brief.forbiddenWords.includes(newForbiddenWord.trim())) { setBrief({ ...brief, forbiddenWords: [...brief.forbiddenWords, newForbiddenWord.trim()] }) setNewForbiddenWord('') } } const removeForbiddenWord = (word: string) => { setBrief({ ...brief, forbiddenWords: brief.forbiddenWords.filter(w => w !== word) }) } const toggleAiCheckItem = (itemId: string) => { setRules({ ...rules, aiReview: { ...rules.aiReview, checkItems: rules.aiReview.checkItems.map(item => item.id === itemId ? { ...item, enabled: !item.enabled } : item ), }, }) } const SectionHeader = ({ title, icon: Icon, section }: { title: string; icon: React.ElementType; section: string }) => ( ) return (
{/* 顶部导航 */}

Brief和规则配置

{mockData.project.name}

{/* Brief配置 */} {activeSection === 'brief' && ( {/* 基本信息 */}
setBrief({ ...brief, title: e.target.value })} />
setBrief({ ...brief, deadline: e.target.value })} />