feat: share api

This commit is contained in:
wangdan-fit2cloud 2025-07-08 17:10:26 +08:00
parent 521fff2818
commit 92df83771e
10 changed files with 293 additions and 255 deletions

View File

@ -33,6 +33,76 @@ const getKnowledgeListPage: (
) )
} }
/**
*
* @param knowledge_id
*/
const getKnowledgeDetail: (knowledge_id: string, loading?: Ref<boolean>) => Promise<Result<any>> = (
knowledge_id,
loading,
) => {
return get(`${prefix}/${prefix_workspace.value}/knowledge/${knowledge_id}`, undefined, loading)
}
/**
*
* @param knowledge_id,
* param {
"name": "string",
folder_id: "string",
}
*/
const getDocumentPage: (
knowledge_id: string,
page: pageRequest,
param: any,
loading?: Ref<boolean>,
) => Promise<Result<any>> = (knowledge_id, page, param, loading) => {
return get(
`${prefix}/${prefix_workspace.value}/knowledge/${knowledge_id}/document/${page.current_page}/${page.page_size}`,
param,
loading,
)
}
/**
*
* @param knowledge_id
*/
const getDocumentDetail: (
knowledge_id: string,
document_id: string,
loading?: Ref<boolean>,
) => Promise<Result<any>> = (knowledge_id, document_id, loading) => {
return get(`${prefix}/${prefix_workspace.value}/knowledge/${knowledge_id}/document/${document_id}`,
{},
loading,)
}
/**
*
* @param knowledge_id document_id
* param {
"title": "string",
"content": "string",
}
*/
const getParagraphPage: (
knowledge_id: string,
document_id: string,
page: pageRequest,
param: any,
loading?: Ref<boolean>,
) => Promise<Result<any>> = (knowledge_id, document_id, page, param, loading) => {
return get(
`${prefix}/${prefix_workspace.value}/knowledge/${knowledge_id}/document/${document_id}/paragraph/${page.current_page}/${page.page_size}`,
param,
loading,
)
}
const getModelList: ( const getModelList: (
param: any, param: any,
loading?: Ref<boolean>, loading?: Ref<boolean>,
@ -57,6 +127,10 @@ const getToolListPage: (
export default { export default {
getKnowledgeList, getKnowledgeList,
getKnowledgeListPage, getKnowledgeListPage,
getKnowledgeDetail,
getDocumentPage,
getDocumentDetail,
getParagraphPage,
getModelList, getModelList,
getToolList, getToolList,
getToolListPage getToolListPage

View File

@ -1,66 +0,0 @@
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 { knowledgeData } from '@/api/type/knowledge'
import useStore from '@/stores'
const prefix: any = { _value: '/system/shared/knowledge/' }
Object.defineProperty(prefix, 'value', {
get: function () {
const { user } = useStore()
return this._value + user.getWorkspaceId()
},
})
/**
*
* @param
* param {
folder_id: "string",
name: "string",
tool_type: "string",
desc: string,
}
*/
const getKnowledgeList: (param?: any, loading?: Ref<boolean>) => Promise<Result<any>> = (
param,
loading,
) => {
return get(`${prefix.value}`, param, loading)
}
/**
*
* @param
* param {
"folder_id": "string",
"name": "string",
"tool_type": "string",
desc: string,
}
*/
const getKnowledgeListPage: (
page: pageRequest,
param?: any,
loading?: Ref<boolean>,
) => Promise<Result<any>> = (page, param, loading) => {
return get(`${prefix.value}/${page.current_page}/${page.page_size}`, param, loading)
}
/**
*
* @param knowledge_id
*/
const getKnowledgeDetail: (knowledge_id: string, loading?: Ref<boolean>) => Promise<Result<any>> = (
knowledge_id,
loading,
) => {
return get(`${prefix.value}/${knowledge_id}`, undefined, loading)
}
export default {
getKnowledgeList,
getKnowledgeListPage,
getKnowledgeDetail,
}

View File

@ -35,7 +35,8 @@ const route = useRoute()
const { const {
meta: { activeMenu }, meta: { activeMenu },
params: { id }, params: { id, folderId },
query: { isShared },
} = route as any } = route as any
const apiType = computed(() => { const apiType = computed(() => {
@ -48,6 +49,10 @@ const apiType = computed(() => {
} }
}) })
const shareDisabled = computed(() => {
return folderId === 'share' || isShared === 'true'
})
onBeforeRouteLeave((to, from) => { onBeforeRouteLeave((to, from) => {
common.saveBreadcrumb(null) common.saveBreadcrumb(null)
}) })
@ -75,7 +80,7 @@ const toBackPath = computed(() => {
function getKnowledgeDetail() { function getKnowledgeDetail() {
loading.value = true loading.value = true
loadSharedApi({ type: 'knowledge', systemType: apiType.value }) loadSharedApi({ type: 'knowledge', isShared: shareDisabled.value, systemType: apiType.value })
.getKnowledgeDetail(id) .getKnowledgeDetail(id)
.then((res: any) => { .then((res: any) => {
current.value = res.data current.value = res.data

View File

@ -218,6 +218,9 @@ h5 {
.p-8-12 { .p-8-12 {
padding: calc(var(--app-base-px)) calc(var(--app-base-px) + 4px); padding: calc(var(--app-base-px)) calc(var(--app-base-px) + 4px);
} }
.p-8-16 {
padding: calc(var(--app-base-px)) calc(var(--app-base-px) * 2);
}
.p-12-16 { .p-12-16 {
padding: calc(var(--app-base-px) + 4px) calc(var(--app-base-px) * 2); padding: calc(var(--app-base-px) + 4px) calc(var(--app-base-px) * 2);
} }

View File

@ -1066,7 +1066,7 @@ function getList(bool?: boolean) {
} }
function getDetail() { function getDetail() {
loadSharedApi({ type: 'knowledge', systemType: apiType.value }) loadSharedApi({ type: 'knowledge', isShared: isShared.value, systemType: apiType.value })
.getKnowledgeDetail(id, loading) .getKnowledgeDetail(id, loading)
.then((res: any) => { .then((res: any) => {
knowledgeDetail.value = res.data knowledgeDetail.value = res.data

View File

@ -275,7 +275,7 @@ function addParagraph() {
} }
function getDetail() { function getDetail() {
loadSharedApi({ type: 'document', systemType: apiType.value }) loadSharedApi({ type: 'document', isShared: shareDisabled.value, systemType: apiType.value })
.getDocumentDetail(id, documentId, loading) .getDocumentDetail(id, documentId, loading)
.then((res: any) => { .then((res: any) => {
documentDetail.value = res.data documentDetail.value = res.data
@ -283,7 +283,7 @@ function getDetail() {
} }
function getParagraphList() { function getParagraphList() {
loadSharedApi({ type: 'paragraph', systemType: apiType.value }) loadSharedApi({ type: 'paragraph', isShared: shareDisabled.value, systemType: apiType.value })
.getParagraphPage( .getParagraphPage(
id, id,
documentId, documentId,

View File

@ -8,9 +8,9 @@
</el-breadcrumb> </el-breadcrumb>
<el-card style="--el-card-padding: 0"> <el-card style="--el-card-padding: 0">
<div class="flex"> <div class="flex">
<div class="user-left border-r p-16"> <div class="user-left border-r">
<div class="p-8 pb-0 mb-12"> <div class="p-24 pb-0">
<div class="flex-between mb-16"> <div class="flex-between mb-12">
<h4 class="medium">{{ $t('views.chatUser.group.title') }}</h4> <h4 class="medium">{{ $t('views.chatUser.group.title') }}</h4>
<el-tooltip <el-tooltip
effect="dark" effect="dark"
@ -51,81 +51,83 @@
<div class="list-height-left"> <div class="list-height-left">
<el-scrollbar v-loading="loading"> <el-scrollbar v-loading="loading">
<common-list <div class="p-8-16">
:data="filterList" <common-list
@click="clickUserGroup" :data="filterList"
:default-active="current?.id" @click="clickUserGroup"
@mouseenter="mouseenter" :default-active="current?.id"
@mouseleave="mouseId = ''" @mouseenter="mouseenter"
> @mouseleave="mouseId = ''"
<template #default="{ row }"> >
<div class="flex-between"> <template #default="{ row }">
<span class="ellipsis">{{ row.name }}</span> <div class="flex-between">
<div @click.stop v-show="mouseId === row.id"> <span class="ellipsis">{{ row.name }}</span>
<el-dropdown :teleported="false"> <div @click.stop v-show="mouseId === row.id">
<el-button text> <el-dropdown :teleported="false" trigger="click">
<el-icon class="color-secondary"> <el-button text>
<MoreFilled /> <el-icon class="color-secondary">
</el-icon> <MoreFilled />
</el-button> </el-icon>
<template #dropdown> </el-button>
<el-dropdown-menu style="min-width: 80px"> <template #dropdown>
<el-dropdown-item <el-dropdown-menu style="min-width: 80px">
@click.stop="createOrUpdate(row)" <el-dropdown-item
class="p-8" @click.stop="createOrUpdate(row)"
v-if=" class="p-8"
hasPermission( v-if="
new ComplexPermission( hasPermission(
[RoleConst.ADMIN, RoleConst.WORKSPACE_MANAGE], new ComplexPermission(
[ [RoleConst.ADMIN, RoleConst.WORKSPACE_MANAGE],
PermissionConst.WORKSPACE_USER_GROUP_EDIT, [
PermissionConst.USER_GROUP_EDIT, PermissionConst.WORKSPACE_USER_GROUP_EDIT,
], PermissionConst.USER_GROUP_EDIT,
[], ],
[],
'OR',
),
'OR', 'OR',
), )
'OR', "
) >
" <el-icon>
> <EditPen />
<el-icon> </el-icon>
<EditPen /> {{ $t('common.rename') }}
</el-icon> </el-dropdown-item>
{{ $t('common.rename') }} <el-dropdown-item
</el-dropdown-item> @click.stop="deleteGroup(row)"
<el-dropdown-item class="border-t p-8"
@click.stop="deleteGroup(row)" v-if="
class="border-t p-8" hasPermission(
v-if=" new ComplexPermission(
hasPermission( [RoleConst.ADMIN, RoleConst.WORKSPACE_MANAGE],
new ComplexPermission( [
[RoleConst.ADMIN, RoleConst.WORKSPACE_MANAGE], PermissionConst.WORKSPACE_USER_GROUP_DELETE,
[ PermissionConst.USER_GROUP_DELETE,
PermissionConst.WORKSPACE_USER_GROUP_DELETE, ],
PermissionConst.USER_GROUP_DELETE, [],
], 'OR',
[], ),
'OR', 'OR',
), )
'OR', "
) >
" <el-icon>
> <Delete />
<el-icon> </el-icon>
<Delete /> {{ $t('common.delete') }}
</el-icon> </el-dropdown-item>
{{ $t('common.delete') }} </el-dropdown-menu>
</el-dropdown-item> </template>
</el-dropdown-menu> </el-dropdown>
</template> </div>
</el-dropdown>
</div> </div>
</div> </template>
</template> <template #empty>
<template #empty> <span></span>
<span></span> </template>
</template> </common-list>
</common-list> </div>
</el-scrollbar> </el-scrollbar>
</div> </div>
</div> </div>

View File

@ -23,8 +23,8 @@
<el-card style="--el-card-padding: 0"> <el-card style="--el-card-padding: 0">
<div class="flex main-calc-height"> <div class="flex main-calc-height">
<div class="resource-authorization__left border-r p-16"> <div class="resource-authorization__left border-r">
<div class="p-8"> <div class="p-24 pb-0">
<h4 class="mb-12">{{ $t('views.resourceAuthorization.member') }}</h4> <h4 class="mb-12">{{ $t('views.resourceAuthorization.member') }}</h4>
<el-input <el-input
v-model="filterText" v-model="filterText"
@ -35,22 +35,23 @@
</div> </div>
<div class="list-height-left"> <div class="list-height-left">
<el-scrollbar> <el-scrollbar>
<common-list <div class="p-8-16">
:data="filterMember" <common-list
class="mt-8" :data="filterMember"
v-loading="loading" v-loading="loading"
@click="clickMemberHandle" @click="clickMemberHandle"
:default-active="currentUser" :default-active="currentUser"
> >
<template #default="{ row }"> <template #default="{ row }">
<div class="flex-between"> <div class="flex-between">
<div class="flex"> <div class="flex">
<span class="mr-8">{{ row.nick_name }}</span> <span class="mr-8">{{ row.nick_name }}</span>
<TagGroup :tags="row.roles" /> <TagGroup :tags="row.roles" />
</div>
</div> </div>
</div> </template>
</template> </common-list>
</common-list> </div>
</el-scrollbar> </el-scrollbar>
</div> </div>
</div> </div>

View File

@ -26,7 +26,7 @@
@mouseleave="mouseId = ''" @mouseleave="mouseId = ''"
> >
<template #default="{ row }"> <template #default="{ row }">
<span>{{ row.role_name }}</span> <span>{{ row.role_name }}</span>
</template> </template>
<template #empty> <template #empty>
<span></span> <span></span>
@ -49,7 +49,9 @@
[RoleConst.ADMIN], [RoleConst.ADMIN],
[PermissionConst.ROLE_CREATE], [PermissionConst.ROLE_CREATE],
[], [],
'OR',)" 'OR',
)
"
> >
<el-icon :size="18"><Plus /></el-icon> <el-icon :size="18"><Plus /></el-icon>
</el-button> </el-button>
@ -71,7 +73,7 @@
> >
</span> </span>
<div @click.stop v-show="mouseId === row.id"> <div @click.stop v-show="mouseId === row.id">
<el-dropdown :teleported="false"> <el-dropdown :teleported="false" trigger="click">
<el-button text> <el-button text>
<el-icon class="color-secondary"> <el-icon class="color-secondary">
<MoreFilled /> <MoreFilled />
@ -79,26 +81,38 @@
</el-button> </el-button>
<template #dropdown> <template #dropdown>
<el-dropdown-menu style="min-width: 80px"> <el-dropdown-menu style="min-width: 80px">
<el-dropdown-item @click.stop="createOrUpdateRole(row)" class="p-8" <el-dropdown-item
v-if="hasPermission( @click.stop="createOrUpdateRole(row)"
new ComplexPermission( class="p-8"
[RoleConst.ADMIN], v-if="
[PermissionConst.ROLE_EDIT], hasPermission(
[],'OR' new ComplexPermission(
),'OR' [RoleConst.ADMIN],
)" [PermissionConst.ROLE_EDIT],
[],
'OR',
),
'OR',
)
"
> >
<el-icon><EditPen /></el-icon> <el-icon><EditPen /></el-icon>
{{ $t('common.rename') }} {{ $t('common.rename') }}
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item @click.stop="deleteRole(row)" class="border-t p-8" <el-dropdown-item
v-if="hasPermission( @click.stop="deleteRole(row)"
new ComplexPermission( class="border-t p-8"
[RoleConst.ADMIN], v-if="
[PermissionConst.ROLE_DELETE], hasPermission(
[],'OR' new ComplexPermission(
),'OR' [RoleConst.ADMIN],
)" [PermissionConst.ROLE_DELETE],
[],
'OR',
),
'OR',
)
"
> >
<el-icon><Delete /></el-icon> <el-icon><Delete /></el-icon>
{{ $t('common.delete') }} {{ $t('common.delete') }}
@ -202,7 +216,7 @@ async function refresh(role?: RoleItem) {
if (role) { if (role) {
currentRole.value = role currentRole.value = role
} else { } else {
currentRole.value = customRoleList.value.find(item => item.id === currentRole.value?.id) currentRole.value = customRoleList.value.find((item) => item.id === currentRole.value?.id)
} }
} }
@ -238,12 +252,14 @@ function deleteRole(item: RoleItem) {
}, },
) )
.then(() => { .then(() => {
loadPermissionApi('role').deleteRole(item.id, loading).then(async () => { loadPermissionApi('role')
MsgSuccess(t('common.deleteSuccess')) .deleteRole(item.id, loading)
await getRole() .then(async () => {
currentRole.value = MsgSuccess(t('common.deleteSuccess'))
item.id === currentRole.value?.id ? internalRoleList.value[0] : currentRole.value await getRole()
}) currentRole.value =
item.id === currentRole.value?.id ? internalRoleList.value[0] : currentRole.value
})
}) })
.catch(() => {}) .catch(() => {})
} }
@ -285,4 +301,3 @@ function mouseenter(row: any) {
} }
} }
</style> </style>

View File

@ -3,8 +3,8 @@
<h2 class="mb-16">{{ $t('views.workspace.title') }}</h2> <h2 class="mb-16">{{ $t('views.workspace.title') }}</h2>
<el-card style="--el-card-padding: 0"> <el-card style="--el-card-padding: 0">
<div class="flex main-calc-height"> <div class="flex main-calc-height">
<div class="workspace-left border-r p-16"> <div class="workspace-left border-r">
<div class="p-8 pb-0 mt-8 mb-12"> <div class="p-24 pb-0">
<div class="flex-between mb-12"> <div class="flex-between mb-12">
<h4 class="medium">{{ $t('views.workspace.list') }}</h4> <h4 class="medium">{{ $t('views.workspace.list') }}</h4>
<el-tooltip <el-tooltip
@ -31,62 +31,64 @@
</div> </div>
<div class="list-height-left"> <div class="list-height-left">
<el-scrollbar v-loading="loading"> <el-scrollbar v-loading="loading">
<common-list <div class="p-8-16">
:data="filterList" <common-list
@click="clickWorkspace" :data="filterList"
:default-active="currentWorkspace?.id" @click="clickWorkspace"
@mouseenter="mouseenter" :default-active="currentWorkspace?.id"
@mouseleave="mouseId = ''" @mouseenter="mouseenter"
> @mouseleave="mouseId = ''"
<template #default="{ row }"> >
<div class="flex-between"> <template #default="{ row }">
<span class="ellipsis">{{ row.name }}</span> <div class="flex-between">
<div @click.stop v-show="mouseId === row.id"> <span class="ellipsis">{{ row.name }}</span>
<el-dropdown :teleported="false"> <div @click.stop v-show="mouseId === row.id">
<el-button text> <el-dropdown :teleported="false" trigger="click">
<el-icon class="color-secondary"> <el-button text>
<MoreFilled /> <el-icon class="color-secondary">
</el-icon> <MoreFilled />
</el-button> </el-icon>
<template #dropdown> </el-button>
<el-dropdown-menu style="min-width: 80px"> <template #dropdown>
<el-dropdown-item <el-dropdown-menu style="min-width: 80px">
@click.stop="createOrUpdateWorkspace(row)" <el-dropdown-item
class="p-8" @click.stop="createOrUpdateWorkspace(row)"
v-if=" class="p-8"
hasPermission( v-if="
[RoleConst.ADMIN, PermissionConst.WORKSPACE_EDIT], hasPermission(
'OR', [RoleConst.ADMIN, PermissionConst.WORKSPACE_EDIT],
) 'OR',
" )
> "
<el-icon><EditPen /></el-icon> >
{{ $t('common.rename') }} <el-icon><EditPen /></el-icon>
</el-dropdown-item> {{ $t('common.rename') }}
<el-dropdown-item </el-dropdown-item>
@click.stop="deleteWorkspace(row)" <el-dropdown-item
class="border-t p-8" @click.stop="deleteWorkspace(row)"
v-if=" class="border-t p-8"
row.id !== 'default' && v-if="
hasPermission( row.id !== 'default' &&
[RoleConst.ADMIN, PermissionConst.WORKSPACE_DELETE], hasPermission(
'OR', [RoleConst.ADMIN, PermissionConst.WORKSPACE_DELETE],
) 'OR',
" )
> "
<el-icon><Delete /></el-icon> >
{{ $t('common.delete') }} <el-icon><Delete /></el-icon>
</el-dropdown-item> {{ $t('common.delete') }}
</el-dropdown-menu> </el-dropdown-item>
</template> </el-dropdown-menu>
</el-dropdown> </template>
</el-dropdown>
</div>
</div> </div>
</div> </template>
</template> <template #empty>
<template #empty> <span></span>
<span></span> </template>
</template> </common-list>
</common-list> </div>
</el-scrollbar> </el-scrollbar>
</div> </div>
</div> </div>
@ -119,7 +121,7 @@ import type { WorkspaceItem } from '@/api/type/workspace'
import { MsgSuccess, MsgConfirm } from '@/utils/message' import { MsgSuccess, MsgConfirm } from '@/utils/message'
import { PermissionConst, RoleConst } from '@/utils/permission/data' import { PermissionConst, RoleConst } from '@/utils/permission/data'
import { hasPermission } from '@/utils/permission/index' import { hasPermission } from '@/utils/permission/index'
import {loadPermissionApi} from "@/utils/dynamics-api/permission-api.ts"; import { loadPermissionApi } from '@/utils/dynamics-api/permission-api.ts'
const filterText = ref('') const filterText = ref('')
const loading = ref(false) const loading = ref(false)
@ -148,7 +150,7 @@ async function refresh(workspace?: WorkspaceItem) {
if (workspace) { if (workspace) {
currentWorkspace.value = workspace currentWorkspace.value = workspace
} else { } else {
currentWorkspace.value = list.value.find(item => item.id === currentWorkspace.value?.id) currentWorkspace.value = list.value.find((item) => item.id === currentWorkspace.value?.id)
} }
} }
@ -194,12 +196,14 @@ async function deleteWorkspace(item: WorkspaceItem) {
confirmButtonClass: 'danger', confirmButtonClass: 'danger',
}, },
).then(() => { ).then(() => {
loadPermissionApi('workspace').deleteWorkspace(item.id as string, loading).then(async () => { loadPermissionApi('workspace')
MsgSuccess(t('common.deleteSuccess')) .deleteWorkspace(item.id as string, loading)
await getWorkspace() .then(async () => {
currentWorkspace.value = MsgSuccess(t('common.deleteSuccess'))
item.id === currentWorkspace.value?.id ? list.value[0] : currentWorkspace.value await getWorkspace()
}) currentWorkspace.value =
item.id === currentWorkspace.value?.id ? list.value[0] : currentWorkspace.value
})
}) })
} else { } else {
MsgConfirm( MsgConfirm(