From ac6716b29b884314f2e8f1bbde434cf5e47ef64e Mon Sep 17 00:00:00 2001 From: dataeaseShu <106045316+dataeaseShu@users.noreply.github.com> Date: Fri, 13 Jun 2025 17:12:31 +0800 Subject: [PATCH] fix(knowledge base): knowledge base lark upload (#3255) --- ui/src/api/knowledge/knowledge.ts | 8 + ui/src/api/shared/knowledge.ts | 14 +- .../knowledge/icon_file-folder_colorful.svg | 4 + ui/src/components/app-icon/KnowledgeIcon.vue | 10 +- .../CreateLarkKnowledgeDialog.vue | 6 +- .../paragraph/component/ParagraphCard.vue | 3 + ui/src/views/paragraph/index.vue | 71 ++++---- .../component/PermissionSetting.vue | 151 +++++++++--------- ui/src/views/resource-authorization/index.vue | 140 +++++++++++++++- 9 files changed, 285 insertions(+), 122 deletions(-) create mode 100644 ui/src/assets/knowledge/icon_file-folder_colorful.svg diff --git a/ui/src/api/knowledge/knowledge.ts b/ui/src/api/knowledge/knowledge.ts index eb64d73f8..4441fc219 100644 --- a/ui/src/api/knowledge/knowledge.ts +++ b/ui/src/api/knowledge/knowledge.ts @@ -275,6 +275,13 @@ const importLarkDocument: ( return post(`${prefix}/lark/${knowledge_id}/import`, data, null, loading) } +const postLarkKnowledge: (data: any, loading?: Ref) => Promise>> = ( + data, + loading, +) => { + return post(`${prefix}/knowledge/lark/save`, data, null, loading) +} + export default { getKnowledgeByFolder, getKnowledgeList, @@ -294,4 +301,5 @@ export default { getLarkDocumentList, importLarkDocument, + postLarkKnowledge, } diff --git a/ui/src/api/shared/knowledge.ts b/ui/src/api/shared/knowledge.ts index 5e5052dbb..69206dd22 100644 --- a/ui/src/api/shared/knowledge.ts +++ b/ui/src/api/shared/knowledge.ts @@ -333,6 +333,13 @@ const importLarkDocument: ( return post(`${prefix}/lark/${knowledge_id}/import`, data, null, loading) } +const postLarkKnowledge: (data: any, loading?: Ref) => Promise>> = ( + data, + loading, +) => { + return post(`${prefix}/knowledge/lark/save`, data, null, loading) +} + export default { getKnowledgeByFolder, getKnowledgeList, @@ -349,9 +356,6 @@ export default { postKnowledge, getKnowledgeModel, postWebKnowledge, - - getLarkDocumentList, - importLarkDocument, getSharedWorkspaceKnowledge, getSharedWorkspaceKnowledgePage, getSharedAuthorizationKnowledgeGet, @@ -360,4 +364,8 @@ export default { getSharedAuthorizationToolPost, getSharedAuthorizationModelGet, getSharedAuthorizationModelPost, + + getLarkDocumentList, + importLarkDocument, + postLarkKnowledge, } diff --git a/ui/src/assets/knowledge/icon_file-folder_colorful.svg b/ui/src/assets/knowledge/icon_file-folder_colorful.svg new file mode 100644 index 000000000..444badf5d --- /dev/null +++ b/ui/src/assets/knowledge/icon_file-folder_colorful.svg @@ -0,0 +1,4 @@ + + + + diff --git a/ui/src/components/app-icon/KnowledgeIcon.vue b/ui/src/components/app-icon/KnowledgeIcon.vue index 0bdce52f8..9e90d6c35 100644 --- a/ui/src/components/app-icon/KnowledgeIcon.vue +++ b/ui/src/components/app-icon/KnowledgeIcon.vue @@ -1,17 +1,17 @@ @@ -22,5 +22,9 @@ const props = defineProps({ type: [String, Number], default: '', }, + size: { + type: [String, Number], + default: 32, + }, }) diff --git a/ui/src/views/knowledge-shared-system/create-component/CreateLarkKnowledgeDialog.vue b/ui/src/views/knowledge-shared-system/create-component/CreateLarkKnowledgeDialog.vue index 7b46394df..3b648d155 100644 --- a/ui/src/views/knowledge-shared-system/create-component/CreateLarkKnowledgeDialog.vue +++ b/ui/src/views/knowledge-shared-system/create-component/CreateLarkKnowledgeDialog.vue @@ -54,8 +54,8 @@ - + diff --git a/ui/src/views/resource-authorization/index.vue b/ui/src/views/resource-authorization/index.vue index a79b7f158..e44f31a0c 100644 --- a/ui/src/views/resource-authorization/index.vue +++ b/ui/src/views/resource-authorization/index.vue @@ -52,6 +52,7 @@ :type="item.value" :tableHeight="tableHeight" :manage="isManage(currentType)" + @refreshData="refreshData" > @@ -73,6 +74,8 @@ import PermissionSetting from './component/PermissionSetting.vue' import { MsgSuccess, MsgConfirm } from '@/utils/message' import { AuthorizationEnum } from '@/enums/system' import { t } from '@/locales' +import useStore from '@/stores' +import { cloneDeep } from 'lodash' const loading = ref(false) const rLoading = ref(false) @@ -84,6 +87,7 @@ const filterText = ref('') const activeName = ref(AuthorizationEnum.KNOWLEDGE) const tableHeight = ref(0) +const { folder } = useStore() const settingTags = reactive([ { @@ -146,15 +150,149 @@ function getMember(id?: string) { const user = (id && memberList.value.find((p: any) => p.user_id === id)) || null currentUser.value = user ? user.id : memberList.value[0].id currentType.value = user ? user.type : memberList.value[0].type - ResourcePermissions(currentUser.value) + getWholeTree(currentUser.value) }) } + +const dfsPermissionIndeterminateTrue = (arr: any = [], type: string) => { + return arr.every((item: any) => { + if (item.children?.length) { + item.permission[type] = dfsPermissionIndeterminateTrue(item.children, type) + } + return item.permission[type] + }) +} + +const dfsPermissionIndeterminate = ( + arr: any = [], + type: string, + permissionHalf: any, + permissionHalfMap: any, + id: string, +) => { + arr.forEach((item: any) => { + if (item.isFolder) { + if (!permissionHalfMap[item.id]) { + permissionHalfMap[item.id] = cloneDeep(permissionHalf) + } + } + + if (item.children?.length) { + dfsPermissionIndeterminate(item.children, type, permissionHalf, permissionHalfMap, item.id) + } + + if (!item.isFolder) { + permissionHalfMap[id][type] = [...permissionHalfMap[id][type], item.permission[type]] + } + + if (item.isFolder) { + item.permissionHalf[type] = permissionHalfMap[item.id][type].length + ? new Set(permissionHalfMap[item.id][type]).size > 1 + : false + if (item.children.some((ele: any) => ele.isFolder && ele.permissionHalf[type])) { + item.permissionHalf[type] = true + } + + if ( + item.children.some((ele: any) => ele.permission[type]) && + item.children.some((ele: any) => !ele.permission[type]) + ) { + item.permissionHalf[type] = true + } + } + }) +} + +const dfsFolder = (arr: any[] = [], folderIdMap: any) => { + arr.forEach((ele) => { + if (ele.permission) return + if (ele.children?.length) { + if (folderIdMap[ele.id]) { + ele.children = [...ele.children, ...folderIdMap[ele.id]] + } + dfsFolder(ele.children, folderIdMap) + } else { + ele.children = folderIdMap[ele.id] || [] + } + ele.isFolder = true + ele.permission = { + VIEW: false, + MANAGE: false, + ROLE: false, + } + + ele.permissionHalf = { + VIEW: false, + MANAGE: false, + ROLE: false, + } + }) +} + +function getFolder() { + return folder.asyncGetFolder('KNOWLEDGE', {}, loading) +} + +function getResourcePermissions(user_id: string) { + return AuthorizationApi.getResourceAuthorization(user_id, rLoading) +} + +const getWholeTree = async (user_id: string) => { + const [parentRes, childrenRes] = await Promise.all([getFolder(), getResourcePermissions(user_id)]) + if (!childrenRes.data || Object.keys(childrenRes.data).length > 0) { + settingTags.map((item: any) => { + let folderIdMap = [] + const folderTree = cloneDeep((parentRes as unknown as any).data) + if (Object.keys(childrenRes.data).indexOf(item.value) !== -1) { + folderIdMap = getFolderIdMap(childrenRes.data[item.value]) + dfsFolder(folderTree, folderIdMap) + const permissionHalf = { + VIEW: [], + MANAGE: [], + ROLE: [], + } + Object.keys(permissionHalf).forEach((ele) => { + dfsPermissionIndeterminateTrue(folderTree, ele) + dfsPermissionIndeterminate(folderTree, ele, cloneDeep(permissionHalf), {}, 'default') + }) + item.data = folderTree + } + }) + } +} + +const refreshData = () => { + settingTags.map((item: any) => { + if (activeName.value === item.value) { + const permissionHalf = { + VIEW: [], + MANAGE: [], + ROLE: [], + } + Object.keys(permissionHalf).forEach((ele) => { + dfsPermissionIndeterminateTrue(item.data, ele) + dfsPermissionIndeterminate(item.data, ele, cloneDeep(permissionHalf), {}, 'default') + }) + } + }) +} +const getFolderIdMap = (arr: any = []) => { + return arr.reduce((pre: any, next: any) => { + if (pre[next.folder_id]) { + pre[next.folder_id].push(next) + } else { + pre[next.folder_id] = [next] + } + return pre + }, {}) +} function ResourcePermissions(user_id: string) { AuthorizationApi.getResourceAuthorization(user_id, rLoading).then((res) => { if (!res.data || Object.keys(res.data).length > 0) { settingTags.map((item: any) => { if (Object.keys(res.data).indexOf(item.value) !== -1) { item.data = res.data[item.value] + getFolderIdMap(item.data) } }) }