From 2488b0210b529ea1a788abe65bd127e64c41519c Mon Sep 17 00:00:00 2001 From: wong <106998207@qq.com> Date: Tue, 17 Jun 2025 17:02:07 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=8A=9F=E8=83=BD=E4=BC=98?= =?UTF-8?q?=E5=8C=96=20+=20apiKey=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cunkebao/app/scenarios/[channel]/page.tsx | 31 +++++-- .../app/scenarios/new/steps/BasicSettings.tsx | 90 ++++++++++++++++--- .../scenarios/new/steps/MessageSettings.tsx | 19 +++- Cunkebao/pages/device/index.vue | 0 .../GetAddFriendPlanDetailV1Controller.php | 1 - 5 files changed, 119 insertions(+), 22 deletions(-) delete mode 100644 Cunkebao/pages/device/index.vue diff --git a/Cunkebao/app/scenarios/[channel]/page.tsx b/Cunkebao/app/scenarios/[channel]/page.tsx index a91958ae..063f89e0 100644 --- a/Cunkebao/app/scenarios/[channel]/page.tsx +++ b/Cunkebao/app/scenarios/[channel]/page.tsx @@ -193,15 +193,32 @@ function ApiDocumentationTooltip() { }) } - const handleOpenApiSettings = (taskId: string) => { + const handleOpenApiSettings = async (taskId: string) => { const task = tasks.find((t) => t.id === taskId) if (task) { - setCurrentApiSettings({ - apiKey: `api_${taskId}_${Math.random().toString(36).substring(2, 10)}`, - webhookUrl: `${window.location.origin}/api/scenarios/${channel}/${taskId}/webhook`, - taskId, - }) - setShowApiDialog(true) + try { + const res = await api.get(`/v1/plan/detail?planId=${taskId}`) + if (res.code === 200 && res.data) { + setCurrentApiSettings({ + apiKey: res.data.apiKey || '', // 使用接口返回的 API 密钥 + webhookUrl: `${window.location.origin}/api/scenarios/${channel}/${taskId}/webhook`, + taskId, + }) + setShowApiDialog(true) + } else { + toast({ + title: "获取 API 密钥失败", + description: res.msg || "请重试", + variant: "destructive", + }) + } + } catch (err: any) { + toast({ + title: "获取 API 密钥失败", + description: err?.message || "请重试", + variant: "destructive", + }) + } } } diff --git a/Cunkebao/app/scenarios/new/steps/BasicSettings.tsx b/Cunkebao/app/scenarios/new/steps/BasicSettings.tsx index 23092918..4ca99a3f 100644 --- a/Cunkebao/app/scenarios/new/steps/BasicSettings.tsx +++ b/Cunkebao/app/scenarios/new/steps/BasicSettings.tsx @@ -42,6 +42,38 @@ interface Material { preview: string } +interface PosterSectionProps { + materials: Material[] + selectedMaterials: Material[] + onUpload: () => void + onSelect: (material: Material) => void + uploading: boolean + fileInputRef: React.RefObject + onFileChange: (event: React.ChangeEvent) => void + onPreview: (url: string) => void + onRemove: (id: string) => void +} + +interface OrderSectionProps { + materials: Material[] + onUpload: () => void + uploading: boolean + fileInputRef: React.RefObject + onFileChange: (event: React.ChangeEvent) => void +} + +interface DouyinSectionProps { + materials: Material[] + onUpload: () => void + uploading: boolean + fileInputRef: React.RefObject + onFileChange: (event: React.ChangeEvent) => void +} + +interface PlaceholderSectionProps { + title: string +} + const posterTemplates = [ { id: "poster-1", @@ -128,7 +160,17 @@ function getTagColorIdx(tag: string) { } // Section组件示例 -const PosterSection = ({ materials, selectedMaterials, onUpload, onSelect, uploading, fileInputRef, onFileChange, onPreview, onRemove }) => ( +const PosterSection = ({ + materials, + selectedMaterials, + onUpload, + onSelect, + uploading, + fileInputRef, + onFileChange, + onPreview, + onRemove +}: PosterSectionProps) => (
@@ -202,7 +244,7 @@ const PosterSection = ({ materials, selectedMaterials, onUpload, onSelect, uploa
) -const OrderSection = ({ materials, onUpload, uploading, fileInputRef, onFileChange }) => ( +const OrderSection = ({ materials, onUpload, uploading, fileInputRef, onFileChange }: OrderSectionProps) => (
@@ -218,7 +260,7 @@ const OrderSection = ({ materials, onUpload, uploading, fileInputRef, onFileChan
- {materials.map((item) => ( + {materials.map((item: Material) => (
{item.name}
@@ -230,7 +272,7 @@ const OrderSection = ({ materials, onUpload, uploading, fileInputRef, onFileChan
) -const DouyinSection = ({ materials, onUpload, uploading, fileInputRef, onFileChange }) => ( +const DouyinSection = ({ materials, onUpload, uploading, fileInputRef, onFileChange }: DouyinSectionProps) => (
@@ -246,7 +288,7 @@ const DouyinSection = ({ materials, onUpload, uploading, fileInputRef, onFileCha
- {materials.map((item) => ( + {materials.map((item: Material) => (
{item.name}
@@ -258,8 +300,15 @@ const DouyinSection = ({ materials, onUpload, uploading, fileInputRef, onFileCha
) -const PlaceholderSection = ({ title }) => ( -
{title}功能区待开发
+const PlaceholderSection = ({ title }: PlaceholderSectionProps) => ( +
+
+ +
+
+

暂无内容

+
+
) export function BasicSettings({ formData, onChange, onNext, scenarios, loadingScenes, planNameEdited }: BasicSettingsProps & { loadingScenes?: boolean, planNameEdited?: boolean }) { @@ -341,6 +390,25 @@ export function BasicSettings({ formData, onChange, onNext, scenarios, loadingSc } }, [loadingScenes, scenarios, type, planNameEdited]); + // 添加 useEffect 来处理初始化的海报数据 + useEffect(() => { + if (formData.posters && Array.isArray(formData.posters)) { + const validPosters = formData.posters.filter((poster: any) => + poster && typeof poster === 'object' && + 'id' in poster && + 'name' in poster && + 'type' in poster && + 'preview' in poster + ) + setSelectedMaterials(validPosters.map((poster: any) => ({ + id: poster.id, + name: poster.name, + type: poster.type || 'poster', // 确保有 type 字段 + preview: poster.preview + }))) + } + }, [formData.posters]) + // 展示所有场景 const displayedScenarios = scenarios @@ -1055,10 +1123,10 @@ export function BasicSettings({ formData, onChange, onNext, scenarios, loadingSc selected ? tagColorPoolDark[idx] + " ring-2 ring-blue-400" : tagColorPoolLight[idx] + " hover:ring-1 hover:ring-gray-300" - }`} - onClick={() => handleTagToggle(tag)} - > - {tag} + }`} + onClick={() => handleTagToggle(tag)} + > + {tag}
); })} diff --git a/Cunkebao/app/scenarios/new/steps/MessageSettings.tsx b/Cunkebao/app/scenarios/new/steps/MessageSettings.tsx index d8bd8451..d0e285f7 100644 --- a/Cunkebao/app/scenarios/new/steps/MessageSettings.tsx +++ b/Cunkebao/app/scenarios/new/steps/MessageSettings.tsx @@ -1,6 +1,6 @@ "use client" -import { useState, useRef } from "react" +import { useState, useRef, useEffect } from "react" import { Card } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" @@ -24,10 +24,15 @@ import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from " import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { toast } from "@/components/ui/use-toast" +interface FileContent { + url: string + name: string +} + interface MessageContent { id: string type: "text" | "image" | "video" | "file" | "miniprogram" | "link" | "group" - content: string | { url: string, name: string }[] + content: any // 暂时使用 any 类型来解决类型问题 sendInterval?: number intervalUnit?: "seconds" | "minutes" scheduledTime?: { @@ -84,11 +89,19 @@ export function MessageSettings({ formData, onChange, onNext, onPrev }: MessageS type: "text", content: "", sendInterval: 5, - intervalUnit: "seconds", // 默认改为秒 + intervalUnit: "seconds", }, ], }, ]) + + // 添加 useEffect 来初始化消息计划数据 + useEffect(() => { + if (formData.messagePlans && Array.isArray(formData.messagePlans)) { + setDayPlans(formData.messagePlans) + } + }, [formData.messagePlans]) + const [isAddDayPlanOpen, setIsAddDayPlanOpen] = useState(false) const [isGroupSelectOpen, setIsGroupSelectOpen] = useState(false) const [selectedGroupId, setSelectedGroupId] = useState("") diff --git a/Cunkebao/pages/device/index.vue b/Cunkebao/pages/device/index.vue deleted file mode 100644 index e69de29b..00000000 diff --git a/Server/application/cunkebao/controller/plan/GetAddFriendPlanDetailV1Controller.php b/Server/application/cunkebao/controller/plan/GetAddFriendPlanDetailV1Controller.php index 0dbe4f45..3f2700af 100644 --- a/Server/application/cunkebao/controller/plan/GetAddFriendPlanDetailV1Controller.php +++ b/Server/application/cunkebao/controller/plan/GetAddFriendPlanDetailV1Controller.php @@ -51,7 +51,6 @@ class GetAddFriendPlanDetailV1Controller extends Controller $newData['createTime'], $newData['updateTime'], $newData['deleteTime'], - $newData['apiKey'] );