From 77148dff3a947ce441ba4f377b6f1ab144c9b2fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AC=94=E8=AE=B0=E6=9C=AC=E9=87=8C=E7=9A=84=E6=B0=B8?= =?UTF-8?q?=E5=B9=B3?= Date: Fri, 18 Jul 2025 22:16:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9C=AC=E6=AC=A1=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=86=85=E5=AE=B9=E5=A6=82=E4=B8=8B=20?= =?UTF-8?q?=E6=97=A7=E9=A1=B9=E7=9B=AE=E6=8A=A2=E6=95=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/workspace/moments-sync/Detail.tsx | 11 +- .../src/pages/workspace/moments-sync/new.tsx | 200 +++++++++++------- 2 files changed, 130 insertions(+), 81 deletions(-) diff --git a/Cunkebao/src/pages/workspace/moments-sync/Detail.tsx b/Cunkebao/src/pages/workspace/moments-sync/Detail.tsx index 8500a585..f4f6e1cc 100644 --- a/Cunkebao/src/pages/workspace/moments-sync/Detail.tsx +++ b/Cunkebao/src/pages/workspace/moments-sync/Detail.tsx @@ -123,7 +123,7 @@ export default function MomentsSyncDetail() { > -

朋友圈同步任务详情

+

任务详情

} - footer={} >
@@ -172,12 +171,16 @@ export default function MomentsSyncDetail() {
内容库 - {task.contentLib || "未设置"} + {task.config?.contentLibraries + .map((item: any) => item.name) + .join(",")}
已同步 - {task.syncCount} 条 + + {task.config?.syncCount} 条 +
创建人 diff --git a/Cunkebao/src/pages/workspace/moments-sync/new.tsx b/Cunkebao/src/pages/workspace/moments-sync/new.tsx index b575393f..188d321c 100644 --- a/Cunkebao/src/pages/workspace/moments-sync/new.tsx +++ b/Cunkebao/src/pages/workspace/moments-sync/new.tsx @@ -1,14 +1,18 @@ -import React, { useState, useEffect, useCallback } from 'react'; -import { useNavigate, useParams } from 'react-router-dom'; -import { Button } from '@/components/ui/button'; -import { Input } from '@/components/ui/input'; -import { Switch } from '@/components/ui/switch'; -import { useToast } from '@/components/ui/toast'; -import { createMomentsSyncTask, updateMomentsSyncTask, fetchMomentsSyncTaskDetail } from '@/api/momentsSync'; -import { ChevronLeft } from 'lucide-react'; -import { DeviceSelectionDialog } from '@/components/DeviceSelectionDialog'; -import { ContentLibrarySelectionDialog } from '@/components/ContentLibrarySelectionDialog'; -import { ContentType } from '@/types/moments-sync'; +import React, { useState, useEffect, useCallback } from "react"; +import { useNavigate, useParams } from "react-router-dom"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Switch } from "@/components/ui/switch"; +import { useToast } from "@/components/ui/toast"; +import { + createMomentsSyncTask, + updateMomentsSyncTask, + fetchMomentsSyncTaskDetail, +} from "@/api/momentsSync"; +import { ChevronLeft } from "lucide-react"; +import { DeviceSelectionDialog } from "@/components/DeviceSelectionDialog"; +import { ContentLibrarySelectionDialog } from "@/components/ContentLibrarySelectionDialog"; +import { ContentType } from "@/types/moments-sync"; // 步骤指示器组件 interface StepIndicatorProps { @@ -25,36 +29,41 @@ function StepIndicator({ currentStep }: StepIndicatorProps) { return (
{/* 连线 - 背景线 */} -
- - {/* 连线 - 已完成线 */} -
- + + {/* 连线 - 已完成线 */} +
+ {/* 步骤圆圈 */} {steps.map((step, index) => (
-
{index + 1}
-
+
{step.title}
@@ -70,18 +79,19 @@ export default function NewMomentsSyncTask() { const [currentStep, setCurrentStep] = useState(1); const [loading, setLoading] = useState(false); const [deviceDialogOpen, setDeviceDialogOpen] = useState(false); - const [contentLibraryDialogOpen, setContentLibraryDialogOpen] = useState(false); + const [contentLibraryDialogOpen, setContentLibraryDialogOpen] = + useState(false); const [formData, setFormData] = useState({ - taskName: '', - startTime: '06:00', - endTime: '23:59', + taskName: "", + startTime: "06:00", + endTime: "23:59", syncCount: 5, interval: 30, // 同步间隔,单位:分钟 - accountType: 'business' as 'business' | 'personal', + accountType: "business" as "business" | "personal", enabled: true, selectedDevices: [] as string[], selectedLibraries: [] as string[], - contentTypes: ['text', 'image', 'video'] as ContentType[], + contentTypes: ["text", "image", "video"] as ContentType[], targetTags: [] as string[], filterKeywords: [] as string[], }); @@ -109,21 +119,21 @@ export default function NewMomentsSyncTask() { if (taskData) { setFormData({ taskName: taskData.name, - startTime: taskData.timeRange?.start || '06:00', - endTime: taskData.timeRange?.end || '23:59', - syncCount: taskData.maxSyncPerDay || 5, + startTime: taskData.timeRange?.start || "06:00", + endTime: taskData.timeRange?.end || "23:59", + syncCount: taskData?.config?.syncCount || 0, interval: taskData.syncInterval || 30, - accountType: taskData.syncMode === 'auto' ? 'business' : 'personal', + accountType: taskData.syncMode === "auto" ? "business" : "personal", enabled: taskData.status === 1, selectedDevices: taskData.devices || [], selectedLibraries: taskData.contentLib ? [taskData.contentLib] : [], - contentTypes: taskData.contentTypes || ['text', 'image', 'video'], + contentTypes: taskData.contentTypes || ["text", "image", "video"], targetTags: taskData.targetTags || [], filterKeywords: taskData.filterKeywords || [], }); } } catch (error) { - toast({ title: '获取任务详情失败', variant: 'destructive' }); + toast({ title: "获取任务详情失败", variant: "destructive" }); } finally { setLoading(false); } @@ -137,15 +147,15 @@ export default function NewMomentsSyncTask() { const handleComplete = async () => { if (!formData.taskName.trim()) { - toast({ title: '请输入任务名称', variant: 'destructive' }); + toast({ title: "请输入任务名称", variant: "destructive" }); return; } if (formData.selectedDevices.length === 0) { - toast({ title: '请选择设备', variant: 'destructive' }); + toast({ title: "请选择设备", variant: "destructive" }); return; } if (formData.selectedLibraries.length === 0) { - toast({ title: '请选择内容库', variant: 'destructive' }); + toast({ title: "请选择内容库", variant: "destructive" }); return; } @@ -157,10 +167,10 @@ export default function NewMomentsSyncTask() { contentLibraries: formData.selectedLibraries, syncInterval: formData.interval, syncCount: formData.syncCount, - syncType: formData.accountType === 'business' ? 1 : 2, + syncType: formData.accountType === "business" ? 1 : 2, startTime: formData.startTime, endTime: formData.endTime, - accountType: formData.accountType === 'business' ? 1 : 2, + accountType: formData.accountType === "business" ? 1 : 2, contentTypes: formData.contentTypes, targetTags: formData.targetTags, filterKeywords: formData.filterKeywords, @@ -171,15 +181,18 @@ export default function NewMomentsSyncTask() { id, ...taskData, }); - toast({ title: '更新成功' }); + toast({ title: "更新成功" }); navigate(`/workspace/moments-sync/${id}`); } else { await createMomentsSyncTask(taskData); - toast({ title: '创建成功' }); - navigate('/workspace/moments-sync'); + toast({ title: "创建成功" }); + navigate("/workspace/moments-sync"); } } catch (error) { - toast({ title: isEditMode ? '更新失败' : '创建失败', variant: 'destructive' }); + toast({ + title: isEditMode ? "更新失败" : "创建失败", + variant: "destructive", + }); } finally { setLoading(false); } @@ -202,8 +215,12 @@ export default function NewMomentsSyncTask() {
每日同步数量
- 分钟
-
设置每次发朋友圈的时间间隔
+
+ 设置每次发朋友圈的时间间隔 +
@@ -251,7 +278,9 @@ export default function NewMomentsSyncTask() { handleUpdateFormData({ startTime: e.target.value })} + onChange={(e) => + handleUpdateFormData({ startTime: e.target.value }) + } className="h-12 rounded-lg border-gray-200 text-base" />
@@ -260,7 +289,9 @@ export default function NewMomentsSyncTask() { handleUpdateFormData({ endTime: e.target.value })} + onChange={(e) => + handleUpdateFormData({ endTime: e.target.value }) + } className="h-12 rounded-lg border-gray-200 text-base" />
@@ -297,7 +328,9 @@ export default function NewMomentsSyncTask() { 是否启用 handleUpdateFormData({ enabled: checked })} + onCheckedChange={(checked) => + handleUpdateFormData({ enabled: checked }) + } className="data-[state=checked]:bg-blue-600 h-7 w-12" />
@@ -316,7 +349,12 @@ export default function NewMomentsSyncTask() {
-

新建朋友圈同步

@@ -327,7 +365,7 @@ export default function NewMomentsSyncTask() { {currentStep === 1 && renderBasicSettings()} - + {currentStep === 2 && (
setDeviceDialogOpen(true)} readOnly /> - + {formData.selectedDevices.length > 0 && (
已选设备:{formData.selectedDevices.length} 个
)} - +
-
- +
)} - + {currentStep === 3 && (
setContentLibraryDialogOpen(true)} readOnly /> - + {formData.selectedLibraries.length > 0 && (
已选内容库:{formData.selectedLibraries.length} 个
)} - +
-
- +
); -} \ No newline at end of file +}