mirror of
http://112.124.100.131/ebiz-ai/ebiz-ai-knowledge-manage.git
synced 2025-12-08 10:26:48 +08:00
2025-5-20 / 新功能 - 多文件上传
这是一个完整功能 操作: 多文件上传 只有两步 不做题词拆分 点击弹窗的下拉 即可份文件预览
This commit is contained in:
9
src/assets/sass/renderSass/drop.scss
Normal file
9
src/assets/sass/renderSass/drop.scss
Normal 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;
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 =
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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() {},
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user