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 { ApiResponse, Drama, Episode, UploadTask } from "../api/types"; import { api } from "../api/client"; 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 } = usePageData("/api/admin/v1/dramas"); const [visible, setVisible] = useState(false); const [creating, setCreating] = useState(false); const createDrama = async (values: Partial) => { setCreating(true); try { await api.post("/api/admin/v1/dramas", values); Message.success("短剧创建成功"); setVisible(false); await reload(); } finally { setCreating(false); } }; return ( } onClick={() => setVisible(true)} > 新增短剧 } > ( {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 [dramaResponse, episodeResponse] = await Promise.all([ api.get>(`/api/admin/v1/dramas/${dramaId}`), api.get>( `/api/admin/v1/dramas/${dramaId}/episodes?pageSize=200`, ), ]); setDrama(dramaResponse.data.data); setEpisodeCount(dramaResponse.data.data.totalEpisodes || 1); setEpisodes(episodeResponse.data.data.list); } finally { setLoading(false); } }; useEffect(() => { void loadDetail(); }, [dramaId]); const configureEpisodes = async () => { await api.post(`/api/admin/v1/dramas/${dramaId}/episodes/batch`, { episodeCount, }); Message.success("剧集数量已更新"); await loadDetail(); }; const updateDramaStatus = async (status: string) => { await api.patch(`/api/admin/v1/dramas/${dramaId}`, { status }); Message.success("短剧状态已更新"); await loadDetail(); }; const uploadEpisodeVideo = async (episode: Episode, file: File) => { setUploadingEpisodeId(episode.id); try { const task = await api.post>( "/api/admin/v1/media/upload-tasks", { episodeId: episode.id, fileName: file.name, contentType: file.type || "video/mp4", fileSize: file.size, }, ); await api.patch( `/api/admin/v1/media/upload-tasks/${task.data.data.jobId}/complete`, {}, ); await api.post("/api/admin/v1/media/review-status/sync", {}); Message.success("视频上传并审核通过"); await loadDetail(); } finally { setUploadingEpisodeId(null); } }; const publishEpisode = async (episode: Episode) => { await api.patch(`/api/admin/v1/episodes/${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;