feat: knowledge resource management and model resource management

This commit is contained in:
wangdan-fit2cloud 2025-07-29 18:34:52 +08:00
parent 5022b2a872
commit 03fbba0952
28 changed files with 395 additions and 83 deletions

View File

@ -3,7 +3,6 @@ import {get, post, postStream, del, put, request, download, exportFile} from '@/
import type {pageRequest} from '@/api/type/common'
import type {ApplicationFormType} from '@/api/type/application'
import {type Ref} from 'vue'
import useStore from '@/stores'
const prefix = '/system/resource/application'

View File

@ -30,9 +30,10 @@ const getModelListPage: (
*/
const getSelectModelList: (
data?: ListModelRequest,
workspace_id?: string,
loading?: Ref<boolean>,
) => Promise<Result<Array<Model>>> = (data, loading) => {
return get(`${prefix}/model_list`, data, loading).then((ok) => {
) => Promise<Result<Array<Model>>> = (data, workspace_id, loading) => {
return get(`${prefix}/workspace/${workspace_id}/model/model_list`, data, loading).then((ok) => {
return {
...ok,
data: [

View File

@ -288,4 +288,5 @@ export default {
putBatchGenerateRelated,
putMigrateMulParagraph,
putDisassociationProblem,
putAdjustPosition,
}

View File

@ -288,4 +288,5 @@ export default {
putBatchGenerateRelated,
putMigrateMulParagraph,
putDisassociationProblem,
putAdjustPosition,
}

View File

@ -40,4 +40,24 @@ export default {
])
},
},
'app-admin-operation': {
iconReader: () => {
return h('i', [
h(
'svg',
{
viewBox: '0 0 1024 1024',
version: '1.1',
xmlns: 'http://www.w3.org/2000/svg',
},
[
h('path', {
d: 'M805.290667 298.666667a170.752 170.752 0 0 1-330.581334 0H112.682667c-9.514667 0-12.970667-1.024-16.426667-2.858667a19.370667 19.370667 0 0 1-8.106667-8.106667C86.357333 284.330667 85.333333 280.832 85.333333 271.36V240.64c0-9.472 0.981333-12.928 2.858667-16.426667a19.370667 19.370667 0 0 1 8.064-8.064C99.712 214.314667 103.168 213.333333 112.64 213.333333h362.026667a170.752 170.752 0 0 1 330.581333 0h106.026667c9.514667 0 12.970667 0.981333 16.426666 2.816a19.370667 19.370667 0 0 1 8.106667 8.106667c1.834667 3.413333 2.816 6.912 2.816 16.384v30.677333c0 9.472-0.981333 12.928-2.858667 16.426667a19.370667 19.370667 0 0 1-8.064 8.064c-3.456 1.834667-6.912 2.858667-16.426666 2.858667h-106.026667zM640 341.333333a85.333333 85.333333 0 1 0 0-170.666666 85.333333 85.333333 0 0 0 0 170.666666zM549.290667 810.666667a170.752 170.752 0 0 1-330.581334 0H112.682667c-9.514667 0-12.970667-1.024-16.426667-2.858667a19.370667 19.370667 0 0 1-8.106667-8.106667c-1.834667-3.413333-2.816-6.912-2.816-16.384v-30.677333c0-9.472 0.981333-12.928 2.858667-16.426667a19.370667 19.370667 0 0 1 8.064-8.064c3.456-1.834667 6.912-2.816 16.426667-2.816h106.026666a170.752 170.752 0 0 1 330.581334 0h362.026666c9.514667 0 12.970667 0.981333 16.426667 2.816a19.370667 19.370667 0 0 1 8.106667 8.106667c1.834667 3.413333 2.816 6.912 2.816 16.384v30.634667c0 9.514667-0.981333 12.970667-2.858667 16.469333a19.370667 19.370667 0 0 1-8.064 8.064c-3.456 1.834667-6.912 2.858667-16.426667 2.858667h-362.026666zM384 853.333333a85.333333 85.333333 0 1 0 0-170.666666 85.333333 85.333333 0 0 0 0 170.666666z',
fill: 'currentColor',
}),
],
),
])
},
},
}

View File

@ -77,6 +77,7 @@ import { groupBy } from 'lodash'
import { MsgSuccess } from '@/utils/message'
import { t } from '@/locales'
import type { FormInstance } from 'element-plus'
import modelResourceApi from '@/api/system-resource-management/model'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
const props = defineProps<{
@ -104,7 +105,7 @@ const stateMap = {
error: ['0', '1', '3', '4', '5', 'n'],
}
const FormRef = ref()
const knowledgeId = ref<string>()
const currentKnowledge = ref<any>(null)
const userId = user.userInfo?.id as string
const form = ref(prompt.get(userId))
const rules = reactive({
@ -131,8 +132,8 @@ watch(dialogVisible, (bool) => {
}
})
const open = (ids: string[], type: string, _knowledgeId?: string) => {
knowledgeId.value = _knowledgeId
const open = (ids: string[], type: string, _knowledge?: any) => {
currentKnowledge.value = _knowledge
getModelFn()
idList.value = ids
apiSubmitType.value = type
@ -178,7 +179,7 @@ const submitHandle = async (formEl: FormInstance) => {
state_list: stateMap[state.value],
}
loadSharedApi({ type: 'knowledge', systemType: props.apiType })
.putGenerateRelated(id ? id : knowledgeId.value, data, loading)
.putGenerateRelated(id ? id : currentKnowledge.value?.id, data, loading)
.then(() => {
MsgSuccess(t('views.document.generateQuestion.successMessage'))
dialogVisible.value = false
@ -190,15 +191,27 @@ const submitHandle = async (formEl: FormInstance) => {
function getModelFn() {
loading.value = true
loadSharedApi({ type: 'model', systemType: props.apiType })
.getSelectModelList({ model_type: 'LLM' })
.then((res: any) => {
modelOptions.value = groupBy(res?.data, 'provider')
loading.value = false
})
.catch(() => {
loading.value = false
})
if (props.apiType === 'systemManage') {
modelResourceApi
.getSelectModelList({ model_type: 'LLM' }, currentKnowledge.value?.workspace_id)
.then((res: any) => {
modelOptions.value = groupBy(res?.data, 'provider')
loading.value = false
})
.catch(() => {
loading.value = false
})
} else {
loadSharedApi({ type: 'model', systemType: props.apiType })
.getSelectModelList({ model_type: 'LLM' })
.then((res: any) => {
modelOptions.value = groupBy(res?.data, 'provider')
loading.value = false
})
.catch(() => {
loading.value = false
})
}
}
defineExpose({ open, dialogVisible })

View File

@ -36,13 +36,13 @@ const route = useRoute()
const {
meta: { activeMenu },
params: { id, folderId },
query: { isShared },
query: { isShared, type },
} = route as any
const apiType = computed(() => {
if (route.path.includes('shared')) {
return 'systemShare'
} else if (route.path.includes('resource-management')) {
} else if (route.path.includes('resource-management') || type === 'systemManage') {
return 'systemManage'
} else {
return 'workspace'
@ -71,7 +71,7 @@ const isKnowledge = computed(() => {
const toBackPath = computed(() => {
if (route.path.includes('shared')) {
return '/system/shared' + activeMenu
} else if (route.path.includes('resource-management')) {
} else if (route.path.includes('resource-management') || type === 'systemManage') {
return '/system/resource-management' + activeMenu
} else {
return activeMenu

View File

@ -36,7 +36,7 @@ const {
query: { type },
} = route as any
const isShared = computed(() => {
return folderId === 'shared' || type === 'systemShare'
return folderId === 'shared' || type === 'systemShare' || type === 'systemManage'
})
const { theme, user } = useStore()
const isDefaultTheme = computed(() => {

View File

@ -15,7 +15,7 @@ const {
query: { type },
} = route as any
const isShared = computed(() => {
return folderId === 'shared' || type === 'systemShare'
return folderId === 'shared' || type === 'systemShare' || type === 'systemManage'
})
</script>

View File

@ -114,7 +114,7 @@ export default {
member: 'Member',
permissionSetting: 'Permission Setting',
setting: {
management: ' management',
management: 'management',
check: 'check',
authorization: 'authorization',
},
@ -126,5 +126,6 @@ export default {
resource_management: {
label: 'Resource Management',
type: 'Type',
management: 'management',
},
}

View File

@ -126,5 +126,6 @@ export default {
resource_management: {
label: '资源管理',
type: '类型',
management: '管理',
},
}

View File

@ -125,6 +125,7 @@ export default {
},
resource_management: {
label: '資源管理',
type: '类型',
type: '類型',
management: '管理',
},
}

View File

@ -34,7 +34,7 @@ const ModelRouter = {
hidden: true,
},
{
path: '/knowledge/import',
path: '/knowledge/import/:folderId',
name: 'ImportLarkDocument',
meta: { activeMenu: '/knowledge' },
component: () => import('@/views/document/ImportLarkDocument.vue'),

View File

@ -16,6 +16,11 @@ import chatUserSystemShareApi from '@/api/system-shared/chat-user'
import workspaceApi from '@/api/workspace/workspace'
import systemUserApi from '@/api/user/user'
import ToolResourceApi from '@/api/system-resource-management/tool'
import knowledgeResourceApi from '@/api/system-resource-management/knowledge'
import documentResourceApi from '@/api/system-resource-management/document'
import paragraphResourceApi from '@/api/system-resource-management/paragraph'
import problemResourceApi from '@/api/system-resource-management/problem'
import modelResourceApi from '@/api/system-resource-management/model'
// 普通 API
const workspaceApiMap = {
@ -43,8 +48,11 @@ const systemShareApiMap = {
// 资源管理 API
const systemManageApiMap = {
// knowledge: knowledgeWorkspaceApi,
// model: modelWorkspaceApi,
knowledge: knowledgeResourceApi,
document: documentResourceApi,
paragraph: paragraphResourceApi,
problem: problemResourceApi,
model: modelResourceApi,
tool: ToolResourceApi,
} as any
@ -52,7 +60,7 @@ const data = {
systemShare: systemShareApiMap,
workspace: workspaceApiMap,
systemManage: systemManageApiMap,
workspaceShare: workspaceApiMap
workspaceShare: workspaceApiMap,
}
/** API
* loadSharedApi('knowledge', true,'systemShare')

View File

@ -219,7 +219,7 @@ const submit = async (formEl: FormInstance | undefined) => {
...{
source_url: form.value.source_url,
selector: form.value.selector,
}
},
},
}
loadSharedApi({ type: 'document', systemType: apiType.value })

View File

@ -29,7 +29,7 @@
type="primary"
@click="
router.push({
path: `/knowledge/import`,
path: `/knowledge/import/${folderId}`,
query: {
id: id,
folder_token: knowledgeDetail?.meta.folder_token,
@ -56,9 +56,7 @@
v-if="permissionPrecise.doc_migrate(id)"
>{{ $t('views.document.setting.migration') }}
</el-button>
<el-dropdown
v-if="MoreFilledPermission0(id)"
>
<el-dropdown v-if="MoreFilledPermission0(id)">
<el-button class="ml-12 mr-12">
<el-icon><MoreFilled /></el-icon>
</el-button>
@ -422,9 +420,7 @@
</span>
</el-tooltip>
<span @click.stop>
<el-dropdown trigger="click"
v-if="MoreFilledPermission1(id)"
>
<el-dropdown trigger="click" v-if="MoreFilledPermission1(id)">
<el-button text type="primary">
<el-icon><MoreFilled /></el-icon>
</el-button>
@ -535,9 +531,7 @@
</span>
</el-tooltip>
<span @click.stop>
<el-dropdown trigger="click"
v-if="MoreFilledPermission2(id)"
>
<el-dropdown trigger="click" v-if="MoreFilledPermission2(id)">
<el-button text type="primary">
<el-icon><MoreFilled /></el-icon>
</el-button>
@ -704,22 +698,32 @@ const permissionPrecise = computed(() => {
})
const MoreFilledPermission0 = (id: string) => {
return permissionPrecise.value.doc_edit(id) ||
(knowledgeDetail?.value.type === 1 && permissionPrecise.value.doc_sync(id)) ||
(knowledgeDetail?.value.type === 2 && permissionPrecise.value.doc_sync(id)) ||
permissionPrecise.value.doc_delete(id)
return (
permissionPrecise.value.doc_edit(id) ||
(knowledgeDetail?.value.type === 1 && permissionPrecise.value.doc_sync(id)) ||
(knowledgeDetail?.value.type === 2 && permissionPrecise.value.doc_sync(id)) ||
permissionPrecise.value.doc_delete(id)
)
}
const MoreFilledPermission1 = (id: string) => {
return permissionPrecise.value.doc_generate(id) || permissionPrecise.value.doc_migrate(id) ||
permissionPrecise.value.doc_export(id) || permissionPrecise.value.doc_download(id) ||
permissionPrecise.value.doc_delete(id)
return (
permissionPrecise.value.doc_generate(id) ||
permissionPrecise.value.doc_migrate(id) ||
permissionPrecise.value.doc_export(id) ||
permissionPrecise.value.doc_download(id) ||
permissionPrecise.value.doc_delete(id)
)
}
const MoreFilledPermission2 = (id: string) => {
return permissionPrecise.value.doc_edit(id) || permissionPrecise.value.doc_generate(id) ||
permissionPrecise.value.doc_migrate(id) || permissionPrecise.value.doc_export(id) ||
permissionPrecise.value.doc_delete(id)
return (
permissionPrecise.value.doc_edit(id) ||
permissionPrecise.value.doc_generate(id) ||
permissionPrecise.value.doc_migrate(id) ||
permissionPrecise.value.doc_export(id) ||
permissionPrecise.value.doc_delete(id)
)
}
const getTaskState = (status: string, taskType: number) => {

View File

@ -17,12 +17,19 @@
</template>
<template #extra>
<el-button
v-if="apiType === 'workspace'"
@click="
router.push({
path: `/knowledge`,
query: {
type: apiType,
},
})
"
>{{ $t('views.knowledge.ResultSuccess.buttons.toknowledge') }}</el-button
>
<el-button
v-else
@click="
router.push({
path: `/system/${folderId}/knowledge`,
})
"
>{{ $t('views.knowledge.ResultSuccess.buttons.toknowledge') }}</el-button

View File

@ -131,7 +131,7 @@ const documentsFiles = computed(() => knowledge.documentsFiles)
const splitPatternList = ref<Array<KeyValue<string, string>>>([])
const route = useRoute()
const {
query: { id }, // idknowledgeID
query: { id}, // idknowledgeID
} = route as any
const apiType = computed(() => {

View File

@ -307,7 +307,7 @@ const onExceed = () => {
MsgError(
t('views.document.tip.fileLimitCountTip1') +
file_count_limit.value +
t('views.document.tip.fileLimitCountTip2')
t('views.document.tip.fileLimitCountTip2'),
)
}

View File

@ -192,12 +192,13 @@ import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
const route = useRoute()
const {
params: { id, folderId },
query: { type },
} = route as any
const apiType = computed(() => {
if (route.path.includes('shared')) {
return 'systemShare'
} else if (route.path.includes('resource-management')) {
} else if (route.path.includes('resource-management') || type === 'systemManage') {
return 'systemManage'
} else {
return 'workspace'

View File

@ -377,8 +377,8 @@ const isSystemShare = computed(() => {
const MoreFilledPermission = (item: any) => {
return (item.type === 1 && permissionPrecise.value.sync(item.id)) ||
permissionPrecise.value.vector(item.id) || permissionPrecise.value.generate(item.id) ||
(permissionPrecise.value.edit(item.id) && apiType.value) === 'workspace' ||
permissionPrecise.value.vector(item.id) || permissionPrecise.value.generate(item.id) ||
(permissionPrecise.value.edit(item.id) && apiType.value) === 'workspace' ||
permissionPrecise.value.export(item.id) || permissionPrecise.value.delete(item.id) || isSystemShare.value
}
@ -446,7 +446,7 @@ const search_type_change = () => {
const GenerateRelatedDialogRef = ref<InstanceType<typeof GenerateRelatedDialog>>()
function openGenerateDialog(row: any) {
if (GenerateRelatedDialogRef.value) {
GenerateRelatedDialogRef.value.open([], 'knowledge', row.id)
GenerateRelatedDialogRef.value.open([], 'knowledge', row)
}
}

View File

@ -42,10 +42,13 @@ import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
import { t } from '@/locales'
const route = useRoute()
const {
query: { type },
} = route
const apiType = computed(() => {
if (route.path.includes('shared')) {
return 'systemShare'
} else if (route.path.includes('resource-management')) {
} else if (route.path.includes('resource-management') || type === 'systemManage') {
return 'systemManage'
} else {
return 'workspace'

View File

@ -128,7 +128,6 @@ import type { FormField } from '@/components/dynamics-form/type'
import DynamicsForm from '@/components/dynamics-form/index.vue'
import type { FormRules } from 'element-plus'
import { MsgSuccess } from '@/utils/message'
import { PermissionType, PermissionDesc } from '@/enums/model'
import { t } from '@/locales'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'

View File

@ -64,9 +64,7 @@
</div>
</div>
<template #mouseEnter
v-if="MoreFilledPermission(model.id)"
>
<template #mouseEnter v-if="MoreFilledPermission(model.id)">
<el-dropdown trigger="click" v-if="!isShared">
<el-button text @click.stop>
<el-icon>
@ -117,7 +115,7 @@
</el-dropdown>
</template>
<EditModel ref="editModelRef" @submit="emit('change')"></EditModel>
<ParamSettingDialog ref="paramSettingRef" :model="model" />
<ParamSettingDialog ref="paramSettingRef" />
<AuthorizedWorkspace
ref="AuthorizedWorkspaceDialogRef"
v-if="isSystemShare"
@ -152,7 +150,7 @@ const props = defineProps<{
const apiType = props.apiType
const isSystemShare = computed(() => {
return apiType==='systemShare'
return apiType === 'systemShare'
})
const permissionPrecise = computed(() => {
@ -160,8 +158,9 @@ const permissionPrecise = computed(() => {
})
const MoreFilledPermission = (id: any) => {
return permissionPrecise.value.modify(id) ||
permissionPrecise.value.delete(id) || isSystemShare.value
return (
permissionPrecise.value.modify(id) || permissionPrecise.value.delete(id) || isSystemShare.value
)
}
const downModel = ref<Model>()
@ -255,7 +254,7 @@ const closeInterval = () => {
const paramSettingRef = ref<InstanceType<typeof ParamSettingDialog>>()
const openParamSetting = () => {
paramSettingRef.value?.open()
paramSettingRef.value?.open(props.model)
}
const AuthorizedWorkspaceDialogRef = ref()

View File

@ -89,9 +89,6 @@ import { MsgError, MsgSuccess } from '@/utils/message'
import { input_type_list } from '@/components/dynamics-form/constructor/data'
import { t } from '@/locales'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
const props = defineProps<{
model: Model
}>()
const route = useRoute()
@ -108,12 +105,14 @@ const loading = ref<boolean>(false)
const dialogVisible = ref<boolean>(false)
const modelParamsForm = ref<any[]>([])
const AddParamRef = ref()
const currentModel = ref<Model | null>(null)
const open = () => {
const open = (model: Model) => {
currentModel.value = model
dialogVisible.value = true
loading.value = true
loadSharedApi({ type: 'model', systemType: apiType.value })
.getModelParamsForm(props.model.id, loading)
.getModelParamsForm(model.id, loading)
.then((ok: any) => {
loading.value = false
modelParamsForm.value = ok.data
@ -164,8 +163,11 @@ function refresh(data: any, index: any) {
}
function submit() {
if (!currentModel.value) {
return
}
loadSharedApi({ type: 'model', systemType: apiType.value })
.updateModelParamsForm(props.model.id, modelParamsForm.value, loading)
.updateModelParamsForm(currentModel.value.id, modelParamsForm.value, loading)
.then((ok: any) => {
MsgSuccess(t('views.model.tip.saveSuccessMessage'))
close()

View File

@ -30,7 +30,10 @@
:content="$t('views.problem.setting.cancelRelated')"
placement="top"
>
<el-button type="primary" text @click.stop="disassociation(item)"
<el-button
type="primary"
text
@click.stop="disassociation(item)"
v-if="permissionPrecise.doc_edit(id as string)"
>
<AppIcon iconName="app-quxiaoguanlian"></AppIcon>
@ -67,9 +70,7 @@
</div>
<template #footer>
<div>
<el-button @click="relateProblem"
v-if="permissionPrecise.doc_edit(id as string)"
>{{
<el-button @click="relateProblem" v-if="permissionPrecise.doc_edit(id as string)">{{
$t('views.problem.relateParagraph.title')
}}</el-button>
<el-button @click="pre" :disabled="pre_disable || loading">{{

View File

@ -51,7 +51,7 @@
<el-table-column width="220" :label="$t('common.name')" show-overflow-tooltip>
<template #default="{ row }">
<div class="flex align-center">
<KnowledgeIcon :type="row.type" />
<KnowledgeIcon :type="row.type" :size="24" />
<span class="ml-8">
{{ row.name }}
</span>
@ -139,22 +139,131 @@
{{ datetimeFormat(row.create_time) }}
</template>
</el-table-column>
<el-table-column :label="$t('common.operation')" align="left" width="120" fixed="right">
<template #default="{ row }">
<el-tooltip
effect="dark"
:content="$t('views.system.resource_management.management')"
placement="top"
>
<span class="mr-8">
<el-button
type="primary"
text
:title="$t('views.system.resource_management.management')"
@click="
router.push({
path: `/knowledge/${row.id}/resource-management/document`,
})
"
>
<AppIcon iconName="app-admin-operation"></AppIcon>
</el-button>
</span>
</el-tooltip>
<el-tooltip
effect="dark"
:content="$t('views.knowledge.setting.vectorization')"
placement="top"
>
<span class="mr-8">
<el-button
type="primary"
text
:title="$t('views.knowledge.setting.vectorization')"
@click.stop="reEmbeddingKnowledge(row)"
v-if="permissionPrecise.vector(row.id)"
>
<AppIcon iconName="app-vectorization"></AppIcon>
</el-button>
</span>
</el-tooltip>
<el-dropdown trigger="click">
<el-button text @click.stop>
<el-icon>
<MoreFilled />
</el-icon>
</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item
icon="Refresh"
@click.stop="syncKnowledge(row)"
v-if="row.type === 1 && permissionPrecise.sync(row.id)"
>{{ $t('views.knowledge.setting.sync') }}
</el-dropdown-item>
<el-dropdown-item
icon="Connection"
@click.stop="openGenerateDialog(row)"
v-if="permissionPrecise.generate(row.id)"
>{{ $t('views.document.generateQuestion.title') }}
</el-dropdown-item>
<el-dropdown-item
icon="Setting"
@click="
router.push({
path: `/knowledge/${row.id}/resource-management/setting`,
})
"
v-if="permissionPrecise.edit(row.id)"
>
{{ $t('common.setting') }}
</el-dropdown-item>
<el-dropdown-item
@click.stop="exportKnowledge(row)"
v-if="permissionPrecise.export(row.id)"
>
<AppIcon iconName="app-export"></AppIcon
>{{ $t('views.document.setting.export') }} Excel
</el-dropdown-item>
<el-dropdown-item
@click.stop="exportZipKnowledge(row)"
v-if="permissionPrecise.export(row.id)"
>
<AppIcon iconName="app-export"></AppIcon
>{{ $t('views.document.setting.export') }} ZIP</el-dropdown-item
>
<el-dropdown-item
icon="Delete"
type="danger"
@click.stop="deleteKnowledge(row)"
v-if="permissionPrecise.delete(row.id)"
>
{{ $t('common.delete') }}</el-dropdown-item
>
</el-dropdown-menu>
</template>
</el-dropdown>
</template>
</el-table-column>
</app-table>
</el-card>
<SyncWebDialog ref="SyncWebDialogRef" />
<GenerateRelatedDialog ref="GenerateRelatedDialogRef" apiType="systemManage" />
</div>
</template>
<script lang="ts" setup>
import { onMounted, ref, reactive, computed } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import KnowledgeResourceApi from '@/api/system-resource-management/knowledge'
import { t } from '@/locales'
import useStore from '@/stores'
import UserApi from '@/api/user/user'
import SyncWebDialog from '@/views/knowledge/component/SyncWebDialog.vue'
import GenerateRelatedDialog from '@/components/generate-related-dialog/index.vue'
import { datetimeFormat } from '@/utils/time'
import { loadPermissionApi } from '@/utils/dynamics-api/permission-api.ts'
import UserApi from '@/api/user/user'
import permissionMap from '@/permission'
import { MsgSuccess, MsgConfirm } from '@/utils/message'
import { t } from '@/locales'
import useStore from '@/stores'
const router = useRouter()
const { user } = useStore()
const permissionPrecise = computed(() => {
return permissionMap['knowledge']['systemManage']
})
const search_type = ref('name')
const search_form = ref<any>({
name: '',
@ -169,6 +278,54 @@ const paginationConfig = reactive({
page_size: 20,
total: 0,
})
const exportKnowledge = (item: any) => {
KnowledgeResourceApi.exportKnowledge(item.name, item.id, loading).then(() => {
MsgSuccess(t('common.exportSuccess'))
})
}
const exportZipKnowledge = (item: any) => {
KnowledgeResourceApi.exportZipKnowledge(item.name, item.id, loading).then(() => {
MsgSuccess(t('common.exportSuccess'))
})
}
function deleteKnowledge(row: any) {
MsgConfirm(
`${t('views.knowledge.delete.confirmTitle')}${row.name} ?`,
`${t('views.knowledge.delete.confirmMessage1')} ${row.application_mapping_count} ${t('views.knowledge.delete.confirmMessage2')}`,
{
confirmButtonText: t('common.confirm'),
confirmButtonClass: 'danger',
},
)
.then(() => {
KnowledgeResourceApi.delKnowledge(row.id, loading).then(() => {
getList()
MsgSuccess(t('common.deleteSuccess'))
})
})
.catch(() => {})
}
const GenerateRelatedDialogRef = ref<InstanceType<typeof GenerateRelatedDialog>>()
function openGenerateDialog(row: any) {
if (GenerateRelatedDialogRef.value) {
GenerateRelatedDialogRef.value.open([], 'knowledge', row)
}
}
const SyncWebDialogRef = ref()
function syncKnowledge(row: any) {
SyncWebDialogRef.value.open(row.id)
}
function reEmbeddingKnowledge(row: any) {
KnowledgeResourceApi.putReEmbeddingKnowledge(row.id).then(() => {
MsgSuccess(t('common.submitSuccess'))
})
}
const workspaceOptions = ref<any[]>([])
const workspaceVisible = ref(false)
const workspaceArr = ref<any[]>([])

View File

@ -161,14 +161,71 @@
{{ datetimeFormat(row.create_time) }}
</template>
</el-table-column>
<el-table-column :label="$t('common.operation')" align="left" width="120" fixed="right">
<template #default="{ row }">
<el-tooltip effect="dark" :content="$t('common.modify')" placement="top">
<span class="mr-8">
<el-button
type="primary"
text
:title="$t('common.modify')"
v-if="permissionPrecise.modify(row.id)"
@click.stop="openEditModel(row)"
>
<el-icon><EditPen /></el-icon>
</el-button>
</span>
</el-tooltip>
<el-tooltip
effect="dark"
:content="$t('views.model.modelForm.title.paramSetting')"
placement="top"
>
<span class="mr-8">
<el-button
type="primary"
text
:title="$t('views.model.modelForm.title.paramSetting')"
v-if="
(row.model_type === 'TTS' ||
row.model_type === 'LLM' ||
row.model_type === 'IMAGE' ||
row.model_type === 'TTI') &&
permissionPrecise.paramSetting(row.id)
"
@click.stop="openParamSetting(row)"
>
<el-icon><Delete /></el-icon>
</el-button>
</span>
</el-tooltip>
<el-tooltip effect="dark" :content="$t('common.delete')" placement="top">
<span class="mr-8">
<el-button
type="primary"
text
:title="$t('common.delete')"
v-if="permissionPrecise.delete(row.id)"
@click.stop="deleteModel(row)"
>
<el-icon><Delete /></el-icon>
</el-button>
</span>
</el-tooltip>
</template>
</el-table-column>
</app-table>
</el-card>
<EditModel ref="editModelRef" @submit="getList"></EditModel>
<ParamSettingDialog ref="paramSettingRef" />
</div>
</template>
<script lang="ts" setup>
import { onBeforeMount, onMounted, ref, reactive, nextTick, computed } from 'vue'
import type { Provider, Model } from '@/api/type/model'
import EditModel from '@/views/model/component/EditModel.vue'
import ParamSettingDialog from '@/views/model/component/ParamSettingDialog.vue'
import ModelResourceApi from '@/api/system-resource-management/model'
import { modelTypeList } from '@/views/model/component/data'
import { modelType } from '@/enums/model'
@ -177,6 +234,8 @@ import useStore from '@/stores'
import { datetimeFormat } from '@/utils/time'
import { loadPermissionApi } from '@/utils/dynamics-api/permission-api.ts'
import UserApi from '@/api/user/user.ts'
import permissionMap from '@/permission'
import { MsgConfirm, MsgSuccess } from '@/utils/message'
const { user, model } = useStore()
@ -192,7 +251,6 @@ const model_search_form = ref<{
})
const loading = ref(false)
const changeStateloading = ref(false)
const modelList = ref<Array<Model>>([])
const user_options = ref<any[]>([])
const provider_list = ref<Array<Provider>>([])
@ -203,6 +261,41 @@ const paginationConfig = reactive({
total: 0,
})
const deleteModel = (row: any) => {
MsgConfirm(
`${t('views.model.delete.confirmTitle')}${row.name} ?`,
t('views.model.delete.confirmMessage'),
{
confirmButtonText: t('common.confirm'),
confirmButtonClass: 'danger',
},
)
.then(() => {
ModelResourceApi.deleteModel(row.id).then(() => {
getList()
MsgSuccess(t('common.deleteSuccess'))
})
})
.catch(() => {})
}
const paramSettingRef = ref<InstanceType<typeof ParamSettingDialog>>()
const openParamSetting = (row: any) => {
paramSettingRef.value?.open(row)
}
const editModelRef = ref<InstanceType<typeof EditModel>>()
const openEditModel = (row: any) => {
const provider = provider_list.value.find((p) => p.provider === row.provider)
if (provider) {
editModelRef.value?.open(provider, row)
}
}
const permissionPrecise = computed(() => {
return permissionMap['model']['systemManage']
})
const workspaceOptions = ref<any[]>([])
const workspaceVisible = ref(false)
const workspaceArr = ref<any[]>([])