feat(knowledge): 更新知识库模块

- 添加知识库图标上传功能
- 优化知识库列表和详情页面的展示
- 新增智能体编辑功能
- 重构知识库表单组件
This commit is contained in:
陈昱达
2025-04-29 17:28:11 +08:00
parent 9c5fad7f75
commit 66944bcd47
7 changed files with 143 additions and 71 deletions

View File

@@ -77,5 +77,23 @@ const agentEdit = data => {
data data
}) })
} }
/**
* 编辑智能体
* @param {Object} data - 请求参数, 默认为空对象
* @returns {Promise} - 返回 Promise 对象
*/
const getAccessToken = data => {
return request({
url: getUrl('/third/access_token'),
method: 'get'
})
}
export { agentList, agentEdit, agentDelete, agentAdd, agentDetail } export {
agentList,
agentEdit,
agentDelete,
agentAdd,
agentDetail,
getAccessToken
}

View File

@@ -24,6 +24,7 @@
:visible.sync="visible" :visible.sync="visible"
@confirm="confirm" @confirm="confirm"
width="600px" width="600px"
append-to-body
> >
<div class="flex"> <div class="flex">
<cropper-canvas style="width: 100%;flex:1" cover image> <cropper-canvas style="width: 100%;flex:1" cover image>
@@ -94,8 +95,30 @@ export default {
} }
} }
}, },
props: {}, props: {
watch: {}, list: {
type: Array,
default: () => []
},
url: {
type: String,
default: ''
}
},
watch: {
url: {
handler(val) {
this.fileList = []
if (val) {
this.fileList.push({
url: val
})
}
},
immediate: true,
deep: true
}
},
components: {}, components: {},
filters: {}, filters: {},
methods: { methods: {
@@ -118,8 +141,9 @@ export default {
// 文件生成 bolburl // 文件生成 bolburl
const blobUrl = URL.createObjectURL(res) const blobUrl = URL.createObjectURL(res)
res.url = blobUrl res.url = blobUrl
this.fileList = []
this.fileList.push(res) this.fileList.push(res)
this.$emit('getFiles', this.fileList) this.$emit('getFiles', [res])
this.visible = false this.visible = false
}) })
// 根据canvas 生成一个图片 // 根据canvas 生成一个图片

View File

@@ -251,7 +251,9 @@ export default [
component: () => import('@/views/intelligent-agent/index.vue'), component: () => import('@/views/intelligent-agent/index.vue'),
meta: { meta: {
title: 'AI智能体', title: 'AI智能体',
icon: 'icon-notebook' icon: 'icon-notebook',
accessToken: '',
refreshToken: ''
} }
} }
] ]

View File

@@ -2,7 +2,8 @@
import { import {
agentList, agentList,
agentDelete, agentDelete,
agentDetail agentDetail,
getAccessToken
} from '@/api/intelligent-agent/list' } from '@/api/intelligent-agent/list'
import Info from '@/views/intelligent-agent/components/info' import Info from '@/views/intelligent-agent/components/info'
import agent from '@/views/agent' import agent from '@/views/agent'
@@ -69,7 +70,7 @@ export default {
this.page += 1 this.page += 1
this.fetchAgentList({ this.fetchAgentList({
page: this.page, page: this.page,
pageSize: 3 pageSize: this.pageSize
}) })
}, },
/** /**
@@ -136,10 +137,17 @@ export default {
}, },
async handleClickAgent(item) { async handleClickAgent(item) {
const { content } = await agentDetail(item.id) const { content } = await agentDetail(item.id)
const thirdContent = await getAccessToken()
let agent = content.content let agent = content.content
this.agentConfig.title = agent.appName + ' - 智能体详情' this.agentConfig.title = agent.appName + ' - 智能体详情'
this.agentConfig.agent = agent this.agentConfig.agent = agent
this.agentConfig.visible = true // 传递新的token
this.$route.meta.refreshToken = thirdContent.content.content.refreshToken
this.$route.meta.accessToken = thirdContent.content.content.accessToken
setTimeout(() => {
this.agentConfig.visible = true
})
}, },
// 创建智能体弹窗确认 // 创建智能体弹窗确认

View File

@@ -39,39 +39,8 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="图标" prop="segmentedMode"> <el-form-item label="图标" prop="image" required>
<el-upload <r-cropper @getFiles="getFiles" :url="model.image"></r-cropper>
action="#"
list-type="picture-card"
:file-list="uploadList"
:auto-upload="false"
:limit="1"
>
<i slot="default" class="el-icon-plus"></i>
<div slot="file" slot-scope="{ file }">
<img
class="el-upload-list__item-thumbnail"
:src="file.url"
alt=""
/>
<span class="el-upload-list__item-actions">
<span
v-if="!disabled"
class="el-upload-list__item-delete"
@click="handleDownload(file)"
>
<i class="el-icon-download"></i>
</span>
<span
v-if="!disabled"
class="el-upload-list__item-delete"
@click="handleRemove(file)"
>
<i class="el-icon-delete"></i>
</span>
</span>
</div>
</el-upload>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-col> </el-col>
@@ -80,7 +49,7 @@
<el-button <el-button
size="medium" size="medium"
v-if="!infoDialogVisible" v-if="!infoDialogVisible"
@click="$emit('update:visible', false)" @click="resetForm(), $emit('update:visible', false)"
>取消</el-button >取消</el-button
> >
<el-button <el-button
@@ -114,7 +83,8 @@ import 'nprogress/nprogress.css' // progress bar style
import { import {
datasetCreate, datasetCreate,
datasetUpdate, datasetUpdate,
getDatasetById getDatasetById,
uploadImage
} from '@/api/generatedApi' } from '@/api/generatedApi'
export default { export default {
@@ -122,6 +92,7 @@ export default {
data() { data() {
return { return {
uploadList: [], uploadList: [],
imageList: [],
dialogImageUrl: '', dialogImageUrl: '',
dialogVisible: false, dialogVisible: false,
disabled: false, disabled: false,
@@ -132,12 +103,15 @@ export default {
description: '', description: '',
name: '', name: '',
segmentedMode: 0, segmentedMode: 0,
id: null id: null,
imageType: 'upload-img',
image: null
}, },
rules: { rules: {
name: [ name: [
{ required: true, message: '请输入知识库名称', trigger: 'blur' } { required: true, message: '请输入知识库名称', trigger: 'blur' }
], ],
image: [{ required: true, message: '请上传知识库图标' }],
segmentedMode: [{ required: true, message: '请选择分段模式' }] segmentedMode: [{ required: true, message: '请选择分段模式' }]
} }
} }
@@ -157,23 +131,42 @@ export default {
handler(val) { handler(val) {
this.$nextTick(() => { this.$nextTick(() => {
this.$emit('update:visible', val) this.$emit('update:visible', val)
if (this.datasetId) {
this.getDetail()
} else {
this.model = {
description: '',
name: '',
segmentedMode: 0,
visibleRange: 0,
userIds: [],
image: null,
imageType: 'upload-img',
id: null
}
}
}) })
}, },
immediate: true immediate: true
},
datasetId(val) {
if (val) {
this.getDetail()
} else {
this.model = {
description: '',
name: '',
segmentedMode: 0,
id: null
}
}
} }
// datasetId(val) {
// if (val) {
// this.getDetail()
// } else {
// this.model = {
// description: '',
// name: '',
// segmentedMode: 0,
// visibleRange: 0,
// userIds: [],
// image: null,
// imageType: 'upload-img',
// id: null
// }
// }
// }
}, },
components: {}, components: {},
filters: { filters: {
@@ -189,17 +182,17 @@ export default {
} }
}, },
methods: { methods: {
handleRemove(file) { getFiles(file) {
console.log(file) let formData = new FormData()
}, formData.append('file', file[0])
handlePictureCardPreview(file) { uploadImage(formData).then(res => {
this.dialogImageUrl = file.url if (res) {
this.dialogVisible = true this.$set(this.model, 'image', res.content.content.imageUrl)
}, }
handleDownload(file) { })
console.log(file)
}, },
handleRemove(file) {},
jumpKnowledgeList() { jumpKnowledgeList() {
this.$router.push({ this.$router.push({
path: '/knowledge/list' path: '/knowledge/list'
@@ -222,19 +215,37 @@ export default {
} }
}) })
}, },
resetForm() {
this.model = {
description: '',
name: '',
segmentedMode: 0,
visibleRange: 0,
userIds: [],
image: null,
imageType: 'upload-img',
id: null
}
},
save() { save() {
this.$refs.model.validate(valid => { this.$refs.model.validate(valid => {
if (!valid) { if (!valid) {
return false return false
} }
this.model.visibleRange = 0
;(!this.datasetId ? datasetCreate : datasetUpdate)(this.model).then( ;(!this.datasetId ? datasetCreate : datasetUpdate)(this.model).then(
res => { res => {
if (res) { if (res) {
// 添加保存成功的提示 // 添加保存成功的提示
this.$message.success('保存成功') this.$message.success('保存成功')
this.model.id = res.content.content.id // this.model.id = res.content.content.id
// this.infoDialogVisible = true // this.infoDialogVisible = true
this.$emit('update:visible', false) this.$emit('update:visible', false)
this.resetForm()
// this.$router.go(-1) // this.$router.go(-1)
} }
} }

View File

@@ -1,11 +1,14 @@
<template> <template>
<div class=" render-container"> <div class=" render-container">
<div class="clearfix flex align-items-c justify-content-b "> <div class="clearfix flex align-items-c justify-content-b ">
<img :src="knowledgePng_1" class="header-icon" /> <img
:src="knowledgeImage ? knowledgeImage : knowledgePng_1"
class="header-icon"
/>
<div class="ml20" style="flex:1"> <div class="ml20" style="flex:1">
<div class="flex align-items-c"> <div class="flex align-items-c">
<div class="mr20 header" v-if="!editKnowledge"> <div class="mr20 header" v-if="!editKnowledge">
{{ knowledgeName }} {{ knowledgeName ? knowledgeName : '' }}
</div> </div>
<el-input <el-input
class="mr20 w400" class="mr20 w400"
@@ -272,13 +275,14 @@ export default {
copyKnowledgeName: '监管', copyKnowledgeName: '监管',
knowledgeDesc: '监管', knowledgeDesc: '监管',
segmentedMode: '分段模式', segmentedMode: '分段模式',
knowledgeImage: '',
list: [], list: [],
page: 1, page: 1,
pageSize: 10, pageSize: 10,
total: 0, total: 0,
hasList: false, hasList: false,
documentSourceOptions, documentSourceOptions,
descriptions: { data: [{ content: '' }] }, descriptions: { data: [{ content: '' }], dataset: { knowledgeName: '' } },
activeSegmentTab: 'content', activeSegmentTab: 'content',
activeSegments: [0], activeSegments: [0],
activeSegment: 0, activeSegment: 0,
@@ -367,6 +371,7 @@ export default {
this.knowledgeName = res.content.content.name this.knowledgeName = res.content.content.name
this.knowledgeDesc = res.content.content.description this.knowledgeDesc = res.content.content.description
this.segmentedMode = res.content.content.segmentedMode this.segmentedMode = res.content.content.segmentedMode
this.knowledgeImage = res.content.content.image
}) })
}, },

View File

@@ -59,7 +59,11 @@
> >
<div class="dataset-header"> <div class="dataset-header">
<div class="folder-content"> <div class="folder-content">
<img :src="getKnowledgeImage(index)" alt="" class="folder" /> <img
:src="item.image ? item.image : getKnowledgeImage(index)"
alt=""
class="folder"
/>
</div> </div>
<div class="dataset-body" style="flex:1"> <div class="dataset-body" style="flex:1">
<h4 class="dataset-title">{{ item.name }}</h4> <h4 class="dataset-title">{{ item.name }}</h4>