diff --git a/app/renderer/src/main/src/pages/KnowledgeBase/compoment/AddKnowledgeBaseModal.tsx b/app/renderer/src/main/src/pages/KnowledgeBase/compoment/AddKnowledgeBaseModal.tsx index 991bb7ab97..f2970f64bd 100644 --- a/app/renderer/src/main/src/pages/KnowledgeBase/compoment/AddKnowledgeBaseModal.tsx +++ b/app/renderer/src/main/src/pages/KnowledgeBase/compoment/AddKnowledgeBaseModal.tsx @@ -4,7 +4,7 @@ import { YakitInputNumber } from '@/components/yakitUI/YakitInputNumber/YakitInp import { YakitModal } from '@/components/yakitUI/YakitModal/YakitModal' import { Collapse, Form } from 'antd' import { Dispatch, FC, SetStateAction } from 'react' -import { getFileInfoList } from '../utils' +import { getFileInfoList, ValidatorFilePath } from '../utils' import { randomString } from '@/utils/randomUtil' import { useKnowledgeBase } from '../hooks/useKnowledgeBase' import { success } from '@/utils/notification' @@ -83,28 +83,7 @@ const AddKnowledgeBaseModal: FC = ({ label: '上传文件', rules: [ { - validator: (_, value) => { - if (!value) { - return Promise.reject('请上传文件') - } - - // 多个文件用逗号分隔 - const files = value.split(',').map((i) => i.trim()) - - // 校验格式:必须有文件名 + 后缀 - const reg = /^[^.\/]+?\.[^.\/]+$/ - - for (const file of files) { - // 取文件名 (兼容 windows、mac 路径) - const fileName = file.split('/').pop()?.split('\\').pop() - - if (!fileName || !reg.test(fileName)) { - return Promise.reject('请上传有效的文件') - } - } - - return Promise.resolve() - }, + validator: ValidatorFilePath, }, ], }} diff --git a/app/renderer/src/main/src/pages/KnowledgeBase/compoment/CreateKnowledgeBase.tsx b/app/renderer/src/main/src/pages/KnowledgeBase/compoment/CreateKnowledgeBase.tsx index 1111250927..60c6162e14 100644 --- a/app/renderer/src/main/src/pages/KnowledgeBase/compoment/CreateKnowledgeBase.tsx +++ b/app/renderer/src/main/src/pages/KnowledgeBase/compoment/CreateKnowledgeBase.tsx @@ -12,7 +12,7 @@ import { YakitFormDragger } from '@/components/yakitUI/YakitForm/YakitForm' import type { FormInstance } from 'antd/es/form/Form' import YakitCollapse from '@/components/yakitUI/YakitCollapse/YakitCollapse' import styles from '../knowledgeBase.module.scss' -import { extractFileName, knowledgeTypeOptions } from '../utils' +import { extractFileName, knowledgeTypeOptions, ValidatorFilePath } from '../utils' import { useKnowledgeBase } from '../hooks/useKnowledgeBase' import { YakitRadioButtons } from '@/components/yakitUI/YakitRadioButtons/YakitRadioButtons' import classNames from 'classnames' @@ -78,28 +78,7 @@ const CreateKnowledgeBase: FC<{ form: FormInstance; type?: 'new' }> = ({ fo label: '上传文件', rules: [ { - validator: (_, value) => { - if (value) { - // 多个文件用逗号分隔 - const files = value.split(',').map((i) => i.trim()) - - // 校验格式:必须有文件名 + 后缀 - const reg = /^[^.\/]+?\.[^.\/]+$/ - - for (const file of files) { - // 取文件名 (兼容 windows、mac 路径) - const fileName = file.split('/').pop()?.split('\\').pop() - - if (!fileName || !reg.test(fileName)) { - return Promise.reject('请上传有效的文件') - } - } - - return Promise.resolve() - } else { - return Promise.resolve() - } - }, + validator: ValidatorFilePath, }, ], }} diff --git a/app/renderer/src/main/src/pages/KnowledgeBase/compoment/ImportModal.tsx b/app/renderer/src/main/src/pages/KnowledgeBase/compoment/ImportModal.tsx index aa7dd4c986..1191c708a4 100644 --- a/app/renderer/src/main/src/pages/KnowledgeBase/compoment/ImportModal.tsx +++ b/app/renderer/src/main/src/pages/KnowledgeBase/compoment/ImportModal.tsx @@ -9,7 +9,7 @@ import { Dispatch, SetStateAction, useEffect, useRef } from 'react' import { YakitFormDragger } from '@/components/yakitUI/YakitForm/YakitForm' import { KnowledgeBaseContentProps } from '../TKnowledgeBase' import { KnowledgeBaseItem, useKnowledgeBase } from '../hooks/useKnowledgeBase' -import { extractFileName } from '../utils' +import { extractFileName, ValidatorFilePath } from '../utils' import useGetSetState from '@/pages/pluginHub/hooks/useGetSetState' import { randomString } from '@/utils/randomUtil' @@ -201,28 +201,7 @@ const ImportModal: React.FC = (props) => { name: 'importPath', rules: [ { - validator: (_, value) => { - if (!value) { - return Promise.reject('请上传文件') - } - - // 多个文件用逗号分隔 - const files = value.split(',').map((i) => i.trim()) - - // 校验格式:必须有文件名 + 后缀 - const reg = /^[^.\/]+?\.[^.\/]+$/ - - for (const file of files) { - // 取文件名 (兼容 windows、mac 路径) - const fileName = file.split('/').pop()?.split('\\').pop() - - if (!fileName || !reg.test(fileName)) { - return Promise.reject('请上传有效的文件') - } - } - - return Promise.resolve() - }, + validator: ValidatorFilePath, }, ], }} diff --git a/app/renderer/src/main/src/pages/KnowledgeBase/utils.tsx b/app/renderer/src/main/src/pages/KnowledgeBase/utils.tsx index e6aaa0aef8..4cf0b105cb 100644 --- a/app/renderer/src/main/src/pages/KnowledgeBase/utils.tsx +++ b/app/renderer/src/main/src/pages/KnowledgeBase/utils.tsx @@ -47,6 +47,7 @@ import joyrideFirstStepImg from '@/pages/KnowledgeBase/images/joyride-first-step import knowledgeJoyrideThree from '@/pages/KnowledgeBase/images/knowledge-joyride-three.mp4' import { Step } from 'react-joyride' import styles from './knowledgeBase.module.scss' +import { RuleObject } from 'antd/lib/form' const { ipcRenderer } = window.require('electron') @@ -1041,6 +1042,30 @@ const downloadOnlineRagWithEvents = ( const exclude = ['llama-server', 'model-Qwen3-Embedding-0.6B-Q4'] +type TValidatorFilePath = (_: RuleObject, value: string) => Promise + +const ValidatorFilePath: TValidatorFilePath = (_, value) => { + if (!value) { + return Promise.reject('请上传文件') + } + + const files = value.split(',').map((i) => i.trim()) + + for (const file of files) { + // 兼容 windows/mac + const fileName = file.split('/').pop()?.split('\\').pop() + + // 必须存在扩展名 + const reg = /^.+\.[^.]+$/ + + if (!fileName || !reg.test(fileName)) { + return Promise.reject('请上传有效的文件') + } + } + + return Promise.resolve() +} + export { targetInstallList, getFileInfoList, @@ -1076,4 +1101,5 @@ export { downloadWithEvents, downloadOnlineRagWithEvents, exclude, + ValidatorFilePath, }