feat: i18n
This commit is contained in:
parent
3dcc31b3b9
commit
04a255af23
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-dialog
|
<el-dialog
|
||||||
title="生成问题"
|
:title="$t('views.document.setting.generateQuestion')"
|
||||||
v-model="dialogVisible"
|
v-model="dialogVisible"
|
||||||
width="650"
|
width="650"
|
||||||
:close-on-click-modal="false"
|
:close-on-click-modal="false"
|
||||||
|
|||||||
@ -14,6 +14,8 @@ export default {
|
|||||||
submitSuccess: 'Submitted successfully',
|
submitSuccess: 'Submitted successfully',
|
||||||
edit: 'Edit',
|
edit: 'Edit',
|
||||||
editSuccess: 'Edit Successful',
|
editSuccess: 'Edit Successful',
|
||||||
|
modify: 'Modify',
|
||||||
|
modifySuccess: 'Modify Successful',
|
||||||
cancel: 'Cancel',
|
cancel: 'Cancel',
|
||||||
confirm: 'Confirm',
|
confirm: 'Confirm',
|
||||||
tip: 'Prompt',
|
tip: 'Prompt',
|
||||||
@ -35,7 +37,6 @@ export default {
|
|||||||
paramSetting: 'Parameter Settings',
|
paramSetting: 'Parameter Settings',
|
||||||
creator: 'Creator',
|
creator: 'Creator',
|
||||||
debug: 'Debug',
|
debug: 'Debug',
|
||||||
modify: 'Modify',
|
|
||||||
required: 'Required',
|
required: 'Required',
|
||||||
noData: 'No data',
|
noData: 'No data',
|
||||||
status: {
|
status: {
|
||||||
|
|||||||
@ -14,6 +14,8 @@ export default {
|
|||||||
submitSuccess: '提交成功',
|
submitSuccess: '提交成功',
|
||||||
edit: '编辑',
|
edit: '编辑',
|
||||||
editSuccess: '编辑成功',
|
editSuccess: '编辑成功',
|
||||||
|
modify: '修改',
|
||||||
|
modifySuccess: '修改成功',
|
||||||
cancel: '取消',
|
cancel: '取消',
|
||||||
confirm: '确定',
|
confirm: '确定',
|
||||||
tip: '提示',
|
tip: '提示',
|
||||||
@ -35,7 +37,6 @@ export default {
|
|||||||
paramSetting: '参数设置',
|
paramSetting: '参数设置',
|
||||||
creator: '创建者',
|
creator: '创建者',
|
||||||
debug: '调试',
|
debug: '调试',
|
||||||
modify: '修改',
|
|
||||||
required: '必填',
|
required: '必填',
|
||||||
noData: '暂无数据',
|
noData: '暂无数据',
|
||||||
status: {
|
status: {
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
export default {
|
export default {
|
||||||
title: '知识库',
|
title: '知识库',
|
||||||
createDataset: '创建知识库',
|
createDataset: '创建知识库',
|
||||||
|
selectDataset: '选择知识库',
|
||||||
general: '通用型',
|
general: '通用型',
|
||||||
web: 'web 站点',
|
web: 'web 站点',
|
||||||
relatedApplications: '关联应用',
|
relatedApplications: '关联应用',
|
||||||
@ -57,11 +58,26 @@ export default {
|
|||||||
label: '选择器',
|
label: '选择器',
|
||||||
placeholder: '默认为 body,可输入 .classname/#idname/tagname'
|
placeholder: '默认为 body,可输入 .classname/#idname/tagname'
|
||||||
}
|
}
|
||||||
},
|
|
||||||
buttons: {},
|
|
||||||
|
|
||||||
dialog: {
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
ResultSuccess: {
|
||||||
|
title: '知识库创建成功',
|
||||||
|
paragraph: '分段',
|
||||||
|
paragraph_count: '个分段',
|
||||||
|
documentList: '文档列表',
|
||||||
|
loading: '导入中',
|
||||||
|
buttons: {
|
||||||
|
toDataset: '返回知识库列表',
|
||||||
|
toDocument: '前往文档'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
syncWeb: {
|
||||||
|
title: '同步知识库',
|
||||||
|
syncMethod: '同步方式',
|
||||||
|
replace: '替换同步',
|
||||||
|
replaceText: '重新获取 Web 站点文档,覆盖替换本地知识库中的文档',
|
||||||
|
complete: '整体同步',
|
||||||
|
completeText: '先删除本地知识库所有文档,重新获取 Web 站点文档',
|
||||||
|
tip: '注意:所有同步都会删除已有数据重新获取新数据,请谨慎操作。'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
182
ui/src/locales/lang/zh_CN/views/document.ts
Normal file
182
ui/src/locales/lang/zh_CN/views/document.ts
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
export default {
|
||||||
|
uploadDocument: '上传文档',
|
||||||
|
importDocument: '导入文档',
|
||||||
|
syncDocument: '同步文档',
|
||||||
|
selected: '已选',
|
||||||
|
items: '项',
|
||||||
|
searchBar: {
|
||||||
|
placeholder: '按 文档名称 搜索'
|
||||||
|
},
|
||||||
|
setting: {
|
||||||
|
migration: '迁移',
|
||||||
|
generateQuestion: '生成问题',
|
||||||
|
cancelGenerateQuestion: '取消生成问题',
|
||||||
|
cancelVectorization: '取消向量化',
|
||||||
|
cancelGenerate: '取消生成'
|
||||||
|
},
|
||||||
|
tip: {
|
||||||
|
saveMessage: '当前的更改尚未保存,确认退出吗?',
|
||||||
|
cancelSuccessMessage: '批量取消成功',
|
||||||
|
sendMessage: '发送成功',
|
||||||
|
vectorizationSuccessMessage: '批量向量化成功',
|
||||||
|
nameMessage: '文件名称不能为空!',
|
||||||
|
importMessage: '导入成功'
|
||||||
|
},
|
||||||
|
upload: {
|
||||||
|
selectFile: '选择文件',
|
||||||
|
selectFiles: '选择文件夹',
|
||||||
|
uploadMessage: '拖拽文件至此上传或',
|
||||||
|
formats: '支持格式:',
|
||||||
|
requiredMessage: '请上传文件',
|
||||||
|
errorMessage1: '请上传文件',
|
||||||
|
errorMessage2: '文件格式不支持',
|
||||||
|
errorMessage3: '文件不能为空',
|
||||||
|
errorMessage4: '每次最多上传50个文件',
|
||||||
|
template: '模版',
|
||||||
|
download: '下载'
|
||||||
|
},
|
||||||
|
|
||||||
|
fileType: {
|
||||||
|
txt: {
|
||||||
|
label: '文本文件',
|
||||||
|
tip1: '1、文件上传前,建议规范文件的分段标识',
|
||||||
|
tip2: '2、每次最多上传 50 个文件,每个文件不超过 100MB'
|
||||||
|
},
|
||||||
|
table: {
|
||||||
|
label: '表格',
|
||||||
|
tip1: '1、点击下载对应模版并完善信息:',
|
||||||
|
tip2: '2、第一行必须是列标题,且列标题必须是有意义的术语,表中每条记录将作为一个分段',
|
||||||
|
tip3: '3、上传的表格文件中每个 sheet 会作为一个文档,sheet名称为文档名称',
|
||||||
|
tip4: '4、每次最多上传 50 个文件,每个文件不超过 100MB'
|
||||||
|
},
|
||||||
|
QA: {
|
||||||
|
label: 'QA 问答对',
|
||||||
|
tip1: '1、点击下载对应模版并完善信息',
|
||||||
|
tip2: '2、上传的表格文件中每个 sheet 会作为一个文档,sheet名称为文档名称',
|
||||||
|
tip3: '3、每次最多上传 50 个文件,每个文件不超过 100MB'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setRules: {
|
||||||
|
title: {
|
||||||
|
setting: '设置分段规则',
|
||||||
|
preview: '分段预览'
|
||||||
|
},
|
||||||
|
intelligent: {
|
||||||
|
label: '智能分段(推荐)',
|
||||||
|
text: '不了解如何设置分段规则推荐使用智能分段'
|
||||||
|
},
|
||||||
|
advanced: {
|
||||||
|
label: '高级分段',
|
||||||
|
text: '用户可根据文档规范自行设置分段标识符、分段长度以及清洗规则'
|
||||||
|
},
|
||||||
|
patterns: {
|
||||||
|
label: '分段标识',
|
||||||
|
tooltip: '按照所选符号先后顺序做递归分割,分割结果超出分段长度将截取至分段长度。',
|
||||||
|
placeholder: '请选择'
|
||||||
|
},
|
||||||
|
limit: {
|
||||||
|
label: '分段长度'
|
||||||
|
},
|
||||||
|
with_filter: {
|
||||||
|
label: '自动清洗',
|
||||||
|
text: '去掉重复多余符号空格、空行、制表符'
|
||||||
|
},
|
||||||
|
checkedConnect: {
|
||||||
|
label: '导入时添加分段标题为关联问题(适用于标题为问题的问答对)'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
buttons: {
|
||||||
|
prev: '上一步',
|
||||||
|
next: '下一步',
|
||||||
|
import: '开始导入',
|
||||||
|
preview: '生成预览'
|
||||||
|
},
|
||||||
|
table: {
|
||||||
|
name: '文件名称',
|
||||||
|
char_length: '字符数',
|
||||||
|
paragraph: '分段',
|
||||||
|
all: '全部',
|
||||||
|
updateTime: '更新时间'
|
||||||
|
},
|
||||||
|
fileStatus: {
|
||||||
|
label: '文件状态',
|
||||||
|
SUCCESS: '成功',
|
||||||
|
FAILURE: '失败',
|
||||||
|
EMBEDDING: '索引中',
|
||||||
|
PENDING: '排队中',
|
||||||
|
GENERATE: '生成中',
|
||||||
|
SYNC: '同步中',
|
||||||
|
REVOKE: '取消中'
|
||||||
|
},
|
||||||
|
enableStatus: {
|
||||||
|
label: '启用状态',
|
||||||
|
enable: '开启',
|
||||||
|
close: '关闭'
|
||||||
|
},
|
||||||
|
sync: {
|
||||||
|
label: '同步',
|
||||||
|
confirmTitle: '确认同步文档?',
|
||||||
|
confirmMessage1: '同步将删除已有数据重新获取新数据,请谨慎操作。',
|
||||||
|
confirmMessage2: '无法同步,请先去设置文档 URL地址',
|
||||||
|
successMessage: '同步文档成功'
|
||||||
|
},
|
||||||
|
delete: {
|
||||||
|
confirmTitle1: '是否批量删除',
|
||||||
|
confirmTitle2: '个文档?',
|
||||||
|
confirmMessage: '所选文档中的分段会跟随删除,请谨慎操作。',
|
||||||
|
successMessage: '批量删除成功',
|
||||||
|
confirmTitle3: '是否删除文档:',
|
||||||
|
confirmMessage1: '此文档下的',
|
||||||
|
confirmMessage2: '个分段都会被删除,请谨慎操作。'
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
source_url: {
|
||||||
|
label: '文档地址',
|
||||||
|
placeholder: '请输入文档地址,一行一个,地址不正确文档会导入失败。',
|
||||||
|
requiredMessage: '请输入文档地址'
|
||||||
|
},
|
||||||
|
selector: {
|
||||||
|
label: '选择器',
|
||||||
|
placeholder: '默认为 body,可输入 .classname/#idname/tagname'
|
||||||
|
},
|
||||||
|
hit_handling_method: {
|
||||||
|
label: '命中处理方式',
|
||||||
|
tooltip: '用户提问时,命中文档下的分段时按照设置的方式进行处理。'
|
||||||
|
},
|
||||||
|
similarity: {
|
||||||
|
label: '相似度高于',
|
||||||
|
placeholder: '直接返回分段内容',
|
||||||
|
requiredMessage: '请输入相似度'
|
||||||
|
},
|
||||||
|
selectVectorization: {
|
||||||
|
label: '选择向量化内容',
|
||||||
|
error: '向量化未成功的分段',
|
||||||
|
all: '全部分段'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
paragraph: {
|
||||||
|
title: '段落',
|
||||||
|
editParagraph: '编辑分段',
|
||||||
|
character_count: '个字符',
|
||||||
|
delete: {
|
||||||
|
confirmTitle: '是否删除分段:',
|
||||||
|
confirmMessage: '删除后将不会存入知识库,对本地文档无影响。'
|
||||||
|
},
|
||||||
|
relatedProblem: {
|
||||||
|
title: '关联问题',
|
||||||
|
placeholder: '请选择问题'
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
paragraphTitle: {
|
||||||
|
label: '分段标题',
|
||||||
|
placeholder: '请输入分段标题'
|
||||||
|
},
|
||||||
|
content: {
|
||||||
|
label: '分段内容',
|
||||||
|
placeholder: '请输入分段内容',
|
||||||
|
requiredMessage1: '请输入分段内容',
|
||||||
|
requiredMessage2: '内容最多不超过 100000 个字'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -7,6 +7,7 @@ import functionLib from './function-lib';
|
|||||||
import user from './user';
|
import user from './user';
|
||||||
import team from './team';
|
import team from './team';
|
||||||
import template from './template';
|
import template from './template';
|
||||||
|
import document from './document';
|
||||||
export default {
|
export default {
|
||||||
notFound,
|
notFound,
|
||||||
application,
|
application,
|
||||||
@ -16,5 +17,6 @@ export default {
|
|||||||
functionLib,
|
functionLib,
|
||||||
user,
|
user,
|
||||||
team,
|
team,
|
||||||
template
|
template,
|
||||||
|
document
|
||||||
};
|
};
|
||||||
|
|||||||
@ -14,6 +14,8 @@ export default {
|
|||||||
submitSuccess: '提交成功',
|
submitSuccess: '提交成功',
|
||||||
edit: '編輯',
|
edit: '編輯',
|
||||||
editSuccess: '編輯成功',
|
editSuccess: '編輯成功',
|
||||||
|
modify: '修改',
|
||||||
|
modifySuccess: '修改成功',
|
||||||
cancel: '取消',
|
cancel: '取消',
|
||||||
confirm: '確認',
|
confirm: '確認',
|
||||||
tip: '提示',
|
tip: '提示',
|
||||||
@ -35,7 +37,6 @@ export default {
|
|||||||
paramSetting: '參數設定',
|
paramSetting: '參數設定',
|
||||||
creator: '建立者',
|
creator: '建立者',
|
||||||
debug: '調試',
|
debug: '調試',
|
||||||
modify: '修改',
|
|
||||||
required: '必填',
|
required: '必填',
|
||||||
noData: '暂无数据',
|
noData: '暂无数据',
|
||||||
status: {
|
status: {
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<LayoutContainer header="上传文档" class="create-dataset">
|
<LayoutContainer :header="$t('views.document.uploadDocument')" class="create-dataset">
|
||||||
<template #backButton>
|
<template #backButton>
|
||||||
<back-button @click="back"></back-button>
|
<back-button @click="back"></back-button>
|
||||||
</template>
|
</template>
|
||||||
@ -22,17 +22,23 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="create-dataset__footer text-right border-t" v-if="active !== 2">
|
<div class="create-dataset__footer text-right border-t" v-if="active !== 2">
|
||||||
<el-button @click="router.go(-1)" :disabled="SetRulesRef?.loading || loading">{{$t('common.cancel')}}</el-button>
|
<el-button @click="router.go(-1)" :disabled="SetRulesRef?.loading || loading">{{
|
||||||
<el-button @click="prev" v-if="active === 1" :disabled="SetRulesRef?.loading || loading"
|
$t('common.cancel')
|
||||||
>上一步</el-button
|
}}</el-button>
|
||||||
>
|
<el-button @click="prev" v-if="active === 1" :disabled="SetRulesRef?.loading || loading">{{
|
||||||
|
$t('views.document.buttons.prev')
|
||||||
|
}}</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
@click="next"
|
@click="next"
|
||||||
type="primary"
|
type="primary"
|
||||||
v-if="active === 0"
|
v-if="active === 0"
|
||||||
:disabled="SetRulesRef?.loading || loading"
|
:disabled="SetRulesRef?.loading || loading"
|
||||||
>
|
>
|
||||||
{{ documentsType === 'txt' ? '下一步' : '开始导入' }}
|
{{
|
||||||
|
documentsType === 'txt'
|
||||||
|
? $t('views.document.buttons.next')
|
||||||
|
: $t('views.document.buttons.import')
|
||||||
|
}}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
@click="submit"
|
@click="submit"
|
||||||
@ -40,7 +46,7 @@
|
|||||||
v-if="active === 1"
|
v-if="active === 1"
|
||||||
:disabled="SetRulesRef?.loading || loading"
|
:disabled="SetRulesRef?.loading || loading"
|
||||||
>
|
>
|
||||||
开始导入
|
{{ $t('views.document.buttons.import') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
</LayoutContainer>
|
</LayoutContainer>
|
||||||
@ -151,7 +157,7 @@ function submit() {
|
|||||||
}
|
}
|
||||||
function back() {
|
function back() {
|
||||||
if (documentsFiles.value?.length > 0) {
|
if (documentsFiles.value?.length > 0) {
|
||||||
MsgConfirm(t('common.tip'), `当前的更改尚未保存,确认退出吗?`, {
|
MsgConfirm(t('common.tip'), t('views.document.tip.saveMessage'), {
|
||||||
confirmButtonText: t('common.confirm'),
|
confirmButtonText: t('common.confirm'),
|
||||||
type: 'warning'
|
type: 'warning'
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-dialog
|
<el-dialog
|
||||||
title="编辑分段"
|
:title="$t('views.document.paragraph.editParagraph')"
|
||||||
v-model="dialogVisible"
|
v-model="dialogVisible"
|
||||||
width="80%"
|
width="80%"
|
||||||
destroy-on-close
|
destroy-on-close
|
||||||
@ -15,7 +15,7 @@
|
|||||||
<el-col :span="6" class="border-l" style="width: 300px">
|
<el-col :span="6" class="border-l" style="width: 300px">
|
||||||
<p class="bold title p-24" style="padding-bottom: 0">
|
<p class="bold title p-24" style="padding-bottom: 0">
|
||||||
<span class="flex align-center">
|
<span class="flex align-center">
|
||||||
<span>关联问题</span>
|
<span>{{ $t('views.document.paragraph.relatedProblem.title') }}</span>
|
||||||
<el-divider direction="vertical" class="mr-4" />
|
<el-divider direction="vertical" class="mr-4" />
|
||||||
<el-button text @click="addProblem">
|
<el-button text @click="addProblem">
|
||||||
<el-icon><Plus /></el-icon>
|
<el-icon><Plus /></el-icon>
|
||||||
@ -27,7 +27,7 @@
|
|||||||
<el-input
|
<el-input
|
||||||
v-if="isAddProblem"
|
v-if="isAddProblem"
|
||||||
v-model="problemValue"
|
v-model="problemValue"
|
||||||
placeholder="请选择问题"
|
:placeholder="$t('views.document.paragraph.relatedProblem.placeholder')"
|
||||||
@change="addProblemHandle"
|
@change="addProblemHandle"
|
||||||
@blur="isAddProblem = false"
|
@blur="isAddProblem = false"
|
||||||
ref="inputRef"
|
ref="inputRef"
|
||||||
@ -56,8 +56,8 @@
|
|||||||
|
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<span class="dialog-footer">
|
<span class="dialog-footer">
|
||||||
<el-button @click.prevent="dialogVisible = false"> {{$t('common.cancel')}} </el-button>
|
<el-button @click.prevent="dialogVisible = false"> {{ $t('common.cancel') }} </el-button>
|
||||||
<el-button type="primary" @click="submitHandle"> {{$t('common.save')}} </el-button>
|
<el-button type="primary" @click="submitHandle"> {{ $t('common.save') }} </el-button>
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|||||||
@ -31,7 +31,9 @@
|
|||||||
{{ child.content }}
|
{{ child.content }}
|
||||||
</div>
|
</div>
|
||||||
<div class="lighter mt-12">
|
<div class="lighter mt-12">
|
||||||
<el-text type="info"> {{ child.content.length }} 个字符 </el-text>
|
<el-text type="info">
|
||||||
|
{{ child.content.length }} {{ $t('views.document.paragraph.character_count') }}
|
||||||
|
</el-text>
|
||||||
</div>
|
</div>
|
||||||
</el-card>
|
</el-card>
|
||||||
</InfiniteScroll>
|
</InfiniteScroll>
|
||||||
@ -48,6 +50,7 @@ import { cloneDeep } from 'lodash'
|
|||||||
import { ref, computed } from 'vue'
|
import { ref, computed } from 'vue'
|
||||||
import EditParagraphDialog from './EditParagraphDialog.vue'
|
import EditParagraphDialog from './EditParagraphDialog.vue'
|
||||||
import { MsgConfirm } from '@/utils/message'
|
import { MsgConfirm } from '@/utils/message'
|
||||||
|
import { t } from '@/locales'
|
||||||
const page_size = ref<number>(30)
|
const page_size = ref<number>(30)
|
||||||
const current_page = ref<number>(1)
|
const current_page = ref<number>(1)
|
||||||
const currentCIndex = ref<number>(0)
|
const currentCIndex = ref<number>(0)
|
||||||
@ -78,10 +81,14 @@ const updateContent = (data: any) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const deleteHandle = (item: any, cIndex: number) => {
|
const deleteHandle = (item: any, cIndex: number) => {
|
||||||
MsgConfirm(`是否删除分段:${item.title || '-'} ?`, `删除后将不会存入知识库,对本地文档无影响。`, {
|
MsgConfirm(
|
||||||
confirmButtonText: t('common.delete'),
|
`${t('views.document.paragraph.delete.confirmTitle')}${item.title || '-'} ?`,
|
||||||
confirmButtonClass: 'danger'
|
t('views.document.paragraph.delete.confirmMessage'),
|
||||||
})
|
{
|
||||||
|
confirmButtonText: t('common.delete'),
|
||||||
|
confirmButtonClass: 'danger'
|
||||||
|
}
|
||||||
|
)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
const new_value = [...props.modelValue]
|
const new_value = [...props.modelValue]
|
||||||
new_value.splice(cIndex, 1)
|
new_value.splice(cIndex, 1)
|
||||||
|
|||||||
@ -9,7 +9,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<div class="mb-16">
|
<div class="mb-16">
|
||||||
<el-text type="info">{{ item.content.length }} 段落</el-text>
|
<el-text type="info"
|
||||||
|
>{{ item.content.length }} {{ $t('views.document.paragraph.title') }}</el-text
|
||||||
|
>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph-list" v-if="activeName == index">
|
<div class="paragraph-list" v-if="activeName == index">
|
||||||
<el-scrollbar>
|
<el-scrollbar>
|
||||||
|
|||||||
@ -1,27 +1,31 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-scrollbar>
|
<el-scrollbar>
|
||||||
<el-result icon="success" title="🎉 知识库创建成功 🎉">
|
<el-result icon="success" :title="`🎉 ${$t('views.dataset.ResultSuccess.title')} 🎉`">
|
||||||
<template #sub-title>
|
<template #sub-title>
|
||||||
<div class="mt-8">
|
<div class="mt-8">
|
||||||
<span class="bold">{{ data?.document_list.length || 0 }}</span>
|
<span class="bold">{{ data?.document_list.length || 0 }}</span>
|
||||||
<el-text type="info" class="ml-4">文档</el-text>
|
<el-text type="info" class="ml-4">{{ $t('common.document') }}</el-text>
|
||||||
<el-divider direction="vertical" />
|
<el-divider direction="vertical" />
|
||||||
<span class="bold">{{ paragraph_count || 0 }}</span>
|
<span class="bold">{{ paragraph_count || 0 }}</span>
|
||||||
<el-text type="info" class="ml-4">分段</el-text>
|
<el-text type="info" class="ml-4">{{
|
||||||
|
$t('views.dataset.ResultSuccess.paragraph')
|
||||||
|
}}</el-text>
|
||||||
<el-divider direction="vertical" />
|
<el-divider direction="vertical" />
|
||||||
<span class="bold">{{ numberFormat(char_length) || 0 }}</span>
|
<span class="bold">{{ numberFormat(char_length) || 0 }}</span>
|
||||||
<el-text type="info" class="ml-4">字符</el-text>
|
<el-text type="info" class="ml-4">{{ $t('common.character') }} </el-text>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template #extra>
|
<template #extra>
|
||||||
<el-button @click="router.push({ path: `/dataset` })">返回知识库列表</el-button>
|
<el-button @click="router.push({ path: `/dataset` })">{{
|
||||||
<el-button type="primary" @click="router.push({ path: `/dataset/${data?.id}/document` })"
|
$t('views.dataset.ResultSuccess.buttons.toDataset')
|
||||||
>前往文档</el-button
|
}}</el-button>
|
||||||
>
|
<el-button type="primary" @click="router.push({ path: `/dataset/${data?.id}/document` })">{{
|
||||||
|
$t('views.dataset.ResultSuccess.buttons.toDocument')
|
||||||
|
}}</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-result>
|
</el-result>
|
||||||
<div class="result-success">
|
<div class="result-success">
|
||||||
<p class="bolder">文档列表</p>
|
<p class="bolder">{{ $t('views.dataset.ResultSuccess.documentList') }}</p>
|
||||||
<el-card
|
<el-card
|
||||||
shadow="never"
|
shadow="never"
|
||||||
class="file-List-card mt-8"
|
class="file-List-card mt-8"
|
||||||
@ -37,7 +41,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<el-text type="info" class="mr-16">{{ item && item?.paragraph_count }} 个分段</el-text>
|
<el-text type="info" class="mr-16"
|
||||||
|
>{{ item && item?.paragraph_count }}
|
||||||
|
{{ $t('views.dataset.ResultSuccess.paragraph_count') }}</el-text
|
||||||
|
>
|
||||||
<el-text v-if="item.status === '1'">
|
<el-text v-if="item.status === '1'">
|
||||||
<el-icon class="success"><SuccessFilled /></el-icon>
|
<el-icon class="success"><SuccessFilled /></el-icon>
|
||||||
</el-text>
|
</el-text>
|
||||||
@ -45,7 +52,7 @@
|
|||||||
<el-icon class="danger"><CircleCloseFilled /></el-icon>
|
<el-icon class="danger"><CircleCloseFilled /></el-icon>
|
||||||
</el-text>
|
</el-text>
|
||||||
<el-text v-else-if="item.status === '0'">
|
<el-text v-else-if="item.status === '0'">
|
||||||
<el-icon class="is-loading primary"><Loading /></el-icon> 导入中...
|
<el-icon class="is-loading primary"><Loading /></el-icon> {{ $t('views.dataset.ResultSuccess.loading') }}...
|
||||||
</el-text>
|
</el-text>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -2,22 +2,24 @@
|
|||||||
<div class="set-rules">
|
<div class="set-rules">
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="10" class="p-24">
|
<el-col :span="10" class="p-24">
|
||||||
<h4 class="title-decoration-1 mb-16">设置分段规则</h4>
|
<h4 class="title-decoration-1 mb-16">{{ $t('views.document.setRules.title.setting') }}</h4>
|
||||||
<div class="set-rules__right">
|
<div class="set-rules__right">
|
||||||
<el-scrollbar>
|
<el-scrollbar>
|
||||||
<div class="left-height" @click.stop>
|
<div class="left-height" @click.stop>
|
||||||
<el-radio-group v-model="radio" class="set-rules__radio">
|
<el-radio-group v-model="radio" class="set-rules__radio">
|
||||||
<el-card shadow="never" class="mb-16" :class="radio === '1' ? 'active' : ''">
|
<el-card shadow="never" class="mb-16" :class="radio === '1' ? 'active' : ''">
|
||||||
<el-radio value="1" size="large">
|
<el-radio value="1" size="large">
|
||||||
<p class="mb-4">智能分段(推荐)</p>
|
<p class="mb-4">{{ $t('views.document.setRules.intelligent.label') }}</p>
|
||||||
<el-text type="info">不了解如何设置分段规则推荐使用智能分段</el-text>
|
<el-text type="info">{{
|
||||||
|
$t('views.document.setRules.intelligent.text')
|
||||||
|
}}</el-text>
|
||||||
</el-radio>
|
</el-radio>
|
||||||
</el-card>
|
</el-card>
|
||||||
<el-card shadow="never" class="mb-16" :class="radio === '2' ? 'active' : ''">
|
<el-card shadow="never" class="mb-16" :class="radio === '2' ? 'active' : ''">
|
||||||
<el-radio value="2" size="large">
|
<el-radio value="2" size="large">
|
||||||
<p class="mb-4">高级分段</p>
|
<p class="mb-4">{{ $t('views.document.setRules.advanced.label') }}</p>
|
||||||
<el-text type="info"
|
<el-text type="info">
|
||||||
>用户可根据文档规范自行设置分段标识符、分段长度以及清洗规则
|
{{ $t('views.document.setRules.advanced.text') }}
|
||||||
</el-text>
|
</el-text>
|
||||||
</el-radio>
|
</el-radio>
|
||||||
|
|
||||||
@ -30,10 +32,12 @@
|
|||||||
<div class="set-rules__form">
|
<div class="set-rules__form">
|
||||||
<div class="form-item mb-16">
|
<div class="form-item mb-16">
|
||||||
<div class="title flex align-center mb-8">
|
<div class="title flex align-center mb-8">
|
||||||
<span style="margin-right: 4px">分段标识</span>
|
<span style="margin-right: 4px">{{
|
||||||
|
$t('views.document.setRules.patterns.label')
|
||||||
|
}}</span>
|
||||||
<el-tooltip
|
<el-tooltip
|
||||||
effect="dark"
|
effect="dark"
|
||||||
content="按照所选符号先后顺序做递归分割,分割结果超出分段长度将截取至分段长度。"
|
:content="$t('views.document.setRules.patterns.tooltip')"
|
||||||
placement="right"
|
placement="right"
|
||||||
>
|
>
|
||||||
<AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon>
|
<AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon>
|
||||||
@ -46,7 +50,7 @@
|
|||||||
allow-create
|
allow-create
|
||||||
default-first-option
|
default-first-option
|
||||||
filterable
|
filterable
|
||||||
placeholder="请选择"
|
:placeholder="$t('views.document.setRules.patterns.placeholder')"
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="(item, index) in splitPatternList"
|
v-for="(item, index) in splitPatternList"
|
||||||
@ -59,7 +63,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-item mb-16">
|
<div class="form-item mb-16">
|
||||||
<div class="title mb-8">分段长度</div>
|
<div class="title mb-8">
|
||||||
|
{{ $t('views.document.setRules.limit.label') }}
|
||||||
|
</div>
|
||||||
<el-slider
|
<el-slider
|
||||||
v-model="form.limit"
|
v-model="form.limit"
|
||||||
show-input
|
show-input
|
||||||
@ -69,10 +75,14 @@
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-item mb-16">
|
<div class="form-item mb-16">
|
||||||
<div class="title mb-8">自动清洗</div>
|
<div class="title mb-8">
|
||||||
|
{{ $t('views.document.setRules.with_filter.label') }}
|
||||||
|
</div>
|
||||||
<el-switch size="small" v-model="form.with_filter" />
|
<el-switch size="small" v-model="form.with_filter" />
|
||||||
<div style="margin-top: 4px">
|
<div style="margin-top: 4px">
|
||||||
<el-text type="info">去掉重复多余符号空格、空行、制表符</el-text>
|
<el-text type="info">
|
||||||
|
{{ $t('views.document.setRules.with_filter.text') }}</el-text
|
||||||
|
>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -82,19 +92,23 @@
|
|||||||
</div>
|
</div>
|
||||||
</el-scrollbar>
|
</el-scrollbar>
|
||||||
<div>
|
<div>
|
||||||
<el-checkbox v-model="checkedConnect" @change="changeHandle" style="white-space: normal;">
|
<el-checkbox
|
||||||
导入时添加分段标题为关联问题(适用于标题为问题的问答对)
|
v-model="checkedConnect"
|
||||||
|
@change="changeHandle"
|
||||||
|
style="white-space: normal"
|
||||||
|
>
|
||||||
|
{{ $t('views.document.setRules.checkedConnect.label') }}
|
||||||
</el-checkbox>
|
</el-checkbox>
|
||||||
</div>
|
</div>
|
||||||
<div class="text-right mt-8">
|
<div class="text-right mt-8">
|
||||||
<el-button @click="splitDocument">生成预览</el-button>
|
<el-button @click="splitDocument"> {{ $t('views.document.setRules.buttons.preview') }}</el-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
|
||||||
<el-col :span="14" class="p-24 border-l">
|
<el-col :span="14" class="p-24 border-l">
|
||||||
<div v-loading="loading">
|
<div v-loading="loading">
|
||||||
<h4 class="title-decoration-1 mb-8">分段预览</h4>
|
<h4 class="title-decoration-1 mb-8">{{ $t('views.document.setRules.title.preview') }}</h4>
|
||||||
|
|
||||||
<ParagraphPreview v-model:data="paragraphList" :isConnect="checkedConnect" />
|
<ParagraphPreview v-model:data="paragraphList" :isConnect="checkedConnect" />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,32 +1,32 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-dialog
|
<el-dialog
|
||||||
title="同步知识库"
|
:title="$t('views.dataset.syncWeb.title')"
|
||||||
v-model="dialogVisible"
|
v-model="dialogVisible"
|
||||||
width="600px"
|
width="600px"
|
||||||
:close-on-click-modal="false"
|
:close-on-click-modal="false"
|
||||||
:close-on-press-escape="false"
|
:close-on-press-escape="false"
|
||||||
:destroy-on-close="true"
|
:destroy-on-close="true"
|
||||||
>
|
>
|
||||||
<p class="mb-8">同步方式</p>
|
<p class="mb-8">{{ $t('views.dataset.syncWeb.syncMethod') }}</p>
|
||||||
<el-radio-group v-model="method" class="card__radio">
|
<el-radio-group v-model="method" class="card__radio">
|
||||||
<el-card shadow="never" class="mb-16" :class="method === 'replace' ? 'active' : ''">
|
<el-card shadow="never" class="mb-16" :class="method === 'replace' ? 'active' : ''">
|
||||||
<el-radio value="replace" size="large">
|
<el-radio value="replace" size="large">
|
||||||
<p class="mb-4">替换同步</p>
|
<p class="mb-4">{{ $t('views.dataset.syncWeb.replace') }}</p>
|
||||||
<el-text type="info">重新获取 Web 站点文档,覆盖替换本地知识库中的文档</el-text>
|
<el-text type="info">{{ $t('views.dataset.syncWeb.replaceText') }}</el-text>
|
||||||
</el-radio>
|
</el-radio>
|
||||||
</el-card>
|
</el-card>
|
||||||
|
|
||||||
<el-card shadow="never" class="mb-16" :class="method === 'complete' ? 'active' : ''">
|
<el-card shadow="never" class="mb-16" :class="method === 'complete' ? 'active' : ''">
|
||||||
<el-radio value="complete" size="large">
|
<el-radio value="complete" size="large">
|
||||||
<p class="mb-4">整体同步</p>
|
<p class="mb-4">{{ $t('views.dataset.syncWeb.complete') }}</p>
|
||||||
<el-text type="info">先删除本地知识库所有文档,重新获取 Web 站点文档</el-text>
|
<el-text type="info">{{ $t('views.dataset.syncWeb.completeText') }}</el-text>
|
||||||
</el-radio>
|
</el-radio>
|
||||||
</el-card>
|
</el-card>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
<p class="danger">注意:所有同步都会删除已有数据重新获取新数据,请谨慎操作。</p>
|
<p class="danger">{{ $t('views.dataset.syncWeb.tip') }}</p>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<span class="dialog-footer">
|
<span class="dialog-footer">
|
||||||
<el-button @click.prevent="dialogVisible = false"> {{$t('common.cancel')}} </el-button>
|
<el-button @click.prevent="dialogVisible = false"> {{ $t('common.cancel') }} </el-button>
|
||||||
<el-button type="primary" @click="submit" :loading="loading">
|
<el-button type="primary" @click="submit" :loading="loading">
|
||||||
{{ $t('common.confirm') }}
|
{{ $t('common.confirm') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<h4 class="title-decoration-1 mb-8">上传文档</h4>
|
<h4 class="title-decoration-1 mb-8">{{ $t('views.document.uploadDocument') }}</h4>
|
||||||
<el-form
|
<el-form
|
||||||
ref="FormRef"
|
ref="FormRef"
|
||||||
:model="form"
|
:model="form"
|
||||||
@ -9,9 +9,11 @@
|
|||||||
>
|
>
|
||||||
<div class="mt-16 mb-16">
|
<div class="mt-16 mb-16">
|
||||||
<el-radio-group v-model="form.fileType" @change="radioChange" class="app-radio-button-group">
|
<el-radio-group v-model="form.fileType" @change="radioChange" class="app-radio-button-group">
|
||||||
<el-radio-button value="txt">文本文件</el-radio-button>
|
<el-radio-button value="txt">{{ $t('views.document.fileType.txt.label') }}</el-radio-button>
|
||||||
<el-radio-button value="table">表格</el-radio-button>
|
<el-radio-button value="table">{{
|
||||||
<el-radio-button value="QA">QA 问答对</el-radio-button>
|
$t('views.document.fileType.table.label')
|
||||||
|
}}</el-radio-button>
|
||||||
|
<el-radio-button value="QA">{{ $t('views.document.fileType.QA.label') }}</el-radio-button>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -22,16 +24,18 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="ml-16 lighter">
|
<div class="ml-16 lighter">
|
||||||
<p>
|
<p>
|
||||||
1、点击下载对应模版并完善信息:
|
{{ $t('views.document.fileType.QA.tip1') }}
|
||||||
<el-button type="primary" link @click="downloadTemplate('excel')">
|
<el-button type="primary" link @click="downloadTemplate('excel')">
|
||||||
下载 Excel 模版
|
{{ $t('views.document.upload.download') }} Excel
|
||||||
|
{{ $t('views.document.upload.template') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button type="primary" link @click="downloadTemplate('csv')">
|
<el-button type="primary" link @click="downloadTemplate('csv')">
|
||||||
下载 CSV 模版
|
{{ $t('views.document.upload.download') }} CSV
|
||||||
|
{{ $t('views.document.upload.template') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</p>
|
</p>
|
||||||
<p>2、上传的表格文件中每个 sheet 会作为一个文档,sheet名称为文档名称</p>
|
<p>{{ $t('views.document.fileType.QA.tip2') }}</p>
|
||||||
<p>3、每次最多上传 50 个文件,每个文件不超过 100MB</p>
|
<p>{{ $t('views.document.fileType.QA.tip3') }}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<el-upload
|
<el-upload
|
||||||
@ -52,12 +56,16 @@
|
|||||||
<img src="@/assets/upload-icon.svg" alt="" />
|
<img src="@/assets/upload-icon.svg" alt="" />
|
||||||
<div class="el-upload__text">
|
<div class="el-upload__text">
|
||||||
<p>
|
<p>
|
||||||
拖拽文件至此上传或
|
{{ $t('views.document.upload.uploadMessage') }}
|
||||||
<em class="hover" @click.prevent="handlePreview(false)"> 选择文件 </em>
|
<em class="hover" @click.prevent="handlePreview(false)">
|
||||||
<em class="hover" @click.prevent="handlePreview(true)"> 选择文件夹 </em>
|
{{ $t('views.document.upload.selectFile') }}
|
||||||
|
</em>
|
||||||
|
<em class="hove ml-4" @click.prevent="handlePreview(true)">
|
||||||
|
{{ $t('views.document.upload.selectFiles') }}
|
||||||
|
</em>
|
||||||
</p>
|
</p>
|
||||||
<div class="upload__decoration">
|
<div class="upload__decoration">
|
||||||
<p>支持格式:XLS、XLSX、CSV、ZIP</p>
|
<p>{{ $t('views.document.upload.formats') }}XLS、XLSX、CSV、ZIP</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-upload>
|
</el-upload>
|
||||||
@ -69,17 +77,19 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="ml-16 lighter">
|
<div class="ml-16 lighter">
|
||||||
<p>
|
<p>
|
||||||
1、点击下载对应模版并完善信息:
|
{{ $t('views.document.fileType.table.tip1') }}
|
||||||
<el-button type="primary" link @click="downloadTableTemplate('excel')">
|
<el-button type="primary" link @click="downloadTableTemplate('excel')">
|
||||||
下载 Excel 模版
|
{{ $t('views.document.upload.download') }} Excel
|
||||||
|
{{ $t('views.document.upload.template') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button type="primary" link @click="downloadTableTemplate('csv')">
|
<el-button type="primary" link @click="downloadTableTemplate('csv')">
|
||||||
下载 CSV 模版
|
{{ $t('views.document.upload.download') }} CSV
|
||||||
|
{{ $t('views.document.upload.template') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</p>
|
</p>
|
||||||
<p>2、第一行必须是列标题,且列标题必须是有意义的术语,表中每条记录将作为一个分段</p>
|
<p>{{ $t('views.document.fileType.table.tip2') }}</p>
|
||||||
<p>3、上传的表格文件中每个 sheet 会作为一个文档,sheet名称为文档名称</p>
|
<p>{{ $t('views.document.fileType.table.tip3') }}</p>
|
||||||
<p>4、每次最多上传 50 个文件,每个文件不超过 100MB</p>
|
<p>{{ $t('views.document.fileType.table.tip4') }}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<el-upload
|
<el-upload
|
||||||
@ -100,12 +110,16 @@
|
|||||||
<img src="@/assets/upload-icon.svg" alt="" />
|
<img src="@/assets/upload-icon.svg" alt="" />
|
||||||
<div class="el-upload__text">
|
<div class="el-upload__text">
|
||||||
<p>
|
<p>
|
||||||
拖拽文件至此上传或
|
{{ $t('views.document.upload.uploadMessage') }}
|
||||||
<em class="hover" @click.prevent="handlePreview(false)"> 选择文件 </em>
|
<em class="hover" @click.prevent="handlePreview(false)">
|
||||||
<em class="hover" @click.prevent="handlePreview(true)"> 选择文件夹 </em>
|
{{ $t('views.document.upload.selectFile') }}
|
||||||
|
</em>
|
||||||
|
<em class="hover ml-4" @click.prevent="handlePreview(true)">
|
||||||
|
{{ $t('views.document.upload.selectFiles') }}
|
||||||
|
</em>
|
||||||
</p>
|
</p>
|
||||||
<div class="upload__decoration">
|
<div class="upload__decoration">
|
||||||
<p>支持格式:XLS、XLSX、CSV、ZIP</p>
|
<p>{{ $t('views.document.upload.formats') }}XLS、XLSX、CSV、ZIP</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-upload>
|
</el-upload>
|
||||||
@ -116,8 +130,8 @@
|
|||||||
<AppIcon iconName="app-warning-colorful" style="font-size: 16px"></AppIcon>
|
<AppIcon iconName="app-warning-colorful" style="font-size: 16px"></AppIcon>
|
||||||
</div>
|
</div>
|
||||||
<div class="ml-16 lighter">
|
<div class="ml-16 lighter">
|
||||||
<p>1、文件上传前,建议规范文件的分段标识</p>
|
<p>{{ $t('views.document.fileType.table.tip1') }}</p>
|
||||||
<p>2、每次最多上传 50 个文件,每个文件不超过 100MB</p>
|
<p>{{ $t('views.document.fileType.table.tip2') }}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<el-upload
|
<el-upload
|
||||||
@ -138,12 +152,16 @@
|
|||||||
<img src="@/assets/upload-icon.svg" alt="" />
|
<img src="@/assets/upload-icon.svg" alt="" />
|
||||||
<div class="el-upload__text">
|
<div class="el-upload__text">
|
||||||
<p>
|
<p>
|
||||||
拖拽文件至此上传或
|
{{ $t('views.document.upload.uploadMessage') }}
|
||||||
<em class="hover" @click.prevent="handlePreview(false)"> 选择文件 </em>
|
<em class="hover" @click.prevent="handlePreview(false)">
|
||||||
<em class="hover" @click.prevent="handlePreview(true)"> 选择文件夹 </em>
|
{{ $t('views.document.upload.selectFile') }}
|
||||||
|
</em>
|
||||||
|
<em class="hover ml-4" @click.prevent="handlePreview(true)">
|
||||||
|
{{ $t('views.document.upload.selectFiles') }}
|
||||||
|
</em>
|
||||||
</p>
|
</p>
|
||||||
<div class="upload__decoration">
|
<div class="upload__decoration">
|
||||||
<p>支持格式:TXT、Markdown、PDF、DOCX、HTML、XLS、XLSX、CSV、ZIP</p>
|
<p>{{ $t('views.document.upload.formats') }}TXT、Markdown、PDF、DOCX、HTML、XLS、XLSX、CSV、ZIP</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-upload>
|
</el-upload>
|
||||||
@ -179,6 +197,7 @@ import { filesize, getImgUrl, isRightType } from '@/utils/utils'
|
|||||||
import { MsgError } from '@/utils/message'
|
import { MsgError } from '@/utils/message'
|
||||||
import documentApi from '@/api/document'
|
import documentApi from '@/api/document'
|
||||||
import useStore from '@/stores'
|
import useStore from '@/stores'
|
||||||
|
import { t } from '@/locales'
|
||||||
const { dataset } = useStore()
|
const { dataset } = useStore()
|
||||||
const documentsFiles = computed(() => dataset.documentsFiles)
|
const documentsFiles = computed(() => dataset.documentsFiles)
|
||||||
const documentsType = computed(() => dataset.documentsType)
|
const documentsType = computed(() => dataset.documentsType)
|
||||||
@ -188,7 +207,7 @@ const form = ref({
|
|||||||
})
|
})
|
||||||
|
|
||||||
const rules = reactive({
|
const rules = reactive({
|
||||||
fileList: [{ required: true, message: '请上传文件', trigger: 'change' }]
|
fileList: [{ required: true, message: t('views.document.upload.requiredMessage'), trigger: 'change' }]
|
||||||
})
|
})
|
||||||
const FormRef = ref()
|
const FormRef = ref()
|
||||||
|
|
||||||
@ -198,11 +217,11 @@ watch(form.value, (value) => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
function downloadTemplate(type: string) {
|
function downloadTemplate(type: string) {
|
||||||
documentApi.exportQATemplate(`${type}模版.${type == 'csv' ? type : 'xlsx'}`, type)
|
documentApi.exportQATemplate(`${type}${t('views.document.upload.template')}.${type == 'csv' ? type : 'xlsx'}`, type)
|
||||||
}
|
}
|
||||||
|
|
||||||
function downloadTableTemplate(type: string) {
|
function downloadTableTemplate(type: string) {
|
||||||
documentApi.exportTableTemplate(`${type}模版.${type == 'csv' ? type : 'xlsx'}`, type)
|
documentApi.exportTableTemplate(`${type}${t('views.document.upload.template')}.${type == 'csv' ? type : 'xlsx'}`, type)
|
||||||
}
|
}
|
||||||
|
|
||||||
function radioChange() {
|
function radioChange() {
|
||||||
@ -218,24 +237,24 @@ const fileHandleChange = (file: any, fileList: UploadFiles) => {
|
|||||||
//1、判断文件大小是否合法,文件限制不能大于100M
|
//1、判断文件大小是否合法,文件限制不能大于100M
|
||||||
const isLimit = file?.size / 1024 / 1024 < 100
|
const isLimit = file?.size / 1024 / 1024 < 100
|
||||||
if (!isLimit) {
|
if (!isLimit) {
|
||||||
MsgError('文件大小超过 100MB')
|
MsgError(t('views.document.upload.errorMessage1'))
|
||||||
fileList.splice(-1, 1) //移除当前超出大小的文件
|
fileList.splice(-1, 1) //移除当前超出大小的文件
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if (!isRightType(file?.name, form.value.fileType)) {
|
if (!isRightType(file?.name, form.value.fileType)) {
|
||||||
MsgError('文件格式不支持')
|
MsgError(t('views.document.upload.errorMessage2'))
|
||||||
fileList.splice(-1, 1)
|
fileList.splice(-1, 1)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if (file?.size === 0) {
|
if (file?.size === 0) {
|
||||||
MsgError('文件不能为空')
|
MsgError(t('views.document.upload.errorMessage3'))
|
||||||
fileList.splice(-1, 1)
|
fileList.splice(-1, 1)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const onExceed = () => {
|
const onExceed = () => {
|
||||||
MsgError('每次最多上传50个文件')
|
MsgError(t('views.document.upload.errorMessage4'))
|
||||||
}
|
}
|
||||||
|
|
||||||
const handlePreview = (bool: boolean) => {
|
const handlePreview = (bool: boolean) => {
|
||||||
|
|||||||
@ -1,13 +1,22 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-dialog v-model="dialogVisible" title="选择向量化内容" width="500" :before-close="close">
|
<el-dialog
|
||||||
|
v-model="dialogVisible"
|
||||||
|
:title="$t('views.document.form.selectVectorization.label')"
|
||||||
|
width="500"
|
||||||
|
:before-close="close"
|
||||||
|
>
|
||||||
<el-radio-group v-model="state">
|
<el-radio-group v-model="state">
|
||||||
<el-radio value="error" size="large">向量化未成功的分段</el-radio>
|
<el-radio value="error" size="large">{{
|
||||||
<el-radio value="all" size="large">全部分段</el-radio>
|
$t('views.document.form.selectVectorization.error')
|
||||||
|
}}</el-radio>
|
||||||
|
<el-radio value="all" size="large">{{
|
||||||
|
$t('views.document.form.selectVectorization.all')
|
||||||
|
}}</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<div class="dialog-footer">
|
<div class="dialog-footer">
|
||||||
<el-button @click="close">取消</el-button>
|
<el-button @click="close">{{ $t('common.cancel') }} </el-button>
|
||||||
<el-button type="primary" @click="submit"> 提交 </el-button>
|
<el-button type="primary" @click="submit"> {{ $t('common.submit') }} </el-button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|||||||
@ -13,34 +13,43 @@
|
|||||||
:model="form"
|
:model="form"
|
||||||
require-asterisk-position="right"
|
require-asterisk-position="right"
|
||||||
>
|
>
|
||||||
<el-form-item label="文档地址" prop="source_url" v-if="isImport">
|
<el-form-item
|
||||||
|
:label="$t('views.document.form.source_url.label')"
|
||||||
|
prop="source_url"
|
||||||
|
v-if="isImport"
|
||||||
|
>
|
||||||
<el-input
|
<el-input
|
||||||
v-model="form.source_url"
|
v-model="form.source_url"
|
||||||
placeholder="请输入文档地址,一行一个,地址不正确文档会导入失败。"
|
:placeholder="$t('views.document.form.source_url.placeholder')"
|
||||||
:rows="10"
|
:rows="10"
|
||||||
type="textarea"
|
type="textarea"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item
|
<el-form-item
|
||||||
v-else-if="!isImport && documentType === '1'"
|
v-else-if="!isImport && documentType === '1'"
|
||||||
label="文档地址"
|
:label="$t('views.document.form.source_url.label')"
|
||||||
prop="source_url"
|
prop="source_url"
|
||||||
>
|
>
|
||||||
<el-input v-model="form.source_url" placeholder="请输入文档地址" />
|
<el-input
|
||||||
|
v-model="form.source_url"
|
||||||
|
:placeholder="$t('views.document.form.source_url.requiredMessage')"
|
||||||
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="选择器" v-if="documentType === '1'">
|
<el-form-item :label="$t('views.document.form.selector.label')" v-if="documentType === '1'">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="form.selector"
|
v-model="form.selector"
|
||||||
placeholder="默认为 body,可输入 .classname/#idname/tagname"
|
:placeholder="$t('views.document.form.selector.placeholder')"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item v-if="!isImport">
|
<el-form-item v-if="!isImport">
|
||||||
<template #label>
|
<template #label>
|
||||||
<div class="flex align-center">
|
<div class="flex align-center">
|
||||||
<span class="mr-4">命中处理方式</span>
|
<span class="mr-4">{{
|
||||||
|
$t('views.document.form.hit_handling_method.requiredMessage')
|
||||||
|
}}</span>
|
||||||
<el-tooltip
|
<el-tooltip
|
||||||
effect="dark"
|
effect="dark"
|
||||||
content="用户提问时,命中文档下的分段时按照设置的方式进行处理。"
|
:content="$t('views.document.form.hit_handling_method.tooltip')"
|
||||||
placement="right"
|
placement="right"
|
||||||
>
|
>
|
||||||
<AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon>
|
<AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon>
|
||||||
@ -58,7 +67,7 @@
|
|||||||
v-if="!isImport && form.hit_handling_method === 'directly_return'"
|
v-if="!isImport && form.hit_handling_method === 'directly_return'"
|
||||||
>
|
>
|
||||||
<div class="lighter w-full" style="margin-top: -20px">
|
<div class="lighter w-full" style="margin-top: -20px">
|
||||||
<span>相似度高于</span>
|
<span>{{ $t('views.document.form.similarity.label') }}</span>
|
||||||
<el-input-number
|
<el-input-number
|
||||||
v-model="form.directly_return_similarity"
|
v-model="form.directly_return_similarity"
|
||||||
:min="0"
|
:min="0"
|
||||||
@ -69,7 +78,7 @@
|
|||||||
controls-position="right"
|
controls-position="right"
|
||||||
size="small"
|
size="small"
|
||||||
class="ml-4 mr-4"
|
class="ml-4 mr-4"
|
||||||
/><span>直接返回分段内容</span>
|
/><span>{{ $t('views.document.form.similarity.placeholder') }}</span>
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
@ -90,7 +99,7 @@ import type { FormInstance } from 'element-plus'
|
|||||||
import documentApi from '@/api/document'
|
import documentApi from '@/api/document'
|
||||||
import { MsgSuccess } from '@/utils/message'
|
import { MsgSuccess } from '@/utils/message'
|
||||||
import { hitHandlingMethod } from '@/enums/document'
|
import { hitHandlingMethod } from '@/enums/document'
|
||||||
|
import { t } from '@/locales'
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const {
|
const {
|
||||||
params: { id }
|
params: { id }
|
||||||
@ -119,8 +128,20 @@ const documentType = ref<string | number>('') //文档类型:1: web文档;0:
|
|||||||
const documentList = ref<Array<string>>([])
|
const documentList = ref<Array<string>>([])
|
||||||
|
|
||||||
const rules = reactive({
|
const rules = reactive({
|
||||||
source_url: [{ required: true, message: '请输入文档地址', trigger: 'blur' }],
|
source_url: [
|
||||||
directly_return_similarity: [{ required: true, message: '请输入相似度', trigger: 'blur' }]
|
{
|
||||||
|
required: true,
|
||||||
|
message: t('views.document.form.source_url.requiredMessage'),
|
||||||
|
trigger: 'blur'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
directly_return_similarity: [
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: t('views.document.form.similarity.requiredMessage'),
|
||||||
|
trigger: 'blur'
|
||||||
|
}
|
||||||
|
]
|
||||||
})
|
})
|
||||||
|
|
||||||
const dialogVisible = ref<boolean>(false)
|
const dialogVisible = ref<boolean>(false)
|
||||||
@ -171,7 +192,7 @@ const submit = async (formEl: FormInstance | undefined) => {
|
|||||||
selector: form.value.selector
|
selector: form.value.selector
|
||||||
}
|
}
|
||||||
documentApi.postWebDocument(id, obj, loading).then(() => {
|
documentApi.postWebDocument(id, obj, loading).then(() => {
|
||||||
MsgSuccess('导入成功')
|
MsgSuccess(t('views.document.tip.importMessage'))
|
||||||
emit('refresh')
|
emit('refresh')
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
})
|
})
|
||||||
@ -186,7 +207,7 @@ const submit = async (formEl: FormInstance | undefined) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
documentApi.putDocument(id, documentId.value, obj, loading).then(() => {
|
documentApi.putDocument(id, documentId.value, obj, loading).then(() => {
|
||||||
MsgSuccess('设置成功')
|
MsgSuccess(t('common.settingSuccess'))
|
||||||
emit('refresh')
|
emit('refresh')
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
})
|
})
|
||||||
@ -198,7 +219,7 @@ const submit = async (formEl: FormInstance | undefined) => {
|
|||||||
id_list: documentList.value
|
id_list: documentList.value
|
||||||
}
|
}
|
||||||
documentApi.batchEditHitHandling(id, obj, loading).then(() => {
|
documentApi.batchEditHitHandling(id, obj, loading).then(() => {
|
||||||
MsgSuccess('设置成功')
|
MsgSuccess(t('common.settingSuccess'))
|
||||||
emit('refresh')
|
emit('refresh')
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-dialog
|
<el-dialog
|
||||||
title="选择知识库"
|
:title="$t('views.dataset.selectDataset')"
|
||||||
v-model="dialogVisible"
|
v-model="dialogVisible"
|
||||||
width="600"
|
width="600"
|
||||||
class="select-dataset-dialog"
|
class="select-dataset-dialog"
|
||||||
@ -9,9 +9,9 @@
|
|||||||
>
|
>
|
||||||
<template #header="{ titleId, titleClass }">
|
<template #header="{ titleId, titleClass }">
|
||||||
<div class="my-header flex">
|
<div class="my-header flex">
|
||||||
<h4 :id="titleId" :class="titleClass">选择知识库</h4>
|
<h4 :id="titleId" :class="titleClass">{{$t('views.dataset.selectDataset')}}</h4>
|
||||||
<el-button link class="ml-16" @click="refresh">
|
<el-button link class="ml-16" @click="refresh">
|
||||||
<el-icon class="mr-4"><Refresh /></el-icon>刷新
|
<el-icon class="mr-4"><Refresh /></el-icon>{{ $t('common.refresh') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -42,6 +42,7 @@
|
|||||||
import { computed, ref } from 'vue'
|
import { computed, ref } from 'vue'
|
||||||
import { TaskType, State } from '@/utils/status'
|
import { TaskType, State } from '@/utils/status'
|
||||||
import StatusTable from '@/views/document/component/StatusTable.vue'
|
import StatusTable from '@/views/document/component/StatusTable.vue'
|
||||||
|
import { t } from '@/locales'
|
||||||
const props = defineProps<{ status: string; statusMeta: any }>()
|
const props = defineProps<{ status: string; statusMeta: any }>()
|
||||||
const visible = ref<boolean>(false)
|
const visible = ref<boolean>(false)
|
||||||
const checkList: Array<string> = [
|
const checkList: Array<string> = [
|
||||||
@ -65,22 +66,22 @@ const aggStatus = computed(() => {
|
|||||||
return obj
|
return obj
|
||||||
})
|
})
|
||||||
const startedMap = {
|
const startedMap = {
|
||||||
[TaskType.EMBEDDING]: '索引中',
|
[TaskType.EMBEDDING]: t('views.document.fileStatus.EMBEDDING'),
|
||||||
[TaskType.GENERATE_PROBLEM]: '生成中',
|
[TaskType.GENERATE_PROBLEM]: t('views.document.fileStatus.GENERATE'),
|
||||||
[TaskType.SYNC]: '同步中'
|
[TaskType.SYNC]: t('views.document.fileStatus.SYNC')
|
||||||
}
|
}
|
||||||
const taskTypeMap = {
|
const taskTypeMap = {
|
||||||
[TaskType.EMBEDDING]: '向量化',
|
[TaskType.EMBEDDING]: t('views.dataset.setting.vectorization'),
|
||||||
[TaskType.GENERATE_PROBLEM]: '生成问题',
|
[TaskType.GENERATE_PROBLEM]: t('views.document.setting.generateQuestion'),
|
||||||
[TaskType.SYNC]: '同步'
|
[TaskType.SYNC]: t('views.dataset.setting.sync')
|
||||||
}
|
}
|
||||||
const stateMap: any = {
|
const stateMap: any = {
|
||||||
[State.PENDING]: (type: number) => '排队中',
|
[State.PENDING]: (type: number) => t('views.document.fileStatus.PENDING'),
|
||||||
[State.STARTED]: (type: number) => startedMap[type],
|
[State.STARTED]: (type: number) => startedMap[type],
|
||||||
[State.REVOKE]: (type: number) => '取消中',
|
[State.REVOKE]: (type: number) => t('views.document.fileStatus.REVOKE'),
|
||||||
[State.REVOKED]: (type: number) => '成功',
|
[State.REVOKED]: (type: number) => t('views.document.fileStatus.SUCCESS'),
|
||||||
[State.FAILURE]: (type: number) => '失败',
|
[State.FAILURE]: (type: number) => t('views.document.fileStatus.FAILURE'),
|
||||||
[State.SUCCESS]: (type: number) => '成功'
|
[State.SUCCESS]: (type: number) => t('views.document.fileStatus.SUCCESS'),
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped></style>
|
<style lang="scss" scoped></style>
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<LayoutContainer header="文档" class="document-main">
|
<LayoutContainer :header="$t('common.document')" class="document-main">
|
||||||
<div class="main-calc-height">
|
<div class="main-calc-height">
|
||||||
<div class="p-24">
|
<div class="p-24">
|
||||||
<div class="flex-between">
|
<div class="flex-between">
|
||||||
@ -8,28 +8,28 @@
|
|||||||
v-if="datasetDetail.type === '0'"
|
v-if="datasetDetail.type === '0'"
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="router.push({ path: '/dataset/upload', query: { id: id } })"
|
@click="router.push({ path: '/dataset/upload', query: { id: id } })"
|
||||||
>上传文档</el-button
|
>{{ $t('views.document.uploadDocument') }}</el-button
|
||||||
>
|
|
||||||
<el-button v-if="datasetDetail.type === '1'" type="primary" @click="importDoc"
|
|
||||||
>导入文档</el-button
|
|
||||||
>
|
>
|
||||||
|
<el-button v-if="datasetDetail.type === '1'" type="primary" @click="importDoc">{{
|
||||||
|
$t('views.document.importDocument')
|
||||||
|
}}</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
@click="syncMulDocument"
|
@click="syncMulDocument"
|
||||||
:disabled="multipleSelection.length === 0"
|
:disabled="multipleSelection.length === 0"
|
||||||
v-if="datasetDetail.type === '1'"
|
v-if="datasetDetail.type === '1'"
|
||||||
>同步文档</el-button
|
>{{ $t('views.document.syncDocument') }}</el-button
|
||||||
>
|
>
|
||||||
<el-button @click="openDatasetDialog()" :disabled="multipleSelection.length === 0">
|
<el-button @click="openDatasetDialog()" :disabled="multipleSelection.length === 0">
|
||||||
迁移
|
{{ $t('views.document.setting.migration') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button @click="batchRefresh" :disabled="multipleSelection.length === 0">
|
<el-button @click="batchRefresh" :disabled="multipleSelection.length === 0">
|
||||||
向量化
|
{{ $t('views.dataset.setting.vectorization') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button @click="openGenerateDialog()" :disabled="multipleSelection.length === 0">
|
<el-button @click="openGenerateDialog()" :disabled="multipleSelection.length === 0">
|
||||||
生成问题
|
{{ $t('views.document.setting.generateQuestion') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button @click="openBatchEditDocument" :disabled="multipleSelection.length === 0">
|
<el-button @click="openBatchEditDocument" :disabled="multipleSelection.length === 0">
|
||||||
设置
|
{{ $t('common.setting') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button @click="deleteMulDocument" :disabled="multipleSelection.length === 0">
|
<el-button @click="deleteMulDocument" :disabled="multipleSelection.length === 0">
|
||||||
{{ $t('common.delete') }}
|
{{ $t('common.delete') }}
|
||||||
@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
<el-input
|
<el-input
|
||||||
v-model="filterText"
|
v-model="filterText"
|
||||||
placeholder="按 文档名称 搜索"
|
:placeholder="$t('views.dataset.searchBar.placeholder')"
|
||||||
prefix-icon="Search"
|
prefix-icon="Search"
|
||||||
class="w-240"
|
class="w-240"
|
||||||
@change="getList"
|
@change="getList"
|
||||||
@ -63,7 +63,7 @@
|
|||||||
:storeKey="storeKey"
|
:storeKey="storeKey"
|
||||||
>
|
>
|
||||||
<el-table-column type="selection" width="55" :reserve-selection="true" />
|
<el-table-column type="selection" width="55" :reserve-selection="true" />
|
||||||
<el-table-column prop="name" label="文件名称" min-width="280">
|
<el-table-column prop="name" :label="$t('views.document.table.name')" min-width="280">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<ReadWrite
|
<ReadWrite
|
||||||
@change="editName($event, row.id)"
|
@change="editName($event, row.id)"
|
||||||
@ -72,16 +72,28 @@
|
|||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="char_length" label="字符数" align="right">
|
<el-table-column
|
||||||
|
prop="char_length"
|
||||||
|
:label="$t('views.document.table.char_length')"
|
||||||
|
align="right"
|
||||||
|
>
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
{{ numberFormat(row.char_length) }}
|
{{ numberFormat(row.char_length) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="paragraph_count" label="分段" align="right" />
|
<el-table-column
|
||||||
<el-table-column prop="status" label="文件状态" width="130">
|
prop="paragraph_count"
|
||||||
|
:label="$t('views.document.table.paragraph')"
|
||||||
|
align="right"
|
||||||
|
/>
|
||||||
|
<el-table-column
|
||||||
|
prop="status"
|
||||||
|
:label="$t('views.document.fileStatus.label')"
|
||||||
|
width="130"
|
||||||
|
>
|
||||||
<template #header>
|
<template #header>
|
||||||
<div>
|
<div>
|
||||||
<span>文件状态</span>
|
<span>{{ $t('views.document.fileStatus.label') }}</span>
|
||||||
<el-dropdown trigger="click" @command="dropdownHandle">
|
<el-dropdown trigger="click" @command="dropdownHandle">
|
||||||
<el-button
|
<el-button
|
||||||
style="margin-top: 1px"
|
style="margin-top: 1px"
|
||||||
@ -96,19 +108,19 @@
|
|||||||
:class="filterMethod['status'] ? '' : 'is-active'"
|
:class="filterMethod['status'] ? '' : 'is-active'"
|
||||||
:command="beforeCommand('status', '')"
|
:command="beforeCommand('status', '')"
|
||||||
class="justify-center"
|
class="justify-center"
|
||||||
>全部</el-dropdown-item
|
>{{ $t('views.document.table.all') }}</el-dropdown-item
|
||||||
>
|
>
|
||||||
<el-dropdown-item
|
<el-dropdown-item
|
||||||
:class="filterMethod['status'] === State.SUCCESS ? 'is-active' : ''"
|
:class="filterMethod['status'] === State.SUCCESS ? 'is-active' : ''"
|
||||||
class="justify-center"
|
class="justify-center"
|
||||||
:command="beforeCommand('status', State.SUCCESS)"
|
:command="beforeCommand('status', State.SUCCESS)"
|
||||||
>成功</el-dropdown-item
|
>{{ $t('views.document.fileStatus.SUCCESS') }}</el-dropdown-item
|
||||||
>
|
>
|
||||||
<el-dropdown-item
|
<el-dropdown-item
|
||||||
:class="filterMethod['status'] === State.FAILURE ? 'is-active' : ''"
|
:class="filterMethod['status'] === State.FAILURE ? 'is-active' : ''"
|
||||||
class="justify-center"
|
class="justify-center"
|
||||||
:command="beforeCommand('status', State.FAILURE)"
|
:command="beforeCommand('status', State.FAILURE)"
|
||||||
>失败</el-dropdown-item
|
>{{ $t('views.document.fileStatus.FAILURE') }}</el-dropdown-item
|
||||||
>
|
>
|
||||||
<el-dropdown-item
|
<el-dropdown-item
|
||||||
:class="
|
:class="
|
||||||
@ -119,13 +131,13 @@
|
|||||||
"
|
"
|
||||||
class="justify-center"
|
class="justify-center"
|
||||||
:command="beforeCommand('status', State.STARTED, TaskType.EMBEDDING)"
|
:command="beforeCommand('status', State.STARTED, TaskType.EMBEDDING)"
|
||||||
>索引中</el-dropdown-item
|
>{{ $t('views.document.fileStatus.EMBEDDING') }}</el-dropdown-item
|
||||||
>
|
>
|
||||||
<el-dropdown-item
|
<el-dropdown-item
|
||||||
:class="filterMethod['status'] === State.PENDING ? 'is-active' : ''"
|
:class="filterMethod['status'] === State.PENDING ? 'is-active' : ''"
|
||||||
class="justify-center"
|
class="justify-center"
|
||||||
:command="beforeCommand('status', State.PENDING)"
|
:command="beforeCommand('status', State.PENDING)"
|
||||||
>排队中</el-dropdown-item
|
>{{ $t('views.document.fileStatus.PENDING') }}</el-dropdown-item
|
||||||
>
|
>
|
||||||
<el-dropdown-item
|
<el-dropdown-item
|
||||||
:class="
|
:class="
|
||||||
@ -136,7 +148,7 @@
|
|||||||
"
|
"
|
||||||
class="justify-center"
|
class="justify-center"
|
||||||
:command="beforeCommand('status', State.STARTED, TaskType.GENERATE_PROBLEM)"
|
:command="beforeCommand('status', State.STARTED, TaskType.GENERATE_PROBLEM)"
|
||||||
>生成中</el-dropdown-item
|
>{{ $t('views.document.fileStatus.GENERATE') }}</el-dropdown-item
|
||||||
>
|
>
|
||||||
</el-dropdown-menu>
|
</el-dropdown-menu>
|
||||||
</template>
|
</template>
|
||||||
@ -150,7 +162,7 @@
|
|||||||
<el-table-column width="130">
|
<el-table-column width="130">
|
||||||
<template #header>
|
<template #header>
|
||||||
<div>
|
<div>
|
||||||
<span>启用状态</span>
|
<span>{{ $t('views.document.enableStatus.label') }}</span>
|
||||||
<el-dropdown trigger="click" @command="dropdownHandle">
|
<el-dropdown trigger="click" @command="dropdownHandle">
|
||||||
<el-button
|
<el-button
|
||||||
style="margin-top: 1px"
|
style="margin-top: 1px"
|
||||||
@ -165,19 +177,19 @@
|
|||||||
:class="filterMethod['is_active'] === '' ? 'is-active' : ''"
|
:class="filterMethod['is_active'] === '' ? 'is-active' : ''"
|
||||||
:command="beforeCommand('is_active', '')"
|
:command="beforeCommand('is_active', '')"
|
||||||
class="justify-center"
|
class="justify-center"
|
||||||
>全部</el-dropdown-item
|
>{{ $t('views.document.table.all') }}</el-dropdown-item
|
||||||
>
|
>
|
||||||
<el-dropdown-item
|
<el-dropdown-item
|
||||||
:class="filterMethod['is_active'] === true ? 'is-active' : ''"
|
:class="filterMethod['is_active'] === true ? 'is-active' : ''"
|
||||||
class="justify-center"
|
class="justify-center"
|
||||||
:command="beforeCommand('is_active', true)"
|
:command="beforeCommand('is_active', true)"
|
||||||
>开启</el-dropdown-item
|
>{{ $t('views.document.enableStatus.enable') }}</el-dropdown-item
|
||||||
>
|
>
|
||||||
<el-dropdown-item
|
<el-dropdown-item
|
||||||
:class="filterMethod['is_active'] === false ? 'is-active' : ''"
|
:class="filterMethod['is_active'] === false ? 'is-active' : ''"
|
||||||
class="justify-center"
|
class="justify-center"
|
||||||
:command="beforeCommand('is_active', false)"
|
:command="beforeCommand('is_active', false)"
|
||||||
>关闭</el-dropdown-item
|
>{{ $t('views.document.enableStatus.close') }}</el-dropdown-item
|
||||||
>
|
>
|
||||||
</el-dropdown-menu>
|
</el-dropdown-menu>
|
||||||
</template>
|
</template>
|
||||||
@ -198,7 +210,7 @@
|
|||||||
<el-table-column width="130">
|
<el-table-column width="130">
|
||||||
<template #header>
|
<template #header>
|
||||||
<div>
|
<div>
|
||||||
<span>命中处理方式</span>
|
<span>{{ $t('views.document.form.hit_handling_method.label') }}</span>
|
||||||
<el-dropdown trigger="click" @command="dropdownHandle">
|
<el-dropdown trigger="click" @command="dropdownHandle">
|
||||||
<el-button
|
<el-button
|
||||||
style="margin-top: 1px"
|
style="margin-top: 1px"
|
||||||
@ -213,7 +225,7 @@
|
|||||||
:class="filterMethod['hit_handling_method'] ? '' : 'is-active'"
|
:class="filterMethod['hit_handling_method'] ? '' : 'is-active'"
|
||||||
:command="beforeCommand('hit_handling_method', '')"
|
:command="beforeCommand('hit_handling_method', '')"
|
||||||
class="justify-center"
|
class="justify-center"
|
||||||
>全部</el-dropdown-item
|
>{{ $t('views.document.table.all') }}</el-dropdown-item
|
||||||
>
|
>
|
||||||
<template v-for="(value, key) of hitHandlingMethod" :key="key">
|
<template v-for="(value, key) of hitHandlingMethod" :key="key">
|
||||||
<el-dropdown-item
|
<el-dropdown-item
|
||||||
@ -237,7 +249,11 @@
|
|||||||
{{ datetimeFormat(row.create_time) }}
|
{{ datetimeFormat(row.create_time) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="update_time" label="更新时间" width="175">
|
<el-table-column
|
||||||
|
prop="update_time"
|
||||||
|
:label="$t('views.document.table.updateTime')"
|
||||||
|
width="175"
|
||||||
|
>
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
{{ datetimeFormat(row.update_time) }}
|
{{ datetimeFormat(row.update_time) }}
|
||||||
</template>
|
</template>
|
||||||
@ -253,7 +269,7 @@
|
|||||||
getTaskState(row.status, TaskType.EMBEDDING)
|
getTaskState(row.status, TaskType.EMBEDDING)
|
||||||
)
|
)
|
||||||
"
|
"
|
||||||
content="取消向量化"
|
:content="$t('views.document.setting.cancelVectorization')"
|
||||||
placement="top"
|
placement="top"
|
||||||
>
|
>
|
||||||
<el-button
|
<el-button
|
||||||
@ -264,14 +280,19 @@
|
|||||||
<AppIcon iconName="app-close" style="font-size: 16px"></AppIcon>
|
<AppIcon iconName="app-close" style="font-size: 16px"></AppIcon>
|
||||||
</el-button>
|
</el-button>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<el-tooltip v-else effect="dark" content="向量化" placement="top">
|
<el-tooltip
|
||||||
|
v-else
|
||||||
|
effect="dark"
|
||||||
|
:content="$t('views.dataset.setting.vectorization')"
|
||||||
|
placement="top"
|
||||||
|
>
|
||||||
<el-button type="primary" text @click.stop="refreshDocument(row)">
|
<el-button type="primary" text @click.stop="refreshDocument(row)">
|
||||||
<AppIcon iconName="app-document-refresh" style="font-size: 16px"></AppIcon>
|
<AppIcon iconName="app-document-refresh" style="font-size: 16px"></AppIcon>
|
||||||
</el-button>
|
</el-button>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
</span>
|
</span>
|
||||||
<span class="mr-4">
|
<span class="mr-4">
|
||||||
<el-tooltip effect="dark" content="设置" placement="top">
|
<el-tooltip effect="dark" :content="$t('common.setting')" placement="top">
|
||||||
<el-button type="primary" text @click.stop="settingDoc(row)">
|
<el-button type="primary" text @click.stop="settingDoc(row)">
|
||||||
<el-icon><Setting /></el-icon>
|
<el-icon><Setting /></el-icon>
|
||||||
</el-button>
|
</el-button>
|
||||||
@ -293,23 +314,23 @@
|
|||||||
@click="cancelTask(row, TaskType.GENERATE_PROBLEM)"
|
@click="cancelTask(row, TaskType.GENERATE_PROBLEM)"
|
||||||
>
|
>
|
||||||
<el-icon><Connection /></el-icon>
|
<el-icon><Connection /></el-icon>
|
||||||
取消生成问题
|
{{ $t('views.document.setting.cancelGenerateQuestion') }}
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
<el-dropdown-item v-else @click="openGenerateDialog(row)">
|
<el-dropdown-item v-else @click="openGenerateDialog(row)">
|
||||||
<el-icon><Connection /></el-icon>
|
<el-icon><Connection /></el-icon>
|
||||||
生成问题
|
{{ $t('views.document.setting.generateQuestion') }}
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
<el-dropdown-item @click="openDatasetDialog(row)">
|
<el-dropdown-item @click="openDatasetDialog(row)">
|
||||||
<AppIcon iconName="app-migrate"></AppIcon>
|
<AppIcon iconName="app-migrate"></AppIcon>
|
||||||
迁移
|
{{ $t('views.document.setting.migration') }}
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
<el-dropdown-item @click="exportDocument(row)">
|
<el-dropdown-item @click="exportDocument(row)">
|
||||||
<AppIcon iconName="app-export"></AppIcon>
|
<AppIcon iconName="app-export"></AppIcon>
|
||||||
导出Excel
|
{{ $t('common.export') }}Excel
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
<el-dropdown-item @click="exportDocumentZip(row)">
|
<el-dropdown-item @click="exportDocumentZip(row)">
|
||||||
<AppIcon iconName="app-export"></AppIcon>
|
<AppIcon iconName="app-export"></AppIcon>
|
||||||
导出Zip
|
{{ $t('common.export') }}Zip
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
<el-dropdown-item icon="Delete" @click.stop="deleteDocument(row)">{{
|
<el-dropdown-item icon="Delete" @click.stop="deleteDocument(row)">{{
|
||||||
$t('common.delete')
|
$t('common.delete')
|
||||||
@ -321,7 +342,11 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="datasetDetail.type === '1'">
|
<div v-if="datasetDetail.type === '1'">
|
||||||
<span class="mr-4">
|
<span class="mr-4">
|
||||||
<el-tooltip effect="dark" content="同步" placement="top">
|
<el-tooltip
|
||||||
|
effect="dark"
|
||||||
|
:content="$t('views.dataset.setting.sync')"
|
||||||
|
placement="top"
|
||||||
|
>
|
||||||
<el-button type="primary" text @click.stop="syncDocument(row)">
|
<el-button type="primary" text @click.stop="syncDocument(row)">
|
||||||
<el-icon><Refresh /></el-icon>
|
<el-icon><Refresh /></el-icon>
|
||||||
</el-button>
|
</el-button>
|
||||||
@ -335,7 +360,7 @@
|
|||||||
getTaskState(row.status, TaskType.EMBEDDING)
|
getTaskState(row.status, TaskType.EMBEDDING)
|
||||||
)
|
)
|
||||||
"
|
"
|
||||||
content="取消向量化"
|
:content="$t('views.document.setting.cancelVectorization')"
|
||||||
placement="top"
|
placement="top"
|
||||||
>
|
>
|
||||||
<el-button
|
<el-button
|
||||||
@ -347,7 +372,12 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
|
|
||||||
<el-tooltip effect="dark" v-else content="向量化" placement="top">
|
<el-tooltip
|
||||||
|
effect="dark"
|
||||||
|
v-else
|
||||||
|
:content="$t('views.dataset.setting.vectorization')"
|
||||||
|
placement="top"
|
||||||
|
>
|
||||||
<el-button type="primary" text @click.stop="refreshDocument(row)">
|
<el-button type="primary" text @click.stop="refreshDocument(row)">
|
||||||
<AppIcon iconName="app-document-refresh" style="font-size: 16px"></AppIcon>
|
<AppIcon iconName="app-document-refresh" style="font-size: 16px"></AppIcon>
|
||||||
</el-button>
|
</el-button>
|
||||||
@ -361,9 +391,9 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
<template #dropdown>
|
<template #dropdown>
|
||||||
<el-dropdown-menu>
|
<el-dropdown-menu>
|
||||||
<el-dropdown-item icon="Setting" @click="settingDoc(row)"
|
<el-dropdown-item icon="Setting" @click="settingDoc(row)">{{
|
||||||
>设置</el-dropdown-item
|
$t('common.setting')
|
||||||
>
|
}}</el-dropdown-item>
|
||||||
<el-dropdown-item
|
<el-dropdown-item
|
||||||
v-if="
|
v-if="
|
||||||
([State.STARTED, State.PENDING] as Array<string>).includes(
|
([State.STARTED, State.PENDING] as Array<string>).includes(
|
||||||
@ -373,23 +403,23 @@
|
|||||||
@click="cancelTask(row, TaskType.GENERATE_PROBLEM)"
|
@click="cancelTask(row, TaskType.GENERATE_PROBLEM)"
|
||||||
>
|
>
|
||||||
<el-icon><Connection /></el-icon>
|
<el-icon><Connection /></el-icon>
|
||||||
取消生成问题
|
{{ $t('views.document.setting.cancelGenerateQuestion') }}
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
<el-dropdown-item v-else @click="openGenerateDialog(row)">
|
<el-dropdown-item v-else @click="openGenerateDialog(row)">
|
||||||
<el-icon><Connection /></el-icon>
|
<el-icon><Connection /></el-icon>
|
||||||
生成问题
|
{{ $t('views.document.setting.generateQuestion') }}
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
<el-dropdown-item @click="openDatasetDialog(row)">
|
<el-dropdown-item @click="openDatasetDialog(row)">
|
||||||
<AppIcon iconName="app-migrate"></AppIcon>
|
<AppIcon iconName="app-migrate"></AppIcon>
|
||||||
迁移</el-dropdown-item
|
{{ $t('views.document.setting.migration') }}</el-dropdown-item
|
||||||
>
|
>
|
||||||
<el-dropdown-item @click="exportDocument(row)">
|
<el-dropdown-item @click="exportDocument(row)">
|
||||||
<AppIcon iconName="app-export"></AppIcon>
|
<AppIcon iconName="app-export"></AppIcon>
|
||||||
导出Excel
|
{{ $t('common.export') }}Excel
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
<el-dropdown-item @click="exportDocumentZip(row)">
|
<el-dropdown-item @click="exportDocumentZip(row)">
|
||||||
<AppIcon iconName="app-export"></AppIcon>
|
<AppIcon iconName="app-export"></AppIcon>
|
||||||
导出Zip
|
{{ $t('common.export') }}Zip
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
<el-dropdown-item icon="Delete" @click.stop="deleteDocument(row)">{{
|
<el-dropdown-item icon="Delete" @click.stop="deleteDocument(row)">{{
|
||||||
$t('common.delete')
|
$t('common.delete')
|
||||||
@ -412,15 +442,18 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="mul-operation w-full flex" v-if="multipleSelection.length !== 0">
|
<div class="mul-operation w-full flex" v-if="multipleSelection.length !== 0">
|
||||||
<el-button :disabled="multipleSelection.length === 0" @click="cancelTaskHandle(1)">
|
<el-button :disabled="multipleSelection.length === 0" @click="cancelTaskHandle(1)">
|
||||||
取消向量化
|
{{ $t('views.document.setting.cancelVectorization') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button :disabled="multipleSelection.length === 0" @click="cancelTaskHandle(2)">
|
<el-button :disabled="multipleSelection.length === 0" @click="cancelTaskHandle(2)">
|
||||||
取消生成
|
{{ $t('views.document.setting.cancelGenerate') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-text type="info" class="secondary ml-24">
|
<el-text type="info" class="secondary ml-24">
|
||||||
已选 {{ multipleSelection.length }} 项
|
{{ $t('views.document.selected') }} {{ multipleSelection.length }}
|
||||||
|
{{ $t('views.document.items') }}
|
||||||
</el-text>
|
</el-text>
|
||||||
<el-button class="ml-16" type="primary" link @click="clearSelection"> 清空 </el-button>
|
<el-button class="ml-16" type="primary" link @click="clearSelection">
|
||||||
|
{{ $t('common.clear') }}
|
||||||
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
<EmbeddingContentDialog ref="embeddingContentDialogRef"></EmbeddingContentDialog>
|
<EmbeddingContentDialog ref="embeddingContentDialogRef"></EmbeddingContentDialog>
|
||||||
</LayoutContainer>
|
</LayoutContainer>
|
||||||
@ -442,6 +475,7 @@ import StatusVlue from '@/views/document/component/Status.vue'
|
|||||||
import GenerateRelatedDialog from '@/components/generate-related-dialog/index.vue'
|
import GenerateRelatedDialog from '@/components/generate-related-dialog/index.vue'
|
||||||
import EmbeddingContentDialog from '@/views/document/component/EmbeddingContentDialog.vue'
|
import EmbeddingContentDialog from '@/views/document/component/EmbeddingContentDialog.vue'
|
||||||
import { TaskType, State } from '@/utils/status'
|
import { TaskType, State } from '@/utils/status'
|
||||||
|
import { t } from '@/locales'
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const {
|
const {
|
||||||
@ -496,14 +530,14 @@ const SelectDatasetDialogRef = ref()
|
|||||||
|
|
||||||
const exportDocument = (document: any) => {
|
const exportDocument = (document: any) => {
|
||||||
documentApi.exportDocument(document.name, document.dataset_id, document.id, loading).then(() => {
|
documentApi.exportDocument(document.name, document.dataset_id, document.id, loading).then(() => {
|
||||||
MsgSuccess('导出成功')
|
MsgSuccess(t('common.exportSuccess'))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
const exportDocumentZip = (document: any) => {
|
const exportDocumentZip = (document: any) => {
|
||||||
documentApi
|
documentApi
|
||||||
.exportDocumentZip(document.name, document.dataset_id, document.id, loading)
|
.exportDocumentZip(document.name, document.dataset_id, document.id, loading)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
MsgSuccess('导出成功')
|
MsgSuccess(t('common.exportSuccess'))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -519,7 +553,7 @@ function cancelTaskHandle(val: any) {
|
|||||||
type: val
|
type: val
|
||||||
}
|
}
|
||||||
documentApi.batchCancelTask(id, obj, loading).then(() => {
|
documentApi.batchCancelTask(id, obj, loading).then(() => {
|
||||||
MsgSuccess('批量取消成功')
|
MsgSuccess(t('views.document.tip.cancelSuccessMessage'))
|
||||||
multipleTableRef.value?.clearSelection()
|
multipleTableRef.value?.clearSelection()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -561,16 +595,16 @@ function beforeCommand(attr: string, val: any, task_type?: number) {
|
|||||||
}
|
}
|
||||||
const cancelTask = (row: any, task_type: number) => {
|
const cancelTask = (row: any, task_type: number) => {
|
||||||
documentApi.cancelTask(row.dataset_id, row.id, { type: task_type }).then(() => {
|
documentApi.cancelTask(row.dataset_id, row.id, { type: task_type }).then(() => {
|
||||||
MsgSuccess('发送成功')
|
MsgSuccess(t('views.document.tip.sendMessage'))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function importDoc() {
|
function importDoc() {
|
||||||
title.value = '导入文档'
|
title.value = t('views.document.importDocument')
|
||||||
ImportDocumentDialogRef.value.open()
|
ImportDocumentDialogRef.value.open()
|
||||||
}
|
}
|
||||||
function settingDoc(row: any) {
|
function settingDoc(row: any) {
|
||||||
title.value = '设置'
|
title.value = t('common.setting')
|
||||||
ImportDocumentDialogRef.value.open(row)
|
ImportDocumentDialogRef.value.open(row)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -579,7 +613,7 @@ const handleSelectionChange = (val: any[]) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function openBatchEditDocument() {
|
function openBatchEditDocument() {
|
||||||
title.value = '设置'
|
title.value = t('common.setting')
|
||||||
const arr: string[] = multipleSelection.value.map((v) => v.id)
|
const arr: string[] = multipleSelection.value.map((v) => v.id)
|
||||||
ImportDocumentDialogRef.value.open(null, arr)
|
ImportDocumentDialogRef.value.open(null, arr)
|
||||||
}
|
}
|
||||||
@ -604,8 +638,8 @@ const closeInterval = () => {
|
|||||||
|
|
||||||
function syncDocument(row: any) {
|
function syncDocument(row: any) {
|
||||||
if (row.meta?.source_url) {
|
if (row.meta?.source_url) {
|
||||||
MsgConfirm(`确认同步文档?`, `同步将删除已有数据重新获取新数据,请谨慎操作。`, {
|
MsgConfirm(t('views.document.sync.confirmTitle'), t('views.document.sync.confirmMessage1'), {
|
||||||
confirmButtonText: '同步',
|
confirmButtonText: t('views.document.sync.label'),
|
||||||
confirmButtonClass: 'danger'
|
confirmButtonClass: 'danger'
|
||||||
})
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
@ -615,7 +649,7 @@ function syncDocument(row: any) {
|
|||||||
})
|
})
|
||||||
.catch(() => {})
|
.catch(() => {})
|
||||||
} else {
|
} else {
|
||||||
MsgConfirm(t('common.tip'), `无法同步,请先去设置文档 URL地址`, {
|
MsgConfirm(t('common.tip'), t('views.document.sync.confirmMessage2'), {
|
||||||
confirmButtonText: t('common.confirm'),
|
confirmButtonText: t('common.confirm'),
|
||||||
type: 'warning'
|
type: 'warning'
|
||||||
})
|
})
|
||||||
@ -666,15 +700,15 @@ function syncMulDocument() {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
documentApi.delMulSyncDocument(id, arr, loading).then(() => {
|
documentApi.delMulSyncDocument(id, arr, loading).then(() => {
|
||||||
MsgSuccess('同步文档成功')
|
MsgSuccess(t('views.document.sync.successMessage'))
|
||||||
getList()
|
getList()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteMulDocument() {
|
function deleteMulDocument() {
|
||||||
MsgConfirm(
|
MsgConfirm(
|
||||||
`是否批量删除 ${multipleSelection.value.length} 个文档?`,
|
`${t('views.document.delete.confirmTitle1')} ${multipleSelection.value.length} ${t('views.document.delete.confirmTitle2')}`,
|
||||||
`所选文档中的分段会跟随删除,请谨慎操作。`,
|
t('views.document.delete.confirmMessage'),
|
||||||
{
|
{
|
||||||
confirmButtonText: t('common.delete'),
|
confirmButtonText: t('common.delete'),
|
||||||
confirmButtonClass: 'danger'
|
confirmButtonClass: 'danger'
|
||||||
@ -688,7 +722,7 @@ function deleteMulDocument() {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
documentApi.delMulDocument(id, arr, loading).then(() => {
|
documentApi.delMulDocument(id, arr, loading).then(() => {
|
||||||
MsgSuccess('批量删除成功')
|
MsgSuccess(t('views.document.delete.successMessage'))
|
||||||
multipleTableRef.value?.clearSelection()
|
multipleTableRef.value?.clearSelection()
|
||||||
getList()
|
getList()
|
||||||
})
|
})
|
||||||
@ -700,7 +734,7 @@ function batchRefresh() {
|
|||||||
const arr: string[] = multipleSelection.value.map((v) => v.id)
|
const arr: string[] = multipleSelection.value.map((v) => v.id)
|
||||||
const embeddingBatchDocument = (stateList: Array<string>) => {
|
const embeddingBatchDocument = (stateList: Array<string>) => {
|
||||||
documentApi.batchRefresh(id, arr, stateList, loading).then(() => {
|
documentApi.batchRefresh(id, arr, stateList, loading).then(() => {
|
||||||
MsgSuccess('批量向量化成功')
|
MsgSuccess(t('views.document.tip.vectorizationSuccessMessage'))
|
||||||
multipleTableRef.value?.clearSelection()
|
multipleTableRef.value?.clearSelection()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -709,8 +743,8 @@ function batchRefresh() {
|
|||||||
|
|
||||||
function deleteDocument(row: any) {
|
function deleteDocument(row: any) {
|
||||||
MsgConfirm(
|
MsgConfirm(
|
||||||
`是否删除文档:${row.name} ?`,
|
`${t('views.document.delete.confirmTitle3')} ${row.name} ?`,
|
||||||
`此文档下的 ${row.paragraph_count} 个分段都会被删除,请谨慎操作。`,
|
`${t('views.document.delete.confirmMessage1')} ${row.paragraph_count} ${t('views.document.delete.confirmMessage2')}`,
|
||||||
{
|
{
|
||||||
confirmButtonText: t('common.delete'),
|
confirmButtonText: t('common.delete'),
|
||||||
confirmButtonClass: 'danger'
|
confirmButtonClass: 'danger'
|
||||||
@ -746,7 +780,7 @@ function changeState(row: any) {
|
|||||||
const obj = {
|
const obj = {
|
||||||
is_active: !row.is_active
|
is_active: !row.is_active
|
||||||
}
|
}
|
||||||
const str = !row.is_active ? '启用成功' : '禁用成功'
|
const str = !row.is_active ? t('common.status.enableSuccess') : t('common.status.disableSuccess')
|
||||||
currentMouseId.value && updateData(row.id, obj, str)
|
currentMouseId.value && updateData(row.id, obj, str)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -755,9 +789,9 @@ function editName(val: string, id: string) {
|
|||||||
const obj = {
|
const obj = {
|
||||||
name: val
|
name: val
|
||||||
}
|
}
|
||||||
updateData(id, obj, '修改成功')
|
updateData(id, obj, t('common.modifySuccess'))
|
||||||
} else {
|
} else {
|
||||||
MsgError('文件名称不能为空!')
|
MsgError(t('views.document.tip.nameMessage'))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -7,22 +7,22 @@
|
|||||||
:rules="rules"
|
:rules="rules"
|
||||||
@submit.prevent
|
@submit.prevent
|
||||||
>
|
>
|
||||||
<el-form-item label="分段标题">
|
<el-form-item :label="$t('views.document.paragraph.form.paragraphTitle.label')">
|
||||||
<el-input
|
<el-input
|
||||||
v-if="isEdit"
|
v-if="isEdit"
|
||||||
v-model="form.title"
|
v-model="form.title"
|
||||||
placeholder="请输入分段标题"
|
:placeholder="$t('views.document.paragraph.form.paragraphTitle.placeholder')"
|
||||||
maxlength="256"
|
maxlength="256"
|
||||||
show-word-limit
|
show-word-limit
|
||||||
>
|
>
|
||||||
</el-input>
|
</el-input>
|
||||||
<span class="lighter" v-else>{{ form.title || '-' }}</span>
|
<span class="lighter" v-else>{{ form.title || '-' }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="分段内容" prop="content">
|
<el-form-item :label="$t('views.document.paragraph.form.content.label')" prop="content">
|
||||||
<MdEditor
|
<MdEditor
|
||||||
v-if="isEdit"
|
v-if="isEdit"
|
||||||
v-model="form.content"
|
v-model="form.content"
|
||||||
placeholder="请输入分段内容"
|
:placeholder="$t('views.document.paragraph.form.content.placeholder')"
|
||||||
:maxLength="100000"
|
:maxLength="100000"
|
||||||
:preview="false"
|
:preview="false"
|
||||||
:toolbars="toolbars"
|
:toolbars="toolbars"
|
||||||
@ -48,6 +48,7 @@
|
|||||||
import { ref, reactive, onUnmounted, watch } from 'vue'
|
import { ref, reactive, onUnmounted, watch } from 'vue'
|
||||||
import type { FormInstance, FormRules } from 'element-plus'
|
import type { FormInstance, FormRules } from 'element-plus'
|
||||||
import imageApi from '@/api/image'
|
import imageApi from '@/api/image'
|
||||||
|
import { t } from '@/locales'
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
data: {
|
data: {
|
||||||
type: Object,
|
type: Object,
|
||||||
@ -97,8 +98,8 @@ const form = ref<any>({
|
|||||||
|
|
||||||
const rules = reactive<FormRules>({
|
const rules = reactive<FormRules>({
|
||||||
content: [
|
content: [
|
||||||
{ required: true, message: '请输入分段内容', trigger: 'blur' },
|
{ required: true, message: t('views.document.paragraph.form.content.requiredMessage1'), trigger: 'blur' },
|
||||||
{ max: 100000, message: '内容最多不超过 100000 个字', trigger: 'blur' }
|
{ max: 100000, message: t('views.document.paragraph.form.content.requiredMessage2'), trigger: 'blur' }
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<p class="bold title p-24" style="padding-bottom: 0">
|
<p class="bold title p-24" style="padding-bottom: 0">
|
||||||
<span class="flex align-center">
|
<span class="flex align-center">
|
||||||
<span>关联问题</span>
|
<span>{{ $t('views.document.paragraph.relatedProblem.title') }}</span>
|
||||||
<el-divider direction="vertical" class="mr-4" />
|
<el-divider direction="vertical" class="mr-4" />
|
||||||
<el-button text @click="addProblem">
|
<el-button text @click="addProblem">
|
||||||
<el-icon><Plus /></el-icon>
|
<el-icon><Plus /></el-icon>
|
||||||
@ -18,7 +18,7 @@
|
|||||||
allow-create
|
allow-create
|
||||||
default-first-option
|
default-first-option
|
||||||
:reserve-keyword="false"
|
:reserve-keyword="false"
|
||||||
placeholder="请选择问题"
|
:placeholder="$t('views.document.paragraph.relatedProblem.placeholder')"
|
||||||
remote
|
remote
|
||||||
:remote-method="remoteMethod"
|
:remote-method="remoteMethod"
|
||||||
:loading="optionLoading"
|
:loading="optionLoading"
|
||||||
|
|||||||
@ -65,8 +65,10 @@
|
|||||||
</el-form>
|
</el-form>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<span class="dialog-footer">
|
<span class="dialog-footer">
|
||||||
<el-button @click.prevent="dialogVisible = false"> {{$t('common.cancel')}} </el-button>
|
<el-button @click.prevent="dialogVisible = false"> {{ $t('common.cancel') }} </el-button>
|
||||||
<el-button type="primary" @click="submitForm(formRef)" :loading="loading"> 迁移 </el-button>
|
<el-button type="primary" @click="submitForm(formRef)" :loading="loading">
|
||||||
|
{{ $t('views.document.setting.migration') }}
|
||||||
|
</el-button>
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|||||||
@ -124,11 +124,11 @@
|
|||||||
<el-dropdown-menu>
|
<el-dropdown-menu>
|
||||||
<el-dropdown-item @click="openGenerateDialog(item)">
|
<el-dropdown-item @click="openGenerateDialog(item)">
|
||||||
<el-icon><Connection /></el-icon>
|
<el-icon><Connection /></el-icon>
|
||||||
生成问题</el-dropdown-item
|
{{ $t('views.document.setting.generateQuestion') }}</el-dropdown-item
|
||||||
>
|
>
|
||||||
<el-dropdown-item @click="openSelectDocumentDialog(item)">
|
<el-dropdown-item @click="openSelectDocumentDialog(item)">
|
||||||
<AppIcon iconName="app-migrate"></AppIcon>
|
<AppIcon iconName="app-migrate"></AppIcon>
|
||||||
迁移</el-dropdown-item
|
{{$t('views.document.setting.migration')}}</el-dropdown-item
|
||||||
>
|
>
|
||||||
<el-dropdown-item icon="Delete" @click.stop="deleteParagraph(item)">{{
|
<el-dropdown-item icon="Delete" @click.stop="deleteParagraph(item)">{{
|
||||||
$t('common.delete')
|
$t('common.delete')
|
||||||
@ -148,10 +148,10 @@
|
|||||||
|
|
||||||
<div class="mul-operation border-t w-full" v-if="isBatch === true">
|
<div class="mul-operation border-t w-full" v-if="isBatch === true">
|
||||||
<el-button :disabled="multipleSelection.length === 0" @click="openGenerateDialog()">
|
<el-button :disabled="multipleSelection.length === 0" @click="openGenerateDialog()">
|
||||||
生成问题
|
{{ $t('views.document.setting.generateQuestion') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button :disabled="multipleSelection.length === 0" @click="openSelectDocumentDialog()">
|
<el-button :disabled="multipleSelection.length === 0" @click="openSelectDocumentDialog()">
|
||||||
迁移
|
{{$t('views.document.setting.migration')}}
|
||||||
</el-button>
|
</el-button>
|
||||||
|
|
||||||
<el-button :disabled="multipleSelection.length === 0" @click="deleteMulParagraph">
|
<el-button :disabled="multipleSelection.length === 0" @click="deleteMulParagraph">
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user