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 {defineStore} from 'pinia'
import {type Ref} from 'vue' import {type Ref} from 'vue'
import loginApi from '@/api/user/login' 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' import useUserStore from '@/stores/modules/user'
const useLoginStore = defineStore('logi', { const useLoginStore = defineStore('logi', {

View File

@ -1,9 +1,69 @@
import { Permission, Role, Edition } from '@/utils/permission/type' 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 = { const PermissionConst = {
USER_READ: new Permission('USER:READ'), USER_READ: new Permission('USER:READ'),
USER_CREATE: new Permission('USER:CREATE'), USER_CREATE: new Permission('USER:CREATE'),
KNOWLEDGE_READ: new Permission('KNOWLEDGE:READ'),
APPLICATION_OVERVIEW_READ: new Permission('APPLICATION_OVERVIEW_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 = { const RoleConst = {
ADMIN: new Role('ADMIN'), ADMIN: new Role('ADMIN'),

View File

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

View File

@ -44,7 +44,9 @@
</el-select> </el-select>
</div> </div>
<el-dropdown trigger="click"> <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') }} {{ $t('common.create') }}
<el-icon class="el-icon--right"> <el-icon class="el-icon--right">
<arrow-down /> <arrow-down />
@ -215,7 +217,9 @@
<template #mouseEnter> <template #mouseEnter>
<div @click.stop> <div @click.stop>
<el-dropdown trigger="click"> <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> <el-icon>
<MoreFilled /> <MoreFilled />
</el-icon> </el-icon>
@ -293,6 +297,8 @@ import useStore from '@/stores'
import { numberFormat } from '@/utils/common' import { numberFormat } from '@/utils/common'
import { t } from '@/locales' import { t } from '@/locales'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { PermissionConst, RoleConst } from '@/utils/permission/data'
import { hasPermission } from '@/utils/permission/index'
const router = useRouter() const router = useRouter()
const { folder } = useStore() const { folder } = useStore()

View File

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

View File

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

View File

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