diff --git a/Cunkebao/app/content/[id]/edit/page.tsx b/Cunkebao/app/content/[id]/edit/page.tsx new file mode 100644 index 00000000..808c1ba8 --- /dev/null +++ b/Cunkebao/app/content/[id]/edit/page.tsx @@ -0,0 +1,430 @@ +"use client" + +import { useState, useEffect, use } from "react" +import { ChevronLeft, X } from "lucide-react" +import { Button } from "@/components/ui/button" +import { Card } from "@/components/ui/card" +import { Input } from "@/components/ui/input" +import { Label } from "@/components/ui/label" +import { Switch } from "@/components/ui/switch" +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" +import { Textarea } from "@/components/ui/textarea" +import { useRouter } from "next/navigation" +import { DateRangePicker } from "@/components/ui/date-range-picker" +import { WechatFriendSelector } from "@/components/WechatFriendSelector" +import { WechatGroupSelector } from "@/components/WechatGroupSelector" +import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "@/components/ui/accordion" +import { api } from "@/lib/api" +import { showToast } from "@/lib/toast" +import { format, parse } from "date-fns" + +interface WechatFriend { + id: string + nickname: string + wechatId: string + avatar: string + gender?: "male" | "female" + customer?: string + alias?: string + ownerNickname?: string + ownerAlias?: string +} + +interface WechatGroup { + id: string + name: string + memberCount: number + avatar: string + owner: string + customer: string +} + +interface ContentLibraryDetail { + id: string + name: string + sourceType: number + status: number + sourceFriends: any[] + sourceGroups: any[] + keywordInclude: string[] + keywordExclude: string[] + isEnabled: number + aiPrompt: string + timeEnabled: number + timeStart: string + timeEnd: string + createTime: string + updateTime: string +} + +interface ApiResponse { + code: number + msg: string + data: T +} + +export default function EditContentLibraryPage({ params }: { params: Promise<{ id: string }> }) { + const resolvedParams = use(params) + const router = useRouter() + const [formData, setFormData] = useState({ + name: "", + sourceType: "friends" as "friends" | "groups", + keywordsInclude: "", + keywordsExclude: "", + startDate: "", + endDate: "", + selectedFriends: [] as WechatFriend[], + selectedGroups: [] as WechatGroup[], + useAI: false, + aiPrompt: "", + enabled: true, + }) + + const [isWechatFriendSelectorOpen, setIsWechatFriendSelectorOpen] = useState(false) + const [isWechatGroupSelectorOpen, setIsWechatGroupSelectorOpen] = useState(false) + const [loading, setLoading] = useState(false) + const [isLoadingData, setIsLoadingData] = useState(true) + + // 获取内容库详情 + useEffect(() => { + const fetchLibraryDetail = async () => { + setIsLoadingData(true) + const loadingToast = showToast("正在加载内容库数据...", "loading", true); + + try { + const response = await api.get>(`/v1/content/library/detail?id=${resolvedParams.id}`) + + if (response.code === 200 && response.data) { + const data = response.data + + // 直接使用API返回的好友和群组数据 + const friends = data.sourceFriends || []; + const groups = data.sourceGroups || []; + + setFormData({ + name: data.name, + sourceType: data.sourceType === 1 ? "friends" : "groups", + keywordsInclude: data.keywordInclude ? data.keywordInclude.join(", ") : "", + keywordsExclude: data.keywordExclude ? data.keywordExclude.join(", ") : "", + startDate: data.timeStart || "", + endDate: data.timeEnd || "", + selectedFriends: friends, + selectedGroups: groups, + useAI: !!data.aiPrompt, + aiPrompt: data.aiPrompt || "", + enabled: data.status === 1, + }) + } else { + showToast(response.msg || "获取内容库详情失败", "error") + router.back() + } + } catch (error: any) { + console.error("获取内容库详情失败:", error) + showToast(error?.message || "请检查网络连接", "error") + router.back() + } finally { + setIsLoadingData(false) + loadingToast.remove() + } + } + + fetchLibraryDetail() + }, [resolvedParams.id, router]) + + const removeFriend = (friendId: string) => { + setFormData((prev) => ({ + ...prev, + selectedFriends: prev.selectedFriends.filter((friend) => friend.id !== friendId), + })) + } + + const removeGroup = (groupId: string) => { + setFormData((prev) => ({ + ...prev, + selectedGroups: prev.selectedGroups.filter((group) => group.id !== groupId), + })) + } + + const handleSubmit = async () => { + if (!formData.name) { + showToast("请输入内容库名称", "error") + return + } + + if (formData.sourceType === "friends" && formData.selectedFriends.length === 0) { + showToast("请选择微信好友", "error") + return + } + + if (formData.sourceType === "groups" && formData.selectedGroups.length === 0) { + showToast("请选择聊天群", "error") + return + } + + setLoading(true) + const loadingToast = showToast("正在更新内容库...", "loading", true); + + try { + const payload = { + id: resolvedParams.id, + name: formData.name, + sourceType: formData.sourceType === "friends" ? 1 : 2, + friends: formData.selectedFriends.map(f => f.id), + groups: formData.selectedGroups.map(g => g.id), + keywordInclude: formData.keywordsInclude.split(",").map(k => k.trim()).filter(Boolean), + keywordExclude: formData.keywordsExclude.split(",").map(k => k.trim()).filter(Boolean), + aiPrompt: formData.useAI ? formData.aiPrompt : "", + timeEnabled: formData.startDate && formData.endDate ? 1 : 0, + startTime: formData.startDate || "", + endTime: formData.endDate || "", + status: formData.enabled ? 1 : 0 + } + + const response = await api.post("/v1/content/library/update", payload) + + if (response.code === 200) { + loadingToast.remove() + showToast("更新成功", "success") + router.push("/content") + } else { + loadingToast.remove() + showToast(response.msg || "更新失败", "error") + } + } catch (error: any) { + console.error("更新内容库失败:", error) + loadingToast.remove() + showToast(error?.message || "请检查网络连接", "error") + } finally { + setLoading(false) + } + } + + if (isLoadingData) { + return ( +
+
+
+

加载中...

+
+
+ ) + } + + return ( +
+
+
+ +

编辑内容库

+
+
+ +
+ +
+
+ + setFormData({ ...formData, name: e.target.value })} + placeholder="请输入内容库名称" + required + className="mt-1.5" + /> +
+ +
+ + setFormData({ ...formData, sourceType: value as "friends" | "groups" })} + className="mt-1.5" + > + + 选择微信好友 + 选择聊天群 + + + + {formData.selectedFriends.length > 0 && ( +
+ {formData.selectedFriends.map((friend) => ( +
+
+ {friend.nickname} + {friend.nickname} +
+ +
+ ))} +
+ )} +
+ + + {formData.selectedGroups.length > 0 && ( +
+ {formData.selectedGroups.map((group) => ( +
+
+ {group.name} + {group.name} +
+ +
+ ))} +
+ )} +
+
+
+ + + + 关键字设置 + +
+
+ +