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:
2025-10-13 12:26:10 +08:00
parent d475a0e982
commit 5c937df5ed
18 changed files with 2151 additions and 184 deletions

View File

@@ -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,
};
};

View File

@@ -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
View 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;
};