feat: shared workspace

This commit is contained in:
wangdan-fit2cloud 2025-06-21 03:14:59 +08:00
parent 9c73c8dea0
commit 190d25857f
35 changed files with 223 additions and 263 deletions

View File

@ -1,7 +1,6 @@
import { Result } from '@/request/Result'
import { get, post, del, put } from '@/request/index'
import { type Ref } from 'vue'
import type { pageRequest } from '@/api/type/common'
import useStore from '@/stores'
const prefix: any = { _value: '/workspace/' }

View File

@ -9,7 +9,6 @@ import type {
} from '@/api/type/model'
import type { FormField } from '@/components/dynamics-form/type'
import useStore from '@/stores'
const prefix: any = { _value: '/workspace/' }
Object.defineProperty(prefix, 'value', {
@ -24,7 +23,7 @@ Object.defineProperty(prefix, 'value', {
* @params name, model_type, model_name
*/
const getModel: (
request?: ListModelRequest,
data?: ListModelRequest,
loading?: Ref<boolean>,
) => Promise<Result<Array<Model>>> = (data, loading) => {
return get(`${prefix.value}`, data, loading)

View File

@ -15,13 +15,13 @@ Object.defineProperty(prefix_workspace, 'value', {
},
})
const getSharedWorkspaceKnowledge: (loading?: Ref<boolean>) => Promise<Result<Array<any>>> = (
const getKnowledgeList: (loading?: Ref<boolean>) => Promise<Result<Array<any>>> = (
loading,
) => {
return get(`${prefix}/${prefix_workspace.value}/knowledge`, {}, loading)
}
const getSharedWorkspaceKnowledgePage: (
const getKnowledgeListPage: (
page: pageRequest,
param: any,
loading?: Ref<boolean>,
@ -33,46 +33,31 @@ const getSharedWorkspaceKnowledgePage: (
)
}
const getSharedWorkspaceModel: (loading?: Ref<boolean>) => Promise<Result<Array<any>>> = (
loading,
) => {
return get(`${prefix}/${prefix_workspace.value}/model`, {}, loading)
}
const getCESharedWorkspaceModel: (loading?: Ref<boolean>) => Promise<Result<Array<any>>> = (
loading,
) => {
return get(`/${prefix_workspace.value}/model`, {}, loading)
}
const getSharedWorkspaceModelPage: (
const getModel: (
param: any,
loading?: Ref<boolean>,
) => Promise<Result<Array<any>>> = (param: any, loading) => {
console.log(`${prefix}/${prefix_workspace.value}/model`)
return get(`${prefix}/${prefix_workspace.value}/model`, param, loading)
}
const getSharedWorkspaceTool: (loading?: Ref<boolean>) => Promise<Result<Array<any>>> = (
const getToolList: (loading?: Ref<boolean>) => Promise<Result<Array<any>>> = (
loading,
) => {
return get(`${prefix}/${prefix_workspace.value}/tool`, {}, loading)
}
const getSharedWorkspaceToolPage: (
param: any,
const getToolListPage: (
page: pageRequest,
param?: any,
loading?: Ref<boolean>,
) => Promise<Result<Array<any>>> = (param: any, loading) => {
return get(`${prefix}/${prefix_workspace.value}/tool`, param, loading)
) => Promise<Result<any>> = (page, param, loading) => {
return get(`${prefix}/${prefix_workspace.value}/tool/${page.current_page}/${page.page_size}`, param, loading)
}
export default {
getSharedWorkspaceKnowledge,
getSharedWorkspaceKnowledgePage,
getSharedWorkspaceModel,
getSharedWorkspaceModelPage,
getSharedWorkspaceTool,
getSharedWorkspaceToolPage,
getCESharedWorkspaceModel
getKnowledgeList,
getKnowledgeListPage,
getModel,
getToolList,
getToolListPage
}

View File

@ -1,86 +0,0 @@
import {Result} from '@/request/Result'
import {get, post} from '@/request/index'
import type {Ref} from 'vue'
import type {Provider, BaseModel} from '@/api/type/model'
import type {FormField} from '@/components/dynamics-form/type'
import type {KeyValue} from '../type/common'
const prefix_provider = '/provider'
/**
*
*/
const getProvider: (loading?: Ref<boolean>) => Promise<Result<Array<Provider>>> = (loading) => {
return get(`${prefix_provider}`, {}, loading)
}
/**
*
*/
const getProviderByModelType: (
model_type: string,
loading?: Ref<boolean>,
) => Promise<Result<Array<Provider>>> = (model_type, loading) => {
return get(`${prefix_provider}`, {model_type}, loading)
}
/**
*
* @param provider
* @param model_type
* @param model_name
* @param loading
* @returns
*/
const getModelCreateForm: (
provider: string,
model_type: string,
model_name: string,
loading?: Ref<boolean>,
) => Promise<Result<Array<FormField>>> = (provider, model_type, model_name, loading) => {
return get(`${prefix_provider}/model_form`, {provider, model_type, model_name}, loading)
}
/**
*
* @param provider
* @param loading
* @returns
*/
const listModelType: (
provider: string,
loading?: Ref<boolean>,
) => Promise<Result<Array<KeyValue<string, string>>>> = (provider, loading?: Ref<boolean>) => {
return get(`${prefix_provider}/model_type_list`, {provider}, loading)
}
/**
*
* @param provider
* @param model_type
* @param loading
* @returns
*/
const listBaseModel: (
provider: string,
model_type: string,
loading?: Ref<boolean>,
) => Promise<Result<Array<BaseModel>>> = (provider, model_type, loading) => {
return get(`${prefix_provider}/model_list`, {provider, model_type}, loading)
}
const listBaseModelParamsForm: (
provider: string,
model_type: string,
model_name: string,
loading?: Ref<boolean>,
) => Promise<Result<Array<BaseModel>>> = (provider, model_type, model_name, loading) => {
return get(`${prefix_provider}/model_params_form`, {provider, model_type, model_name}, loading)
}
export default {
getProvider,
getModelCreateForm,
getProviderByModelType,
listModelType,
listBaseModel,
listBaseModelParamsForm,
}

View File

@ -2,8 +2,6 @@ import { Result } from '@/request/Result'
import { get, put, post, del } from '@/request/index'
import type { pageRequest } from '@/api/type/common'
import type { Ref } from 'vue'
import useStore from '@/stores'
const prefix = '/workspace'
/**

View File

@ -17,10 +17,10 @@
</div>
</slot>
<slot name="subTitle"> </slot>
<div class="shared" v-if="isShared">{{t('views.system.shared')}}</div>
</div>
<div class="status-tag">
<slot name="tag"> </slot>
<slot name="tag"> <!-- 放标签 --> </slot>
</div>
</div>
</slot>
@ -61,9 +61,8 @@ const props = withDefaults(
* 是否展示icon
*/
showIcon?: boolean
isShared?: boolean
}>(),
{ title: t('common.title'), description: '', showIcon: true, border: true, isShared: false },
{ title: t('common.title'), description: '', showIcon: true, border: true },
)
const show = ref(false)
@ -104,28 +103,6 @@ function subHoveredEnter() {
}
}
.shared {
position: absolute;
right: 20px;
top: 17px;
font-weight: 400;
font-size: 12px;
line-height: 20px;
color: #646a73;
&::after {
content: '';
background-color: #1f23291a;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 32px;
height: 20px;
border-radius: 4px;
}
}
.card-footer {
position: absolute;
bottom: 8px;

View File

@ -9,7 +9,7 @@
/>
<div
@click="handleSharedNodeClick"
v-if="!!shareTitle"
v-if="showShared && hasPermission(EditionConst.IS_EE, 'OR')"
class="shared-knowledge"
:class="currentNodeKey === 'share' && 'active'"
>
@ -83,6 +83,8 @@ import type { TreeInstance } from 'element-plus'
import CreateFolderDialog from '@/components/folder-tree/CreateFolderDialog.vue'
import { t } from '@/locales'
import folderApi from '@/api/folder'
import { EditionConst } from '@/utils/permission/data'
import { hasPermission } from '@/utils/permission/index'
defineOptions({ name: 'FolderTree' })
const props = defineProps({
data: {
@ -97,7 +99,7 @@ const props = defineProps({
type: String,
default: 'APPLICATION',
},
isShared: {
showShared: {
type: Boolean,
default: false,
},

View File

@ -47,7 +47,7 @@
import { ref } from 'vue'
import type { ResetCurrentUserPasswordRequest } from '@/api/type/user'
import type { FormInstance, FormRules } from 'element-plus'
import UserApi from '@/api/user/user-manage'
import UserApi from '@/api/system/user-manage'
import useStore from '@/stores'
import { useRouter } from 'vue-router'
import { t } from '@/locales'

View File

@ -4,9 +4,11 @@
border-radius: var(--el-border-radius-base);
.el-select__wrapper {
box-shadow: none !important;
border-radius: var(--el-border-radius-base) 0 0 var(--el-border-radius-base);
}
.el-input__wrapper {
box-shadow: none !important;
border-radius: 0 var(--el-border-radius-base) var(--el-border-radius-base) 0;
}
&__left {
border-right: 1px solid var(--el-border-color);

View File

@ -28,3 +28,4 @@ export function loadPermissionApi(type: string) {
}
}
}

View File

@ -0,0 +1,24 @@
import knowledgeWorkspaceApi from '@/api/knowledge/knowledge'
import modelWorkspaceApi from '@/api/model/model'
import toolWorkspaceApi from '@/api/tool/tool'
import sharedWorkspaceApi from '@/api/shared-workspace'
// 普通 API
const workspaceApiMap = {
knowledge: knowledgeWorkspaceApi,
model: modelWorkspaceApi,
tool: toolWorkspaceApi,
} as any
/** API
* loadSharedApi('knowledge', true)
*/
export function loadSharedApi(type: string, isShared?: boolean) {
if (isShared) {
// 共享 API
return sharedWorkspaceApi
} else {
return workspaceApiMap[type]
}
}

View File

@ -4,10 +4,15 @@
<h3>
{{ $t('common.setting') }}
</h3>
<el-button type="primary" @click="submit(applicationFormRef)" :disabled="loading"
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
RoleConst.USER.getWorkspaceRole,
PermissionConst.APPLICATION_OVERVIEW_PUBLIC.getWorkspacePermission]"
<el-button
type="primary"
@click="submit(applicationFormRef)"
:disabled="loading"
v-hasPermission="[
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
RoleConst.USER.getWorkspaceRole,
PermissionConst.APPLICATION_OVERVIEW_PUBLIC.getWorkspacePermission,
]"
>
{{ $t('views.application.buttons.publish') }}
</el-button>
@ -635,7 +640,7 @@ function getDetail() {
}
function getKnowledge() {
knowledge.asyncGetFolderKnowledge(knowledgeLoading).then((res: any) => {
knowledge.asyncGetFolderKnowledge('', knowledgeLoading).then((res: any) => {
knowledgeList.value = res.data
})
}

View File

@ -44,6 +44,7 @@
class="p-8"
v-loading="folderLoading"
:canOperation="false"
showShared
/>
</template>
<el-scrollbar>
@ -51,7 +52,7 @@
<el-row :gutter="12" v-loading="loading">
<el-col
:span="12"
v-for="(item, index) in filterData.filter((v:any) => v.resource_type !== 'folder')"
v-for="(item, index) in filterData.filter((v: any) => v.resource_type !== 'folder')"
:key="index"
class="mb-16"
>
@ -104,7 +105,7 @@ const props = defineProps({
})
const emit = defineEmits(['addData', 'refresh'])
const { folder, user,knowledge } = useStore()
const { folder, user, knowledge } = useStore()
const dialogVisible = ref<boolean>(false)
const checkList = ref([])
@ -192,10 +193,8 @@ function getFolder() {
}
function getList() {
const params = {
folder_id: currentFolder.value?.id || user.getWorkspaceId(),
}
knowledge.asyncGetFolderKnowledge(params, loading).then((res) => {
const folder_id = currentFolder.value?.id || user.getWorkspaceId()
knowledge.asyncGetFolderKnowledge(folder_id, loading).then((res: any) => {
searchDate.value = res.data
})
}

View File

@ -61,7 +61,7 @@ import type { ResetPasswordRequest } from '@/api/type/user'
import { useRouter, useRoute } from 'vue-router'
import { MsgSuccess } from '@/utils/message'
import type { FormInstance, FormRules } from 'element-plus'
import UserApi from '@/api/user/user-manage'
import UserApi from '@/api/system/user-manage'
import { t } from '@/locales'
const router = useRouter()
const route = useRoute()

View File

@ -8,12 +8,11 @@
:currentNodeKey="currentFolder?.id"
@handleNodeClick="folderClickHandel"
class="p-8"
isShared
showShared
@refreshTree="refreshFolder"
/>
</template>
<SharedWorkspace v-if="currentFolder.id === 'share'"></SharedWorkspace>
<ContentContainer v-else :header="currentFolder?.name">
<ContentContainer :header="currentFolder?.name">
<template #search>
<div class="flex">
<div class="flex-between complex-search">
@ -45,7 +44,7 @@
<el-option v-for="u in user_options" :key="u.id" :value="u.id" :label="u.username" />
</el-select>
</div>
<el-dropdown trigger="click">
<el-dropdown trigger="click" v-if="!isShared">
<el-button
type="primary"
class="ml-8"
@ -193,7 +192,6 @@
<CardBox
:title="item.name"
:description="item.desc"
:isShared="currentFolder.id === 'share'"
class="cursor"
@click="
router.push({ path: `/knowledge/${item.id}/${currentFolder.id}/document` })
@ -207,7 +205,11 @@
{{ $t('common.creator') }}: {{ item.nick_name }}
</el-text>
</template>
<template #tag>
<el-tag v-if="isShared" type="info" class="info-tag">
{{ t('views.system.shared') }}
</el-tag>
</template>
<template #footer>
<div class="footer-content flex-between">
<div>
@ -227,7 +229,7 @@
</div>
</template>
<template #mouseEnter>
<div @click.stop>
<div @click.stop v-if="!isShared">
<el-dropdown trigger="click">
<el-button text @click.stop>
<el-icon>
@ -338,7 +340,7 @@
<el-dropdown-item
icon="Delete"
type="danger"
@click.stop="deleteKnowledge(item)"
@click.stop="deleteKnowledge(item)"
v-if="
hasPermission(
[
@ -367,15 +369,15 @@
</div>
</ContentContainer>
<component :is="currentCreateDialog" ref="CreateKnowledgeDialogRef" />
<CreateFolderDialog ref="CreateFolderDialogRef" @refresh="refreshFolder" />
<component :is="currentCreateDialog" ref="CreateKnowledgeDialogRef" v-if="!isShared" />
<CreateFolderDialog ref="CreateFolderDialogRef" @refresh="refreshFolder" v-if="!isShared" />
<GenerateRelatedDialog ref="GenerateRelatedDialogRef" />
<SyncWebDialog ref="SyncWebDialogRef" />
<SyncWebDialog ref="SyncWebDialogRef" v-if="!isShared" />
</LayoutContainer>
</template>
<script lang="ts" setup>
import { onMounted, ref, reactive, shallowRef, nextTick } from 'vue'
import { onMounted, ref, reactive, shallowRef, nextTick, computed } from 'vue'
import CreateKnowledgeDialog from './create-component/CreateKnowledgeDialog.vue'
import CreateWebKnowledgeDialog from './create-component/CreateWebKnowledgeDialog.vue'
import CreateLarkKnowledgeDialog from './create-component/CreateLarkKnowledgeDialog.vue'
@ -383,7 +385,6 @@ import SyncWebDialog from './component/SyncWebDialog.vue'
import CreateFolderDialog from '@/components/folder-tree/CreateFolderDialog.vue'
import GenerateRelatedDialog from '@/components/generate-related-dialog/index.vue'
import KnowledgeApi from '@/api/knowledge/knowledge'
import SharedWorkspace from '@/views/shared/knowledge-shared/SharedWorkspace.vue'
import { MsgSuccess, MsgConfirm } from '@/utils/message'
import useStore from '@/stores'
import { numberFormat } from '@/utils/common'
@ -392,6 +393,7 @@ import { useRouter } from 'vue-router'
import { FolderSource } from '@/enums/common'
import { PermissionConst, RoleConst } from '@/utils/permission/data'
import { hasPermission } from '@/utils/permission/index'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
const router = useRouter()
const { folder, user } = useStore()
@ -419,6 +421,9 @@ const currentFolder = ref<any>({})
const CreateKnowledgeDialogRef = ref()
const currentCreateDialog = shallowRef<any>(null)
const isShared = computed(() => {
return currentFolder.value.id === 'share'
})
function openCreateDialog(data: any) {
currentCreateDialog.value = data
nextTick(() => {
@ -463,10 +468,12 @@ function getList() {
[search_type.value]: search_form.value[search_type.value],
}
KnowledgeApi.getKnowledgeListPage(paginationConfig, params, loading).then((res) => {
paginationConfig.total = res.data.total
knowledgeList.value = [...knowledgeList.value, ...res.data.records]
})
loadSharedApi('knowledge', isShared.value)
.getKnowledgeListPage(paginationConfig, params, loading)
.then((res: any) => {
paginationConfig.total = res.data.total
knowledgeList.value = [...knowledgeList.value, ...res.data.records]
})
}
function clickFolder(item: any) {
@ -531,11 +538,9 @@ function getFolder(bool?: boolean) {
function folderClickHandel(row: any) {
currentFolder.value = row
knowledgeList.value = []
if (currentFolder.value.id === 'share') return
getList()
}
function refreshFolder() {
console.log(currentFolder.value)
knowledgeList.value = []
getFolder()
}

View File

@ -75,7 +75,7 @@ import LoginLayout from '@/layout/login-layout/LoginLayout.vue'
import type { CheckCodeRequest } from '@/api/type/user'
import { useRouter } from 'vue-router'
import type { FormInstance, FormRules } from 'element-plus'
import UserApi from '@/api/user/user-manage'
import UserApi from '@/api/system/user-manage'
import { MsgSuccess } from '@/utils/message'
import { t } from '@/locales'
import useStore from '@/stores'

View File

@ -61,7 +61,7 @@ import type { ResetPasswordRequest } from '@/api/type/user'
import { useRouter, useRoute } from 'vue-router'
import { MsgSuccess } from '@/utils/message'
import type { FormInstance, FormRules } from 'element-plus'
import UserApi from '@/api/user/user-manage'
import UserApi from '@/api/system/user-manage'
import { t } from '@/locales'
const router = useRouter()
const route = useRoute()

View File

@ -8,7 +8,7 @@
{{ model.name }}
<span v-if="currentModel.status === 'ERROR'">
<el-tooltip effect="dark" :content="errMessage" placement="top">
<el-icon class="danger ml-4" size="18"><Warning/></el-icon>
<el-icon class="danger ml-4" size="18"><Warning /></el-icon>
</el-tooltip>
</span>
<span v-if="currentModel.status === 'PAUSE_DOWNLOAD'">
@ -17,7 +17,7 @@
:content="`${$t('views.model.modelForm.base_model.label')}: ${props.model.model_name} ${$t('views.model.tip.downloadError')}`"
placement="top"
>
<el-icon class="danger ml-4" size="18"><Warning/></el-icon>
<el-icon class="danger ml-4" size="18"><Warning /></el-icon>
</el-tooltip>
</span>
</div>
@ -27,20 +27,23 @@
{{ $t('common.creator') }}: {{ model.username }}
</el-text>
</template>
<template #tag>
<el-tag v-if="isShared" type="info" class="info-tag">
{{ t('views.system.shared') }}
</el-tag>
</template>
<ul>
<li class="flex mb-4">
<el-text type="info" class="color-secondary">{{
$t('views.model.modelForm.model_type.label')
}}
<el-text type="info" class="color-secondary"
>{{ $t('views.model.modelForm.model_type.label') }}
</el-text>
<span class="ellipsis ml-16">
{{ $t(modelType[model.model_type as keyof typeof modelType]) }}</span
>
</li>
<li class="flex">
<el-text type="info" class="color-secondary">{{
$t('views.model.modelForm.base_model.label')
}}
<el-text type="info" class="color-secondary"
>{{ $t('views.model.modelForm.base_model.label') }}
</el-text>
<span class="ellipsis-1 ml-16" style="height: 20px; width: 70%">
{{ model.model_name }}</span
@ -59,25 +62,31 @@
class="ml-16"
:disabled="!is_permisstion"
@click.stop="cancelDownload"
>{{ $t('views.model.download.cancelDownload') }}
</el-button
>
>{{ $t('views.model.download.cancelDownload') }}
</el-button>
</div>
</div>
<template #mouseEnter>
<el-dropdown trigger="click">
<el-dropdown trigger="click" v-if="!isShared">
<el-button text @click.stop>
<el-icon>
<MoreFilled/>
<MoreFilled />
</el-icon>
</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item
v-if="hasPermission([RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
RoleConst.USER.getWorkspaceRole,
PermissionConst.MODEL_EDIT.getWorkspacePermission],'OR')"
v-if="
hasPermission(
[
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
RoleConst.USER.getWorkspaceRole,
PermissionConst.MODEL_EDIT.getWorkspacePermission,
],
'OR',
)
"
icon="EditPen"
:disabled="!is_permisstion"
text
@ -92,9 +101,14 @@
currentModel.model_type === 'LLM' ||
currentModel.model_type === 'IMAGE' ||
currentModel.model_type === 'TTI' ||
hasPermission([RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
RoleConst.USER.getWorkspaceRole,
PermissionConst.MODEL_EDIT.getWorkspacePermission],'OR')
hasPermission(
[
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
RoleConst.USER.getWorkspaceRole,
PermissionConst.MODEL_EDIT.getWorkspacePermission,
],
'OR',
)
"
:disabled="!is_permisstion"
icon="Setting"
@ -108,9 +122,16 @@
:disabled="!is_permisstion"
text
@click.stop="deleteModel"
v-if="hasPermission([RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
RoleConst.USER.getWorkspaceRole,
PermissionConst.MODEL_DELETE.getWorkspacePermission],'OR')"
v-if="
hasPermission(
[
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
RoleConst.USER.getWorkspaceRole,
PermissionConst.MODEL_DELETE.getWorkspacePermission,
],
'OR',
)
"
>
{{ $t('common.delete') }}
</el-dropdown-item>
@ -119,20 +140,20 @@
</el-dropdown>
</template>
<EditModel ref="editModelRef" @submit="emit('change')"></EditModel>
<ParamSettingDialog ref="paramSettingRef" :model="model"/>
<ParamSettingDialog ref="paramSettingRef" :model="model" />
</card-box>
</template>
<script setup lang="ts">
import type {Provider, Model} from '@/api/type/model'
import type { Provider, Model } from '@/api/type/model'
import ModelApi from '@/api/model/model'
import {computed, ref, onMounted, onBeforeUnmount} from 'vue'
import { computed, ref, onMounted, onBeforeUnmount } from 'vue'
import EditModel from '@/views/model/component/EditModel.vue'
// import DownloadLoading from '@/components/loading/DownloadLoading.vue'
import {MsgConfirm} from '@/utils/message'
import {modelType} from '@/enums/model'
import { MsgConfirm } from '@/utils/message'
import { modelType } from '@/enums/model'
import useStore from '@/stores'
import ParamSettingDialog from './ParamSettingDialog.vue'
import {t} from '@/locales'
import { t } from '@/locales'
import { PermissionConst, RoleConst } from '@/utils/permission/data'
import { hasPermission } from '@/utils/permission'
@ -140,9 +161,10 @@ const props = defineProps<{
model: Model
provider_list: Array<Provider>
updateModelById: (model_id: string, model: Model) => void
isShared?: boolean | undefined
}>()
const {user} = useStore()
const { user } = useStore()
const downModel = ref<Model>()
const is_permisstion = computed(() => {
@ -182,8 +204,7 @@ const deleteModel = () => {
emit('change')
})
})
.catch(() => {
})
.catch(() => {})
}
const cancelDownload = () => {

View File

@ -4,9 +4,9 @@
<div class="p-8">
<div
@click="handleSharedNodeClick"
class="shared-knowledge"
v-if="isShared"
:class="currentNodeKey === 'share' && 'active'"
class="shared-model"
v-if="isShared && hasPermission(EditionConst.IS_EE, 'OR')"
:class="active?.provider === 'share' && 'active'"
>
<AppIcon iconName="app-folder-share-active" style="font-size: 18px"></AppIcon>
<span class="ml-8 lighter">{{ $t('views.system.share_model') }}</span>
@ -102,6 +102,9 @@
import { watch, ref } from 'vue'
import type { Provider, Model } from '@/api/type/model'
import { modelTypeList, allObj } from '@/views/model/component/data'
import { EditionConst } from '@/utils/permission/data'
import { hasPermission } from '@/utils/permission/index'
import { t } from '@/locales'
const props = defineProps<{
data: Array<Provider>
loading: boolean
@ -142,7 +145,7 @@ const clickListHandle = (item: Provider) => {
}
const handleSharedNodeClick = () => {
emit('click', { id: 'share' })
emit('click', { provider: 'share', name: t('views.system.share_model') })
}
</script>
<style lang="scss" scoped>
@ -188,7 +191,7 @@ const handleSharedNodeClick = () => {
padding-bottom: 0 !important;
}
}
.shared-knowledge {
.shared-model {
padding-left: 8px;
display: flex;
align-items: center;

View File

@ -11,8 +11,7 @@
:active="active_provider"
/>
</template>
<SharedWorkspace v-if="active_provider && active_provider.id === 'share'"></SharedWorkspace>
<ContentContainer v-else :header="active_provider?.name" v-loading="list_model_loading">
<ContentContainer :header="active_provider?.name" v-loading="list_model_loading">
<template #search>
<div class="flex">
<div class="flex-between complex-search">
@ -55,13 +54,19 @@
</template>
</el-select>
</div>
<el-button class="ml-16" type="primary" @click="openCreateModel(active_provider)"
v-hasPermission="[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
RoleConst.USER.getWorkspaceRole,
PermissionConst.MODEL_CREATE.getWorkspacePermission]"
<el-button
v-if="!isShared"
class="ml-16"
type="primary"
@click="openCreateModel(active_provider)"
v-hasPermission="[
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
RoleConst.USER.getWorkspaceRole,
PermissionConst.MODEL_CREATE.getWorkspacePermission,
]"
>
{{ $t('views.model.addModel') }}
</el-button>
</el-button>
</div>
</template>
@ -84,6 +89,7 @@
:updateModelById="updateModelById"
:model="model"
:provider_list="provider_list"
:isShared="isShared"
>
</ModelCard>
</el-col>
@ -98,11 +104,13 @@
ref="createModelRef"
@submit="list_model"
@change="openCreateModel($event)"
v-if="!isShared"
></CreateModelDialog>
<SelectProviderDialog
ref="selectProviderRef"
@change="(provider, modelType) => openCreateModel(provider, modelType)"
v-if="!isShared"
></SelectProviderDialog>
</LayoutContainer>
</template>
@ -116,13 +124,10 @@ import ProviderComponent from '@/views/model/component/Provider.vue'
import { splitArray } from '@/utils/common'
import { modelTypeList, allObj } from '@/views/model/component/data'
import CreateModelDialog from '@/views/model/component/CreateModelDialog.vue'
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'
const { model } = useStore()
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
const commonList1 = ref()
const commonList2 = ref()
@ -145,6 +150,9 @@ const provider_list = ref<Array<Provider>>([])
const model_list = ref<Array<Model>>([])
const isShared = computed(() => {
return active_provider.value && active_provider.value.provider === 'share'
})
const updateModelById = (model_id: string, model: Model) => {
model_list.value
.filter((m) => m.id == model_id)
@ -177,8 +185,8 @@ const openCreateModel = (provider?: Provider, model_type?: string) => {
const list_model = () => {
const params = active_provider.value?.provider ? { provider: active_provider.value.provider } : {}
model
.asyncGetModel( { ...model_search_form.value, ...params }, list_model_loading)
loadSharedApi('model', isShared.value)
.getModel({ ...model_search_form.value, ...params }, list_model_loading)
.then((ok: any) => {
model_list.value = ok.data
const v = model_list.value.map((m) => ({ id: m.user_id, username: m.username }))

View File

@ -135,7 +135,6 @@ const defaultProps = {
}
const loadTree = (node: any, resolve: any) => {
console.log(node)
if (node.isLeaf) return resolve([])
const folder_id = node.level === 0 ? '' : node.data.id
knowledge.asyncGetFolderKnowledge(folder_id, optionLoading).then((res: any) => {

View File

@ -86,7 +86,7 @@
<script lang="ts" setup>
import { onMounted, ref, reactive, watch, computed } from 'vue'
import AuthorizationApi from '@/api/user/resource-authorization'
import AuthorizationApi from '@/api/system/resource-authorization'
import PermissionSetting from './component/PermissionSetting.vue'
import { MsgSuccess, MsgConfirm } from '@/utils/message'
import { AuthorizationEnum } from '@/enums/system'

View File

@ -32,7 +32,7 @@ import { t } from '@/locales'
import type { RoleItem } from '@/api/type/role'
import { MsgSuccess } from '@/utils/message'
import { RoleTypeEnum } from '@/enums/system'
import { loadPermissionApi } from '@/utils/permission-api'
import { loadPermissionApi } from '@/utils/dynamics-api/permission-api'
const props = defineProps<{
currentRole?: RoleItem

View File

@ -67,7 +67,7 @@ import { MsgSuccess, MsgConfirm } from '@/utils/message'
import { t } from '@/locales'
import AddMemberDrawer from './AddMemberDrawer.vue'
import { RoleTypeEnum } from '@/enums/system'
import { loadPermissionApi } from '@/utils/permission-api'
import { loadPermissionApi } from '@/utils/dynamics-api/permission-api'
import { PermissionConst, RoleConst } from '@/utils/permission/data'
import { ComplexPermission } from '@/utils/permission/type'
const props = defineProps<{

View File

@ -162,7 +162,7 @@ import type { RoleItem } from '@/api/type/role'
import { RoleTypeEnum } from '@/enums/system'
import { roleTypeMap } from './index'
import { MsgSuccess, MsgConfirm } from '@/utils/message'
import { loadPermissionApi } from '@/utils/permission-api'
import { loadPermissionApi } from '@/utils/dynamics-api/permission-api'
import { PermissionConst, RoleConst } from '@/utils/permission/data'
import { ComplexPermission } from '@/utils/permission/type'

View File

@ -134,11 +134,10 @@ import CreateWebKnowledgeDialog from './create-component/CreateWebKnowledgeDialo
import CreateFolderDialog from '@/components/folder-tree/CreateFolderDialog.vue'
import GenerateRelatedDialog from '@/components/generate-related-shared-dialog/index.vue'
import KnowledgeApi from '@/api/shared/knowledge'
import KnowledgeWorkspaceApi from '@/api/shared/workspace'
import KnowledgeWorkspaceApi from '@/api/shared-workspace'
import { MsgSuccess, MsgConfirm } from '@/utils/message'
import useStore from '@/stores/modules-shared-system'
import { numberFormat } from '@/utils/common'
import iconMap from '@/components/app-icon/icons/common'
import { t } from '@/locales'
import { useRouter } from 'vue-router'
import AuthorizedWorkspace from '@/views/shared/AuthorizedWorkspaceDialog.vue'
@ -147,7 +146,6 @@ const router = useRouter()
const { folder } = useStore()
const loading = ref(false)
const rightOutlined = iconMap['right-outlined'].iconReader()
const search_type = ref('name')
const search_form = ref<any>({

View File

@ -105,7 +105,7 @@
import { onMounted, ref, computed } from 'vue'
import ProviderApi from '@/api/shared/provider'
import ModelApi from '@/api/shared/model'
import ModelWorkspaceApi from '@/api/shared/workspace'
import ModelWorkspaceApi from '@/api/shared-workspace'
import type { Provider, Model } from '@/api/type/model'
import ModelCard from '@/views/shared/model-shared/component/ModelCardSharedWorkspace.vue'
import ProviderComponent from '@/views/shared/model-shared/component/Provider.vue'

View File

@ -119,7 +119,7 @@
import { onMounted, ref, reactive, computed } from 'vue'
import { cloneDeep, get } from 'lodash'
import ToolApi from '@/api/shared/tool'
import ToolWorkspaceApi from '@/api/shared/workspace'
import ToolWorkspaceApi from '@/api/shared-workspace'
import useStore from '@/stores/modules-shared-system'
import InitParamDrawer from '@/views/shared/tool-shared/component/InitParamDrawer.vue'
import ToolFormDrawer from './ToolFormDrawer.vue'

View File

@ -52,7 +52,7 @@
import { ref, reactive, watch } from 'vue'
import type { FormInstance } from 'element-plus'
import chatUserApi from '@/api/system/chat-user'
import userManageApi from '@/api/user/user-manage'
import userManageApi from '@/api/system/user-manage'
import { MsgSuccess } from '@/utils/message'
import { t } from '@/locales'
import type { ListItem } from '@/api/type/common'

View File

@ -7,16 +7,25 @@
:data="folderList"
:currentNodeKey="currentFolder?.id"
@handleNodeClick="folderClickHandel"
@refreshTree ="refreshFolder"
:shareTitle="hasPermission(new ComplexPermission(
[RoleConst.ADMIN],[PermissionConst.SHARED_TOOL_READ],[EditionConst.IS_EE],'OR'
), 'OR')?'views.system.share_tool':null"
isShared
@refreshTree="refreshFolder"
:shareTitle="
hasPermission(
new ComplexPermission(
[RoleConst.ADMIN],
[PermissionConst.SHARED_TOOL_READ],
[EditionConst.IS_EE],
'OR',
),
'OR',
)
? 'views.system.share_tool'
: null
"
showShared
class="p-8"
/>
</template>
<SharedWorkspace v-if="currentFolder.id === 'share'"></SharedWorkspace>
<ContentContainer v-else :header="currentFolder?.name">
<ContentContainer :header="currentFolder?.name">
<template #search>
<div class="flex">
<div class="flex-between complex-search">
@ -48,7 +57,7 @@
<el-option v-for="u in user_options" :key="u.id" :value="u.id" :label="u.username" />
</el-select>
</div>
<el-dropdown trigger="click">
<el-dropdown trigger="click" v-if="!isShared">
<el-button
type="primary"
class="ml-8"
@ -104,7 +113,9 @@
<img src="@/assets/node/icon_tool.svg" style="width: 58%" alt="" />
</el-avatar>
<div class="pre-wrap ml-8">
<div class="lighter">{{ $t('views.tool.toolStore.createFromToolStore') }}</div>
<div class="lighter">
{{ $t('views.tool.toolStore.createFromToolStore') }}
</div>
</div>
</div>
</el-dropdown-item> -->
@ -186,6 +197,11 @@
{{ $t('common.creator') }}: {{ item.nick_name }}
</el-text>
</template>
<template #tag>
<el-tag v-if="isShared" type="info" class="info-tag">
{{ t('views.system.shared') }}
</el-tag>
</template>
<template #footer>
<div v-if="item.is_active" class="flex align-center">
@ -204,7 +220,7 @@
</div>
</template>
<template #mouseEnter>
<div @click.stop>
<div @click.stop v-if="!isShared">
<el-switch
v-model="item.is_active"
:before-change="() => changeState(item)"
@ -318,7 +334,7 @@
</ContentContainer>
<InitParamDrawer ref="InitParamDrawerRef" @refresh="refresh" />
<ToolFormDrawer ref="ToolFormDrawerRef" @refresh="refresh" :title="ToolDrawertitle" />
<CreateFolderDialog ref="CreateFolderDialogRef" @refresh="refreshFolder" />
<CreateFolderDialog ref="CreateFolderDialogRef" @refresh="refreshFolder" v-if="!isShared" />
<ToolStoreDialog ref="toolStoreDialogRef" @refresh="refresh" />
</LayoutContainer>
</template>
@ -334,12 +350,12 @@ import CreateFolderDialog from '@/components/folder-tree/CreateFolderDialog.vue'
import { t } from '@/locales'
import { isAppIcon } from '@/utils/common'
import { MsgSuccess, MsgConfirm, MsgError } from '@/utils/message'
import SharedWorkspace from '@/views/shared/tool-shared/SharedWorkspace.vue'
import { EditionConst, PermissionConst, RoleConst } from '@/utils/permission/data'
import { hasPermission } from '@/utils/permission/index'
import { FolderSource } from '@/enums/common'
import { ComplexPermission } from '@/utils/permission/type'
import ToolStoreDialog from './component/ToolStoreDialog.vue'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
const { folder, user } = useStore()
@ -366,6 +382,10 @@ const folderList = ref<any[]>([])
const toolList = ref<any[]>([])
const currentFolder = ref<any>({})
const isShared = computed(() => {
return currentFolder.value.id === 'share'
})
const search_type_change = () => {
search_form.value = { name: '', create_user: '' }
}
@ -392,10 +412,12 @@ function getList() {
folder_id: currentFolder.value?.id || user.getWorkspaceId(),
scope: 'WORKSPACE',
}
ToolApi.getToolListPage(paginationConfig, params, loading).then((res) => {
paginationConfig.total = res.data?.total
toolList.value = [...toolList.value, ...res.data?.records]
})
loadSharedApi('tool', isShared.value)
.getToolListPage(paginationConfig, params, loading)
.then((res: any) => {
paginationConfig.total = res.data?.total
toolList.value = [...toolList.value, ...res.data?.records]
})
}
function clickFolder(item: any) {
@ -565,7 +587,6 @@ function folderClickHandel(row: any) {
getList()
}
onMounted(() => {
getFolder(true)
})

View File

@ -69,7 +69,7 @@
<script setup lang="ts">
import {ref, reactive, watch, onBeforeMount} from 'vue'
import type {FormInstance} from 'element-plus'
import userManageApi from '@/api/user/user-manage'
import userManageApi from '@/api/system/user-manage'
import {MsgSuccess} from '@/utils/message'
import {t} from '@/locales'
import type {FormItemModel} from '@/api/type/role'

View File

@ -44,7 +44,7 @@ import { ref, reactive, watch } from 'vue'
import useStore from '@/stores'
import type { FormInstance, FormRules } from 'element-plus'
import type { ResetPasswordRequest } from '@/api/type/user'
import userManageApi from '@/api/user/user-manage'
import userManageApi from '@/api/system/user-manage'
import { MsgSuccess } from '@/utils/message'
import { t } from '@/locales'
const emit = defineEmits(['refresh'])

View File

@ -143,7 +143,7 @@
import { onMounted, ref, reactive, watch } from 'vue'
import UserDrawer from './component/UserDrawer.vue'
import UserPwdDialog from './component/UserPwdDialog.vue'
import userManageApi from '@/api/user/user-manage'
import userManageApi from '@/api/system/user-manage'
import { datetimeFormat } from '@/utils/time'
import { MsgSuccess, MsgConfirm } from '@/utils/message'
import { t } from '@/locales'

View File

@ -190,7 +190,7 @@ function getknowledge() {
// knowledgeList.value = res.data
// })
// } else {
knowledge.asyncGetFolderKnowledge(knowledgeLoading).then((res: any) => {
knowledge.asyncGetFolderKnowledge('',knowledgeLoading).then((res: any) => {
knowledgeList.value = res.data?.filter((v: any) => v.user_id === user.userInfo?.id)
})
// }