feat: Permission manage (#3283)

This commit is contained in:
shaohuzhang1 2025-06-17 18:34:06 +08:00 committed by GitHub
parent 0d36704f63
commit 19e8e76386
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 151 additions and 40 deletions

View File

@ -1,7 +1,8 @@
import {defineStore} from 'pinia'
import {type Ref} from 'vue'
import loginApi from '@/api/user/login'
import type {LoginRequest} from '@/api/type/login'
import type { LoginRequest } from '@/api/type/login'
import useUserStore from '@/stores/modules/user'
const useLoginStore = defineStore('logi', {

View File

@ -1,9 +1,69 @@
import { Permission, Role, Edition } from '@/utils/permission/type'
// class Operate(Enum):
// """
// 一个权限组的操作权限
// """
// READ = 'READ'
// EDIT = "READ+EDIT"
// CREATE = "READ+CREATE"
// DELETE = "READ+DELETE"
// """
// 使用权限
// """
// USE = "USE"
// IMPORT = "READ+IMPORT"
// EXPORT = "READ+EXPORT" # 导入导出
// DEBUG = "READ+DEBUG" # 调试
// SYNC = "READ+SYNC" # 同步
// GENERATE = "READ+GENERATE" # 生成
// ADD_MEMBER = "READ+ADD_MEMBER" # 添加成员
// REMOVE_MEMBER = "READ+REMOVE_MEMBER" # 添加成员
// VECTOR = "READ+VECTOR" # 向量化
// MIGRATE = "READ+MIGRATE" # 迁移
// RELATE = "READ+RELATE" # 关联
// USER_GROUP = "READ+USER_GROUP" # 用户组
// ANNOTATION = "READ+ANNOTATION" # 标注
// CLEAR_POLICY = "READ+CLEAR_POLICY"
const PermissionConst = {
USER_READ: new Permission('USER:READ'),
USER_CREATE: new Permission('USER:CREATE'),
KNOWLEDGE_READ: new Permission('KNOWLEDGE:READ'),
APPLICATION_OVERVIEW_READ: new Permission('APPLICATION_OVERVIEW_READ'),
KNOWLEDGE_READ: new Permission('KNOWLEDGE:READ'),
KNOWLEDGE_CREATE: new Permission('KNOWLEDGE:READ+CREATE'),
KNOWLEDGE_SYNC: new Permission('KNOWLEDGE:READ+SYNC'),
KNOWLEDGE_VECTOR: new Permission('KNOWLEDGE:READ+VECTOR'),
KNOWLEDGE_EDIT: new Permission('KNOWLEDGE:READ+EDIT'),
KNOWLEDGE_EXPORT: new Permission('KNOWLEDGE:READ+EXPORT'),
KNOWLEDGE_DELETE: new Permission('KNOWLEDGE:READ+DELETE'),
KNOWLEDGE_DOCUMENT_READ:new Permission('KNOWLEDGE_DOCUMENT:READ'),
KNOWLEDGE_DOCUMENT_CREATE:new Permission('KNOWLEDGE_DOCUMENT:READ+CREATE'),
KNOWLEDGE_DOCUMENT_EDIT:new Permission('KNOWLEDGE_DOCUMENT:READ+EDIT'),
KNOWLEDGE_DOCUMENT_SYNC:new Permission('KNOWLEDGE_DOCUMENT:READ+SYNC'),
KNOWLEDGE_DOCUMENT_MIGRATE:new Permission('KNOWLEDGE_DOCUMENT:READ+MIGRATE'),
KNOWLEDGE_DOCUMENT_VECTOR:new Permission('KNOWLEDGE_DOCUMENT:READ+VECTOR'),
KNOWLEDGE_DOCUMENT_GENERATE:new Permission('KNOWLEDGE_DOCUMENT:READ+GENERATE'),
KNOWLEDGE_DOCUMENT_EXPORT:new Permission('KNOWLEDGE_DOCUMENT:READ+EXPORT'),
KNOWLEDGE_PROBLEM_READ:new Permission('KNOWLEDGE_PROBLEM:READ'),
KNOWLEDGE_PROBLEM_CREATE:new Permission('KNOWLEDGE_PROBLEM:READ+CREATE'),
KNOWLEDGE_PROBLEM_EDIT:new Permission('KNOWLEDGE_PROBLEM:READ+EDIT'),
KNOWLEDGE_PROBLEM_RELATE:new Permission('KNOWLEDGE_PROBLEM:READ+RELATE'),
KNOWLEDGE_PROBLEM_DELETE:new Permission('KNOWLEDGE_PROBLEM:READ+DELETE'),
MODEL_READ:new Permission('MODEL:READ'),
MODEL_CREATE:new Permission('MODEL:READ+CREATE'),
MODEL_EDIT:new Permission('MODEL:READ+EDIT'),
MODEL_DELETE:new Permission('MODEL:READ+DELETE'),
SYSTEM_API_KEY_EDIT:new Permission('OTHER: READ+EDIT')
}
const RoleConst = {
ADMIN: new Role('ADMIN'),

View File

@ -10,23 +10,30 @@
v-if="knowledgeDetail.type === 0"
type="primary"
@click="router.push({ path: '/knowledge/document/upload', query: { id: id } })"
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_DOCUMENT_CREATE.getWorkspacePermission]"
>{{ $t('views.document.uploadDocument') }}
</el-button>
<el-button v-if="knowledgeDetail.type === 1" type="primary" @click="importDoc"
>{{ $t('views.document.importDocument') }}
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_DOCUMENT_CREATE.getWorkspacePermission]"
>{{ $t('views.document.importDocument') }}
</el-button>
<el-button @click="batchRefresh" :disabled="multipleSelection.length === 0">
{{ $t('views.knowledge.setting.vectorization') }}
<el-button @click="batchRefresh" :disabled="multipleSelection.length === 0"
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_DOCUMENT_VECTOR.getWorkspacePermission]"
>{{ $t('views.knowledge.setting.vectorization') }}
</el-button>
<el-button @click="openGenerateDialog()" :disabled="multipleSelection.length === 0">
{{ $t('views.document.generateQuestion.title') }}
<el-button @click="openGenerateDialog()" :disabled="multipleSelection.length === 0"
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_DOCUMENT_GENERATE.getWorkspacePermission]"
>{{ $t('views.document.generateQuestion.title') }}
</el-button>
<el-button @click="openknowledgeDialog()" :disabled="multipleSelection.length === 0">
{{ $t('views.document.setting.migration') }}
<el-button @click="openknowledgeDialog()" :disabled="multipleSelection.length === 0"
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_DOCUMENT_MIGRATE.getWorkspacePermission]"
>{{ $t('views.document.setting.migration') }}
</el-button>
<el-dropdown>
<el-button class="ml-12 mr-12">
<el-button class="ml-12 mr-12"
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_DOCUMENT_EDIT.getWorkspacePermission]"
>
<el-icon><MoreFilled /></el-icon>
</el-button>
<template #dropdown>
@ -350,6 +357,7 @@
text
@click.stop="cancelTask(row, TaskType.EMBEDDING)"
:title="$t('views.document.setting.cancelVectorization')"
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_DOCUMENT_VECTOR.getWorkspacePermission]"
>
<AppIcon iconName="app-close" style="font-size: 16px"></AppIcon>
</el-button>
@ -360,6 +368,7 @@
text
@click.stop="refreshDocument(row)"
:title="$t('views.knowledge.setting.vectorization')"
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_DOCUMENT_VECTOR.getWorkspacePermission]"
>
<AppIcon iconName="app-document-refresh" style="font-size: 16px"></AppIcon>
</el-button>
@ -370,13 +379,16 @@
text
@click.stop="settingDoc(row)"
:title="$t('common.setting')"
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_DOCUMENT_EDIT.getWorkspacePermission]"
>
<el-icon><Setting /></el-icon>
</el-button>
</span>
<span @click.stop>
<el-dropdown trigger="click">
<el-button text type="primary">
<el-button text type="primary"
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_DOCUMENT_EDIT.getWorkspacePermission]"
>
<el-icon><MoreFilled /></el-icon>
</el-button>
<template #dropdown>
@ -387,8 +399,7 @@
getTaskState(row.status, TaskType.GENERATE_PROBLEM),
)
"
@click="cancelTask(row, TaskType.GENERATE_PROBLEM)"
>
@click="cancelTask(row, TaskType.GENERATE_PROBLEM)">
<el-icon><Connection /></el-icon>
{{ $t('views.document.setting.cancelGenerateQuestion') }}
</el-dropdown-item>
@ -408,9 +419,8 @@
<AppIcon iconName="app-export"></AppIcon>
{{ $t('views.document.setting.export') }} Zip
</el-dropdown-item>
<el-dropdown-item icon="Delete" @click.stop="deleteDocument(row)">{{
$t('common.delete')
}}</el-dropdown-item>
<el-dropdown-item icon="Delete" @click.stop="deleteDocument(row)">
{{$t('common.delete')}}</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
@ -423,6 +433,7 @@
text
@click.stop="syncDocument(row)"
:title="$t('views.knowledge.setting.sync')"
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_SYNC.getWorkspacePermission]"
>
<el-icon><Refresh /></el-icon>
</el-button>
@ -438,7 +449,8 @@
text
@click.stop="cancelTask(row, TaskType.EMBEDDING)"
:title="$t('views.document.setting.cancelVectorization')"
>
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_DOCUMENT_VECTOR.getWorkspacePermission]"
>
<AppIcon iconName="app-close" style="font-size: 16px"></AppIcon>
</el-button>
@ -448,19 +460,23 @@
text
@click.stop="refreshDocument(row)"
:title="$t('views.knowledge.setting.vectorization')"
>
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_DOCUMENT_VECTOR.getWorkspacePermission]"
>
<AppIcon iconName="app-document-refresh" style="font-size: 16px"></AppIcon>
</el-button>
</span>
<span @click.stop>
<el-dropdown trigger="click">
<el-button text type="primary">
<el-button text type="primary"
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_DOCUMENT_EDIT.getWorkspacePermission]"
>
<el-icon><MoreFilled /></el-icon>
</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item icon="Setting" @click="settingDoc(row)">{{
<el-dropdown-item icon="Setting" @click="settingDoc(row)"
>{{
$t('common.setting')
}}</el-dropdown-item>
<el-dropdown-item
@ -474,25 +490,30 @@
<el-icon><Connection /></el-icon>
{{ $t('views.document.setting.cancelGenerateQuestion') }}
</el-dropdown-item>
<el-dropdown-item v-else @click="openGenerateDialog(row)">
<el-dropdown-item v-else @click="openGenerateDialog(row)"
>
<el-icon><Connection /></el-icon>
{{ $t('views.document.generateQuestion.title') }}
</el-dropdown-item>
<el-dropdown-item @click="openknowledgeDialog(row)">
<AppIcon iconName="app-migrate"></AppIcon>
{{ $t('views.document.setting.migration') }}</el-dropdown-item
<el-dropdown-item @click="openknowledgeDialog(row)"
>
<AppIcon iconName="app-migrate"></AppIcon>
{{ $t('views.document.setting.migration') }}
</el-dropdown-item>
<el-dropdown-item @click="exportDocument(row)"
>
<el-dropdown-item @click="exportDocument(row)">
<AppIcon iconName="app-export"></AppIcon>
{{ $t('views.document.setting.export') }} Excel
</el-dropdown-item>
<el-dropdown-item @click="exportDocumentZip(row)">
<el-dropdown-item @click="exportDocumentZip(row)"
>
<AppIcon iconName="app-export"></AppIcon>
{{ $t('views.document.setting.export') }} Zip
</el-dropdown-item>
<el-dropdown-item icon="Delete" @click.stop="deleteDocument(row)">{{
$t('common.delete')
}}</el-dropdown-item>
<el-dropdown-item icon="Delete" @click.stop="deleteDocument(row)"
>
{{$t('common.delete')}}
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
@ -505,10 +526,14 @@
</div>
</el-card>
<div class="mul-operation w-full flex" v-if="multipleSelection.length !== 0">
<el-button :disabled="multipleSelection.length === 0" @click="cancelTaskHandle(1, row)">
<el-button :disabled="multipleSelection.length === 0" @click="cancelTaskHandle(1, row)"
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_DOCUMENT_VECTOR.getWorkspacePermission]">
{{ $t('views.document.setting.cancelVectorization') }}
</el-button>
<el-button :disabled="multipleSelection.length === 0" @click="cancelTaskHandle(2, row)">
<el-button :disabled="multipleSelection.length === 0" @click="cancelTaskHandle(2, row)"
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_DOCUMENT_GENERATE.getWorkspacePermission]"
>
{{ $t('views.document.setting.cancelGenerate') }}
</el-button>
<el-text type="info" class="secondary ml-24">
@ -547,6 +572,8 @@ import GenerateRelatedDialog from '@/components/generate-related-dialog/index.vu
import EmbeddingContentDialog from '@/views/document/component/EmbeddingContentDialog.vue'
import { TaskType, State } from '@/utils/status'
import { t } from '@/locales'
import { PermissionConst, RoleConst } from '@/utils/permission/data'
import { hasPermission } from '@/utils/permission/index'
const router = useRouter()
const route = useRoute()

View File

@ -44,7 +44,9 @@
</el-select>
</div>
<el-dropdown trigger="click">
<el-button type="primary" class="ml-8">
<el-button type="primary" class="ml-8"
v-hasPermission="[RoleConst.ADMIN.getWorkspaceRole,PermissionConst.KNOWLEDGE_CREATE.getWorkspacePermission]"
>
{{ $t('common.create') }}
<el-icon class="el-icon--right">
<arrow-down />
@ -215,7 +217,9 @@
<template #mouseEnter>
<div @click.stop>
<el-dropdown trigger="click">
<el-button text @click.stop>
<el-button text @click.stop
v-hasPermission="[RoleConst.ADMIN.getWorkspaceRole,PermissionConst.KNOWLEDGE_EDIT.getWorkspacePermission]"
>
<el-icon>
<MoreFilled />
</el-icon>
@ -293,6 +297,8 @@ import useStore from '@/stores'
import { numberFormat } from '@/utils/common'
import { t } from '@/locales'
import { useRouter } from 'vue-router'
import { PermissionConst, RoleConst } from '@/utils/permission/data'
import { hasPermission } from '@/utils/permission/index'
const router = useRouter()
const { folder } = useStore()

View File

@ -79,6 +79,7 @@
:disabled="!is_permisstion"
text
@click.stop="openEditModel"
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.MODEL_EDIT.getWorkspacePermission]"
>
{{ $t('common.modify') }}
</el-dropdown-item>
@ -93,6 +94,7 @@
:disabled="!is_permisstion"
icon="Setting"
@click.stop="openParamSetting"
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.MODEL_EDIT.getWorkspacePermission]"
>
{{ $t('views.model.modelForm.title.paramSetting') }}
</el-dropdown-item>
@ -102,6 +104,7 @@
:disabled="!is_permisstion"
text
@click.stop="deleteModel"
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.MODEL_DELETE.getWorkspacePermission]"
>
{{ $t('common.delete') }}
</el-dropdown-item>
@ -124,6 +127,9 @@ import {modelType} from '@/enums/model'
import useStore from '@/stores'
import ParamSettingDialog from './ParamSettingDialog.vue'
import {t} from '@/locales'
import { PermissionConst, EditionConst, RoleConst } from '@/utils/permission/data'
import { hasPermission } from '@/utils/permission/index'
import { ComplexPermission } from '@/utils/permission/type'
const props = defineProps<{
model: Model

View File

@ -55,9 +55,11 @@
</template>
</el-select>
</div>
<el-button class="ml-16" type="primary" @click="openCreateModel(active_provider)">
{{ $t('views.model.addModel') }}</el-button
<el-button class="ml-16" type="primary" @click="openCreateModel(active_provider)"
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.MODEL_CREATE.getWorkspacePermission]"
>
{{ $t('views.model.addModel') }}
</el-button>
</div>
</template>
@ -116,6 +118,8 @@ import SharedWorkspace from '@/views/shared/model-shared/SharedWorkspace.vue'
import SelectProviderDialog from '@/views/model/component/SelectProviderDialog.vue'
import useStore from '@/stores'
import { t } from '@/locales'
import { PermissionConst, RoleConst } from '@/utils/permission/data'
import { hasPermission } from '@/utils/permission/index'
const { model } = useStore()

View File

@ -7,13 +7,16 @@
<div class="flex-between">
<div>
<el-button type="primary" @click="createProblem"
>{{ $t('views.problem.createProblem') }}
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_PROBLEM_CREATE.getWorkspacePermission]">
{{ $t('views.problem.createProblem') }}
</el-button>
<el-button @click="relateProblem()" :disabled="multipleSelection.length === 0"
>{{ $t('views.problem.relateParagraph.title') }}
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_PROBLEM_RELATE.getWorkspacePermission]">
{{ $t('views.problem.relateParagraph.title') }}
</el-button>
<el-button @click="deleteMulDocument" :disabled="multipleSelection.length === 0"
>{{ $t('views.problem.setting.batchDelete') }}
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_PROBLEM_DELETE.getWorkspacePermission]">
{{ $t('views.problem.setting.batchDelete') }}
</el-button>
</div>
@ -99,14 +102,16 @@
:content="$t('views.problem.relateParagraph.title')"
placement="top"
>
<el-button type="primary" text @click.stop="relateProblem(row)">
<el-button type="primary" text @click.stop="relateProblem(row)"
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_PROBLEM_RELATE.getWorkspacePermission]">
<el-icon><Connection /></el-icon>
</el-button>
</el-tooltip>
</span>
<span>
<el-tooltip effect="dark" :content="$t('common.delete')" placement="top">
<el-button type="primary" text @click.stop="deleteProblem(row)">
<el-button type="primary" text @click.stop="deleteProblem(row)"
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_PROBLEM_DELETE.getWorkspacePermission]">
<el-icon><Delete /></el-icon>
</el-button>
</el-tooltip>
@ -145,6 +150,8 @@ import { MsgSuccess, MsgConfirm, MsgError } from '@/utils/message'
import type { Dict } from '@/api/type/common'
import useStore from '@/stores'
import { t } from '@/locales'
import { PermissionConst, RoleConst } from '@/utils/permission/data'
import { hasPermission } from '@/utils/permission/index'
const route = useRoute()
const {