From 716b77a879720050328b7d80f185f0163fdcbd73 Mon Sep 17 00:00:00 2001 From: panxinying Date: Wed, 28 Oct 2026 16:00:02 +0800 Subject: [PATCH] feat: application permission for system and workspace --- .../components/business/folder-tree/index.vue | 23 +++- ui/src/permission/core/data.ts | 106 ++++++++--------- ui/src/permission/core/index.ts | 5 +- .../permission/modules/application/index.ts | 8 +- .../permission/modules/application/system.ts | 80 ++++++++++++- .../modules/application/workspace.ts | 111 ++++++++++++++++++ ui/src/permission/modules/trigger.ts | 4 + .../modules/application-system-resource.ts | 9 +- ui/src/router/admin/types.ts | 8 ++ .../admin/workspace/modules/application.ts | 8 +- .../access/AccessSettingDrawer.vue | 11 +- .../views/application-detail/access/index.vue | 13 +- .../application-detail/chat-log/index.vue | 16 ++- .../application-detail/chat-user/index.vue | 16 ++- .../application-detail/overview/index.vue | 21 +++- ui/src/views/application/index.vue | 26 ++-- .../resource-management/application/index.vue | 11 +- 17 files changed, 382 insertions(+), 94 deletions(-) diff --git a/ui/src/components/business/folder-tree/index.vue b/ui/src/components/business/folder-tree/index.vue index c9aab85c052..de2f4c35734 100644 --- a/ui/src/components/business/folder-tree/index.vue +++ b/ui/src/components/business/folder-tree/index.vue @@ -11,6 +11,19 @@ import VirtualizedTree from './VirtualizedTree.vue' import FolderFormDialog from './FolderFormDialog.vue' import ResourceAuthorizationDrawer from '@/components/business/resource-authorization-drawer/index.vue' import { useStore } from '@/stores' +import { perm } from '@/permission' +import { RESOURCE_TYPE } from '@/api/enums' + +const folderPermission = computed(() => { + switch (props.source) { + case RESOURCE_TYPE.APPLICATION: + return perm.application.workspace + case RESOURCE_TYPE.KNOWLEDGE: + return perm.knowledge.workspace + default: + return perm.tool.workspace + } +}) const MoveToDialog = defineAsyncComponent(() => import('./MoveToDialog.vue')) @@ -416,23 +429,23 @@ defineExpose({ refresh: loadFolders, openCreate: handleOpenCreateFolder }) diff --git a/ui/src/views/application-detail/access/index.vue b/ui/src/views/application-detail/access/index.vue index b75a36f6655..a610dc1963a 100644 --- a/ui/src/views/application-detail/access/index.vue +++ b/ui/src/views/application-detail/access/index.vue @@ -8,6 +8,15 @@ import type { ResourceDetailPageProps } from '@/layout/ResourceDetailLayout.vue' import { MsgSuccess } from '@/utils/message' import AccessSettingDrawer from './AccessSettingDrawer.vue' import { accessPlatforms, type AccessPlatformDefinition } from './platforms' +import { isSystemResource } from '@/utils/resource-context.ts' +import perm from '@/permission/index.ts' + +type ApplicationAccessPermissionMethod = + | 'accessEdit' +function applicationAccessPermission(method: ApplicationAccessPermissionMethod): boolean { + if (isSystemResource()) return Boolean(perm.application.system[method]()) + return Boolean(perm.application.workspace[method](applicationId.value)) +} const { resourceApi } = useApplicationDetailContext() @@ -81,11 +90,11 @@ watch(
- {{ platformStatus[platform.key]?.[0] ? '配置' : '未配置' }} + {{ platformStatus[platform.key]?.[0] ? '配置' : '未配置' }} diff --git a/ui/src/views/application-detail/chat-user/index.vue b/ui/src/views/application-detail/chat-user/index.vue index a968c37c68b..aefe40e0a99 100644 --- a/ui/src/views/application-detail/chat-user/index.vue +++ b/ui/src/views/application-detail/chat-user/index.vue @@ -8,11 +8,20 @@ import { LOGIN_METHOD_LABELS } from '@/constants' import MkSearchList from '@/components/mk-search-list/index.vue' import type { ResourceDetailPageProps } from '@/layout/ResourceDetailLayout.vue' import { MsgSuccess } from '@/utils/message' +import { isSystemResource } from '@/utils/resource-context' +import perm from '@/permission' defineOptions({ name: 'ApplicationChatUserListView' }) defineProps() defineExpose({ hideHeader: true }) +type ApplicationChatUserPermissionMethod = + | 'chatUserEdit' +function applicationchatUserPermission(method: ApplicationChatUserPermissionMethod): boolean{ + if (isSystemResource()) return Boolean(perm.application.system[method]()) + return Boolean(perm.application.workspace[method](applicationId.value)) +} + const { applicationId, resourceApi } = useApplicationDetailContext() const resource = computed(() => ({ resource_id: applicationId.value, @@ -205,13 +214,13 @@ onMounted(() => loadChatUserGroups()) -
+
自动授权
- 保存 + 保存
loadChatUserGroups()) @@ -242,6 +251,7 @@ onMounted(() => loadChatUserGroups()) :model-value="row.is_auth" :disabled="authorizationDisabled" @change="(value: CheckboxValueType) => handleRowChange(value, row)" + v-if="applicationchatUserPermission('chatUserEdit')" /> diff --git a/ui/src/views/application-detail/overview/index.vue b/ui/src/views/application-detail/overview/index.vue index 5807bc6f413..b2d36054804 100644 --- a/ui/src/views/application-detail/overview/index.vue +++ b/ui/src/views/application-detail/overview/index.vue @@ -12,6 +12,8 @@ import ButtonEmbedThirdParty from './embed-third-party/ButtonEmbedThirdParty.vue import ButtonAccessRestriction from './access-restriction/ButtonAccessRestriction.vue' import ButtonDisplaySetting from './display-setting/ButtonDisplaySetting.vue' import ButtonApiKey from './api-key/ButtonApiKey.vue' +import perm from '@/permission/index.ts' +import { isSystemResource } from '@/utils/resource-context.ts' defineOptions({ name: 'ApplicationOverviewView' }) defineProps() @@ -22,6 +24,17 @@ const route = useRoute() const workspaceId = computed(() => String(route.params.workspaceId ?? '')) const { application, applicationId, resourceApi } = useApplicationDetailContext() +type ApplicationOverviewPermissionMethod = + | 'overviewRead' + | 'overviewEmbed' + | 'overviewAccess' + | 'overviewDisplay' + | 'overviewApiKey' +function applicationOverviewPermission(method: ApplicationOverviewPermissionMethod): boolean{ + if (isSystemResource()) return Boolean(perm.application.system[method]()) + return Boolean(perm.application.workspace[method](applicationId.value)) +} + /* 基本信息:Web 访问链接与开关 */ const accessToken = ref('') const webAccessActive = ref(false) @@ -124,11 +137,11 @@ onMounted(() => { 去对话 - + - + - +
@@ -149,7 +162,7 @@ onMounted(() => {
- + diff --git a/ui/src/views/application/index.vue b/ui/src/views/application/index.vue index 6df24cf40d0..b40593fed72 100644 --- a/ui/src/views/application/index.vue +++ b/ui/src/views/application/index.vue @@ -25,6 +25,8 @@ import { } from './application-card/action-dropdown' import ButtonCreateApplication from './components/ButtonCreateApplication.vue' import ButtonTemplateStore from './components/ButtonTemplateStore.vue' +import perm from '@/permission/index.ts' +import { getWorkspaceId } from '@/utils/resource-context.ts' const route = useRoute() const router = useRouter() @@ -192,7 +194,7 @@ function handleBatchDelete() { diff --git a/ui/src/views/system/resource-management/application/index.vue b/ui/src/views/system/resource-management/application/index.vue index 02e4e1f9573..264970d0796 100644 --- a/ui/src/views/system/resource-management/application/index.vue +++ b/ui/src/views/system/resource-management/application/index.vue @@ -17,6 +17,7 @@ import { DeleteApplicationAction, TriggerApplicationAction, } from '@/views/application/application-card/action-dropdown' +import perm from '@/permission' const { auth } = useStore() const router = useRouter() @@ -175,7 +176,7 @@ onMounted(() => { - + @@ -183,18 +184,19 @@ onMounted(() => { - + - + - + { :api="SystemResourceApplicationApi" :application="row" @delete="loadApplicationPage" + v-if="perm.application.system.delete()" />