From a2726a9367fc8fb770141064986d5cdddb83a7b4 Mon Sep 17 00:00:00 2001 From: zhangzhanwei Date: Thu, 10 Jul 2025 18:23:03 +0800 Subject: [PATCH] feat: Workspace shared knowledge permission --- ui/src/api/shared-workspace.ts | 28 ++++++++++++++++- ui/src/router/modules/document.ts | 50 +++++++++++++++++++++++++++++++ ui/src/views/chat-user/index.vue | 10 +++++-- ui/src/views/document/index.vue | 2 +- 4 files changed, 86 insertions(+), 4 deletions(-) diff --git a/ui/src/api/shared-workspace.ts b/ui/src/api/shared-workspace.ts index b3f1ea6a2..33fdb7a09 100644 --- a/ui/src/api/shared-workspace.ts +++ b/ui/src/api/shared-workspace.ts @@ -1,10 +1,11 @@ import { Result } from '@/request/Result' import { get, post, del, put, exportFile, exportExcel } from '@/request/index' import { type Ref } from 'vue' -import type { pageRequest } from '@/api/type/common' +import type { PageList, pageRequest } from '@/api/type/common' import type { knowledgeData } from '@/api/type/knowledge' import useStore from '@/stores' +import type { ChatUserGroupItem } from './type/workspaceChatUser' const prefix = '/system/shared' const prefix_workspace: any = { _value: 'workspace/' } @@ -101,6 +102,29 @@ const getProblemsPage: ( ) } +/** + * 获取工作空间下共享知识库用户组的用户列表 + */ +const getUserGroupUserList: ( + resource: any, + user_group_id:string, + page: pageRequest, + username_or_nickname: string, + loading?: Ref, +) => Promise>> = (resource, user_group_id, page, username_or_nickname, loading) => { + return get ( + `${prefix}/${prefix_workspace.value}/KNOWLEDGE/${resource.resource_id}/user_group_id/${user_group_id}/${page.current_page}/${page.page_size}` + ,username_or_nickname ? {username_or_nickname} : undefined, loading, + ) +} + +/** + * 获取工作空间下共享知识库的用户组 + */ +const getUserGroupList: (resource: any, loading?: Ref) => Promise> = (resource, loading) => { + return get (`${prefix}/${prefix_workspace.value}/KNOWLEDGE/${resource.resource_id}/user_group`, undefined, loading) +} + /** * 段落分页列表 * @param 参数 knowledge_id document_id @@ -157,4 +181,6 @@ export default { getModelList, getToolList, getToolListPage, + getUserGroupList, + getUserGroupUserList } diff --git a/ui/src/router/modules/document.ts b/ui/src/router/modules/document.ts index b61d8517a..b02149c49 100644 --- a/ui/src/router/modules/document.ts +++ b/ui/src/router/modules/document.ts @@ -51,6 +51,16 @@ const DocumentRouter = { if (to.params.folderId == 'shared') { return RoleConst.ADMIN } else { return PermissionConst.KNOWLEDGE_DOCUMENT_READ.getWorkspacePermissionWorkspaceManageRole() } + }, + ()=>{ + const to: any = get_next_route() + if(to.params.folderId == 'share') { + return new ComplexPermission([RoleConst.EXTENDS_USER.getWorkspaceRole()], [PermissionConst.KNOWLEDGE_DOCUMENT_READ.getWorkspacePermission()], [], 'AND') } + }, + ()=>{ + const to: any = get_next_route() + if(to.params.folderId == 'share') { + return RoleConst.USER.getWorkspaceRole() } } ], }, @@ -89,6 +99,16 @@ const DocumentRouter = { const to: any = get_next_route() if (to.params.folderId == 'shared') { return RoleConst.ADMIN } else { return PermissionConst.KNOWLEDGE_PROBLEM_READ.getWorkspacePermissionWorkspaceManageRole() } }, + ()=>{ + const to: any = get_next_route() + if(to.params.folderId == 'share') { + return new ComplexPermission([RoleConst.EXTENDS_USER.getWorkspaceRole()], [PermissionConst.KNOWLEDGE_PROBLEM_READ.getWorkspacePermission()], [], 'AND') } + }, + ()=>{ + const to: any = get_next_route() + if(to.params.folderId == 'share') { + return RoleConst.USER.getWorkspaceRole() } + } ], }, component: () => import('@/views/problem/index.vue'), @@ -125,6 +145,16 @@ const DocumentRouter = { const to: any = get_next_route() if (to.params.folderId == 'shared') { return RoleConst.ADMIN } else { return PermissionConst.KNOWLEDGE_HIT_TEST_READ.getWorkspacePermissionWorkspaceManageRole() } }, + ()=>{ + const to: any = get_next_route() + if(to.params.folderId == 'share') { + return new ComplexPermission([RoleConst.EXTENDS_USER.getWorkspaceRole()], [PermissionConst.KNOWLEDGE_HIT_TEST_READ.getWorkspacePermission()], [], 'AND') } + }, + ()=>{ + const to: any = get_next_route() + if(to.params.folderId == 'share') { + return RoleConst.USER.getWorkspaceRole() } + } ], }, component: () => import('@/views/hit-test/index.vue'), @@ -172,6 +202,16 @@ const DocumentRouter = { if (to.params.folderId == 'shared') { return RoleConst.ADMIN } else { return new ComplexPermission([RoleConst.USER], [PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(to ? to.params.id : '',)], [EditionConst.IS_EE, EditionConst.IS_PE], 'AND') } }, + ()=>{ + const to: any = get_next_route() + if(to.params.folderId == 'share') { + return new ComplexPermission([RoleConst.EXTENDS_USER.getWorkspaceRole()], [PermissionConst.KNOWLEDGE_CHAT_USER_READ.getWorkspacePermission()], [], 'AND') } + }, + ()=>{ + const to: any = get_next_route() + if(to.params.folderId == 'share') { + return RoleConst.USER.getWorkspaceRole() } + } ] }, component: () => import('@/views/chat-user/index.vue'), @@ -209,6 +249,16 @@ const DocumentRouter = { const to: any = get_next_route() if (to.params.folderId == 'shared') { return RoleConst.ADMIN } else { return PermissionConst.KNOWLEDGE_EDIT.getWorkspacePermissionWorkspaceManageRole() } }, + ()=>{ + const to: any = get_next_route() + if(to.params.folderId == 'share') { + return new ComplexPermission([RoleConst.EXTENDS_USER.getWorkspaceRole()], [PermissionConst.KNOWLEDGE_EDIT.getWorkspacePermission()], [], 'AND') } + }, + ()=>{ + const to: any = get_next_route() + if(to.params.folderId == 'share') { + return RoleConst.USER.getWorkspaceRole() } + } ], }, component: () => import('@/views/knowledge/KnowledgeSetting.vue'), diff --git a/ui/src/views/chat-user/index.vue b/ui/src/views/chat-user/index.vue index e28e4b7c3..5c604f741 100644 --- a/ui/src/views/chat-user/index.vue +++ b/ui/src/views/chat-user/index.vue @@ -179,14 +179,14 @@ import { useRoute } from 'vue-router' import { SourceTypeEnum } from '@/enums/common' import { MsgSuccess } from '@/utils/message' import { ComplexPermission } from '@/utils/permission/type' -import { EditionConst, RoleConst, PermissionConst } from '@/utils/permission/data' +import { RoleConst, PermissionConst } from '@/utils/permission/data' import { hasPermission } from '@/utils/permission/index' import { loadSharedApi } from '@/utils/dynamics-api/shared-api' const route = useRoute() const { - params: { id }, + params: { id, folderId }, } = route as any const permissionObj = ref({ @@ -240,6 +240,7 @@ async function getUserGroupList() { try { const res = await loadSharedApi({ type: 'chatUser', + isShared: isShared.value, systemType: apiType.value, }).getUserGroupList(resource, loading) list.value = res.data @@ -308,11 +309,16 @@ const paginationConfig = reactive({ const tableData = ref([]) +const isShared = computed(() => { + return folderId === 'share' +}) + async function getList() { if (!current.value?.id) return try { const res = await loadSharedApi({ type: 'chatUser', + isShared: isShared.value, systemType: apiType.value, }).getUserGroupUserList( resource, diff --git a/ui/src/views/document/index.vue b/ui/src/views/document/index.vue index 6ebd1719c..55c6b42ab 100644 --- a/ui/src/views/document/index.vue +++ b/ui/src/views/document/index.vue @@ -1069,7 +1069,7 @@ function getList(bool?: boolean) { order_by: orderBy.value, folder_id: folderId, } - loadSharedApi({ type: 'document', systemType: apiType.value }) + loadSharedApi({ type: 'document', isShared: isShared.value, systemType: apiType.value }) .getDocumentPage(id as string, paginationConfig.value, param, bool ? undefined : loading) .then((res: any) => { documentData.value = res.data.records