From d33bc56db194f53bc75c0b188e7e585c2a2ad735 Mon Sep 17 00:00:00 2001 From: wangdan-fit2cloud Date: Thu, 5 Jun 2025 20:15:55 +0800 Subject: [PATCH] feat: knowledge --- ui/src/api/knowledge/knowledge.ts | 33 +- ui/src/api/knowledge/problem.ts | 33 +- ui/src/components/app-icon/icons/common.ts | 40 +++ ui/src/locales/lang/en-US/common.ts | 1 + .../locales/lang/en-US/views/user-manage.ts | 1 - ui/src/locales/lang/zh-CN/common.ts | 1 + .../locales/lang/zh-CN/views/user-manage.ts | 1 - ui/src/locales/lang/zh-Hant/common.ts | 1 + .../locales/lang/zh-Hant/views/user-manage.ts | 31 +- ui/src/router/modules/document.ts | 26 +- ui/src/stores/index.ts | 2 + ui/src/stores/modules/knowledge.ts | 9 +- ui/src/stores/modules/problem.ts | 79 +++++ ui/src/views/hit-test/index.vue | 178 +++++------ .../knowledge/ImportDocumentKnowledge.vue | 290 +++++++++++++++++ ui/src/views/knowledge/KnowledgeSetting.vue | 302 ++++++++++++++++++ .../knowledge/UploadDocumentKnowledge.vue | 212 ++++++++++++ .../paragraph/component/ProblemComponent.vue | 1 + ui/src/views/problem/index.vue | 227 +++++++------ .../user-manage/component/UserDrawer.vue | 2 +- 20 files changed, 1210 insertions(+), 260 deletions(-) create mode 100644 ui/src/stores/modules/problem.ts create mode 100644 ui/src/views/knowledge/ImportDocumentKnowledge.vue create mode 100644 ui/src/views/knowledge/KnowledgeSetting.vue create mode 100644 ui/src/views/knowledge/UploadDocumentKnowledge.vue diff --git a/ui/src/api/knowledge/knowledge.ts b/ui/src/api/knowledge/knowledge.ts index 3961bc9d8..e2ffe19ed 100644 --- a/ui/src/api/knowledge/knowledge.ts +++ b/ui/src/api/knowledge/knowledge.ts @@ -75,7 +75,7 @@ const putSyncWebKnowledge: ( * 向量化知识库 * @param 参数 knowledge_id */ -const putReEmbeddingDataset: ( +const putReEmbeddingKnowledge: ( wordspace_id: string, knowledge_id: string, loading?: Ref, @@ -110,7 +110,7 @@ const getKnowledgeDetail: ( "embedding": "string" } */ -const postDataset: ( +const postKnowledge: ( wordspace_id: string, data: knowledgeData, loading?: Ref, @@ -130,7 +130,7 @@ const postDataset: ( "selector": "string" } */ -const postWebDataset: ( +const postWebKnowledge: ( wordspace_id: string, data: any, loading?: Ref, @@ -138,29 +138,30 @@ const postWebDataset: ( return post(`${prefix}/${wordspace_id}/knowledge/web`, data, undefined, loading) } /** - * 创建Lark知识库 + * 修改知识库信息 * @param 参数 + * knowledge_id * { "name": "string", - "desc": "string", - "app_id": "string", - "app_secret": "string", - "folder_token": "string", + "desc": true } */ -const postLarkDataset: (data: any, loading?: Ref) => Promise> = ( - data, - loading, -) => { - return post(`${prefix}/lark/save`, data, undefined, loading) +const putKnowledge: ( + wordspace_id: string, + knowledge_id: string, + data: any, + loading?: Ref, +) => Promise> = (wordspace_id, knowledge_id, data, loading) => { + return put(`${prefix}/${wordspace_id}/knowledge/${knowledge_id}`, data, undefined, loading) } export default { getKnowledgeByFolder, getKnowledgeList, - putReEmbeddingDataset, + putReEmbeddingKnowledge, putSyncWebKnowledge, getKnowledgeDetail, - postDataset, - postWebDataset + postKnowledge, + postWebKnowledge, + putKnowledge, } diff --git a/ui/src/api/knowledge/problem.ts b/ui/src/api/knowledge/problem.ts index 4625d6de6..24420ae3a 100644 --- a/ui/src/api/knowledge/problem.ts +++ b/ui/src/api/knowledge/problem.ts @@ -3,11 +3,11 @@ import { get, post, del, put } from '@/request/index' import type { Ref } from 'vue' import type { KeyValue } from '@/api/type/common' import type { pageRequest } from '@/api/type/common' -const prefix = '/dataset' +const prefix = '/workspace' /** - * 文档分页列表 - * @param 参数 dataset_id, + * 问题分页列表 + * @param 参数 dataset_id, * page { "current_page": "string", "page_size": "string", @@ -18,15 +18,16 @@ const prefix = '/dataset' */ const getProblems: ( + workspace_id: string, dataset_id: string, page: pageRequest, param: any, - loading?: Ref -) => Promise> = (dataset_id, page, param, loading) => { + loading?: Ref, +) => Promise> = (wordspace_id, dataset_id, page, param, loading) => { return get( - `${prefix}/${dataset_id}/problem/${page.current_page}/${page.page_size}`, + `${prefix}/${wordspace_id}/knowledge/${dataset_id}/problem/${page.current_page}/${page.page_size}`, param, - loading + loading, ) } @@ -38,7 +39,7 @@ const getProblems: ( const postProblems: ( dataset_id: string, data: any, - loading?: Ref + loading?: Ref, ) => Promise> = (dataset_id, data, loading) => { return post(`${prefix}/${dataset_id}/problem`, data, undefined, loading) } @@ -50,7 +51,7 @@ const postProblems: ( const delProblems: ( dataset_id: string, problem_id: string, - loading?: Ref + loading?: Ref, ) => Promise> = (dataset_id, problem_id, loading) => { return del(`${prefix}/${dataset_id}/problem/${problem_id}`, loading) } @@ -62,15 +63,15 @@ const delProblems: ( const delMulProblem: ( dataset_id: string, data: any, - loading?: Ref + loading?: Ref, ) => Promise> = (dataset_id, data, loading) => { return del(`${prefix}/${dataset_id}/problem/_batch`, undefined, data, loading) } /** * 修改问题 - * @param 参数 - * dataset_id, problem_id, + * @param 参数 + * dataset_id, problem_id, * { "content": "string", } @@ -79,7 +80,7 @@ const putProblems: ( dataset_id: string, problem_id: string, data: any, - loading?: Ref + loading?: Ref, ) => Promise> = (dataset_id, problem_id, data: any, loading) => { return put(`${prefix}/${dataset_id}/problem/${problem_id}`, data, undefined, loading) } @@ -92,7 +93,7 @@ const putProblems: ( const getDetailProblems: ( dataset_id: string, problem_id: string, - loading?: Ref + loading?: Ref, ) => Promise> = (dataset_id, problem_id, loading) => { return get(`${prefix}/${dataset_id}/problem/${problem_id}/paragraph`, undefined, loading) } @@ -108,7 +109,7 @@ const getDetailProblems: ( const postMulAssociationProblem: ( dataset_id: string, data: any, - loading?: Ref + loading?: Ref, ) => Promise> = (dataset_id, data, loading) => { return post(`${prefix}/${dataset_id}/problem/_batch`, data, undefined, loading) } @@ -120,5 +121,5 @@ export default { putProblems, getDetailProblems, delMulProblem, - postMulAssociationProblem + postMulAssociationProblem, } diff --git a/ui/src/components/app-icon/icons/common.ts b/ui/src/components/app-icon/icons/common.ts index 044fc7a52..db410605e 100644 --- a/ui/src/components/app-icon/icons/common.ts +++ b/ui/src/components/app-icon/icons/common.ts @@ -25,4 +25,44 @@ export default { ]) }, }, + 'app-setting': { + iconReader: () => { + return h('i', [ + h( + 'svg', + { + viewBox: '0 0 20 20', + version: '1.1', + xmlns: 'http://www.w3.org/2000/svg', + }, + [ + h('path', { + d: 'M3.60734 16.4448L3.34807 16.1624C2.44036 15.1737 1.75935 13.9944 1.36011 12.7066L1.24756 12.3435L2.95427 10.0001L1.24756 7.65668L1.36011 7.29361C1.75935 6.00574 2.44036 4.82649 3.34807 3.83779L3.60734 3.55539L6.47552 3.86889L7.64049 1.21319L8.01405 1.12909C8.66134 0.983366 9.32633 0.90918 10.0004 0.90918C10.6744 0.90918 11.3394 0.983366 11.9867 1.12909L12.3603 1.21319L13.5252 3.86889L16.3934 3.55539L16.6527 3.83779C17.5604 4.82649 18.2414 6.00574 18.6406 7.29361L18.7532 7.65668L17.0465 10.0001L18.7532 12.3435L18.6406 12.7066C18.2414 13.9944 17.5604 15.1737 16.6527 16.1624L16.3934 16.4448L13.5252 16.1313L12.3603 18.787L11.9867 18.8711C11.3394 19.0168 10.6744 19.091 10.0004 19.091C9.32633 19.091 8.66134 19.0168 8.01405 18.8711L7.64049 18.787L6.47552 16.1313L3.60734 16.4448ZM6.51159 14.6031C7.05002 14.5443 7.56436 14.8417 7.78194 15.3377L8.71565 17.4662C9.13677 17.5389 9.56603 17.5758 10.0004 17.5758C10.4347 17.5758 10.864 17.5389 11.2851 17.4662L12.2188 15.3377C12.4364 14.8417 12.9507 14.5443 13.4892 14.6031L15.7844 14.854C16.3387 14.1868 16.7757 13.4286 17.0741 12.6116L15.7038 10.7301C15.3869 10.295 15.3869 9.70511 15.7038 9.26999L17.0741 7.38847C16.7757 6.57146 16.3387 5.81331 15.7844 5.14609L13.4892 5.39696C12.9507 5.45581 12.4364 5.1584 12.2188 4.66238L11.2851 2.53389C10.864 2.46117 10.4347 2.42429 10.0004 2.42429C9.56603 2.42429 9.13677 2.46117 8.71565 2.53389L7.78194 4.66238C7.56436 5.1584 7.05002 5.45581 6.51159 5.39696L4.21641 5.14609C3.66208 5.81331 3.22502 6.57146 2.92666 7.38847L4.29697 9.26999C4.61387 9.70511 4.61387 10.295 4.29697 10.7301L2.92666 12.6116C3.22502 13.4286 3.66208 14.1868 4.21641 14.854L6.51159 14.6031ZM10.0004 13.788C7.91555 13.788 6.22693 12.0913 6.22693 10.0001C6.22693 7.9089 7.91555 6.2122 10.0004 6.2122C12.0852 6.2122 13.7738 7.9089 13.7738 10.0001C13.7738 12.0913 12.0852 13.788 10.0004 13.788ZM10.0004 12.2729C11.2468 12.2729 12.2587 11.2561 12.2587 10.0001C12.2587 8.74413 11.2468 7.72741 10.0004 7.72741C8.75397 7.72741 7.74208 8.74413 7.74208 10.0001C7.74208 11.2561 8.75397 12.2729 10.0004 12.2729Z', + fill: 'currentColor', + }), + ], + ), + ]) + }, + }, + 'app-setting-active': { + iconReader: () => { + return h('i', [ + h( + 'svg', + { + viewBox: '0 0 20 20', + version: '1.1', + xmlns: 'http://www.w3.org/2000/svg', + }, + [ + h('path', { + d: 'M3.26425 16.2151C2.35478 15.2292 1.65887 14.0432 1.25 12.7305L2.70785 10.7384C3.02952 10.2988 3.02952 9.70154 2.70785 9.26197L1.25 7.26979C1.65887 5.95714 2.35478 4.77112 3.26425 3.78522L5.71416 4.05172C6.25589 4.11065 6.77338 3.81185 6.99316 3.31321L7.98848 1.05505C8.63579 0.910018 9.30896 0.833496 10 0.833496C10.691 0.833496 11.3642 0.910018 12.0115 1.05505L13.0068 3.31321C13.2266 3.81185 13.7441 4.11065 14.2858 4.05172L16.7357 3.78522C17.6452 4.77112 18.3411 5.95714 18.75 7.26979L17.2921 9.26197C16.9705 9.70154 16.9705 10.2988 17.2921 10.7384L18.75 12.7305C18.3411 14.0432 17.6452 15.2292 16.7357 16.2151L14.2858 15.9486C13.7441 15.8897 13.2266 16.1885 13.0068 16.6871L12.0115 18.9453C11.3642 19.0903 10.691 19.1668 10 19.1668C9.30896 19.1668 8.63579 19.0903 7.98848 18.9453L6.99316 16.6871C6.77338 16.1885 6.25589 15.8897 5.71416 15.9486L3.26425 16.2151ZM10 13.3335C11.8409 13.3335 13.3333 11.8411 13.3333 10.0002C13.3333 8.15921 11.8409 6.66683 10 6.66683C8.15905 6.66683 6.66667 8.15921 6.66667 10.0002C6.66667 11.8411 8.15905 13.3335 10 13.3335Z', + fill: 'currentColor', + }), + ], + ), + ]) + }, + }, } diff --git a/ui/src/locales/lang/en-US/common.ts b/ui/src/locales/lang/en-US/common.ts index 916ea1145..a91c1a7b5 100644 --- a/ui/src/locales/lang/en-US/common.ts +++ b/ui/src/locales/lang/en-US/common.ts @@ -79,4 +79,5 @@ export default { fileSizeExceeded: 'File size exceeds 10 MB', uploadImagePrompt: 'Please upload an image', }, + info: 'Base Information', } diff --git a/ui/src/locales/lang/en-US/views/user-manage.ts b/ui/src/locales/lang/en-US/views/user-manage.ts index 7f9be0db8..137fd6cc4 100644 --- a/ui/src/locales/lang/en-US/views/user-manage.ts +++ b/ui/src/locales/lang/en-US/views/user-manage.ts @@ -2,7 +2,6 @@ export default { title: 'User', createUser: 'Create User', editUser: 'Edit User', - info: 'Base Information', roleSetting: 'Role Setting', setting: { updatePwd: 'Change Password', diff --git a/ui/src/locales/lang/zh-CN/common.ts b/ui/src/locales/lang/zh-CN/common.ts index 5075e40b6..1dc493640 100644 --- a/ui/src/locales/lang/zh-CN/common.ts +++ b/ui/src/locales/lang/zh-CN/common.ts @@ -83,4 +83,5 @@ export default { fileSizeExceeded: '文件大小超过 10 MB', uploadImagePrompt: '请上传一张图片', }, + info: '基本信息', } diff --git a/ui/src/locales/lang/zh-CN/views/user-manage.ts b/ui/src/locales/lang/zh-CN/views/user-manage.ts index 05d813051..944bc7865 100644 --- a/ui/src/locales/lang/zh-CN/views/user-manage.ts +++ b/ui/src/locales/lang/zh-CN/views/user-manage.ts @@ -2,7 +2,6 @@ export default { title: '用户管理', createUser: '创建用户', editUser: '编辑用户', - info: '基本信息', roleSetting: '角色设置', setting: { updatePwd: '修改用户密码', diff --git a/ui/src/locales/lang/zh-Hant/common.ts b/ui/src/locales/lang/zh-Hant/common.ts index 0e79520f4..e6a99e91a 100644 --- a/ui/src/locales/lang/zh-Hant/common.ts +++ b/ui/src/locales/lang/zh-Hant/common.ts @@ -79,4 +79,5 @@ export default { fileSizeExceeded: '檔案大小超過 10 MB', uploadImagePrompt: '請上傳一張圖片', }, + info: '使用者資訊', } diff --git a/ui/src/locales/lang/zh-Hant/views/user-manage.ts b/ui/src/locales/lang/zh-Hant/views/user-manage.ts index 4d748e6dd..b360450e2 100644 --- a/ui/src/locales/lang/zh-Hant/views/user-manage.ts +++ b/ui/src/locales/lang/zh-Hant/views/user-manage.ts @@ -2,23 +2,22 @@ export default { title: '使用者管理', createUser: '建立使用者', editUser: '編輯使用者', - info: '使用者資訊', roleSetting: '角色設定', setting: { - updatePwd: '修改使用者密碼' + updatePwd: '修改使用者密碼', }, tip: { professionalMessage: '社群版最多支援 2 個使用者,如需擁有更多使用者,請升級為專業版。', - updatePwdSuccess: '使用者密碼修改成功' + updatePwdSuccess: '使用者密碼修改成功', }, delete: { confirmTitle: '是否刪除該使用者?', confirmMessage: - '刪除該使用者後,該使用者建立的所有資源(應用、知識庫、模型)都會被刪除,請謹慎操作。' + '刪除該使用者後,該使用者建立的所有資源(應用、知識庫、模型)都會被刪除,請謹慎操作。', }, disabled: { confirmTitle: '是否停用函數?', - confirmMessage: '停用後,引用該函數的應用在查詢時會報錯,請謹慎操作。' + confirmMessage: '停用後,引用該函數的應用在查詢時會報錯,請謹慎操作。', }, userForm: { form: { @@ -26,45 +25,45 @@ export default { label: '使用者名稱', placeholder: '請輸入使用者名稱', requiredMessage: '請輸入使用者名稱', - lengthMessage: '長度須介於 6 到 20 個字元之間' + lengthMessage: '長度須介於 6 到 20 個字元之間', }, nick_name: { label: '姓名', - placeholder: '請輸入姓名' + placeholder: '請輸入姓名', }, email: { label: '電子信箱', placeholder: '請輸入電子信箱', - requiredMessage: '請輸入電子信箱' + requiredMessage: '請輸入電子信箱', }, phone: { label: '手機號碼', - placeholder: '請輸入手機號碼' + placeholder: '請輸入手機號碼', }, password: { label: '登入密碼', placeholder: '請輸入密碼', requiredMessage: '請輸入密碼', - lengthMessage: '長度須介於 6 到 20 個字元之間' + lengthMessage: '長度須介於 6 到 20 個字元之間', }, new_password: { label: '新密碼', placeholder: '請輸入新密碼', - requiredMessage: '請輸入新密碼' + requiredMessage: '請輸入新密碼', }, re_password: { label: '確認密碼', placeholder: '請輸入確認密碼', requiredMessage: '請輸入確認密碼', - validatorMessage: '密碼不一致' - } - } + validatorMessage: '密碼不一致', + }, + }, }, source: { label: '使用者來源', local: '系統使用者', wecom: '企業微信', lark: '飛書', - dingtalk: '釘釘' - } + dingtalk: '釘釘', + }, } diff --git a/ui/src/router/modules/document.ts b/ui/src/router/modules/document.ts index 00f2cf2f0..72027333b 100644 --- a/ui/src/router/modules/document.ts +++ b/ui/src/router/modules/document.ts @@ -43,19 +43,19 @@ const DocumentRouter = { }, component: () => import('@/views/hit-test/index.vue') }, - // { - // path: 'setting', - // name: 'DatasetSetting', - // meta: { - // icon: 'app-setting', - // iconActive: 'app-setting-active', - // title: 'common.setting', - // active: 'setting', - // parentPath: '/knowledge/:id/:folderId', - // parentName: 'KnowledgeDetail' - // }, - // component: () => import('@/views/dataset/DatasetSetting.vue') - // } + { + path: 'setting', + name: 'KnowledgeSetting', + meta: { + icon: 'app-setting', + iconActive: 'app-setting-active', + title: 'common.setting', + active: 'setting', + parentPath: '/knowledge/:id/:folderId', + parentName: 'KnowledgeDetail' + }, + component: () => import('@/views/knowledge/KnowledgeSetting.vue') + } ], } diff --git a/ui/src/stores/index.ts b/ui/src/stores/index.ts index 5a05dfdce..e2b1db221 100644 --- a/ui/src/stores/index.ts +++ b/ui/src/stores/index.ts @@ -6,6 +6,7 @@ import useThemeStore from './modules/theme' import useKnowledgeStore from './modules/knowledge' import useModelStore from './modules/model' import usePromptStore from './modules/prompt' +import useProblemStore from './modules/problem' const useStore = () => ({ common: useCommonStore(), @@ -16,6 +17,7 @@ const useStore = () => ({ knowledge: useKnowledgeStore(), model: useModelStore(), prompt: usePromptStore(), + problem: useProblemStore(), }) export default useStore diff --git a/ui/src/stores/modules/knowledge.ts b/ui/src/stores/modules/knowledge.ts index 5946fcdab..4c2eabc1d 100644 --- a/ui/src/stores/modules/knowledge.ts +++ b/ui/src/stores/modules/knowledge.ts @@ -59,10 +59,15 @@ const useKnowledgeStore = defineStore('knowledge', { }) }) }, - async asyncSyncDataset(id: string, sync_type: string, loading?: Ref) { + async asyncSyncDataset( + workspace_id: string, + id: string, + sync_type: string, + loading?: Ref, + ) { return new Promise((resolve, reject) => { knowledgeApi - .putSyncWebKnowledge(id, sync_type, loading) + .putSyncWebKnowledge(workspace_id, id, sync_type, loading) .then((data) => { resolve(data) }) diff --git a/ui/src/stores/modules/problem.ts b/ui/src/stores/modules/problem.ts new file mode 100644 index 000000000..281a27fb8 --- /dev/null +++ b/ui/src/stores/modules/problem.ts @@ -0,0 +1,79 @@ +import { defineStore } from 'pinia' +import { type Ref } from 'vue' +import problemApi from '@/api/knowledge/problem' +import paragraphApi from '@/api/knowledge/paragraph' +import type { pageRequest } from '@/api/type/common' + +const useProblemStore = defineStore('problem', { + state: () => ({}), + actions: { + async asyncPostProblem(datasetId: string, data: any, loading?: Ref) { + return new Promise((resolve, reject) => { + problemApi + .postProblems(datasetId, data, loading) + .then((data) => { + resolve(data) + }) + .catch((error) => { + reject(error) + }) + }) + }, + async asyncGetProblem( + workspace_id: string, + datasetId: string, + page: pageRequest, + param: any, + loading?: Ref, + ) { + return new Promise((resolve, reject) => { + problemApi + .getProblems(workspace_id, datasetId, page, param, loading) + .then((data) => { + resolve(data) + }) + .catch((error) => { + reject(error) + }) + }) + }, + async asyncDisassociationProblem( + datasetId: string, + documentId: string, + paragraphId: string, + problemId: string, + loading?: Ref, + ) { + return new Promise((resolve, reject) => { + paragraphApi + .disassociationProblem(datasetId, documentId, paragraphId, problemId, loading) + .then((data) => { + resolve(data) + }) + .catch((error) => { + reject(error) + }) + }) + }, + async asyncAssociationProblem( + datasetId: string, + documentId: string, + paragraphId: string, + problemId: string, + loading?: Ref, + ) { + return new Promise((resolve, reject) => { + paragraphApi + .associationProblem(datasetId, documentId, paragraphId, problemId, loading) + .then((data) => { + resolve(data) + }) + .catch((error) => { + reject(error) + }) + }) + }, + }, +}) + +export default useProblemStore diff --git a/ui/src/views/hit-test/index.vue b/ui/src/views/hit-test/index.vue index 972fb5c20..1a113487e 100644 --- a/ui/src/views/hit-test/index.vue +++ b/ui/src/views/hit-test/index.vue @@ -1,94 +1,88 @@