Skip to content

Commit 8b6ce9f

Browse files
feat: knowledge
1 parent 26f8433 commit 8b6ce9f

File tree

10 files changed

+173
-20
lines changed

10 files changed

+173
-20
lines changed

ui/src/api/folder.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ import type { pageRequest } from '@/api/type/common'
55
const prefix = '/workspace'
66

77
/**
8-
* 获得知识库文件夹列表
8+
* 获得文件夹列表
99
* @params 参数
1010
* source : APPLICATION, KNOWLEDGE, TOOL
11-
* {name: string}
11+
* data : {name: string}
1212
*/
1313
const getFolder: (
1414
wordspace_id: string,
@@ -19,6 +19,26 @@ const getFolder: (
1919
return get(`${prefix}/${wordspace_id}/${source}/folder`, data, loading)
2020
}
2121

22+
/**
23+
* 添加文件夹
24+
* @params 参数
25+
* source : APPLICATION, KNOWLEDGE, TOOL
26+
{
27+
"name": "string",
28+
"desc": "string",
29+
"parent_id": "root"
30+
}
31+
*/
32+
const postFolder: (
33+
wordspace_id: string,
34+
source: string,
35+
data?: any,
36+
loading?: Ref<boolean>,
37+
) => Promise<Result<Array<any>>> = (wordspace_id, source, data, loading) => {
38+
return post(`${prefix}/${wordspace_id}/${source}/folder`, data, loading)
39+
}
40+
2241
export default {
2342
getFolder,
43+
postFolder,
2444
}
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
<template>
2+
<el-dialog
3+
:title="$t('components.folder.addFolder')"
4+
v-model="dialogVisible"
5+
width="720"
6+
append-to-body
7+
:close-on-click-modal="false"
8+
:close-on-press-escape="false"
9+
>
10+
<el-form
11+
ref="FolderFormRef"
12+
:rules="rules"
13+
:model="folderForm"
14+
label-position="top"
15+
require-asterisk-position="right"
16+
>
17+
<el-form-item :label="$t('common.name')" prop="name">
18+
<el-input
19+
v-model="folderForm.name"
20+
:placeholder="$t('components.folder.folderNamePlaceholder')"
21+
maxlength="64"
22+
show-word-limit
23+
@blur="folderForm.name = folderForm.name.trim()"
24+
/>
25+
</el-form-item>
26+
<el-form-item :label="$t('components.folder.description')" prop="desc">
27+
<el-input
28+
v-model="folderForm.desc"
29+
type="textarea"
30+
:placeholder="$t('components.folder.descriptionPlaceholder')"
31+
maxlength="256"
32+
show-word-limit
33+
:autosize="{ minRows: 3 }"
34+
@blur="folderForm.desc = folderForm.desc.trim()"
35+
/>
36+
</el-form-item>
37+
</el-form>
38+
<template #footer>
39+
<span class="dialog-footer">
40+
<el-button @click.prevent="dialogVisible = false" :loading="loading">
41+
{{ $t('common.cancel') }}
42+
</el-button>
43+
<el-button type="primary" @click="submitHandle" :loading="loading">
44+
{{ $t('common.add') }}
45+
</el-button>
46+
</span>
47+
</template>
48+
</el-dialog>
49+
</template>
50+
<script setup lang="ts">
51+
import { ref, watch, reactive } from 'vue'
52+
import folderApi from '@/api/folder'
53+
import { MsgSuccess, MsgAlert } from '@/utils/message'
54+
import { t } from '@/locales'
55+
const emit = defineEmits(['refresh'])
56+
57+
const FolderFormRef = ref()
58+
59+
const loading = ref(false)
60+
const dialogVisible = ref<boolean>(false)
61+
const sourceType = ref<any>('')
62+
63+
const folderForm = ref<any>({
64+
name: '',
65+
desc: '',
66+
parent_id: '',
67+
})
68+
69+
const rules = reactive({
70+
name: [
71+
{
72+
required: true,
73+
message: t('components.folder.folderNamePlaceholder'),
74+
trigger: 'blur',
75+
},
76+
],
77+
})
78+
79+
watch(dialogVisible, (bool) => {
80+
if (!bool) {
81+
sourceType.value = ''
82+
folderForm.value = {
83+
name: '',
84+
desc: '',
85+
parent_id: '',
86+
}
87+
}
88+
})
89+
90+
const open = (source: string, id: string) => {
91+
sourceType.value = source
92+
folderForm.value.parent_id = id
93+
dialogVisible.value = true
94+
}
95+
96+
const submitHandle = async () => {
97+
await FolderFormRef.value.validate((valid: any) => {
98+
if (valid) {
99+
folderApi.postFolder('default', sourceType.value, folderForm.value, loading).then((res) => {
100+
MsgSuccess(t('common.createSuccess'))
101+
emit('refresh')
102+
dialogVisible.value = false
103+
})
104+
}
105+
})
106+
}
107+
108+
defineExpose({ open })
109+
</script>
110+
<style lang="scss" scoped></style>

ui/src/locales/lang/en-US/components.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ export default {
1010
all: 'All Segments'
1111
},
1212
folder: {
13-
addFolder:'Add Folder'
13+
addFolder: 'Add Folder',
14+
folderNamePlaceholder: 'Please enter a name',
15+
description: 'Description',
16+
descriptionPlaceholder: 'Please enter a description',
1417
}
1518
}

ui/src/locales/lang/zh-CN/components.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@ export default {
77
selectParagraph: {
88
title: '选择分段',
99
error: '仅执行未成功分段',
10-
all: '全部分段'
10+
all: '全部分段',
1111
},
1212
folder: {
13-
addFolder:'添加文件夹'
14-
}
13+
addFolder: '添加文件夹',
14+
folderNamePlaceholder: '请输入名称',
15+
description: '描述',
16+
descriptionPlaceholder: '请输入描述',
17+
},
1518
}

ui/src/locales/lang/zh-Hant/components.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@ export default {
77
selectParagraph: {
88
title: '選擇分段',
99
error: '僅執行未成功分段',
10-
all: '全部分段'
10+
all: '全部分段',
1111
},
1212
folder: {
13-
addFolder:'添加文件夾'
14-
}
13+
addFolder: '添加文件夾',
14+
folderNamePlaceholder: '請輸入名稱',
15+
description: '描述',
16+
descriptionPlaceholder: '請輸入描述',
17+
},
1518
}

ui/src/router/modules/document.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const DocumentRouter = {
2-
path: '/knowledge/:id',
2+
path: '/knowledge/:id/:folderId',
33
name: 'KnowledgeDetail',
44
meta: { title: 'common.fileUpload.document', activeMenu: '/knowledge', breadcrumb: true },
55
component: () => import('@/layout/layout-template/MainLayout.vue'),
@@ -13,7 +13,7 @@ const DocumentRouter = {
1313
iconActive: 'app-document-active',
1414
title: 'common.fileUpload.document',
1515
active: 'document',
16-
parentPath: '/knowledge/:id',
16+
parentPath: '/knowledge/:id/:folderId',
1717
parentName: 'KnowledgeDetail',
1818
},
1919
component: () => import('@/views/document/index.vue'),
@@ -26,7 +26,7 @@ const DocumentRouter = {
2626
iconActive: 'QuestionFilled',
2727
title: 'views.problem.title',
2828
active: 'problem',
29-
parentPath: '/knowledge/:id',
29+
parentPath: '/knowledge/:id/:folderId',
3030
parentName: 'KnowledgeDetail'
3131
},
3232
component: () => import('@/views/problem/index.vue')
@@ -38,7 +38,7 @@ const DocumentRouter = {
3838
icon: 'app-hit-test',
3939
title: 'views.application.hitTest.title',
4040
active: 'hit-test',
41-
parentPath: '/knowledge/:id',
41+
parentPath: '/knowledge/:id/:folderId',
4242
parentName: 'KnowledgeDetail'
4343
},
4444
component: () => import('@/views/hit-test/index.vue')
@@ -51,8 +51,8 @@ const DocumentRouter = {
5151
// iconActive: 'app-setting-active',
5252
// title: 'common.setting',
5353
// active: 'setting',
54-
// parentPath: '/dataset/:id',
55-
// parentName: 'DatasetDetail'
54+
// parentPath: '/knowledge/:id/:folderId',
55+
// parentName: 'KnowledgeDetail'
5656
// },
5757
// component: () => import('@/views/dataset/DatasetSetting.vue')
5858
// }

ui/src/views/knowledge/component/ResultSuccess.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<el-button @click="router.push({ path: `/dataset` })">{{
2020
$t('views.dataset.ResultSuccess.buttons.toDataset')
2121
}}</el-button>
22-
<el-button type="primary" @click="router.push({ path: `/dataset/${data?.id}/document` })">{{
22+
<el-button type="primary" @click="router.push({ path: `/dataset/${data?.id}/${currentFolder.id}/document` })">{{
2323
$t('views.dataset.ResultSuccess.buttons.toDocument')
2424
}}</el-button>
2525
</template>

ui/src/views/knowledge/create-component/CreateKnowledgeDialog.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ const submitHandle = async () => {
5757
}
5858
KnowledgeApi.postDataset('default', obj, loading).then((res) => {
5959
MsgSuccess(t('common.createSuccess'))
60-
// router.push({ path: `/knowledge/${res.data.id}/document` })
60+
// router.push({ path: `/knowledge/${res.data.id}/${currentFolder.value.id}/document` })
6161
emit('refresh')
6262
})
6363
} else {

ui/src/views/knowledge/create-component/CreateWebKnowledgeDialog.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ const submitHandle = async () => {
103103
}
104104
KnowledgeApi.postWebDataset('default', obj, loading).then((res) => {
105105
MsgSuccess(t('common.createSuccess'))
106-
router.push({ path: `/knowledge/${res.data.id}/document` })
106+
router.push({ path: `/knowledge/${res.data.id}/${currentFolder.value.id}/document` })
107107
emit('refresh')
108108
})
109109
} else {

ui/src/views/knowledge/index.vue

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@
117117
</div>
118118
</div>
119119
</el-dropdown-item>
120-
<el-dropdown-item @click="openCreateDialog" divided>
120+
<el-dropdown-item @click="openCreateFolder" divided>
121121
<div class="flex align-center">
122122
<AppIcon iconName="app-folder" style="font-size: 32px"></AppIcon>
123123
<div class="pre-wrap ml-4">
@@ -174,7 +174,9 @@
174174
:title="item.name"
175175
:description="item.desc"
176176
class="cursor"
177-
@click="router.push({ path: `/knowledge/${item.id}/document` })"
177+
@click="
178+
router.push({ path: `/knowledge/${item.id}/${currentFolder.id}/document` })
179+
"
178180
>
179181
<template #icon>
180182
<KnowledgeIcon :type="item.type" />
@@ -260,6 +262,7 @@
260262
</ContentContainer>
261263

262264
<component :is="currentCreateDialog" ref="CreateKnowledgeDialogRef" />
265+
<CreateFolderDialog ref="CreateFolderDialogRef" @refresh="refreshFolder" />
263266
</LayoutContainer>
264267
</template>
265268

@@ -268,6 +271,7 @@ import { onMounted, ref, reactive, shallowRef, nextTick } from 'vue'
268271
import KnowledgeIcon from '@/views/knowledge/component/KnowledgeIcon.vue'
269272
import CreateKnowledgeDialog from './create-component/CreateKnowledgeDialog.vue'
270273
import CreateWebKnowledgeDialog from './create-component/CreateWebKnowledgeDialog.vue'
274+
import CreateFolderDialog from '@/components/folder-tree/CreateFolderDialog.vue'
271275
import KnowledgeApi from '@/api/knowledge/knowledge'
272276
import { MsgSuccess, MsgConfirm } from '@/utils/message'
273277
import useStore from '@/stores'
@@ -365,6 +369,16 @@ function folderClickHandel(row: any) {
365369
knowledgeList.value = []
366370
getList()
367371
}
372+
const CreateFolderDialogRef = ref()
373+
374+
function openCreateFolder() {
375+
CreateFolderDialogRef.value.open('KNOWLEDGE', currentFolder.value.parent_id)
376+
}
377+
378+
function refreshFolder() {
379+
getFolder()
380+
getList()
381+
}
368382
369383
onMounted(() => {
370384
getFolder()

0 commit comments

Comments
 (0)