Commit 0931d0ef authored by mhw's avatar mhw

版本跟新

parent 4fcaf270
......@@ -13631,6 +13631,11 @@
"saxen": "^8.1.2"
}
},
"moment": {
"version": "2.30.1",
"resolved": "https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz",
"integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how=="
},
"move-concurrently": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/move-concurrently/-/move-concurrently-1.0.1.tgz",
......
......@@ -14,4 +14,7 @@ export default class DatasetData {
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetData/delete', 'post', params, axiosOption, httpOption);
}
static load (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetData/load', 'post', params, axiosOption, httpOption);
}
}
......@@ -10,7 +10,9 @@ export default class DatasetVersion {
static export (sender, params, fileName) {
return sender.download('/admin/app/datasetVersion/export', params, fileName);
}
static startExport (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetVersion/startExport', 'get', params, axiosOption, httpOption);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetVersion/add', 'post', params, axiosOption, httpOption);
}
......
export default class KnowledgeGraph {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/kGManage/list', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/kGManage/view', 'get', params, axiosOption, httpOption);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/kGManage/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/kGManage/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/kGManage/delete', 'post', params, axiosOption, httpOption);
}
}
......@@ -8,13 +8,21 @@ export default class KnowledgeManage {
static recreate (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/recreate', 'post', params, axiosOption, httpOption);
}
static searchDocs (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/searchDocs', 'post', params, axiosOption, httpOption);
}
static listDocs (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/listDocs', 'post', params, axiosOption, httpOption);
}
static updateDocsById (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/updateDocsById', 'post', params, axiosOption, httpOption);
}
static updateDocs (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/updateDocs', 'post', params, axiosOption, httpOption);
}
static deleteDocsById (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/deleteDocsById', 'post', params, axiosOption, httpOption);
}
static uploadDocs (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/uploadDocs', 'post', params, axiosOption, httpOption);
}
......
......@@ -17,6 +17,7 @@ import PyApi from './GptController/PyApi.js';
import KnowledgeManage from './GptController/KnowledgeManage.js';
import DatasetData from './GptController/DatasetData.js';
import ModelDeployment from './GptController/ModelDeployment.js';
import KnowledgeGraph from './GptController/KnowledgeGraph.js';
export {
TemplateController,
......@@ -36,5 +37,6 @@ export {
PyApi,
KnowledgeManage,
DatasetData,
ModelDeployment
ModelDeployment,
KnowledgeGraph
}
module.exports = {
// baseUrl: 'http://218.76.0.69:8082/',
baseUrl: 'http://192.168.0.34:8082/',
// baseUrl: 'http://192.168.0.34:8082/',
baseUrl: 'http://192.168.0.36:8082/',
wsUrl: 'ws://218.76.0.69:7860/',
projectName: '灵境大模型平台'
}
export default {
inserted: function (el, binding, vnode) {
const menuDom = document.querySelector(binding.value)
el.addEventListener('contextmenu', function(e) {
// 阻止默认的右键菜单
e.preventDefault();
// 获取鼠标位置
var x = e.clientX;
var y = e.clientY;
console.log(menuDom);
// 显示自定义菜单
menuDom.style.display = 'block';
menuDom.style.left = x + 'px';
menuDom.style.top = y + 'px';
});
}
}
......@@ -123,7 +123,7 @@ const globalMixin = {
},
computed: {
defaultFormItemSize () {
return this.windowWidth <= 1900 ? 'small' : 'medium';
return this.windowWidth <= 1900 ? 'mini' : 'small';
},
...mapGetters(['getUserInfo'])
},
......
......@@ -24,6 +24,7 @@ import RightAddBtn from '@/components/Btns/RightAddBtn';
import VCharts from 'v-charts';
import VXETable from 'vxe-table';
import resize from '@/core/directive/resize.js';
import rightClick from '@/core/directive/rightClick.js';
import 'vxe-table/lib/style.css';
import '@/assets/online-icon/iconfont.css';
import VueClipboard from 'vue-clipboard2'
......@@ -32,6 +33,7 @@ Vue.prototype.$SocketService = SocketService
Vue.use(VueClipboard)
Vue.directive('resize', resize)
Vue.directive('rightClick', rightClick)
Vue.use(VXETable);
window.JSON = new JSONbig({storeAsString: true});
Vue.component('tree-select', TreeSelect);
......
......@@ -91,7 +91,9 @@ const routers = [
// { path: 'onLineOptimization', component: _import('gptTraining/promptProject/onLineOptimization/index'), name: 'onLineOptimization', props: getProps, meta: { title: '在线优化' } },
// { path: 'batchOptimization', component: _import('gptTraining/promptProject/batchOptimization/index'), name: 'batchOptimization', props: getProps, meta: { title: '批量优化' } },
// 知识库
{ path: 'knowledgeBase', component: _import('gptTraining/knowledgeBase/index'), name: 'knowledgeBase', props: getProps, meta: { title: '知识库' } }
{ path: 'knowledgeBase', component: _import('gptTraining/knowledgeBase/index'), name: 'knowledgeBase', props: getProps, meta: { title: '知识库' } },
{ path: 'knowledgeGraph', component: _import('gptTraining/knowledgeGraph/index'), name: 'knowledgeGraph', props: getProps, meta: { title: '知识图谱管理' } },
{ path: 'hitTest', component: _import('gptTraining/hitTest/index'), name: 'hitTest', props: getProps, meta: { title: '命中测试' } }
]
}
];
......
......@@ -210,7 +210,7 @@ const ImportFormat = new DictionaryBase('导入格式', [
{
id: 1,
name: 'TEXT',
symbol: 'text'
symbol: 'txt'
},
{
id: 2,
......@@ -221,6 +221,36 @@ const ImportFormat = new DictionaryBase('导入格式', [
id: 3,
name: 'XLSX',
symbol: 'xlsx'
}
// ,
// {
// id: 4,
// name: '压缩包',
// symbol: 'rar'
// }
]);
Vue.prototype.ImportFormat = ImportFormat;
const KnowledgeImportFormat = new DictionaryBase('知识库导入格式', [
{
id: 0,
name: 'PDF',
symbol: 'pdf'
},
{
id: 1,
name: 'TXT',
symbol: 'txt'
},
{
id: 2,
name: 'DOC',
symbol: 'doc'
},
{
id: 3,
name: 'DOCX',
symbol: 'docx'
},
{
id: 4,
......@@ -228,7 +258,7 @@ const ImportFormat = new DictionaryBase('导入格式', [
symbol: 'rar'
}
]);
Vue.prototype.ImportFormat = ImportFormat;
Vue.prototype.KnowledgeImportFormat = KnowledgeImportFormat;
const DataAnnotationState = new DictionaryBase('发布状态', [
{
......@@ -485,6 +515,108 @@ const DeploymentStatus = new DictionaryBase('部署状态', [
}
]);
Vue.prototype.DeploymentStatus = DeploymentStatus;
const SegmentedMode = new DictionaryBase('分段方式', [
{
id: 0,
name: '自动分段',
symbol: 'Distribution'
},
{
id: 1,
name: '自定义分段',
symbol: 'CustomSegmentation'
},
{
id: 2,
name: '按层级分段',
symbol: 'LevelSegmentation'
}
// ,
// {
// id: 3,
// name: '手动分段',
// symbol: 'ManualSegmentation'
// }
// 4 结构化数据分段
]);
Vue.prototype.SegmentedMode = SegmentedMode;
const SegmentIdentifier = new DictionaryBase('分段标识符', [
{
id: 0,
name: '空两行',
symbol: '\n\n'
}, {
id: 1,
name: '换行',
symbol: '\r'
}, {
id: 2,
name: '中文句号',
symbol: '。'
}, {
id: 3,
name: '英文句号',
symbol: '.'
}, {
id: 4,
name: '中文叹号',
symbol: '!'
}, {
id: 5,
name: '英文叹号',
symbol: '!'
}, {
id: 6,
name: '中文问号',
symbol: '?'
}, {
id: 7,
name: '英文问号',
symbol: '?'
}, {
id: 8,
name: '中文逗号',
symbol: ','
}, {
id: 9,
name: '英文逗号',
symbol: ','
}, {
id: 10,
name: '空格',
symbol: ' '
}
]);
Vue.prototype.SegmentIdentifier = SegmentIdentifier;
const TitleSaveMode = new DictionaryBase('标题保存方式', [
{
id: 0,
name: '保存多标题组合',
symbol: 'HeadingCombination'
},
{
id: 1,
name: '保存最后一级标题',
symbol: 'LastLevel'
}
]);
Vue.prototype.TitleSaveMode = TitleSaveMode;
const KnowledgeFormat = new DictionaryBase('知识格式', [
{
id: 0,
name: '文本文档格式',
symbol: 'TextDocumentFormat'
},
{
id: 1,
name: '结构化格式',
symbol: 'StructuredFormat'
}
]);
Vue.prototype.KnowledgeFormat = KnowledgeFormat;
export {
TemplateLabelDict,
ScenarioTypeDict,
......@@ -505,5 +637,8 @@ export {
TrainingMethod,
ModeOfSpeaking,
RunningStatus,
DeploymentStatus
DeploymentStatus,
SegmentedMode,
KnowledgeImportFormat,
KnowledgeFormat
}
......@@ -11,16 +11,11 @@
数据清洗是面向post-pretrain场景下预训练泛文本数据的一站式数据处理方案,通过对数据进行异常清洗、文本过滤、文本去重和去除隐私信息,大幅提升数据质量,优化模型训练效果。
</div>
<div class="instructionsList">
<div
class="item"
v-for="(item, index) in instructionsList"
:key="index"
>
<div class="item" v-for="(item, index) in instructionsList" :key="index">
<img class="img" :src="item.img" alt="" />
<div class="itemTitle">
<span class="head-index">{{ index + 1 }} &nbsp;</span
>{{ item.title }}
<span class="head-index">{{ index + 1 }} &nbsp;</span>{{ item.title }}
</div>
<div class="itemDescribe">{{ item.describe }}</div>
</div>
......@@ -29,48 +24,18 @@
</el-collapse-item>
</el-collapse>
<div class="tableBox" :style="{ height: tableHeight }">
<el-form
ref="myDataSetPage"
:model="myDataSetPage"
label-width="75px"
:size="defaultFormItemSize"
label-position="right"
@submit.native.prevent
>
<el-form ref="myDataSetPage" :model="myDataSetPage" label-width="75px" :size="defaultFormItemSize" label-position="right" @submit.native.prevent>
<filter-box :item-width="350" @search="search()" @reset="onReset">
<el-form-item label-width="0px">
<el-button
class="add"
type="primary"
icon="el-icon-plus"
:size="defaultFormItemSize"
@click="add()"
>创建任务</el-button
>
<el-button class="add" type="primary" icon="el-icon-plus" :size="defaultFormItemSize" @click="add()">创建任务</el-button>
</el-form-item>
<el-form-item
label="数据集名称或id"
prop="formFilter.dataName"
label-width="120px"
>
<el-input
class="filter-item"
v-model="myDataSetPage.formFilter.dataName"
:clearable="true"
placeholder="数据集名称或id"
/>
<el-form-item label="数据集名称或id" prop="formFilter.dataName" label-width="120px">
<el-input class="filter-item" v-model="myDataSetPage.formFilter.dataName" :clearable="true" placeholder="数据集名称或id" />
</el-form-item>
</filter-box>
</el-form>
<vxe-table
border
show-header-overflow
show-overflow
:row-config="{ isHover: true }"
:data="myDataSetPage.tableData.impl.dataList"
min-height="96"
>
<vxe-table border show-header-overflow show-overflow :row-config="{ isHover: true }" :data="myDataSetPage.tableData.impl.dataList" min-height="96">
<vxe-column field="versions" title="版本"></vxe-column>
<vxe-column field="versionsId" title="版本ID"></vxe-column>
......@@ -97,7 +62,7 @@
</template> -->
</vxe-column>
</vxe-table>
<el-row slot="pagination" type="flex" justify="end" style="margin-top: 16px;">
<el-row slot="pagination" type="flex" justify="end" style="margin-top: 16px;width: 100%;">
<el-pagination :total="myDataSetPage.tableData.impl.totalCount" :current-page="myDataSetPage.tableData.impl.currentPage" :page-size="myDataSetPage.tableData.impl.pageSize" :page-sizes="[10, 20, 50, 100]" layout="total, prev, pager, next, sizes" @current-change="myDataSetPage.tableData.impl.onCurrentPageChange" @size-change="myDataSetPage.tableData.impl.onPageSizeChange">
</el-pagination>
</el-row>
......@@ -106,13 +71,13 @@
</template>
<script>
import { mapGetters } from 'vuex';
import { mapGetters } from 'vuex'
/* eslint-disable-next-line */
import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/widget.js';
import { ModelSquare } from '@/api/gptController.js';
import editOrAdd from './dialog/editOrAdd';
import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/widget.js'
import { ModelSquare } from '@/api/gptController.js'
import editOrAdd from './dialog/editOrAdd'
export default {
data () {
data() {
return {
activeName: '1',
collapseHeight: 0,
......@@ -145,33 +110,32 @@ export default {
],
myDataSetPage: {
formFilter: {
'modelDescribe': '',
'modelId': 0,
'modelName': '',
'modelType': 0,
'versionCount': 0
modelDescribe: '',
modelId: 0,
modelName: '',
modelType: 0,
versionCount: 0
},
tableData: {
impl: new TableWidget(this.getwidgetData, true, true, false, undefined, false)
}
}
};
}
},
components: {},
computed: {
...mapGetters(['getMainContextHeight']),
tableHeight () {
return this.getMainContextHeight - this.collapseHeight - 35 + 'px';
tableHeight() {
return this.getMainContextHeight - this.collapseHeight - 35 + 'px'
}
},
methods: {
getwidgetData (params) {
if (params == null) params = {};
getwidgetData(params) {
if (params == null) params = {}
params = {
...params,
// orderParam: [
......@@ -189,75 +153,93 @@ export default {
}
return new Promise((resolve, reject) => {
ModelSquare.list(this, params).then(res => {
resolve({
dataList: res.data.dataList,
totalCount: res.data.totalCount
});
}).catch(e => {
reject(e);
});
});
ModelSquare.list(this, params)
.then((res) => {
resolve({
dataList: res.data.dataList,
totalCount: res.data.totalCount
})
})
.catch((e) => {
reject(e)
})
})
},
add () {
this.$dialog.show('创建模版', editOrAdd, {
area: ['100%', '100%']
}, { isEdit: false }).then(res => {
this.refresh();
}).catch(e => { });
add() {
this.$dialog
.show(
'创建模版',
editOrAdd,
{
area: ['100%', '100%']
},
{ isEdit: false }
)
.then((res) => {
this.refresh()
})
.catch((e) => {})
},
edit (item) {
this.$dialog.show('修改模版', editOrAdd, {
area: ['100%', '100%']
}, { isEdit: true, item: item }).then(res => {
this.refresh();
}).catch(e => { });
edit(item) {
this.$dialog
.show(
'修改模版',
editOrAdd,
{
area: ['100%', '100%']
},
{ isEdit: true, item: item }
)
.then((res) => {
this.refresh()
})
.catch((e) => {})
},
del (item) {
del(item) {
this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = { batchTaskId: item.batchTaskId }
ModelSquare.delete(this, params).then(res => {
this.$message.success('删除成功');
this.refresh()
}).catch(e => {
console.log(e);
});
}
);
ModelSquare.delete(this, params)
.then((res) => {
this.$message.success('删除成功')
this.refresh()
})
.catch((e) => {
console.log(e)
})
})
},
refresh (reloadData = false) {
refresh(reloadData = false) {
if (reloadData) {
this.myDataSetPage.tableData.impl.refreshTable(true, 1);
this.myDataSetPage.tableData.impl.refreshTable(true, 1)
} else {
this.myDataSetPage.tableData.impl.refreshTable();
this.myDataSetPage.tableData.impl.refreshTable()
}
},
onReset () {
this.$refs.myDataSetPage.resetFields();
this.refresh(true);
onReset() {
this.$refs.myDataSetPage.resetFields()
this.refresh(true)
},
formInit () {
this.refresh();
formInit() {
this.refresh()
},
resize (e) {
resize(e) {
setTimeout(() => {
this.collapseHeight = e?.height
}, 300);
}, 300)
}
},
mounted () {
mounted() {
this.resize()
this.formInit()
}
}
</script>
<style lang="scss" scoped>
@import "@/assets/style/element-variables.scss";
@import '@/assets/style/element-variables.scss';
.instructions {
background-color: white;
width: 100%;
......@@ -268,7 +250,6 @@ export default {
display: flex;
flex-direction: row;
justify-content: space-around;
}
.title {
color: $--color-text-primary;
......@@ -312,8 +293,7 @@ export default {
div /deep/ .el-collapse-item__content {
padding-bottom: 0;
}
div /deep/ .el-collapse-item__header{
padding-left: 20px;
div /deep/ .el-collapse-item__header {
padding-left: 20px;
}
</style>
......@@ -16,138 +16,218 @@
</el-form>
<div class="tableBox" :style="{ height: tableHeight }">
<el-button class="add" type="primary" icon="el-icon-plus" :size="defaultFormItemSize" @click="add()">创建数据集</el-button>
<div v-for="(item,index) in myDataSetPage.tableData.impl.dataList" :key="item.datasetId">
<tableItem v-model="myDataSetPage.tableData.impl.dataList[index]" @refresh="refresh" />
</div>
<template v-if="this.myDataSetPage.tableData.impl.dataList.length<1" >
<div class="table-empty unified-font">
<img src="@/assets/img/empty.png">
<span>暂无数据</span>
</div>
</template>
</div>
<vxe-table border show-header-overflow show-overflow :row-config="{ isHover: true }" :data="myDataSetPage.tableData.impl.dataList" min-height="96">
<vxe-column field="datasetName" title="数据集名称"></vxe-column>
<vxe-column field="datasetVersionList" title="最新版本">
<template slot-scope="scope">
V{{ scope.row.datasetVersionList[scope.row.datasetVersionList.length-1].datasetVersion }}
</template>
</vxe-column>
<vxe-column field="dataType" title="数据类型">
<template slot-scope="scope">
{{ DataType.getValue(scope.row.dataType ) }}
</template>
</vxe-column>
<vxe-column field="dimensionType" title="标注类型">
<template slot-scope="scope">
{{ LabelType.getValue(scope.row.dimensionType ) }}
</template>
</vxe-column>
<vxe-column field="createTime" title="创建时间"></vxe-column>
<vxe-column field="operation" title="操作" width="280">
<template slot-scope="scope">
<el-button type="text" icon="el-icon-plus" @click="addVersions(scope.row)">新增版本</el-button>
<el-button type="text" icon="el-icon-menu" @click="all(scope.row)">全部版本</el-button>
<el-button type="text" icon="el-icon-delete" @click="delDataset(scope.row)">删除</el-button>
</template>
</vxe-column>
</vxe-table>
<el-row slot="pagination" type="flex" justify="end" style="margin-top: 16px;width: 100%;">
<el-pagination :total="myDataSetPage.tableData.impl.totalCount" :current-page="myDataSetPage.tableData.impl.currentPage" :page-size="myDataSetPage.tableData.impl.pageSize" :page-sizes="[10, 20, 50, 100]" layout="total, prev, pager, next, sizes" @current-change="myDataSetPage.tableData.impl.onCurrentPageChange" @size-change="myDataSetPage.tableData.impl.onPageSizeChange">
</el-pagination>
</el-row>
</div>
</div>
</template>
<script>
import { mapGetters } from 'vuex';
import { mapGetters } from 'vuex'
/* eslint-disable-next-line */
import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/widget.js';
import { MyDataSet } from '@/api/gptController.js';
import editOrAdd from './dialog/editOrAdd';
import tableItem from './tableItem';
import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/widget.js'
import { MyDataSet } from '@/api/gptController.js'
import editOrAdd from './dialog/editOrAdd'
import addVersions from './tableItem/dialog/add.vue'
import tableBox from './tableItem/tableBox/index.vue'
/* eslint-disable-next-line */
import tableItem from './tableItem'
export default {
data () {
data() {
return {
myDataSetPage: {
formFilter: {
'searchString': '',
'dimensionType': undefined
searchString: '',
dimensionType: undefined
},
tableData: {
impl: new TableWidget(this.getwidgetData, true, true, false, 'datasetId', false)
}
}
};
}
},
provide () {
provide() {
return {
refresh: this.refresh
}
},
components: { tableItem },
components: {},
computed: {
...mapGetters(['getMainContextHeight']),
tableHeight () {
return this.getMainContextHeight - 118 + 'px';
tableHeight() {
return this.getMainContextHeight - 118 + 'px'
}
},
methods: {
getwidgetData (params) {
if (params == null) params = {};
getwidgetData(params) {
if (params == null) params = {}
params = {
...params,
// orderParam: [
// {
// asc: true,
// dateAggregateBy: '',
// fieldName: ''
// }
// ],
// pageParam: {
// pageNum: 0,
// pageSize: 0
// },
datasetManageDtoFilter: { ...this.myDataSetPage.formFilter }
}
return new Promise((resolve, reject) => {
MyDataSet.list(this, params).then(res => {
resolve({
dataList: res.data.dataList.map((item) => {
return {...item, isEdit: false }
}),
totalCount: res.data.totalCount
});
}).catch(e => {
reject(e);
});
});
MyDataSet.list(this, params)
.then((res) => {
resolve({
dataList: res.data.dataList.map((item) => {
return { ...item, isEdit: false }
}),
totalCount: res.data.totalCount
})
})
.catch((e) => {
reject(e)
})
})
},
add () {
this.$dialog.show('创建模版', editOrAdd, {
area: ['100%', '100%']
}, { isEdit: false }).then(res => {
this.refresh();
}).catch(e => { });
addVersions(row) {
this.$dialog
.show(
'新增数据集版本',
addVersions,
{
area: ['600px', 'auto']
},
{ isEdit: false, datasetId: row.datasetId, versionList: row.datasetVersionList }
)
.then((res) => {
this.refresh()
})
.catch((e) => {})
},
edit (item) {
this.$dialog.show('修改模版', editOrAdd, {
area: ['100%', '100%']
}, { isEdit: true, item: item }).then(res => {
this.refresh();
}).catch(e => { });
delDataset(item) {
this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = { datasetId: item.datasetId }
MyDataSet.delete(this, params)
.then((res) => {
this.$message.success('删除成功')
this.refresh()
})
.catch((e) => {
console.log(e)
})
})
},
del (item) {
all(row) {
// this.dialogTitle = this.value.datasetName
// this.dialogVisible = true
this.$dialog
.show(
row.datasetName,
tableBox,
{
area: ['100%', '100%']
},
{ tableData: row, refresh: this.refresh }
)
.then((res) => {
this.refresh()
})
.catch((e) => {})
},
add() {
this.$dialog
.show(
'创建模版',
editOrAdd,
{
area: ['100%', '100%']
},
{ isEdit: false }
)
.then((res) => {
this.refresh()
})
.catch((e) => {})
},
edit(item) {
this.$dialog
.show(
'修改模版',
editOrAdd,
{
area: ['100%', '100%']
},
{ isEdit: true, item: item }
)
.then((res) => {
this.refresh()
})
.catch((e) => {})
},
del(item) {
this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = { batchTaskId: item.batchTaskId }
MyDataSet.delete(this, params).then(res => {
this.$message.success('删除成功');
this.refresh()
}).catch(e => {
console.log(e);
});
}
);
MyDataSet.delete(this, params)
.then((res) => {
this.$message.success('删除成功')
this.refresh()
})
.catch((e) => {
console.log(e)
})
})
},
refresh (reloadData = false) {
refresh(reloadData = false) {
if (reloadData) {
this.myDataSetPage.tableData.impl.refreshTable(true, 1);
this.myDataSetPage.tableData.impl.refreshTable(true, 1)
} else {
this.myDataSetPage.tableData.impl.refreshTable();
this.myDataSetPage.tableData.impl.refreshTable()
}
},
onReset () {
this.$refs.myDataSetPage.resetFields();
this.refresh(true);
onReset() {
this.$refs.myDataSetPage.resetFields()
this.refresh(true)
},
formInit () {
this.refresh();
formInit() {
this.refresh()
}
},
mounted () {
mounted() {
this.formInit()
}
}
......
......@@ -6,32 +6,27 @@
V {{ form.datasetVersion }}
</el-form-item>
<el-form-item label="备注信息:">
<el-input v-model="form.remark" style="width:70%" type="textarea" :autosize="{ minRows: 2, maxRows: 4 }"
placeholder="请备注本次版本主要做的修改,如添加数据、更换标注方式等,限制50字符内" maxlength="50">
<el-input v-model="form.remark" style="width:70%" type="textarea" :autosize="{ minRows: 2, maxRows: 4 }" placeholder="请备注本次版本主要做的修改,如添加数据、更换标注方式等,限制50字符内" maxlength="50">
</el-input>
</el-form-item>
<el-form-item label="继承历史版本:">
<el-switch v-model="form.isInherit" active-color="#13ce66" inactive-color="#ff4949" :active-value="1"
:inactive-value="0" @change="isInherit">
<el-switch v-model="form.isInherit" active-color="#13ce66" inactive-color="#ff4949" :active-value="1" :inactive-value="0" @change="isInherit">
</el-switch>
</el-form-item>
<el-form-item label="历史版本:" v-if="form.isInherit == 1" prop="hisVersion">
<el-select v-model="form.hisVersion" placeholder="请选择">
<el-option v-for="item in tableData.datasetVersionList" :key="item.datasetVersion"
:label="'V' + item.datasetVersion" :value="item.datasetVersion">
<el-option v-for="item in versionList" :key="item.datasetVersion" :label="'V' + item.datasetVersion" :value="item.datasetVersion">
</el-option>
</el-select>
</el-form-item>
<template v-else>
<el-form-item label="标注类型:" prop="dimensionType">
<el-radio v-for="item in LabelType.getList()" :key="item.id" v-model="form.dimensionType" @change="isText"
:label="item.id">{{ item.name }}</el-radio>
<el-form-item label="标注类型:" prop="dimensionType">
<el-radio v-for="item in LabelType.getList()" :key="item.id" v-model="form.dimensionType" @change="isText" :label="item.id">{{ item.name }}</el-radio>
</el-form-item>
<el-form-item label="标注模版:" v-if="form.dimensionType === 0" prop="template">
<el-radio v-for="item in MarkTemplate.getList()" :key="item.id" v-model="form.template"
:label="item.id">{{ item.name }}</el-radio>
<el-form-item label="标注模版:" v-if="form.dimensionType === 0" prop="template">
<el-radio v-for="item in MarkTemplate.getList()" :key="item.id" v-model="form.template" :label="item.id">{{ item.name }}</el-radio>
</el-form-item>
</template>
<el-row type="flex" justify="end" class="dialog-btn-layer mt20">
......@@ -42,77 +37,77 @@
</template>
<script>
import { DatasetVersion } from '@/api/gptController.js';
import { DatasetVersion } from '@/api/gptController.js'
export default {
data () {
data() {
return {
form: {
'datasetVersion': this.tableData.datasetVersionList.slice(-1)[0].datasetVersion + 1,
datasetVersion: this.versionList.slice(0, 1)[0].datasetVersion + 1,
isInherit: 1,
hisVersion: undefined,
dimensionType: undefined,
template: undefined
},
rules: {
hisVersion: [{required: true, message: '历史版本不能为空', trigger: 'blur'}],
dimensionType: [{required: true, message: '标注模版不能为空', trigger: 'blur'}],
template: [{required: true, message: '标注模版', trigger: 'blur'}]
hisVersion: [{ required: true, message: '历史版本不能为空', trigger: 'blur' }],
dimensionType: [{ required: true, message: '标注模版不能为空', trigger: 'blur' }],
template: [{ required: true, message: '标注模版', trigger: 'blur' }]
}
};
}
},
props: ['isEdit', 'tableData'],
props: ['isEdit', 'datasetId', 'versionList'],
components: {},
computed: {
},
computed: {},
mounted () {
mounted() {
this.intFrom()
},
methods: {
intFrom () {
this.form = { ...this.form, datasetId: this.tableData.datasetId }
intFrom() {
this.form = { ...this.form, datasetId: this.datasetId }
},
onCancel (isSuccess) {
onCancel(isSuccess) {
if (this.observer != null) {
this.observer.cancel(isSuccess);
this.observer.cancel(isSuccess)
}
},
onSubmit () {
onSubmit() {
return new Promise((resolve, reject) => {
this.$refs['form'].validate((valid) => {
if (valid) {
let params = {};
params.datasetVersionDto = { ...this.form };
let params = {}
params.datasetVersionDto = { ...this.form }
if (this.isEdit) {
DatasetVersion.update(this, params).then(res => {
resolve(res);
this.$message.success('编辑成功');
this.onCancel(true);
}).catch(e => {
reject(e);
});
DatasetVersion.update(this, params)
.then((res) => {
resolve(res)
this.$message.success('编辑成功')
this.onCancel(true)
})
.catch((e) => {
reject(e)
})
} else {
DatasetVersion.add(this, params).then(res => {
resolve(res);
this.$message.success('添加成功');
this.onCancel(true);
}).catch(e => {
reject(e);
});
DatasetVersion.add(this, params)
.then((res) => {
resolve(res)
this.$message.success('添加成功')
this.onCancel(true)
})
.catch((e) => {
reject(e)
})
}
} else {
// reject();
}
});
});
})
})
},
isInherit (data) {
isInherit(data) {
if (data === 1) {
this.form.dimensionType = undefined
this.form.template = undefined
......@@ -120,13 +115,13 @@ export default {
this.form.hisVersion = undefined
}
},
isText (data) {
isText(data) {
if (data !== 0) {
this.form.template = undefined
}
}
}
};
}
</script>
<style scoped>
.inputWidth {
......@@ -141,4 +136,5 @@ export default {
.introduce {
font-size: 12px;
color: #909399;
}</style>
}
</style>
......@@ -5,13 +5,9 @@
<el-form-item label="导出文件格式:">
<el-select v-model="form.format" placeholder="请选择">
<el-option
v-for="item in ImportFormat.getList()"
:key="item.id"
:label="item.name"
:value="item.symbol">
</el-option>
</el-select>
<el-option v-for="item in ImportFormat.getList()" :key="item.id" :label="item.name" :value="item.symbol">
</el-option>
</el-select>
</el-form-item>
<el-row type="flex" justify="end" class="dialog-btn-layer mt20">
......@@ -22,50 +18,49 @@
</template>
<script>
// import { DatasetVersion } from '@/api/gptController.js';
import { DatasetVersion } from '@/api/gptController.js'
export default {
data () {
data() {
return {
form: {
format: 'jsonl'
}
};
}
},
props: ['isEdit', 'row'],
components: {},
computed: {
},
computed: {},
mounted () {
},
mounted() {},
methods: {
onCancel (isSuccess) {
onCancel(isSuccess) {
if (this.observer != null) {
this.observer.cancel(isSuccess);
this.observer.cancel(isSuccess)
}
},
downloadFile () {
let params = {
versionId: this.row.versionId
}
this.download('/admin/app/datasetVersion/export', params, '下载文件.' + this.form.format, 'get').then(res => {
// resolve(res);
console.log(res);
this.$message.success('下载成功');
this.onCancel(true);
}).catch(e => {
// reject(e);
});
downloadFile() {
let downDom = document.createElement('a')
let params = { versionId: this.row.versionId, fileType: this.form.format }
DatasetVersion.startExport(this, params).then((res) => {
downDom.href = res.data
downDom.click()
this.onCancel(true)
this.$message.success('下载成功')
})
// this.download('/admin/app/datasetVersion/export', params, '下载文件.' + this.form.format, 'get').then(res => {
// // resolve(res);
// console.log(res);
// this.$message.success('下载成功');
// this.onCancel(true);
// }).catch(e => {
// // reject(e);
// });
}
}
};
}
</script>
<style scoped>
.inputWidth {
......
<!-- 标注 -->
<template>
<div>
<div>
<vxe-table border show-header-overflow show-overflow :row-config="{ isHover: true ,height: 270}" :data="[form.data]" min-height="96">
<!-- <vxe-column field="index" title="序号"></vxe-column> -->
<vxe-column :field="'data.'+item" :title="item" v-for="item in columnList" :key="item">
<template slot-scope="scope">
<el-input style="height: 100%;" type="textarea" placeholder="请输入内容" v-model="scope.row[item]" :rows="10">
</el-input>
</template>
</vxe-column>
<!-- <vxe-column field="index" title="序号"></vxe-column> -->
<vxe-column :field="'data.'+item" :title="item" v-for="item in columnList" :key="item">
<template slot-scope="scope">
<el-input style="height: 100%;" type="textarea" placeholder="请输入内容" v-model="scope.row[item]" :rows="10">
</el-input>
</template>
</vxe-column>
</vxe-table>
<el-row type="flex" justify="end" class="dialog-btn-layer mt20">
</vxe-table>
<el-row type="flex" justify="end" class="dialog-btn-layer mt20">
<el-button :size="defaultFormItemSize" :plain="true" @click="onCancel(false)">取消</el-button>
<el-button type="primary" :size="defaultFormItemSize" @click="onSubmit">确定</el-button>
</el-row>
</div>
</div>
</template>
<script>
import { DatasetData } from '@/api/gptController.js';
import { DatasetData } from '@/api/gptController.js'
export default {
data () {
data() {
return {
form: {
_id: undefined,
data: {},
versionId: undefined
}
};
form: JSON.parse(JSON.stringify(this.row))
}
},
props: ['row', 'columnList', 'refresh'],
components: {},
computed: {},
mounted () {
this.form._id = this.row._id
this.form.versionId = this.row.versionId
this.form.data = this.row.data
delete this.form.data._X_ROW_KEY
console.log(this.form.data);
},
mounted() {},
methods: {
onCancel (isSuccess) {
onCancel(isSuccess) {
if (this.observer != null) {
this.observer.cancel(isSuccess);
this.observer.cancel(isSuccess)
}
},
onSubmit () {
let params = {};
params.datasetMongoDto = this.form;
console.log(params);
DatasetData.update(this, params).then(res => {
this.$message.success('编辑成功');
this.onCancel(true);
}).catch(e => {
});
onSubmit() {
let params = {}
params.datasetMongoDto = this.form
DatasetData.update(this, params)
.then((res) => {
this.$message.success('编辑成功')
this.onCancel(true)
})
.catch((e) => {})
}
}
}
</script>
<style scoped>
</style>
......@@ -3,10 +3,10 @@
<div class="tableItem">
<div class="operation">
<div>
<span @dblclick="checkName">
<span @dblclick="checkName">
数据集名称:
<span v-if="!value.isEdit">{{ value.datasetName }}</span>
<el-input ref="inputName" v-else v-model="value.datasetName" placeholder="请输入内容" :size="defaultFormItemSize" style="width:200px" @change="editName()" @blur="editName()" ></el-input>
<el-input ref="inputName" v-else v-model="value.datasetName" placeholder="请输入内容" :size="defaultFormItemSize" style="width:200px" @change="editName()" @blur="editName()"></el-input>
</span>
<span style="margin-left: 20px">数据集ID:{{ value.datasetId }}</span>
......@@ -18,73 +18,89 @@
<el-button type="text" icon="el-icon-delete" @click="delDataset(value)">删除</el-button>
</div>
</div>
<tableBox :tableData="value" :refresh="refresh" />
<tableBox :tableData="value" :refresh="refresh" />
</div>
</template>
<script>
import { MyDataSet } from '@/api/gptController.js';
import { MyDataSet } from '@/api/gptController.js'
import addVersions from './dialog/add.vue'
import tableBox from './tableBox/index.vue'
export default {
data () {
data() {
return {
dialogVisible: false,
dialogTitle: ''
};
}
},
inject: ['refresh'],
props: {
value: {
type: Object,
default: () => { }
default: () => {}
}
},
components: { tableBox },
computed: {},
mounted () {
},
mounted() {},
methods: {
addVersions () {
this.$dialog.show('新增数据集版本', addVersions, {
area: ['600px', 'auto']
}, { isEdit: false, tableData: this.value }).then(res => {
this.refresh()
}).catch(e => { });
addVersions() {
this.$dialog
.show(
'新增数据集版本',
addVersions,
{
area: ['600px', 'auto']
},
{ isEdit: false, tableData: this.value }
)
.then((res) => {
this.refresh()
})
.catch((e) => {})
},
delDataset (item) {
delDataset(item) {
this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = { datasetId: item.datasetId }
MyDataSet.delete(this, params).then(res => {
this.$message.success('删除成功');
this.refresh()
}).catch(e => {
console.log(e);
});
}
);
MyDataSet.delete(this, params)
.then((res) => {
this.$message.success('删除成功')
this.refresh()
})
.catch((e) => {
console.log(e)
})
})
},
all () {
all() {
// this.dialogTitle = this.value.datasetName
// this.dialogVisible = true
this.$dialog.show(this.value.datasetName, tableBox, {
area: ['100%', '100%']
}, { tableData: this.value, refresh: this.refresh }).then(res => {
this.refresh()
}).catch(e => { });
this.$dialog
.show(
this.value.datasetName,
tableBox,
{
area: ['100%', '100%']
},
{ tableData: this.value, refresh: this.refresh }
)
.then((res) => {
this.refresh()
})
.catch((e) => {})
},
editName () {
editName() {
this.value.isEdit = false
let params = {
datasetManageDto: {
......@@ -92,23 +108,23 @@ export default {
datasetId: this.value.datasetId
}
}
MyDataSet.update(this, params).then(res => {
this.$message.success('修改成功');
this.refresh()
}).catch(e => {
console.log(e);
});
MyDataSet.update(this, params)
.then((res) => {
this.$message.success('修改成功')
this.refresh()
})
.catch((e) => {
console.log(e)
})
},
checkName () {
this.value.isEdit = true;
checkName() {
this.value.isEdit = true
this.$nextTick(() => {
this.$refs.inputName.focus()
})
}
}
}
</script>
<style scoped>
.operation {
......
<!-- 预置数据集 -->
<template>
<div style="position: relative">
<el-form
ref="myDataSetPage"
:model="myDataSetPage"
label-width="75px"
:size="defaultFormItemSize"
label-position="right"
@submit.native.prevent
>
<el-form ref="myDataSetPage" :model="myDataSetPage" label-width="75px" :size="defaultFormItemSize" label-position="right" @submit.native.prevent>
<filter-box :item-width="350" @search="search()" @reset="onReset">
<el-form-item label="标注类型" prop="formFilter.annotationType">
<el-select
v-model="myDataSetPage.formFilter.annotationType"
multiple
placeholder="请选择"
>
<el-option
v-for="item in myDataSetPage.annotationOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
<el-select v-model="myDataSetPage.formFilter.annotationType" multiple placeholder="请选择">
<el-option v-for="item in myDataSetPage.annotationOptions" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="任务类型" prop="formFilter.annotationType">
<el-select
v-model="myDataSetPage.formFilter.annotationType"
multiple
placeholder="请选择"
>
<el-option
v-for="item in myDataSetPage.taskOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
<el-select v-model="myDataSetPage.formFilter.annotationType" multiple placeholder="请选择">
<el-option v-for="item in myDataSetPage.taskOptions" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="领域类型" prop="formFilter.annotationType">
<el-select
v-model="myDataSetPage.formFilter.annotationType"
multiple
placeholder="请选择"
>
<el-option
v-for="item in myDataSetPage.territoryOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
<el-select v-model="myDataSetPage.formFilter.annotationType" multiple placeholder="请选择">
<el-option v-for="item in myDataSetPage.territoryOptions" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="应用场景" prop="formFilter.annotationType">
<el-select
v-model="myDataSetPage.formFilter.annotationType"
multiple
placeholder="请选择"
>
<el-option
v-for="item in myDataSetPage.sceneOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
<el-select v-model="myDataSetPage.formFilter.annotationType" multiple placeholder="请选择">
<el-option v-for="item in myDataSetPage.sceneOptions" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item
label="数据集名称或描述"
prop="formFilter.dataName"
label-width="125px"
>
<el-input
class="filter-item"
v-model="myDataSetPage.formFilter.dataName"
:clearable="true"
placeholder="数据集名称或描述"
/>
<el-form-item label="数据集名称或描述" prop="formFilter.dataName" label-width="125px">
<el-input class="filter-item" v-model="myDataSetPage.formFilter.dataName" :clearable="true" placeholder="数据集名称或描述" />
</el-form-item>
</filter-box>
</el-form>
<div :style="{ height: tableHeight ,background:'#fff'}" >
<div :style="{ height: tableHeight ,background:'#fff'}">
<cardBox class="tableBox" :list="[1,2,3]" :refresh="refresh"></cardBox>
<el-row slot="pagination" type="flex" justify="end" style="margin-top: 16px;">
<el-row slot="pagination" type="flex" justify="end" style="margin-top: 16px;width: 100%;">
<el-pagination :total="myDataSetPage.tableData.impl.totalCount" :current-page="myDataSetPage.tableData.impl.currentPage" :page-size="myDataSetPage.tableData.impl.pageSize" :page-sizes="[10, 20, 50, 100]" layout="total, prev, pager, next, sizes" @current-change="myDataSetPage.tableData.impl.onCurrentPageChange" @size-change="myDataSetPage.tableData.impl.onPageSizeChange">
</el-pagination>
</el-row>
......@@ -97,12 +45,12 @@
<script>
/* eslint-disable-next-line */
import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/widget.js';
import { mapGetters } from 'vuex';
import cardBox from './cardBox';
import { ModelSquare } from '@/api/gptController.js';
import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/widget.js'
import { mapGetters } from 'vuex'
import cardBox from './cardBox'
import { ModelSquare } from '@/api/gptController.js'
export default {
data () {
data() {
return {
myDataSetPage: {
formFilter: {
......@@ -155,30 +103,29 @@ export default {
}
},
filterBoxheight: 0
};
}
},
components: {cardBox},
components: { cardBox },
computed: {
...mapGetters(['getMainContextHeight']),
tableHeight () {
return this.getMainContextHeight - this.filterBoxheight - 32 + 'px';
tableHeight() {
return this.getMainContextHeight - this.filterBoxheight - 32 + 'px'
}
},
mounted () {
this.filterBoxheight = this.$refs.myDataSetPage?.$el.clientHeight;
mounted() {
this.filterBoxheight = this.$refs.myDataSetPage?.$el.clientHeight
window.addEventListener('resize', () => {
this.filterBoxheight = this.$refs.myDataSetPage?.$el.clientHeight;
});
this.filterBoxheight = this.$refs.myDataSetPage?.$el.clientHeight
})
this.formInit()
},
methods: {
getwidgetData (params) {
if (params == null) params = {};
getwidgetData(params) {
if (params == null) params = {}
params = {
...params
......@@ -186,38 +133,39 @@ export default {
}
return new Promise((resolve, reject) => {
ModelSquare.list(this, params).then(res => {
resolve({
dataList: res.data.dataList,
totalCount: res.data.totalCount
});
}).catch(e => {
reject(e);
});
});
ModelSquare.list(this, params)
.then((res) => {
resolve({
dataList: res.data.dataList,
totalCount: res.data.totalCount
})
})
.catch((e) => {
reject(e)
})
})
},
refresh (reloadData = false) {
refresh(reloadData = false) {
if (reloadData) {
this.myDataSetPage.tableData.impl.refreshTable(true, 1);
this.myDataSetPage.tableData.impl.refreshTable(true, 1)
} else {
this.myDataSetPage.tableData.impl.refreshTable();
this.myDataSetPage.tableData.impl.refreshTable()
}
},
onReset () {
this.$refs.myDataSetPage.resetFields();
this.refresh(true);
onReset() {
this.$refs.myDataSetPage.resetFields()
this.refresh(true)
},
formInit () {
this.refresh();
formInit() {
this.refresh()
},
search () {},
handleChange () {}
search() {},
handleChange() {}
}
};
}
</script>
<style lang="scss" scoped>
.tableBox {
background-color: white;
width: 100%;
......@@ -229,5 +177,4 @@ export default {
align-content: flex-start;
justify-content: space-between;
}
</style>
<!-- -->
<template>
<el-card class="box-card">
<div class="titleBox">
<div class="title omit">{{item.knowledgeName}}</div>
<!-- <div>
<el-button size="mini" v-if="isPreset">复制</el-button>
<el-dropdown v-else @command="handleCommand($event,item)">
<span class="el-dropdown-link">
<i class="el-icon-more el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown" >
<el-dropdown-item command="particulars">详情</el-dropdown-item>
<el-dropdown-item command="edit">编辑</el-dropdown-item>
<el-dropdown-item command="del">命中测试</el-dropdown-item>
<el-dropdown-item command="del">删除</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div> -->
</div>
<div class="tagBox">
<el-tag class="tag" type="info" size="mini" v-for="item2 in getTemplateLabel(item)" :key="item2">{{ item2 }}</el-tag>
</div>
<div class="content omit_2">{{ item.knowledgeDescribe }}</div>
<el-divider style="margin: 14px 0"></el-divider>
<div class="buttonBox">
<!-- <div>
<el-tooltip :content="'收藏量'+item.viewCount" placement="top">
<el-button type="text" :icon="item.isCollect==0?'el-icon-star-off':'el-icon-star-on'" @click="collect(item)" :style="{color:item.isCollect==0?'#333':'#ff9326'}">{{ item.isCollect==0?'收藏':'已收藏' }}</el-button>
</el-tooltip>
<el-tooltip :content="'浏览量'+item.viewCount" placement="top">
<el-button type="text" style="color: #333" icon="el-icon-view">{{ item.viewCount}}</el-button>
</el-tooltip>
</div> -->
<div style="margin-bottom:10px">
<el-button :size="defaultFormItemSize" :plain="true" @click="handleCommand('auth',item)">授权</el-button>
<el-button :size="defaultFormItemSize" :plain="true" @click="handleCommand('edit',item)">编辑</el-button>
<el-button :size="defaultFormItemSize" :plain="true" @click="handleCommand('del',item)">删除</el-button>
</div>
</div>
</el-card>
</template>
<script>
import { KnowledgeManage } from '@/api/gptController.js'
import editOrAdd from '../dialog/editOrAdd'
export default {
data() {
return {}
},
props: ['item', 'isPreset', 'refresh'],
components: {},
computed: {
getTemplateLabel() {
return (item) => {
if (item.templateLabel) {
return JSON.parse(item.templateLabel)
} else {
return []
}
}
}
},
mounted() {},
methods: {
collect(item) {
let params = { templateId: item.templateId }
if (item.isCollect) {
KnowledgeManage.deleteCollect(this, params)
.then((res) => {
this.$message.success('取消收藏')
this.refresh()
})
.catch((e) => {
console.log(e)
})
} else {
KnowledgeManage.addCollect(this, params)
.then((res) => {
this.$message.success('收藏成功')
this.refresh()
})
.catch((e) => {
console.log(e)
})
}
},
edit(item) {
this.$dialog
.show(
'修改知识库',
editOrAdd,
{
area: ['100%', '100%']
},
{ isEdit: true, item: item }
)
.then((res) => {
this.refresh()
})
.catch((e) => {
this.refresh()
})
},
del(item) {
this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = { knowledgeId: item.knowledgeId }
KnowledgeManage.delete(this, params)
.then((res) => {
this.$message.success('删除成功')
this.refresh()
})
.catch((e) => {
console.log(e)
})
})
},
copy(item) {
this.$copyText(item.templateContent + '\n' + item.negativeTemplateContent).then(() => {
this.$message.success('复制成功!')
})
},
handleCommand(command, item) {
if (command === 'edit') {
this.edit(item)
} else if (command === 'del') {
this.del(item)
} else if (command === 'copy') {
this.copy(item)
} else if (command === 'auth') {
this.auth(item)
}
}
}
}
</script>
<style lang="scss" scoped>
@import '@/assets/style/element-variables.scss';
.box-card {
width: calc(100% / 4 - 20px);
height: 180px;
flex-shrink: 0;
margin-bottom: 20px;
min-width: 300px;
background: linear-gradient(to bottom, #e7efff 10%, #fff 50%);
}
div /deep/.el-divider--horizontal {
margin: 14px 0 0 0;
}
.title {
font-size: 16px;
color: $--color-text-primary;
}
.content {
margin-bottom: 10px;
color: $--color-text-secondary;
}
/deep/ .el-card__body {
height: 100%;
width: 100%;
position: relative;
}
.buttonBox {
display: flex;
justify-content: space-between;
position: absolute;
bottom: 0;
right: 20px;
}
.tag:not(:last-child) {
margin-right: 10px;
}
.titleBox {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 16px;
}
.tagBox {
margin-bottom: 10px;
}
/deep/ .el-icon-star-on {
font-size: 14px !important;
overflow: hidden;
position: relative;
top: 4px;
left: 3px;
}
/deep/ .el-icon-star-on:before {
zoom: 1.3;
}
/deep/ .el-icon-star-off {
font-size: 14px !important;
}
</style>
<!-- 创建知识库 -->
<template>
<div>
<div style="width: 60%;">
</div>
</div>
</template>
<script>
// import indexConfiguration from './indexConfiguration/index';
export default {
data() {
return {
active: 1,
knowledgeName: ''
}
},
props: ['isEdit', 'item'],
components: {},
computed: {},
mounted() {},
methods: {
onCancel(isSuccess) {
if (this.observer != null) {
this.observer.cancel(isSuccess)
}
}
}
}
</script>
<style scoped>
.inputWidth {
width: 600px;
}
form /deep/ .dialog-btn-layer {
position: absolute;
bottom: 20px;
right: 20px;
background: #fff;
}
</style>
<!--命中测试-->
<template>
<div style="position: relative">
<div class="topBox">
<div class="title">命中测试</div>
<div class="instructions"></div>
</div>
<div class="tableBox" :style="{ height: tableHeight }">
<el-form ref="myDataSetPage" :model="myDataSetPage" label-width="75px" :size="defaultFormItemSize" label-position="right" @submit.native.prevent>
<filter-box :item-width="350" @search="refresh()" @reset="onReset">
<el-form-item label-width="0px">
<el-button class="add" type="primary" icon="el-icon-plus" :size="defaultFormItemSize" @click="add()">创建知识库</el-button>
</el-form-item>
<el-form-item label="知识库名称" prop="formFilter.searchString" label-width="120px">
<el-input class="filter-item" v-model="myDataSetPage.formFilter.searchString" :clearable="true" placeholder="知识库名称" />
</el-form-item>
</filter-box>
</el-form>
<div class="cardBox">
<card v-for="item in myDataSetPage.tableData.impl.dataList" :item="item" :key="item.knowledgeId" :refresh="refresh"></card>
<div class="box-card-2" v-for="item in 3" :key="item"></div>
</div>
<el-row slot="pagination" type="flex" justify="end" style="margin-top: 16px;width: 100%;">
<el-pagination :total="myDataSetPage.tableData.impl.totalCount" :current-page="myDataSetPage.tableData.impl.currentPage" :page-size="myDataSetPage.tableData.impl.pageSize" :page-sizes="[10, 20, 50, 100]" layout="total, prev, pager, next, sizes" @current-change="myDataSetPage.tableData.impl.onCurrentPageChange" @size-change="myDataSetPage.tableData.impl.onPageSizeChange">
</el-pagination>
</el-row>
</div>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
/* eslint-disable-next-line */
import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/widget.js'
import { KnowledgeManage } from '@/api/gptController.js'
import editOrAdd from './dialog/editOrAdd'
import card from './card/index'
export default {
data() {
return {
myDataSetPage: {
formFilter: {
searchString: ''
},
tableData: {
impl: new TableWidget(this.getwidgetData, true, true, false, undefined, false)
}
}
}
},
components: { card },
computed: {
...mapGetters(['getMainContextHeight']),
tableHeight() {
return this.getMainContextHeight - 145 + 'px'
}
},
methods: {
getwidgetData(params) {
if (params == null) params = {}
params = {
...params,
knowledgeManageDtoFilter: { ...this.myDataSetPage.formFilter }
}
return new Promise((resolve, reject) => {
KnowledgeManage.list(this, params)
.then((res) => {
resolve({
dataList: res.data.dataList,
totalCount: res.data.totalCount
})
})
.catch((e) => {
reject(e)
})
})
},
add() {
this.$dialog
.show(
'创建知识库',
editOrAdd,
{
area: ['100%', '100%']
},
{ isEdit: false }
)
.then((res) => {
this.refresh()
})
.catch((e) => {
this.refresh()
})
},
edit(item) {
this.$dialog
.show(
'修改知识库',
editOrAdd,
{
area: ['100%', '100%']
},
{ isEdit: true, item: item }
)
.then((res) => {
this.refresh()
})
.catch((e) => {
this.refresh()
})
},
del(item) {
this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = { knowledgeId: item.knowledgeId }
KnowledgeManage.delete(this, params)
.then((res) => {
this.$message.success('删除成功')
this.refresh()
})
.catch((e) => {
console.log(e)
})
})
},
refresh(reloadData = false) {
if (reloadData) {
this.myDataSetPage.tableData.impl.refreshTable(true, 1)
} else {
this.myDataSetPage.tableData.impl.refreshTable()
}
},
onReset() {
this.$refs.myDataSetPage.resetFields()
this.refresh(true)
},
formInit() {
this.refresh()
}
},
mounted() {
this.formInit()
}
}
</script>
<style lang="scss" scoped>
@import '@/assets/style/element-variables.scss';
.topBox {
background-color: white;
width: 100%;
height: 95px;
margin-bottom: 16px;
.title {
color: $--color-text-primary;
font-size: 16px;
font-weight: 500;
margin-bottom: 8px;
padding: 20px 20px 10px 20px;
}
}
.instructions {
padding: 0px 20px 20px 20px;
.describe {
color: $--color-text-secondary;
margin-bottom: 16px;
}
.itemTitle {
color: $--color-text-primary;
font-size: 16px;
font-weight: 500;
margin-bottom: 8px;
}
.head-index {
font-size: 24px;
color: #e8e9eb;
line-height: 32px;
}
.itemDescribe {
width: 170px;
color: $--color-text-secondary;
}
.img {
height: 72px;
width: 140px;
}
}
.tableBox {
background-color: white;
width: 100%;
padding: 20px;
overflow: auto;
.add {
margin-bottom: 20px;
}
}
.cardBox {
display: flex;
flex-wrap: wrap;
justify-content: space-around;
align-content: flex-start;
justify-content: space-between;
}
.box-card-2 {
width: calc(100% / 4 - 20px);
min-width: 300px;
flex-shrink: 0;
height: 0;
}
</style>
<!-- -->
<template>
<el-card class="box-card" >
<div class="titleBox">
<div class="title omit">{{item.knowledgeName}}</div>
<!-- <div>
<el-card class="box-card">
<div class="titleBox">
<div class="title omit">{{item.knowledgeName}}</div>
<!-- <div>
<el-button size="mini" v-if="isPreset">复制</el-button>
<el-dropdown v-else @command="handleCommand($event,item)">
<span class="el-dropdown-link">
......@@ -19,15 +19,15 @@
</el-dropdown-menu>
</el-dropdown>
</div> -->
</div>
<div class="tagBox">
<el-tag class="tag" type="info" size="mini" v-for="item2 in getTemplateLabel(item)" :key="item2">{{ item2 }}</el-tag>
</div>
<div class="content omit_2">{{ item.knowledgeDescribe }}</div>
</div>
<div class="tagBox">
<el-tag class="tag" type="info" size="mini" v-for="item2 in getTemplateLabel(item)" :key="item2">{{ item2 }}</el-tag>
</div>
<div class="content omit_2">{{ item.knowledgeDescribe }}</div>
<el-divider style="margin: 14px 0"></el-divider>
<div class="buttonBox">
<!-- <div>
<el-divider style="margin: 14px 0"></el-divider>
<div class="buttonBox">
<!-- <div>
<el-tooltip :content="'收藏量'+item.viewCount" placement="top">
<el-button type="text" :icon="item.isCollect==0?'el-icon-star-off':'el-icon-star-on'" @click="collect(item)" :style="{color:item.isCollect==0?'#333':'#ff9326'}">{{ item.isCollect==0?'收藏':'已收藏' }}</el-button>
</el-tooltip>
......@@ -35,30 +35,31 @@
<el-button type="text" style="color: #333" icon="el-icon-view">{{ item.viewCount}}</el-button>
</el-tooltip>
</div> -->
<div style="margin-bottom:10px">
<el-button :size="defaultFormItemSize" :plain="true" @click="handleCommand('auth',item)" >授权</el-button>
<el-button :size="defaultFormItemSize" :plain="true" @click="handleCommand('edit',item)" >编辑</el-button>
<el-button :size="defaultFormItemSize" :plain="true" @click="handleCommand('del',item)">删除</el-button>
</div>
<div style="margin-bottom:10px">
<el-button :size="defaultFormItemSize" :plain="true" @click="handleCommand('auth',item)">授权</el-button>
<el-button :size="defaultFormItemSize" :plain="true" @click="handleCommand('import',item)">文件导入</el-button>
<el-button :size="defaultFormItemSize" :plain="true" @click="handleCommand('del',item)">删除</el-button>
</div>
</el-card>
</div>
</el-card>
</template>
<script>
import { KnowledgeManage } from '@/api/gptController.js';
import editOrAdd from '../dialog/editOrAdd';
import authKnowledgeUser from '../dialog/authKnowledgeUser/index';
import { KnowledgeManage } from '@/api/gptController.js'
import importConfiguration from '../dialog/importConfiguration/index'
import importConfiguration2 from '../dialog/importConfiguration/index-2.vue'
import authKnowledgeUser from '../dialog/authKnowledgeUser/index'
export default {
data () {
return {
};
data() {
return {}
},
props: ['item', 'isPreset', 'refresh'],
components: {},
computed: {
getTemplateLabel () {
getTemplateLabel() {
return (item) => {
if (item.templateLabel) {
return JSON.parse(item.templateLabel)
......@@ -69,65 +70,90 @@ export default {
}
},
mounted () { },
mounted() {},
methods: {
collect (item) {
let params = {templateId: item.templateId }
collect(item) {
let params = { templateId: item.templateId }
if (item.isCollect) {
KnowledgeManage.deleteCollect(this, params).then(res => {
this.$message.success('取消收藏');
this.refresh()
}).catch(e => {
console.log(e);
});
KnowledgeManage.deleteCollect(this, params)
.then((res) => {
this.$message.success('取消收藏')
this.refresh()
})
.catch((e) => {
console.log(e)
})
} else {
KnowledgeManage.addCollect(this, params).then(res => {
this.$message.success('收藏成功');
this.refresh()
}).catch(e => {
console.log(e);
});
KnowledgeManage.addCollect(this, params)
.then((res) => {
this.$message.success('收藏成功')
this.refresh()
})
.catch((e) => {
console.log(e)
})
}
},
edit (item) {
this.$dialog.show('修改知识库', editOrAdd, {
area: ['100%', '100%']
}, { isEdit: true, item: item }).then(res => {
this.refresh();
}).catch(e => { this.refresh(); });
import(item) {
this.$dialog
.show(
'导入文件',
item.knowledgeFormat === '1' ? importConfiguration2 : importConfiguration,
{
area: ['100%', '100%']
},
{ isEdit: true, item: item, knowledgeName: item.knowledgeName, knowledgeFormat: item.knowledgeFormat }
)
.then((res) => {
this.refresh()
})
.catch((e) => {
this.refresh()
})
},
auth (item) {
this.$dialog.show('授权知识库', authKnowledgeUser, {
area: ['1100px', '600px']
}, { knowledgeId: item.knowledgeId }).then(res => {
this.refresh();
}).catch(e => { this.refresh(); });
auth(item) {
this.$dialog
.show(
'授权知识库',
authKnowledgeUser,
{
area: ['1100px', '600px']
},
{ knowledgeId: item.knowledgeId }
)
.then((res) => {
this.refresh()
})
.catch((e) => {
this.refresh()
})
},
del (item) {
del(item) {
this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = { knowledgeId: item.knowledgeId}
KnowledgeManage.delete(this, params).then(res => {
this.$message.success('删除成功');
this.refresh()
}).catch(e => {
console.log(e);
});
}
);
let params = { knowledgeId: item.knowledgeId }
KnowledgeManage.delete(this, params)
.then((res) => {
this.$message.success('删除成功')
this.refresh()
})
.catch((e) => {
console.log(e)
})
})
},
copy (item) {
copy(item) {
this.$copyText(item.templateContent + '\n' + item.negativeTemplateContent).then(() => {
this.$message.success('复制成功!')
})
},
handleCommand (command, item) {
if (command === 'edit') {
this.edit(item)
handleCommand(command, item) {
if (command === 'import') {
this.import(item)
} else if (command === 'del') {
this.del(item)
} else if (command === 'copy') {
......@@ -138,10 +164,9 @@ export default {
}
}
}
</script>
<style lang="scss" scoped>
@import "@/assets/style/element-variables.scss";
@import '@/assets/style/element-variables.scss';
.box-card {
width: calc(100% / 4 - 20px);
height: 180px;
......@@ -190,15 +215,15 @@ div /deep/.el-divider--horizontal {
}
/deep/ .el-icon-star-on {
font-size: 14px !important;
overflow: hidden;
position: relative;
top: 4px;
left: 3px;
overflow: hidden;
position: relative;
top: 4px;
left: 3px;
}
/deep/ .el-icon-star-on:before{
/deep/ .el-icon-star-on:before {
zoom: 1.3;
}
/deep/ .el-icon-star-off{
/deep/ .el-icon-star-off {
font-size: 14px !important;
}
</style>
<!-- 创建知识库 -->
<template>
<div>
<div>
<el-steps :active="active" style="width:100%;margin:0 auto 20px auto">
<el-step title="基本信息" icon="el-icon-s-order"></el-step>
<el-step title="导入配置" icon="el-icon-upload"></el-step>
<!-- <el-step title="索引配置"></el-step> -->
</el-steps>
<!-- <el-steps :active="active" style="width:60%;margin:0 auto 20px auto">
<el-step title="基本信息" icon="el-icon-s-order"></el-step>
<el-step title="导入配置" icon="el-icon-upload"></el-step>
<essentialInformation v-if="active==1" :item="item" :isEdit="isEdit" />
<importConfiguration v-if="active==2" :item="item" :knowledgeName="knowledgeName" />
</el-steps> -->
<div style="width: 60%;">
<essentialInformation v-if="active==1" :item="item" :isEdit="isEdit" />
<importConfiguration v-if="active==2 && knowledgeFormat==0" :item="item" :knowledgeName="knowledgeName" />
<importConfiguration2 v-if="active==2 && knowledgeFormat==1" :item="item" :knowledgeName="knowledgeName" />
</div>
</div>
</template>
<script>
// import indexConfiguration from './indexConfiguration/index';
import importConfiguration from './importConfiguration/index';
import essentialInformation from './essentialInformation/index';
import importConfiguration from './importConfiguration/index'
import importConfiguration2 from './importConfiguration/index-2'
import essentialInformation from './essentialInformation/index'
export default {
data () {
data() {
return {
active: 1,
knowledgeName: '',
knowledgeCode: ''
};
knowledgeFormat: undefined
}
},
props: ['isEdit', 'item'],
components: { importConfiguration, essentialInformation},
computed: {
},
components: { importConfiguration, essentialInformation, importConfiguration2 },
mounted () {
computed: {},
},
mounted() {},
methods: {
onCancel (isSuccess) {
onCancel(isSuccess) {
if (this.observer != null) {
this.observer.cancel(isSuccess);
this.observer.cancel(isSuccess)
}
}
}
};
}
</script>
<style scoped>
.inputWidth {
......@@ -62,4 +58,5 @@ form /deep/ .dialog-btn-layer {
bottom: 20px;
right: 20px;
background: #fff;
}</style>
}
</style>
<!-- 基本信息 -->
<template>
<el-form label-position="left" ref="form" label-width="120px" :model="form" :size="defaultFormItemSize" :rules="rules">
<el-form label-position="left" ref="form" label-width="120px" :model="form" :size="defaultFormItemSize" :rules="rules">
<el-row class="title">基本信息</el-row>
<el-form-item label="知识库名称:" prop="knowledgeName">
<el-input :disabled="this.isEdit" v-model="form.knowledgeName" class="inputWidth" :size="defaultFormItemSize" ></el-input>
<el-input :disabled="this.isEdit" v-model="form.knowledgeName" class="inputWidth" :size="defaultFormItemSize"></el-input>
</el-form-item>
<el-form-item label="知识库描述:" prop="knowledgeDescribe">
<el-form-item label="知识格式:" prop="knowledgeFormat">
<el-radio-group v-model="form.knowledgeFormat">
<el-radio-button v-for="item in KnowledgeFormat.getList()" :key="item.id" :label="item.id">{{ item.name }}</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="知识库描述:" prop="knowledgeDescribe">
<el-input v-model="form.knowledgeDescribe" type="textarea" :rows="4" class="inputWidth" :size="defaultFormItemSize" placeholder="描述这个知识库的内容,详细的描述可以让AI及时访问知识库的内容。如果为空,将影响该知识库在知识问答中被检索到的概率,因此建议尽可能对知识库详细地总结描述。"></el-input>
</el-form-item>
<el-row type="flex" justify="end" class="dialog-btn-layer mt20">
<el-row type="flex" justify="end" class="dialog-btn-layer mt20">
<template>
<el-button :size="defaultFormItemSize" :plain="true" @click="onCancel()" >取消</el-button>
<el-button :size="defaultFormItemSize" :plain="true" @click="onCancel()">取消</el-button>
<el-button :size="defaultFormItemSize" :plain="true" @click="onSubmit()">下一步</el-button>
</template>
</template>
</el-row>
</el-form >
</el-form>
</template>
<script>
import { KnowledgeManage } from '@/api/gptController.js';
import { KnowledgeManage } from '@/api/gptController.js'
export default {
data () {
data() {
return {
form: {
'knowledgeDescribe': undefined,
'knowledgeName': undefined,
'knowledgeCode': undefined,
knowledgeId: undefined
knowledgeDescribe: undefined,
knowledgeName: undefined,
knowledgeId: undefined,
knowledgeFormat: 0
},
rules: {
knowledgeName: [
{ required: true, message: '请填写知识库名称', trigger: 'blur' }
]
knowledgeName: [{ required: true, message: '请填写知识库名称', trigger: 'blur' }]
}
};
}
},
props: ['isEdit', 'item'],
components: {},
computed: {},
mounted () {
mounted() {
this.init()
},
methods: {
init () {
init() {
if (this.isEdit) {
this.form.knowledgeDescribe = this.item.knowledgeDescribe
this.form.knowledgeName = this.item.knowledgeName
this.form.knowledgeCode = this.item.knowledgeCode
this.form.knowledgeId = this.item?.knowledgeId
}
},
onSubmit () {
onSubmit() {
return new Promise((resolve, reject) => {
this.$refs['form'].validate((valid) => {
if (valid) {
let params = {};
params.knowledgeManageDto = { ...this.form };
let params = {}
params.knowledgeManageDto = { ...this.form }
if (this.isEdit) {
KnowledgeManage.update(this, params).then(res => {
resolve(res);
this.$message.success('编辑成功');
this.next(res)
}).catch(e => {
reject(e);
});
KnowledgeManage.update(this, params)
.then((res) => {
resolve(res)
this.$message.success('编辑成功')
this.next(res)
})
.catch((e) => {
reject(e)
})
} else {
KnowledgeManage.add(this, params).then(res => {
resolve(res);
this.$message.success('添加成功');
this.next(res)
}).catch(e => {
reject(e);
});
KnowledgeManage.add(this, params)
.then((res) => {
resolve(res)
this.$message.success('添加成功')
this.next(res)
})
.catch((e) => {
reject(e)
})
}
} else {
// this.$message.error('请完善必填信息');
// reject();
}
});
});
})
})
},
onCancel () {
onCancel() {
this.$parent.onCancel(false)
},
next (res) {
next(res) {
this.$parent.knowledgeName = this.form.knowledgeName
this.$parent.knowledgeCode = res.data.knowledgeCode;
this.$parent.knowledgeFormat = this.form.knowledgeFormat
this.$parent.active++
}
}
}
</script>
<style scoped>
.introduce{
.introduce {
font-size: 12px;
color: #909399;
}
......
<!-- 自定义分段 -->
<template>
<div>
<el-form-item label="分段策略:">
<el-radio-group v-model="value.splitType">
<el-radio :label="1">等价分割</el-radio>
<el-radio :label="2">递归分割</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="分段标识符">
<el-select v-model="value.separators" multiple filterable default-first-option placeholder="请选择文章标签">
<el-option v-for="item in SegmentIdentifier.getList()" :key="item.id" :label="item.name" :value="item.symbol">
</el-option>
</el-select>
</el-form-item>
</div>
</template>
<script>
export default {
data() {
return {}
},
props: ['value'],
components: {},
computed: {},
mounted() {},
methods: {}
}
</script>
<style scoped>
</style>
<!-- 自动分段 -->
<template>
<div>
</div>
</template>
<script>
export default {
data() {
return {}
},
props: ['value', 'listFiles', 'delFile', 'down'],
components: {},
computed: {},
mounted() {},
methods: {}
}
</script>
<style scoped>
</style>
<!-- 文本文档格式 导入配置 -->
<template>
<el-form style="width:70%" label-position="left" ref="form" label-width="130px" :model="form" :size="defaultFormItemSize" :rules="rules" v-loading.fullscreen.lock="fullscreenLoading">
<el-row class="title">导入配置</el-row>
<el-form-item label="上传知识库文件:" prop="filesArr">
<el-button @click="clickUp" :size="defaultFormItemSize" type="primary">上传</el-button>
<input style="display:none" ref="upFile" type="file" @change="fileinfo($event.target.files)" multiple accept=".xlsx,.jsonl">
<div class="el-upload__tip"> 创建知识库过程仅支持.xlsx,.jsonl格式文件,单个⽂件不超过60M,只支持UTF-8格式 </div>
<div class="itemFile" v-for="(item,index) in files" :key="item.name"><i class="el-icon-document" style="color:#909399;margin-right:5px"></i>{{ item.name }}
<i class="el-icon-circle-close" style="color:#0092FF;cursor: pointer;" @click="clearFile(index)"></i>
</div>
</el-form-item>
<el-form-item label="已有文件:">
<knowledgeFileList :knowledgeName="knowledgeName" />
</el-form-item>
<el-row type="flex" justify="end" class="dialog-btn-layer mt20">
<template>
<el-button :size="defaultFormItemSize" :plain="true" @click="onCancel(false)">取消</el-button>
<el-button :size="defaultFormItemSize" :plain="true" @click="onSubmit">确认上传</el-button>
</template>
</el-row>
</el-form>
<!-- </template> -->
</template>
<script>
import knowledgeFileList from '../knowledgeFileList'
// import manualSegmentation from './manualSegmentation/index.vue'
export default {
data() {
return {
fullscreenLoading: false,
form: {
segmentedMode: 4, // 结构化数据分段
filesArr: undefined,
knowledge_base_name: '',
override: false,
to_vector_store: true,
not_refresh_vs_cache: false,
separators: undefined
},
files: [],
listFiles: [],
rules: {
filesArr: [{ required: true, message: '请选择文件', trigger: 'blur' }]
}
}
},
props: ['item', 'knowledgeName', 'isEdit'],
components: { knowledgeFileList },
computed: {},
mounted() {},
watch: {},
methods: {
fileinfo(files) {
for (const key in files) {
if (Object.hasOwnProperty.call(files, key)) {
const element = files[key]
if (this.files.map((item) => item.name).indexOf(element.name) === -1) {
this.files.push(element)
this.form.filesArr = this.files
} else {
console.log('重复上传')
}
}
}
this.$refs.upFile.value = ''
},
clickUp() {
this.$refs.upFile.click()
},
onCancel(isSuccess) {
if (this.isEdit) {
if (this.observer != null) {
this.observer.cancel(isSuccess)
}
} else {
this.$parent.onCancel(isSuccess)
}
},
onSubmit() {
console.log(this.form)
return new Promise((resolve, reject) => {
this.$refs['form'].validate((valid) => {
if (valid) {
this.form.knowledge_base_name = this.knowledgeName
let params = {}
params = {
...this.form
}
this.fullscreenLoading = true
this.upload('/2api/knowledge_base/upload_docs', params, false)
.then((res) => {
resolve(res)
this.$message.success('上传成功')
this.fullscreenLoading = false
this.onCancel(false)
})
.catch((e) => {
this.fullscreenLoading = false
this.getFiles()
reject(e)
})
}
})
})
},
back() {
this.$parent.active--
},
clearFile(index) {
this.files.splice(index, 1)
}
}
}
</script>
<style scoped>
.introduce {
font-size: 12px;
color: #909399;
}
.title {
font-size: 20px;
margin-bottom: 16px;
}
.itemFile {
}
.el-upload__tip {
font-size: 12px !important;
}
</style>
<!-- 按层级分段 -->
<template>
<div>
<el-form-item label="标题层级深度:">
<el-slider :min="0" :max="5" v-model="value.titleDepth" show-input>
</el-slider>
</el-form-item>
<!-- <el-form-item label="标题保存方式:">
<el-radio-group v-model="value.SaveMode">
<el-radio-button v-for="item in TitleSaveMode.getList()" :key="item.id" :label="item.id">{{ item.name }}</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label=" 层级分段策略:">
<el-radio-group v-model="value.splitType">
<el-radio :label="1">等价分割</el-radio>
<el-radio :label="2">递归分割</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="层级分段标识符">
<el-select v-model="value.separators" multiple filterable default-first-option placeholder="请选择文章标签">
<el-option v-for="item in SegmentIdentifier.getList()" :key="item.id" :label="item.name" :value="item.symbol">
</el-option>
</el-select>
</el-form-item> -->
</div>
</template>
<script>
export default {
data() {
return {}
},
props: ['value'],
components: {},
computed: {},
mounted() {},
methods: {}
}
</script>
<style scoped>
</style>
<!-- 手动分段 -->
<template>
<div></div>
</template>
<script>
export default {
data() {
return {}
},
components: {},
computed: {},
mounted() {},
methods: {}
}
</script>
<style scoped>
</style>
<!-- 详情 -->
<template>
<div class="box">
<el-card class="box-card" v-for="(item,index) in newList" :key="item.id">
<div slot="header">
<div class="clearfix">
<span class="omit"> <el-tag style="margin-right:10px">{{ index+1 }}</el-tag>{{item.metadata.source}}</span>
<div style="flex-shrink: 0;">
<!-- <el-button type="primary" icon="el-icon-edit" circle size="mini" @click="edit(item)"></el-button>
<el-button type="danger" icon="el-icon-delete" circle size="mini" @click="del(item)"></el-button> -->
<i class="el-icon-edit" @click="edit(item)"></i>
<i class="el-icon-delete" @click="del(item)"></i>
</div>
</div>
</div>
<div class="item">
<span v-if="!item.isEdit">{{item.page_content }}</span>
<div v-else class="text">
<el-input ref="text" type="textarea" style=" font-size: 14px;" v-model="item.page_content ">
</el-input>
<div class="buttonBox">
<el-button size="mini" @click="changValue(item)">确认</el-button>
<el-button size="mini" @click="cancel(item)">取消</el-button>
</div>
</div>
</div>
</el-card>
<div class="box-card" style="height:0px" v-for="item in 4" :key="item"></div>
<el-row slot="pagination" type="flex" justify="end" style="margin-top: 16px;width: 100%;">
<el-pagination :total="totalCount" :current-page="tableData.page_number" :page-size="tableData.page_size" :page-sizes="[10, 20, 50, 100]" layout="total, prev, pager, next, sizes" @current-change="(current)=>getList(current,tableData.page_size)" @size-change="(size)=>getList(tableData.page_number,size)">
</el-pagination>
</el-row>
</div>
</template>
<script>
import { KnowledgeManage } from '@/api/gptController.js'
export default {
data() {
return {
newList: [],
totalCount: 0,
tableData: {
page_number: 1, // 当前页数
page_size: 10 // 每页显示个数
}
}
},
props: ['list', 'knowledgeName', 'fileName'],
components: {},
computed: {},
mounted() {
this.getList()
},
methods: {
getList(pageNumber = this.tableData.page_number, pageSize = this.tableData.page_size) {
this.tableData.page_size = pageSize
this.tableData.page_number = pageNumber
let list = this.list
let params = { knowledge_base_name: this.knowledgeName, file_name: this.fileName, page_number: pageNumber, page_size: pageSize }
KnowledgeManage.listDocs(this, params)
.then((res) => {
let data = JSON.parse(res.data)
list = data.data
this.totalCount = data.total_count
this.newList = list.map((item) => {
return {
isEdit: false,
oldContent: item.page_content,
...item
}
})
})
.catch((e) => {
console.log(e)
})
},
changValue(item) {
//
let params = {
knowledge_base_name: this.knowledgeName,
docs: {
[item.id]: {
page_content: item.page_content,
metadata: {
source: item.metadata.source,
id: item.id
},
type: item.type,
id: item.id,
score: item.score
}
}
}
KnowledgeManage.updateDocsById(this, params)
.then(() => {
item.isEdit = false
})
.catch(() => {})
},
cancel(item) {
item.page_content = item.oldContent
item.isEdit = false
},
edit(item) {
item.isEdit = true
this.$nextTick(() => {
this.$refs.text[0].focus()
})
},
del(item) {
let params = {
knowledge_base_name: this.knowledgeName,
doc_ids: [item.id]
}
this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
KnowledgeManage.deleteDocsById(this, params)
.then((res) => {
this.getList()
})
.catch(() => {})
})
}
}
}
</script>
<style scoped>
.text {
font-size: 14px;
height: calc(100% - 40px);
}
.item {
margin-bottom: 18px;
height: 210px;
overflow: auto;
}
.clearfix {
height: 50px;
line-height: 50px;
font-size: 16px;
display: flex;
justify-content: space-between;
}
.box {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.box-card {
width: 280px;
margin-bottom: 20px;
height: 300px;
font-size: 14px;
}
div /deep/ .el-textarea__inner,
div /deep/.el-textarea {
height: 100%;
}
.buttonBox {
margin-top: 10px;
width: 100%;
padding-left: calc(100% - 124px);
}
.el-icon-edit,
.el-icon-delete {
cursor: pointer;
margin-left: 10px;
}
.el-icon-edit:hover {
color: #0092ff;
}
.el-icon-delete:hover {
color: #f56c6c;
}
</style>
<!-- 知识库文件列表 -->
<template>
<el-table :data="listFiles" style="width: 100%" height="350">
<el-table-column type="index" width="50">
</el-table-column>
<el-table-column prop="name" label="名称">
</el-table-column>
<el-table-column prop="createTime" label="创建时间">
</el-table-column>
<el-table-column prop="fileSize" label="文件大小">
</el-table-column>
<el-table-column prop="docsCount" label="切片数量">
</el-table-column>
<el-table-column label="操作" width="240px">
<template slot-scope="scope">
<el-button type="text" :size="defaultFormItemSize" @click="anew(scope.row)">重新切片</el-button>
<el-button type="text" @click="searchDocs(scope.row)" :size="defaultFormItemSize">切片详情</el-button>
<el-button type="text" @click="delFile(scope.row)" :size="defaultFormItemSize">删除</el-button>
<el-button type="text" @click="down(scope.row)" :size="defaultFormItemSize">下载</el-button>
</template>
</el-table-column>
</el-table>
</template>
<script>
import { KnowledgeManage } from '@/api/gptController.js'
import details from './details'
export default {
data() {
return {
listFiles: [],
sectionList: []
}
},
props: ['knowledgeName', 'params'],
components: {},
computed: {},
mounted() {
this.getFiles()
},
methods: {
getFiles() {
let params = { knowledgeName: this.knowledgeName }
KnowledgeManage.listFiles(this, params)
.then((res) => {
try {
let data = JSON.parse(res.data)
this.listFiles = data.map((item) => {
return {
name: item.file_name,
createTime: item.create_time,
fileSize: (item.file_size / 1024).toFixed(2) + 'KB',
docsCount: item.docs_count
}
})
} catch (error) {
this.listFiles = []
}
})
.catch((e) => {
console.log(e)
})
},
searchDocs(row) {
// let params = { knowledge_base_name: this.knowledgeName, file_name: row.name }
// KnowledgeManage.searchDocs(this, params)
// .then((res) => {
// try {
// this.sectionList = JSON.parse(res.data)
// } catch (error) {
// this.sectionList = []
// }
// })
// .catch((e) => {
// console.log(e)
// })
this.$dialog
.show(
'切片详情',
details,
{
area: ['100%', '100%']
},
{ fileName: row.name, knowledgeName: this.knowledgeName }
)
.then((res) => {})
.catch((e) => {})
},
delFile(row) {
let params = {
knowledge_base_name: this.knowledgeName,
file_names: [row.name],
delete_content: true,
not_refresh_vs_cache: false
}
this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
KnowledgeManage.deleteDocs(this, params)
.then((res) => {
if (res.success) {
this.getFiles()
}
})
.catch((e) => {
console.log(e)
})
})
},
down(row) {
// 下载文件
let params = { knowledge_base_name: this.knowledgeName, file_name: row.name, boolean: false }
this.download('/2api/knowledge_base/download_doc', params, row.name, 'get', false).then((res) => {})
},
anew(row) {
// 重新切片
if (
this.KnowledgeImportFormat.getList().find((item) => {
return item.symbol === row.name.split('.').pop().toLowerCase()
}).id !== this.params.importFormat
) {
this.$message.error('请选择对应格式')
return
}
this.$confirm('是否重新切片', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
KnowledgeManage.updateDocs(this, { ...this.params, file_names: [row.name], knowledge_base_name: this.knowledgeName, not_refresh_vs_cache: false, doc: {} })
.then((res) => {
if (res.success) {
this.getFiles()
this.$message.success('重新切片成功')
}
})
.catch((e) => {
console.log(e)
})
})
}
}
}
</script>
<style scoped>
</style>
<!--知识库-->
<template>
<div style="position: relative">
<div style="position: relative" v-rightClick="'#aaa'">
<div id="aaa" style="display: none; position: fixed;">123123</div>
<div class="topBox">
<div class="title">知识库</div>
<div class="instructions">面向客户构建私域文档或知识管理的能力,实现本地数据源文档的上传、分段和清洗并储存至向量数据库中。</div>
......@@ -18,10 +19,10 @@
</filter-box>
</el-form>
<div class="cardBox">
<card v-for="item in myDataSetPage.tableData.impl.dataList" :item="item" :key="item.knowledgeId" :refresh="refresh"></card>
<div class="box-card-2" v-for="item in 3" :key="item"></div>
</div>
<el-row slot="pagination" type="flex" justify="end" style="margin-top: 16px;">
<card v-for="item in myDataSetPage.tableData.impl.dataList" :item="item" :key="item.knowledgeId" :refresh="refresh"></card>
<div class="box-card-2" v-for="item in 3" :key="item"></div>
</div>
<el-row slot="pagination" type="flex" justify="end" style="margin-top: 16px;width: 100%;">
<el-pagination :total="myDataSetPage.tableData.impl.totalCount" :current-page="myDataSetPage.tableData.impl.currentPage" :page-size="myDataSetPage.tableData.impl.pageSize" :page-sizes="[10, 20, 50, 100]" layout="total, prev, pager, next, sizes" @current-change="myDataSetPage.tableData.impl.onCurrentPageChange" @size-change="myDataSetPage.tableData.impl.onPageSizeChange">
</el-pagination>
</el-row>
......@@ -30,112 +31,132 @@
</template>
<script>
import { mapGetters } from 'vuex';
import { mapGetters } from 'vuex'
/* eslint-disable-next-line */
import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/widget.js';
import { KnowledgeManage } from '@/api/gptController.js';
import editOrAdd from './dialog/editOrAdd';
import card from './card/index';
import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/widget.js'
import { KnowledgeManage } from '@/api/gptController.js'
import editOrAdd from './dialog/editOrAdd'
import card from './card/index'
export default {
data () {
data() {
return {
myDataSetPage: {
formFilter: {
'searchString': ''
searchString: ''
},
tableData: {
impl: new TableWidget(this.getwidgetData, true, true, false, undefined, false)
}
}
};
}
},
components: {card},
components: { card },
computed: {
...mapGetters(['getMainContextHeight']),
tableHeight () {
return this.getMainContextHeight - 145 + 'px';
tableHeight() {
return this.getMainContextHeight - 145 + 'px'
}
},
methods: {
getwidgetData (params) {
if (params == null) params = {};
getwidgetData(params) {
if (params == null) params = {}
params = {
...params,
knowledgeManageDtoFilter: { ...this.myDataSetPage.formFilter }
}
return new Promise((resolve, reject) => {
KnowledgeManage.list(this, params).then(res => {
resolve({
dataList: res.data.dataList,
totalCount: res.data.totalCount
});
}).catch(e => {
reject(e);
});
});
KnowledgeManage.list(this, params)
.then((res) => {
resolve({
dataList: res.data.dataList,
totalCount: res.data.totalCount
})
})
.catch((e) => {
reject(e)
})
})
},
add () {
this.$dialog.show('创建知识库', editOrAdd, {
area: ['100%', '100%']
}, { isEdit: false }).then(res => {
this.refresh();
}).catch(e => { this.refresh(); });
add() {
this.$dialog
.show(
'创建知识库',
editOrAdd,
{
area: ['100%', '100%']
},
{ isEdit: false }
)
.then((res) => {
this.refresh()
})
.catch((e) => {
this.refresh()
})
},
edit (item) {
this.$dialog.show('修改知识库', editOrAdd, {
area: ['100%', '100%']
}, { isEdit: true, item: item }).then(res => {
this.refresh();
}).catch(e => { this.refresh(); });
edit(item) {
this.$dialog
.show(
'修改知识库',
editOrAdd,
{
area: ['100%', '100%']
},
{ isEdit: true, item: item }
)
.then((res) => {
this.refresh()
})
.catch((e) => {
this.refresh()
})
},
del (item) {
del(item) {
this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = { knowledgeId: item.knowledgeId }
KnowledgeManage.delete(this, params).then(res => {
this.$message.success('删除成功');
this.refresh()
}).catch(e => {
console.log(e);
});
}
);
KnowledgeManage.delete(this, params)
.then((res) => {
this.$message.success('删除成功')
this.refresh()
})
.catch((e) => {
console.log(e)
})
})
},
refresh (reloadData = false) {
refresh(reloadData = false) {
if (reloadData) {
this.myDataSetPage.tableData.impl.refreshTable(true, 1);
this.myDataSetPage.tableData.impl.refreshTable(true, 1)
} else {
this.myDataSetPage.tableData.impl.refreshTable();
this.myDataSetPage.tableData.impl.refreshTable()
}
},
onReset () {
this.$refs.myDataSetPage.resetFields();
this.refresh(true);
onReset() {
this.$refs.myDataSetPage.resetFields()
this.refresh(true)
},
formInit () {
this.refresh();
formInit() {
this.refresh()
}
},
mounted () {
mounted() {
this.formInit()
}
};
}
</script>
<style lang="scss" scoped>
@import "@/assets/style/element-variables.scss";
@import '@/assets/style/element-variables.scss';
.topBox {
background-color: white;
width: 100%;
......
<!-- -->
<template>
<el-card class="box-card">
<div class="titleBox">
<div class="title omit">{{ item.kgName}}</div>
<!-- <div>
<el-button size="mini" v-if="isPreset">复制</el-button>
<el-dropdown v-else @command="handleCommand($event,item)">
<span class="el-dropdown-link">
<i class="el-icon-more el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown" >
<el-dropdown-item command="particulars">详情</el-dropdown-item>
<el-dropdown-item command="edit">编辑</el-dropdown-item>
<el-dropdown-item command="del">命中测试</el-dropdown-item>
<el-dropdown-item command="del">删除</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div> -->
</div>
<div class="content omit_2">{{ item.kgDescribe }}</div>
<el-divider style="margin: 14px 0"></el-divider>
<div class="buttonBox">
<!-- <div>
<el-tooltip :content="'收藏量'+item.viewCount" placement="top">
<el-button type="text" :icon="item.isCollect==0?'el-icon-star-off':'el-icon-star-on'" @click="collect(item)" :style="{color:item.isCollect==0?'#333':'#ff9326'}">{{ item.isCollect==0?'收藏':'已收藏' }}</el-button>
</el-tooltip>
<el-tooltip :content="'浏览量'+item.viewCount" placement="top">
<el-button type="text" style="color: #333" icon="el-icon-view">{{ item.viewCount}}</el-button>
</el-tooltip>
</div> -->
<div style="margin-bottom:10px">
<el-button :size="defaultFormItemSize" :plain="true" @click="edit(item)">编辑</el-button>
<el-button :size="defaultFormItemSize" :plain="true" @click="del(item)">删除</el-button>
</div>
</div>
</el-card>
</template>
<script>
import { KnowledgeGraph } from '@/api/gptController.js'
export default {
data() {
return {}
},
props: ['item', 'isPreset', 'refresh'],
components: {},
computed: {
getTemplateLabel() {
return (item) => {
if (item.templateLabel) {
return JSON.parse(item.templateLabel)
} else {
return []
}
}
}
},
mounted() {},
methods: {
del(item) {
this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = { kgId: item.kgId }
KnowledgeGraph.delete(this, params)
.then((res) => {
this.$message.success('删除成功')
this.refresh()
})
.catch((e) => {
console.log(e)
})
})
},
edit(item) {}
}
}
</script>
<style lang="scss" scoped>
@import '@/assets/style/element-variables.scss';
.box-card {
width: calc(100% / 4 - 20px);
height: 180px;
flex-shrink: 0;
margin-bottom: 20px;
min-width: 300px;
background: linear-gradient(to bottom, #e7efff 10%, #fff 50%);
}
div /deep/.el-divider--horizontal {
margin: 14px 0 0 0;
}
.title {
font-size: 16px;
color: $--color-text-primary;
}
.content {
margin-bottom: 10px;
color: $--color-text-secondary;
}
/deep/ .el-card__body {
height: 100%;
width: 100%;
position: relative;
}
.buttonBox {
display: flex;
justify-content: space-between;
position: absolute;
bottom: 0;
right: 20px;
}
.tag:not(:last-child) {
margin-right: 10px;
}
.titleBox {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 16px;
}
.tagBox {
margin-bottom: 10px;
}
/deep/ .el-icon-star-on {
font-size: 14px !important;
overflow: hidden;
position: relative;
top: 4px;
left: 3px;
}
/deep/ .el-icon-star-on:before {
zoom: 1.3;
}
/deep/ .el-icon-star-off {
font-size: 14px !important;
}
</style>
This diff is collapsed.
This diff is collapsed.
......@@ -3,7 +3,7 @@
<el-form label-position="left" ref="form" label-width="100px" :model="form" :size="defaultFormItemSize" :rules="rules">
<el-row class="title">基本信息</el-row>
<el-form-item label="服务名称:" prop="modelDeployDto.serviceName">
<el-input v-model="form.modelDeployDto.serviceName" class="inputWidth" placeholder="服务名称"></el-input>
<el-input v-model="form.modelDeployDto.serviceName" class="inputWidth" placeholder="服务名称" :maxlength="20" :minlength="2"></el-input>
<el-row>
<span class="introduce">支持中英文、数字、下划线(_),2-20个字符,不能以下划线为开头</span></el-row>
</el-form-item>
......@@ -112,19 +112,17 @@ export default {
getModelList() {
ModelDeployment.listForTree(this, {})
.then((res) => {
this.modelList = res.data
.filter((item) => item.isBaseModel === 1)
.map((item) => {
return {
id: item.modelId,
name: item.modelName,
children:
// prettier-ignore
item.modelVersionList === [] ? [] : item.modelVersionList.map((item2) => {
return { id: item2.versionId, name: 'V' + item2.modelVersion }
})
}
})
this.modelList = res.data.map((item) => {
return {
id: item.modelId,
name: item.modelName,
children:
// prettier-ignore
item.modelVersionList === [] ? [] : item.modelVersionList.map((item2) => {
return { id: item2.versionId, name: 'V' + item2.modelVersion }
})
}
})
})
.catch((e) => {
console.log(e)
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment