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/permission/core/data.ts b/ui/src/permission/core/data.ts
index de989870d7b..89ebe420924 100644
--- a/ui/src/permission/core/data.ts
+++ b/ui/src/permission/core/data.ts
@@ -192,44 +192,44 @@ export const PermissionConstants = {
LOGIN_AUTH_EDIT: p(Group.LOGIN_AUTH, Group.LOGIN_AUTH, Operate.EDIT, 1),
// ==================== APPLICATION ====================
- APPLICATION_READ: p(Group.APPLICATION, Group.APPLICATION, Operate.READ, 1),
- APPLICATION_CREATE: p(Group.APPLICATION, Group.APPLICATION, Operate.CREATE, 2),
- APPLICATION_COPY: p(Group.APPLICATION, Group.APPLICATION, Operate.COPY, 3),
- APPLICATION_EDIT: p(Group.APPLICATION, Group.APPLICATION, Operate.EDIT, 4),
- APPLICATION_DELETE: p(Group.APPLICATION, Group.APPLICATION, Operate.DELETE, 5),
- APPLICATION_IMPORT: p(Group.APPLICATION, Group.APPLICATION, Operate.IMPORT, 6),
- APPLICATION_EXPORT: p(Group.APPLICATION, Group.APPLICATION, Operate.EXPORT, 7),
- APPLICATION_PUBLISH: p(Group.APPLICATION, Group.APPLICATION, Operate.PUBLISH, 8),
- APPLICATION_BATCH_DELETE: p(Group.APPLICATION, Group.APPLICATION, Operate.BATCH_DELETE, 9),
- APPLICATION_BATCH_MOVE: p(Group.APPLICATION, Group.APPLICATION, Operate.BATCH_MOVE, 10),
- APPLICATION_RESOURCE_AUTHORIZATION: p(Group.APPLICATION, Group.APPLICATION, Operate.AUTH, 11),
- APPLICATION_RELATE_RESOURCE_VIEW: p(Group.APPLICATION, Group.APPLICATION, Operate.RELATE_VIEW, 12),
- APPLICATION_TRIGGER_READ: p(Group.APPLICATION, Group.APPLICATION, Operate.TRIGGER_READ, 13),
- APPLICATION_TRIGGER_CREATE: p(Group.APPLICATION, Group.APPLICATION, Operate.TRIGGER_CREATE, 14),
- APPLICATION_TRIGGER_EDIT: p(Group.APPLICATION, Group.APPLICATION, Operate.TRIGGER_EDIT, 15),
- APPLICATION_TRIGGER_DELETE: p(Group.APPLICATION, Group.APPLICATION, Operate.TRIGGER_DELETE, 16),
- APPLICATION_PORTAL_UP: p(Group.APPLICATION, Group.APPLICATION, Operate.PORTAL_UP, 17),
- APPLICATION_PORTAL_DOWN: p(Group.APPLICATION, Group.APPLICATION, Operate.PORTAL_DOWN, 18),
- APPLICATION_FOLDER_READ: p(Group.APPLICATION, Group.FOLDER, Operate.READ, 0),
- APPLICATION_FOLDER_CREATE: p(Group.APPLICATION, Group.FOLDER, Operate.CREATE, 1),
- APPLICATION_FOLDER_EDIT: p(Group.APPLICATION, Group.FOLDER, Operate.EDIT, 2),
- APPLICATION_FOLDER_DELETE: p(Group.APPLICATION, Group.FOLDER, Operate.DELETE, 3),
- APPLICATION_FOLDER_AUTH: p(Group.APPLICATION, Group.FOLDER, Operate.AUTH, 4),
- APPLICATION_OVERVIEW_READ: p(Group.APPLICATION, Group.OVERVIEW, Operate.READ, 0),
- APPLICATION_OVERVIEW_EMBED: p(Group.APPLICATION, Group.OVERVIEW, Operate.EMBED, 1),
- APPLICATION_OVERVIEW_ACCESS: p(Group.APPLICATION, Group.OVERVIEW, Operate.ACCESS, 2),
- APPLICATION_OVERVIEW_DISPLAY: p(Group.APPLICATION, Group.OVERVIEW, Operate.DISPLAY, 3),
- APPLICATION_OVERVIEW_API_KEY: p(Group.APPLICATION, Group.OVERVIEW, Operate.API_KEY, 4),
- APPLICATION_OVERVIEW_PUBLIC: p(Group.APPLICATION, Group.OVERVIEW, Operate.PUBLIC_ACCESS, 5),
- APPLICATION_ACCESS_READ: p(Group.APPLICATION, Group.ACCESS, Operate.READ, 0),
- APPLICATION_ACCESS_EDIT: p(Group.APPLICATION, Group.ACCESS, Operate.EDIT, 1),
- APPLICATION_CHAT_USER_READ: p(Group.APPLICATION, Group.CHAT_USER, Operate.READ, 0),
- APPLICATION_CHAT_USER_EDIT: p(Group.APPLICATION, Group.CHAT_USER, Operate.EDIT, 1),
- APPLICATION_CHAT_LOG_READ: p(Group.APPLICATION, Group.CHAT_LOG, Operate.READ, 0),
- APPLICATION_CHAT_LOG_ANNOTATION: p(Group.APPLICATION, Group.CHAT_LOG, Operate.ANNOTATION, 1),
- APPLICATION_CHAT_LOG_EXPORT: p(Group.APPLICATION, Group.CHAT_LOG, Operate.EXPORT, 2),
- APPLICATION_CHAT_LOG_CLEAR_POLICY: p(Group.APPLICATION, Group.CHAT_LOG, Operate.CLEAR_POLICY, 3),
- APPLICATION_CHAT_LOG_ADD_KNOWLEDGE: p(Group.APPLICATION, Group.CHAT_LOG, Operate.ADD_KNOWLEDGE, 4),
+ APPLICATION_READ: p(Group.APPLICATION, Group.APPLICATION, Operate.READ, 0),
+ APPLICATION_CREATE: p(Group.APPLICATION, Group.APPLICATION, Operate.CREATE, 1),
+ APPLICATION_COPY: p(Group.APPLICATION, Group.APPLICATION, Operate.COPY, 2),
+ APPLICATION_EDIT: p(Group.APPLICATION, Group.APPLICATION, Operate.EDIT, 3),
+ APPLICATION_DELETE: p(Group.APPLICATION, Group.APPLICATION, Operate.DELETE, 4),
+ APPLICATION_IMPORT: p(Group.APPLICATION, Group.APPLICATION, Operate.IMPORT, 5),
+ APPLICATION_EXPORT: p(Group.APPLICATION, Group.APPLICATION, Operate.EXPORT, 6),
+ APPLICATION_PUBLISH: p(Group.APPLICATION, Group.APPLICATION, Operate.PUBLISH, 7),
+ APPLICATION_BATCH_DELETE: p(Group.APPLICATION, Group.APPLICATION, Operate.BATCH_DELETE, 8),
+ APPLICATION_BATCH_MOVE: p(Group.APPLICATION, Group.APPLICATION, Operate.BATCH_MOVE, 9),
+ APPLICATION_RESOURCE_AUTHORIZATION: p(Group.APPLICATION, Group.APPLICATION, Operate.AUTH, 10),
+ APPLICATION_RELATE_RESOURCE_VIEW: p(Group.APPLICATION, Group.APPLICATION, Operate.RELATE_VIEW, 11),
+ APPLICATION_TRIGGER_READ: p(Group.APPLICATION, Group.APPLICATION, Operate.TRIGGER_READ, 12),
+ APPLICATION_TRIGGER_CREATE: p(Group.APPLICATION, Group.APPLICATION, Operate.TRIGGER_CREATE, 13),
+ APPLICATION_TRIGGER_EDIT: p(Group.APPLICATION, Group.APPLICATION, Operate.TRIGGER_EDIT, 14),
+ APPLICATION_TRIGGER_DELETE: p(Group.APPLICATION, Group.APPLICATION, Operate.TRIGGER_DELETE, 15),
+ APPLICATION_PORTAL_UP: p(Group.APPLICATION, Group.APPLICATION, Operate.PORTAL_UP, 16),
+ APPLICATION_PORTAL_DOWN: p(Group.APPLICATION, Group.APPLICATION, Operate.PORTAL_DOWN, 17),
+ APPLICATION_FOLDER_READ: p(Group.APPLICATION, Group.FOLDER, Operate.READ, 18),
+ APPLICATION_FOLDER_CREATE: p(Group.APPLICATION, Group.FOLDER, Operate.CREATE, 19),
+ APPLICATION_FOLDER_EDIT: p(Group.APPLICATION, Group.FOLDER, Operate.EDIT, 20),
+ APPLICATION_FOLDER_DELETE: p(Group.APPLICATION, Group.FOLDER, Operate.DELETE, 21),
+ APPLICATION_FOLDER_AUTH: p(Group.APPLICATION, Group.FOLDER, Operate.AUTH, 22),
+ APPLICATION_OVERVIEW_READ: p(Group.APPLICATION, Group.OVERVIEW, Operate.READ, 23),
+ APPLICATION_OVERVIEW_EMBED: p(Group.APPLICATION, Group.OVERVIEW, Operate.EMBED, 24),
+ APPLICATION_OVERVIEW_ACCESS: p(Group.APPLICATION, Group.OVERVIEW, Operate.ACCESS, 25),
+ APPLICATION_OVERVIEW_DISPLAY: p(Group.APPLICATION, Group.OVERVIEW, Operate.DISPLAY, 26),
+ APPLICATION_OVERVIEW_API_KEY: p(Group.APPLICATION, Group.OVERVIEW, Operate.API_KEY, 27),
+ APPLICATION_OVERVIEW_PUBLIC: p(Group.APPLICATION, Group.OVERVIEW, Operate.PUBLIC_ACCESS, 28),
+ APPLICATION_ACCESS_READ: p(Group.APPLICATION, Group.ACCESS, Operate.READ, 29),
+ APPLICATION_ACCESS_EDIT: p(Group.APPLICATION, Group.ACCESS, Operate.EDIT, 30),
+ APPLICATION_CHAT_USER_READ: p(Group.APPLICATION, Group.CHAT_USER, Operate.READ, 31),
+ APPLICATION_CHAT_USER_EDIT: p(Group.APPLICATION, Group.CHAT_USER, Operate.EDIT, 32),
+ APPLICATION_CHAT_LOG_READ: p(Group.APPLICATION, Group.CHAT_LOG, Operate.READ, 33),
+ APPLICATION_CHAT_LOG_ANNOTATION: p(Group.APPLICATION, Group.CHAT_LOG, Operate.ANNOTATION, 34),
+ APPLICATION_CHAT_LOG_EXPORT: p(Group.APPLICATION, Group.CHAT_LOG, Operate.EXPORT, 35),
+ APPLICATION_CHAT_LOG_CLEAR_POLICY: p(Group.APPLICATION, Group.CHAT_LOG, Operate.CLEAR_POLICY, 36),
+ APPLICATION_CHAT_LOG_ADD_KNOWLEDGE: p(Group.APPLICATION, Group.CHAT_LOG, Operate.ADD_KNOWLEDGE, 37),
// ==================== OTHER ====================
ABOUT_READ: p(Group.OTHER, Group.OTHER, Operate.ABOUT, 0),
@@ -349,21 +349,21 @@ export const PermissionConstants = {
RESOURCE_APPLICATION_RELATE_RESOURCE_VIEW: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_RES_APPLICATION, Operate.RELATE_VIEW, 11),
RESOURCE_APPLICATION_PORTAL_UP: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_RES_APPLICATION, Operate.PORTAL_UP, 12),
RESOURCE_APPLICATION_PORTAL_DOWN: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_RES_APPLICATION, Operate.PORTAL_DOWN, 13),
- RESOURCE_APPLICATION_OVERVIEW_READ: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_OVERVIEW, Operate.READ, 0),
- RESOURCE_APPLICATION_OVERVIEW_EMBED: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_OVERVIEW, Operate.EMBED, 1),
- RESOURCE_APPLICATION_OVERVIEW_ACCESS: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_OVERVIEW, Operate.ACCESS, 2),
- RESOURCE_APPLICATION_OVERVIEW_DISPLAY: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_OVERVIEW, Operate.DISPLAY, 3),
- RESOURCE_APPLICATION_OVERVIEW_API_KEY: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_OVERVIEW, Operate.API_KEY, 4),
- RESOURCE_APPLICATION_OVERVIEW_PUBLIC: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_OVERVIEW, Operate.PUBLIC_ACCESS, 5),
- RESOURCE_APPLICATION_ACCESS_READ: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_ACCESS, Operate.READ, 0),
- RESOURCE_APPLICATION_ACCESS_EDIT: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_ACCESS, Operate.EDIT, 1),
- RESOURCE_APPLICATION_CHAT_USER_READ: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_CHAT_USER, Operate.READ, 0),
- RESOURCE_APPLICATION_CHAT_USER_EDIT: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_CHAT_USER, Operate.EDIT, 1),
- RESOURCE_APPLICATION_CHAT_LOG_READ: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_CHAT_LOG, Operate.READ, 0),
- RESOURCE_APPLICATION_CHAT_LOG_ADD_KNOWLEDGE: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_CHAT_LOG, Operate.ADD_KNOWLEDGE, 1),
- RESOURCE_APPLICATION_CHAT_LOG_ANNOTATION: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_CHAT_LOG, Operate.ANNOTATION, 2),
- RESOURCE_APPLICATION_CHAT_LOG_EXPORT: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_CHAT_LOG, Operate.EXPORT, 3),
- RESOURCE_APPLICATION_CHAT_LOG_CLEAR_POLICY: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_CHAT_LOG, Operate.CLEAR_POLICY, 4),
+ RESOURCE_APPLICATION_OVERVIEW_READ: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_OVERVIEW, Operate.READ, 14),
+ RESOURCE_APPLICATION_OVERVIEW_EMBED: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_OVERVIEW, Operate.EMBED, 15),
+ RESOURCE_APPLICATION_OVERVIEW_ACCESS: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_OVERVIEW, Operate.ACCESS, 16),
+ RESOURCE_APPLICATION_OVERVIEW_DISPLAY: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_OVERVIEW, Operate.DISPLAY, 17),
+ RESOURCE_APPLICATION_OVERVIEW_API_KEY: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_OVERVIEW, Operate.API_KEY, 18),
+ RESOURCE_APPLICATION_OVERVIEW_PUBLIC: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_OVERVIEW, Operate.PUBLIC_ACCESS, 19),
+ RESOURCE_APPLICATION_ACCESS_READ: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_ACCESS, Operate.READ, 20),
+ RESOURCE_APPLICATION_ACCESS_EDIT: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_ACCESS, Operate.EDIT, 21),
+ RESOURCE_APPLICATION_CHAT_USER_READ: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_CHAT_USER, Operate.READ, 22),
+ RESOURCE_APPLICATION_CHAT_USER_EDIT: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_CHAT_USER, Operate.EDIT, 23),
+ RESOURCE_APPLICATION_CHAT_LOG_READ: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_CHAT_LOG, Operate.READ, 24),
+ RESOURCE_APPLICATION_CHAT_LOG_ADD_KNOWLEDGE: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_CHAT_LOG, Operate.ADD_KNOWLEDGE, 25),
+ RESOURCE_APPLICATION_CHAT_LOG_ANNOTATION: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_CHAT_LOG, Operate.ANNOTATION, 26),
+ RESOURCE_APPLICATION_CHAT_LOG_EXPORT: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_CHAT_LOG, Operate.EXPORT, 27),
+ RESOURCE_APPLICATION_CHAT_LOG_CLEAR_POLICY: p(Group.SYSTEM_RES_APPLICATION, Group.SYSTEM_CHAT_LOG, Operate.CLEAR_POLICY, 28),
// ==================== SYSTEM_RES_KNOWLEDGE ====================
RESOURCE_KNOWLEDGE_READ: p(Group.SYSTEM_RES_KNOWLEDGE, Group.SYSTEM_RES_KNOWLEDGE, Operate.READ, 0),
diff --git a/ui/src/permission/core/index.ts b/ui/src/permission/core/index.ts
index 76952c0f6bc..abf1eda36fc 100644
--- a/ui/src/permission/core/index.ts
+++ b/ui/src/permission/core/index.ts
@@ -74,7 +74,10 @@ export const buildBaseResourcePermission = (permission: Permission, resourceId:
? buildBasePermission(permission, workspaceId)
: AggregatePermission.builder()
.addPermission(permission.newResourcePermission(workspaceId, resourceId))
- .addRole(RoleConstants.ADMIN)
+ .addPermission(AggregatePermission.builder().addRole(new Role(RoleConstants.EXTENDS_WORKSPACE_MANAGE.name, workspaceId))
+ .addPermission(new Permission(permission.group,permission.subGroup,permission.operate,permission.bitIndex,workspaceId))
+ .compare(Compare.AND)
+ .build())
.addRole(new Role(RoleConstants.WORKSPACE_MANAGE.name, workspaceId))
.compare(Compare.OR)
.build()
diff --git a/ui/src/permission/modules/application/index.ts b/ui/src/permission/modules/application/index.ts
index d8713fe7e16..f70c3dde988 100644
--- a/ui/src/permission/modules/application/index.ts
+++ b/ui/src/permission/modules/application/index.ts
@@ -3,8 +3,12 @@
import workspace from './workspace'
import system from './system'
-export default { workspace,
+export default {
+ /**
+ * 工作空间「智能体」权限
+ */
+ workspace,
/**
- * 系统「应用」权限
+ * 系统「智能体」权限
* */
system }
diff --git a/ui/src/permission/modules/application/system.ts b/ui/src/permission/modules/application/system.ts
index e6cd153c362..4091c3e2fed 100644
--- a/ui/src/permission/modules/application/system.ts
+++ b/ui/src/permission/modules/application/system.ts
@@ -21,43 +21,121 @@ const system = {
folderManage: () => false,
// —— 资源操作 ——
+/**
+ * 系统「智能体」编辑权限
+ */
edit: () => canSys(P.RESOURCE_APPLICATION_EDIT),
+/**
+ * 系统「智能体」删除权限
+ */
delete: () => canSys(P.RESOURCE_APPLICATION_DELETE),
+/**
+ * 系统「智能体」复制权限
+ */
copy: () => canSys(P.RESOURCE_APPLICATION_COPY),
+/**
+ * 系统「智能体」导入权限
+ */
export: () => canSys(P.RESOURCE_APPLICATION_EXPORT),
+/**
+ * 系统「智能体」发布权限
+ */
publish: () => canSys(P.RESOURCE_APPLICATION_PUBLISH),
+/**
+ * 系统「智能体」发布到门户权限
+ */
portalUp: () => canSys(P.RESOURCE_APPLICATION_PORTAL_UP),
+/**
+ * 系统「智能体」从门户下架权限
+ */
portalDown: () => canSys(P.RESOURCE_APPLICATION_PORTAL_DOWN),
+/**
+ * 系统「智能体」资源授权权限
+ */
auth: () => canSys(P.RESOURCE_APPLICATION_AUTH),
+/**
+ * 系统「智能体」查看关联资源权限
+ */
relateMap: () => canSys(P.RESOURCE_APPLICATION_RELATE_RESOURCE_VIEW),
debug: () => canSys(P.RESOURCE_APPLICATION_EDIT),
// —— 触发器 ——
+/**
+ * 系统「智能体」「触发器」只读权限
+ */
triggerRead: () => canSys(P.RESOURCE_APPLICATION_TRIGGER_READ),
+/**
+ * 系统「智能体」「触发器」创建权限
+ */
triggerCreate: () => canSys(P.RESOURCE_APPLICATION_TRIGGER_CREATE),
+/**
+ * 系统「智能体」「触发器」编辑权限
+ */
triggerEdit: () => canSys(P.RESOURCE_APPLICATION_TRIGGER_EDIT),
+/**
+ * 系统「智能体」「触发器」删除权限
+ */
triggerDelete: () => canSys(P.RESOURCE_APPLICATION_TRIGGER_DELETE),
// —— 概览 ——
+/**
+ * 系统「智能体」「概览」只读权限
+ */
overviewRead: () => canSys(P.RESOURCE_APPLICATION_OVERVIEW_READ),
+/**
+ * 系统「智能体」「概览」嵌入第三方权限
+ */
overviewEmbed: () => canSys(P.RESOURCE_APPLICATION_OVERVIEW_EMBED),
+/**
+ * 系统「智能体」「概览」访问限制权限
+ */
overviewAccess: () => canSys(P.RESOURCE_APPLICATION_OVERVIEW_ACCESS),
+/**
+ * 系统「智能体」「概览」显示设置权限
+ */
overviewDisplay: () => canSys(P.RESOURCE_APPLICATION_OVERVIEW_DISPLAY),
+/**
+ * 系统「智能体」「概览」API KEY权限
+ */
overviewApiKey: () => canSys(P.RESOURCE_APPLICATION_OVERVIEW_API_KEY),
// —— 访问 / 访客 / 对话日志 ——
+/**
+ * 系统「智能体」「智能体接入」只读权限
+ */
accessRead: () => canSys(P.RESOURCE_APPLICATION_ACCESS_READ),
+/**
+ * 系统「智能体」「智能体接入」编辑权限
+ */
accessEdit: () => canSys(P.RESOURCE_APPLICATION_ACCESS_EDIT),
+/**
+ * 系统「智能体」「对话用户」只读权限
+ */
chatUserRead: () => canSys(P.RESOURCE_APPLICATION_CHAT_USER_READ),
+/**
+ * 系统「智能体」「对话用户」编辑权限
+ */
chatUserEdit: () => canSys(P.RESOURCE_APPLICATION_CHAT_USER_EDIT),
+/**
+ * 系统「智能体」「对话日志」只读权限
+ */
chatLogRead: () => canSys(P.RESOURCE_APPLICATION_CHAT_LOG_READ),
+/**
+ * 系统「智能体」「对话日志」编辑权限
+ */
chatLogClear: () => canSys(P.RESOURCE_APPLICATION_CHAT_LOG_CLEAR_POLICY),
+/**
+ * 系统「智能体」「对话日志」导出权限
+ */
chatLogExport: () => canSys(P.RESOURCE_APPLICATION_CHAT_LOG_EXPORT),
+/**
+ * 系统「智能体」「对话日志」添加到知识库权限
+ */
chatLogAddKnowledge: () => canSys(P.RESOURCE_APPLICATION_CHAT_LOG_ADD_KNOWLEDGE),
// —— 组合:跳转/进入应用 ——
/**
- * 系统「应用资源管理」(系统 > 资源管理 > 应用)只读权限
+ * 系统「智能体」只读权限
* */
read: () => canSys(P.RESOURCE_APPLICATION_READ) && hasEdition(Edition.EE),
}
diff --git a/ui/src/permission/modules/application/workspace.ts b/ui/src/permission/modules/application/workspace.ts
index dd62b516c63..4e4ca7299a2 100644
--- a/ui/src/permission/modules/application/workspace.ts
+++ b/ui/src/permission/modules/application/workspace.ts
@@ -5,52 +5,163 @@ import { PermissionConstants as P } from '../../core'
const workspace = {
// —— 工作空间级(无资源 id)——
+/**
+ * 工作空间「智能体」创建权限
+ */
create: () => can(P.APPLICATION_CREATE),
+/**
+ * 工作空间「智能体」批量删除权限
+ */
batchDelete: () => can(P.APPLICATION_BATCH_DELETE),
+/**
+ * 工作空间「智能体」批量移动权限
+ */
batchMove: () => can(P.APPLICATION_BATCH_MOVE),
+/**
+ * 工作空间「智能体」批量清除策略权限
+ */
batchCleanStrategy: () => can(P.APPLICATION_CHAT_LOG_CLEAR_POLICY),
// —— 资源级(按应用 id)——
+/**
+ * 工作空间「智能体」编辑权限
+ */
edit: (id: string) => canRes(P.APPLICATION_EDIT, id),
+/**
+ * 工作空间「智能体」删除权限
+ */
delete: (id: string) => canRes(P.APPLICATION_DELETE, id),
+/**
+ * 工作空间「智能体」复制权限
+ */
copy: (id: string) => canRes(P.APPLICATION_COPY, id),
+/**
+ * 工作空间「智能体」导出权限
+ */
export: (id: string) => canRes(P.APPLICATION_EXPORT, id),
+/**
+ * 工作空间「智能体」发布权限
+ */
publish: (id: string) => canRes(P.APPLICATION_PUBLISH, id),
+/**
+ * 工作空间「智能体」上架到门户权限
+ */
portalUp: (id: string) => canRes(P.APPLICATION_PORTAL_UP, id),
+/**
+ * 工作空间「智能体」从门户下架权限
+ */
portalDown: (id: string) => canRes(P.APPLICATION_PORTAL_DOWN, id),
+/**
+ * 工作空间「智能体」资源授权权限
+ */
auth: (id: string) => canRes(P.APPLICATION_RESOURCE_AUTHORIZATION, id),
+/**
+ * 工作空间「智能体」查看关联资源权限
+ */
relateMap: (id: string) => canRes(P.APPLICATION_RELATE_RESOURCE_VIEW, id),
debug: (id: string) => canRes(P.APPLICATION_READ, id),
// —— 文件夹 ——
+/**
+ * 工作空间「智能体」「文件夹」创建权限
+ */
folderCreate: (id: string) => canRes(P.APPLICATION_FOLDER_CREATE, id),
+/**
+ * 工作空间「智能体」「文件夹」只读权限
+ */
folderRead: (id: string) => canRes(P.APPLICATION_FOLDER_READ, id),
+/**
+ * 工作空间「智能体」「文件夹」编辑权限
+ */
folderEdit: (id: string) => canRes(P.APPLICATION_FOLDER_EDIT, id),
+/**
+ * 工作空间「智能体」「文件夹」删除权限
+ */
folderDelete: (id: string) => canRes(P.APPLICATION_FOLDER_DELETE, id),
+/**
+ * 工作空间「智能体」「文件夹」资源授权权限
+ */
folderAuth: (id: string) => canRes(P.APPLICATION_FOLDER_AUTH, id),
folderManage: (id: string) => canRes(P.APPLICATION_FOLDER_EDIT, id),
// —— 触发器 ——
+/**
+ * 工作空间「智能体」「触发器」只读权限
+ */
triggerRead: (id: string) => canRes(P.APPLICATION_TRIGGER_READ, id),
+/**
+ * 工作空间「智能体」「触发器」创建权限
+ */
triggerCreate: (id: string) => canRes(P.APPLICATION_TRIGGER_CREATE, id),
+/**
+ * 工作空间「智能体」「触发器」编辑权限
+ */
triggerEdit: (id: string) => canRes(P.APPLICATION_TRIGGER_EDIT, id),
+/**
+ * 工作空间「智能体」「触发器」删除权限
+ */
triggerDelete: (id: string) => canRes(P.APPLICATION_TRIGGER_DELETE, id),
// —— 概览 ——
+/**
+ * 工作空间「智能体」「概览」只读权限
+ */
overviewRead: (id: string) => canRes(P.APPLICATION_OVERVIEW_READ, id),
+/**
+ * 工作空间「智能体」「概览」嵌入第三方权限
+ */
overviewEmbed: (id: string) => canRes(P.APPLICATION_OVERVIEW_EMBED, id),
+/**
+ * 工作空间「智能体」「概览」访问限制权限
+ */
overviewAccess: (id: string) => canRes(P.APPLICATION_OVERVIEW_ACCESS, id),
+/**
+ * 工作空间「智能体」「概览」显示设置权限
+ */
overviewDisplay: (id: string) => canRes(P.APPLICATION_OVERVIEW_DISPLAY, id),
+/**
+ * 工作空间「智能体」「概览」API KEY权限
+ */
overviewApiKey: (id: string) => canRes(P.APPLICATION_OVERVIEW_API_KEY, id),
// —— 访问 / 访客 / 对话日志 ——
+/**
+ * 工作空间「智能体」「智能体接入」只读权限
+ */
+ accessRead: (id: string) => canRes(P.APPLICATION_ACCESS_READ, id),
+/**
+ * 工作空间「智能体」「智能体接入」编辑权限
+ */
accessEdit: (id: string) => canRes(P.APPLICATION_ACCESS_EDIT, id),
+/**
+ * 工作空间「智能体」「对话用户」只读权限
+ */
+ chatUserRead: (id: string) => canRes(P.APPLICATION_CHAT_USER_READ, id),
+/**
+ * 工作空间「智能体」「对话用户」编辑权限
+ */
chatUserEdit: (id: string) => canRes(P.APPLICATION_CHAT_USER_EDIT, id),
+/**
+ * 工作空间「智能体」「对话日志」只读权限
+ */
+ chatLogRead: (id: string) => canRes(P.APPLICATION_CHAT_LOG_READ, id),
+/**
+ * 工作空间「智能体」「对话日志」清除策略权限
+ */
chatLogClear: (id: string) => canRes(P.APPLICATION_CHAT_LOG_CLEAR_POLICY, id),
+/**
+ * 工作空间「智能体」「对话日志」导出权限
+ */
chatLogExport: (id: string) => canRes(P.APPLICATION_CHAT_LOG_EXPORT, id),
+/**
+ * 工作空间「智能体」「对话日志」添加到知识库权限
+ */
chatLogAddKnowledge: (id: string) => canRes(P.APPLICATION_CHAT_LOG_ADD_KNOWLEDGE, id),
// —— 组合:跳转/进入应用(概览读 或 应用读 皆可)——
+/**
+ * 工作空间「智能体」只读权限
+ */
read: (id: string) => canRes(P.APPLICATION_OVERVIEW_READ, id) || canRes(P.APPLICATION_READ, id),
}
diff --git a/ui/src/permission/modules/trigger.ts b/ui/src/permission/modules/trigger.ts
index 8a76ee5814d..691551d8935 100644
--- a/ui/src/permission/modules/trigger.ts
+++ b/ui/src/permission/modules/trigger.ts
@@ -2,6 +2,10 @@
import { can } from '../policy'
import { PermissionConstants as P } from '../core'
export default {
+ /**
+ * 工作空间「触发器」只读权限
+ */
+ read: () => can(P.TRIGGER_READ),
/**
* 工作空间「触发器」创建权限
*/
diff --git a/ui/src/router/admin/system/modules/application-system-resource.ts b/ui/src/router/admin/system/modules/application-system-resource.ts
index eb0bf71888f..e3014f38f03 100644
--- a/ui/src/router/admin/system/modules/application-system-resource.ts
+++ b/ui/src/router/admin/system/modules/application-system-resource.ts
@@ -1,5 +1,6 @@
import type { RouteRecordRaw } from 'vue-router'
import { APPLICATION_TYPE } from '@/api/enums'
+import { perm } from '@/permission'
/** System 资源管理智能体详情,与 Workspace 复用页面,不提供共享详情。 */
export const systemResourceApplicationRoutes: RouteRecordRaw[] = [
@@ -19,6 +20,7 @@ export const systemResourceApplicationRoutes: RouteRecordRaw[] = [
icon: 'icon_screen_outlined',
activeIcon: 'icon_screen_filled',
order: 10,
+ permission: perm.application.system.overviewRead,
},
},
{
@@ -31,6 +33,7 @@ export const systemResourceApplicationRoutes: RouteRecordRaw[] = [
activeIcon: 'icon_setting_filled',
order: 20,
detailMenuVisible: (params) => params.type === APPLICATION_TYPE.SIMPLE,
+ permission: perm.application.system.edit,
},
},
{
@@ -55,19 +58,19 @@ export const systemResourceApplicationRoutes: RouteRecordRaw[] = [
path: 'access',
name: 'system-resource-application-access',
component: () => import('@/views/application-detail/access/index.vue'),
- meta: { title: '发布渠道', icon: 'icon_application_outlined', activeIcon: 'icon_application_filled', order: 30 },
+ meta: { title: '发布渠道', icon: 'icon_application_outlined', activeIcon: 'icon_application_filled', order: 30, permission: perm.application.system.accessRead},
},
{
path: 'chat-user',
name: 'system-resource-application-chat-user',
component: () => import('@/views/application-detail/chat-user/index.vue'),
- meta: { title: '对话用户', icon: 'icon_contacts_outlined', activeIcon: 'icon_contacts_filled', order: 40 },
+ meta: { title: '对话用户', icon: 'icon_contacts_outlined', activeIcon: 'icon_contacts_filled', order: 40, permission: perm.application.system.chatUserRead},
},
{
path: 'operation-log',
name: 'system-resource-application-operation-log',
component: () => import('@/views/application-detail/chat-log/index.vue'),
- meta: { title: '对话日志', icon: 'icon_logs_outlined', activeIcon: 'icon_logs_filled', order: 50 },
+ meta: { title: '对话日志', icon: 'icon_logs_outlined', activeIcon: 'icon_logs_filled', order: 50, permission: perm.application.system.chatLogRead},
},
],
},
diff --git a/ui/src/router/admin/types.ts b/ui/src/router/admin/types.ts
index f8a37c05bae..c790c927e81 100644
--- a/ui/src/router/admin/types.ts
+++ b/ui/src/router/admin/types.ts
@@ -32,3 +32,11 @@ declare module 'vue-router' {
title?: string
}
}
+
+declare module 'vue-router' {
+ interface RouteMeta {
+ // ...
+ /** 路由菜单/守卫的权限判断(菜单构建与守卫共用)。 */
+ permission?: (route: { params: RouteParamsGeneric }) => boolean
+ }
+}
diff --git a/ui/src/router/admin/workspace/modules/application.ts b/ui/src/router/admin/workspace/modules/application.ts
index 1a2c00f58dc..36928169d23 100644
--- a/ui/src/router/admin/workspace/modules/application.ts
+++ b/ui/src/router/admin/workspace/modules/application.ts
@@ -31,6 +31,7 @@ export const applicationRoutes: RouteRecordRaw[] = [
activeIcon: 'icon_screen_filled',
order: 10,
canAccess: (params) => perm.application.workspace.overviewRead(String(params.applicationId)),
+ permission: (route) => perm.application.workspace.overviewRead(String(route.params.applicationId)),
},
},
{
@@ -44,6 +45,7 @@ export const applicationRoutes: RouteRecordRaw[] = [
order: 20,
detailMenuVisible: (params) => params.type === APPLICATION_TYPE.SIMPLE,
canAccess: (params) => params.type === APPLICATION_TYPE.SIMPLE && perm.application.workspace.edit(String(params.applicationId)),
+ permission: (route) => perm.application.workspace.edit(String(route.params.applicationId)),
},
},
{
@@ -68,19 +70,19 @@ export const applicationRoutes: RouteRecordRaw[] = [
path: 'access',
name: 'workspace-application-access',
component: () => import('@/views/application-detail/access/index.vue'),
- meta: { title: '发布渠道', icon: 'icon_application_outlined', activeIcon: 'icon_application_filled', order: 30 },
+ meta: { title: '发布渠道', icon: 'icon_application_outlined', activeIcon: 'icon_application_filled', order: 30, permission: (route) => perm.application.workspace.accessRead(String(route.params.applicationId))},
},
{
path: 'chat-user',
name: 'workspace-application-chat-user',
component: () => import('@/views/application-detail/chat-user/index.vue'),
- meta: { title: '对话用户', icon: 'icon_contacts_outlined', activeIcon: 'icon_contacts_filled', order: 40 },
+ meta: { title: '对话用户', icon: 'icon_contacts_outlined', activeIcon: 'icon_contacts_filled', order: 40, permission: (route) => perm.application.workspace.chatUserRead(String(route.params.applicationId))},
},
{
path: 'operation-log',
name: 'workspace-application-operation-log',
component: () => import('@/views/application-detail/chat-log/index.vue'),
- meta: { title: '对话日志', icon: 'icon_logs_outlined', activeIcon: 'icon_logs_filled', order: 50 },
+ meta: { title: '对话日志', icon: 'icon_logs_outlined', activeIcon: 'icon_logs_filled', order: 50, permission: (route) => perm.application.workspace.chatLogRead(String(route.params.applicationId)),},
},
],
},
diff --git a/ui/src/views/application-detail/access/AccessSettingDrawer.vue b/ui/src/views/application-detail/access/AccessSettingDrawer.vue
index 6a858e554e0..bf5dd41ea49 100644
--- a/ui/src/views/application-detail/access/AccessSettingDrawer.vue
+++ b/ui/src/views/application-detail/access/AccessSettingDrawer.vue
@@ -9,6 +9,8 @@ import { ADMIN_API_BASE_PATH } from '@/api/constants'
import { copyText } from '@/utils/clipboard'
import { MsgSuccess } from '@/utils/message'
import type { AccessPlatformDefinition } from './platforms'
+import { isSystemResource } from '@/utils/resource-context.ts'
+import perm from '@/permission/index.ts'
const { resourceApi } = useApplicationDetailContext()
@@ -20,6 +22,13 @@ const loading = ref(false)
const formRef = useTemplateRef('formRef')
const form = reactive({})
+type ApplicationAccessPermissionMethod =
+ | 'accessEdit'
+function applicationAccessPermission(method: ApplicationAccessPermissionMethod): boolean {
+ if (isSystemResource()) return Boolean(perm.application.system[method]())
+ return Boolean(perm.application.workspace[method](props.applicationId))
+}
+
const isWechat = computed(() => props.platform.key === APPLICATION_ACCESS_PLATFORM.WECHAT)
const modeField = computed(() => props.platform.modeField)
// 表单字段随连接方式切换:长连接(ws)需要 bot_id/secret,URL 回调(callback)需要 token/encoding_aes_key。
@@ -139,7 +148,7 @@ onMounted(loadPlatformConfig)
取消
- 保存
+ 保存
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] ? '配置' : '未配置' }}
-
+
handlePlatformStatusChange(platform, value)"
diff --git a/ui/src/views/application-detail/chat-log/index.vue b/ui/src/views/application-detail/chat-log/index.vue
index bb3e30f02dc..b3ef977ad27 100644
--- a/ui/src/views/application-detail/chat-log/index.vue
+++ b/ui/src/views/application-detail/chat-log/index.vue
@@ -13,11 +13,22 @@ import ButtonCleanStrategy from './clean-strategy/ButtonCleanStrategy.vue'
import ButtonAddKnowledge from './add-knowledge/ButtonAddKnowledge.vue'
import { CHAT_LOG_SOURCE_LABELS } from './constants'
import ChatLogDetailDrawer from './ChatLogDetailDrawer.vue'
+import { isSystemResource } from '@/utils/resource-context.ts'
+import perm from '@/permission/index.ts'
defineOptions({ name: 'ApplicationChatLogView' })
defineProps()
defineExpose({ customHeader: true })
+type ApplicationChatLogPermissionMethod =
+ | 'chatLogClear'
+ | 'chatLogExport'
+ | 'chatLogAddKnowledge'
+function applicationChatLogPermission(method: ApplicationChatLogPermissionMethod): boolean {
+ if (isSystemResource()) return Boolean(perm.application.system[method]())
+ return Boolean(perm.application.workspace[method](applicationId.value))
+}
+
const { application, applicationId, resourceApi } = useApplicationDetailContext()
// 日志搜索与日期筛选
@@ -182,12 +193,12 @@ onMounted(() => loadChatLogs())
-
+
导出
-
+
@@ -248,6 +259,7 @@ onMounted(() => loadChatLogs())
:chat-ids="selectedChatLogs.map(({ id }) => id)"
:disabled="loading"
@refresh="handleKnowledgeAdded"
+ v-if="applicationChatLogPermission('chatLogAddKnowledge')"
/>
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() {
{{ title }}
-
+
@@ -216,7 +218,7 @@ function handleBatchDelete() {
-
+
{{ batchSelectionMode ? '取消选择' : '批量选择' }}
@@ -225,9 +227,9 @@ function handleBatchDelete() {
-
+
-
+
@@ -245,13 +247,13 @@ function handleBatchDelete() {
>
-
+
-
+
-
+
-
+
@@ -310,8 +316,8 @@ function handleBatchDelete() {
@batch-cancel="cancelBatchSelection"
>
- 移动到
- 删除
+ 移动到
+ 删除
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()"
/>