From c75b8d596df5e0b9f707e8a65aa2921e33d2686e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E6=B0=B8=E5=B9=B3?= Date: Wed, 9 Jul 2025 19:13:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9A=82=E6=97=B6=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nkebao/package-lock.json | 4 +- nkebao/src/App.tsx | 2 + nkebao/src/components/ui/input.tsx | 17 +- .../workspace/ai-assistant/AIAssistant.tsx | 3 +- .../pages/workspace/auto-like/NewAutoLike.tsx | 269 +----------- .../pages/workspace/moments-sync/Detail.tsx | 270 +++++++----- .../src/pages/workspace/moments-sync/edit.tsx | 18 +- .../src/pages/workspace/moments-sync/new.tsx | 405 +++++++++++++----- .../TrafficDistribution.tsx | 47 +- nkebao/yarn.lock | 4 +- 10 files changed, 518 insertions(+), 521 deletions(-) diff --git a/nkebao/package-lock.json b/nkebao/package-lock.json index a42dd996..bd8cbdaa 100644 --- a/nkebao/package-lock.json +++ b/nkebao/package-lock.json @@ -30,7 +30,7 @@ "@radix-ui/react-scroll-area": "latest", "@radix-ui/react-select": "latest", "@radix-ui/react-separator": "^1.1.1", - "@radix-ui/react-slider": "latest", + "@radix-ui/react-slider": "^1.3.5", "@radix-ui/react-slot": "^1.1.1", "@radix-ui/react-switch": "latest", "@radix-ui/react-tabs": "latest", @@ -70,7 +70,7 @@ "recharts": "latest", "regenerator-runtime": "latest", "sonner": "^1.7.4", - "tailwind-merge": "^2.5.5", + "tailwind-merge": "^2.6.0", "tailwindcss-animate": "^1.0.7", "tdesign-mobile-react": "^0.16.0", "vaul": "^0.9.6", diff --git a/nkebao/src/App.tsx b/nkebao/src/App.tsx index 8a00028d..7382c97e 100644 --- a/nkebao/src/App.tsx +++ b/nkebao/src/App.tsx @@ -21,6 +21,7 @@ import AutoGroupDetail from './pages/workspace/auto-group/Detail'; import GroupPush from './pages/workspace/group-push/GroupPush'; import MomentsSync from './pages/workspace/moments-sync/MomentsSync'; import MomentsSyncDetail from './pages/workspace/moments-sync/Detail'; +import NewMomentsSync from './pages/workspace/moments-sync/new'; import EditMomentsSync from './pages/workspace/moments-sync/edit'; import AIAssistant from './pages/workspace/ai-assistant/AIAssistant'; import TrafficDistribution from './pages/workspace/traffic-distribution/TrafficDistribution'; @@ -66,6 +67,7 @@ function App() { } /> } /> } /> + } /> } /> } /> } /> diff --git a/nkebao/src/components/ui/input.tsx b/nkebao/src/components/ui/input.tsx index f7673113..4e6dac84 100644 --- a/nkebao/src/components/ui/input.tsx +++ b/nkebao/src/components/ui/input.tsx @@ -13,6 +13,11 @@ interface InputProps { type?: string; min?: number; max?: number; + name?: string; + required?: boolean; + disabled?: boolean; + autoComplete?: string; + step?: number; } export function Input({ @@ -27,7 +32,12 @@ export function Input({ id, type = 'text', min, - max + max, + name, + required = false, + disabled = false, + autoComplete, + step }: InputProps) { const isReadOnly = readOnly || readonly; @@ -43,6 +53,11 @@ export function Input({ readOnly={isReadOnly} min={min} max={max} + name={name} + required={required} + disabled={disabled} + autoComplete={autoComplete} + step={step} className={`flex h-10 w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm ring-offset-white file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-gray-500 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 ${className}`} /> ); diff --git a/nkebao/src/pages/workspace/ai-assistant/AIAssistant.tsx b/nkebao/src/pages/workspace/ai-assistant/AIAssistant.tsx index 281e5a08..594b745d 100644 --- a/nkebao/src/pages/workspace/ai-assistant/AIAssistant.tsx +++ b/nkebao/src/pages/workspace/ai-assistant/AIAssistant.tsx @@ -1,5 +1,5 @@ import React, { useState, useRef, useEffect } from 'react'; -import { useNavigate } from 'react-router-dom'; + import { Send, Settings, @@ -45,7 +45,6 @@ interface Conversation { } export default function AIAssistant() { - const navigate = useNavigate(); const { toast } = useToast(); const [conversations, setConversations] = useState([]); const [currentConversation, setCurrentConversation] = useState(null); diff --git a/nkebao/src/pages/workspace/auto-like/NewAutoLike.tsx b/nkebao/src/pages/workspace/auto-like/NewAutoLike.tsx index ac6f0edf..59f0be50 100644 --- a/nkebao/src/pages/workspace/auto-like/NewAutoLike.tsx +++ b/nkebao/src/pages/workspace/auto-like/NewAutoLike.tsx @@ -12,20 +12,16 @@ import { ScrollArea } from '@/components/ui/scroll-area'; import { Checkbox } from '@/components/ui/checkbox'; import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; + import { createAutoLikeTask, updateAutoLikeTask, fetchAutoLikeTaskDetail } from '@/api/autoLike'; import { ContentType } from '@/types/auto-like'; import { useToast } from '@/components/ui/toast'; import Layout from '@/components/Layout'; import { fetchDeviceList } from '@/api/devices'; -import type { Device } from '@/types/device'; + import { get } from '@/api/request'; -interface TagGroup { - id: string; - name: string; - tags: string[]; -} + // 用于设备选择弹窗的简化设备类型 interface DeviceSelectionItem { @@ -177,7 +173,7 @@ export default function NewAutoLike() { // 处理状态字段,使用双等号允许类型自动转换 const status = taskAny.status; - setAutoEnabled(status == 1 || status == 'running'); + setAutoEnabled(status === 1 || status === 'running'); } else { toast({ title: '获取任务详情失败', @@ -199,44 +195,7 @@ export default function NewAutoLike() { } }; - // 标签组数据 - const [tagGroups] = useState([ - { - id: 'intention', - name: '意向度', - tags: ['高意向', '中意向', '低意向'], - }, - { - id: 'customer', - name: '客户类型', - tags: ['新客户', '老客户', 'VIP客户'], - }, - { - id: 'gender', - name: '性别', - tags: ['男性', '女性'], - }, - { - id: 'age', - name: '年龄段', - tags: ['年轻人', '中年人', '老年人'], - }, - { - id: 'location', - name: '地区', - tags: ['城市', '农村'], - }, - { - id: 'income', - name: '收入', - tags: ['高收入', '中等收入', '低收入'], - }, - { - id: 'interaction', - name: '互动频率', - tags: ['高频互动', '中频互动', '低频互动'], - }, - ]); + const handleUpdateFormData = (data: Partial) => { setFormData((prev) => ({ ...prev, ...data })); @@ -827,203 +786,7 @@ function DeviceSelectionDialog({ open, onOpenChange, selectedDevices, onSelect, ); } -// 标签选择器组件 -interface TagSelectorProps { - selectedTags: string[]; - tagOperator: 'and' | 'or'; - onTagsChange: (tags: string[]) => void; - onOperatorChange: (operator: 'and' | 'or') => void; - onBack: () => void; - onComplete: () => void; - tagGroups: TagGroup[]; -} - -function TagSelector({ - selectedTags, - tagOperator, - onTagsChange, - onOperatorChange, - onBack, - onComplete, - tagGroups, -}: TagSelectorProps) { - const [searchQuery, setSearchQuery] = useState(''); - const [customTag, setCustomTag] = useState(''); - - const toggleTag = (tag: string) => { - if (selectedTags.includes(tag)) { - onTagsChange(selectedTags.filter((t) => t !== tag)); - } else { - onTagsChange([...selectedTags, tag]); - } - }; - - const addCustomTag = () => { - if (customTag.trim() && !selectedTags.includes(customTag.trim())) { - onTagsChange([...selectedTags, customTag.trim()]); - setCustomTag(''); - } - }; - - const removeTag = (tag: string) => { - onTagsChange(selectedTags.filter((t) => t !== tag)); - }; - - const filteredTagGroups = tagGroups - .map((group) => ({ - ...group, - tags: group.tags.filter((tag) => tag.toLowerCase().includes(searchQuery.toLowerCase())), - })) - .filter((group) => group.tags.length > 0); - - return ( - - -
-
-
-

选择目标人群标签

-
- -
- - setSearchQuery(e.target.value)} - /> -
- - - - {tagGroups.slice(0, 4).map((group) => ( - - {group.name} - - ))} - - {tagGroups.map((group) => ( - -
- {group.tags.map((tag) => ( - toggleTag(tag)} - > - {selectedTags.includes(tag) && } - {tag} - - ))} -
-
- ))} -
- - -
- {filteredTagGroups.length > 0 ? ( - filteredTagGroups.map((group) => ( -
-

{group.name}

-
- {group.tags.map((tag) => ( -
- toggleTag(tag)} - /> - -
- ))} -
-
- )) - ) : ( -
没有找到匹配的标签
- )} -
-
- -
-
- - setCustomTag(e.target.value)} - className="pl-9" - placeholder="添加自定义标签" - onKeyDown={(e) => e.key === 'Enter' && addCustomTag()} - /> -
- -
-
- -
-

标签匹配逻辑

-

选择多个标签之间的匹配关系

- - onOperatorChange(value as 'and' | 'or')} - className="flex flex-col space-y-2" - > -
- - -
-
- - -
-
-
- -
-

已选择的标签

-
- {selectedTags.length === 0 ? ( -

未选择任何标签

- ) : ( -
- {selectedTags.map((tag) => ( - - {tag} - - - ))} -
- )} -
-
- -
- - -
-
-
-
- ); -} + // 微信好友选择弹窗组件 interface FriendSelectionDialogProps { @@ -1096,27 +859,7 @@ function FriendSelectionDialog({ open, onOpenChange, selectedFriends = [], onSel } }; - const handleSelectAll = () => { - // 选择当前页面上所有好友 - const currentPageIds = filteredFriends.map(friend => friend.id); - const newSelectedFriends = [...selectedFriends]; - - // 添加未选中的好友 - currentPageIds.forEach(id => { - if (!selectedFriends.includes(id)) { - newSelectedFriends.push(id); - } - }); - - onSelect(newSelectedFriends); - }; - const handleUnselectAll = () => { - // 取消当前页面上所有好友的选择 - const currentPageIds = filteredFriends.map(friend => friend.id); - const newSelectedFriends = selectedFriends.filter(id => !currentPageIds.includes(id)); - onSelect(newSelectedFriends); - }; const handleConfirm = () => { onOpenChange(false); diff --git a/nkebao/src/pages/workspace/moments-sync/Detail.tsx b/nkebao/src/pages/workspace/moments-sync/Detail.tsx index b0536322..f3b061b1 100644 --- a/nkebao/src/pages/workspace/moments-sync/Detail.tsx +++ b/nkebao/src/pages/workspace/moments-sync/Detail.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useCallback } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { Button } from '@/components/ui/button'; import { Card } from '@/components/ui/card'; @@ -11,7 +11,9 @@ import { syncMoments } from '@/api/momentsSync'; import { MomentsSyncTask } from '@/types/moments-sync'; -import { ChevronLeft, Edit2, RefreshCw } from 'lucide-react'; +import { ChevronLeft, Edit2, RefreshCw, Clock, Database, Smartphone } from 'lucide-react'; +import Layout from '@/components/Layout'; +import BottomNav from '@/components/BottomNav'; export default function MomentsSyncDetail() { const { id } = useParams(); @@ -20,13 +22,7 @@ export default function MomentsSyncDetail() { const [task, setTask] = useState(null); const [loading, setLoading] = useState(false); - useEffect(() => { - if (id) { - fetchTaskDetail(); - } - }, [id]); - - const fetchTaskDetail = async () => { + const fetchTaskDetail = useCallback(async () => { if (!id) return; setLoading(true); try { @@ -39,9 +35,13 @@ export default function MomentsSyncDetail() { } finally { setLoading(false); } - }; - + }, [id, toast]); + useEffect(() => { + if (id) { + fetchTaskDetail(); + } + }, [id, fetchTaskDetail]); const handleToggleStatus = async () => { if (!task || !id) return; @@ -74,106 +74,178 @@ export default function MomentsSyncDetail() { if (loading) { return ( -
-
-
-

加载中...

+ +
+
+
+

加载中...

+
-
+ ); } if (!task) { return ( -
-
-

任务不存在

- + +
+
+

任务不存在

+ +
-
+ ); } - return ( -
- {/* Header */} -
-
-
- -

朋友圈同步任务详情

-
-
- - -
+ const header = ( +
+
+
+ +

朋友圈同步任务详情

+
+
+ +
-
- -
- {/* 基本信息卡片 */} - -
-
-

{task.name}

- - {task.status === 1 ? "进行中" : "已暂停"} - -
- -
- -
-
-

任务详情

-
-

推送设备:{task.deviceCount} 个

-

内容库:{task.contentLib || '未设置'}

-

已同步:{task.syncCount} 条

-

创建人:{task.creator}

-
-
-
-

时间信息

-
-

创建时间:{task.createTime}

-

上次同步:{task.lastSyncTime || '暂无'}

-

更新时间:{task.updateTime}

-
-
-
-

同步设置

-
-

同步间隔:{task.syncInterval} 秒

-

每日最大:{task.maxSyncPerDay} 条

-

时间范围:{task.timeRange.start} - {task.timeRange.end}

-

同步模式:{task.syncMode === 'auto' ? '自动' : '手动'}

-
-
-
-

今日统计

-
-

今日同步:{task.todaySyncCount} 条

-

总同步数:{task.totalSyncCount} 条

-

目标标签:{task.targetTags.length} 个

-

内容类型:{task.contentTypes.join(', ')}

-
-
-
-
- -
); + + return ( + }> +
+
+ {/* 基本信息卡片 */} + +
+
+

{task.name}

+ + {task.status === 1 ? "进行中" : "已暂停"} + +
+ +
+ +
+ {/* 任务详情 */} +
+

+ + 任务详情 +

+
+
+ 推送设备 + {task.deviceCount} 个 +
+
+ 内容库 + {task.contentLib || '未设置'} +
+
+ 已同步 + {task.syncCount} 条 +
+
+ 创建人 + {task.creator} +
+
+
+ + {/* 时间信息 */} +
+

+ + 时间信息 +

+
+
+ 创建时间 + {task.createTime} +
+
+ 上次同步 + {task.lastSyncTime || '暂无'} +
+
+ 更新时间 + {task.updateTime || '暂无'} +
+
+
+
+
+ + {/* 同步设置卡片 */} + +

+ + 同步设置 +

+
+
+
+ 同步间隔 + {task.syncInterval} 秒 +
+
+ 每日最大 + {task.maxSyncPerDay || 100} 条 +
+
+ 时间范围 + {task.timeRange.start} - {task.timeRange.end} +
+
+ 同步模式 + {task.syncMode === 'auto' ? '自动' : '手动'} +
+
+
+
+ 今日同步 + {task.todaySyncCount || 0} 条 +
+
+ 总同步数 + {task.totalSyncCount || task.syncCount || 0} 条 +
+
+ 目标标签 + {task.targetTags.length} 个 +
+
+ 内容类型 + {task.contentTypes.join(', ')} +
+
+
+
+ + {/* 同步记录卡片 */} + +

最近同步记录

+
+

暂无同步记录

+

任务开始执行后将显示同步记录

+
+
+
+
+
+ ); } \ No newline at end of file diff --git a/nkebao/src/pages/workspace/moments-sync/edit.tsx b/nkebao/src/pages/workspace/moments-sync/edit.tsx index 543c21e3..363920c8 100644 --- a/nkebao/src/pages/workspace/moments-sync/edit.tsx +++ b/nkebao/src/pages/workspace/moments-sync/edit.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useCallback } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; @@ -27,13 +27,7 @@ export default function EditMomentsSyncTask() { filterKeywords: '', }); - useEffect(() => { - if (id) { - fetchTaskDetail(); - } - }, [id]); - - const fetchTaskDetail = async () => { + const fetchTaskDetail = useCallback(async () => { if (!id) return; setLoading(true); try { @@ -59,7 +53,13 @@ export default function EditMomentsSyncTask() { } finally { setLoading(false); } - }; + }, [id, toast]); + + useEffect(() => { + if (id) { + fetchTaskDetail(); + } + }, [id, fetchTaskDetail]); const handleChange = (e: React.ChangeEvent) => { const { name, value } = e.target; diff --git a/nkebao/src/pages/workspace/moments-sync/new.tsx b/nkebao/src/pages/workspace/moments-sync/new.tsx index 77413c48..6ccb87c8 100644 --- a/nkebao/src/pages/workspace/moments-sync/new.tsx +++ b/nkebao/src/pages/workspace/moments-sync/new.tsx @@ -2,64 +2,243 @@ import React, { useState } from 'react'; import { useNavigate } 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 } from '@/api/momentsSync'; +import { ChevronLeft, Clock, Plus, Minus, Search } from 'lucide-react'; +import Layout from '@/components/Layout'; +import BottomNav from '@/components/BottomNav'; + +// 步骤指示器组件 +interface StepIndicatorProps { + currentStep: number; +} + +function StepIndicator({ currentStep }: StepIndicatorProps) { + const steps = [ + { id: 1, title: "步骤 1", subtitle: "基础设置" }, + { id: 2, title: "步骤 2", subtitle: "设备选择" }, + { id: 3, title: "步骤 3", subtitle: "选择内容库" }, + ]; + + return ( +
+ {steps.map((step) => ( +
= step.id ? "text-blue-600" : "text-gray-400" + }`} + > +
= step.id + ? "bg-blue-600 text-white shadow-sm" + : "bg-white border border-gray-200 text-gray-400" + }`} + > + {step.id} +
+
{step.subtitle}
+
+ ))} +
+
+
+
+ ); +} + +// 基础设置组件 +interface BasicSettingsProps { + formData: { + taskName: string; + startTime: string; + endTime: string; + syncCount: number; + accountType: "business" | "personal"; + enabled: boolean; + }; + onChange: (data: Partial) => void; + onNext: () => void; +} + +function BasicSettings({ formData, onChange, onNext }: BasicSettingsProps) { + return ( +
+
+
+
任务名称
+ onChange({ taskName: e.target.value })} + placeholder="请输入任务名称" + className="h-12 border-0 border-b border-gray-200 rounded-none focus-visible:ring-0 focus-visible:border-blue-600 px-0 text-base" + /> +
+ +
+
允许发布时间段
+
+
+ onChange({ startTime: e.target.value })} + className="h-12 pl-10 rounded-xl border-gray-200 text-base" + /> + +
+ +
+ onChange({ endTime: e.target.value })} + className="h-12 pl-10 rounded-xl border-gray-200 text-base" + /> + +
+
+
+ +
+
每日同步数量
+
+ + {formData.syncCount} + + 条朋友圈 +
+
+ +
+
账号类型
+
+
+ +
+
+ +
+
+
+ +
+ 是否启用 + onChange({ enabled: checked })} + className="data-[state=checked]:bg-blue-600 h-7 w-12" + /> +
+
+ + +
+ ); +} export default function NewMomentsSyncTask() { const navigate = useNavigate(); const { toast } = useToast(); + const [currentStep, setCurrentStep] = useState(1); const [loading, setLoading] = useState(false); - const [form, setForm] = useState({ - name: '', - deviceIds: '', // 逗号分隔 - contentLib: '', - syncMode: 'auto', - syncInterval: '30', - maxSyncPerDay: '100', - timeStart: '08:00', - timeEnd: '22:00', - targetTags: '', // 逗号分隔 - contentTypes: '', // 逗号分隔 - filterKeywords: '', // 逗号分隔 + const [formData, setFormData] = useState({ + taskName: '', + startTime: '06:00', + endTime: '23:59', + syncCount: 5, + accountType: 'business' as 'business' | 'personal', + enabled: true, + selectedDevices: [] as string[], + selectedLibraries: [] as string[], }); - const handleChange = (e: React.ChangeEvent) => { - const { name, value } = e.target; - setForm(prev => ({ - ...prev, - [name]: value, - })); + const handleUpdateFormData = (data: Partial) => { + setFormData((prev) => ({ ...prev, ...data })); }; - const handleSubmit = async (e: React.FormEvent) => { - e.preventDefault(); - if (!form.name.trim()) { + const handleNext = () => { + setCurrentStep((prev) => Math.min(prev + 1, 3)); + }; + + const handlePrev = () => { + setCurrentStep((prev) => Math.max(prev - 1, 1)); + }; + + const handleComplete = async () => { + if (!formData.taskName.trim()) { toast({ title: '请输入任务名称', variant: 'destructive' }); return; } - if (!form.deviceIds.trim()) { - toast({ title: '请输入推送设备', variant: 'destructive' }); + if (formData.selectedDevices.length === 0) { + toast({ title: '请选择设备', variant: 'destructive' }); return; } - if (!form.contentLib.trim()) { - toast({ title: '请输入内容库', variant: 'destructive' }); + if (formData.selectedLibraries.length === 0) { + toast({ title: '请选择内容库', variant: 'destructive' }); return; } + setLoading(true); try { - await createMomentsSyncTask({ - name: form.name, - devices: form.deviceIds.split(',').map(s => s.trim()).filter(Boolean), - contentLib: form.contentLib, - syncMode: form.syncMode as 'auto' | 'manual', - interval: Number(form.syncInterval), - maxSync: Number(form.maxSyncPerDay), - startTime: form.timeStart, - endTime: form.timeEnd, - targetTags: form.targetTags.split(',').map(s => s.trim()).filter(Boolean), - contentTypes: form.contentTypes.split(',').map(s => s.trim()).filter(Boolean) as ('text' | 'image' | 'video' | 'link')[], - filterKeywords: form.filterKeywords.split(',').map(s => s.trim()).filter(Boolean), - }); + await createMomentsSyncTask({ + name: formData.taskName, + devices: formData.selectedDevices, + contentLib: formData.selectedLibraries.join(','), + syncMode: formData.accountType === 'business' ? 'auto' : 'manual', + interval: 30, + maxSync: formData.syncCount, + startTime: formData.startTime, + endTime: formData.endTime, + targetTags: [], + contentTypes: ['text', 'image', 'video'], + filterKeywords: [], + friends: [], + }); toast({ title: '创建成功' }); navigate('/workspace/moments-sync'); } catch (error) { @@ -69,67 +248,97 @@ export default function NewMomentsSyncTask() { } }; - return ( -
-
-

新建朋友圈同步任务

-
-
- - -
-
- - -
-
- - -
-
- - -
-
-
- - -
-
- - -
-
-
-
- - -
-
- - -
-
-
- - -
-
- - -
-
- - -
-
- -
-
+ const header = ( +
+
+ +

新建朋友圈同步

); + + return ( + }> +
+
+ + +
+ {currentStep === 1 && ( + + )} + + {currentStep === 2 && ( +
+
+ + { + // TODO: 打开设备选择弹窗 + toast({ title: '设备选择功能开发中' }); + }} + readOnly + /> +
+ + {formData.selectedDevices.length > 0 && ( +
已选设备:{formData.selectedDevices.length} 个
+ )} + +
+ + +
+
+ )} + + {currentStep === 3 && ( +
+
+ + { + // TODO: 打开内容库选择弹窗 + toast({ title: '内容库选择功能开发中' }); + }} + readOnly + /> +
+ + {formData.selectedLibraries.length > 0 && ( +
已选内容库:{formData.selectedLibraries.join(', ')}
+ )} + +
+ + +
+
+ )} +
+
+
+
+ ); } \ No newline at end of file diff --git a/nkebao/src/pages/workspace/traffic-distribution/TrafficDistribution.tsx b/nkebao/src/pages/workspace/traffic-distribution/TrafficDistribution.tsx index 134a2312..a34c40e8 100644 --- a/nkebao/src/pages/workspace/traffic-distribution/TrafficDistribution.tsx +++ b/nkebao/src/pages/workspace/traffic-distribution/TrafficDistribution.tsx @@ -10,7 +10,7 @@ import { Edit, Trash2, Pause, - Users, + Share2, } from 'lucide-react'; import { Card } from '@/components/ui/card'; @@ -18,7 +18,7 @@ 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 { Progress } from '@/components/ui/progress'; + // 不再使用 DropdownMenu 组件 // import { // DropdownMenu, @@ -101,26 +101,7 @@ export default function TrafficDistribution() { navigate(`/workspace/traffic-distribution/${ruleId}/edit`); }; - const handleView = (ruleId: string) => { - navigate(`/workspace/traffic-distribution/${ruleId}`); - }; - const handleCopy = (ruleId: string) => { - const ruleToCopy = tasks.find((rule) => rule.id === ruleId); - if (ruleToCopy) { - const newRule = { - ...ruleToCopy, - id: `${Date.now()}`, - name: `${ruleToCopy.name} (复制)`, - createTime: new Date().toISOString().replace('T', ' ').substring(0, 19), - }; - setTasks([...tasks, newRule]); - toast({ - title: '复制成功', - description: '已成功复制分发规则', - }); - } - }; const toggleRuleStatus = (ruleId: string) => { const rule = tasks.find((r) => r.id === ruleId); @@ -206,31 +187,7 @@ export default function TrafficDistribution() { rule.name.toLowerCase().includes(searchTerm.toLowerCase()), ); - const getStatusColor = (status: string) => { - switch (status) { - case 'running': - return 'bg-green-100 text-green-800'; - case 'paused': - return 'bg-gray-100 text-gray-800'; - case 'completed': - return 'bg-blue-100 text-blue-800'; - default: - return 'bg-gray-100 text-gray-800'; - } - }; - const getStatusText = (status: string) => { - switch (status) { - case 'running': - return '进行中'; - case 'paused': - return '已暂停'; - case 'completed': - return '已完成'; - default: - return '未知'; - } - }; // 模拟加载数据 useEffect(() => { diff --git a/nkebao/yarn.lock b/nkebao/yarn.lock index 564d5dfa..6dfdef98 100644 --- a/nkebao/yarn.lock +++ b/nkebao/yarn.lock @@ -2405,7 +2405,7 @@ dependencies: "@radix-ui/react-primitive" "2.1.3" -"@radix-ui/react-slider@latest": +"@radix-ui/react-slider@^1.3.5": version "1.3.5" resolved "https://registry.npmmirror.com/@radix-ui/react-slider/-/react-slider-1.3.5.tgz" integrity sha512-rkfe2pU2NBAYfGaxa3Mqosi7VZEWX5CxKaanRv0vZd4Zhl9fvQrg0VM93dv3xGLGfrHuoTRF3JXH8nb9g+B3fw== @@ -10898,7 +10898,7 @@ symbol-tree@^3.2.4: resolved "https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -tailwind-merge@^2.5.5: +tailwind-merge@^2.6.0: version "2.6.0" resolved "https://registry.npmmirror.com/tailwind-merge/-/tailwind-merge-2.6.0.tgz" integrity sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==