import React, { useState, useEffect } from 'react'; import { Layout, List, Button, Space, Typography, Card, Input, Switch, App, Modal, Form, Badge, Tooltip, Divider, Checkbox, Empty, Select, Tag } from 'antd'; import { PlusOutlined, LeftOutlined, RightOutlined, DeleteOutlined, BookOutlined, FileTextOutlined, StarFilled, StarOutlined, SaveOutlined, CheckOutlined, EditOutlined, CloseOutlined, MessageOutlined, DatabaseOutlined } from '@ant-design/icons'; import apiClient from '../../utils/apiClient'; import { buildApiUrl, API_ENDPOINTS } from '../../config/api'; import ActionButton from '../../components/ActionButton'; import MarkdownEditor from '../../components/MarkdownEditor'; import StatusTag from '../../components/StatusTag'; const { Sider, Content } = Layout; const { Title, Text, Paragraph } = Typography; const { TextArea } = Input; const TASK_TYPES = { MEETING_TASK: { label: '总结模版', icon: }, KNOWLEDGE_TASK: { label: '知识库模版', icon: } }; const PromptManagement = () => { const { message, modal } = App.useApp(); const [form] = Form.useForm(); const [prompts, setPrompts] = useState([]); const [selectedPrompt, setSelectedPrompt] = useState(null); const [editingPrompt, setEditingPrompt] = useState(null); const [editingTitle, setEditingTitle] = useState(false); const [sidebarCollapsed, setSidebarCollapsed] = useState(false); const [loading, setLoading] = useState(true); const [showCreateModal, setShowCreateModal] = useState(false); const [isSaving, setIsSaving] = useState(false); useEffect(() => { fetchPrompts(); }, []); const fetchPrompts = async () => { setLoading(true); try { const response = await apiClient.get(buildApiUrl(API_ENDPOINTS.PROMPTS.LIST)); const list = response.data.prompts || []; setPrompts(list); if (list.length > 0 && !selectedPrompt) { setSelectedPrompt(list[0]); setEditingPrompt({ ...list[0] }); } } finally { setLoading(false); } }; const handlePromptSelect = (prompt) => { setSelectedPrompt(prompt); setEditingPrompt({ ...prompt }); setEditingTitle(false); }; const handleEditChange = (field, value) => { setEditingPrompt(prev => ({ ...prev, [field]: value })); }; const handleSave = async () => { if (!editingPrompt) return; setIsSaving(true); try { const payload = { ...editingPrompt, is_default: editingPrompt.is_default ? 1 : 0, is_active: editingPrompt.is_active ? 1 : 0 }; await apiClient.put(buildApiUrl(API_ENDPOINTS.PROMPTS.UPDATE(editingPrompt.id)), payload); message.success('保存成功'); fetchPrompts(); } catch (e) { message.error('保存失败'); } finally { setIsSaving(false); } }; const handleDelete = (item) => { if (item.is_default) { message.warning('默认模版不允许删除'); return; } modal.confirm({ title: '删除模版', content: `确定要删除模版 "${item.name}" 吗?`, okText: '删除', okType: 'danger', onOk: async () => { await apiClient.delete(buildApiUrl(API_ENDPOINTS.PROMPTS.DELETE(item.id))); message.success('删除成功'); setSelectedPrompt(null); fetchPrompts(); } }); }; const groupedPrompts = { MEETING_TASK: prompts.filter(p => p.task_type === 'MEETING_TASK'), KNOWLEDGE_TASK: prompts.filter(p => p.task_type === 'KNOWLEDGE_TASK') }; return (
{!sidebarCollapsed && 提示词模版}
{['MEETING_TASK', 'KNOWLEDGE_TASK'].map(type => (
{!sidebarCollapsed && (
{TASK_TYPES[type].icon} {TASK_TYPES[type].label}
)} (
handlePromptSelect(item)} style={{ padding: '10px 16px', cursor: 'pointer', background: selectedPrompt?.id === item.id ? '#e6f4ff' : 'transparent', borderLeft: selectedPrompt?.id === item.id ? '4px solid #1677ff' : '4px solid transparent', transition: 'all 0.3s' }} >
{item.name} {item.is_default === 1 && }
{!item.is_active && }
)} />
))}
{selectedPrompt && editingPrompt ? (
{selectedPrompt.name} } onClick={() => {}} />
{selectedPrompt.desc || '暂无描述'}
}> 分类: {TASK_TYPES[selectedPrompt.task_type].label} 默认: handleEditChange('is_default', e.target.checked ? 1 : 0)}> 设为默认 状态: handleEditChange('is_active', v ? 1 : 0)} /> handleEditChange('content', v)} height={600} showImageUpload={false} />
) : ( )}
setShowCreateModal(false)} onOk={() => form.submit()} >
{ await apiClient.post(buildApiUrl(API_ENDPOINTS.PROMPTS.CREATE), v); message.success('创建成功'); setShowCreateModal(false); fetchPrompts(); }}>