From 9e36c10d31ae8f8c8a3413284fc5a8f1b37cfaa7 Mon Sep 17 00:00:00 2001 From: wangdl Date: Fri, 19 Jun 2026 15:36:55 +0800 Subject: [PATCH] fix: replace all any types with proper interfaces --- src/pages/KnowledgeSources.tsx | 56 ++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/src/pages/KnowledgeSources.tsx b/src/pages/KnowledgeSources.tsx index 187aef0..fc603f0 100644 --- a/src/pages/KnowledgeSources.tsx +++ b/src/pages/KnowledgeSources.tsx @@ -8,6 +8,43 @@ import dayjs from 'dayjs' const { Title } = Typography +// ── Types ── + +interface KnowledgeSourceItem { + id: string + userId?: string + knowledgeBaseId?: string + originalFilename?: string + title?: string + mimeType?: string + sizeBytes?: number + textLength?: number + parseStatus?: string + indexStatus?: string + createdAt?: string + userName?: string + kbName?: string +} + +interface PaginatedSources { + items: KnowledgeSourceItem[] + total: number + page: number + limit: number +} + +interface KnowledgeBaseItem { + id: string + title?: string + name?: string +} + +interface PaginatedKnowledgeBases { + items: KnowledgeBaseItem[] +} + +// ── Labels ── + const mimeLabels: Record = { 'text/plain': '文本', 'text/markdown': 'Markdown', 'application/pdf': 'PDF', 'application/epub+zip': 'EPUB', @@ -25,6 +62,8 @@ const indexStatusColors: Record = { pending: 'default', indexing: 'processing', completed: 'green', failed: 'red', } +// ── Component ── + export default function KnowledgeSourcesPage() { const [page, setPage] = useState(1) const [kbFilter, setKbFilter] = useState() @@ -38,24 +77,23 @@ export default function KnowledgeSourcesPage() { if (kbFilter) p.set('knowledgeBaseId', kbFilter) if (statusFilter) p.set('parseStatus', statusFilter) if (search) p.set('search', search) - return api.get(`/admin-api/knowledge-bases/all-sources?${p.toString()}`) + return api.get(`/admin-api/knowledge-bases/all-sources?${p.toString()}`) }, staleTime: 10_000, }) - // KB list for filter dropdown const { data: kbList } = useQuery({ queryKey: ['admin', 'kb-list'], - queryFn: () => api.get<{ items: any[] }>('/admin-api/knowledge-bases?limit=200').then(d => d?.items || []), + queryFn: () => api.get('/admin-api/knowledge-bases?limit=200').then(d => d.items), staleTime: 60_000, }) const columns = [ - { title: '文件名', dataIndex: 'originalFilename', width: 220, ellipsis: true, render: (v: string, r: any) => v || r.title || '-' }, - { title: '知识库', dataIndex: 'kbName', width: 140, ellipsis: true, render: (v: string, r: any) => v || r.knowledgeBaseId }, + { title: '文件名', dataIndex: 'originalFilename', width: 220, ellipsis: true, render: (v: string, r: KnowledgeSourceItem) => v || r.title || '-' }, + { title: '知识库', dataIndex: 'kbName', width: 140, ellipsis: true, render: (v: string, r: KnowledgeSourceItem) => v || r.knowledgeBaseId }, { title: '类型', dataIndex: 'mimeType', width: 80, render: (v: string) => mimeLabels[v] || v?.split('/').pop() || '-' }, - { title: '大小', dataIndex: 'sizeBytes', width: 80, render: (v: number) => v ? (v / 1024).toFixed(1) + 'KB' : '-' }, - { title: '字数', dataIndex: 'textLength', width: 70, render: (v: number) => v || '-' }, + { title: '大小', dataIndex: 'sizeBytes', width: 80, render: (v: number) => v ? `${(v / 1024).toFixed(1)} KB` : '-' }, + { title: '字数', dataIndex: 'textLength', width: 70, render: (v: number | undefined) => v != null ? v : '-' }, { title: '解析', dataIndex: 'parseStatus', width: 90, render: (v: string) => {parseStatusLabels[v] || v}, @@ -75,12 +113,12 @@ export default function KnowledgeSourcesPage() { onChange={e => { setSearch(e.target.value); setPage(1) }} style={{ width: 200 }} /> { setStatusFilter(v); setPage(1) }} style={{ width: 130 }} options={Object.entries(parseStatusLabels).map(([v, l]) => ({ value: v, label: l }))} /> - dataSource={data?.items || []} columns={columns} rowKey="id" loading={isLoading} pagination={{ current: page, defaultPageSize: 20, total: data?.total || 0, onChange: setPage }} size="small" scroll={{ x: 1000 }} />