import { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { Card, Table, Button, Input, Select, Tag, Space, Modal, Form, message, Popconfirm, Typography, Drawer, } from 'antd'; import { PlusOutlined, SearchOutlined, EditOutlined, DeleteOutlined, EyeOutlined, CheckOutlined, StopOutlined, } from '@ant-design/icons'; import api from '../../../../shared/utils/api'; const { Title, Paragraph } = Typography; const { TextArea } = Input; const CATEGORIES = [ { value: 'QMAS', label: '优秀人才入境计划' }, { value: 'GEP', label: '一般就业政策' }, { value: 'IANG', label: '非本地毕业生留港/回港就业安排' }, { value: 'TTPS', label: '科技人才入境计划' }, { value: 'CIES', label: '资本投资者入境计划' }, { value: 'TechTAS', label: '顶尖人才通行证计划' }, { value: 'GENERAL', label: '通用知识' }, ]; interface Article { id: string; title: string; content: string; summary: string; category: string; tags: string[]; source: string; isPublished: boolean; citationCount: number; qualityScore: number; createdAt: string; } export function KnowledgePage() { const [searchText, setSearchText] = useState(''); const [categoryFilter, setCategoryFilter] = useState(); const [isModalOpen, setIsModalOpen] = useState(false); const [isDrawerOpen, setIsDrawerOpen] = useState(false); const [selectedArticle, setSelectedArticle] = useState
(null); const [form] = Form.useForm(); const queryClient = useQueryClient(); const { data, isLoading } = useQuery({ queryKey: ['knowledge-articles', categoryFilter], queryFn: async () => { const params = new URLSearchParams(); if (categoryFilter) params.append('category', categoryFilter); const response = await api.get(`/knowledge/articles?${params}`); return response.data.data; }, }); const createMutation = useMutation({ mutationFn: (values: Partial
) => api.post('/knowledge/articles', values), onSuccess: () => { message.success('文章创建成功'); queryClient.invalidateQueries({ queryKey: ['knowledge-articles'] }); setIsModalOpen(false); form.resetFields(); }, }); const updateMutation = useMutation({ mutationFn: ({ id, ...values }: { id: string } & Partial
) => api.put(`/knowledge/articles/${id}`, values), onSuccess: () => { message.success('文章更新成功'); queryClient.invalidateQueries({ queryKey: ['knowledge-articles'] }); setIsModalOpen(false); form.resetFields(); setSelectedArticle(null); }, }); const deleteMutation = useMutation({ mutationFn: (id: string) => api.delete(`/knowledge/articles/${id}`), onSuccess: () => { message.success('文章已删除'); queryClient.invalidateQueries({ queryKey: ['knowledge-articles'] }); }, }); const publishMutation = useMutation({ mutationFn: (id: string) => api.post(`/knowledge/articles/${id}/publish`), onSuccess: () => { message.success('文章已发布'); queryClient.invalidateQueries({ queryKey: ['knowledge-articles'] }); }, }); const unpublishMutation = useMutation({ mutationFn: (id: string) => api.post(`/knowledge/articles/${id}/unpublish`), onSuccess: () => { message.success('文章已取消发布'); queryClient.invalidateQueries({ queryKey: ['knowledge-articles'] }); }, }); const handleEdit = (article: Article) => { setSelectedArticle(article); form.setFieldsValue({ title: article.title, content: article.content, category: article.category, tags: article.tags, }); setIsModalOpen(true); }; const handleView = (article: Article) => { setSelectedArticle(article); setIsDrawerOpen(true); }; const handleSubmit = (values: Partial
) => { if (selectedArticle) { updateMutation.mutate({ id: selectedArticle.id, ...values }); } else { createMutation.mutate(values); } }; const columns = [ { title: '标题', dataIndex: 'title', key: 'title', render: (text: string, record: Article) => ( handleView(record)}>{text} ), }, { title: '类别', dataIndex: 'category', key: 'category', render: (category: string) => { const cat = CATEGORIES.find((c) => c.value === category); return {cat?.label || category}; }, }, { title: '来源', dataIndex: 'source', key: 'source', render: (source: string) => { const sourceMap: Record = { MANUAL: { color: 'green', label: '手动' }, CRAWL: { color: 'orange', label: '爬取' }, EXTRACT: { color: 'purple', label: '提取' }, IMPORT: { color: 'cyan', label: '导入' }, }; const s = sourceMap[source] || { color: 'default', label: source }; return {s.label}; }, }, { title: '状态', dataIndex: 'isPublished', key: 'isPublished', render: (isPublished: boolean) => isPublished ? ( 已发布 ) : ( 草稿 ), }, { title: '质量分', dataIndex: 'qualityScore', key: 'qualityScore', render: (score: number) => ( = 70 ? 'text-green-600' : score >= 40 ? 'text-yellow-600' : 'text-red-600' } > {score} ), }, { title: '引用次数', dataIndex: 'citationCount', key: 'citationCount', }, { title: '操作', key: 'action', render: (_: unknown, record: Article) => (