2025-5-20 / 新功能 - 多文件上传

这是一个完整功能

操作:
  多文件上传 只有两步  不做题词拆分
  点击弹窗的下拉 即可份文件预览
This commit is contained in:
陈昱达
2025-05-20 14:40:15 +08:00
parent b0dbb80a50
commit cadd640e9e
11 changed files with 431 additions and 88 deletions

View File

@@ -0,0 +1,9 @@
.el-dropdown-menu__item:focus,
.el-dropdown-menu__item:not(.is-disabled):hover {
background-color: $--color-primary;
color: #fff;
}
.el-dropdown-link {
cursor: pointer;
color: $--color-primary;
}

View File

@@ -72,3 +72,21 @@
// //
//} //}
//.el-pagination.is-background .el-pager li:not(.disabled):hover //.el-pagination.is-background .el-pager li:not(.disabled):hover
.tableBtn {
padding: 5px;
&.is-plain {
&:hover {
background: $--color-primary;
color: #fff;
}
}
&.el-button--danger {
&.is-plain:focus,
&.is-plain:hover {
color: #fff;
background: #ff1a1a;
border-color: #ff1a1a;
}
}
}

View File

@@ -10,6 +10,7 @@
@import 'renderSass/message'; @import 'renderSass/message';
@import 'renderSass/upload'; @import 'renderSass/upload';
@import 'renderSass/slider'; @import 'renderSass/slider';
@import 'renderSass/drop';
html, html,
body, body,

View File

@@ -9,6 +9,9 @@
:closeOnClickModal="closeOnClickModal" :closeOnClickModal="closeOnClickModal"
:close-on-press-escape="closeOnPressEscape" :close-on-press-escape="closeOnPressEscape"
> >
<div slot="title">
<slot name="title">{{ title }}</slot>
</div>
<div class="render-dialog-body"> <div class="render-dialog-body">
<slot name="default"></slot> <slot name="default"></slot>
</div> </div>

View File

@@ -58,13 +58,13 @@
class="normal-button" class="normal-button"
:disabled="disabled" :disabled="disabled"
icon="el-icon-delete" icon="el-icon-delete"
@click="del(scope.row, scope.$index)" @click.stop="del(scope.row, scope.$index)"
></el-button> ></el-button>
<el-button <el-button
class="normal-button" class="normal-button"
icon="el-icon-edit-outline" icon="el-icon-edit-outline"
:disabled="disabled" :disabled="disabled"
@click="edit(scope.row, scope.$index)" @click.stop="edit(scope.row, scope.$index)"
></el-button> ></el-button>
</div> </div>
<!--如果渲染的是selfBtn--> <!--如果渲染的是selfBtn-->
@@ -75,10 +75,11 @@
:disabled=" :disabled="
item.disabled !== undefined ? item.disabled : disabled item.disabled !== undefined ? item.disabled : disabled
" "
:class="item.class"
:type="btn.type ? btn.type : 'primary'" :type="btn.type ? btn.type : 'primary'"
:size="btn.size ? btn.size : 'mini'" :size="btn.size ? btn.size : 'mini'"
:key="btnIndex" :key="btnIndex"
@click="handlerMethods(scope.row, scope.$index, btn)" @click.stop="handlerMethods(scope.row, scope.$index, btn)"
:label="btn.name" :label="btn.name"
> >
{{ btn.name }} {{ btn.name }}
@@ -133,7 +134,7 @@
<el-button <el-button
type="primary" type="primary"
plain plain
@click=" @click.stop="
e => { e => {
addRow(scope.row, scope.$index) addRow(scope.row, scope.$index)
} }
@@ -147,7 +148,7 @@
<el-button <el-button
type="danger" type="danger"
plain plain
@click=" @click.stop="
e => { e => {
delRow(scope.row, scope.$index) delRow(scope.row, scope.$index)
} }

View File

@@ -1,49 +1,102 @@
<template> <template>
<div id="preprocessing-container " class="mt20"> <div id="preprocessing-container " class="mt20">
<el-form label-width="180px" :model="form" ref="processForm"> <el-form label-width="180px" :model="form" ref="processForm">
<el-form-item label="数据来源:" required prop="radio" position="top" class="el-form--label-top"> <el-form-item
<el-radio-group v-model="form.radio" size="medium" @change="getFileType"> label="数据来源:"
<el-radio-button label="1" size="medium">使用本地文件</el-radio-button> required
<el-radio-button label="2" size="medium">使用通用知识文件模板</el-radio-button> prop="radio"
position="top"
class="el-form--label-top"
>
<el-radio-group
v-model="form.radio"
size="medium"
@change="getFileType"
>
<el-radio-button label="1" size="medium"
>使用本地文件</el-radio-button
>
<el-radio-button label="2" size="medium"
>使用通用知识文件模板</el-radio-button
>
</el-radio-group> </el-radio-group>
<div class="mt10" v-if="form.radio === '2'"> <div class="mt10" v-if="form.radio === '2'">
<el-button type="primary" size="medium" class="fs14" @click="downloadTemplate">下载知识文件模板</el-button> <el-button
type="primary"
size="medium"
class="fs14"
@click="downloadTemplate"
>下载知识文件模板</el-button
>
</div> </div>
</el-form-item> </el-form-item>
<!-- 文件上传--> <!-- 文件上传-->
<el-form-item label="" required prop="file" label-width="0" class="el-form--label-top"> <el-form-item
label=""
required
prop="file"
label-width="0"
class="el-form--label-top"
>
<div <div
@click="createFiled" @click.stop="createFiled"
@dragover.prevent="handleDragOver" @dragover.prevent="handleDragOver"
@dragleave.prevent="handleDragLeave" @dragleave.prevent="handleDragLeave"
@drop.prevent="handleDrop" @drop.prevent="handleDrop"
class="upload-demo" class="upload-demo"
:class="{ 'drag-over': isDragOver }" :class="{ 'drag-over': isDragOver }"
> >
<el-empty v-if="!filed"> <el-empty v-if="fileList.length === 0">
<template #image> <template #image>
<img :src="uloadPng" alt="" style='width: 50px;height: 50px;'></img> <img :src="uloadPng" alt="" style="width: 50px;height: 50px;" />
</template> </template>
<template #description> <template #description>
<div class='flex flex-direction-c'> <div class="flex flex-direction-c">
<span class='upload-tip'>点击或将文件拖拽到这里上传</span> <span class="upload-tip">点击或将文件拖拽到这里上传</span>
<span class='upload-tip-field'>支持扩展名.xlsx.doc.pdf.txt.docx</span> <span class="upload-tip-field"
>支持扩展名.xlsx.doc.pdf.txt.docx</span
>
</div> </div>
</template> </template>
</el-empty> </el-empty>
<el-result <div v-else>
v-else <el-result
icon="success" v-if="fileList.length === 1"
title="文件上传成功" icon="success"
:sub-title="`已上传文件:${filed.name}`" title="文件上传成功"
style="height: 100%; display: flex; flex-direction: column; justify-content: center; align-items: center;" :sub-title="`已上传文件:${fileList[0].name}`"
> style="height: 100%; display: flex; flex-direction: column; justify-content: center; align-items: center;"
<template slot="extra"> >
<el-button type="primary" size="medium" @click.stop="createFiled">重新上传</el-button> <template slot="extra">
</template> <el-button
</el-result> type="primary"
size="medium"
@click.stop="removeFile(0)"
>移除</el-button
>
</template>
</el-result>
<el-result v-else class="more-files">
<template slot="icon">
<div class="text-left">
<el-button class="line-button" size="medium">
文件上传</el-button
>
</div>
</template>
<template slot="extra" style="width: 100%;">
<r-table
:data="fileList"
:columns="columns"
style="width: 100%;"
@removeFiled="removeFiled"
:deletion="false"
></r-table>
</template>
</el-result>
</div>
</div> </div>
</el-form-item> </el-form-item>
@@ -52,21 +105,40 @@
<el-form-item label="是否进行预处理:" required prop="beMinerU"> <el-form-item label="是否进行预处理:" required prop="beMinerU">
<template slot="label"> <template slot="label">
是否进行预处理 是否进行预处理
<el-tooltip class="item" effect="dark" content="通过整合最先进的文档解析模型来提高内容提取质量" placement="top"> <el-tooltip
class="item"
effect="dark"
content="通过整合最先进的文档解析模型来提高内容提取质量"
placement="top"
>
<i class="el-icon-info ml5" style="color: #909399;"></i> <i class="el-icon-info ml5" style="color: #909399;"></i>
</el-tooltip> </el-tooltip>
</template> </template>
<el-switch v-model="form.beMinerU" size="medium"> <el-switch
v-model="form.beMinerU"
size="medium"
:disabled="fileList.length > 1"
>
<!-- <el-radio :label="true" size="medium"></el-radio>--> <!-- <el-radio :label="true" size="medium"></el-radio>-->
<!-- <el-radio :label="false" size="medium"></el-radio>--> <!-- <el-radio :label="false" size="medium"></el-radio>-->
</el-switch> </el-switch>
</el-form-item> </el-form-item>
<el-form-item label="是否ocr协助处理" v-if="form.beMinerU" required prop="beOcr"> <el-form-item
label="是否ocr协助处理"
v-if="form.beMinerU"
required
prop="beOcr"
>
<template slot="label"> <template slot="label">
是否ocr协助处理 是否ocr协助处理
<el-tooltip class="item" effect="dark" content="能更好的协助处理图片、表格类数据" placement="top"> <el-tooltip
class="item"
effect="dark"
content="能更好的协助处理图片、表格类数据"
placement="top"
>
<i class="el-icon-info ml5" style="color: #909399;"></i> <i class="el-icon-info ml5" style="color: #909399;"></i>
</el-tooltip> </el-tooltip>
@@ -87,16 +159,18 @@
<!-- </el-drawer>--> <!-- </el-drawer>-->
</div> </div>
</template> </template>
<script> <script>
import { uploadFileByCustom, uploadFileByTemplate } from '@/api/generatedApi' import { uploadFileByCustom, uploadFileByTemplate } from '@/api/generatedApi'
import { downloadKnowledgeTemplate } from '@/api/knowledge/task-page' import { downloadKnowledgeTemplate } from '@/api/knowledge/task-page'
import uloadPng from '@/assets/images/konwledge/upload.png' import uloadPng from '@/assets/images/konwledge/upload.png'
export default { export default {
name: 'preprocessing', name: 'preprocessing',
data() { data() {
return { return {
uloadPng, uloadPng,
filed: null, fileList: [], // 文件列表
uploadLoading: false, uploadLoading: false,
headers: {}, headers: {},
fieldList: [], fieldList: [],
@@ -106,31 +180,84 @@ export default {
beOcr: false, beOcr: false,
datasetId: this.$route.query.datasetId datasetId: this.$route.query.datasetId
}, },
previewDialogVisible: false, // 添加对话框显示控制变量 previewDialogVisible: false,
documentId: '', documentId: '',
isDragOver: false isDragOver: false
} }
}, },
props: {},
watch: { watch: {
'form.beMinerU': { fileList: {
handler(value) { handler(val) {
// 如果不进行预处理不进行ocr if (val.length > 1) {
if (!value) { this.form.beMinerU = false
this.form.beOcr = false
} }
}, },
deep: true deep: true
} }
}, },
components: {}, computed: {
filters: {}, columns: vm => {
return [
{
type: 'index',
title: '序号'
},
{
title: '文件名称',
prop: 'name'
},
{
title: '文件大小',
prop: 'size',
render: (h, params) => {
return h('span', vm.formatFileSize(params.row.size))
}
},
{
title: '文件类型',
prop: 'type',
render: (h, params) => {
// 根据文件类型展示 是什么类型文件
switch (params.row.type) {
case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':
return h('span', 'Excel')
case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':
return h('span', 'Word')
case 'application/pdf':
return h('span', 'PDF')
case 'text/plain':
return h('span', 'TXT')
}
return h('span', params.row.type)
}
},
{
title: '操作',
selfBtn: [
{
name: '移除',
size: 'mini',
type: 'primary',
method: 'removeFiled',
class: 'tableBtn'
}
]
}
]
}
},
methods: { methods: {
removeFiled(item) {
this.removeFile(item.index)
},
formatFileSize(size) {
return (size / 1024 / 1024).toFixed(2) + 'MB'
},
getFileType() { getFileType() {
this.$emit('getFileType', this.form.radio) this.$emit('getFileType', this.form.radio)
}, },
downloadTemplate() { downloadTemplate() {
console.log(`下载模板的链接是:${downloadKnowledgeTemplate().url}`)
window.open(downloadKnowledgeTemplate().url, '_blank') window.open(downloadKnowledgeTemplate().url, '_blank')
}, },
@@ -138,18 +265,40 @@ export default {
createFiled() { createFiled() {
let input = document.createElement('input') let input = document.createElement('input')
input.type = 'file' input.type = 'file'
input.multiple = true // 支持多文件选择
// 对文件的类型做出限制 // 对文件的类型做出限制
input.accept = '.xlsx,.doc,.docx,.pdf,.txt' input.accept = '.xlsx,.doc,.docx,.pdf,.txt'
input.onchange = e => { input.onchange = e => {
this.filed = e.target.files[0] const newFiles = Array.from(e.target.files)
if (this.fileList.length + newFiles.length > 10) {
this.$message.error('最多只能上传10个文件')
return
}
// 校验 最新上传的文件是否之前上传过
for (let i = 0; i < newFiles.length; i++) {
for (let j = 0; j < this.fileList.length; j++) {
if (newFiles[i].name === this.fileList[j].name) {
this.$message.error('请勿重复上传文件,请检查文件')
return
}
}
}
this.fileList = [...this.fileList, ...newFiles] // 将新选择的文件添加到文件列表
} }
input.click() input.click()
}, },
// 新增:移除文件
removeFile(index) {
this.fileList.splice(index, 1)
},
uploadFiled(back) { uploadFiled(back) {
if (!this.filed) { if (this.fileList.length === 0) {
this.$message({ this.$message({
type: 'error', type: 'error',
message: '请上传文件' message: '请上传文件'
@@ -159,17 +308,20 @@ export default {
// 0否 1是 // 0否 1是
let formData = new FormData() let formData = new FormData()
formData.append('file', this.filed) this.fileList.forEach(file => {
formData.append('file', file)
})
formData.append('datasetId', this.form.datasetId) formData.append('datasetId', this.form.datasetId)
let api = this.form.radio === '1' ? uploadFileByCustom : uploadFileByTemplate let api =
this.form.radio === '1' ? uploadFileByCustom : uploadFileByTemplate
if (this.form.radio === '1') { if (this.form.radio === '1') {
formData.append('useMinerU', this.form.beMinerU ? '1': '0') formData.append('useMinerU', this.form.beMinerU ? '1' : '0')
formData.append('useOcr', this.form.beOcr? '1': '0') formData.append('useOcr', this.form.beOcr ? '1' : '0')
} }
api(formData).then(response => { api(formData).then(response => {
if(response){ if (response) {
this.documentId = response.content.content this.documentId = response.content.content
if(back){ if (back) {
back(this.documentId) back(this.documentId)
} else { } else {
// 向上导入documentId // 向上导入documentId
@@ -183,10 +335,9 @@ export default {
} }
} }
} }
}) })
}, },
handleDragOver() { handleDragOver() {
this.isDragOver = true this.isDragOver = true
}, },
@@ -198,8 +349,13 @@ export default {
handleDrop(event) { handleDrop(event) {
this.isDragOver = false this.isDragOver = false
const files = event.dataTransfer.files const files = event.dataTransfer.files
this.filed = files[0] if (this.fileList.length + files.length > 10) {
this.$message.error('最多只能上传10个文件')
return
}
this.fileList = [...this.fileList, ...Array.from(files)] // 将拖拽的文件添加到文件列表
}, },
handleUploadSuccess(response, file) { handleUploadSuccess(response, file) {
this.fieldList = [file] this.fieldList = [file]
this.uploadLoading = false this.uploadLoading = false
@@ -236,30 +392,35 @@ export default {
// 返回 true 继续上传,返回 false 停止上传 // 返回 true 继续上传,返回 false 停止上传
return true return true
} }
}, }
created() {},
mounted() {},
computed: {}
} }
</script> </script>
<style>
.more-files > .el-result__extra,
.more-files > .el-result__icon {
width: 100%;
}
</style>
<style scoped lang="scss"> <style scoped lang="scss">
@import '@/assets/sass/renderSass/theme.scss'; @import '@/assets/sass/renderSass/theme.scss';
.flex-direction-c{ .flex-direction-c {
flex-direction: column; flex-direction: column;
line-height: 20px; line-height: 20px;
} }
.upload-tip{ .upload-tip {
font-family: PingFangSC, PingFang SC; font-family: PingFangSC, PingFang SC;
font-weight: 500; font-weight: 500;
font-size: 14px; font-size: 14px;
color: #5F5E68; color: #5f5e68;
font-style: normal; font-style: normal;
} }
.upload-tip-field{ .upload-tip-field {
font-family: PingFangSC, PingFang SC; font-family: PingFangSC, PingFang SC;
font-weight: 400; font-weight: 400;
font-size: 13px; font-size: 13px;
color: #B1B5C7; color: #b1b5c7;
font-style: normal; font-style: normal;
} }
.upload-demo { .upload-demo {

View File

@@ -63,6 +63,7 @@
<!-- 添加预览组件 --> <!-- 添加预览组件 -->
<split-preview <split-preview
:documentList="documentList"
:documentId="documentId" :documentId="documentId"
:visible.sync="previewVisible" :visible.sync="previewVisible"
:preview-data="previewData" :preview-data="previewData"
@@ -71,6 +72,7 @@
@confirm="handlePreviewConfirm" @confirm="handlePreviewConfirm"
@handleReUpload="handleReUpload" @handleReUpload="handleReUpload"
@handleClose="handleClose" @handleClose="handleClose"
@changePage="changePage"
/> />
</div> </div>
</template> </template>
@@ -88,6 +90,7 @@ export default {
}, },
data() { data() {
return { return {
splitIndex: 0,
dialogVisible: false, dialogVisible: false,
activeIndex: 0, activeIndex: 0,
previewVisible: false, // 控制预览组件显示 previewVisible: false, // 控制预览组件显示
@@ -112,6 +115,10 @@ export default {
} }
}, },
props: { props: {
documentList: {
type: Array,
default: () => []
},
documentId: { documentId: {
type: String, type: String,
default: '' default: ''
@@ -120,6 +127,10 @@ export default {
watch: {}, watch: {},
filters: {}, filters: {},
methods: { methods: {
async changePage(index) {
this.previewData = await this.getPreviewOperation(this.documentId, index)
},
handleClick(index) { handleClick(index) {
this.activeIndex = index this.activeIndex = index
if (index === 1) { if (index === 1) {
@@ -131,10 +142,15 @@ export default {
// 构建API请求参数 // 构建API请求参数
buildExecSplitParams(documentId) { buildExecSplitParams(documentId) {
const params = { let params = {
documentId: documentId, documentId: documentId,
beAuto: this.activeIndex === 0 beAuto: this.activeIndex === 0
} }
let splitDocId = documentId.split(',')
if (splitDocId.length > 1) {
params.documentId = undefined
params.documentIds = splitDocId
}
if (!params.beAuto && this.$refs.customTable.ruleId) { if (!params.beAuto && this.$refs.customTable.ruleId) {
params.rulesId = this.$refs.customTable.ruleId params.rulesId = this.$refs.customTable.ruleId
@@ -161,7 +177,11 @@ export default {
}, },
// 获取拆分预览 // 获取拆分预览
async getPreviewOperation(documentId) { async getPreviewOperation(documentId, index) {
let splitDocId = documentId.split(',')
if (splitDocId.length > 1) {
documentId = splitDocId[index ? index : 0]
}
const res = await splitResultPreview({ documentId }) const res = await splitResultPreview({ documentId })
if (res.content.result !== '0') { if (res.content.result !== '0') {
const errorMsg = const errorMsg =

View File

@@ -6,6 +6,26 @@
width="60%" width="60%"
:before-close="handleClose" :before-close="handleClose"
> >
<template slot="title">
<div class="flex align-items-c" style="gap:10px">
<span>拆分结果预览</span>
<el-dropdown @command="command">
<span class="el-dropdown-link">
{{ documentList[activeIndex].name
}}<i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item
v-for="(item, index) in documentList"
:command="index"
:key="item.id"
>{{ item.name }}</el-dropdown-item
>
</el-dropdown-menu>
</el-dropdown>
</div>
</template>
<div v-loading="loading" class="preview-content"> <div v-loading="loading" class="preview-content">
<template v-if="!loading && previewData"> <template v-if="!loading && previewData">
<el-tree <el-tree
@@ -23,7 +43,13 @@
</div> </div>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button size="medium" @click="handleReUpload">重新上传</el-button> <el-button size="medium" @click="handleReUpload">重新上传</el-button>
<el-button size="medium" type="primary" @click="handleConfirm" <!-- <el-button size="medium" @click="upFiled">前一个</el-button>-->
<!-- <el-button size="medium" @click="downFiled">后一个</el-button>-->
<el-button
v-if="documentList.length === 1"
size="medium"
type="primary"
@click="handleConfirm"
>下一步</el-button >下一步</el-button
> >
<el-button <el-button
@@ -44,6 +70,10 @@ import { embedding } from '@/api/generatedApi'
export default { export default {
name: 'SplitPreview', name: 'SplitPreview',
props: { props: {
documentList: {
type: Array,
default: () => []
},
documentId: { documentId: {
type: String, type: String,
default: '' default: ''
@@ -66,6 +96,7 @@ export default {
}, },
data() { data() {
return { return {
activeIndex: 0,
defaultProps: { defaultProps: {
children: 'children', children: 'children',
label: 'paragraphTitle' label: 'paragraphTitle'
@@ -73,6 +104,19 @@ export default {
} }
}, },
methods: { methods: {
upFiled() {
this.$emit('changePage', 'up')
},
downFiled() {
this.$emit('changePage', 'down')
},
command(index) {
if (index === this.activeIndex) {
return false
}
this.activeIndex = index
this.$emit('changePage', this.activeIndex)
},
emitKnowledgeDataset() { emitKnowledgeDataset() {
this.$router.push({ this.$router.push({
path: '/knowledge/reviewKnowledge', path: '/knowledge/reviewKnowledge',
@@ -105,7 +149,8 @@ export default {
handleConfirm() { handleConfirm() {
this.$emit('confirm') this.$emit('confirm')
} }
} },
watch: {}
} }
</script> </script>

View File

@@ -67,6 +67,7 @@
:extract-results="extractResults" :extract-results="extractResults"
:is-auto-extract="activeIndex === 0" :is-auto-extract="activeIndex === 0"
:loading="previewLoading" :loading="previewLoading"
:documentList="documentList"
@confirm="handlePreviewConfirm" @confirm="handlePreviewConfirm"
/> />
</div> </div>
@@ -113,7 +114,12 @@ export default {
documentId: '' documentId: ''
} }
}, },
props: {}, props: {
documentList: {
type: Array,
default: () => []
}
},
watch: {}, watch: {},
filters: {}, filters: {},
methods: { methods: {
@@ -128,10 +134,15 @@ export default {
// 构建执行题词的参数 // 构建执行题词的参数
buildExecExtractParams(documentId) { buildExecExtractParams(documentId) {
const params = { let params = {
documentId: documentId, documentId: documentId,
beAuto: this.activeIndex === 0 beAuto: this.activeIndex === 0
} }
let splitDocIds = documentId.split(',')
if (splitDocIds.length > 1) {
params.documentId = undefined
params.documentIds = splitDocIds
}
if (!params.beAuto && this.$refs.customTable.ruleId) { if (!params.beAuto && this.$refs.customTable.ruleId) {
params.rulesId = this.$refs.customTable.ruleId params.rulesId = this.$refs.customTable.ruleId

View File

@@ -51,6 +51,7 @@
class="mt10" class="mt10"
v-else v-else
:documentId="documentId" :documentId="documentId"
:documentList="this.documentList"
@saveMarkDown="saveMarkDown" @saveMarkDown="saveMarkDown"
></r-miner-u> ></r-miner-u>
</div> </div>
@@ -58,11 +59,16 @@
<step-split-config <step-split-config
ref="splitConfig" ref="splitConfig"
v-if="active === 1" v-if="active === 1"
:documentList="this.documentList"
@previewConfirmed="handlePreviewConfirm" @previewConfirmed="handlePreviewConfirm"
@handleReUpload="handleReUpload" @handleReUpload="handleReUpload"
:documentId="documentId" :documentId="documentId"
></step-split-config> ></step-split-config>
<step-words ref="words" v-if="active === 2"></step-words> <step-words
ref="words"
v-if="active === 2"
:documentList="this.documentList"
></step-words>
</transition> </transition>
</div> </div>
</div> </div>
@@ -120,7 +126,7 @@ import StepPreprocessing from './components/preprocessing.vue'
import SplitConfig from '@/views/knowledge/detail/components/split/Index.vue' import SplitConfig from '@/views/knowledge/detail/components/split/Index.vue'
import Words from '@/views/knowledge/detail/components/words/Index.vue' import Words from '@/views/knowledge/detail/components/words/Index.vue'
import magic from '@/assets/images/konwledge/magic.png' import magic from '@/assets/images/konwledge/magic.png'
import { directEmbedding } from '@/api/generatedApi' import { datasetDocumentEx, directEmbedding } from '@/api/generatedApi'
// import StepC // import StepC
export default { export default {
name: 'create', name: 'create',
@@ -130,7 +136,8 @@ export default {
visible: false, visible: false,
active: 0, active: 0,
documentId: '1365038001244180480', documentId: '1365038001244180480',
isMd: false isMd: false,
documentList: []
} }
}, },
props: {}, props: {},
@@ -185,9 +192,32 @@ export default {
} }
}) })
}, },
getDocumentId(id) { async getDocumentId(id) {
this.documentId = id this.documentId = id
let splitDocIds = this.documentId.split(',')
for (let i = 0; i < splitDocIds.length; i++) {
let content = await this.getFileDetail(splitDocIds[i])
this.documentList.push({
name: content.knowledgeName,
id: content.id
})
}
}, },
// 获取文件详情 主要是名字与ID
async getFileDetail(documentId) {
const res = await datasetDocumentEx({ documentId })
if (res.content.result !== '0') {
const errorMsg =
'获取文件详情失败: ' + (res.content.resultMessage || '未知错误')
this.$message.error(errorMsg)
throw new Error(errorMsg)
}
return res.content.content
},
async nextStep() { async nextStep() {
if (this.active === 0) { if (this.active === 0) {
this.$refs.stepPreProcessing.uploadFiled() this.$refs.stepPreProcessing.uploadFiled()
@@ -211,6 +241,8 @@ export default {
} else { } else {
this.active = 0 this.active = 0
} }
this.documentList = []
} }
}, },
created() {}, created() {},

View File

@@ -141,9 +141,24 @@
style="width: 49.5%;height: calc(100vh - 110px)" style="width: 49.5%;height: calc(100vh - 110px)"
class="el-card review" class="el-card review"
> >
<div class="title"> <div class="title flex align-items-c" style="gap: 10px">
{{ documentDetail.knowledgeName }} <el-dropdown @command="command">
<span class="el-dropdown-link">
{{
documentDetail.length > 0
? documentDetail[activeIndex].name
: ''
}}<i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item
v-for="(item, index) in documentDetail"
:command="index"
:key="item.id"
>{{ item.name }}</el-dropdown-item
>
</el-dropdown-menu>
</el-dropdown>
<span class="block" v-if="viewsDetail.total_segments"> <span class="block" v-if="viewsDetail.total_segments">
预估块{{ viewsDetail.total_segments }} 预估块{{ viewsDetail.total_segments }}
</span> </span>
@@ -256,7 +271,8 @@ export default {
chunkOverlap: 400 chunkOverlap: 400
}, },
datasetDetail: {}, datasetDetail: {},
documentDetail: {}, activeIndex: 0,
documentDetail: [],
viewsDetail: {} viewsDetail: {}
} }
}, },
@@ -265,12 +281,24 @@ export default {
components: {}, components: {},
filters: {}, filters: {},
methods: { methods: {
command(index) {
if (index === this.activeIndex) {
return
}
this.activeIndex = index
this.review_logs()
},
resetForm() { resetForm() {
this.form = JSON.parse(JSON.stringify(this.reset)) this.form = JSON.parse(JSON.stringify(this.reset))
}, },
review_logs() { review_logs() {
let { documentId, active } = this.$route.query let { documentId, active } = this.$route.query
let splitDocIds = documentId.split(',')
let api = segmentEstimate let api = segmentEstimate
switch (active) { switch (active) {
case '0': case '0':
@@ -287,7 +315,7 @@ export default {
break break
} }
api({ api({
documentId, documentId: splitDocIds[this.activeIndex],
segmentConfig: { segmentConfig: {
...this.form, ...this.form,
removeExtraSpaces: this.form.removeExtraSpaces ? 1 : 0, removeExtraSpaces: this.form.removeExtraSpaces ? 1 : 0,
@@ -299,13 +327,18 @@ export default {
}, },
// 获取文档详情 // 获取文档详情
getDocumentDetail() { async getDocumentDetail() {
let { documentId } = this.$route.query let { documentId } = this.$route.query
datasetDocumentEx({ documentId }).then(res => {
if (res) { let splitDocIds = documentId.split(',')
this.documentDetail = res.content.content
} for (let i = 0; i < splitDocIds.length; i++) {
}) let content = await datasetDocumentEx({ documentId: splitDocIds[i] })
this.documentDetail.push({
name: content.content.content.knowledgeName,
id: content.content.content.id
})
}
}, },
// 获取知识库详情 // 获取知识库详情
@@ -320,6 +353,8 @@ export default {
// 保存 处理 // 保存 处理
saveUs() { saveUs() {
let { documentId, active } = this.$route.query let { documentId, active } = this.$route.query
let splitDocIds = documentId.split(',')
let api = directEmbedding let api = directEmbedding
switch (active) { switch (active) {
case '0': case '0':
@@ -336,14 +371,21 @@ export default {
break break
} }
api({ let params = {
documentId, documentId,
segmentConfig: { segmentConfig: {
...this.form, ...this.form,
removeExtraSpaces: this.form.removeExtraSpaces ? 1 : 0, removeExtraSpaces: this.form.removeExtraSpaces ? 1 : 0,
removeUrlsEmails: this.form.removeUrlsEmails ? 1 : 0 removeUrlsEmails: this.form.removeUrlsEmails ? 1 : 0
} }
}).then(res => { }
if (splitDocIds.length > 1) {
params.documentIds = splitDocIds
params.documentId = undefined
}
api(params).then(res => {
if (res) { if (res) {
this.$router.push({ this.$router.push({
path: '/knowledge/detail', path: '/knowledge/detail',
@@ -403,7 +445,7 @@ export default {
& .review { & .review {
& .title { & .title {
height: 40px; height: 40px;
line-height: 40px; //line-height: 40px;
border-bottom: 1px solid #ebeef5; border-bottom: 1px solid #ebeef5;
font-weight: 600; font-weight: 600;
font-size: 15px; font-size: 15px;