From 08e813c0cac0d30bdd5ba95c818270f0dc9a9a76 Mon Sep 17 00:00:00 2001 From: Rogee Date: Thu, 24 Sep 2026 18:36:55 +0800 Subject: [PATCH] =?UTF-8?q?feat(web):=20=E7=AB=9E=E5=93=81=E5=88=86?= =?UTF-8?q?=E6=9E=90=E9=A1=B5=E5=AF=B9=E9=BD=90=20card-list=E2=80=94?= =?UTF-8?q?=E2=80=94=E4=BD=9C=E5=93=81=E6=94=B9=20Row/Col+Card=20=E5=8D=A1?= =?UTF-8?q?=E7=89=87=E7=BD=91=E6=A0=BC=E3=80=81=E8=AF=A6=E6=83=85=20Drawer?= =?UTF-8?q?=E3=80=81=E7=A7=BB=E9=99=A4=E6=AD=BB=E5=B9=B3=E5=8F=B0=E7=AD=9B?= =?UTF-8?q?=E9=80=89=EF=BC=9B=E4=BF=AE=E5=A4=8D=E5=BE=85=E6=A0=B8=E9=AA=8C?= =?UTF-8?q?=E7=AD=9B=E9=80=89=E5=80=BC=20unverified=E2=86=92pending=5Fveri?= =?UTF-8?q?fication?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/pages/creator/competitors/index.tsx | 330 ++++++++++---------- 1 file changed, 170 insertions(+), 160 deletions(-) diff --git a/web/src/pages/creator/competitors/index.tsx b/web/src/pages/creator/competitors/index.tsx index ab9747f..b46d534 100644 --- a/web/src/pages/creator/competitors/index.tsx +++ b/web/src/pages/creator/competitors/index.tsx @@ -1,25 +1,27 @@ -// 竞品分析:语义对齐 web.archived/src/features/creator/competitors/CreatorCompetitorsPage.jsx(提交 d97cade)。 -// 仅用 antd 默认组件;筛选自动刷新、手动上一页/下一页(后端 has_next)、素材三步处理与仿写流程原样保留。 +// 竞品分析:作品列表对齐 ant-design-pro card-list——antd Row/Col 响应式栅格 + Card 原样组合; +// 作品详情改走 Drawer;素材三步处理与仿写流程内联卡片原样保留;筛选自动刷新、手动翻页不变。 +// 平台筛选已随 migration 038(platform 收敛 douyin)移除。 import { useEffect, useState } from 'react'; -import { Flex, Alert, Button, Card, Input, InputNumber, Modal, Select, Space, Table, Tag, Typography, message } from 'antd'; -import type { ColumnsType } from 'antd/es/table'; +import { CommentOutlined, LikeOutlined, ShareAltOutlined } from '@ant-design/icons'; +import { Flex, Alert, Button, Card, Col, Drawer, Empty, Input, InputNumber, Modal, Row, Select, Space, Spin, Table, Tag, Typography, message } from 'antd'; import { creatorAction, creatorGet, creatorUpdate, getList } from '@/services/api'; import { conflictMessage, dateTime } from '@/utils/helpers'; -const platformOptions = [ - { value: 'douyin', label: '抖音' }, - { value: 'xiaohongshu', label: '小红书' }, -]; - const publishedAtStatusOptions = [ { value: 'verified', label: '已核验' }, { value: 'future', label: '未来时间' }, - { value: 'unverified', label: '待核验' }, + { value: 'pending_verification', label: '待核验' }, { value: 'invalid', label: '无效时间' }, ]; +const publishedAtStatusMeta: Record = { + verified: { color: 'green', label: '已核验' }, + future: { color: 'orange', label: '未来时间' }, + pending_verification: { label: '待核验' }, + invalid: { color: 'red', label: '无效时间' }, +}; + interface Filters { - platform?: string; minLikes?: number; minComments?: number; minShares?: number; @@ -28,8 +30,13 @@ interface Filters { publishedBefore?: string; } -function statusTag(tone: 'success' | 'error' | 'default', label: string) { - return {label}; +function statusTag(status?: string) { + const meta = publishedAtStatusMeta[status || ''] || { label: status || '—' }; + return {meta.label}; +} + +function stepTag(status: string, label: string) { + return {label}; } export default function Page() { @@ -59,7 +66,6 @@ export default function Page() { page: workPage, pageSize: 25, filters: { - platform: filters.platform, min_likes: filters.minLikes === undefined ? undefined : Number(filters.minLikes), min_comments: filters.minComments === undefined ? undefined : Number(filters.minComments), min_shares: filters.minShares === undefined ? undefined : Number(filters.minShares), @@ -201,60 +207,6 @@ export default function Page() { } } - const columns: ColumnsType = [ - { - title: '作品', - dataIndex: 'title', - width: 280, - render: (_, work) => ( -
- - - {work.author_name || work.source_id} · {work.published_at_status} - -
- ), - }, - { - title: '发布时间', - dataIndex: 'published_at', - render: (value?: string) => ( - - {value ? dateTime(value) : '待核验'} - - ), - }, - { title: '点赞 / 评论 / 转发', key: 'metrics', render: (_, work) => {work.likes ?? '—'} / {work.comments_count ?? '—'} / {work.shares ?? '—'} }, - { - title: '指标下次采集', - dataIndex: 'next_metric_at', - render: (value?: string, work?: any) => ( - - {value ? dateTime(value) : work?.metric_stop_reason || '—'} - - ), - }, - { - title: '操作', - key: 'actions', - align: 'right', - render: (_, work) => ( - - - - - ), - }, - ]; - const materialReadyForConfirm = material && material.download_status === 'succeeded' && @@ -262,19 +214,11 @@ export default function Page() { !['not_started', 'running', 'failed'].includes(material.transcription_status); return ( -
+ <> {contextHolder} - - 调整条件后自动刷新}> + + 调整条件后自动刷新}> - setFilters((f) => ({ ...f, publishedAfter: e.target.value }))} /> setFilters((f) => ({ ...f, publishedBefore: e.target.value }))} /> - - - {error ? ( - 重试} /> - ) : null} - - {workPageInfo.total > works.length ? ( -
- - - - -
- ) : null} - - {workDetail ? ( - 作品详情 {workDetail.work_key || workDetail.id}} - extra={} - > - - {workDetail.cover_url ? 作品封面 : null} - {workDetail.body || workDetail.title || '暂无正文'} - - 来源:{workDetail.source_type || '—'} - 状态:{workDetail.published_at_status || '—'} - {workDetail.original_url ? ( - - 打开原文 - - ) : null} + + + {error ? ( + 重试} /> + ) : null} + + 共 {workPageInfo.total} 个作品 + + + {works.length ? ( + + {works.map((work) => ( + + + ) : ( + + 无封面 + + ) + } + actions={[ + , + , + ...(work.original_url ? [原文] : []), + ]} + > + + + {work.title || '无标题'} + + + {work.author_name || work.source_id} + + + {statusTag(work.published_at_status)} + + {work.published_at ? dateTime(work.published_at) : '—'} + + + + {work.likes ?? '—'} + {work.comments_count ?? '—'} + {work.shares ?? '—'} + + {work.next_metric_at || work.metric_stop_reason ? ( + + {work.next_metric_at ? `下次采集 ${dateTime(work.next_metric_at)}` : work.metric_stop_reason} + + ) : null} + + + + ))} + + ) : ( + + )} + + {workPageInfo.total > works.length ? ( + + + + -
dateTime(value) }, - { title: '点赞', dataIndex: 'likes', render: (v) => v ?? '—' }, - { title: '评论', dataIndex: 'comments_count', render: (v) => v ?? '—' }, - { title: '转发', dataIndex: 'shares', render: (v) => v ?? '—' }, - ]} - locale={{ emptyText: '暂无指标记录。' }} - /> - - ) : null} + ) : null} + {material ? ( 每一步都保留真实状态;失败不会被显示为成功。 - - + +
+ +
- {statusTag(material.download_status === 'succeeded' ? 'success' : material.download_status === 'failed' ? 'error' : 'default', `下载:${material.download_status}`)} - {statusTag(material.audio_status === 'succeeded' ? 'success' : material.audio_status === 'failed' ? 'error' : 'default', `音轨:${material.audio_status}`)} - {statusTag(material.transcription_status === 'succeeded' ? 'success' : material.transcription_status === 'failed' ? 'error' : 'default', `转写:${material.transcription_status}`)} + {stepTag(material.download_status, `下载:${material.download_status}`)} + {stepTag(material.audio_status, `音轨:${material.audio_status}`)} + {stepTag(material.transcription_status, `转写:${material.transcription_status}`)} - {material.failure_reason ? : null} + {material.failure_reason ? ( + + ) : null}
仿写要求 必须先确认要求,才允许保存可编辑结果。 @@ -363,38 +337,74 @@ export default function Page() { value={rewriteRequirement} onChange={(event) => setRewriteRequirement(event.target.value)} disabled={Boolean(material.rewrite_confirmed_at) || materialPending} - style={{ marginBottom: 12 }} /> - {material.rewrite_confirmed_at ? ( - - - - 生成结果不会自动发布,保存前必须人工复核。 - -
- 可编辑标题 - setRewriteTitle(event.target.value)} style={{ marginTop: 4 }} /> -
-
- 可编辑口播 - setRewriteScript(event.target.value)} style={{ marginTop: 4 }} /> -
+
+ {material.rewrite_confirmed_at ? ( + <> + + + 生成结果不会自动发布,保存前必须人工复核。 + +
+ 可编辑标题 + setRewriteTitle(event.target.value)} style={{ marginTop: 4 }} /> +
+
+ 可编辑口播 + setRewriteScript(event.target.value)} style={{ marginTop: 4 }} /> +
+
- - ) : ( +
+ + ) : ( +
- )} -
+ + )}
) : null} + setWorkDetail(null)} size="large" title="作品详情"> + {workDetail ? ( + + {workDetail.cover_url ? ( + 作品封面 + ) : null} + ID:{workDetail.work_key || workDetail.id} + {workDetail.body || workDetail.title || '暂无正文'} + + 来源:{workDetail.source_type || '—'} + {statusTag(workDetail.published_at_status)} + {workDetail.original_url ? ( + + 打开原文 + + ) : null} + +
dateTime(value) }, + { title: '点赞', dataIndex: 'likes', render: (v) => v ?? '—' }, + { title: '评论', dataIndex: 'comments_count', render: (v) => v ?? '—' }, + { title: '转发', dataIndex: 'shares', render: (v) => v ?? '—' }, + ]} + locale={{ emptyText: '暂无指标记录。' }} + /> + + ) : null} + 当前素材文稿尚未保存,确定放弃并切换吗? - + ); }