diff --git a/Cunkebao/src/pages/workspace/moments-sync/MomentsSync.tsx b/Cunkebao/src/pages/workspace/moments-sync/MomentsSync.tsx index aa7ed155..e68e6434 100644 --- a/Cunkebao/src/pages/workspace/moments-sync/MomentsSync.tsx +++ b/Cunkebao/src/pages/workspace/moments-sync/MomentsSync.tsx @@ -1,5 +1,5 @@ -import React, { useState, useEffect } from 'react'; -import { useNavigate } from 'react-router-dom'; +import React, { useState, useEffect } from "react"; +import { useNavigate } from "react-router-dom"; import { Plus, Search, @@ -12,21 +12,21 @@ import { Copy, ChevronLeft, Share2, -} from 'lucide-react'; -import { Card } from '@/components/ui/card'; -import { Button } from '@/components/ui/button'; -import { Input } from '@/components/ui/input'; -import { Badge } from '@/components/ui/badge'; -import { Switch } from '@/components/ui/switch'; -import { useToast } from '@/components/ui/toast'; -import '@/components/Layout.css'; -import { - fetchMomentsSyncTasks, - deleteMomentsSyncTask, - toggleMomentsSyncTask, +} from "lucide-react"; +import { Card } from "@/components/ui/card"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Badge } from "@/components/ui/badge"; +import { Switch } from "@/components/ui/switch"; +import { useToast } from "@/components/ui/toast"; +import "@/components/Layout.css"; +import { + fetchMomentsSyncTasks, + deleteMomentsSyncTask, + toggleMomentsSyncTask, copyMomentsSyncTask, - MomentsSyncTask -} from '@/api/momentsSync'; + MomentsSyncTask, +} from "@/api/momentsSync"; type CardMenuProps = { onView: () => void; @@ -51,7 +51,16 @@ function CardMenu({ onView, onEdit, onCopy, onDelete }: CardMenuProps) { return (
- {open && ( @@ -69,17 +78,106 @@ function CardMenu({ onView, onEdit, onCopy, onDelete }: CardMenuProps) { padding: 4, }} > -
{ onView(); setOpen(false); }} style={{ padding: 8, cursor: "pointer", display: "flex", alignItems: "center", borderRadius: 6, fontSize: 14, gap: 6, transition: "background .2s" }} onMouseOver={e => (e.currentTarget as HTMLDivElement).style.background="#f5f5f5"} onMouseOut={e => (e.currentTarget as HTMLDivElement).style.background=""}> - 查看 +
{ + onView(); + setOpen(false); + }} + style={{ + padding: 8, + cursor: "pointer", + display: "flex", + alignItems: "center", + borderRadius: 6, + fontSize: 14, + gap: 6, + transition: "background .2s", + }} + onMouseOver={(e) => + ((e.currentTarget as HTMLDivElement).style.background = "#f5f5f5") + } + onMouseOut={(e) => + ((e.currentTarget as HTMLDivElement).style.background = "") + } + > + + 查看
-
{ onEdit(); setOpen(false); }} style={{ padding: 8, cursor: "pointer", display: "flex", alignItems: "center", borderRadius: 6, fontSize: 14, gap: 6, transition: "background .2s" }} onMouseOver={e => (e.currentTarget as HTMLDivElement).style.background="#f5f5f5"} onMouseOut={e => (e.currentTarget as HTMLDivElement).style.background=""}> - 编辑 +
{ + onEdit(); + setOpen(false); + }} + style={{ + padding: 8, + cursor: "pointer", + display: "flex", + alignItems: "center", + borderRadius: 6, + fontSize: 14, + gap: 6, + transition: "background .2s", + }} + onMouseOver={(e) => + ((e.currentTarget as HTMLDivElement).style.background = "#f5f5f5") + } + onMouseOut={(e) => + ((e.currentTarget as HTMLDivElement).style.background = "") + } + > + + 编辑
-
{ onCopy(); setOpen(false); }} style={{ padding: 8, cursor: "pointer", display: "flex", alignItems: "center", borderRadius: 6, fontSize: 14, gap: 6, transition: "background .2s" }} onMouseOver={e => (e.currentTarget as HTMLDivElement).style.background="#f5f5f5"} onMouseOut={e => (e.currentTarget as HTMLDivElement).style.background=""}> - 复制 +
{ + onCopy(); + setOpen(false); + }} + style={{ + padding: 8, + cursor: "pointer", + display: "flex", + alignItems: "center", + borderRadius: 6, + fontSize: 14, + gap: 6, + transition: "background .2s", + }} + onMouseOver={(e) => + ((e.currentTarget as HTMLDivElement).style.background = "#f5f5f5") + } + onMouseOut={(e) => + ((e.currentTarget as HTMLDivElement).style.background = "") + } + > + + 复制
-
{ onDelete(); setOpen(false); }} style={{ padding: 8, cursor: "pointer", display: "flex", alignItems: "center", borderRadius: 6, fontSize: 14, gap: 6, color: "#e53e3e", transition: "background .2s" }} onMouseOver={e => (e.currentTarget as HTMLDivElement).style.background="#f5f5f5"} onMouseOut={e => (e.currentTarget as HTMLDivElement).style.background=""}> - 删除 +
{ + onDelete(); + setOpen(false); + }} + style={{ + padding: 8, + cursor: "pointer", + display: "flex", + alignItems: "center", + borderRadius: 6, + fontSize: 14, + gap: 6, + color: "#e53e3e", + transition: "background .2s", + }} + onMouseOver={(e) => + ((e.currentTarget as HTMLDivElement).style.background = "#f5f5f5") + } + onMouseOut={(e) => + ((e.currentTarget as HTMLDivElement).style.background = "") + } + > + + 删除
)} @@ -90,7 +188,7 @@ function CardMenu({ onView, onEdit, onCopy, onDelete }: CardMenuProps) { export default function MomentsSync() { const navigate = useNavigate(); const { toast } = useToast(); - const [searchTerm, setSearchTerm] = useState(''); + const [searchTerm, setSearchTerm] = useState(""); const [loading, setLoading] = useState(false); const [tasks, setTasks] = useState([]); @@ -100,24 +198,24 @@ export default function MomentsSync() { try { const list = await fetchMomentsSyncTasks(); // 确保数据字段与界面一致 - const mappedTasks = list.map(task => ({ + const mappedTasks = list.map((task) => ({ ...task, // 确保字段名称和格式与界面一致 status: task.status || 2, // 默认为关闭状态 deviceCount: task.deviceCount || 0, - targetGroup: task.targetGroup || '默认人群', + targetGroup: task.targetGroup || "默认人群", syncCount: task.todaySyncCount || task.syncCount || 0, - creatorName: task.creatorName || '未知', - lastSyncTime: task.lastSyncTime || '暂无', - createTime: task.createTime || '未知', + creatorName: task.creatorName || "未知", + lastSyncTime: task.lastSyncTime || "暂无", + createTime: task.createTime || "未知", syncInterval: task.syncInterval || 30, maxSyncPerDay: task.maxSyncPerDay || 100, - timeRange: task.timeRange || { start: '08:00', end: '22:00' }, - contentTypes: task.contentTypes || ['text', 'image', 'video'], + timeRange: task.timeRange || { start: "08:00", end: "22:00" }, + contentTypes: task.contentTypes || ["text", "image", "video"], targetTags: task.targetTags || [], - syncMode: task.syncMode || 'auto', + syncMode: task.syncMode || "auto", filterKeywords: task.filterKeywords || [], - contentLib: task.config?.contentLibraryNames?.join(',') || '默认内容库' + contentLib: task.config?.contentLibraryNames?.join(",") || "默认内容库", })); setTasks(mappedTasks); } catch (error) { @@ -137,17 +235,25 @@ export default function MomentsSync() { if (!taskToDelete) return; if (!window.confirm(`确定要删除"${taskToDelete.name}"吗?`)) return; - + try { const response = await deleteMomentsSyncTask(id); if (response.code === 200) { toast({ title: "删除成功" }); fetchTasks(); } else { - toast({ title: "删除失败", description: response.msg || "请稍后重试", variant: "destructive" }); + toast({ + title: "删除失败", + description: response.msg || "请稍后重试", + variant: "destructive", + }); } } catch (error) { - toast({ title: "删除失败", description: "请稍后重试", variant: "destructive" }); + toast({ + title: "删除失败", + description: "请稍后重试", + variant: "destructive", + }); } }; @@ -166,18 +272,26 @@ export default function MomentsSync() { toast({ title: "复制成功" }); fetchTasks(); } else { - toast({ title: "复制失败", description: response.msg || "请稍后重试", variant: "destructive" }); + toast({ + title: "复制失败", + description: response.msg || "请稍后重试", + variant: "destructive", + }); } } catch (error) { - toast({ title: "复制失败", description: "请稍后重试", variant: "destructive" }); + toast({ + title: "复制失败", + description: "请稍后重试", + variant: "destructive", + }); } }; const toggleTaskStatus = async (id: string, status: number) => { // 先更新本地状态 const newStatus = (status === 1 ? 2 : 1) as 1 | 2; - setTasks(prevTasks => - prevTasks.map(task => + setTasks((prevTasks) => + prevTasks.map((task) => task.id === id ? { ...task, status: newStatus } : task ) ); @@ -189,40 +303,48 @@ export default function MomentsSync() { // 成功时不刷新列表,保持本地状态 } else { // 请求失败,回退本地状态 - setTasks(prevTasks => - prevTasks.map(task => + setTasks((prevTasks) => + prevTasks.map((task) => task.id === id ? { ...task, status: status as 1 | 2 } : task ) ); - toast({ title: "操作失败", description: response.msg || "请稍后重试", variant: "destructive" }); + toast({ + title: "操作失败", + description: response.msg || "请稍后重试", + variant: "destructive", + }); } } catch (error) { // 请求异常,回退本地状态 - setTasks(prevTasks => - prevTasks.map(task => + setTasks((prevTasks) => + prevTasks.map((task) => task.id === id ? { ...task, status: status as 1 | 2 } : task ) ); - toast({ title: "操作失败", description: "请稍后重试", variant: "destructive" }); + toast({ + title: "操作失败", + description: "请稍后重试", + variant: "destructive", + }); } }; const handleCreateNew = () => { - navigate('/workspace/moments-sync/new'); + navigate("/workspace/moments-sync/new"); }; const filteredTasks = tasks.filter((task) => - task.name.toLowerCase().includes(searchTerm.toLowerCase()), + task.name.toLowerCase().includes(searchTerm.toLowerCase()) ); const getStatusText = (status: number) => { switch (status) { case 1: - return '进行中'; + return "进行中"; case 2: - return '已暂停'; + return "已暂停"; default: - return '未知'; + return "未知"; } }; @@ -231,13 +353,18 @@ export default function MomentsSync() {
-

朋友圈同步

@@ -246,14 +373,19 @@ export default function MomentsSync() {
- setSearchTerm(e.target.value)} />
-
@@ -94,26 +104,45 @@ export default function MomentsSyncPage() { ) : filteredTasks.length === 0 ? ( 暂无任务 ) : ( - filteredTasks.map(task => ( - + filteredTasks.map((task) => ( +
{task.name} - - {task.status === 1 ? '进行中' : '已暂停'} + + {task.status === 1 ? "进行中" : "已暂停"}
-
上次同步:{task.lastSyncTime || '无'}
-
已同步:{task.syncCount || 0} 条
+
+ 上次同步:{task.lastSyncTime || "无"} +
+
+ 已同步:{task.syncCount || 0} 条 +
- -
@@ -123,4 +152,4 @@ export default function MomentsSyncPage() {
); -} \ No newline at end of file +}