Commit 0931d0ef authored by mhw's avatar mhw

版本跟新

parent 4fcaf270
...@@ -13631,6 +13631,11 @@ ...@@ -13631,6 +13631,11 @@
"saxen": "^8.1.2" "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": { "move-concurrently": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmmirror.com/move-concurrently/-/move-concurrently-1.0.1.tgz", "resolved": "https://registry.npmmirror.com/move-concurrently/-/move-concurrently-1.0.1.tgz",
......
...@@ -14,4 +14,7 @@ export default class DatasetData { ...@@ -14,4 +14,7 @@ export default class DatasetData {
static delete (sender, params, axiosOption, httpOption) { static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetData/delete', 'post', 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 { ...@@ -10,7 +10,9 @@ export default class DatasetVersion {
static export (sender, params, fileName) { static export (sender, params, fileName) {
return sender.download('/admin/app/datasetVersion/export', 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) { static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetVersion/add', 'post', 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 { ...@@ -8,13 +8,21 @@ export default class KnowledgeManage {
static recreate (sender, params, axiosOption, httpOption) { static recreate (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/recreate', 'post', params, axiosOption, httpOption); return sender.doUrl('/admin/app/knowledgeManage/recreate', 'post', params, axiosOption, httpOption);
} }
static searchDocs (sender, params, axiosOption, httpOption) { static searchDocs (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/searchDocs', 'post', 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) { static updateDocs (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/updateDocs', 'post', 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) { static uploadDocs (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/uploadDocs', 'post', params, axiosOption, httpOption); return sender.doUrl('/admin/app/knowledgeManage/uploadDocs', 'post', params, axiosOption, httpOption);
} }
......
...@@ -17,6 +17,7 @@ import PyApi from './GptController/PyApi.js'; ...@@ -17,6 +17,7 @@ import PyApi from './GptController/PyApi.js';
import KnowledgeManage from './GptController/KnowledgeManage.js'; import KnowledgeManage from './GptController/KnowledgeManage.js';
import DatasetData from './GptController/DatasetData.js'; import DatasetData from './GptController/DatasetData.js';
import ModelDeployment from './GptController/ModelDeployment.js'; import ModelDeployment from './GptController/ModelDeployment.js';
import KnowledgeGraph from './GptController/KnowledgeGraph.js';
export { export {
TemplateController, TemplateController,
...@@ -36,5 +37,6 @@ export { ...@@ -36,5 +37,6 @@ export {
PyApi, PyApi,
KnowledgeManage, KnowledgeManage,
DatasetData, DatasetData,
ModelDeployment ModelDeployment,
KnowledgeGraph
} }
module.exports = { module.exports = {
// baseUrl: 'http://218.76.0.69:8082/', // 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/', wsUrl: 'ws://218.76.0.69:7860/',
projectName: '灵境大模型平台' 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 = { ...@@ -123,7 +123,7 @@ const globalMixin = {
}, },
computed: { computed: {
defaultFormItemSize () { defaultFormItemSize () {
return this.windowWidth <= 1900 ? 'small' : 'medium'; return this.windowWidth <= 1900 ? 'mini' : 'small';
}, },
...mapGetters(['getUserInfo']) ...mapGetters(['getUserInfo'])
}, },
......
...@@ -24,6 +24,7 @@ import RightAddBtn from '@/components/Btns/RightAddBtn'; ...@@ -24,6 +24,7 @@ import RightAddBtn from '@/components/Btns/RightAddBtn';
import VCharts from 'v-charts'; import VCharts from 'v-charts';
import VXETable from 'vxe-table'; import VXETable from 'vxe-table';
import resize from '@/core/directive/resize.js'; import resize from '@/core/directive/resize.js';
import rightClick from '@/core/directive/rightClick.js';
import 'vxe-table/lib/style.css'; import 'vxe-table/lib/style.css';
import '@/assets/online-icon/iconfont.css'; import '@/assets/online-icon/iconfont.css';
import VueClipboard from 'vue-clipboard2' import VueClipboard from 'vue-clipboard2'
...@@ -32,6 +33,7 @@ Vue.prototype.$SocketService = SocketService ...@@ -32,6 +33,7 @@ Vue.prototype.$SocketService = SocketService
Vue.use(VueClipboard) Vue.use(VueClipboard)
Vue.directive('resize', resize) Vue.directive('resize', resize)
Vue.directive('rightClick', rightClick)
Vue.use(VXETable); Vue.use(VXETable);
window.JSON = new JSONbig({storeAsString: true}); window.JSON = new JSONbig({storeAsString: true});
Vue.component('tree-select', TreeSelect); Vue.component('tree-select', TreeSelect);
......
...@@ -91,7 +91,9 @@ const routers = [ ...@@ -91,7 +91,9 @@ const routers = [
// { path: 'onLineOptimization', component: _import('gptTraining/promptProject/onLineOptimization/index'), name: 'onLineOptimization', props: getProps, meta: { title: '在线优化' } }, // { 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: '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('导入格式', [ ...@@ -210,7 +210,7 @@ const ImportFormat = new DictionaryBase('导入格式', [
{ {
id: 1, id: 1,
name: 'TEXT', name: 'TEXT',
symbol: 'text' symbol: 'txt'
}, },
{ {
id: 2, id: 2,
...@@ -221,6 +221,36 @@ const ImportFormat = new DictionaryBase('导入格式', [ ...@@ -221,6 +221,36 @@ const ImportFormat = new DictionaryBase('导入格式', [
id: 3, id: 3,
name: 'XLSX', name: 'XLSX',
symbol: '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, id: 4,
...@@ -228,7 +258,7 @@ const ImportFormat = new DictionaryBase('导入格式', [ ...@@ -228,7 +258,7 @@ const ImportFormat = new DictionaryBase('导入格式', [
symbol: 'rar' symbol: 'rar'
} }
]); ]);
Vue.prototype.ImportFormat = ImportFormat; Vue.prototype.KnowledgeImportFormat = KnowledgeImportFormat;
const DataAnnotationState = new DictionaryBase('发布状态', [ const DataAnnotationState = new DictionaryBase('发布状态', [
{ {
...@@ -485,6 +515,108 @@ const DeploymentStatus = new DictionaryBase('部署状态', [ ...@@ -485,6 +515,108 @@ const DeploymentStatus = new DictionaryBase('部署状态', [
} }
]); ]);
Vue.prototype.DeploymentStatus = DeploymentStatus; 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 { export {
TemplateLabelDict, TemplateLabelDict,
ScenarioTypeDict, ScenarioTypeDict,
...@@ -505,5 +637,8 @@ export { ...@@ -505,5 +637,8 @@ export {
TrainingMethod, TrainingMethod,
ModeOfSpeaking, ModeOfSpeaking,
RunningStatus, RunningStatus,
DeploymentStatus DeploymentStatus,
SegmentedMode,
KnowledgeImportFormat,
KnowledgeFormat
} }
...@@ -11,16 +11,11 @@ ...@@ -11,16 +11,11 @@
数据清洗是面向post-pretrain场景下预训练泛文本数据的一站式数据处理方案,通过对数据进行异常清洗、文本过滤、文本去重和去除隐私信息,大幅提升数据质量,优化模型训练效果。 数据清洗是面向post-pretrain场景下预训练泛文本数据的一站式数据处理方案,通过对数据进行异常清洗、文本过滤、文本去重和去除隐私信息,大幅提升数据质量,优化模型训练效果。
</div> </div>
<div class="instructionsList"> <div class="instructionsList">
<div <div class="item" v-for="(item, index) in instructionsList" :key="index">
class="item"
v-for="(item, index) in instructionsList"
:key="index"
>
<img class="img" :src="item.img" alt="" /> <img class="img" :src="item.img" alt="" />
<div class="itemTitle"> <div class="itemTitle">
<span class="head-index">{{ index + 1 }} &nbsp;</span <span class="head-index">{{ index + 1 }} &nbsp;</span>{{ item.title }}
>{{ item.title }}
</div> </div>
<div class="itemDescribe">{{ item.describe }}</div> <div class="itemDescribe">{{ item.describe }}</div>
</div> </div>
...@@ -29,48 +24,18 @@ ...@@ -29,48 +24,18 @@
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
<div class="tableBox" :style="{ height: tableHeight }"> <div class="tableBox" :style="{ height: tableHeight }">
<el-form <el-form ref="myDataSetPage" :model="myDataSetPage" label-width="75px" :size="defaultFormItemSize" label-position="right" @submit.native.prevent>
ref="myDataSetPage"
:model="myDataSetPage"
label-width="75px"
:size="defaultFormItemSize"
label-position="right"
@submit.native.prevent
>
<filter-box :item-width="350" @search="search()" @reset="onReset"> <filter-box :item-width="350" @search="search()" @reset="onReset">
<el-form-item label-width="0px"> <el-form-item label-width="0px">
<el-button <el-button class="add" type="primary" icon="el-icon-plus" :size="defaultFormItemSize" @click="add()">创建任务</el-button>
class="add"
type="primary"
icon="el-icon-plus"
:size="defaultFormItemSize"
@click="add()"
>创建任务</el-button
>
</el-form-item> </el-form-item>
<el-form-item <el-form-item label="数据集名称或id" prop="formFilter.dataName" label-width="120px">
label="数据集名称或id" <el-input class="filter-item" v-model="myDataSetPage.formFilter.dataName" :clearable="true" placeholder="数据集名称或id" />
prop="formFilter.dataName"
label-width="120px"
>
<el-input
class="filter-item"
v-model="myDataSetPage.formFilter.dataName"
:clearable="true"
placeholder="数据集名称或id"
/>
</el-form-item> </el-form-item>
</filter-box> </filter-box>
</el-form> </el-form>
<vxe-table <vxe-table border show-header-overflow show-overflow :row-config="{ isHover: true }" :data="myDataSetPage.tableData.impl.dataList" min-height="96">
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="versions" title="版本"></vxe-column>
<vxe-column field="versionsId" title="版本ID"></vxe-column> <vxe-column field="versionsId" title="版本ID"></vxe-column>
...@@ -97,7 +62,7 @@ ...@@ -97,7 +62,7 @@
</template> --> </template> -->
</vxe-column> </vxe-column>
</vxe-table> </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 :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-pagination>
</el-row> </el-row>
...@@ -106,13 +71,13 @@ ...@@ -106,13 +71,13 @@
</template> </template>
<script> <script>
import { mapGetters } from 'vuex'; import { mapGetters } from 'vuex'
/* eslint-disable-next-line */ /* eslint-disable-next-line */
import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/widget.js'; import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/widget.js'
import { ModelSquare } from '@/api/gptController.js'; import { ModelSquare } from '@/api/gptController.js'
import editOrAdd from './dialog/editOrAdd'; import editOrAdd from './dialog/editOrAdd'
export default { export default {
data () { data() {
return { return {
activeName: '1', activeName: '1',
collapseHeight: 0, collapseHeight: 0,
...@@ -145,33 +110,32 @@ export default { ...@@ -145,33 +110,32 @@ export default {
], ],
myDataSetPage: { myDataSetPage: {
formFilter: { formFilter: {
'modelDescribe': '', modelDescribe: '',
'modelId': 0, modelId: 0,
'modelName': '', modelName: '',
'modelType': 0, modelType: 0,
'versionCount': 0 versionCount: 0
}, },
tableData: { tableData: {
impl: new TableWidget(this.getwidgetData, true, true, false, undefined, false) impl: new TableWidget(this.getwidgetData, true, true, false, undefined, false)
} }
} }
}; }
}, },
components: {}, components: {},
computed: { computed: {
...mapGetters(['getMainContextHeight']), ...mapGetters(['getMainContextHeight']),
tableHeight () { tableHeight() {
return this.getMainContextHeight - this.collapseHeight - 35 + 'px'; return this.getMainContextHeight - this.collapseHeight - 35 + 'px'
} }
}, },
methods: { methods: {
getwidgetData (params) { getwidgetData(params) {
if (params == null) params = {}; if (params == null) params = {}
params = { params = {
...params, ...params,
// orderParam: [ // orderParam: [
...@@ -189,75 +153,93 @@ export default { ...@@ -189,75 +153,93 @@ export default {
} }
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
ModelSquare.list(this, params).then(res => { ModelSquare.list(this, params)
.then((res) => {
resolve({ resolve({
dataList: res.data.dataList, dataList: res.data.dataList,
totalCount: res.data.totalCount totalCount: res.data.totalCount
}); })
}).catch(e => { })
reject(e); .catch((e) => {
}); reject(e)
}); })
})
}, },
add () { add() {
this.$dialog.show('创建模版', editOrAdd, { this.$dialog
.show(
'创建模版',
editOrAdd,
{
area: ['100%', '100%'] area: ['100%', '100%']
}, { isEdit: false }).then(res => {
this.refresh();
}).catch(e => { });
}, },
edit (item) { { isEdit: false }
this.$dialog.show('修改模版', editOrAdd, { )
.then((res) => {
this.refresh()
})
.catch((e) => {})
},
edit(item) {
this.$dialog
.show(
'修改模版',
editOrAdd,
{
area: ['100%', '100%'] area: ['100%', '100%']
}, { isEdit: true, item: item }).then(res => {
this.refresh();
}).catch(e => { });
}, },
del (item) { { isEdit: true, item: item }
)
.then((res) => {
this.refresh()
})
.catch((e) => {})
},
del(item) {
this.$confirm('是否确认删除', '提示', { this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
let params = { batchTaskId: item.batchTaskId } let params = { batchTaskId: item.batchTaskId }
ModelSquare.delete(this, params).then(res => { ModelSquare.delete(this, params)
this.$message.success('删除成功'); .then((res) => {
this.$message.success('删除成功')
this.refresh() this.refresh()
}).catch(e => { })
console.log(e); .catch((e) => {
}); console.log(e)
} })
); })
}, },
refresh (reloadData = false) { refresh(reloadData = false) {
if (reloadData) { if (reloadData) {
this.myDataSetPage.tableData.impl.refreshTable(true, 1); this.myDataSetPage.tableData.impl.refreshTable(true, 1)
} else { } else {
this.myDataSetPage.tableData.impl.refreshTable(); this.myDataSetPage.tableData.impl.refreshTable()
} }
}, },
onReset () { onReset() {
this.$refs.myDataSetPage.resetFields(); this.$refs.myDataSetPage.resetFields()
this.refresh(true); this.refresh(true)
}, },
formInit () { formInit() {
this.refresh(); this.refresh()
}, },
resize (e) { resize(e) {
setTimeout(() => { setTimeout(() => {
this.collapseHeight = e?.height this.collapseHeight = e?.height
}, 300); }, 300)
} }
}, },
mounted () { mounted() {
this.resize() this.resize()
this.formInit() this.formInit()
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/assets/style/element-variables.scss"; @import '@/assets/style/element-variables.scss';
.instructions { .instructions {
background-color: white; background-color: white;
width: 100%; width: 100%;
...@@ -268,7 +250,6 @@ export default { ...@@ -268,7 +250,6 @@ export default {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: space-around; justify-content: space-around;
} }
.title { .title {
color: $--color-text-primary; color: $--color-text-primary;
...@@ -312,8 +293,7 @@ export default { ...@@ -312,8 +293,7 @@ export default {
div /deep/ .el-collapse-item__content { div /deep/ .el-collapse-item__content {
padding-bottom: 0; padding-bottom: 0;
} }
div /deep/ .el-collapse-item__header{ div /deep/ .el-collapse-item__header {
padding-left: 20px; padding-left: 20px;
} }
</style> </style>
...@@ -16,138 +16,218 @@ ...@@ -16,138 +16,218 @@
</el-form> </el-form>
<div class="tableBox" :style="{ height: tableHeight }"> <div class="tableBox" :style="{ height: tableHeight }">
<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>
<div v-for="(item,index) in myDataSetPage.tableData.impl.dataList" :key="item.datasetId"> <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>
<tableItem v-model="myDataSetPage.tableData.impl.dataList[index]" @refresh="refresh" /> <vxe-column field="datasetVersionList" title="最新版本">
</div> <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>
<template v-if="this.myDataSetPage.tableData.impl.dataList.length<1" > <vxe-column field="createTime" title="创建时间"></vxe-column>
<div class="table-empty unified-font"> <vxe-column field="operation" title="操作" width="280">
<img src="@/assets/img/empty.png"> <template slot-scope="scope">
<span>暂无数据</span> <el-button type="text" icon="el-icon-plus" @click="addVersions(scope.row)">新增版本</el-button>
</div> <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> </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>
</div> </div>
</template> </template>
<script> <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 addVersions from './tableItem/dialog/add.vue'
import tableBox from './tableItem/tableBox/index.vue'
/* eslint-disable-next-line */ /* eslint-disable-next-line */
import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/widget.js'; import tableItem from './tableItem'
import { MyDataSet } from '@/api/gptController.js';
import editOrAdd from './dialog/editOrAdd';
import tableItem from './tableItem';
export default { export default {
data () { data() {
return { return {
myDataSetPage: { myDataSetPage: {
formFilter: { formFilter: {
'searchString': '', searchString: '',
'dimensionType': undefined dimensionType: undefined
}, },
tableData: { tableData: {
impl: new TableWidget(this.getwidgetData, true, true, false, 'datasetId', false) impl: new TableWidget(this.getwidgetData, true, true, false, 'datasetId', false)
} }
} }
}; }
}, },
provide () { provide() {
return { return {
refresh: this.refresh refresh: this.refresh
} }
}, },
components: { tableItem }, components: {},
computed: { computed: {
...mapGetters(['getMainContextHeight']), ...mapGetters(['getMainContextHeight']),
tableHeight () { tableHeight() {
return this.getMainContextHeight - 118 + 'px'; return this.getMainContextHeight - 118 + 'px'
} }
}, },
methods: { methods: {
getwidgetData (params) { getwidgetData(params) {
if (params == null) params = {}; if (params == null) params = {}
params = { params = {
...params, ...params,
// orderParam: [
// {
// asc: true,
// dateAggregateBy: '',
// fieldName: ''
// }
// ],
// pageParam: {
// pageNum: 0,
// pageSize: 0
// },
datasetManageDtoFilter: { ...this.myDataSetPage.formFilter } datasetManageDtoFilter: { ...this.myDataSetPage.formFilter }
} }
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
MyDataSet.list(this, params).then(res => { MyDataSet.list(this, params)
.then((res) => {
resolve({ resolve({
dataList: res.data.dataList.map((item) => { dataList: res.data.dataList.map((item) => {
return {...item, isEdit: false } return { ...item, isEdit: false }
}), }),
totalCount: res.data.totalCount totalCount: res.data.totalCount
}); })
}).catch(e => { })
reject(e); .catch((e) => {
}); reject(e)
}); })
}, })
add () { },
this.$dialog.show('创建模版', editOrAdd, { addVersions(row) {
this.$dialog
.show(
'新增数据集版本',
addVersions,
{
area: ['600px', 'auto']
},
{ isEdit: false, datasetId: row.datasetId, versionList: row.datasetVersionList }
)
.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)
})
})
},
all(row) {
// this.dialogTitle = this.value.datasetName
// this.dialogVisible = true
this.$dialog
.show(
row.datasetName,
tableBox,
{
area: ['100%', '100%'] area: ['100%', '100%']
}, { isEdit: false }).then(res => {
this.refresh();
}).catch(e => { });
}, },
edit (item) { { tableData: row, refresh: this.refresh }
this.$dialog.show('修改模版', editOrAdd, { )
.then((res) => {
this.refresh()
})
.catch((e) => {})
},
add() {
this.$dialog
.show(
'创建模版',
editOrAdd,
{
area: ['100%', '100%'] area: ['100%', '100%']
}, { isEdit: true, item: item }).then(res => {
this.refresh();
}).catch(e => { });
}, },
del (item) { { 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('是否确认删除', '提示', { this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
let params = { batchTaskId: item.batchTaskId } let params = { batchTaskId: item.batchTaskId }
MyDataSet.delete(this, params).then(res => { MyDataSet.delete(this, params)
this.$message.success('删除成功'); .then((res) => {
this.$message.success('删除成功')
this.refresh() this.refresh()
}).catch(e => { })
console.log(e); .catch((e) => {
}); console.log(e)
} })
); })
}, },
refresh (reloadData = false) { refresh(reloadData = false) {
if (reloadData) { if (reloadData) {
this.myDataSetPage.tableData.impl.refreshTable(true, 1); this.myDataSetPage.tableData.impl.refreshTable(true, 1)
} else { } else {
this.myDataSetPage.tableData.impl.refreshTable(); this.myDataSetPage.tableData.impl.refreshTable()
} }
}, },
onReset () { onReset() {
this.$refs.myDataSetPage.resetFields(); this.$refs.myDataSetPage.resetFields()
this.refresh(true); this.refresh(true)
}, },
formInit () { formInit() {
this.refresh(); this.refresh()
} }
}, },
mounted () { mounted() {
this.formInit() this.formInit()
} }
} }
......
...@@ -6,32 +6,27 @@ ...@@ -6,32 +6,27 @@
V {{ form.datasetVersion }} V {{ form.datasetVersion }}
</el-form-item> </el-form-item>
<el-form-item label="备注信息:"> <el-form-item label="备注信息:">
<el-input v-model="form.remark" style="width:70%" type="textarea" :autosize="{ minRows: 2, maxRows: 4 }" <el-input v-model="form.remark" style="width:70%" type="textarea" :autosize="{ minRows: 2, maxRows: 4 }" placeholder="请备注本次版本主要做的修改,如添加数据、更换标注方式等,限制50字符内" maxlength="50">
placeholder="请备注本次版本主要做的修改,如添加数据、更换标注方式等,限制50字符内" maxlength="50">
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item label="继承历史版本:"> <el-form-item label="继承历史版本:">
<el-switch v-model="form.isInherit" active-color="#13ce66" inactive-color="#ff4949" :active-value="1" <el-switch v-model="form.isInherit" active-color="#13ce66" inactive-color="#ff4949" :active-value="1" :inactive-value="0" @change="isInherit">
:inactive-value="0" @change="isInherit">
</el-switch> </el-switch>
</el-form-item> </el-form-item>
<el-form-item label="历史版本:" v-if="form.isInherit == 1" prop="hisVersion"> <el-form-item label="历史版本:" v-if="form.isInherit == 1" prop="hisVersion">
<el-select v-model="form.hisVersion" placeholder="请选择"> <el-select v-model="form.hisVersion" placeholder="请选择">
<el-option v-for="item in tableData.datasetVersionList" :key="item.datasetVersion" <el-option v-for="item in versionList" :key="item.datasetVersion" :label="'V' + item.datasetVersion" :value="item.datasetVersion">
:label="'V' + item.datasetVersion" :value="item.datasetVersion">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<template v-else> <template v-else>
<el-form-item label="标注类型:" prop="dimensionType"> <el-form-item label="标注类型:" prop="dimensionType">
<el-radio v-for="item in LabelType.getList()" :key="item.id" v-model="form.dimensionType" @change="isText" <el-radio v-for="item in LabelType.getList()" :key="item.id" v-model="form.dimensionType" @change="isText" :label="item.id">{{ item.name }}</el-radio>
:label="item.id">{{ item.name }}</el-radio>
</el-form-item> </el-form-item>
<el-form-item label="标注模版:" v-if="form.dimensionType === 0" prop="template"> <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" <el-radio v-for="item in MarkTemplate.getList()" :key="item.id" v-model="form.template" :label="item.id">{{ item.name }}</el-radio>
:label="item.id">{{ item.name }}</el-radio>
</el-form-item> </el-form-item>
</template> </template>
<el-row type="flex" justify="end" class="dialog-btn-layer mt20"> <el-row type="flex" justify="end" class="dialog-btn-layer mt20">
...@@ -42,77 +37,77 @@ ...@@ -42,77 +37,77 @@
</template> </template>
<script> <script>
import { DatasetVersion } from '@/api/gptController.js'
import { DatasetVersion } from '@/api/gptController.js';
export default { export default {
data () { data() {
return { return {
form: { form: {
'datasetVersion': this.tableData.datasetVersionList.slice(-1)[0].datasetVersion + 1, datasetVersion: this.versionList.slice(0, 1)[0].datasetVersion + 1,
isInherit: 1, isInherit: 1,
hisVersion: undefined, hisVersion: undefined,
dimensionType: undefined, dimensionType: undefined,
template: undefined template: undefined
}, },
rules: { rules: {
hisVersion: [{required: true, message: '历史版本不能为空', trigger: 'blur'}], hisVersion: [{ required: true, message: '历史版本不能为空', trigger: 'blur' }],
dimensionType: [{required: true, message: '标注模版不能为空', trigger: 'blur'}], dimensionType: [{ required: true, message: '标注模版不能为空', trigger: 'blur' }],
template: [{required: true, message: '标注模版', trigger: 'blur'}] template: [{ required: true, message: '标注模版', trigger: 'blur' }]
}
} }
};
}, },
props: ['isEdit', 'tableData'], props: ['isEdit', 'datasetId', 'versionList'],
components: {}, components: {},
computed: { computed: {},
}, mounted() {
mounted () {
this.intFrom() this.intFrom()
}, },
methods: { methods: {
intFrom () { intFrom() {
this.form = { ...this.form, datasetId: this.tableData.datasetId } this.form = { ...this.form, datasetId: this.datasetId }
}, },
onCancel (isSuccess) { onCancel(isSuccess) {
if (this.observer != null) { if (this.observer != null) {
this.observer.cancel(isSuccess); this.observer.cancel(isSuccess)
} }
}, },
onSubmit () { onSubmit() {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.$refs['form'].validate((valid) => { this.$refs['form'].validate((valid) => {
if (valid) { if (valid) {
let params = {}; let params = {}
params.datasetVersionDto = { ...this.form }; params.datasetVersionDto = { ...this.form }
if (this.isEdit) { if (this.isEdit) {
DatasetVersion.update(this, params).then(res => { DatasetVersion.update(this, params)
resolve(res); .then((res) => {
this.$message.success('编辑成功'); resolve(res)
this.onCancel(true); this.$message.success('编辑成功')
}).catch(e => { this.onCancel(true)
reject(e); })
}); .catch((e) => {
reject(e)
})
} else { } else {
DatasetVersion.add(this, params).then(res => { DatasetVersion.add(this, params)
resolve(res); .then((res) => {
this.$message.success('添加成功'); resolve(res)
this.onCancel(true); this.$message.success('添加成功')
}).catch(e => { this.onCancel(true)
reject(e); })
}); .catch((e) => {
reject(e)
})
} }
} else { } else {
// reject(); // reject();
} }
}); })
}); })
}, },
isInherit (data) { isInherit(data) {
if (data === 1) { if (data === 1) {
this.form.dimensionType = undefined this.form.dimensionType = undefined
this.form.template = undefined this.form.template = undefined
...@@ -120,13 +115,13 @@ export default { ...@@ -120,13 +115,13 @@ export default {
this.form.hisVersion = undefined this.form.hisVersion = undefined
} }
}, },
isText (data) { isText(data) {
if (data !== 0) { if (data !== 0) {
this.form.template = undefined this.form.template = undefined
} }
} }
} }
}; }
</script> </script>
<style scoped> <style scoped>
.inputWidth { .inputWidth {
...@@ -141,4 +136,5 @@ export default { ...@@ -141,4 +136,5 @@ export default {
.introduce { .introduce {
font-size: 12px; font-size: 12px;
color: #909399; color: #909399;
}</style> }
</style>
...@@ -5,11 +5,7 @@ ...@@ -5,11 +5,7 @@
<el-form-item label="导出文件格式:"> <el-form-item label="导出文件格式:">
<el-select v-model="form.format" placeholder="请选择"> <el-select v-model="form.format" placeholder="请选择">
<el-option <el-option v-for="item in ImportFormat.getList()" :key="item.id" :label="item.name" :value="item.symbol">
v-for="item in ImportFormat.getList()"
:key="item.id"
:label="item.name"
:value="item.symbol">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
...@@ -22,50 +18,49 @@ ...@@ -22,50 +18,49 @@
</template> </template>
<script> <script>
import { DatasetVersion } from '@/api/gptController.js'
// import { DatasetVersion } from '@/api/gptController.js';
export default { export default {
data () { data() {
return { return {
form: { form: {
format: 'jsonl' format: 'jsonl'
} }
}
};
}, },
props: ['isEdit', 'row'], props: ['isEdit', 'row'],
components: {}, components: {},
computed: { computed: {},
}, mounted() {},
mounted () {
},
methods: { methods: {
onCancel(isSuccess) {
onCancel (isSuccess) {
if (this.observer != null) { if (this.observer != null) {
this.observer.cancel(isSuccess); this.observer.cancel(isSuccess)
} }
}, },
downloadFile () { downloadFile() {
let params = { let downDom = document.createElement('a')
versionId: this.row.versionId 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 => { // this.download('/admin/app/datasetVersion/export', params, '下载文件.' + this.form.format, 'get').then(res => {
// resolve(res); // // resolve(res);
console.log(res); // console.log(res);
this.$message.success('下载成功'); // this.$message.success('下载成功');
this.onCancel(true); // this.onCancel(true);
}).catch(e => { // }).catch(e => {
// reject(e); // // reject(e);
}); // });
} }
} }
}; }
</script> </script>
<style scoped> <style scoped>
.inputWidth { .inputWidth {
......
<!-- 标注 --> <!-- 标注 -->
<template> <template>
<div> <div>
<vxe-table border show-header-overflow show-overflow :row-config="{ isHover: true ,height: 270}" :data="[form.data]" min-height="96"> <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="index" title="序号"></vxe-column> -->
<vxe-column :field="'data.'+item" :title="item" v-for="item in columnList" :key="item"> <vxe-column :field="'data.'+item" :title="item" v-for="item in columnList" :key="item">
...@@ -15,54 +15,42 @@ ...@@ -15,54 +15,42 @@
<el-button :size="defaultFormItemSize" :plain="true" @click="onCancel(false)">取消</el-button> <el-button :size="defaultFormItemSize" :plain="true" @click="onCancel(false)">取消</el-button>
<el-button type="primary" :size="defaultFormItemSize" @click="onSubmit">确定</el-button> <el-button type="primary" :size="defaultFormItemSize" @click="onSubmit">确定</el-button>
</el-row> </el-row>
</div> </div>
</template> </template>
<script> <script>
import { DatasetData } from '@/api/gptController.js'; import { DatasetData } from '@/api/gptController.js'
export default { export default {
data () { data() {
return { return {
form: { form: JSON.parse(JSON.stringify(this.row))
_id: undefined,
data: {},
versionId: undefined
} }
};
}, },
props: ['row', 'columnList', 'refresh'], props: ['row', 'columnList', 'refresh'],
components: {}, components: {},
computed: {}, computed: {},
mounted () { 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);
},
methods: { methods: {
onCancel (isSuccess) { onCancel(isSuccess) {
if (this.observer != null) { if (this.observer != null) {
this.observer.cancel(isSuccess); this.observer.cancel(isSuccess)
} }
}, },
onSubmit () { onSubmit() {
let params = {}; let params = {}
params.datasetMongoDto = this.form; params.datasetMongoDto = this.form
console.log(params); DatasetData.update(this, params)
DatasetData.update(this, params).then(res => { .then((res) => {
this.$message.success('编辑成功'); this.$message.success('编辑成功')
this.onCancel(true); this.onCancel(true)
}).catch(e => { })
.catch((e) => {})
});
} }
} }
} }
</script> </script>
<style scoped> <style scoped>
</style> </style>
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<span @dblclick="checkName"> <span @dblclick="checkName">
数据集名称: 数据集名称:
<span v-if="!value.isEdit">{{ value.datasetName }}</span> <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>
<span style="margin-left: 20px">数据集ID:{{ value.datasetId }}</span> <span style="margin-left: 20px">数据集ID:{{ value.datasetId }}</span>
...@@ -24,67 +24,83 @@ ...@@ -24,67 +24,83 @@
</template> </template>
<script> <script>
import { MyDataSet } from '@/api/gptController.js'; import { MyDataSet } from '@/api/gptController.js'
import addVersions from './dialog/add.vue' import addVersions from './dialog/add.vue'
import tableBox from './tableBox/index.vue' import tableBox from './tableBox/index.vue'
export default { export default {
data () { data() {
return { return {
dialogVisible: false, dialogVisible: false,
dialogTitle: '' dialogTitle: ''
}; }
}, },
inject: ['refresh'], inject: ['refresh'],
props: { props: {
value: { value: {
type: Object, type: Object,
default: () => { } default: () => {}
} }
}, },
components: { tableBox }, components: { tableBox },
computed: {}, computed: {},
mounted () { mounted() {},
},
methods: { methods: {
addVersions () { addVersions() {
this.$dialog.show('新增数据集版本', addVersions, { this.$dialog
.show(
'新增数据集版本',
addVersions,
{
area: ['600px', 'auto'] area: ['600px', 'auto']
}, { isEdit: false, tableData: this.value }).then(res => { },
{ isEdit: false, tableData: this.value }
)
.then((res) => {
this.refresh() this.refresh()
}).catch(e => { }); })
.catch((e) => {})
}, },
delDataset (item) { delDataset(item) {
this.$confirm('是否确认删除', '提示', { this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
let params = { datasetId: item.datasetId } let params = { datasetId: item.datasetId }
MyDataSet.delete(this, params).then(res => { MyDataSet.delete(this, params)
this.$message.success('删除成功'); .then((res) => {
this.$message.success('删除成功')
this.refresh() this.refresh()
}).catch(e => { })
console.log(e); .catch((e) => {
}); console.log(e)
} })
); })
}, },
all () { all() {
// this.dialogTitle = this.value.datasetName // this.dialogTitle = this.value.datasetName
// this.dialogVisible = true // this.dialogVisible = true
this.$dialog.show(this.value.datasetName, tableBox, { this.$dialog
.show(
this.value.datasetName,
tableBox,
{
area: ['100%', '100%'] area: ['100%', '100%']
}, { tableData: this.value, refresh: this.refresh }).then(res => { },
{ tableData: this.value, refresh: this.refresh }
)
.then((res) => {
this.refresh() this.refresh()
}).catch(e => { }); })
.catch((e) => {})
}, },
editName () { editName() {
this.value.isEdit = false this.value.isEdit = false
let params = { let params = {
datasetManageDto: { datasetManageDto: {
...@@ -92,23 +108,23 @@ export default { ...@@ -92,23 +108,23 @@ export default {
datasetId: this.value.datasetId datasetId: this.value.datasetId
} }
} }
MyDataSet.update(this, params).then(res => { MyDataSet.update(this, params)
this.$message.success('修改成功'); .then((res) => {
this.$message.success('修改成功')
this.refresh() this.refresh()
}).catch(e => { })
console.log(e); .catch((e) => {
}); console.log(e)
})
}, },
checkName () { checkName() {
this.value.isEdit = true; this.value.isEdit = true
this.$nextTick(() => { this.$nextTick(() => {
this.$refs.inputName.focus() this.$refs.inputName.focus()
}) })
} }
} }
} }
</script> </script>
<style scoped> <style scoped>
.operation { .operation {
......
<!-- 预置数据集 --> <!-- 预置数据集 -->
<template> <template>
<div style="position: relative"> <div style="position: relative">
<el-form <el-form ref="myDataSetPage" :model="myDataSetPage" label-width="75px" :size="defaultFormItemSize" label-position="right" @submit.native.prevent>
ref="myDataSetPage"
:model="myDataSetPage"
label-width="75px"
:size="defaultFormItemSize"
label-position="right"
@submit.native.prevent
>
<filter-box :item-width="350" @search="search()" @reset="onReset"> <filter-box :item-width="350" @search="search()" @reset="onReset">
<el-form-item label="标注类型" prop="formFilter.annotationType"> <el-form-item label="标注类型" prop="formFilter.annotationType">
<el-select <el-select v-model="myDataSetPage.formFilter.annotationType" multiple placeholder="请选择">
v-model="myDataSetPage.formFilter.annotationType" <el-option v-for="item in myDataSetPage.annotationOptions" :key="item.value" :label="item.label" :value="item.value">
multiple
placeholder="请选择"
>
<el-option
v-for="item in myDataSetPage.annotationOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="任务类型" prop="formFilter.annotationType"> <el-form-item label="任务类型" prop="formFilter.annotationType">
<el-select <el-select v-model="myDataSetPage.formFilter.annotationType" multiple placeholder="请选择">
v-model="myDataSetPage.formFilter.annotationType" <el-option v-for="item in myDataSetPage.taskOptions" :key="item.value" :label="item.label" :value="item.value">
multiple
placeholder="请选择"
>
<el-option
v-for="item in myDataSetPage.taskOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="领域类型" prop="formFilter.annotationType"> <el-form-item label="领域类型" prop="formFilter.annotationType">
<el-select <el-select v-model="myDataSetPage.formFilter.annotationType" multiple placeholder="请选择">
v-model="myDataSetPage.formFilter.annotationType" <el-option v-for="item in myDataSetPage.territoryOptions" :key="item.value" :label="item.label" :value="item.value">
multiple
placeholder="请选择"
>
<el-option
v-for="item in myDataSetPage.territoryOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="应用场景" prop="formFilter.annotationType"> <el-form-item label="应用场景" prop="formFilter.annotationType">
<el-select <el-select v-model="myDataSetPage.formFilter.annotationType" multiple placeholder="请选择">
v-model="myDataSetPage.formFilter.annotationType" <el-option v-for="item in myDataSetPage.sceneOptions" :key="item.value" :label="item.label" :value="item.value">
multiple
placeholder="请选择"
>
<el-option
v-for="item in myDataSetPage.sceneOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item <el-form-item label="数据集名称或描述" prop="formFilter.dataName" label-width="125px">
label="数据集名称或描述" <el-input class="filter-item" v-model="myDataSetPage.formFilter.dataName" :clearable="true" placeholder="数据集名称或描述" />
prop="formFilter.dataName"
label-width="125px"
>
<el-input
class="filter-item"
v-model="myDataSetPage.formFilter.dataName"
:clearable="true"
placeholder="数据集名称或描述"
/>
</el-form-item> </el-form-item>
</filter-box> </filter-box>
</el-form> </el-form>
<div :style="{ height: tableHeight ,background:'#fff'}" > <div :style="{ height: tableHeight ,background:'#fff'}">
<cardBox class="tableBox" :list="[1,2,3]" :refresh="refresh"></cardBox> <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 :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-pagination>
</el-row> </el-row>
...@@ -97,12 +45,12 @@ ...@@ -97,12 +45,12 @@
<script> <script>
/* eslint-disable-next-line */ /* eslint-disable-next-line */
import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/widget.js'; import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/widget.js'
import { mapGetters } from 'vuex'; import { mapGetters } from 'vuex'
import cardBox from './cardBox'; import cardBox from './cardBox'
import { ModelSquare } from '@/api/gptController.js'; import { ModelSquare } from '@/api/gptController.js'
export default { export default {
data () { data() {
return { return {
myDataSetPage: { myDataSetPage: {
formFilter: { formFilter: {
...@@ -155,30 +103,29 @@ export default { ...@@ -155,30 +103,29 @@ export default {
} }
}, },
filterBoxheight: 0 filterBoxheight: 0
}
};
}, },
components: {cardBox}, components: { cardBox },
computed: { computed: {
...mapGetters(['getMainContextHeight']), ...mapGetters(['getMainContextHeight']),
tableHeight () { tableHeight() {
return this.getMainContextHeight - this.filterBoxheight - 32 + 'px'; return this.getMainContextHeight - this.filterBoxheight - 32 + 'px'
} }
}, },
mounted () { mounted() {
this.filterBoxheight = this.$refs.myDataSetPage?.$el.clientHeight; this.filterBoxheight = this.$refs.myDataSetPage?.$el.clientHeight
window.addEventListener('resize', () => { window.addEventListener('resize', () => {
this.filterBoxheight = this.$refs.myDataSetPage?.$el.clientHeight; this.filterBoxheight = this.$refs.myDataSetPage?.$el.clientHeight
}); })
this.formInit() this.formInit()
}, },
methods: { methods: {
getwidgetData (params) { getwidgetData(params) {
if (params == null) params = {}; if (params == null) params = {}
params = { params = {
...params ...params
...@@ -186,38 +133,39 @@ export default { ...@@ -186,38 +133,39 @@ export default {
} }
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
ModelSquare.list(this, params).then(res => { ModelSquare.list(this, params)
.then((res) => {
resolve({ resolve({
dataList: res.data.dataList, dataList: res.data.dataList,
totalCount: res.data.totalCount totalCount: res.data.totalCount
}); })
}).catch(e => { })
reject(e); .catch((e) => {
}); reject(e)
}); })
})
}, },
refresh (reloadData = false) { refresh(reloadData = false) {
if (reloadData) { if (reloadData) {
this.myDataSetPage.tableData.impl.refreshTable(true, 1); this.myDataSetPage.tableData.impl.refreshTable(true, 1)
} else { } else {
this.myDataSetPage.tableData.impl.refreshTable(); this.myDataSetPage.tableData.impl.refreshTable()
} }
}, },
onReset () { onReset() {
this.$refs.myDataSetPage.resetFields(); this.$refs.myDataSetPage.resetFields()
this.refresh(true); this.refresh(true)
}, },
formInit () { formInit() {
this.refresh(); this.refresh()
}, },
search () {}, search() {},
handleChange () {} handleChange() {}
} }
}; }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.tableBox { .tableBox {
background-color: white; background-color: white;
width: 100%; width: 100%;
...@@ -229,5 +177,4 @@ export default { ...@@ -229,5 +177,4 @@ export default {
align-content: flex-start; align-content: flex-start;
justify-content: space-between; justify-content: space-between;
} }
</style> </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> <template>
<el-card class="box-card" > <el-card class="box-card">
<div class="titleBox"> <div class="titleBox">
<div class="title omit">{{item.knowledgeName}}</div> <div class="title omit">{{item.knowledgeName}}</div>
<!-- <div> <!-- <div>
...@@ -36,8 +36,8 @@ ...@@ -36,8 +36,8 @@
</el-tooltip> </el-tooltip>
</div> --> </div> -->
<div style="margin-bottom:10px"> <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('auth',item)">授权</el-button>
<el-button :size="defaultFormItemSize" :plain="true" @click="handleCommand('edit',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> <el-button :size="defaultFormItemSize" :plain="true" @click="handleCommand('del',item)">删除</el-button>
</div> </div>
</div> </div>
...@@ -46,19 +46,20 @@ ...@@ -46,19 +46,20 @@
</template> </template>
<script> <script>
import { KnowledgeManage } from '@/api/gptController.js'; import { KnowledgeManage } from '@/api/gptController.js'
import editOrAdd from '../dialog/editOrAdd'; import importConfiguration from '../dialog/importConfiguration/index'
import authKnowledgeUser from '../dialog/authKnowledgeUser/index'; import importConfiguration2 from '../dialog/importConfiguration/index-2.vue'
import authKnowledgeUser from '../dialog/authKnowledgeUser/index'
export default { export default {
data () { data() {
return { return {}
};
}, },
props: ['item', 'isPreset', 'refresh'], props: ['item', 'isPreset', 'refresh'],
components: {}, components: {},
computed: { computed: {
getTemplateLabel () { getTemplateLabel() {
return (item) => { return (item) => {
if (item.templateLabel) { if (item.templateLabel) {
return JSON.parse(item.templateLabel) return JSON.parse(item.templateLabel)
...@@ -69,65 +70,90 @@ export default { ...@@ -69,65 +70,90 @@ export default {
} }
}, },
mounted () { }, mounted() {},
methods: { methods: {
collect (item) { collect(item) {
let params = {templateId: item.templateId } let params = { templateId: item.templateId }
if (item.isCollect) { if (item.isCollect) {
KnowledgeManage.deleteCollect(this, params).then(res => { KnowledgeManage.deleteCollect(this, params)
this.$message.success('取消收藏'); .then((res) => {
this.$message.success('取消收藏')
this.refresh() this.refresh()
}).catch(e => { })
console.log(e); .catch((e) => {
}); console.log(e)
})
} else { } else {
KnowledgeManage.addCollect(this, params).then(res => { KnowledgeManage.addCollect(this, params)
this.$message.success('收藏成功'); .then((res) => {
this.$message.success('收藏成功')
this.refresh() this.refresh()
}).catch(e => { })
console.log(e); .catch((e) => {
}); console.log(e)
})
} }
}, },
edit (item) { import(item) {
this.$dialog.show('修改知识库', editOrAdd, { this.$dialog
.show(
'导入文件',
item.knowledgeFormat === '1' ? importConfiguration2 : importConfiguration,
{
area: ['100%', '100%'] area: ['100%', '100%']
}, { isEdit: true, item: item }).then(res => {
this.refresh();
}).catch(e => { this.refresh(); });
}, },
auth (item) { { isEdit: true, item: item, knowledgeName: item.knowledgeName, knowledgeFormat: item.knowledgeFormat }
this.$dialog.show('授权知识库', authKnowledgeUser, { )
.then((res) => {
this.refresh()
})
.catch((e) => {
this.refresh()
})
},
auth(item) {
this.$dialog
.show(
'授权知识库',
authKnowledgeUser,
{
area: ['1100px', '600px'] area: ['1100px', '600px']
}, { knowledgeId: item.knowledgeId }).then(res => {
this.refresh();
}).catch(e => { this.refresh(); });
}, },
del (item) { { knowledgeId: item.knowledgeId }
)
.then((res) => {
this.refresh()
})
.catch((e) => {
this.refresh()
})
},
del(item) {
this.$confirm('是否确认删除', '提示', { this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
let params = { knowledgeId: item.knowledgeId} let params = { knowledgeId: item.knowledgeId }
KnowledgeManage.delete(this, params).then(res => { KnowledgeManage.delete(this, params)
this.$message.success('删除成功'); .then((res) => {
this.$message.success('删除成功')
this.refresh() this.refresh()
}).catch(e => { })
console.log(e); .catch((e) => {
}); console.log(e)
} })
); })
}, },
copy (item) { copy(item) {
this.$copyText(item.templateContent + '\n' + item.negativeTemplateContent).then(() => { this.$copyText(item.templateContent + '\n' + item.negativeTemplateContent).then(() => {
this.$message.success('复制成功!') this.$message.success('复制成功!')
}) })
}, },
handleCommand (command, item) { handleCommand(command, item) {
if (command === 'edit') { if (command === 'import') {
this.edit(item) this.import(item)
} else if (command === 'del') { } else if (command === 'del') {
this.del(item) this.del(item)
} else if (command === 'copy') { } else if (command === 'copy') {
...@@ -138,10 +164,9 @@ export default { ...@@ -138,10 +164,9 @@ export default {
} }
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/assets/style/element-variables.scss"; @import '@/assets/style/element-variables.scss';
.box-card { .box-card {
width: calc(100% / 4 - 20px); width: calc(100% / 4 - 20px);
height: 180px; height: 180px;
...@@ -190,15 +215,15 @@ div /deep/.el-divider--horizontal { ...@@ -190,15 +215,15 @@ div /deep/.el-divider--horizontal {
} }
/deep/ .el-icon-star-on { /deep/ .el-icon-star-on {
font-size: 14px !important; font-size: 14px !important;
overflow: hidden; overflow: hidden;
position: relative; position: relative;
top: 4px; top: 4px;
left: 3px; left: 3px;
} }
/deep/ .el-icon-star-on:before{ /deep/ .el-icon-star-on:before {
zoom: 1.3; zoom: 1.3;
} }
/deep/ .el-icon-star-off{ /deep/ .el-icon-star-off {
font-size: 14px !important; font-size: 14px !important;
} }
</style> </style>
<!-- 创建知识库 --> <!-- 创建知识库 -->
<template> <template>
<div> <div>
<el-steps :active="active" style="width:100%;margin:0 auto 20px auto"> <!-- <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-s-order"></el-step>
<el-step title="导入配置" icon="el-icon-upload"></el-step> <el-step title="导入配置" icon="el-icon-upload"></el-step>
<!-- <el-step title="索引配置"></el-step> -->
</el-steps>
</el-steps> -->
<div style="width: 60%;">
<essentialInformation v-if="active==1" :item="item" :isEdit="isEdit" /> <essentialInformation v-if="active==1" :item="item" :isEdit="isEdit" />
<importConfiguration v-if="active==2" :item="item" :knowledgeName="knowledgeName" /> <importConfiguration v-if="active==2 && knowledgeFormat==0" :item="item" :knowledgeName="knowledgeName" />
<importConfiguration2 v-if="active==2 && knowledgeFormat==1" :item="item" :knowledgeName="knowledgeName" />
</div>
</div> </div>
</template> </template>
<script> <script>
// import indexConfiguration from './indexConfiguration/index'; // import indexConfiguration from './indexConfiguration/index';
import importConfiguration from './importConfiguration/index'; import importConfiguration from './importConfiguration/index'
import essentialInformation from './essentialInformation/index'; import importConfiguration2 from './importConfiguration/index-2'
import essentialInformation from './essentialInformation/index'
export default { export default {
data () { data() {
return { return {
active: 1, active: 1,
knowledgeName: '', knowledgeName: '',
knowledgeCode: '' knowledgeFormat: undefined
}
};
}, },
props: ['isEdit', 'item'], props: ['isEdit', 'item'],
components: { importConfiguration, essentialInformation}, components: { importConfiguration, essentialInformation, importConfiguration2 },
computed: {
}, computed: {},
mounted () { mounted() {},
},
methods: { methods: {
onCancel(isSuccess) {
onCancel (isSuccess) {
if (this.observer != null) { if (this.observer != null) {
this.observer.cancel(isSuccess); this.observer.cancel(isSuccess)
} }
} }
} }
}; }
</script> </script>
<style scoped> <style scoped>
.inputWidth { .inputWidth {
...@@ -62,4 +58,5 @@ form /deep/ .dialog-btn-layer { ...@@ -62,4 +58,5 @@ form /deep/ .dialog-btn-layer {
bottom: 20px; bottom: 20px;
right: 20px; right: 20px;
background: #fff; background: #fff;
}</style> }
</style>
...@@ -3,101 +3,107 @@ ...@@ -3,101 +3,107 @@
<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-row class="title">基本信息</el-row>
<el-form-item label="知识库名称:" prop="knowledgeName"> <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>
<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-form-item label="知识库描述:" prop="knowledgeDescribe">
<el-input v-model="form.knowledgeDescribe" type="textarea" :rows="4" class="inputWidth" :size="defaultFormItemSize" placeholder="描述这个知识库的内容,详细的描述可以让AI及时访问知识库的内容。如果为空,将影响该知识库在知识问答中被检索到的概率,因此建议尽可能对知识库详细地总结描述。"></el-input> <el-input v-model="form.knowledgeDescribe" type="textarea" :rows="4" class="inputWidth" :size="defaultFormItemSize" placeholder="描述这个知识库的内容,详细的描述可以让AI及时访问知识库的内容。如果为空,将影响该知识库在知识问答中被检索到的概率,因此建议尽可能对知识库详细地总结描述。"></el-input>
</el-form-item> </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> <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> <el-button :size="defaultFormItemSize" :plain="true" @click="onSubmit()">下一步</el-button>
</template> </template>
</el-row> </el-row>
</el-form > </el-form>
</template> </template>
<script> <script>
import { KnowledgeManage } from '@/api/gptController.js'; import { KnowledgeManage } from '@/api/gptController.js'
export default { export default {
data () { data() {
return { return {
form: { form: {
'knowledgeDescribe': undefined, knowledgeDescribe: undefined,
'knowledgeName': undefined, knowledgeName: undefined,
'knowledgeCode': undefined, knowledgeId: undefined,
knowledgeId: undefined knowledgeFormat: 0
}, },
rules: { rules: {
knowledgeName: [ knowledgeName: [{ required: true, message: '请填写知识库名称', trigger: 'blur' }]
{ required: true, message: '请填写知识库名称', trigger: 'blur' } }
]
} }
};
}, },
props: ['isEdit', 'item'], props: ['isEdit', 'item'],
components: {}, components: {},
computed: {}, computed: {},
mounted () { mounted() {
this.init() this.init()
}, },
methods: { methods: {
init () { init() {
if (this.isEdit) { if (this.isEdit) {
this.form.knowledgeDescribe = this.item.knowledgeDescribe this.form.knowledgeDescribe = this.item.knowledgeDescribe
this.form.knowledgeName = this.item.knowledgeName this.form.knowledgeName = this.item.knowledgeName
this.form.knowledgeCode = this.item.knowledgeCode
this.form.knowledgeId = this.item?.knowledgeId this.form.knowledgeId = this.item?.knowledgeId
} }
}, },
onSubmit () { onSubmit() {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.$refs['form'].validate((valid) => { this.$refs['form'].validate((valid) => {
if (valid) { if (valid) {
let params = {}; let params = {}
params.knowledgeManageDto = { ...this.form }; params.knowledgeManageDto = { ...this.form }
if (this.isEdit) { if (this.isEdit) {
KnowledgeManage.update(this, params).then(res => { KnowledgeManage.update(this, params)
resolve(res); .then((res) => {
this.$message.success('编辑成功'); resolve(res)
this.$message.success('编辑成功')
this.next(res) this.next(res)
}).catch(e => { })
reject(e); .catch((e) => {
}); reject(e)
})
} else { } else {
KnowledgeManage.add(this, params).then(res => { KnowledgeManage.add(this, params)
resolve(res); .then((res) => {
this.$message.success('添加成功'); resolve(res)
this.$message.success('添加成功')
this.next(res) this.next(res)
}).catch(e => { })
reject(e); .catch((e) => {
}); reject(e)
})
} }
} else { } else {
// this.$message.error('请完善必填信息'); // this.$message.error('请完善必填信息');
// reject(); // reject();
} }
}); })
}); })
}, },
onCancel () { onCancel() {
this.$parent.onCancel(false) this.$parent.onCancel(false)
}, },
next (res) { next(res) {
this.$parent.knowledgeName = this.form.knowledgeName this.$parent.knowledgeName = this.form.knowledgeName
this.$parent.knowledgeCode = res.data.knowledgeCode; this.$parent.knowledgeFormat = this.form.knowledgeFormat
this.$parent.active++ this.$parent.active++
} }
} }
} }
</script> </script>
<style scoped> <style scoped>
.introduce{ .introduce {
font-size: 12px; font-size: 12px;
color: #909399; 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> <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="topBox">
<div class="title">知识库</div> <div class="title">知识库</div>
<div class="instructions">面向客户构建私域文档或知识管理的能力,实现本地数据源文档的上传、分段和清洗并储存至向量数据库中。</div> <div class="instructions">面向客户构建私域文档或知识管理的能力,实现本地数据源文档的上传、分段和清洗并储存至向量数据库中。</div>
...@@ -21,7 +22,7 @@ ...@@ -21,7 +22,7 @@
<card v-for="item in myDataSetPage.tableData.impl.dataList" :item="item" :key="item.knowledgeId" :refresh="refresh"></card> <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 class="box-card-2" v-for="item in 3" :key="item"></div>
</div> </div>
<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 :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-pagination>
</el-row> </el-row>
...@@ -30,112 +31,132 @@ ...@@ -30,112 +31,132 @@
</template> </template>
<script> <script>
import { mapGetters } from 'vuex'; import { mapGetters } from 'vuex'
/* eslint-disable-next-line */ /* eslint-disable-next-line */
import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/widget.js'; import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/widget.js'
import { KnowledgeManage } from '@/api/gptController.js'; import { KnowledgeManage } from '@/api/gptController.js'
import editOrAdd from './dialog/editOrAdd'; import editOrAdd from './dialog/editOrAdd'
import card from './card/index'; import card from './card/index'
export default { export default {
data () { data() {
return { return {
myDataSetPage: { myDataSetPage: {
formFilter: { formFilter: {
'searchString': '' searchString: ''
}, },
tableData: { tableData: {
impl: new TableWidget(this.getwidgetData, true, true, false, undefined, false) impl: new TableWidget(this.getwidgetData, true, true, false, undefined, false)
} }
} }
}; }
}, },
components: {card}, components: { card },
computed: { computed: {
...mapGetters(['getMainContextHeight']), ...mapGetters(['getMainContextHeight']),
tableHeight () { tableHeight() {
return this.getMainContextHeight - 145 + 'px'; return this.getMainContextHeight - 145 + 'px'
} }
}, },
methods: { methods: {
getwidgetData (params) { getwidgetData(params) {
if (params == null) params = {}; if (params == null) params = {}
params = { params = {
...params, ...params,
knowledgeManageDtoFilter: { ...this.myDataSetPage.formFilter } knowledgeManageDtoFilter: { ...this.myDataSetPage.formFilter }
} }
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
KnowledgeManage.list(this, params).then(res => { KnowledgeManage.list(this, params)
.then((res) => {
resolve({ resolve({
dataList: res.data.dataList, dataList: res.data.dataList,
totalCount: res.data.totalCount totalCount: res.data.totalCount
}); })
}).catch(e => { })
reject(e); .catch((e) => {
}); reject(e)
}); })
})
}, },
add () { add() {
this.$dialog.show('创建知识库', editOrAdd, { this.$dialog
.show(
'创建知识库',
editOrAdd,
{
area: ['100%', '100%'] area: ['100%', '100%']
}, { isEdit: false }).then(res => {
this.refresh();
}).catch(e => { this.refresh(); });
}, },
edit (item) { { isEdit: false }
this.$dialog.show('修改知识库', editOrAdd, { )
.then((res) => {
this.refresh()
})
.catch((e) => {
this.refresh()
})
},
edit(item) {
this.$dialog
.show(
'修改知识库',
editOrAdd,
{
area: ['100%', '100%'] area: ['100%', '100%']
}, { isEdit: true, item: item }).then(res => {
this.refresh();
}).catch(e => { this.refresh(); });
}, },
del (item) { { isEdit: true, item: item }
)
.then((res) => {
this.refresh()
})
.catch((e) => {
this.refresh()
})
},
del(item) {
this.$confirm('是否确认删除', '提示', { this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
let params = { knowledgeId: item.knowledgeId } let params = { knowledgeId: item.knowledgeId }
KnowledgeManage.delete(this, params).then(res => { KnowledgeManage.delete(this, params)
this.$message.success('删除成功'); .then((res) => {
this.$message.success('删除成功')
this.refresh() this.refresh()
}).catch(e => { })
console.log(e); .catch((e) => {
}); console.log(e)
} })
); })
}, },
refresh (reloadData = false) { refresh(reloadData = false) {
if (reloadData) { if (reloadData) {
this.myDataSetPage.tableData.impl.refreshTable(true, 1); this.myDataSetPage.tableData.impl.refreshTable(true, 1)
} else { } else {
this.myDataSetPage.tableData.impl.refreshTable(); this.myDataSetPage.tableData.impl.refreshTable()
} }
}, },
onReset () { onReset() {
this.$refs.myDataSetPage.resetFields(); this.$refs.myDataSetPage.resetFields()
this.refresh(true); this.refresh(true)
}, },
formInit () { formInit() {
this.refresh(); this.refresh()
} }
}, },
mounted () { mounted() {
this.formInit() this.formInit()
} }
}
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/assets/style/element-variables.scss"; @import '@/assets/style/element-variables.scss';
.topBox { .topBox {
background-color: white; background-color: white;
width: 100%; 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>
<!-- 创建知识图谱 -->
<template>
<el-form label-position="left" ref="form" label-width="120px" :model="form" :size="defaultFormItemSize" :rules="rules">
<el-form-item label="类型:" prop="kgType">
<el-select v-model="form.kGManageDto.kgType" placeholder="请选择类型">
<el-option v-for="item in [{ label: 'neo4j', value: 'neo4j' }]" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="名称:" prop="kgUserName">
<el-input v-model="form.kGManageDto.kgUserName" :readonly="isEdit || existingTask" class="inputWidth" :size="defaultFormItemSize"></el-input>
</el-form-item>
<el-form-item label="描述:" prop="kgDescribe">
<el-input v-model="form.kGManageDto.kgDescribe" :readonly="isEdit || existingTask" class="inputWidth" :size="defaultFormItemSize"></el-input>
</el-form-item>
<el-form-item label="链接地址:" prop="kgUrl">
<el-input v-model="form.kGManageDto.kgUrl" :readonly="isEdit || existingTask" class="inputWidth" :size="defaultFormItemSize"></el-input>
</el-form-item>
<el-form-item label="浏览地址:" prop="kgBowerUrl">
<el-input v-model="form.kGManageDto.kgBowerUrl" :readonly="isEdit || existingTask" class="inputWidth" :size="defaultFormItemSize"></el-input>
</el-form-item>
<el-form-item label="用户名:" prop="kgName">
<el-input v-model="form.kGManageDto.kgName" :readonly="isEdit || existingTask" class="inputWidth" :size="defaultFormItemSize"></el-input>
</el-form-item>
<el-form-item label="密码:" prop="kgPassword">
<el-input v-model="form.kGManageDto.kgPassword" :readonly="isEdit || existingTask" class="inputWidth" :size="defaultFormItemSize"></el-input>
</el-form-item>
<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>
</el-form>
</template>
<script>
import { KnowledgeGraph } from '@/api/gptController.js'
export default {
data() {
return {
modelList: [],
dataList: [],
form: {
kGManageDto: {
kgBowerUrl: '',
kgDescribe: '',
kgName: '',
kgPassword: '',
kgType: '',
kgUrl: '',
kgUserName: ''
}
},
rules: {
'tuningTaskDto.taskName': [{ required: true, message: '请输入任务名称', trigger: 'blur' }]
}
}
},
props: ['isEdit', 'item', 'existingTask'],
components: {},
computed: {},
mounted() {},
methods: {
onCancel(isSuccess) {
if (this.observer != null) {
this.observer.cancel(isSuccess)
}
},
onSubmit() {
return new Promise((resolve, reject) => {
this.$refs['form'].validate((valid) => {
if (valid) {
let params = {}
params = { ...this.form }
if (this.isEdit) {
KnowledgeGraph.update(this, params)
.then((res) => {
resolve(res)
this.$message.success('编辑成功')
this.onCancel(true)
})
.catch((e) => {
reject(e)
})
} else {
KnowledgeGraph.add(this, params)
.then((res) => {
resolve(res)
this.$message.success('添加成功')
this.onCancel(true)
})
.catch((e) => {
reject(e)
})
}
} else {
// reject();
}
})
})
}
}
}
</script>
<style scoped>
.inputWidth {
width: 600px;
}
.title {
font-size: 20px;
margin-bottom: 16px;
}
.introduce {
font-size: 12px;
color: #909399;
margin-bottom: 10px;
display: block;
}
.isReadonly input {
border: none;
}
</style>
This diff is collapsed.
...@@ -3,8 +3,7 @@ ...@@ -3,8 +3,7 @@
<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-row class="title">基本信息</el-row>
<el-form-item label="任务名称:" prop="tuningTaskDto.taskName"> <el-form-item label="任务名称:" prop="tuningTaskDto.taskName">
<el-input v-model="form.tuningTaskDto.taskName" :readonly="isEdit || existingTask" class="inputWidth" <el-input v-model="form.tuningTaskDto.taskName" :readonly="isEdit || existingTask" class="inputWidth" :size="defaultFormItemSize" v-if="!(isEdit || existingTask)"></el-input>
:size="defaultFormItemSize" v-if="!(isEdit || existingTask)"></el-input>
<span v-else>{{ form.tuningTaskDto.taskName }}</span> <span v-else>{{ form.tuningTaskDto.taskName }}</span>
</el-form-item> </el-form-item>
<!-- <el-form-item label="任务类型:"> <!-- <el-form-item label="任务类型:">
...@@ -13,8 +12,7 @@ ...@@ -13,8 +12,7 @@
</el-select> </el-select>
</el-form-item> --> </el-form-item> -->
<el-form-item label="任务描述:"> <el-form-item label="任务描述:">
<el-input v-model="form.tuningTaskDto.taskDescribe" :readonly="isEdit || existingTask" type="textarea" :rows="4" <el-input v-model="form.tuningTaskDto.taskDescribe" :readonly="isEdit || existingTask" type="textarea" :rows="4" class="inputWidth" :size="defaultFormItemSize" v-if="!(isEdit || existingTask)"></el-input>
class="inputWidth" :size="defaultFormItemSize" v-if="!(isEdit || existingTask)"></el-input>
<span v-else>{{ form.tuningTaskDto.taskDescribe }}</span> <span v-else>{{ form.tuningTaskDto.taskDescribe }}</span>
</el-form-item> </el-form-item>
...@@ -22,13 +20,11 @@ ...@@ -22,13 +20,11 @@
<el-row> <el-row>
<span class="introduce">训练任务的算法选择、参数及相关配置,训练配置参数影响训练速度及模型效果。</span></el-row> <span class="introduce">训练任务的算法选择、参数及相关配置,训练配置参数影响训练速度及模型效果。</span></el-row>
<el-form-item label="选择基础模型版本:" prop="tuningRunDto.modelVersionId"> <el-form-item label="选择基础模型版本:" prop="tuningRunDto.modelVersionId">
<el-cascader v-model="form.tuningRunDto.modelVersionId" :options="modelList" <el-cascader v-model="form.tuningRunDto.modelVersionId" :options="modelList" :props="{ label: 'name', value: 'id', emitPath: false }"></el-cascader>
:props="{ label: 'name', value: 'id', emitPath: false }"></el-cascader>
</el-form-item> </el-form-item>
<el-form-item label="训练方法:"> <el-form-item label="训练方法:">
<el-radio v-for="item in TrainingMethod.getList()" :key="item.id" v-model="form.tuningRunDto.trainMethod" <el-radio v-for="item in TrainingMethod.getList()" :key="item.id" v-model="form.tuningRunDto.trainMethod" :label="item.name">{{ item.name }}</el-radio>
:label="item.name">{{ item.name }}</el-radio>
</el-form-item> </el-form-item>
<el-form-item label="参数配置:"> <el-form-item label="参数配置:">
<parameterConfiguration v-model="form.tuningRunDto.configuration" :existingTask="existingTask" /> <parameterConfiguration v-model="form.tuningRunDto.configuration" :existingTask="existingTask" />
...@@ -40,12 +36,10 @@ ...@@ -40,12 +36,10 @@
训练任务的选择数据及相关配置,支持选择该模型可使用的数据。</span></el-row> 训练任务的选择数据及相关配置,支持选择该模型可使用的数据。</span></el-row>
<el-form-item label="选择数据集版本" prop="tuningRunDto.datasetVersionId"> <el-form-item label="选择数据集版本" prop="tuningRunDto.datasetVersionId">
<el-cascader v-model="form.tuningRunDto.datasetVersionId" :options="dataList" <el-cascader v-model="form.tuningRunDto.datasetVersionId" :options="dataList" :props="{ label: 'name', value: 'id', emitPath: false }"></el-cascader>
:props="{ label: 'name', value: 'id', emitPath: false }"></el-cascader>
</el-form-item> </el-form-item>
<el-form-item label="数据拆分比例:"> <el-form-item label="数据拆分比例:">
<el-input-number v-model="form.tuningRunDto.splitRatio" class="inputWidth" :size="defaultFormItemSize" :min="0" <el-input-number v-model="form.tuningRunDto.splitRatio" class="inputWidth" :size="defaultFormItemSize" :min="0" :max="100"></el-input-number>
:max="100"></el-input-number>
</el-form-item> </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">
<el-button :size="defaultFormItemSize" :plain="true" @click="onCancel(false)">取消</el-button> <el-button :size="defaultFormItemSize" :plain="true" @click="onCancel(false)">取消</el-button>
...@@ -131,7 +125,6 @@ export default { ...@@ -131,7 +125,6 @@ export default {
if (valid) { if (valid) {
let params = {} let params = {}
params = this.existingTask ? { tuningRunDto: this.form.tuningRunDto } : { ...this.form } params = this.existingTask ? { tuningRunDto: this.form.tuningRunDto } : { ...this.form }
console.log(params)
if (this.isEdit) { if (this.isEdit) {
apiFunction apiFunction
.update(this, params) .update(this, params)
...@@ -170,6 +163,7 @@ export default { ...@@ -170,6 +163,7 @@ export default {
return { return {
id: item.modelId, id: item.modelId,
name: item.modelName, name: item.modelName,
// prettier-ignore
children: item.modelVersionList === [] ? [] : item.modelVersionList.map((item2) => { children: item.modelVersionList === [] ? [] : item.modelVersionList.map((item2) => {
return { id: item2.versionId, name: 'V' + item2.modelVersion } return { id: item2.versionId, name: 'V' + item2.modelVersion }
}) })
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<el-form label-position="left" ref="form" label-width="100px" :model="form" :size="defaultFormItemSize" :rules="rules"> <el-form label-position="left" ref="form" label-width="100px" :model="form" :size="defaultFormItemSize" :rules="rules">
<el-row class="title">基本信息</el-row> <el-row class="title">基本信息</el-row>
<el-form-item label="服务名称:" prop="modelDeployDto.serviceName"> <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> <el-row>
<span class="introduce">支持中英文、数字、下划线(_),2-20个字符,不能以下划线为开头</span></el-row> <span class="introduce">支持中英文、数字、下划线(_),2-20个字符,不能以下划线为开头</span></el-row>
</el-form-item> </el-form-item>
...@@ -112,9 +112,7 @@ export default { ...@@ -112,9 +112,7 @@ export default {
getModelList() { getModelList() {
ModelDeployment.listForTree(this, {}) ModelDeployment.listForTree(this, {})
.then((res) => { .then((res) => {
this.modelList = res.data this.modelList = res.data.map((item) => {
.filter((item) => item.isBaseModel === 1)
.map((item) => {
return { return {
id: item.modelId, id: item.modelId,
name: item.modelName, name: item.modelName,
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<div style="position: relative"> <div style="position: relative">
<div class="topBox"> <div class="topBox">
<div class="title">模型部署</div> <div class="title">模型部署</div>
<div class="instructions"></div> <div class="instructions">模型部署在云端服务器,用户通过网页访问或者 API 接口调用等形式向云端服务器发出请求,云端收到请求后处理并返回结果。</div>
</div> </div>
<div class="tableBox" :style="{ height: tableHeight }"> <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>
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
</el-table-column> </el-table-column>
<el-table-column prop="total_memory" label="显存总大小(M)"> <el-table-column prop="total_memory" label="显存总大小(M)">
</el-table-column> </el-table-column>
<el-table-column prop="used_memory" label="使用大小(M)"> <!-- <el-table-column prop="used_memory" label="使用大小(M)">
</el-table-column> </el-table-column>
<el-table-column prop="free_memory" label="剩余大小(M)"> <el-table-column prop="free_memory" label="剩余大小(M)">
</el-table-column> </el-table-column>
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.gpu_util }}% {{ scope.row.gpu_util }}%
</template> </template>
</el-table-column> </el-table-column> -->
</el-table> </el-table>
</el-form-item> </el-form-item>
......
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