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)
resolve({ .then((res) => {
dataList: res.data.dataList, resolve({
totalCount: res.data.totalCount dataList: res.data.dataList,
}); totalCount: res.data.totalCount
}).catch(e => { })
reject(e); })
}); .catch((e) => {
}); reject(e)
})
})
}, },
add () { add() {
this.$dialog.show('创建模版', editOrAdd, { this.$dialog
area: ['100%', '100%'] .show(
}, { isEdit: false }).then(res => { '创建模版',
this.refresh(); editOrAdd,
}).catch(e => { }); {
area: ['100%', '100%']
},
{ isEdit: false }
)
.then((res) => {
this.refresh()
})
.catch((e) => {})
}, },
edit (item) { edit(item) {
this.$dialog.show('修改模版', editOrAdd, { this.$dialog
area: ['100%', '100%'] .show(
}, { isEdit: true, item: item }).then(res => { '修改模版',
this.refresh(); editOrAdd,
}).catch(e => { }); {
area: ['100%', '100%']
},
{ isEdit: true, item: item }
)
.then((res) => {
this.refresh()
})
.catch((e) => {})
}, },
del (item) { 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.refresh() this.$message.success('删除成功')
}).catch(e => { this.refresh()
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 v-if="this.myDataSetPage.tableData.impl.dataList.length<1" > </template>
<div class="table-empty unified-font"> </vxe-column>
<img src="@/assets/img/empty.png"> <vxe-column field="dataType" title="数据类型">
<span>暂无数据</span> <template slot-scope="scope">
</div> {{ DataType.getValue(scope.row.dataType ) }}
</template> </template>
</div> </vxe-column>
<vxe-column field="dimensionType" title="标注类型">
<template slot-scope="scope">
{{ LabelType.getValue(scope.row.dimensionType ) }}
</template>
</vxe-column>
<vxe-column field="createTime" title="创建时间"></vxe-column>
<vxe-column field="operation" title="操作" width="280">
<template slot-scope="scope">
<el-button type="text" icon="el-icon-plus" @click="addVersions(scope.row)">新增版本</el-button>
<el-button type="text" icon="el-icon-menu" @click="all(scope.row)">全部版本</el-button>
<el-button type="text" icon="el-icon-delete" @click="delDataset(scope.row)">删除</el-button>
</template>
</vxe-column>
</vxe-table>
<el-row slot="pagination" type="flex" justify="end" style="margin-top: 16px;width: 100%;">
<el-pagination :total="myDataSetPage.tableData.impl.totalCount" :current-page="myDataSetPage.tableData.impl.currentPage" :page-size="myDataSetPage.tableData.impl.pageSize" :page-sizes="[10, 20, 50, 100]" layout="total, prev, pager, next, sizes" @current-change="myDataSetPage.tableData.impl.onCurrentPageChange" @size-change="myDataSetPage.tableData.impl.onPageSizeChange">
</el-pagination>
</el-row>
</div>
</div> </div>
</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 { MyDataSet } from '@/api/gptController.js'; import { MyDataSet } from '@/api/gptController.js'
import editOrAdd from './dialog/editOrAdd'; import editOrAdd from './dialog/editOrAdd'
import tableItem from './tableItem'; import addVersions from './tableItem/dialog/add.vue'
import tableBox from './tableItem/tableBox/index.vue'
/* eslint-disable-next-line */
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)
resolve({ .then((res) => {
dataList: res.data.dataList.map((item) => { resolve({
return {...item, isEdit: false } dataList: res.data.dataList.map((item) => {
}), return { ...item, isEdit: false }
totalCount: res.data.totalCount }),
}); totalCount: res.data.totalCount
}).catch(e => { })
reject(e); })
}); .catch((e) => {
}); reject(e)
})
})
}, },
add () { addVersions(row) {
this.$dialog.show('创建模版', editOrAdd, { this.$dialog
area: ['100%', '100%'] .show(
}, { isEdit: false }).then(res => { '新增数据集版本',
this.refresh(); addVersions,
}).catch(e => { }); {
area: ['600px', 'auto']
},
{ isEdit: false, datasetId: row.datasetId, versionList: row.datasetVersionList }
)
.then((res) => {
this.refresh()
})
.catch((e) => {})
}, },
edit (item) { delDataset(item) {
this.$dialog.show('修改模版', editOrAdd, { this.$confirm('是否确认删除', '提示', {
area: ['100%', '100%'] confirmButtonText: '确定',
}, { isEdit: true, item: item }).then(res => { cancelButtonText: '取消',
this.refresh(); type: 'warning'
}).catch(e => { }); }).then(() => {
let params = { datasetId: item.datasetId }
MyDataSet.delete(this, params)
.then((res) => {
this.$message.success('删除成功')
this.refresh()
})
.catch((e) => {
console.log(e)
})
})
}, },
del (item) {
all(row) {
// this.dialogTitle = this.value.datasetName
// this.dialogVisible = true
this.$dialog
.show(
row.datasetName,
tableBox,
{
area: ['100%', '100%']
},
{ tableData: row, refresh: this.refresh }
)
.then((res) => {
this.refresh()
})
.catch((e) => {})
},
add() {
this.$dialog
.show(
'创建模版',
editOrAdd,
{
area: ['100%', '100%']
},
{ isEdit: false }
)
.then((res) => {
this.refresh()
})
.catch((e) => {})
},
edit(item) {
this.$dialog
.show(
'修改模版',
editOrAdd,
{
area: ['100%', '100%']
},
{ isEdit: true, item: item }
)
.then((res) => {
this.refresh()
})
.catch((e) => {})
},
del(item) {
this.$confirm('是否确认删除', '提示', { 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.refresh() this.$message.success('删除成功')
}).catch(e => { this.refresh()
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,13 +5,9 @@ ...@@ -5,13 +5,9 @@
<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()" </el-option>
:key="item.id" </el-select>
:label="item.name"
:value="item.symbol">
</el-option>
</el-select>
</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">
...@@ -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
this.download('/admin/app/datasetVersion/export', params, '下载文件.' + this.form.format, 'get').then(res => { downDom.click()
// resolve(res); this.onCancel(true)
console.log(res); this.$message.success('下载成功')
this.$message.success('下载成功'); })
this.onCancel(true);
}).catch(e => { // this.download('/admin/app/datasetVersion/export', params, '下载文件.' + this.form.format, 'get').then(res => {
// reject(e); // // resolve(res);
}); // console.log(res);
// this.$message.success('下载成功');
// this.onCancel(true);
// }).catch(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">
<template slot-scope="scope"> <template slot-scope="scope">
<el-input style="height: 100%;" type="textarea" placeholder="请输入内容" v-model="scope.row[item]" :rows="10"> <el-input style="height: 100%;" type="textarea" placeholder="请输入内容" v-model="scope.row[item]" :rows="10">
</el-input> </el-input>
</template> </template>
</vxe-column> </vxe-column>
</vxe-table> </vxe-table>
<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>
<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>
...@@ -3,10 +3,10 @@ ...@@ -3,10 +3,10 @@
<div class="tableItem"> <div class="tableItem">
<div class="operation"> <div class="operation">
<div> <div>
<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>
...@@ -18,73 +18,89 @@ ...@@ -18,73 +18,89 @@
<el-button type="text" icon="el-icon-delete" @click="delDataset(value)">删除</el-button> <el-button type="text" icon="el-icon-delete" @click="delDataset(value)">删除</el-button>
</div> </div>
</div> </div>
<tableBox :tableData="value" :refresh="refresh" /> <tableBox :tableData="value" :refresh="refresh" />
</div> </div>
</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
area: ['600px', 'auto'] .show(
}, { isEdit: false, tableData: this.value }).then(res => { '新增数据集版本',
this.refresh() addVersions,
}).catch(e => { }); {
area: ['600px', 'auto']
},
{ isEdit: false, tableData: this.value }
)
.then((res) => {
this.refresh()
})
.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.refresh() this.$message.success('删除成功')
}).catch(e => { this.refresh()
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
area: ['100%', '100%'] .show(
}, { tableData: this.value, refresh: this.refresh }).then(res => { this.value.datasetName,
this.refresh() tableBox,
}).catch(e => { }); {
area: ['100%', '100%']
},
{ tableData: this.value, refresh: this.refresh }
)
.then((res) => {
this.refresh()
})
.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.refresh() this.$message.success('修改成功')
}).catch(e => { this.refresh()
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)
resolve({ .then((res) => {
dataList: res.data.dataList, resolve({
totalCount: res.data.totalCount dataList: res.data.dataList,
}); 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>
<el-button size="mini" v-if="isPreset">复制</el-button> <el-button size="mini" v-if="isPreset">复制</el-button>
<el-dropdown v-else @command="handleCommand($event,item)"> <el-dropdown v-else @command="handleCommand($event,item)">
<span class="el-dropdown-link"> <span class="el-dropdown-link">
...@@ -19,15 +19,15 @@ ...@@ -19,15 +19,15 @@
</el-dropdown-menu> </el-dropdown-menu>
</el-dropdown> </el-dropdown>
</div> --> </div> -->
</div> </div>
<div class="tagBox"> <div class="tagBox">
<el-tag class="tag" type="info" size="mini" v-for="item2 in getTemplateLabel(item)" :key="item2">{{ item2 }}</el-tag> <el-tag class="tag" type="info" size="mini" v-for="item2 in getTemplateLabel(item)" :key="item2">{{ item2 }}</el-tag>
</div> </div>
<div class="content omit_2">{{ item.knowledgeDescribe }}</div> <div class="content omit_2">{{ item.knowledgeDescribe }}</div>
<el-divider style="margin: 14px 0"></el-divider> <el-divider style="margin: 14px 0"></el-divider>
<div class="buttonBox"> <div class="buttonBox">
<!-- <div> <!-- <div>
<el-tooltip :content="'收藏量'+item.viewCount" placement="top"> <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-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>
...@@ -35,30 +35,31 @@ ...@@ -35,30 +35,31 @@
<el-button type="text" style="color: #333" icon="el-icon-view">{{ item.viewCount}}</el-button> <el-button type="text" style="color: #333" icon="el-icon-view">{{ item.viewCount}}</el-button>
</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>
</el-card> </div>
</el-card>
</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.refresh() this.$message.success('取消收藏')
}).catch(e => { this.refresh()
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.refresh() this.$message.success('收藏成功')
}).catch(e => { this.refresh()
console.log(e); })
}); .catch((e) => {
console.log(e)
})
} }
}, },
edit (item) { import(item) {
this.$dialog.show('修改知识库', editOrAdd, { this.$dialog
area: ['100%', '100%'] .show(
}, { isEdit: true, item: item }).then(res => { '导入文件',
this.refresh(); item.knowledgeFormat === '1' ? importConfiguration2 : importConfiguration,
}).catch(e => { this.refresh(); }); {
area: ['100%', '100%']
},
{ isEdit: true, item: item, knowledgeName: item.knowledgeName, knowledgeFormat: item.knowledgeFormat }
)
.then((res) => {
this.refresh()
})
.catch((e) => {
this.refresh()
})
}, },
auth (item) { auth(item) {
this.$dialog.show('授权知识库', authKnowledgeUser, { this.$dialog
area: ['1100px', '600px'] .show(
}, { knowledgeId: item.knowledgeId }).then(res => { '授权知识库',
this.refresh(); authKnowledgeUser,
}).catch(e => { this.refresh(); }); {
area: ['1100px', '600px']
},
{ knowledgeId: item.knowledgeId }
)
.then((res) => {
this.refresh()
})
.catch((e) => {
this.refresh()
})
}, },
del (item) { 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.refresh() this.$message.success('删除成功')
}).catch(e => { this.refresh()
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>
<essentialInformation v-if="active==1" :item="item" :isEdit="isEdit" /> </el-steps> -->
<importConfiguration v-if="active==2" :item="item" :knowledgeName="knowledgeName" />
<div style="width: 60%;">
<essentialInformation v-if="active==1" :item="item" :isEdit="isEdit" />
<importConfiguration v-if="active==2 && knowledgeFormat==0" :item="item" :knowledgeName="knowledgeName" />
<importConfiguration2 v-if="active==2 && knowledgeFormat==1" :item="item" :knowledgeName="knowledgeName" />
</div>
</div> </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: {
},
mounted () { computed: {},
}, 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>
<!-- 基本信息 --> <!-- 基本信息 -->
<template> <template>
<el-form label-position="left" ref="form" label-width="120px" :model="form" :size="defaultFormItemSize" :rules="rules"> <el-form label-position="left" ref="form" label-width="120px" :model="form" :size="defaultFormItemSize" :rules="rules">
<el-row class="title">基本信息</el-row> <el-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="knowledgeDescribe"> <el-form-item label="知识格式:" prop="knowledgeFormat">
<el-radio-group v-model="form.knowledgeFormat">
<el-radio-button v-for="item in KnowledgeFormat.getList()" :key="item.id" :label="item.id">{{ item.name }}</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="知识库描述:" prop="knowledgeDescribe">
<el-input v-model="form.knowledgeDescribe" type="textarea" :rows="4" class="inputWidth" :size="defaultFormItemSize" placeholder="描述这个知识库的内容,详细的描述可以让AI及时访问知识库的内容。如果为空,将影响该知识库在知识问答中被检索到的概率,因此建议尽可能对知识库详细地总结描述。"></el-input> <el-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.next(res) this.$message.success('编辑成功')
}).catch(e => { this.next(res)
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.next(res) this.$message.success('添加成功')
}).catch(e => { this.next(res)
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>
...@@ -18,10 +19,10 @@ ...@@ -18,10 +19,10 @@
</filter-box> </filter-box>
</el-form> </el-form>
<div class="cardBox"> <div class="cardBox">
<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)
resolve({ .then((res) => {
dataList: res.data.dataList, resolve({
totalCount: res.data.totalCount dataList: res.data.dataList,
}); totalCount: res.data.totalCount
}).catch(e => { })
reject(e); })
}); .catch((e) => {
}); reject(e)
})
})
}, },
add () { add() {
this.$dialog.show('创建知识库', editOrAdd, { this.$dialog
area: ['100%', '100%'] .show(
}, { isEdit: false }).then(res => { '创建知识库',
this.refresh(); editOrAdd,
}).catch(e => { this.refresh(); }); {
area: ['100%', '100%']
},
{ isEdit: false }
)
.then((res) => {
this.refresh()
})
.catch((e) => {
this.refresh()
})
}, },
edit (item) { edit(item) {
this.$dialog.show('修改知识库', editOrAdd, { this.$dialog
area: ['100%', '100%'] .show(
}, { isEdit: true, item: item }).then(res => { '修改知识库',
this.refresh(); editOrAdd,
}).catch(e => { this.refresh(); }); {
area: ['100%', '100%']
},
{ isEdit: true, item: item }
)
.then((res) => {
this.refresh()
})
.catch((e) => {
this.refresh()
})
}, },
del (item) { 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.refresh() this.$message.success('删除成功')
}).catch(e => { this.refresh()
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>
This diff is collapsed.
This diff is collapsed.
...@@ -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,19 +112,17 @@ export default { ...@@ -112,19 +112,17 @@ 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) return {
.map((item) => { id: item.modelId,
return { name: item.modelName,
id: item.modelId, children:
name: item.modelName, // prettier-ignore
children: item.modelVersionList === [] ? [] : item.modelVersionList.map((item2) => {
// prettier-ignore return { id: item2.versionId, name: 'V' + item2.modelVersion }
item.modelVersionList === [] ? [] : item.modelVersionList.map((item2) => { })
return { id: item2.versionId, name: 'V' + item2.modelVersion } }
}) })
}
})
}) })
.catch((e) => { .catch((e) => {
console.log(e) console.log(e)
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment