// ============================================================ // 知识库管理 // ============================================================ import { useState, useMemo } from 'react' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import { Button, message, Tag, Modal, Form, Input, Select, Space, Popconfirm, Card, Statistic, Row, Col, Tabs, Tree, Typography, Empty, Spin, InputNumber, } from 'antd' import { PlusOutlined, SearchOutlined, BookOutlined, FolderOutlined, DeleteOutlined, EditOutlined, EyeOutlined, BarChartOutlined, } from '@ant-design/icons' import type { ProColumns } from '@ant-design/pro-components' import { ProTable } from '@ant-design/pro-components' import { knowledgeService } from '@/services/knowledge' import type { CategoryResponse, KnowledgeItem, SearchResult } from '@/services/knowledge' const { TextArea } = Input const { Text, Title } = Typography // === 分类树 + 条目列表 Tab === function CategoriesPanel() { const queryClient = useQueryClient() const [createOpen, setCreateOpen] = useState(false) const [form] = Form.useForm() const { data: categories = [], isLoading } = useQuery({ queryKey: ['knowledge-categories'], queryFn: ({ signal }) => knowledgeService.listCategories(signal), }) const createMutation = useMutation({ mutationFn: (data: Parameters[0]) => knowledgeService.createCategory(data), onSuccess: () => { message.success('分类已创建') queryClient.invalidateQueries({ queryKey: ['knowledge-categories'] }) setCreateOpen(false) form.resetFields() }, onError: (err: Error) => message.error(err.message || '创建失败'), }) const deleteMutation = useMutation({ mutationFn: (id: string) => knowledgeService.deleteCategory(id), onSuccess: () => { message.success('分类已删除') queryClient.invalidateQueries({ queryKey: ['knowledge-categories'] }) }, onError: (err: Error) => message.error(err.message || '删除失败'), }) const treeData = useMemo( () => buildTreeData(categories, (id) => { Modal.confirm({ title: '确认删除', content: '删除后无法恢复,请确保分类下没有子分类和条目。', okType: 'danger', onOk: () => deleteMutation.mutate(id), }) }), [categories, deleteMutation], ) return (
分类管理
{isLoading ? (
) : categories.length === 0 ? ( ) : ( )} setCreateOpen(false)} onOk={() => form.submit()} confirmLoading={createMutation.isPending} >
createMutation.mutate(v)}>