Ver Fonte

知识库配置

1025859868@qq.com há 1 ano atrás
pai
commit
2734110636

+ 7 - 1
public/locales/en/bs.json

@@ -276,7 +276,13 @@
         "textDataset": "Text dataset",
         "tableDataset": "Table Dataset",
         "createImport": "Create/Import",
-        "knowledge": "Knowledge base"
+        "knowledge": "Knowledge base",
+        "web": "Website",
+        "knowledgeId": "Knowledge Base ID",
+        "knowledgeImg": "Knowledge Base Avatar",
+        "indexModel": "Index model",
+        "dataUp": "Single data upper limit",
+        "introduce": "Introduce"
     },
     "code": {
         "editPythonCodeDescription": "Edit your Python code here. This code snippet accepts module imports and a function definition. Make sure your function returns a string.",

+ 7 - 1
public/locales/zh/bs.json

@@ -268,7 +268,13 @@
         "textDataset": "文本数据集",
         "tableDataset": "表格数据集",
         "createImport": "新建/导入",
-        "knowledge": "知识库"
+        "knowledge": "知识库",
+        "web": "网站",
+        "knowledgeId": "知识库ID",
+        "knowledgeImg": "知识库头像",
+        "indexModel": "索引模型",
+        "dataUp": "单条数据上限",
+        "introduce": "介绍"
     },
     "code": {
         "editPythonCodeDescription": "编辑你的 Python 代码此代码片段接受模块导入和一个函数定义。确保您的函数返回一个字符串。",

BIN
src/assets/knowledge/red-delete-icon.png


BIN
src/assets/knowledge/set-active-icon.png


+ 8 - 0
src/controllers/API/index.ts

@@ -168,6 +168,14 @@ export async function updateFileLib(data) {
 }
 
 /**
+ * 修改支持库
+ *
+ */
+export async function getFileLibById(id) {
+  return await axios.get(`/api/v1/knowledge/${id}`);
+}
+
+/**
  * 修改支持库文件
  *
  */

+ 135 - 0
src/pages/Knowledge/components/configModel.tsx

@@ -0,0 +1,135 @@
+import {Link, useNavigate, useParams} from "react-router-dom";
+import { useContext, useEffect, useRef, useState } from "react";
+import { useTranslation } from "react-i18next";
+import { locationContext } from "../../../contexts/locationContext";
+import {
+    getFileLibById,
+    deleteFileLib, updateFileLib
+} from "../../../controllers/API";
+import {captureAndAlertRequestErrorHoc} from "../../../controllers/request";
+
+
+export default function ConfigModal({ id, reload }) {
+    if(!open) return null
+
+    const { t } = useTranslation()
+    const [knowledge, setKnowledge] = useState({})
+    const [nameValue, setNameValue] = useState("")
+    const [descValue, setDescValue] = useState("")
+    const navigate = useNavigate()
+
+    useEffect(() => {
+        getFileLibById(id).then(res => {
+            const data = res || {}
+            setNameValue(data.name)
+            setDescValue(data.description)
+            setKnowledge(data)
+        })
+    }, [id])
+
+    // 删除
+    const { delShow, idRef, close, delConfim } = useDelete()
+
+    const handleDelete = () => {
+        captureAndAlertRequestErrorHoc(deleteFileLib(idRef.current).then(res => {
+            navigate("/filelib");
+        }));
+    }
+
+    const saveKnowledge = () => {
+        captureAndAlertRequestErrorHoc(updateFileLib({
+            id: knowledge.id,
+            name: nameValue,
+            parent_id: knowledge.parent_id,
+            description: descValue
+        }).then(res => {
+            reload()
+        }))
+    }
+
+    return (
+        <div className={"file-list  p-6 overflow-y-auto"}>
+            <div className={'knowledge-header'}>
+                <div className={'knowledge-title'}>
+                    <div>配置</div>
+                </div>
+            </div>
+            <div style={{marginTop: '50px'}}>
+                <div className={'config-item'}>
+                    <div className={'config-item-title'}>{ t("lib.knowledgeId")}</div>
+                    <div className={'config-item-value'}>{knowledge.id}</div>
+                </div>
+                <div className={'config-item'}>
+                    <div className={'config-item-title'}>{ t("lib.knowledgeImg")}</div>
+                    <div className={'config-item-value'}>
+                        {
+                            knowledge.img_url?
+                                <img src={"/src/assets/knowledge/knowledge-icon.png"} className={"knowledge-img"}/>
+                                :
+                                <span className={"knowledge-img-bg"}>
+                                        <img src={"/src/assets/knowledge/knowledge-icon.png"}/>
+                                    </span>
+                        }
+                    </div>
+                </div>
+                <div className={'config-item'}>
+                    <div className={'config-item-title'}>{ t("lib.libraryName")}</div>
+                    <div className={'config-item-value'}>
+                        <input id="name" value={nameValue}
+                               onChange={event => setNameValue(event.target.value)} placeholder={t('lib.giveAName')} className={'form-input'}/>
+                    </div>
+                </div>
+                <div className={'config-item'}>
+                    <div className={'config-item-title'}>{ t("lib.indexModel")}</div>
+                    <div className={'config-item-value'}>{knowledge.model}</div>
+                </div>
+                <div className={'config-item'}>
+                    <div className={'config-item-title'}>{ t("lib.dataUp")}</div>
+                    <div className={'config-item-value'}>3000</div>
+                </div>
+                <div className={'config-item'}>
+                    <div className={'config-item-title'}>{ t("lib.introduce")}</div>
+                    <div className={'config-item-value'}>
+                        <textarea id="desc" value={descValue}
+                               onChange={event => setDescValue(event.target.value)} placeholder={t('lib.describe')} className={'form-input'}/>
+                    </div>
+                </div>
+            </div>
+            <div className={'config-button-box'}>
+                <button className={"delete-button"} onClick={(event) => {
+                    delConfim(knowledge.id)
+                }}><img src={"/src/assets/knowledge/red-delete-icon.png"} className={"delete-icon"}/></button>
+                <button className={"save-button"} onClick={(event) => {
+                    saveKnowledge(knowledge.id)
+                }}>{t('save')}</button>
+            </div>
+            <dialog className={`modal ${delShow && 'modal-open'}`}>
+                <form method="dialog" className="modal-box w-[360px] bg-[#fff] shadow-lg dialog-box">
+                    <h3 className="tip-title">{t('prompt')}</h3>
+                    <p className="tip-message">{t('lib.confirmDeleteLibrary')}</p>
+                    <div className={"button-box"}>
+                        <button className={"cancel-button tip-button"} onClick={close}>{t("cancel")}</button>
+                        <button className={"confirm-button delete-button tip-button-margin"} onClick={handleDelete}>{t("lib.confirmDelete")}</button>
+                    </div>
+                </form>
+            </dialog>
+        </div>
+    )
+};
+
+const useDelete = () => {
+    const [delShow, setDelShow] = useState(false)
+    const idRef = useRef<any>(null)
+
+    return {
+        delShow,
+        idRef,
+        close: () => {
+            setDelShow(false)
+        },
+        delConfim: (id) => {
+            idRef.current = id
+            setDelShow(true)
+        }
+    }
+}

+ 2 - 1
src/pages/Knowledge/components/moveModel.tsx

@@ -58,7 +58,8 @@ export default function MoveModal({ data, open, setOpen, reload }) {
             captureAndAlertRequestErrorHoc(updateFileLib({
                 id: data.id,
                 name: data.name,
-                parent_id: parentId
+                parent_id: parentId,
+                description: data.description
             }).then(res => {
                 reload()
                 setOpen(false)

+ 3 - 2
src/pages/Knowledge/components/renameModel.tsx

@@ -6,7 +6,7 @@ import {alertContext} from "../../../contexts/alertContext";
 import {captureAndAlertRequestErrorHoc} from "../../../controllers/request";
 import writeIcon from "../../../assets/knowledge/write-icon.png";
 
-export default function CreateModal({ data, open, setOpen, reload }) {
+export default function RenameModal({ data, open, setOpen, reload }) {
     const { t } = useTranslation()
     const navigate = useNavigate()
     const name = data.nameType == "file"? data.file_name :data.name
@@ -42,7 +42,8 @@ export default function CreateModal({ data, open, setOpen, reload }) {
             captureAndAlertRequestErrorHoc(updateFileLib({
                 id: data.id,
                 name: name,
-                parent_id: data.parent_id
+                parent_id: data.parent_id,
+                description: data.description
             }).then(res => {
                 reload()
                 setOpen(false)

+ 189 - 177
src/pages/Knowledge/knowledge.tsx

@@ -27,7 +27,7 @@ import { Select, SelectContent, SelectGroup, SelectIconTrigger, SelectItem } fro
 import { locationContext } from "../../contexts/locationContext";
 import {
     deleteFile,
-    deleteFileLib,
+    deleteFileLib, getFileLibById,
     readFileByLibDatabase,
     readFileLibDatabase,
     retryKnowledgeFileApi
@@ -44,6 +44,7 @@ import {
 import CreateModal from "./components/createModel";
 import RenameModal from "./components/renameModel";
 import MoveModal from "./components/moveModel";
+import ConfigModal from "./components/configModel";
 import {userContext} from "../../contexts/userContext";
 
 export default function FilesPage() {
@@ -52,24 +53,25 @@ export default function FilesPage() {
     const { id } = useParams()
     // 上传 上传成功添加到列表
     const [open, setOpen] = useState(false)
-    const [title, setTitle] = useState('')
+    const [knowledge, setKnowledge] = useState({})
     const nameRef = useRef(null)
     const [renameOpen, setRenameOpen] = useState(false);
     const [moveOpen, setMoveOpen] = useState(false);
     const [parentId, setParentId] = useState(id)
+    const [tabType, setTabType] = useState(1);
 
     useEffect(() => {
         setParentId(id)
+        getFileLibById(id).then(res => {
+            const data = res || {}
+            setKnowledge(data)
+        })
     }, [id])
 
     const [type, setType] = useState(1)
     const [data, setData] = useState({})
     const [titleArray, setTitleArray] = useState([]);
 
-    const detailData = {
-        img_url: ""
-    }
-
     const [hasPermission, setHasPermission] = useState(true)
     const { appConfig } = useContext(locationContext)
 
@@ -80,7 +82,7 @@ export default function FilesPage() {
         readFileLibDatabase(param.page, 10000, param.keyword, parentId)
     )
 
-    const { page, pageSize, data: datalist, total, loading, setPage, search, reload:fileReload, filterData, refreshData } = useTable({}, (param) =>
+    const { page, pageSize, data: datalist, total, loading, setPage, search: fileSearch, reload:fileReload, filterData, refreshData } = useTable({}, (param) =>
         readFileByLibDatabase({ ...param, id: parentId, pageSize: 10000, name: param.keyword }).then(res => {
             setHasPermission(res.writeable)
             return res
@@ -95,18 +97,17 @@ export default function FilesPage() {
     const reload = () => {
         fileReload()
         libReload()
+        getFileLibById(id).then(res => {
+            const data = res || {}
+            setKnowledge(data)
+        })
+    }
+
+    const search = (keyword) => {
+        libSearch(keyword)
+        fileSearch(keyword)
     }
 
-    useEffect(() => {
-        // @ts-ignore
-        const libname = window.libname // 临时记忆
-        if (libname) {
-            // @ts-ignore
-            localStorage.setItem('libname', window.libname)
-        }
-        // @ts-ignore
-        setTitle(window.libname || localStorage.getItem('libname'))
-    }, [])
 
     const handleOpen = (e) => {
         setOpen(e)
@@ -202,21 +203,27 @@ export default function FilesPage() {
                     <div className={"file-info relative"}>
                         <div className={"file-name"}>
                             {
-                                detailData.img_url?
+                                knowledge.img_url?
                                     <img src={"/src/assets/knowledge/knowledge-icon.png"} className={"knowledge-img"}/>
                                     :
                                     <span className={"knowledge-img-bg"}>
                                         <img src={"/src/assets/knowledge/knowledge-icon.png"}/>
                                     </span>
                             }
-                            <label>{ title }</label>
+                            <label>{ knowledge.name }</label>
+                        </div>
+                        <div className={"folder-type"}>
+                            {t('lib.universalKnowledgeBase') }
                         </div>
-                        <div className={"folder-type"}>{t('lib.universalKnowledgeBase')}</div>
-                        <div className={"file-menu-active"}>
-                            <img src={"/src/assets/knowledge/knowledge-active-icon.png"}/>{t("lib.dataset")}
+                        <div className={tabType == 1 ? "file-menu-active" : "file-menu"} onClick={ () => {
+                            setTabType(1)
+                        }} >
+                            <img src={tabType == 1 ? "/src/assets/knowledge/knowledge-active-icon.png" : "/src/assets/knowledge/knowledge-icon.png"}/>{t("lib.dataset")}
                         </div>
-                        <div className={"file-menu"}>
-                            <img src={"/src/assets/knowledge/set-icon.png"}/>{t("lib.config")}
+                        <div className={tabType == 2 ? "file-menu-active" : "file-menu"} onClick={ () => {
+                            setTabType(2)
+                        }} >
+                            <img src={tabType == 2 ? "/src/assets/knowledge/set-active-icon.png" : "/src/assets/knowledge/set-icon.png"}/>{t("lib.config")}
                         </div>
                         <div>
 
@@ -226,170 +233,175 @@ export default function FilesPage() {
                             <div  className={"back-knowledge"}><img src={"/src/assets/knowledge/back-icon.png"}/>{t("lib.allKnowledge")}</div>
                         </Link>
                     </div>
-                    <div className={"file-list  p-6 overflow-y-auto"}>
-                        <div className={'knowledge-header'}>
-                            <div className={'knowledge-title'}>
-                                {titleArray.length > 0?
-                                    <div className={"title-list"}>
-                                        <div className={"title-item"}>
-                                            <label onClick={()=>backFolder(id, -1)}>{t("lib.rootDirectory")}</label>
-                                        </div>
-                                        {
-                                            titleArray.map((title, index) => (
-                                                <div className={"title-item"} key={title}>
-                                                    <span>{index <= (titleArray.length - 1)? ">" : ""}</span>
-                                                    <label onClick={()=>backFolder(title.id, index)}>{title.name}</label>
+                    {
+                        tabType == 1 ?
+                            <div className={"file-list  p-6 overflow-y-auto"}>
+                                <div className={'knowledge-header'}>
+                                    <div className={'knowledge-title'}>
+                                        {titleArray.length > 0?
+                                            <div className={"title-list"}>
+                                                <div className={"title-item"}>
+                                                    <label onClick={()=>backFolder(id, -1)}>{t("lib.rootDirectory")}</label>
                                                 </div>
-                                            ))
+                                                {
+                                                    titleArray.map((title, index) => (
+                                                        <div className={"title-item"} key={title}>
+                                                            <span>{index <= (titleArray.length - 1)? ">" : ""}</span>
+                                                            <label onClick={()=>backFolder(title.id, index)}>{title.name}</label>
+                                                        </div>
+                                                    ))
+                                                }
+                                            </div>
+                                            :
+                                            <div>{t("lib.file")}({libTotal + total})</div>
                                         }
                                     </div>
-                                    :
-                                    <div>{t("lib.file")}({libTotal + total})</div>
-                                }
-                            </div>
-                            {hasPermission &&
-                                <div className={'knowledge-create-box'}>
-                                    <DropdownMenu>
-                                        <DropdownMenuTrigger>
-                                            <div className={'knowledge-create'} onClick={() => setOpen(true)}>
-                                                <img src={"/src/assets/knowledge/add-icon.png"} className={'create-icon'}/>
-                                                <label style={{letterSpacing:0}}>{t("lib.createImport")}</label>
-                                            </div>
-                                        </DropdownMenuTrigger>
-                                        <DropdownMenuContent>
-                                            <DropdownMenuItem onClick={()=>{
-                                                setType(1)
-                                                setOpen(true)
-                                            }}><img src={"/src/assets/knowledge/folder-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.folder")}</DropdownMenuItem>
-                                            <DropdownMenuItem ><img src={"/src/assets/knowledge/write-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.manualDataset")}</DropdownMenuItem>
-                                            <DropdownMenuItem ><img src={"/src/assets/knowledge/knowledge-no-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.textDataset")}</DropdownMenuItem>
-                                            <DropdownMenuItem ><img src={"/src/assets/knowledge/table-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.tableDataset")}</DropdownMenuItem>
-                                        </DropdownMenuContent>
-                                    </DropdownMenu>
-                                </div>
-                            }
-                            <div className={"search-box"}>
-                                <input id="name"  ref={nameRef}  className={"form-input"} />
-                                <button onClick={(e) => search(nameRef.current.value)} className={"search-btn"}>{t('tools.Search.display_name')}</button>
-                                <img src={"/src/assets/knowledge/search-icon.png"}/>
-                            </div>
-                        </div>
-                        <Table>
-                            <TableHeader>
-                                <TableRow>
-                                    <TableHead>#</TableHead>
-                                    <TableHead className="w-[600px]">{t('lib.name')}</TableHead>
-                                    <TableHead className="items-center">{t('lib.dataTotal')}</TableHead>
-                                    <TableHead>{t('lib.lastUpdate')}</TableHead>
-                                    {/* 状态 */}
-                                    <TableHead>{t('lib.status')}</TableHead>
-                                    <TableHead className="w-[80px]"></TableHead>
-                                </TableRow>
-                            </TableHeader>
-                            <TableBody>
-                                {datalist.map((el,index) => (
-                                    <TableRow key={el.id} className={"file-row"}>
-                                        <TableCell>{index + 1}</TableCell>
-                                        <TableCell>
-                                            <img className={"img-icon"} src={el.type == 1 ?"/src/assets/chat/write-icon.png":el.type == 2
-                                                ?"/src/assets/knowledge/knowledge-no-icon.png":el.type == 3 ?"/src/assets/knowledge/table-icon.png":"/src/assets/knowledge/folder-icon.png"}/>
-                                            {el.file_name}
-                                        </TableCell>
-                                        <TableCell></TableCell>
-                                        <TableCell>{el.update_time.replace('T', ' ')}</TableCell>
-                                        <TableCell>
-                                            {el.status === 3 ? <div className="flex items-center">
-                                                    <div className="tooltip" data-tip={el.remark}>
-                                                        <span className='text-red-500'>{t('lib.parseFailed')}</span>
-                                                    </div>
-                                                    <Button variant="link"><RotateCw size={16} onClick={() => handleRetry([el])} /></Button>
-                                                </div> :
-                                                <span className={el.status === 3 && 'text-red-500'}>{[t('lib.parseFailed'), t('lib.parsing'), t('lib.completed'), t('lib.parseFailed')][el.status]}</span>
-                                            }
-                                        </TableCell>
-                                        <TableCell>
+                                    {hasPermission &&
+                                        <div className={'knowledge-create-box'}>
                                             <DropdownMenu>
                                                 <DropdownMenuTrigger>
-                                                    <img src={"/src/assets/chat/duihua-gengduo.png"} className={'more-button'}/>
+                                                    <div className={'knowledge-create'} onClick={() => setOpen(true)}>
+                                                        <img src={"/src/assets/knowledge/add-icon.png"} className={'create-icon'}/>
+                                                        <label style={{letterSpacing:0}}>{t("lib.createImport")}</label>
+                                                    </div>
                                                 </DropdownMenuTrigger>
                                                 <DropdownMenuContent>
-                                                    <DropdownMenuItem onClick={(event)=>{
-                                                        event.stopPropagation();
-                                                        // 数据集重命名
-                                                        setData({ ...el, nameType: "file" })
-                                                        setRenameOpen(true)
-                                                    }}><img src={"/src/assets/knowledge/write-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.rename")}</DropdownMenuItem>
-                                                    <DropdownMenuItem onClick={(event)=>{
-                                                        event.stopPropagation();
-                                                        setData({ ...el, nameType: "file" })
-                                                        setMoveOpen(true)
-                                                    }}><img src={"/src/assets/knowledge/move-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.move")}</DropdownMenuItem>
-                                                    {hasPermission &&
-                                                        <DropdownMenuItem  onClick={(event) => {
-                                                            event.stopPropagation();
-                                                            delConfim(el.id, "file")
-                                                        }}>
-                                                            <img src={"/src/assets/knowledge/delete-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t('delete')}
-                                                        </DropdownMenuItem>
-                                                    }
-
+                                                    <DropdownMenuItem onClick={()=>{
+                                                        setType(1)
+                                                        setOpen(true)
+                                                    }}><img src={"/src/assets/knowledge/folder-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.folder")}</DropdownMenuItem>
+                                                    <DropdownMenuItem ><img src={"/src/assets/knowledge/write-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.manualDataset")}</DropdownMenuItem>
+                                                    <DropdownMenuItem ><img src={"/src/assets/knowledge/knowledge-no-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.textDataset")}</DropdownMenuItem>
+                                                    <DropdownMenuItem ><img src={"/src/assets/knowledge/table-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.tableDataset")}</DropdownMenuItem>
                                                 </DropdownMenuContent>
                                             </DropdownMenu>
-                                        </TableCell>
-                                    </TableRow>
-                                ))}
-                                {libList.map((el,index) => (
-                                    <TableRow key={el.id} className={"file-row"}>
-                                        <TableCell>{index + 1}</TableCell>
-                                        <TableCell onClick={ () => handleLibDetail(el) }>
-                                            <img className={"img-icon"} src={"/src/assets/knowledge/folder-icon.png"}/>
-                                            {el.name}
-                                        </TableCell>
-                                        <TableCell></TableCell>
-                                        <TableCell>{el.update_time.replace('T', ' ')}</TableCell>
-                                        <TableCell>
-                                            {el.status === 3 ? <div className="flex items-center">
-                                                    <div className="tooltip" data-tip={el.remark}>
-                                                        <span className='text-red-500'>{t('lib.parseFailed')}</span>
-                                                    </div>
-                                                    <Button variant="link"><RotateCw size={16} onClick={() => handleRetry([el])} /></Button>
-                                                </div> :
-                                                <span className={el.status === 3 && 'text-red-500'}>{[t('lib.parseFailed'), t('lib.parsing'), t('lib.completed'), t('lib.parseFailed')][el.status]}</span>
-                                            }
-                                        </TableCell>
-                                        <TableCell>
-                                            <DropdownMenu>
-                                                <DropdownMenuTrigger>
-                                                    <img src={"/src/assets/chat/duihua-gengduo.png"} className={'more-button'}/>
-                                                </DropdownMenuTrigger>
-                                                <DropdownMenuContent>
-                                                    <DropdownMenuItem onClick={(event)=>{
-                                                        event.stopPropagation();
-                                                        setData(el)
-                                                        setRenameOpen(true)
-                                                    }}><img src={"/src/assets/knowledge/write-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.rename")}</DropdownMenuItem>
-                                                    <DropdownMenuItem onClick={(event)=>{
-                                                        event.stopPropagation();
-                                                        setData(el)
-                                                        setMoveOpen(true)
-                                                    }}><img src={"/src/assets/knowledge/move-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.move")}</DropdownMenuItem>
-                                                    {hasPermission &&
-                                                        <DropdownMenuItem  onClick={(event) => {
-                                                            event.stopPropagation();
-                                                            delConfim(el.id, "folder")
-                                                        }}>
-                                                            <img src={"/src/assets/knowledge/delete-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t('delete')}
-                                                        </DropdownMenuItem>
+                                        </div>
+                                    }
+                                    <div className={"search-box"}>
+                                        <input id="name"  ref={nameRef}  className={"form-input"} />
+                                        <button onClick={(e) => search(nameRef.current.value)} className={"search-btn"}>{t('tools.Search.display_name')}</button>
+                                        <img src={"/src/assets/knowledge/search-icon.png"}/>
+                                    </div>
+                                </div>
+                                <Table>
+                                    <TableHeader>
+                                        <TableRow>
+                                            <TableHead>#</TableHead>
+                                            <TableHead className="w-[600px]">{t('lib.name')}</TableHead>
+                                            <TableHead className="items-center">{t('lib.dataTotal')}</TableHead>
+                                            <TableHead>{t('lib.lastUpdate')}</TableHead>
+                                            {/* 状态 */}
+                                            <TableHead>{t('lib.status')}</TableHead>
+                                            <TableHead className="w-[80px]"></TableHead>
+                                        </TableRow>
+                                    </TableHeader>
+                                    <TableBody>
+                                        {datalist.map((el,index) => (
+                                            <TableRow key={el.id} className={"file-row"}>
+                                                <TableCell>{index + 1}</TableCell>
+                                                <TableCell>
+                                                    <img className={"img-icon"} src={el.type == 1 ?"/src/assets/chat/write-icon.png":el.type == 2
+                                                        ?"/src/assets/knowledge/knowledge-no-icon.png":el.type == 3 ?"/src/assets/knowledge/table-icon.png":"/src/assets/knowledge/folder-icon.png"}/>
+                                                    {el.file_name}
+                                                </TableCell>
+                                                <TableCell></TableCell>
+                                                <TableCell>{el.update_time.replace('T', ' ')}</TableCell>
+                                                <TableCell>
+                                                    {el.status === 3 ? <div className="flex items-center">
+                                                            <div className="tooltip" data-tip={el.remark}>
+                                                                <span className='text-red-500'>{t('lib.parseFailed')}</span>
+                                                            </div>
+                                                            <Button variant="link"><RotateCw size={16} onClick={() => handleRetry([el])} /></Button>
+                                                        </div> :
+                                                        <span className={el.status === 3 && 'text-red-500'}>{[t('lib.parseFailed'), t('lib.parsing'), t('lib.completed'), t('lib.parseFailed')][el.status]}</span>
+                                                    }
+                                                </TableCell>
+                                                <TableCell>
+                                                    <DropdownMenu>
+                                                        <DropdownMenuTrigger>
+                                                            <img src={"/src/assets/chat/duihua-gengduo.png"} className={'more-button'}/>
+                                                        </DropdownMenuTrigger>
+                                                        <DropdownMenuContent>
+                                                            <DropdownMenuItem onClick={(event)=>{
+                                                                event.stopPropagation();
+                                                                // 数据集重命名
+                                                                setData({ ...el, nameType: "file" })
+                                                                setRenameOpen(true)
+                                                            }}><img src={"/src/assets/knowledge/write-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.rename")}</DropdownMenuItem>
+                                                            <DropdownMenuItem onClick={(event)=>{
+                                                                event.stopPropagation();
+                                                                setData({ ...el, nameType: "file" })
+                                                                setMoveOpen(true)
+                                                            }}><img src={"/src/assets/knowledge/move-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.move")}</DropdownMenuItem>
+                                                            {hasPermission &&
+                                                                <DropdownMenuItem  onClick={(event) => {
+                                                                    event.stopPropagation();
+                                                                    delConfim(el.id, "file")
+                                                                }}>
+                                                                    <img src={"/src/assets/knowledge/delete-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t('delete')}
+                                                                </DropdownMenuItem>
+                                                            }
+
+                                                        </DropdownMenuContent>
+                                                    </DropdownMenu>
+                                                </TableCell>
+                                            </TableRow>
+                                        ))}
+                                        {libList.map((el,index) => (
+                                            <TableRow key={el.id} className={"file-row"}>
+                                                <TableCell>{index + 1}</TableCell>
+                                                <TableCell onClick={ () => handleLibDetail(el) }>
+                                                    <img className={"img-icon"} src={"/src/assets/knowledge/folder-icon.png"}/>
+                                                    {el.name}
+                                                </TableCell>
+                                                <TableCell></TableCell>
+                                                <TableCell>{el.update_time.replace('T', ' ')}</TableCell>
+                                                <TableCell>
+                                                    {el.status === 3 ? <div className="flex items-center">
+                                                            <div className="tooltip" data-tip={el.remark}>
+                                                                <span className='text-red-500'>{t('lib.parseFailed')}</span>
+                                                            </div>
+                                                            <Button variant="link"><RotateCw size={16} onClick={() => handleRetry([el])} /></Button>
+                                                        </div> :
+                                                        <span className={el.status === 3 && 'text-red-500'}>{[t('lib.parseFailed'), t('lib.parsing'), t('lib.completed'), t('lib.parseFailed')][el.status]}</span>
                                                     }
+                                                </TableCell>
+                                                <TableCell>
+                                                    <DropdownMenu>
+                                                        <DropdownMenuTrigger>
+                                                            <img src={"/src/assets/chat/duihua-gengduo.png"} className={'more-button'}/>
+                                                        </DropdownMenuTrigger>
+                                                        <DropdownMenuContent>
+                                                            <DropdownMenuItem onClick={(event)=>{
+                                                                event.stopPropagation();
+                                                                setData(el)
+                                                                setRenameOpen(true)
+                                                            }}><img src={"/src/assets/knowledge/write-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.rename")}</DropdownMenuItem>
+                                                            <DropdownMenuItem onClick={(event)=>{
+                                                                event.stopPropagation();
+                                                                setData(el)
+                                                                setMoveOpen(true)
+                                                            }}><img src={"/src/assets/knowledge/move-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.move")}</DropdownMenuItem>
+                                                            {hasPermission &&
+                                                                <DropdownMenuItem  onClick={(event) => {
+                                                                    event.stopPropagation();
+                                                                    delConfim(el.id, "folder")
+                                                                }}>
+                                                                    <img src={"/src/assets/knowledge/delete-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t('delete')}
+                                                                </DropdownMenuItem>
+                                                            }
+
+                                                        </DropdownMenuContent>
+                                                    </DropdownMenu>
+                                                </TableCell>
+                                            </TableRow>
+                                        ))}
+                                    </TableBody>
+                                </Table>
+                            </div>
+                            : <ConfigModal reload={reload} id={id}></ConfigModal>
+                    }
 
-                                                </DropdownMenuContent>
-                                            </DropdownMenu>
-                                        </TableCell>
-                                    </TableRow>
-                                ))}
-                            </TableBody>
-                        </Table>
-                    </div>
                 </div>
             </div>
             <CreateModal reload={reload} createType={type} parentId={parentId} datalist={datalist} open={open} setOpen={setOpen}></CreateModal>

+ 65 - 0
src/style/knowledge.css

@@ -366,6 +366,71 @@
                 display: inline-block;
                 margin-right: 8px;
             }
+
+            .config-item{
+                display: flex;
+                margin-bottom: 30px;
+
+                .config-item-title{
+                    width:200px;
+                    text-align: right;
+                    margin-right: 36px;
+                    font-size: 12px;
+                    color: #FFFFFF;
+                    line-height: 34px;
+                }
+
+                .config-item-value{
+                    width: 500px;
+                    font-weight: 300;
+                    font-size: 12px;
+                    color: #CCCCCC;
+                    line-height: 34px;
+
+                    .form-input{
+                        background: #1A1A1A;
+                        border-radius: 7px;
+                        width: 100%;
+                        font-weight: 300;
+                        font-size: 12px;
+                        border:unset;
+                    }
+                }
+            }
+
+            .config-button-box{
+                text-align: right;
+                width: 736px;
+                position: absolute;
+                bottom: 50px;
+
+                .delete-button{
+                    width: 34px;
+                    height: 34px;
+                    background: rgba(255, 96, 96, 0.3);
+                    border-radius: 100%;
+
+                    .delete-icon{
+                        width: 15px;
+                        height: 15px;
+                        margin: 0 0 0 10px;
+                    }
+                }
+
+                .save-button{
+                    width: 95px;
+                    height: 34px;
+                    line-height: 34px;
+                    text-align: center;
+                    background: #FFD025;
+                    border-radius: 17px;
+                    font-weight: 400;
+                    font-size: 14px;
+                    color: #010101;
+                    margin-left: 20px;
+                }
+            }
+
         }
     }
 }