账号类型
diff --git a/Cunkebao/app/workspace/moments-sync/components/content-library-selection-dialog.tsx b/Cunkebao/app/workspace/moments-sync/components/content-library-selection-dialog.tsx
new file mode 100644
index 00000000..51d2bf96
--- /dev/null
+++ b/Cunkebao/app/workspace/moments-sync/components/content-library-selection-dialog.tsx
@@ -0,0 +1,114 @@
+"use client"
+
+import { useState } from "react"
+import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"
+import { Input } from "@/components/ui/input"
+import { Button } from "@/components/ui/button"
+import { Search, CheckCircle2, Circle } from "lucide-react"
+import { ScrollArea } from "@/components/ui/scroll-area"
+
+interface ContentLibrarySelectionDialogProps {
+ open: boolean
+ onOpenChange: (open: boolean) => void
+ selectedLibraries: string[]
+ onSelect: (libraries: string[]) => void
+}
+
+export function ContentLibrarySelectionDialog({
+ open,
+ onOpenChange,
+ selectedLibraries,
+ onSelect,
+}: ContentLibrarySelectionDialogProps) {
+ const [searchQuery, setSearchQuery] = useState("")
+ const [libraries] = useState([
+ { id: "1", name: "卡若朋友圈", count: 58 },
+ { id: "2", name: "暗黑4代练", count: 422 },
+ { id: "3", name: "家装设计", count: 107 },
+ { id: "4", name: "美食分享", count: 321 },
+ { id: "5", name: "旅游攻略", count: 89 },
+ ])
+
+ const [tempSelectedLibraries, setTempSelectedLibraries] = useState
(selectedLibraries)
+
+ const toggleLibrary = (libraryId: string) => {
+ setTempSelectedLibraries((prev) =>
+ prev.includes(libraryId) ? prev.filter((id) => id !== libraryId) : [...prev, libraryId]
+ )
+ }
+
+ const handleConfirm = () => {
+ onSelect(tempSelectedLibraries)
+ onOpenChange(false)
+ }
+
+ const handleCancel = () => {
+ setTempSelectedLibraries(selectedLibraries)
+ onOpenChange(false)
+ }
+
+ const filteredLibraries = libraries.filter((library) =>
+ library.name.toLowerCase().includes(searchQuery.toLowerCase())
+ )
+
+ return (
+
+
+
+ 选择内容库
+
+
+
+
+
+ setSearchQuery(e.target.value)}
+ />
+
+
+
+
+ {filteredLibraries.map((library) => (
+
toggleLibrary(library.id)}
+ >
+
+
{library.name}
+
{library.count}条内容
+
+ {tempSelectedLibraries.includes(library.id) ? (
+
+ ) : (
+
+ )}
+
+ ))}
+
+
+
+
+
+
+ 取消
+
+
+ 确定 ({tempSelectedLibraries.length})
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/Cunkebao/app/workspace/moments-sync/new/page.tsx b/Cunkebao/app/workspace/moments-sync/new/page.tsx
index a1f71049..5125010f 100644
--- a/Cunkebao/app/workspace/moments-sync/new/page.tsx
+++ b/Cunkebao/app/workspace/moments-sync/new/page.tsx
@@ -7,19 +7,34 @@ import { Button } from "@/components/ui/button"
import { StepIndicator } from "../components/step-indicator"
import { BasicSettings } from "../components/basic-settings"
import { DeviceSelectionDialog } from "../components/device-selection-dialog"
+import { ContentLibrarySelectionDialog } from "../components/content-library-selection-dialog"
import { Input } from "@/components/ui/input"
-import { toast } from "@/components/ui/use-toast"
+import { api, ApiResponse } from "@/lib/api"
+import { showToast } from "@/lib/toast"
+
+// 定义基本设置表单数据类型,与BasicSettings组件的formData类型匹配
+interface BasicSettingsFormData {
+ taskName: string
+ startTime: string
+ endTime: string
+ syncCount: number
+ syncInterval: number
+ accountType: "business" | "personal"
+ enabled: boolean
+}
export default function NewMomentsSyncPage() {
const router = useRouter()
const [currentStep, setCurrentStep] = useState(1)
const [deviceDialogOpen, setDeviceDialogOpen] = useState(false)
+ const [libraryDialogOpen, setLibraryDialogOpen] = useState(false)
const [formData, setFormData] = useState({
taskName: "",
startTime: "06:00",
endTime: "23:59",
syncCount: 5,
- accountType: "business" as const,
+ syncInterval: 30, // 同步间隔,默认30分钟
+ accountType: "business" as "business" | "personal",
enabled: true,
selectedDevices: [] as string[],
selectedLibraries: [] as string[],
@@ -29,6 +44,11 @@ export default function NewMomentsSyncPage() {
setFormData((prev) => ({ ...prev, ...data }))
}
+ // 专门用于基本设置的更新函数
+ const handleBasicSettingsUpdate = (data: Partial) => {
+ setFormData((prev) => ({ ...prev, ...data }))
+ }
+
const handleNext = () => {
setCurrentStep((prev) => Math.min(prev + 1, 3))
}
@@ -38,13 +58,31 @@ export default function NewMomentsSyncPage() {
}
const handleComplete = async () => {
- console.log("Form submitted:", formData)
- await new Promise((resolve) => setTimeout(resolve, 1000))
- toast({
- title: "创建成���",
- description: "朋友圈同步任务已创建并开始执行",
- })
- router.push("/workspace/moments-sync")
+ try {
+ const response = await api.post('/v1/workbench/create', {
+ type: 2, // 朋友圈同步任务类型为2
+ name: formData.taskName,
+ syncInterval: formData.syncInterval,
+ syncCount: formData.syncCount,
+ syncType: formData.accountType === "business" ? 1 : 2, // 业务号为1,人设号为2
+ startTime: formData.startTime,
+ endTime: formData.endTime,
+ accountType: formData.accountType === "business" ? 1 : 2,
+ status: formData.enabled ? 1 : 0, // 状态:0=禁用,1=启用
+ devices: formData.selectedDevices,
+ contentLibraries: formData.selectedLibraries
+ });
+
+ if (response.code === 200) {
+ showToast(response.msg || "创建成功", "success");
+ router.push("/workspace/moments-sync");
+ } else {
+ showToast(response.msg || "请稍后再试", "error");
+ }
+ } catch (error: any) {
+ console.error("创建朋友圈同步任务失败:", error);
+ showToast(error?.message || "请检查网络连接或稍后再试", "error");
+ }
}
return (
@@ -63,7 +101,19 @@ export default function NewMomentsSyncPage() {
{currentStep === 1 && (
-
+
)}
{currentStep === 2 && (
@@ -75,6 +125,7 @@ export default function NewMomentsSyncPage() {
className="h-12 pl-11 rounded-xl border-gray-200 text-base"
onClick={() => setDeviceDialogOpen(true)}
readOnly
+ value={formData.selectedDevices.length > 0 ? `已选择 ${formData.selectedDevices.length} 个设备` : ""}
/>
@@ -89,6 +140,7 @@ export default function NewMomentsSyncPage() {
下一步
@@ -110,9 +162,19 @@ export default function NewMomentsSyncPage() {
-
+ setLibraryDialogOpen(true)}
+ readOnly
+ value={formData.selectedLibraries.length > 0 ? `已选择 ${formData.selectedLibraries.length} 个内容库` : ""}
+ />
+ {formData.selectedLibraries.length > 0 && (
+
已选内容库:{formData.selectedLibraries.length} 个
+ )}
+
上一步
@@ -120,10 +182,21 @@ export default function NewMomentsSyncPage() {
完成
+
+
{
+ handleUpdateFormData({ selectedLibraries: libraries })
+ setLibraryDialogOpen(false)
+ }}
+ />
)}
diff --git a/Cunkebao/app/workspace/moments-sync/page.tsx b/Cunkebao/app/workspace/moments-sync/page.tsx
index 085756df..5a3a0336 100644
--- a/Cunkebao/app/workspace/moments-sync/page.tsx
+++ b/Cunkebao/app/workspace/moments-sync/page.tsx
@@ -1,7 +1,7 @@
"use client"
-import { useState } from "react"
-import { ChevronLeft, Plus, Filter, Search, RefreshCw, MoreVertical, Clock, Edit, Trash2, Eye } from "lucide-react"
+import { useState, useEffect } from "react"
+import { ChevronLeft, Plus, Filter, Search, RefreshCw, MoreVertical, Clock, Edit, Trash2, Eye, Copy } from "lucide-react"
import { Card } from "@/components/ui/card"
import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
@@ -10,6 +10,18 @@ import { Badge } from "@/components/ui/badge"
import { useRouter } from "next/navigation"
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"
import { Switch } from "@/components/ui/switch"
+import { api, ApiResponse } from "@/lib/api"
+import { showToast } from "@/lib/toast"
+import {
+ AlertDialog,
+ AlertDialogAction,
+ AlertDialogCancel,
+ AlertDialogContent,
+ AlertDialogDescription,
+ AlertDialogFooter,
+ AlertDialogHeader,
+ AlertDialogTitle
+} from "@/components/ui/alert-dialog"
interface SyncTask {
id: string
@@ -21,55 +33,146 @@ interface SyncTask {
lastSyncTime: string
createTime: string
creator: string
+ libraries?: string[]
}
export default function MomentsSyncPage() {
const router = useRouter()
- const [tasks, setTasks] = useState
([
- {
- id: "1",
- name: "同步卡若主号",
- deviceCount: 2,
- contentLib: "卡若朋友圈",
- syncCount: 307,
- lastSyncTime: "2025-02-06 13:12:35",
- createTime: "2024-11-20 19:04:14",
- creator: "karuo",
- status: "running",
- },
- {
- id: "2",
- name: "暗黑4业务",
- deviceCount: 1,
- contentLib: "暗黑4代练",
- syncCount: 622,
- lastSyncTime: "2024-03-04 14:09:35",
- createTime: "2024-03-04 14:29:04",
- creator: "lkdie",
- status: "paused",
- },
- ])
+ const [tasks, setTasks] = useState([])
+ const [isLoading, setIsLoading] = useState(true)
+ const [searchQuery, setSearchQuery] = useState("")
+ const [showDeleteAlert, setShowDeleteAlert] = useState(false)
+ const [taskToDelete, setTaskToDelete] = useState(null)
- const handleDelete = (taskId: string) => {
- setTasks(tasks.filter((task) => task.id !== taskId))
+ // 获取任务列表
+ const fetchTasks = async () => {
+ const loadingToast = showToast("正在加载任务列表...", "loading", true);
+ setIsLoading(true)
+ try {
+ const response = await api.get('/v1/workbench/list?type=2')
+ if (response.code === 200 && response.data) {
+ setTasks(response.data.list || [])
+ } else {
+ showToast(response.msg || "获取任务列表失败", "error")
+ }
+ } catch (error: any) {
+ console.error("获取朋友圈同步任务列表失败:", error)
+ showToast(error?.message || "请检查网络连接", "error")
+ } finally {
+ loadingToast.remove();
+ setIsLoading(false)
+ }
}
+ // 组件加载时获取任务列表
+ useEffect(() => {
+ fetchTasks()
+ }, [])
+
+ // 搜索任务
+ const handleSearch = () => {
+ fetchTasks()
+ }
+
+ // 切换任务状态
+ const toggleTaskStatus = async (taskId: string, currentStatus: "running" | "paused") => {
+ const loadingToast = showToast("正在更新任务状态...", "loading", true);
+ try {
+ const newStatus = currentStatus === "running" ? "paused" : "running"
+ const response = await api.post('/v1/workbench/update-status', {
+ id: taskId,
+ status: newStatus === "running" ? 1 : 0
+ })
+
+ if (response.code === 200) {
+ setTasks(
+ tasks.map((task) =>
+ task.id === taskId ? { ...task, status: newStatus } : task
+ )
+ )
+ loadingToast.remove();
+ showToast(`任务已${newStatus === "running" ? "启用" : "暂停"}`, "success")
+ } else {
+ loadingToast.remove();
+ showToast(response.msg || "操作失败", "error")
+ }
+ } catch (error: any) {
+ console.error("更新任务状态失败:", error)
+ loadingToast.remove();
+ showToast(error?.message || "更新任务状态失败", "error")
+ }
+ }
+
+ // 确认删除
+ const confirmDelete = (taskId: string) => {
+ setTaskToDelete(taskId)
+ setShowDeleteAlert(true)
+ }
+
+ // 执行删除
+ const handleDelete = async () => {
+ if (!taskToDelete) return
+
+ const loadingToast = showToast("正在删除任务...", "loading", true);
+ try {
+ const response = await api.delete(`/v1/workbench/delete?id=${taskToDelete}`)
+
+ if (response.code === 200) {
+ setTasks(tasks.filter((task) => task.id !== taskToDelete))
+ loadingToast.remove();
+ showToast("删除成功", "success")
+ } else {
+ loadingToast.remove();
+ showToast(response.msg || "删除失败", "error")
+ }
+ } catch (error: any) {
+ console.error("删除任务失败:", error)
+ loadingToast.remove();
+ showToast(error?.message || "删除任务失败", "error")
+ } finally {
+ setTaskToDelete(null)
+ setShowDeleteAlert(false)
+ }
+ }
+
+ // 编辑任务
const handleEdit = (taskId: string) => {
router.push(`/workspace/moments-sync/${taskId}/edit`)
}
+ // 查看任务详情
const handleView = (taskId: string) => {
router.push(`/workspace/moments-sync/${taskId}`)
}
- const toggleTaskStatus = (taskId: string) => {
- setTasks(
- tasks.map((task) =>
- task.id === taskId ? { ...task, status: task.status === "running" ? "paused" : "running" } : task,
- ),
- )
+ // 复制任务
+ const handleCopy = async (taskId: string) => {
+ const loadingToast = showToast("正在复制任务...", "loading", true);
+ try {
+ const response = await api.post('/v1/workbench/copy', {
+ id: taskId
+ })
+
+ if (response.code === 200) {
+ loadingToast.remove();
+ showToast("复制成功", "success")
+ fetchTasks() // 重新获取列表
+ } else {
+ loadingToast.remove();
+ showToast(response.msg || "复制失败", "error")
+ }
+ } catch (error: any) {
+ console.error("复制任务失败:", error)
+ loadingToast.remove();
+ showToast(error?.message || "复制任务失败", "error")
+ }
}
+ // 过滤任务
+ const filteredTasks = tasks.filter(
+ (task) => task.name.toLowerCase().includes(searchQuery.toLowerCase())
+ )
+
return (