import { useEffect, useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { Button, Card, Descriptions, Form, Grid, Input, InputNumber, InputTag, Message, Modal, Select, Space, Switch, Table, Tag, } from "@arco-design/web-react"; import { IconArrowLeft, IconPlus, IconRefresh } from "@arco-design/web-react/icon"; import type { Drama, Episode } from "../api/types"; import { configureDramaEpisodes, createDrama as createDramaApi, getDrama, getDramaEpisodes, updateDrama, updateEpisode, } from "../api/dramas"; import { completeUploadTask, createUploadTask, syncReviewStatus } from "../api/media"; import { usePageData } from "../hooks/usePageData"; const { Row, Col } = Grid; const STATUS_OPTIONS: { value: string; label: string }[] = [ { value: "draft", label: "草稿" }, { value: "scheduled", label: "定时发布" }, { value: "published", label: "已发布" }, { value: "offline", label: "已下线" }, ]; const REVIEW_STATUS_LABEL: Record = { not_submitted: "未提交", pending: "待审核", reviewing: "审核中", approved: "已通过", rejected: "已拒绝", }; const PUBLISH_STATUS_LABEL: Record = { draft: "草稿", scheduled: "定时发布", published: "已发布", offline: "已下线", }; function DramasPage() { const { id } = useParams(); if (id) { return ; } return ; } function DramaListPage() { const navigate = useNavigate(); const { data, loading, reload, changePage } = usePageData("/api/admin/v1/dramas"); const [visible, setVisible] = useState(false); const [creating, setCreating] = useState(false); const createDrama = async (values: Partial) => { setCreating(true); try { await createDramaApi(values); Message.success("短剧创建成功"); setVisible(false); await reload(); } finally { setCreating(false); } }; return ( } onClick={() => setVisible(true)}> 新增短剧 } > changePage(page, pageSize), }} columns={[ { title: "ID", dataIndex: "id", width: 80 }, { title: "标题", dataIndex: "title" }, { title: "地区", dataIndex: "region", width: 120 }, { title: "类型", dataIndex: "type", width: 140 }, { title: "总集数", dataIndex: "totalEpisodes", width: 100 }, { title: "已发布", dataIndex: "publishedEpisodes", width: 100 }, { title: "状态", dataIndex: "status", width: 120, render: (status) => ( {PUBLISH_STATUS_LABEL[String(status)] || String(status)} ), }, { title: "推荐", dataIndex: "isRecommended", width: 100, render: (value) => (value ? : ), }, { title: "操作", width: 120, render: (_, record) => ( ), }, ]} /> setVisible(false)} footer={null} style={{ width: 640 }}>
); } function DramaDetailPage({ dramaId }: { dramaId: number }) { const navigate = useNavigate(); const [drama, setDrama] = useState(null); const [episodes, setEpisodes] = useState([]); const [loading, setLoading] = useState(false); const [episodeCount, setEpisodeCount] = useState(1); const [uploadingEpisodeId, setUploadingEpisodeId] = useState(null); const loadDetail = async () => { setLoading(true); try { const [dramaData, episodeList] = await Promise.all([getDrama(dramaId), getDramaEpisodes(dramaId)]); setDrama(dramaData); setEpisodeCount(dramaData.totalEpisodes || 1); setEpisodes(episodeList); } finally { setLoading(false); } }; useEffect(() => { void loadDetail(); }, [dramaId]); const configureEpisodes = async () => { await configureDramaEpisodes(dramaId, episodeCount); Message.success("剧集数量已更新"); await loadDetail(); }; const updateDramaStatus = async (status: string) => { await updateDrama(dramaId, { status }); Message.success("短剧状态已更新"); await loadDetail(); }; const uploadEpisodeVideo = async (episode: Episode, file: File) => { setUploadingEpisodeId(episode.id); try { const task = await createUploadTask({ episodeId: episode.id, fileName: file.name, contentType: file.type || "video/mp4", fileSize: file.size, }); await completeUploadTask(task.jobId); await syncReviewStatus(); Message.success("视频上传并审核通过"); await loadDetail(); } finally { setUploadingEpisodeId(null); } }; const publishEpisode = async (episode: Episode) => { await updateEpisode(episode.id, { publishStatus: "published", status: "published", }); Message.success("剧集已发布"); await loadDetail(); }; return (
} > {drama && ( )} setEpisodeCount(Number(value) || 1)} /> } >
value || "-", }, { title: "尺寸", width: 120, render: (_, record) => (record.width && record.height ? `${record.width}x${record.height}` : "-"), }, { title: "时长", dataIndex: "durationSeconds", width: 100, render: (value) => (value ? `${value}s` : "-"), }, { title: "审核状态", dataIndex: "reviewStatus", width: 120, render: (status) => ( {REVIEW_STATUS_LABEL[String(status)] || String(status)} ), }, { title: "发布状态", dataIndex: "publishStatus", width: 120, render: (status) => ( {PUBLISH_STATUS_LABEL[String(status)] || String(status)} ), }, { title: "操作", width: 280, render: (_, record) => ( ), }, ]} /> ); } export default DramasPage;