[fix]修复服务启动 (#3)

This commit is contained in:
lanceyq
2025-12-04 18:50:09 +08:00
committed by GitHub
parent b9c705998b
commit 0117194a67
23 changed files with 675 additions and 269 deletions

View File

@@ -145,6 +145,7 @@ const CreateDataset = () => {
});
return;
}
debugger
// 显示确认弹框
confirm({
@@ -195,11 +196,12 @@ const CreateDataset = () => {
title: t('common.deleteWarning'),
content: t('common.deleteWarningContent', { content: record.name }),
onOk: async () => {
// TODO: 实现删除逻辑
const response = await deleteDocument(record.id);
await deleteDocument(record.id);
// 删除成功,刷新列表
// messageApi.success(t('common.deleteSuccess'));
// 删除成功,从 rechunkFileIds 中移除该 id
setRechunkFileIds((prev) => prev.filter((id) => id !== record.id));
// 刷新列表
messageApi.success(t('common.deleteSuccess'));
tableRef.current?.loadData();
@@ -560,15 +562,24 @@ const CreateDataset = () => {
{current === 2 && (
<Spin spinning={pollingLoading} tip={t('knowledgeBase.processingDocuments') || '正在处理文档...'}>
<div className='rb:text-sm rb:text-gray-500 rb:mt-4 rb:h-[calc(100%-160px)] rb:overflow-y-auto'>
<Table
ref={tableRef}
apiUrl={`/documents/${knowledgeBaseId}/${parentId}/documents`}
apiParams={{
document_ids: rechunkFileIds.join(','),
}}
columns={columns}
rowKey="id"
/>
{rechunkFileIds.length > 0 ? (
<Table
ref={tableRef}
apiUrl={`/documents/${knowledgeBaseId}/${parentId}/documents`}
apiParams={{
document_ids: rechunkFileIds.join(','),
}}
columns={columns}
rowKey="id"
/>
) : (
<Table
ref={tableRef}
columns={columns}
rowKey="id"
initialData={[]}
/>
)}
</div>
</Spin>
)}

View File

@@ -11,10 +11,6 @@ import type { AnyObject } from 'antd/es/_util/type';
import { MoreOutlined } from '@ant-design/icons';
import folderIcon from '@/assets/images/knowledgeBase/folder.png';
import textIcon from '@/assets/images/knowledgeBase/text.png';
import imageIcon from '@/assets/images/knowledgeBase/image.png';
import blankIcon from '@/assets/images/knowledgeBase/blankDocument.png';
import templateIcon from '@/assets/images/knowledgeBase/template.png';
import backupIcon from '@/assets/images/knowledgeBase/backup.png';
import editIcon from '@/assets/images/knowledgeBase/edit.png';
import { getKnowledgeBaseDetail, deleteDocument, downloadFile, updateKnowledgeBase } from '../service';
import type {
@@ -35,6 +31,7 @@ import CreateDatasetModal from '../components/CreateDatasetModal';
import CreateImageDataset from '../components/CreateImageDataset';
import FolderTree, { type TreeNodeData } from '../components/FolderTree';
import { formatDateTime } from '@/utils/format';
import { useMenu } from '@/store/menu';
import './Private.css'
const { confirm } = Modal
// 树节点数据类型
@@ -57,7 +54,6 @@ const Private: FC = () => {
kb_id:knowledgeBaseId ?? '',
parent_id:parentId ?? ''
});
const [keywords, setKeywords] = useState<string>('');
const [query, setQuery] = useState<Record<string, unknown>>({
orderby: 'created_at',
desc: true,
@@ -66,6 +62,8 @@ const Private: FC = () => {
const shareModalRef = useRef<ShareModalRef>(null);
const datasetModalRef = useRef<CreateDatasetModalRef>(null);
const [folderTreeRefreshKey, setFolderTreeRefreshKey] = useState(0);
const { allBreadcrumbs, setCustomBreadcrumbs } = useMenu();
const [folderPath, setFolderPath] = useState<Array<{ id: string; name: string }>>([]);
useEffect(() => {
if (knowledgeBaseId) {
let url = `/documents/${knowledgeBaseId}/${parentId}/documents`;
@@ -74,6 +72,13 @@ const Private: FC = () => {
}
}, [knowledgeBaseId]);
// 更新面包屑
useEffect(() => {
if (knowledgeBase) {
updateBreadcrumbs();
}
}, [knowledgeBase, folderPath]);
// 监听 tableApi 变化,自动刷新表格数据
useEffect(() => {
if (tableApi) {
@@ -95,17 +100,82 @@ const Private: FC = () => {
setLoading(true);
try {
const res = await getKnowledgeBaseDetail(id);
setKnowledgeBase(res.data || res);
// 将 KnowledgeBase 转换为 KnowledgeBaseListItem
const listItem = res as unknown as KnowledgeBaseListItem;
setKnowledgeBase(listItem);
} finally {
setLoading(false);
}
};
// 更新面包屑,包含知识库名称和文件夹路径
const updateBreadcrumbs = () => {
if (!knowledgeBase) return;
const baseBreadcrumbs = allBreadcrumbs['space'] || [];
// 只保留知识库菜单项之前的面包屑
const knowledgeBaseMenuIndex = baseBreadcrumbs.findIndex(item => item.path === '/knowledge-base');
const filteredBaseBreadcrumbs = knowledgeBaseMenuIndex >= 0
? baseBreadcrumbs.slice(0, knowledgeBaseMenuIndex + 1)
: baseBreadcrumbs;
const customBreadcrumbs = [
...filteredBaseBreadcrumbs,
{
id: 0,
parent: 0,
code: null,
label: knowledgeBase.name,
i18nKey: null,
path: null,
enable: true,
display: true,
level: 0,
sort: 0,
icon: null,
iconActive: null,
menuDesc: null,
deleted: null,
updateTime: 0,
new_: null,
keepAlive: false,
master: null,
disposable: false,
appSystem: null,
subs: [],
},
...folderPath.map((folder) => ({
id: 0,
parent: 0,
code: null,
label: folder.name,
i18nKey: null,
path: null,
enable: true,
display: true,
level: 0,
sort: 0,
icon: null,
iconActive: null,
menuDesc: null,
deleted: null,
updateTime: 0,
new_: null,
keepAlive: false,
master: null,
disposable: false,
appSystem: null,
subs: [],
})),
];
setCustomBreadcrumbs(customBreadcrumbs, 'space');
};
// 处理树节点选择
const onSelect = (selectedKeys: React.Key[], info: any) => {
const onSelect = (selectedKeys: React.Key[]) => {
if (!selectedKeys.length) return;
if (!folder) return;
const node = info.node as TreeNodeData;
const f = {
...folder,
parent_id: String(selectedKeys[0]),
@@ -114,17 +184,16 @@ const Private: FC = () => {
setTableApi(url);
setParentId(String(selectedKeys[0]))
setFolder(f)
// 根据节点类型执行不同操作
if (node.type === 'folder') {
// 文件夹:展开/收起
} else if (node.type === 'text' || node.type === 'image' || node.type === 'dataset') {
// 文件:打开详情
}
};
// 处理文件夹路径变化
const handleFolderPathChange = (path: Array<{ id: string; name: string }>) => {
setFolderPath(path);
};
// 处理树节点展开
const onExpand = (expandedKeys: React.Key[], info: any) => {
const onExpand = (_expandedKeys: React.Key[], _info: any) => {
// 展开节点时不需要特殊处理
};
// create / import list
const createItems: MenuProps['items'] = [
@@ -190,10 +259,7 @@ const Private: FC = () => {
// },
];
//
const handleCreate = (type: string) => {
console.log('create', type);
}
// 处理开关
const onChange = (checked: boolean) => {
updateKnowledgeBase(knowledgeBaseId || '', {
@@ -348,8 +414,7 @@ const Private: FC = () => {
title: t('knowledgeBase.status'),
dataIndex: 'progress',
key: 'progress',
render: (value: string | number, record: AnyObject) => {
render: (value: string | number) => {
return (
<span className="rb:text-xs rb:border rb:border-[#DFE4ED] rb:bg-[#FBFDFF] rb:rounded rb:items-center rb:text-[#212332] rb:py-1 rb:px-2">
<span
@@ -445,6 +510,7 @@ const Private: FC = () => {
knowledgeBaseId={knowledgeBaseId ?? ''}
refreshKey={folderTreeRefreshKey}
onRootLoad={handleRootTreeLoad}
onFolderPathChange={handleFolderPathChange}
/>
</div>
)}

View File

@@ -58,6 +58,7 @@ interface FolderTreeProps {
style?: CSSProperties;
refreshKey?: number;
onRootLoad?: (nodes: TreeNodeData[] | null) => void;
onFolderPathChange?: (path: Array<{ id: string; name: string }>) => void;
}
const renderIcon = (icon?: string) => {
@@ -271,6 +272,7 @@ const FolderTree: FC<FolderTreeProps> = ({
style,
refreshKey = 0,
onRootLoad,
onFolderPathChange,
}) => {
const [treeData, setTreeData] = useState<TreeNodeData[]>([]);
@@ -347,6 +349,42 @@ const FolderTree: FC<FolderTreeProps> = ({
}
};
// 查找节点路径的辅助函数
const findNodePath = (nodes: TreeNodeData[], targetKey: Key, currentPath: Array<{ id: string; name: string }> = []): Array<{ id: string; name: string }> | null => {
for (const node of nodes) {
const newPath = [...currentPath, { id: String(node.key), name: String(node.title) }];
if (node.key === targetKey) {
return newPath;
}
if (node.children) {
const found = findNodePath(node.children, targetKey, newPath);
if (found) {
return found;
}
}
}
return null;
};
// 处理选择事件,计算并传递路径
const handleSelect: TreeProps['onSelect'] = (selectedKeys, info) => {
if (selectedKeys.length > 0) {
const path = findNodePath(treeData, selectedKeys[0]);
if (path && onFolderPathChange) {
onFolderPathChange(path);
}
} else if (onFolderPathChange) {
onFolderPathChange([]);
}
// 调用原始的 onSelect 回调
if (onSelect) {
onSelect(selectedKeys, info);
}
};
const treeNodes = useMemo(() => transformTreeData(treeData), [treeData]);
return (
@@ -354,7 +392,7 @@ const FolderTree: FC<FolderTreeProps> = ({
multiple={multiple}
className={className}
style={style}
onSelect={onSelect}
onSelect={handleSelect}
onExpand={onExpand}
loadData={onLoadData}
treeData={treeNodes}

View File

@@ -4,7 +4,7 @@
* @Author: yujiangping
* @Date: 2025-11-10 18:52:55
* @LastEditors: yujiangping
* @LastEditTime: 2025-11-25 17:46:36
* @LastEditTime: 2025-12-03 18:44:58
*/
import { forwardRef, useImperativeHandle, useState } from 'react';
import { Switch } from 'antd';
@@ -24,7 +24,7 @@ const ShareModal = forwardRef<ShareModalRef,ShareModalRefProps>(({ handleShare:
const [messageApi, contextHolder] = message.useMessage();
const [visible, setVisible] = useState(false);
const [loading, setLoading] = useState(false)
const [curIndex, setCurIndex] = useState(9999);
const [curIndex, setCurIndex] = useState(-1);
const [kbId, setKbId] = useState<string>('');
const [spaceIds, setSpaceIds] = useState<string>('');
const [knowledgeBase, setKnowledgeBase] = useState<KnowledgeBase | null>(null);
@@ -32,7 +32,7 @@ const ShareModal = forwardRef<ShareModalRef,ShareModalRefProps>(({ handleShare:
// 封装取消方法,添加关闭弹窗逻辑
const handleClose = () => {
setCurIndex(9999);
setCurIndex(-1);
setLoading(false)
setVisible(false);
};
@@ -53,8 +53,13 @@ const ShareModal = forwardRef<ShareModalRef,ShareModalRefProps>(({ handleShare:
// 获取所有 checked 为 true 的数据
const checkedItems = spaceList.filter(item => item.is_active);
debugger
// 获取当前选中的项curIndex 对应的数据)
const selectedItem = curIndex !== 9999 ? spaceList[curIndex] : null;
const selectedItem = curIndex !== -1 ? spaceList[curIndex] : null;
if(!selectedItem){
messageApi.error(t('knowledgeBase.selectSpace'));
return;
}
const payload = {
source_kb_id: kbId ?? '',
target_workspace_id: selectedItem?.id ?? '',