diff --git a/packages/admin-client/src/features/knowledge/infrastructure/knowledge.api.ts b/packages/admin-client/src/features/knowledge/infrastructure/knowledge.api.ts index 23c85a8..61ebde9 100644 --- a/packages/admin-client/src/features/knowledge/infrastructure/knowledge.api.ts +++ b/packages/admin-client/src/features/knowledge/infrastructure/knowledge.api.ts @@ -24,6 +24,7 @@ export interface CreateArticleParams { content: string; category: string; tags?: string[]; + source?: string; } export interface ExtractedTextResponse { diff --git a/packages/admin-client/src/features/knowledge/presentation/pages/KnowledgePage.tsx b/packages/admin-client/src/features/knowledge/presentation/pages/KnowledgePage.tsx index 1706bfe..95163cb 100644 --- a/packages/admin-client/src/features/knowledge/presentation/pages/KnowledgePage.tsx +++ b/packages/admin-client/src/features/knowledge/presentation/pages/KnowledgePage.tsx @@ -13,7 +13,6 @@ import { Typography, Drawer, Upload, - Segmented, message, } from 'antd'; import { @@ -55,10 +54,11 @@ export function KnowledgePage() { const [searchText, setSearchText] = useState(''); const [categoryFilter, setCategoryFilter] = useState(); const [isModalOpen, setIsModalOpen] = useState(false); + const [isUploadModalOpen, setIsUploadModalOpen] = useState(false); const [isDrawerOpen, setIsDrawerOpen] = useState(false); const [selectedArticle, setSelectedArticle] = useState
(null); - const [inputMode, setInputMode] = useState<'manual' | 'upload'>('manual'); const [isExtracting, setIsExtracting] = useState(false); + const [articleSource, setArticleSource] = useState<'MANUAL' | 'EXTRACT'>('MANUAL'); const [form] = Form.useForm(); const { data, isLoading } = useKnowledgeArticles(categoryFilter); @@ -98,10 +98,11 @@ export function KnowledgePage() { } ); } else { - createMutation.mutate(values, { + createMutation.mutate({ ...values, source: articleSource }, { onSuccess: () => { setIsModalOpen(false); form.resetFields(); + setArticleSource('MANUAL'); }, }); } @@ -111,19 +112,24 @@ export function KnowledgePage() { setIsExtracting(true); uploadMutation.mutate(file, { onSuccess: (result) => { + // 关闭上传弹窗,打开文章编辑弹窗(预填提取内容) + setIsUploadModalOpen(false); + setSelectedArticle(null); + setArticleSource('EXTRACT'); + form.resetFields(); form.setFieldsValue({ title: result.suggestedTitle, content: result.extractedText, }); + setIsModalOpen(true); const info = result.pageCount - ? `已提取 ${result.wordCount} 字(${result.pageCount} 页)` - : `已提取 ${result.wordCount} 字`; + ? `已提取 ${result.wordCount} 字(${result.pageCount} 页),请编辑后保存` + : `已提取 ${result.wordCount} 字,请编辑后保存`; message.success(info); - setInputMode('manual'); }, onSettled: () => setIsExtracting(false), }); - return false; // prevent default upload + return false; }; const columns = [ @@ -256,18 +262,26 @@ export function KnowledgePage() { options={CATEGORIES} /> - + + + + + {/* 上传文件弹窗 */} + { + if (!isExtracting) setIsUploadModalOpen(false); + }} + footer={null} + width={520} + > + +

+ +

+

+ {isExtracting ? '正在提取文本...' : '点击或拖拽文件到此区域'} +

+

+ 支持 PDF、Word(.docx)、TXT、Markdown 格式,最大 200MB +

+
+
+ {/* 编辑/新建弹窗 */} { setIsModalOpen(false); setSelectedArticle(null); + setArticleSource('MANUAL'); form.resetFields(); }} footer={null} @@ -316,47 +365,13 @@ export function KnowledgePage() {