'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 { Modal } from '@/components/ui/Modal' import { SuccessTag } from '@/components/ui/Tag' import { ArrowLeft, FileText, Download, Eye, Target, Ban, AlertTriangle, Sparkles, FileDown, CheckCircle, Clock, Building2, Info, Plus, X, Save, Upload, Trash2, File } from 'lucide-react' import { getPlatformInfo } from '@/lib/platforms' // 文件类型 type BriefFile = { id: string name: string type: 'brief' | 'rule' | 'reference' size: string uploadedAt: string } // 模拟品牌方 Brief(只读) const mockBrandBrief = { id: 'brief-001', projectName: 'XX品牌618推广', brandName: 'XX护肤品牌', platform: 'douyin', // 品牌方上传的文件列表 files: [ { id: 'f1', name: 'XX品牌618推广Brief.pdf', type: 'brief' as const, size: '2.3MB', uploadedAt: '2026-02-01' }, { id: 'f2', name: '产品卖点说明.docx', type: 'reference' as const, size: '1.2MB', uploadedAt: '2026-02-01' }, { id: 'f3', name: '品牌视觉指南.pdf', type: 'reference' as const, size: '5.8MB', uploadedAt: '2026-02-01' }, ], // 品牌方配置的规则(只读) brandRules: { restrictions: '不可提及竞品,不可使用绝对化用语', competitors: ['安耐晒', '资生堂', '兰蔻'], }, } // 代理商上传的Brief文档(可编辑) type AgencyFile = { id: string name: string size: string uploadedAt: string description?: string } // 代理商自己的配置(可编辑) const mockAgencyConfig = { status: 'configured', configuredAt: '2026-02-02', // 代理商上传的Brief文档(给达人看的) agencyFiles: [ { id: 'af1', name: '达人拍摄指南.pdf', size: '1.5MB', uploadedAt: '2026-02-02', description: '详细的拍摄流程和注意事项' }, { id: 'af2', name: '产品卖点话术.docx', size: '800KB', uploadedAt: '2026-02-02', description: '推荐使用的话术和表达方式' }, ] as AgencyFile[], // AI 解析出的内容 aiParsedContent: { productName: 'XX品牌防晒霜', targetAudience: '18-35岁女性', contentRequirements: '需展示产品质地、使用效果,视频时长30-60秒', }, // 代理商配置的卖点(可编辑) sellingPoints: [ { id: 'sp1', content: 'SPF50+ PA++++', required: true }, { id: 'sp2', content: '轻薄质地,不油腻', required: true }, { id: 'sp3', content: '延展性好,易推开', required: false }, { id: 'sp4', content: '适合敏感肌', required: false }, { id: 'sp5', content: '夏日必备防晒', required: true }, ], // 代理商配置的违禁词(可编辑) blacklistWords: [ { id: 'bw1', word: '最好', reason: '绝对化用语' }, { id: 'bw2', word: '第一', reason: '绝对化用语' }, { id: 'bw3', word: '神器', reason: '夸大宣传' }, { id: 'bw4', word: '完美', reason: '绝对化用语' }, ], } // 平台规则 const platformRules = { douyin: { name: '抖音', rules: [ { category: '广告法违禁词', items: ['最', '第一', '顶级', '极致', '绝对', '永久', '万能', '特效'] }, { category: '医疗相关禁用', items: ['治疗', '药用', '医学', '临床', '处方'] }, { category: '虚假宣传', items: ['100%', '纯天然', '无副作用', '立竿见影'] }, ], }, xiaohongshu: { name: '小红书', rules: [ { category: '广告法违禁词', items: ['最', '第一', '顶级', '极品', '绝对'] }, { category: '功效承诺禁用', items: ['包治', '根治', '祛除', '永久'] }, ], }, bilibili: { name: 'B站', rules: [ { category: '广告法违禁词', items: ['最', '第一', '顶级', '极致'] }, { category: '虚假宣传', items: ['100%', '纯天然', '无副作用'] }, ], }, } export default function BriefConfigPage() { const router = useRouter() const params = useParams() const toast = useToast() // 品牌方 Brief(只读) const [brandBrief] = useState(mockBrandBrief) // 代理商配置(可编辑) const [agencyConfig, setAgencyConfig] = useState(mockAgencyConfig) const [newSellingPoint, setNewSellingPoint] = useState('') const [newBlacklistWord, setNewBlacklistWord] = useState('') // 弹窗状态 const [showFilesModal, setShowFilesModal] = useState(false) const [showAgencyFilesModal, setShowAgencyFilesModal] = useState(false) const [previewFile, setPreviewFile] = useState(null) const [previewAgencyFile, setPreviewAgencyFile] = useState(null) const [isExporting, setIsExporting] = useState(false) const [isSaving, setIsSaving] = useState(false) const [isAIParsing, setIsAIParsing] = useState(false) const [isUploading, setIsUploading] = useState(false) const platform = getPlatformInfo(brandBrief.platform) const rules = platformRules[brandBrief.platform as keyof typeof platformRules] || platformRules.douyin // 下载文件 const handleDownload = (file: BriefFile) => { toast.info(`下载文件: ${file.name}`) } // 预览文件 const handlePreview = (file: BriefFile) => { setPreviewFile(file) } // 导出平台规则文档 const handleExportRules = async () => { setIsExporting(true) await new Promise(resolve => setTimeout(resolve, 1500)) setIsExporting(false) toast.success('平台规则文档已导出!') } // AI 解析 const handleAIParse = async () => { setIsAIParsing(true) await new Promise(resolve => setTimeout(resolve, 2000)) setIsAIParsing(false) toast.success('AI 解析完成!') } // 保存配置 const handleSave = async () => { setIsSaving(true) await new Promise(resolve => setTimeout(resolve, 1000)) setIsSaving(false) toast.success('配置已保存!') } // 卖点操作 const addSellingPoint = () => { if (!newSellingPoint.trim()) return setAgencyConfig(prev => ({ ...prev, sellingPoints: [...prev.sellingPoints, { id: `sp${Date.now()}`, content: newSellingPoint, required: false }] })) setNewSellingPoint('') } const removeSellingPoint = (id: string) => { setAgencyConfig(prev => ({ ...prev, sellingPoints: prev.sellingPoints.filter(sp => sp.id !== id) })) } const toggleRequired = (id: string) => { setAgencyConfig(prev => ({ ...prev, sellingPoints: prev.sellingPoints.map(sp => sp.id === id ? { ...sp, required: !sp.required } : sp ) })) } // 违禁词操作 const addBlacklistWord = () => { if (!newBlacklistWord.trim()) return setAgencyConfig(prev => ({ ...prev, blacklistWords: [...prev.blacklistWords, { id: `bw${Date.now()}`, word: newBlacklistWord, reason: '自定义' }] })) setNewBlacklistWord('') } const removeBlacklistWord = (id: string) => { setAgencyConfig(prev => ({ ...prev, blacklistWords: prev.blacklistWords.filter(bw => bw.id !== id) })) } // 代理商文档操作 const handleUploadAgencyFile = async () => { setIsUploading(true) // 模拟上传 await new Promise(resolve => setTimeout(resolve, 1500)) const newFile: AgencyFile = { id: `af${Date.now()}`, name: '新上传文档.pdf', size: '1.2MB', uploadedAt: new Date().toISOString().split('T')[0], description: '新上传的文档' } setAgencyConfig(prev => ({ ...prev, agencyFiles: [...prev.agencyFiles, newFile] })) setIsUploading(false) toast.success('文档上传成功!') } const removeAgencyFile = (id: string) => { setAgencyConfig(prev => ({ ...prev, agencyFiles: prev.agencyFiles.filter(f => f.id !== id) })) } const handlePreviewAgencyFile = (file: AgencyFile) => { setPreviewAgencyFile(file) } const handleDownloadAgencyFile = (file: AgencyFile) => { toast.info(`下载文件: ${file.name}`) } return (
{/* 顶部导航 */}

{brandBrief.projectName}

{platform && ( {platform.icon} {platform.name} )}

{brandBrief.brandName}

{/* ===== 第一部分:品牌方 Brief(只读)===== */}

品牌方 Brief(只读)

以下是品牌方上传的 Brief 文件和规则,仅供参考,不可编辑。

{/* 品牌方文件 */} 品牌方 Brief 文件 {brandBrief.files.length} 个文件 {brandBrief.files.slice(0, 2).map((file) => (

{file.name}

{file.size} · {file.uploadedAt}

))} {brandBrief.files.length > 2 && ( )}
{/* 品牌方规则(只读) */} 品牌方限制

限制条件

{brandBrief.brandRules.restrictions}

竞品黑名单

{brandBrief.brandRules.competitors.map((c, i) => ( {c} ))}
{/* ===== 第二部分:代理商配置(可编辑)===== */}

代理商配置(可编辑)

以下配置由代理商编辑,将展示给达人查看。

{/* 代理商Brief文档管理 */} 代理商 Brief 文档 {agencyConfig.agencyFiles.length} 个文件(达人可见)
{agencyConfig.agencyFiles.map((file) => (

{file.name}

{file.size} · {file.uploadedAt}

{file.description && (

{file.description}

)}
))} {/* 上传占位卡片 */}

以上文档将展示给达人查看,请确保内容准确完整。

{/* 左侧:AI解析 + 卖点配置 */}
{/* AI 解析结果 */} AI 解析结果

产品名称

{agencyConfig.aiParsedContent.productName}

目标人群

{agencyConfig.aiParsedContent.targetAudience}

内容要求

{agencyConfig.aiParsedContent.contentRequirements}

{/* 卖点配置(可编辑) */} 卖点配置 {agencyConfig.sellingPoints.length} 个卖点 {agencyConfig.sellingPoints.map((sp) => (
{sp.content}
))}
setNewSellingPoint(e.target.value)} placeholder="添加新卖点..." className="flex-1 px-3 py-2 border border-border-subtle rounded-lg bg-bg-elevated text-text-primary focus:outline-none focus:ring-2 focus:ring-accent-indigo" onKeyDown={(e) => e.key === 'Enter' && addSellingPoint()} />
{/* 平台规则 */} {rules.name}平台规则 {rules.rules.map((rule, index) => (

{rule.category}

{rule.items.map((item, i) => ( {item} ))}
))}
{/* 右侧:违禁词配置 */}
{/* 违禁词配置(可编辑) */} 违禁词配置 {agencyConfig.blacklistWords.length} 个 {agencyConfig.blacklistWords.map((bw) => (
「{bw.word}」 {bw.reason}
))}
setNewBlacklistWord(e.target.value)} placeholder="添加违禁词..." className="flex-1 px-3 py-2 border border-border-subtle rounded-lg bg-bg-elevated text-text-primary focus:outline-none focus:ring-2 focus:ring-accent-indigo" onKeyDown={(e) => e.key === 'Enter' && addBlacklistWord()} />
{/* 配置信息 */} 配置状态
状态 已配置
配置时间 {agencyConfig.configuredAt}
{/* 配置提示 */}

配置说明

  • • 必选卖点必须在内容中提及
  • • 违禁词会触发 AI 审核警告
  • • 此配置将展示给达人查看
{/* 文件列表弹窗 */} setShowFilesModal(false)} title="品牌方 Brief 文件" size="lg" >
{brandBrief.files.map((file) => (

{file.name}

{file.size} · 上传于 {file.uploadedAt}

))}
{/* 文件预览弹窗(品牌方) */} setPreviewFile(null)} title={previewFile?.name || '文件预览'} size="lg" >

文件预览区域

实际开发中将嵌入文件预览组件

{previewFile && ( )}
{/* 代理商文档管理弹窗 */} setShowAgencyFilesModal(false)} title="管理代理商 Brief 文档" size="lg" >

以下文档将展示给达人查看,可以添加、删除或预览文档

{agencyConfig.agencyFiles.map((file) => (

{file.name}

{file.size} · 上传于 {file.uploadedAt}

{file.description && (

{file.description}

)}
))} {agencyConfig.agencyFiles.length === 0 && (

暂无文档

点击上方按钮上传文档

)}
{/* 代理商文档预览弹窗 */} setPreviewAgencyFile(null)} title={previewAgencyFile?.name || '文件预览'} size="lg" >

文件预览区域

实际开发中将嵌入文件预览组件

{previewAgencyFile && ( )}
) }