feat(knowledge): add knowledge base management with dialog system
- Implement knowledge base list, create, and detail pages - Add dialog provider and components for confirmation and alerts - Include knowledge card and grid view components - Enhance header with user menu and logout functionality - Implement knowledge operations hooks for CRUD operations
This commit is contained in:
@@ -185,4 +185,212 @@ export const useKnowledgeDetail = (kbId: string) => {
|
||||
error,
|
||||
refresh: fetchKnowledgeDetail,
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* 知识库操作Hook
|
||||
* 提供创建、更新、删除知识库的功能
|
||||
*/
|
||||
export const useKnowledgeOperations = () => {
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
|
||||
/**
|
||||
* 创建知识库
|
||||
*/
|
||||
const createKnowledge = useCallback(async (data: Partial<IKnowledge>) => {
|
||||
try {
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
|
||||
const response = await knowledgeService.createKnowledge(data);
|
||||
|
||||
if (response.data.code === 0) {
|
||||
return response.data.data;
|
||||
} else {
|
||||
throw new Error(response.data.message || '创建知识库失败');
|
||||
}
|
||||
} catch (err: any) {
|
||||
const errorMessage = err.response?.data?.message || err.message || '创建知识库失败';
|
||||
setError(errorMessage);
|
||||
console.error('Failed to create knowledge:', err);
|
||||
throw err;
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, []);
|
||||
|
||||
/**
|
||||
* 更新知识库基础信息
|
||||
* 包括名称、描述、语言等基本信息
|
||||
*/
|
||||
const updateKnowledgeBasicInfo = useCallback(async (data: {
|
||||
id: string;
|
||||
name?: string;
|
||||
description?: string;
|
||||
language?: string;
|
||||
avatar?: any;
|
||||
permission?: string;
|
||||
}) => {
|
||||
try {
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
|
||||
const updateData = {
|
||||
kb_id: data.id,
|
||||
...data,
|
||||
};
|
||||
|
||||
const response = await knowledgeService.updateKnowledge(updateData);
|
||||
|
||||
if (response.data.code === 0) {
|
||||
return response.data.data;
|
||||
} else {
|
||||
throw new Error(response.data.message || '更新知识库基础信息失败');
|
||||
}
|
||||
} catch (err: any) {
|
||||
const errorMessage = err.response?.data?.message || err.message || '更新知识库基础信息失败';
|
||||
setError(errorMessage);
|
||||
console.error('Failed to update knowledge basic info:', err);
|
||||
throw err;
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, []);
|
||||
|
||||
/**
|
||||
* 更新知识库模型配置
|
||||
* 包括嵌入模型、解析器配置、相似度阈值等
|
||||
*/
|
||||
const updateKnowledgeModelConfig = useCallback(async (data: {
|
||||
id: string;
|
||||
embd_id?: string;
|
||||
// parser_config?: Partial<ParserConfig>;
|
||||
similarity_threshold?: number;
|
||||
vector_similarity_weight?: number;
|
||||
parser_id?: string;
|
||||
}) => {
|
||||
try {
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
|
||||
const updateData = {
|
||||
kb_id: data.id,
|
||||
...data,
|
||||
};
|
||||
|
||||
const response = await knowledgeService.updateKnowledge(updateData);
|
||||
|
||||
if (response.data.code === 0) {
|
||||
return response.data.data;
|
||||
} else {
|
||||
throw new Error(response.data.message || '更新知识库模型配置失败');
|
||||
}
|
||||
} catch (err: any) {
|
||||
const errorMessage = err.response?.data?.message || err.message || '更新知识库模型配置失败';
|
||||
setError(errorMessage);
|
||||
console.error('Failed to update knowledge model config:', err);
|
||||
throw err;
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, []);
|
||||
|
||||
/**
|
||||
* 删除知识库
|
||||
*/
|
||||
const deleteKnowledge = useCallback(async (kbId: string) => {
|
||||
try {
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
|
||||
const response = await knowledgeService.removeKnowledge({ kb_id: kbId });
|
||||
|
||||
if (response.data.code === 0) {
|
||||
return response.data.data;
|
||||
} else {
|
||||
throw new Error(response.data.message || '删除知识库失败');
|
||||
}
|
||||
} catch (err: any) {
|
||||
const errorMessage = err.response?.data?.message || err.message || '删除知识库失败';
|
||||
setError(errorMessage);
|
||||
console.error('Failed to delete knowledge:', err);
|
||||
throw err;
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, []);
|
||||
|
||||
/**
|
||||
* 清除错误状态
|
||||
*/
|
||||
const clearError = useCallback(() => {
|
||||
setError(null);
|
||||
}, []);
|
||||
|
||||
return {
|
||||
loading,
|
||||
error,
|
||||
createKnowledge,
|
||||
updateKnowledgeBasicInfo,
|
||||
updateKnowledgeModelConfig,
|
||||
deleteKnowledge,
|
||||
clearError,
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* 知识库批量操作Hook
|
||||
* 提供批量删除等功能
|
||||
*/
|
||||
export const useKnowledgeBatchOperations = () => {
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
|
||||
/**
|
||||
* 批量删除知识库
|
||||
*/
|
||||
const batchDeleteKnowledge = useCallback(async (kbIds: string[]) => {
|
||||
try {
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
|
||||
const results = await Promise.allSettled(
|
||||
kbIds.map(kbId => knowledgeService.removeKnowledge({ kb_id: kbId }))
|
||||
);
|
||||
|
||||
const failures = results
|
||||
.map((result, index) => ({ result, index }))
|
||||
.filter(({ result }) => result.status === 'rejected')
|
||||
.map(({ index }) => kbIds[index]);
|
||||
|
||||
if (failures.length > 0) {
|
||||
throw new Error(`删除失败的知识库: ${failures.join(', ')}`);
|
||||
}
|
||||
|
||||
return results;
|
||||
} catch (err: any) {
|
||||
const errorMessage = err.response?.data?.message || err.message || '批量删除知识库失败';
|
||||
setError(errorMessage);
|
||||
console.error('Failed to batch delete knowledge:', err);
|
||||
throw err;
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, []);
|
||||
|
||||
/**
|
||||
* 清除错误状态
|
||||
*/
|
||||
const clearError = useCallback(() => {
|
||||
setError(null);
|
||||
}, []);
|
||||
|
||||
return {
|
||||
loading,
|
||||
error,
|
||||
batchDeleteKnowledge,
|
||||
clearError,
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -99,8 +99,10 @@ export const useAuth = () => {
|
||||
// 登出功能
|
||||
const logout = () => {
|
||||
localStorage.removeItem('token');
|
||||
localStorage.removeItem('Authorization');
|
||||
localStorage.removeItem('userInfo');
|
||||
setToken(null);
|
||||
setAuthorization(null);
|
||||
setUserInfo(null);
|
||||
navigate('/login');
|
||||
};
|
||||
|
||||
12
src/hooks/useDialog.ts
Normal file
12
src/hooks/useDialog.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { useContext } from 'react';
|
||||
import { DialogContext } from '../components/Provider/DialogProvider';
|
||||
import { type IDialogContextValue } from '../interfaces/common';
|
||||
|
||||
// 导出useDialog hook
|
||||
export const useDialog = (): IDialogContextValue => {
|
||||
const context = useContext(DialogContext);
|
||||
if (!context) {
|
||||
throw new Error('useDialog must be used within a DialogProvider');
|
||||
}
|
||||
return context;
|
||||
};
|
||||
Reference in New Issue
Block a user