Skip to content

Commit 87d64b8

Browse files
committed
feat: system resource application
1 parent 97a6e80 commit 87d64b8

6 files changed

Lines changed: 190 additions & 7 deletions

File tree

‎ui/src/api/admin/system/resource-management/application/application.ts‎

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { get, postStream } from '@/api/admin/core/request'
1+
import { del, get, getExportFile, postStream } from '@/api/admin/core/request'
22
import type { ParamsPage, ResponsePage } from '@/api/admin/core/types'
33
import type { ApplicationDetail, Dict, PromptGeneratePayload } from '@/api/types'
44
import { ADMIN_API_BASE_PATH } from '@/api/constants'
@@ -15,7 +15,19 @@ const postPromptGenerate = (applicationId: string, modelId: string, payload: Pro
1515
return postStream(ADMIN_API_BASE_PATH, `${prefix}/${applicationId}/model/${modelId}/prompt_generate`, payload)
1616
}
1717

18+
/** 删除系统资源管理智能体。 */
19+
const deleteApplication = (applicationId: string) => {
20+
return del<undefined, boolean>(`${prefix}/${applicationId}`)
21+
}
22+
23+
/** 导出系统资源管理智能体文件。 */
24+
const exportApplication = (applicationId: string, applicationName: string) => {
25+
return getExportFile(`${applicationName}.mk`, `${prefix}/${applicationId}/export`)
26+
}
27+
1828
export default {
1929
getApplicationPage,
2030
postPromptGenerate,
31+
deleteApplication,
32+
exportApplication,
2133
}

‎ui/src/router/admin/system/index.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ export const systemRoutes: RouteRecordRaw = {
157157
{
158158
path: 'applications',
159159
name: 'system-resource-applications',
160-
component: () => import('@/views/system/index.vue'),
160+
component: () => import('@/views/system/resource-management/application/index.vue'),
161161
meta: { title: '智能体', order: 10, permission: perm.application.system.jumpRead, next: 'system-resource-knowledge' },
162162
},
163163
{

‎ui/src/views/application/application-card/action-dropdown/DeleteApplicationAction.vue‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
<script setup lang="ts">
22
import type ApplicationApi from '@/api/admin/workspace/application/application'
3+
import type SystemResourceApplicationApi from '@/api/admin/system/resource-management/application/application'
34
import type { ApplicationDetail } from '@/api/types'
45
import { MsgConfirm, MsgSuccess } from '@/utils/message'
56
67
defineOptions({ name: 'DeleteApplicationAction' })
78
8-
const props = defineProps<{ api: typeof ApplicationApi; application: ApplicationDetail; label: string }>()
9+
const props = defineProps<{ api: typeof ApplicationApi | typeof SystemResourceApplicationApi; application: ApplicationDetail; label: string }>()
910
1011
const loading = defineModel<boolean>('loading', { default: false })
1112

‎ui/src/views/application/application-card/action-dropdown/ExportApplicationAction.vue‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
<script setup lang="ts">
22
import type ApplicationApi from '@/api/admin/workspace/application/application'
3+
import type SystemResourceApplicationApi from '@/api/admin/system/resource-management/application/application'
34
import type { ApplicationDetail, ExportError } from '@/api/types'
45
import { MsgError } from '@/utils/message'
56
67
defineOptions({ name: 'ExportApplicationAction' })
78
8-
const props = defineProps<{ api: typeof ApplicationApi; application: ApplicationDetail; label: string }>()
9+
const props = defineProps<{ api: typeof ApplicationApi | typeof SystemResourceApplicationApi; application: ApplicationDetail; label: string }>()
910
1011
const loading = defineModel<boolean>('loading', { default: false })
1112

‎ui/src/views/system/home/index.vue‎

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,7 @@ onMounted(() => {
8585
<template #top>
8686
<WorkspaceDropdown v-model="selectedWorkspaceId" :options="workspaceOptions" @select="handleWorkspaceSelect" />
8787
</template>
88-
8988
<!-- 资源 -->
90-
9189
<h4 class="mb-4 mt-4">资源</h4>
9290
<HomeResourceOverview :key="selectedWorkspaceId" :api="SystemHomepageApi" :workspace-id="selectedWorkspaceId" />
9391
<!-- 监控 -->
@@ -117,7 +115,6 @@ onMounted(() => {
117115
<span>全部智能体</span>
118116
</div>
119117
</el-option>
120-
<!-- TODO 全部智能体 -->
121118
<template v-for="application in applications" :key="application.id">
122119
<el-option :label="application.name" :value="application.id">
123120
<div class="flex-align-center gap-2">
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
<script setup lang="ts">
2+
import { computed, onMounted, ref } from 'vue'
3+
import SystemResourceApplicationApi from '@/api/admin/system/resource-management/application/application'
4+
import SystemCommonApi from '@/api/admin/system/common'
5+
import SystemWorkspaceApi from '@/api/admin/system/workspace'
6+
import SystemResourceTriggerApi from '@/api/admin/system/resource-management/resource-trigger'
7+
import type { ApplicationDetail, Dict, OptionItem } from '@/api/types'
8+
import { useStore } from '@/stores'
9+
import { datetimeFormat } from '@/utils/time'
10+
import { APPLICATION_TYPE } from '@/api/enums'
11+
import { isWorkFlow } from '@/utils/application'
12+
import {
13+
AuthorizeApplicationAction,
14+
ExportApplicationAction,
15+
DeleteApplicationAction,
16+
TriggerApplicationAction,
17+
} from '@/views/application/application-card/action-dropdown'
18+
19+
const { auth } = useStore()
20+
21+
/* 工具分页与筛选 */
22+
const loading = ref(false)
23+
const operationLoading = ref(false)
24+
const applicationData = ref<ApplicationDetail[]>([])
25+
const pagination = ref({ currentPage: 1, pageSize: 20, total: 0 })
26+
const applicationQuery = ref<Dict<unknown>>()
27+
const creatorOptions = ref<OptionItem<string>[]>([])
28+
const workspaceOptions = ref<OptionItem<string>[]>([])
29+
const selectedWorkspaceIds = ref<string[]>([])
30+
const searchFields = computed(() => [
31+
{ label: '创建者', value: 'create_user', options: creatorOptions.value, remoteMethod: loadCreatorOptions },
32+
{ label: '名称', value: 'name' },
33+
{
34+
label: '类型',
35+
value: 'type',
36+
options: [
37+
{ value: APPLICATION_TYPE.WORK_FLOW, label: '高级' },
38+
{ value: APPLICATION_TYPE.SIMPLE, label: '简易' },
39+
],
40+
},
41+
])
42+
const selectedStatusType = ref<string[]>([])
43+
const applicationStatusOptions = computed(() => [
44+
{ value: true, label: '已发布' },
45+
{ value: false, label: '未发布' },
46+
])
47+
48+
function loadCreatorOptions(keyword: string) {
49+
return SystemCommonApi.getAllUsers(keyword ? { nick_name: keyword } : undefined).then((users) => {
50+
creatorOptions.value = users.map(({ id, nick_name }) => ({ value: id, label: nick_name }))
51+
})
52+
}
53+
54+
function loadApplicationPage() {
55+
loading.value = true
56+
return SystemResourceApplicationApi.getApplicationPage(pagination.value, {
57+
...applicationQuery.value,
58+
...(selectedWorkspaceIds.value.length ? { workspace_ids: JSON.stringify(selectedWorkspaceIds.value) } : {}),
59+
...(selectedStatusType.value.length ? { status: JSON.stringify(selectedStatusType.value) } : {}),
60+
})
61+
.then((page) => {
62+
applicationData.value = page.records
63+
pagination.value.total = page.total
64+
})
65+
.finally(() => {
66+
loading.value = false
67+
})
68+
}
69+
70+
function handleSearchChange(query?: Dict<unknown>) {
71+
applicationQuery.value = query
72+
return handleFilterChange()
73+
}
74+
75+
function handleFilterChange() {
76+
pagination.value.currentPage = 1
77+
return loadApplicationPage()
78+
}
79+
80+
onMounted(() => {
81+
loadApplicationPage()
82+
if (auth.isEE) {
83+
SystemWorkspaceApi.getSystemWorkspaceList().then((workspaces) => {
84+
workspaceOptions.value = workspaces.flatMap(({ id, name }) => (id ? [{ value: id, label: name }] : []))
85+
})
86+
}
87+
})
88+
</script>
89+
90+
<template>
91+
<MkViewLayout>
92+
<template #default="{ Header, title }">
93+
<component :is="Header">
94+
<h4>{{ title }}</h4>
95+
<MkComplexSearch :fields="searchFields" @change="handleSearchChange" />
96+
</component>
97+
<MkTable
98+
v-model:pagination-config="pagination"
99+
v-loading="loading || operationLoading"
100+
:data="applicationData"
101+
:max-table-height="210"
102+
@current-change="loadApplicationPage"
103+
@size-change="loadApplicationPage"
104+
>
105+
<el-table-column prop="name" label="名称" min-width="200" show-overflow-tooltip>
106+
<template #default="{ row }">
107+
<div class="flex-align-center gap-2">
108+
<ApplicationIcon :icon="row.icon" class="shrink-0" />
109+
<span class="truncate" :title="row.name">{{ row.name }}</span>
110+
</div>
111+
</template>
112+
</el-table-column>
113+
<el-table-column prop="type" label="类型" width="150">
114+
<template #default="{ row }">
115+
<el-tag v-if="isWorkFlow(row.type)" type="warning" size="small">高级</el-tag>
116+
<el-tag v-else type="primary" class="default" size="small">简易</el-tag>
117+
</template>
118+
</el-table-column>
119+
<el-table-column label="状态" width="150">
120+
<template #header>
121+
<MkTableFilter
122+
mode="multiple"
123+
v-model="selectedStatusType"
124+
label="状态"
125+
:options="applicationStatusOptions"
126+
@change="handleFilterChange"
127+
/>
128+
</template>
129+
<template #default="{ row }">
130+
<MkStatusLabel :active="row.is_publish" active-text="已发布" inactive-text="未发布" inactive-icon="icon_time_filled" />
131+
</template>
132+
</el-table-column>
133+
<el-table-column v-if="auth.isEE" prop="workspace_name" min-width="160" show-overflow-tooltip>
134+
<template #header>
135+
<MkTableFilter mode="multiple" v-model="selectedWorkspaceIds" label="工作空间" :options="workspaceOptions" @change="handleFilterChange" />
136+
</template>
137+
</el-table-column>
138+
<el-table-column prop="nick_name" label="创建者" min-width="120" show-overflow-tooltip />
139+
<el-table-column label="发布时间" width="180">
140+
<template #default="{ row }">{{ datetimeFormat(row.publish_time) || '-' }}</template>
141+
</el-table-column>
142+
<el-table-column label="创建时间" width="180">
143+
<template #default="{ row }">{{ datetimeFormat(row.create_time) }}</template>
144+
</el-table-column>
145+
<el-table-column label="操作" width="120" fixed="right">
146+
<template #default="{ row }">
147+
<div class="flex-align-center">
148+
<MkTableMoreDropdown persistent>
149+
<!-- TODO 对话&管理 -->
150+
151+
<!-- 资源授权 -->
152+
<AuthorizeApplicationAction label="资源授权" :application="row" />
153+
<!-- 智能体触发器 -->
154+
<TriggerApplicationAction label="触发器" :api="SystemResourceTriggerApi" :application="row" />
155+
<!-- 导出 -->
156+
<ExportApplicationAction v-model:loading="operationLoading" label="导出" :api="SystemResourceApplicationApi" :application="row" />
157+
<!-- 删除 -->
158+
<DeleteApplicationAction
159+
v-model:loading="operationLoading"
160+
label="删除"
161+
:api="SystemResourceApplicationApi"
162+
:application="row"
163+
@delete="loadApplicationPage"
164+
/>
165+
</MkTableMoreDropdown>
166+
</div>
167+
</template>
168+
</el-table-column>
169+
</MkTable>
170+
</template>
171+
</MkViewLayout>
172+
</template>

0 commit comments

Comments
 (0)