Files
AIclinicalresearch/frontend/src/stores/useKnowledgeBaseStore.ts
AI Clinical Dev Team 239c7ea85e feat: Day 21-22 - knowledge base frontend completed, fix CORS and file upload issues
- Complete knowledge base list and detail pages
- Complete document upload component
- Fix CORS config (add PUT/DELETE method support)
- Fix file upload issues (disabled state and beforeUpload return value)
- Add detailed debug logs (cleaned up)
- Create Day 21-22 completion summary document
2025-10-11 15:40:12 +08:00

219 lines
6.2 KiB
TypeScript

import { create } from 'zustand';
import type { KnowledgeBase, Document } from '../api/knowledgeBaseApi';
import { knowledgeBaseApi, documentApi } from '../api/knowledgeBaseApi';
interface KnowledgeBaseState {
// 知识库列表
knowledgeBases: KnowledgeBase[];
currentKb: KnowledgeBase | null;
// 文档列表
documents: Document[];
// 加载状态
loading: boolean;
error: string | null;
// 操作方法
fetchKnowledgeBases: () => Promise<void>;
fetchKnowledgeBaseById: (id: string) => Promise<void>;
createKnowledgeBase: (name: string, description?: string) => Promise<KnowledgeBase>;
updateKnowledgeBase: (id: string, name?: string, description?: string) => Promise<void>;
deleteKnowledgeBase: (id: string) => Promise<void>;
// 文档操作
fetchDocuments: (kbId: string) => Promise<void>;
uploadDocument: (kbId: string, file: File, onProgress?: (progress: number) => void) => Promise<Document>;
deleteDocument: (id: string) => Promise<void>;
reprocessDocument: (id: string) => Promise<void>;
// 辅助方法
setCurrentKb: (kb: KnowledgeBase | null) => void;
clearError: () => void;
}
export const useKnowledgeBaseStore = create<KnowledgeBaseState>((set, get) => ({
knowledgeBases: [],
currentKb: null,
documents: [],
loading: false,
error: null,
// 获取知识库列表
fetchKnowledgeBases: async () => {
set({ loading: true, error: null });
try {
const knowledgeBases = await knowledgeBaseApi.getList();
set({ knowledgeBases, loading: false });
} catch (error: any) {
set({
error: error.response?.data?.message || '获取知识库列表失败',
loading: false
});
}
},
// 获取知识库详情
fetchKnowledgeBaseById: async (id: string) => {
set({ loading: true, error: null });
try {
const kb = await knowledgeBaseApi.getById(id);
set({ currentKb: kb, loading: false });
// 同时获取文档列表
if (kb.id) {
await get().fetchDocuments(kb.id);
}
} catch (error: any) {
set({
error: error.response?.data?.message || '获取知识库详情失败',
loading: false
});
}
},
// 创建知识库
createKnowledgeBase: async (name: string, description?: string) => {
set({ loading: true, error: null });
try {
const kb = await knowledgeBaseApi.create({ name, description });
// 更新列表
const knowledgeBases = [...get().knowledgeBases, kb];
set({ knowledgeBases, loading: false });
return kb;
} catch (error: any) {
const errorMsg = error.response?.data?.message || '创建知识库失败';
set({ error: errorMsg, loading: false });
throw new Error(errorMsg);
}
},
// 更新知识库
updateKnowledgeBase: async (id: string, name?: string, description?: string) => {
set({ loading: true, error: null });
try {
const updatedKb = await knowledgeBaseApi.update(id, { name, description });
// 更新列表
const knowledgeBases = get().knowledgeBases.map(kb =>
kb.id === id ? updatedKb : kb
);
// 更新当前知识库
const currentKb = get().currentKb?.id === id ? updatedKb : get().currentKb;
set({ knowledgeBases, currentKb, loading: false });
} catch (error: any) {
set({
error: error.response?.data?.message || '更新知识库失败',
loading: false
});
throw error;
}
},
// 删除知识库
deleteKnowledgeBase: async (id: string) => {
set({ loading: true, error: null });
try {
await knowledgeBaseApi.delete(id);
// 更新列表
const knowledgeBases = get().knowledgeBases.filter(kb => kb.id !== id);
// 清除当前知识库(如果是被删除的)
const currentKb = get().currentKb?.id === id ? null : get().currentKb;
set({ knowledgeBases, currentKb, loading: false });
} catch (error: any) {
set({
error: error.response?.data?.message || '删除知识库失败',
loading: false
});
throw error;
}
},
// 获取文档列表
fetchDocuments: async (kbId: string) => {
try {
const documents = await documentApi.getList(kbId);
set({ documents });
} catch (error: any) {
set({
error: error.response?.data?.message || '获取文档列表失败'
});
}
},
// 上传文档
uploadDocument: async (kbId: string, file: File, onProgress?: (progress: number) => void) => {
set({ loading: true, error: null });
try {
const document = await documentApi.upload(kbId, file, onProgress);
// 更新文档列表
const documents = [document, ...get().documents];
set({ documents, loading: false });
return document;
} catch (error: any) {
const errorMsg = error.response?.data?.message || '上传文档失败';
set({ error: errorMsg, loading: false });
throw new Error(errorMsg);
}
},
// 删除文档
deleteDocument: async (id: string) => {
set({ loading: true, error: null });
try {
await documentApi.delete(id);
// 更新文档列表
const documents = get().documents.filter(doc => doc.id !== id);
set({ documents, loading: false });
} catch (error: any) {
set({
error: error.response?.data?.message || '删除文档失败',
loading: false
});
throw error;
}
},
// 重新处理文档
reprocessDocument: async (id: string) => {
set({ loading: true, error: null });
try {
await documentApi.reprocess(id);
// 更新文档状态
const documents = get().documents.map(doc =>
doc.id === id ? { ...doc, status: 'parsing' as const, progress: 0 } : doc
);
set({ documents, loading: false });
} catch (error: any) {
set({
error: error.response?.data?.message || '重新处理文档失败',
loading: false
});
throw error;
}
},
// 设置当前知识库
setCurrentKb: (kb: KnowledgeBase | null) => {
set({ currentKb: kb });
},
// 清除错误
clearError: () => {
set({ error: null });
},
}));