Commit d0ea71d8 authored by mhw's avatar mhw

版本迭代

parent 7f127c61
export default class DataSetCleaning {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetClean/list', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetClean/view', 'get', params, axiosOption, httpOption);
}
static startClean (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetClean/startClean', 'post', params, axiosOption, httpOption);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetClean/add', 'post', params, axiosOption, httpOption);
}
static stopClean (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetClean/stopClean', 'get', params, axiosOption, httpOption);
}
static restartClean (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetClean/restartClean', 'get', params, axiosOption, httpOption);
}
static addAll (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetClean/addAll', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetClean/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetClean/delete', 'post', params, axiosOption, httpOption);
}
static getCleanList (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetCleanConfig/getCleanList', 'post', params, axiosOption, httpOption);
}
static getDesensitiveList (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetCleanConfig/getDesensitiveList', 'post', params, axiosOption, httpOption);
}
static getDeduplicateList (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetCleanConfig/getDeduplicateList', 'post', params, axiosOption, httpOption);
}
static getFilterList (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetCleanConfig/getFilterList', 'post', params, axiosOption, httpOption);
}
static configList (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetCleanConfig/list', 'post', params, axiosOption, httpOption);
}
}
......@@ -18,10 +18,12 @@ export default class DatasetVersion {
static load (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetVersion/load', 'post', params, axiosOption, httpOption);
}
static outputList (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetOutput/list', 'post', params, axiosOption, httpOption);
}
static outputDelete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetOutput/delete', 'post', params, axiosOption, httpOption);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetVersion/add', 'post', params, axiosOption, httpOption);
}
......
......@@ -18,6 +18,7 @@ import KnowledgeManage from './GptController/KnowledgeManage.js';
import DatasetData from './GptController/DatasetData.js';
import ModelDeployment from './GptController/ModelDeployment.js';
import KnowledgeGraph from './GptController/KnowledgeGraph.js';
import DataSetCleaning from './GptController/DataSetCleaning.js';
export {
TemplateController,
......@@ -38,5 +39,6 @@ export {
KnowledgeManage,
DatasetData,
ModelDeployment,
KnowledgeGraph
KnowledgeGraph,
DataSetCleaning
}
<!-- 下载文件列表 -->
<template>
<el-table :data="outputList" border style="width: 1200px">
<el-table-column prop="markFormatType" label="标注格式类型">
</el-table-column>
<el-table-column prop="outputContent" label="导出内容">
</el-table-column>
<el-table-column prop="fileSize" label="文件大小">
</el-table-column>
<el-table-column prop="dataCount" label="数据量">
</el-table-column>
<el-table-column prop="createUserId" label="创建人">
<template slot-scope="scope">{{scope.row.createUserIdDictMap.name}}</template>
</el-table-column>
<el-table-column prop="outputStartTime" label="导出开始时间" width="150">
</el-table-column>
<el-table-column prop="outputEndTime" label="导出完成时间" width="150">
</el-table-column>
<el-table-column prop="status" label="状态">
<template slot-scope="scope">
{{ OutputStatus.getValue(scope.row.status) }}
</template>
</el-table-column>
<el-table-column label="操作" fixed="right">
<template slot-scope="scope">
<el-button @click="down(scope.row.downloadUrl)" type="text" size="mini">
下载
</el-button>
<el-button @click="outputDelete(scope.row.outputId)" type="text" size="mini">
刪除
</el-button>
</template>
</el-table-column>
</el-table>
</template>
<script>
import { DatasetVersion } from '@/api/gptController.js'
export default {
data() {
return {}
},
props: ['outputList'],
components: {},
computed: {},
mounted() {},
methods: {
down(url) {
let downDom = document.createElement('a')
downDom.href = url
downDom.click()
},
outputDelete(outputId) {
this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = { outputId }
DatasetVersion.outputDelete(this, params).then((res) => {
this.outputList = res.data.dataList
console.log(this.outputList)
})
})
}
}
}
</script>
<style scoped>
</style>
......@@ -198,6 +198,11 @@ const CleanStatus = new DictionaryBase('清洗状态', [
id: 1,
name: '清洗完成',
symbol: '1'
},
{
id: 2,
name: '暂停清洗',
symbol: '2'
}
]);
Vue.prototype.CleanStatus = CleanStatus;
......@@ -645,6 +650,80 @@ const KnowledgeFormat = new DictionaryBase('知识格式', [
]);
Vue.prototype.KnowledgeFormat = KnowledgeFormat;
const CleaningMethod = new DictionaryBase('清洗方式', [
{
id: 1,
name: '移除不可见字符',
symbol: 'remove_invisible_character'
},
{
id: 2,
name: '规范化空格',
symbol: 'replace_uniform_whitespace'
},
{
id: 3,
name: '去除乱码',
symbol: 'remove_non_meaning_characters'
},
{
id: 4,
name: '繁体转简体',
symbol: 'replace_traditional_chinese_to_simplified'
},
{
id: 5,
name: '去除网页标识符',
symbol: 'remove_web_identifiers'
},
{
id: 6,
name: '去除表情',
symbol: 'remove_emoji'
},
{
id: 7,
name: '检查文档的词数目',
symbol: 'filter_check_number_words'
},
{
id: 8,
name: '检查文档的字重复率',
symbol: 'filter_check_character_repetition_removal'
},
{
id: 9,
name: '检查文档的词重复率',
symbol: 'filter_check_word_repetition_removal'
},
{
id: 10,
name: '检查文档的特殊字符率',
symbol: 'filter_check_special_characters'
},
{
id: 11,
name: '检查文档的色情暴力词率',
symbol: 'filter_check_flagged_words'
},
{
id: 12,
name: '去除Email',
symbol: 'replace_emails'
},
{
id: 13,
name: '去除IP地址',
symbol: 'replace_ip'
},
{
id: 14,
name: '去除数字',
symbol: 'replace_identifier'
}
]);
Vue.prototype.CleaningMethod = CleaningMethod;
export {
TemplateLabelDict,
ScenarioTypeDict,
......@@ -670,5 +749,6 @@ export {
KnowledgeImportFormat,
KnowledgeFormat,
ImportStatus,
PublishStatus
PublishStatus,
CleaningMethod
}
......@@ -4,13 +4,14 @@
import Vue from 'vue';
class DictionaryBase extends Map {
constructor (name, dataList, keyId = 'id', symbolId = 'symbol') {
constructor(name, dataList, keyId = 'id', symbolId = 'symbol') {
super();
this.showName = name;
this.setList(dataList, keyId, symbolId);
this.dataList = dataList
}
setList (dataList, keyId = 'id', symbolId = 'symbol') {
setList(dataList, keyId = 'id', symbolId = 'symbol') {
this.clear();
if (Array.isArray(dataList)) {
dataList.forEach((item) => {
......@@ -26,7 +27,7 @@ class DictionaryBase extends Map {
}
}
getList (valueId = 'name', parentIdKey = 'parentId', filter) {
getList(valueId = 'name', parentIdKey = 'parentId', filter) {
let temp = [];
this.forEach((value, key) => {
let obj = {
......@@ -48,14 +49,19 @@ class DictionaryBase extends Map {
return temp;
}
getValue (id, valueId = 'name') {
getValue(id, valueId = 'name') {
// 如果id为boolean类型,则自动转换为0和1
if (typeof id === 'boolean') {
id = id ? 1 : 0;
}
return (this.get(id) || {})[valueId];
}
fromSymbolgetValue(symbol, valueId = 'name') {
return this.dataList.find((item) => {
return item.symbol === symbol
})[valueId]
// return (this.get(symbol) || {})[valueId];
}
}
const SysUserStatus = new DictionaryBase('用户状态', [
......
<!-- -->
<template>
<div class="tableBox" style=" width:100% ">
<vxe-table border show-header-overflow show-overflow :row-config="{ isHover: true }" :data="tableData.impl.dataList" min-height="96">
<vxe-column field="cleanId" title="序号"></vxe-column>
<vxe-column field="cleanBeforeData" title="清洗前">
<!-- <template slot-scope="scope">
{{CleanStatus.getValue(scope.row.cleanStatus)}}
</template> -->
</vxe-column>
<vxe-column field="cleanAfterData" title="清洗后">
</vxe-column>
</vxe-table>
<el-row slot="pagination" type="flex" justify="end" style="margin-top: 16px;width: 100%;">
<el-pagination :total="tableData.impl.totalCount" :current-page="tableData.impl.currentPage" :page-size="tableData.impl.pageSize" :page-sizes="[10, 20, 50, 100]" layout="total, prev, pager, next, sizes" @current-change="tableData.impl.onCurrentPageChange" @size-change="tableData.impl.onPageSizeChange">
</el-pagination>
</el-row>
</div>
</template>
<script>
/* eslint-disable-next-line */
import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/widget.js'
import { DataSetCleaning } from '@/api/gptController.js'
export default {
data() {
return {
tableData: {
impl: new TableWidget(this.getwidgetData, true, true, false, undefined, false)
},
head: {
clean: [
{
name: '清洗前',
key: 'cleanBeforeData'
},
{
name: '清洗后',
key: 'cleanAfterData'
}
],
desensitive: [
{
name: '清洗前',
key: 'cleanBeforeData'
},
{
name: '清洗后',
key: 'cleanAfterData'
}
],
filter: [
{
name: '文本内容'
}
]
}
}
},
props: ['api', 'cleanId'],
components: {},
computed: {},
mounted() {
this.refresh()
},
methods: {
getwidgetData(params) {
if (params == null) params = {}
let key
switch (this.api) {
case 'getCleanList':
key = 'cleanDtoFilter'
break
case 'getDesensitiveList':
key = 'desensitiveDtoFilter'
break
case 'getFilterList':
key = 'filterDtoFilter'
break
default:
break
}
params = {
[key]: {
cleanId: this.cleanId
},
...params
}
return new Promise((resolve, reject) => {
DataSetCleaning[this.api](this, params)
.then((res) => {
resolve({
dataList: res.data.dataList,
totalCount: 0
})
})
.catch((e) => {
reject(e)
})
})
},
refresh(reloadData = false) {
if (reloadData) {
this.tableData.impl.refreshTable(true, 1)
} else {
this.tableData.impl.refreshTable()
}
}
}
}
</script>
<style scoped>
</style>
<!-- 配置卡片 -->
<template>
<div>
<el-card class="box-card">
<div class="topBox">
<el-tooltip class="item" effect="dark" :content="value.tag" placement="top-start" :disabled='!isTextOverflowing(value.tag,1,156,16)'>
<div class="title omit">
{{value.tag}}
</div>
</el-tooltip>
<el-switch v-if="'isopen' in value" v-model="value.isopen" active-color="#13ce66" inactive-color="#ff4949">
</el-switch>
</div>
<el-tooltip class="item" effect="dark" :content="value.content" placement="top-start" :disabled='!isTextOverflowing(value.content,2,206,12)'>
<div class="content omit_2">
{{value.content}}
</div>
</el-tooltip>
<!-- <el-divider style="margin: 14px 0"></el-divider> -->
<component v-if="value.inputCompont" :is='value.inputCompont.compont' v-model="value.value" v-bind="value.inputCompont.attrs" style="width:100%"></component>
</el-card>
</div>
</template>
<script>
export default {
data() {
return {}
},
props: ['value'],
components: {},
computed: {},
mounted() {},
methods: {
isTextOverflowing(text, lineNum = 1, width, fontSize) {
// 创建一个临时的div来计算文本是否超出
const tempDiv = document.createElement('div')
tempDiv.innerHTML = text
tempDiv.style.position = 'absolute'
tempDiv.style.width = width + 'px'
tempDiv.style.opacity = 0
tempDiv.style.overflow = 'hidden'
tempDiv.style.whiteSpace = 'nowrap'
tempDiv.style.fontSize = fontSize + 'px'
document.body.appendChild(tempDiv)
const isOverflowing = tempDiv.scrollWidth > tempDiv.offsetWidth * lineNum
document.body.removeChild(tempDiv)
return isOverflowing
}
}
}
</script>
<style lang="scss" scoped>
@import '@/assets/style/element-variables.scss';
.box-card {
width: 240px;
min-height: 150px;
flex-shrink: 0;
margin-bottom: 20px;
background: linear-gradient(to bottom, #e7efff 10%, #fff 50%);
}
.box-card-2 {
width: 240px;
flex-shrink: 0;
}
.tag:not(:last-child) {
margin-right: 10px;
}
div /deep/ .el-card__body {
height: 100%;
width: 100%;
position: relative;
}
div /deep/.el-divider--horizontal {
margin: 14px 0 0 0;
}
.topBox {
display: flex;
justify-content: space-between;
}
.title {
font-size: 16px;
color: $--color-text-primary;
margin-bottom: 16px;
width: 156px;
}
.content {
margin-bottom: 10px;
color: $--color-text-secondary;
width: 206px;
font-size: 12px;
}
.buttonBox {
display: flex;
justify-content: space-between;
position: absolute;
bottom: 0;
width: calc(100% - 32px);
}
</style>
<!-- 详情 -->
<template>
<div>
<el-card class="box-card">
<div class="topBox">
<div class="title omit">
基本信息
</div>
</div>
<div class="content">
<div class="item">
<div class="label">任务ID:</div>
<span class="value">{{row.cleanId}}</span>
</div>
<div class="item">
<div class="label">任务名称:</div>
<span class="value">{{row.taskName}}</span>
</div>
<div class="item">
<div class="label">清洗类型:</div>
<span class="value">{{row.cleanType==1?'文本数据清洗':''}}</span>
</div>
<div class="item">
<div class="label">清洗数据集:</div>
<span class="value">{{row.datasetName}}</span>
</div>
<div class="item">
<div class="label">创建人:</div>
<span class="value">{{row.createUserIdDictMap.name}}</span>
</div>
<div class="item">
<div class="label">创建时间:</div>
<span class="value">{{row.startTime}}</span>
</div>
<div class="item">
<div class="label">完成时间:</div>
<span class="value">{{row.finishTime}}</span>
</div>
</div>
</el-card>
<el-card class="box-card">
<div>
<div class="title">
异常清洗
</div>
<div class="cardList">
<template v-for="(item,index) in filterCleanConfig">
<configeCard v-model="filterCleanConfig[index]" :key="item.name" />
</template>
<div style="width: 240px;" v-for="item in 7" :key="item"> </div>
</div>
<cleaningTable :cleanId='row.cleanId' api="getCleanList" />
</div>
</el-card>
<el-card class="box-card">
<div>
<div class="title">
过滤
</div>
<div class="cardList">
<template v-for="(item,index) in filterFilterConfig">
<configeCard v-model="filterFilterConfig[index]" :key="item.name" />
</template>
<div style="width: 240px;" v-for="item in 7" :key="item"> </div>
</div>
<cleaningTable :cleanId='row.cleanId' api="getFilterList" />
</div>
</el-card>
<el-card class="box-card">
<div>
<div class="title">
去隐私
</div>
<div class="cardList">
<template v-for="(item,index) in filterDesensitiveConfig">
<configeCard v-model="filterDesensitiveConfig[index]" :key="item.name" />
</template>
<div style="width: 240px;" v-for="item in 7" :key="item"> </div>
</div>
<cleaningTable :cleanId='row.cleanId' api="getDesensitiveList" />
</div>
</el-card>
</div>
</template>
<script>
import configeCard from './configeCard.vue'
import cleaningTable from './cleaningTable.vue'
import { DataSetCleaning } from '@/api/gptController.js'
export default {
data() {
return {
cleanConfig: [
{
icon: '',
tag: '移除不可见字符',
name: 'remove_invisible_character',
content: '移除ASCII中的一些不可见字符, 如0-32 和127-160这两个范围'
},
{
icon: '',
tag: '规范化空格',
name: 'replace_uniform_whitespace',
content: '将不同的unicode空格比如  u2008,转成正常的空格'
},
{
icon: '',
tag: '去除乱码',
name: 'remove_non_meaning_characters',
content: '去除乱码和无意义的unicode'
},
{
icon: '',
tag: '繁体转简体',
name: 'replace_traditional_chinese_to_simplified',
content: '繁体转简体,如“不經意,妳的笑容”清洗成“不经意,你的笑容”'
},
{
icon: '',
tag: '去除网页标识符',
name: 'remove_web_identifiers',
content: '移除文档中的html标签,如<html>,<dev>,<p>等'
},
{
icon: '',
tag: '去除表情',
name: 'remove_emoji',
content: '去除文档中的表情,如‘🐰’, ‘🧑🏼’等'
}
],
filterConfig: [
{
icon: '',
tag: '检查文档的词数目',
name: 'filter_check_number_words',
content: '词数目不在指定范围会被过滤掉,如中文[1,1000000]'
},
{
icon: '',
tag: '检查文档的字重复率',
name: 'filter_check_character_repetition_removal',
content: '如果字重复率太高,意味着文档中重复的字太多,文档会被过滤掉'
},
{
icon: '',
tag: '检查文档的词重复率',
name: 'filter_check_word_repetition_removal',
content: '如果词重复率太高,意味着文档中重复的词太多,文档会被过滤掉'
},
{
icon: '',
tag: '检查文档的特殊字符率',
name: 'filter_check_special_characters',
content: '如果特殊字符率太高,意味着文档中特殊字符太多,文档会被过滤掉'
},
{
icon: '',
tag: '检查文档的色情暴力词率',
name: 'filter_check_flagged_words',
content: '如果色情暴力词率太高,文档会被过滤掉'
}
],
desensitiveConfig: [
{
icon: '',
tag: '去除Email',
name: 'replace_emails',
content: '去除email地址'
},
{
icon: '',
tag: '去除IP地址',
name: 'replace_ip',
content: '去除IPv4 或者 IPv6 地址'
},
{
icon: '',
tag: '去除数字',
name: 'replace_identifier',
content: '去除数字和字母数字标识符,如电话号码、信用卡号、十六进制散列等,同时跳过年份和简单数字的实例'
}
],
config: {
cleanConfig: [],
desensitiveConfig: [],
filterConfig: []
}
}
},
props: ['row'],
components: { configeCard, cleaningTable },
computed: {
filterCleanConfig() {
return this.cleanConfig.filter((item) => {
return this.config.cleanConfig.some((item2) => {
return item.name === item2.name
})
})
},
filterFilterConfig() {
return this.filterConfig.filter((item) => {
return this.config.filterConfig.some((item2) => {
return item.name === item2.name
})
})
},
filterDesensitiveConfig() {
return this.desensitiveConfig.filter((item) => {
return this.config.desensitiveConfig.some((item2) => {
return item.name === item2.name
})
})
}
},
mounted() {
this.configList()
},
methods: {
configList() {
DataSetCleaning.configList(this, { datasetCleanConfigDtoFilter: { cleanId: this.row.cleanId } })
.then((res) => {
let { cleanConfig, desensitiveConfig, filterConfig } = res.data.dataList[0]
this.config.cleanConfig = JSON.parse(cleanConfig)
this.config.desensitiveConfig = JSON.parse(desensitiveConfig)
this.config.filterConfig = JSON.parse(filterConfig)
})
.catch((e) => {
console.log(e)
})
}
}
}
</script>
<style scoped>
.box-card {
margin-bottom: 20px;
}
.topBox {
display: flex;
justify-content: space-between;
}
.title {
font-size: 16px;
margin-bottom: 16px;
width: calc(100% - 50px);
}
.item {
min-width: 400px;
margin-bottom: 20px;
display: flex;
flex-direction: row;
align-items: flex-end;
}
.content {
display: flex;
flex-wrap: wrap;
}
.cardList {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: space-around;
}
</style>
......@@ -28,41 +28,44 @@
</el-collapse>
<div class="tableBox" :style="{ height: tableHeight }">
<el-form ref="myDataSetPage" :model="myDataSetPage" label-width="75px" :size="defaultFormItemSize" label-position="right" @submit.native.prevent>
<filter-box :item-width="350" @search="search()" @reset="onReset">
<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="数据集名称或id" prop="formFilter.dataName" label-width="120px">
<el-input class="filter-item" v-model="myDataSetPage.formFilter.dataName" :clearable="true" placeholder="数据集名称或id" />
<el-form-item label="清洗数据集名称" prop="formFilter.dataName" label-width="120px">
<el-input class="filter-item" v-model="myDataSetPage.formFilter.dataName" :clearable="true" placeholder="清洗数据集名称" />
</el-form-item>
</filter-box>
</el-form>
<vxe-table border show-header-overflow show-overflow :row-config="{ isHover: true }" :data="myDataSetPage.tableData.impl.dataList" min-height="96">
<vxe-column field="versions" title="版本"></vxe-column>
<vxe-column field="versionsId" title="版本ID"></vxe-column>
<vxe-column field="importState" title="导入状态"></vxe-column>
<vxe-column field="derivedState" title="导出状态"></vxe-column>
<vxe-column field="cleanCondition" title="清洗状态"></vxe-column>
<vxe-column field="cleanCondition" title="增强状态"></vxe-column>
<vxe-column field="cleanCondition" title="发布状态"></vxe-column>
<vxe-column field="cleanCondition" title="标注类型>模板"></vxe-column>
<vxe-column field="cleanId" title="任务序号"></vxe-column>
<vxe-column field="cleanStatus" title="清洗状态">
<template slot-scope="scope">
{{CleanStatus.getValue(scope.row.cleanStatus)}}
</template>
</vxe-column>
<!-- <vxe-column field="cleanType" title="清洗类型"></vxe-column> -->
<vxe-column field="cleanMethod" title="清洗方式">
<template slot-scope="scope">
{{
scope.row.cleanMethod.map((item)=>{
return CleaningMethod.fromSymbolgetValue(item)
}).join('、')
}}
</template>
</vxe-column>
<vxe-column field="datasetName" title="清洗数据集名称"></vxe-column>
<vxe-column field="startTime" title="开始时间"></vxe-column>
<vxe-column field="finishTime" title="完成时间"></vxe-column>
<vxe-column field="operation" title="操作">
<!-- <template slot-scope="scope">
<el-button
type="text"
:size="defaultFormItemSize"
@click="dataImport(scope.row)"
>导入</el-button
>
<el-button
type="text"
:size="defaultFormItemSize"
@click="del(scope.row)"
>删除</el-button
>
</template> -->
<template slot-scope="scope">
<el-button type="text" :size="defaultFormItemSize" @click="stopClean(scope.row)" v-if="scope.row.cleanStatus===0">暂停清洗</el-button>
<el-button type="text" :size="defaultFormItemSize" @click="restartClean(scope.row)" v-if="scope.row.cleanStatus===2">重新清洗</el-button>
<el-button type="text" :size="defaultFormItemSize" v-if="scope.row.cleanStatus===1" @click='details(scope.row)'>详情</el-button>
<el-button type="text" :size="defaultFormItemSize" @click="del(scope.row)">删除</el-button>
</template>
</vxe-column>
</vxe-table>
<el-row slot="pagination" type="flex" justify="end" style="margin-top: 16px;width: 100%;">
......@@ -77,8 +80,10 @@
import { mapGetters } from 'vuex'
/* eslint-disable-next-line */
import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/widget.js'
import { ModelSquare } from '@/api/gptController.js'
import { DataSetCleaning } from '@/api/gptController.js'
import editOrAdd from './dialog/editOrAdd'
import details from './dialog/details'
export default {
data() {
return {
......@@ -113,11 +118,7 @@ export default {
],
myDataSetPage: {
formFilter: {
modelDescribe: '',
modelId: 0,
modelName: '',
modelType: 0,
versionCount: 0
datasetName: ''
},
tableData: {
......@@ -152,14 +153,14 @@ export default {
// pageNum: 0,
// pageSize: 0
// },
datasetManageDtoFilter: { ...this.myDataSetPage.formFilter }
datasetCleanDtoFilter: { ...this.myDataSetPage.formFilter }
}
return new Promise((resolve, reject) => {
ModelSquare.list(this, params)
DataSetCleaning.list(this, params)
.then((res) => {
resolve({
dataList: null,
dataList: res.data.dataList,
totalCount: 0
})
})
......@@ -171,7 +172,7 @@ export default {
add() {
this.$dialog
.show(
'创建模版',
'创建任务',
editOrAdd,
{
area: ['100%', '100%']
......@@ -186,7 +187,7 @@ export default {
edit(item) {
this.$dialog
.show(
'修改模版',
'修改任务',
editOrAdd,
{
area: ['100%', '100%']
......@@ -204,8 +205,8 @@ export default {
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = { batchTaskId: item.batchTaskId }
ModelSquare.delete(this, params)
let params = { cleanId: item.cleanId }
DataSetCleaning.delete(this, params)
.then((res) => {
this.$message.success('删除成功')
this.refresh()
......@@ -215,6 +216,56 @@ export default {
})
})
},
restartClean(item) {
this.$confirm('是否确认重新清洗', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = { cleanId: item.cleanId }
DataSetCleaning.restartClean(this, params)
.then((res) => {
this.$message.success('重启成功')
this.refresh()
})
.catch((e) => {
console.log(e)
})
})
},
stopClean(item) {
this.$confirm('是否确认暂停清洗', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = { cleanId: item.cleanId }
DataSetCleaning.stopClean(this, params)
.then((res) => {
this.$message.success('暂停成功')
this.refresh()
})
.catch((e) => {
console.log(e)
})
})
},
details(row) {
// 详情
this.$dialog
.show(
'详情',
details,
{
area: ['100%', '100%']
},
{ row: row }
)
.then((res) => {
this.refresh()
})
.catch((e) => {})
},
refresh(reloadData = false) {
if (reloadData) {
this.myDataSetPage.tableData.impl.refreshTable(true, 1)
......
......@@ -8,16 +8,11 @@
</template>
<div class="instructions">
<div class="instructionsList">
<div
class="item"
v-for="(item, index) in instructionsList"
:key="index"
>
<div class="item" v-for="(item, index) in instructionsList" :key="index">
<img class="img" :src="item.img" alt="" />
<div class="itemTitle">
<span class="head-index">{{ index + 1 }} &nbsp;</span
>{{ item.title }}
<span class="head-index">{{ index + 1 }} &nbsp;</span>{{ item.title }}
</div>
<div class="itemDescribe">{{ item.describe }}</div>
</div>
......@@ -26,54 +21,25 @@
</el-collapse-item>
</el-collapse>
<div class="tableBox" :style="{ height: tableHeight }">
<el-form
ref="myDataSetPage"
:model="myDataSetPage"
label-width="75px"
:size="defaultFormItemSize"
label-position="right"
@submit.native.prevent
>
<filter-box :item-width="350" @search="search()" @reset="onReset">
<el-form-item label-width="0px">
<el-button
class="add"
type="primary"
icon="el-icon-plus"
:size="defaultFormItemSize"
>创建任务</el-button
>
</el-form-item>
<el-form-item
label="数据集名称或id"
prop="formFilter.dataName"
label-width="120px"
>
<el-input
class="filter-item"
v-model="myDataSetPage.formFilter.dataName"
:clearable="true"
placeholder="数据集名称或id"
/>
<el-form ref="myDataSetPage" :model="myDataSetPage" label-width="75px" :size="defaultFormItemSize" label-position="right" @submit.native.prevent>
<filter-box :item-width="350" @search="search()" @reset="onReset">
<el-form-item label-width="0px">
<el-button class="add" type="primary" icon="el-icon-plus" :size="defaultFormItemSize">创建任务</el-button>
</el-form-item>
<el-form-item label="数据集名称" prop="formFilter.dataName" label-width="120px">
<el-input class="filter-item" v-model="myDataSetPage.formFilter.dataName" :clearable="true" placeholder="数据集名称" />
</el-form-item>
</filter-box>
</el-form>
</filter-box>
</el-form>
>
<vxe-table
border
show-header-overflow
show-overflow
:row-config="{ isHover: true }"
:data="tableData"
min-height="96"
>
<vxe-table border show-header-overflow show-overflow :row-config="{ isHover: true }" :data="tableData" min-height="96">
<vxe-column field="taskName" title="任务名称"></vxe-column>
<vxe-column field="taskStatus" title="任务状态">
<template slot-scope="scope">
{{ TaskStatus.getValue(scope.row.taskStatus) }}
</template>
{{ TaskStatus.getValue(scope.row.taskStatus) }}
</template>
</vxe-column>
<vxe-column field="enhancementType" title="增强类型"></vxe-column>
<vxe-column field="enhancementMode" title="增强方式"></vxe-column>
......@@ -103,9 +69,9 @@
</template>
<script>
import { mapGetters } from 'vuex';
import { mapGetters } from 'vuex'
export default {
data () {
data() {
return {
activeName: '1',
collapseHeight: 0,
......@@ -146,7 +112,7 @@ export default {
address: 'test abc'
}
]
};
}
},
components: {},
......@@ -154,26 +120,24 @@ export default {
computed: {
...mapGetters(['getMainContextHeight']),
tableHeight () {
return this.getMainContextHeight - this.collapseHeight - 34 + 'px';
tableHeight() {
return this.getMainContextHeight - this.collapseHeight - 34 + 'px'
}
},
mounted () {
},
mounted() {},
methods: {
resize (e) {
resize(e) {
setTimeout(() => {
this.collapseHeight = e.height
}, 300);
}, 300)
}
}
};
}
</script>
<style lang="scss" scoped>
@import "@/assets/style/element-variables.scss";
@import '@/assets/style/element-variables.scss';
.instructions {
background-color: white;
width: 100%;
......@@ -227,8 +191,7 @@ export default {
div /deep/ .el-collapse-item__content {
padding-bottom: 0;
}
div /deep/ .el-collapse-item__header{
padding-left: 20px;
div /deep/ .el-collapse-item__header {
padding-left: 20px;
}
</style>
......@@ -65,15 +65,13 @@
<vxe-column field="dataVolume" title="数据量"></vxe-column>
<vxe-column field="inputStatus" title="导入状态">
<template slot-scope="scope">
<el-tag v-if="scope.row.inputStatus!==0" size="mini"> {{ ImportStatus.getValue(scope.row.inputStatus ) }}</el-tag>
<el-tag v-else type="info" size="mini"> {{ ImportStatus.getValue(scope.row.inputStatus ) }}</el-tag>
<el-tag :type="scope.row.inputStatus!==0?'':'info'" size="mini"> {{ ImportStatus.getValue(scope.row.inputStatus ) }}</el-tag>
</template>
</vxe-column>
<vxe-column field="releaseStatus" title="发布状态">
<template slot-scope="scope">
<el-tag v-if="scope.row.releaseStatus!==0" type="danger" size="mini">{{ PublishStatus.getValue(scope.row.releaseStatus ) }}</el-tag>
<el-tag v-else type="info" size="mini"> {{ PublishStatus.getValue(scope.row.releaseStatus ) }}</el-tag>
<el-tag :type="scope.row.releaseStatus!==0?'danger':'info'" size="mini">{{ PublishStatus.getValue(scope.row.releaseStatus ) }}</el-tag>
</template>
</vxe-column>
<vxe-column field="createTime" title="创建时间"></vxe-column>
......@@ -118,7 +116,7 @@ import editOrAdd from './dialog/editOrAdd'
import addVersions from './versionsTableBox/dialog/add.vue'
import versionsTableBox from './versionsTableBox/index.vue'
import derived from './versionsTableBox/dialog/derived.vue'
import dataImport from "./versionsTableBox/dialog/dataImport";
import dataImport from './versionsTableBox/dialog/dataImport'
export default {
data() {
return {
......
......@@ -9,35 +9,7 @@
</el-select>
</el-form-item>
<el-form-item label="数据导出记录:">
<el-table :data="outputList" border style="width: 100%" height="600">
<el-table-column prop="markFormatType" label="标注格式类型">
</el-table-column>
<el-table-column prop="outputContent" label="导出内容">
</el-table-column>
<el-table-column prop="fileSize" label="文件大小">
</el-table-column>
<el-table-column prop="dataCount" label="数据量">
</el-table-column>
<el-table-column prop="createUserId" label="创建人">
</el-table-column>
<el-table-column prop="outputStartTime" label="导出开始时间" width="150">
</el-table-column>
<el-table-column prop="outputEndTime" label="导出完成时间" width="150">
</el-table-column>
<el-table-column prop="status" label="状态">
<template slot-scope="scope">
{{ OutputStatus.getValue(scope.row.status) }}
</template>
</el-table-column>
<el-table-column label="操作" fixed="right">
<template slot-scope="scope">
<el-button @click="down(scope.row.downloadUrl)" type="text" size="mini">
下载
</el-button>
</template>
</el-table-column>
</el-table>
<downList :outputList='outputList' />
</el-form-item>
<el-row type="flex" justify="end" class="dialog-btn-layer mt20">
......@@ -49,6 +21,7 @@
<script>
import { DatasetVersion } from '@/api/gptController.js'
import downList from '@/components/DownList/index.vue'
export default {
data() {
return {
......@@ -59,7 +32,7 @@ export default {
}
},
props: ['isEdit', 'row'],
components: {},
components: { downList },
computed: {},
......@@ -82,19 +55,6 @@ export default {
this.onCancel(true)
this.$message.success('下载成功')
})
// this.download('/admin/app/datasetVersion/export', params, '下载文件.' + this.form.format, 'get').then(res => {
// // resolve(res);
// console.log(res);
// this.$message.success('下载成功');
// this.onCancel(true);
// }).catch(e => {
// // reject(e);
// });
},
down(url) {
let downDom = document.createElement('a')
downDom.href = url
downDom.click()
},
getOutputList() {
let params = { datasetOutputDtoFilter: { versionId: this.row.versionId } }
......
......@@ -16,7 +16,7 @@
<vxe-column field="operation" title="操作" width="150px">
<template slot-scope="scope">
<el-button type="text" :size="defaultFormItemSize" @click="check(scope.row)">查看</el-button>
<el-button type="text" :size="defaultFormItemSize" @click="label(scope.row)" v-if="versionItem.dimensionType===0">标注</el-button>
<el-button type="text" :size="defaultFormItemSize" @click="label(scope.row)" v-if="releaseStatus===0">标注</el-button>
<el-button type="text" :size="defaultFormItemSize" @click="del(scope.row)">删除</el-button>
</template>
</vxe-column>
......@@ -53,7 +53,7 @@ export default {
},
components: {},
props: ['versionItem'],
props: ['versionItem', 'releaseStatus'],
computed: {
...mapGetters(['getMainContextHeight']),
tableHeight() {
......
......@@ -9,12 +9,13 @@
<el-tabs v-model="activeName" style="width:calc(100% - 200px)" v-if="nowVersion">
<div style="position: absolute; top: -55px; right: 0;">
<el-button type="text" :size="defaultFormItemSize" @click="dataImport(nowVersion)">导入</el-button>
<el-button type="text" :size="defaultFormItemSize" @click="del(nowVersion)">删除</el-button>
<el-button type="primary" plain :size="defaultFormItemSize" @click="dataImport(nowVersion)">导入</el-button>
<el-button type="danger" plain :size="defaultFormItemSize" @click="del(nowVersion)">删除</el-button>
<template v-if="nowVersion.inputStatus !== 0">
<el-dropdown style="margin-left:15px;font-size: 12px;color: #0092FF;" :size="defaultFormItemSize">
<el-dropdown split-button type="primary" plain style="margin-left:10px;font-size: 12px;color: #0092FF;" :size="defaultFormItemSize">
<span class="el-dropdown-link">
更多<i class="el-icon-arrow-down el-icon--right"></i>
更多
<!-- <i class="el-icon-arrow-down el-icon--right"></i> -->
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-if="nowVersion.releaseStatus!==1" @click.native="putOut(nowVersion)">发布</el-dropdown-item>
......@@ -27,9 +28,9 @@
</div>
<el-tab-pane label="数据详情" name="dataDetail" style="height: 100%;">
<particulars :versionItem='nowVersion' />
<particulars :versionItem='nowVersion' :releaseStatus="tableData.releaseStatus" />
</el-tab-pane>
<el-tab-pane label="版本信息" name="versionInformation" style="padding-left: 20px;">
<el-tab-pane label="版本信息" name="versionInformation" style="padding-left: 20px;overflow: scroll; height: calc(100vh - 200px);">
<div class="dataBox">
<div class="dataItem">
<div class="title">版本:</div>
......@@ -68,7 +69,12 @@
<div class="title">最后更新时间:</div>
<div class="content"> {{ nowVersion.updateTime }}</div>
</div>
<div class="dataItem" style="align-items: flex-start;">
<div class="title">导出日志:</div>
<div class="content">
<downList :outputList='outputList' />
</div>
</div>
</el-tab-pane>
</el-tabs>
......@@ -81,16 +87,19 @@ import dataImport from './dialog/dataImport.vue'
import particulars from './dialog/particulars.vue'
import { DatasetVersion } from '@/api/gptController.js'
import addVersions from './dialog/add.vue'
import downList from '@/components/DownList/index.vue'
export default {
data() {
return {
activeName: 'dataDetail',
versionList: [],
nowVersion: undefined
nowVersion: undefined,
outputList: []
}
},
props: ['tableData', 'refresh'],
components: { particulars },
components: { particulars, downList },
computed: {},
......@@ -200,6 +209,7 @@ export default {
)
.then((res) => {
this.refresh()
this.getOutputList()
})
.catch((e) => {})
},
......@@ -231,6 +241,19 @@ export default {
cutVersions(item) {
// 切换版本
this.nowVersion = item
},
getOutputList() {
let params = { datasetOutputDtoFilter: { versionId: this.nowVersion.versionId } }
DatasetVersion.outputList(this, params).then((res) => {
this.outputList = res.data.dataList
})
}
},
watch: {
nowVersion: {
handler() {
this.getOutputList()
}
}
}
}
......
......@@ -9,35 +9,7 @@
</el-select>
</el-form-item>
<el-form-item label="数据导出记录:">
<el-table :data="outputList" border style="width: 100%" height="600">
<el-table-column prop="markFormatType" label="标注格式类型">
</el-table-column>
<el-table-column prop="outputContent" label="导出内容">
</el-table-column>
<el-table-column prop="fileSize" label="文件大小">
</el-table-column>
<el-table-column prop="dataCount" label="数据量">
</el-table-column>
<el-table-column prop="createUserId" label="创建人">
</el-table-column>
<el-table-column prop="outputStartTime" label="导出开始时间" width="150">
</el-table-column>
<el-table-column prop="outputEndTime" label="导出完成时间" width="150">
</el-table-column>
<el-table-column prop="status" label="状态">
<template slot-scope="scope">
{{ OutputStatus.getValue(scope.row.status) }}
</template>
</el-table-column>
<el-table-column label="操作" fixed="right">
<template slot-scope="scope">
<el-button @click="down(scope.row.downloadUrl)" type="text" size="mini">
下载
</el-button>
</template>
</el-table-column>
</el-table>
<downList :outputList='outputList' />
</el-form-item>
<el-row type="flex" justify="end" class="dialog-btn-layer mt20">
......@@ -49,6 +21,7 @@
<script>
import { DatasetVersion } from '@/api/gptController.js'
import downList from '@/components/DownList/index.vue'
export default {
data() {
return {
......@@ -59,7 +32,7 @@ export default {
}
},
props: ['isEdit', 'row'],
components: {},
components: { downList },
computed: {},
......@@ -82,19 +55,6 @@ export default {
this.onCancel(true)
this.$message.success('下载成功')
})
// this.download('/admin/app/datasetVersion/export', params, '下载文件.' + this.form.format, 'get').then(res => {
// // resolve(res);
// console.log(res);
// this.$message.success('下载成功');
// this.onCancel(true);
// }).catch(e => {
// // reject(e);
// });
},
down(url) {
let downDom = document.createElement('a')
downDom.href = url
downDom.click()
},
getOutputList() {
let params = { datasetOutputDtoFilter: { versionId: this.row.versionId } }
......
......@@ -9,12 +9,13 @@
<el-tabs v-model="activeName" style="width:calc(100% - 200px)" v-if="nowVersion">
<div style="position: absolute; top: -55px; right: 0;">
<el-button type="text" :size="defaultFormItemSize" @click="dataImport(nowVersion)">导入</el-button>
<el-button type="text" :size="defaultFormItemSize" @click="del(nowVersion)">删除</el-button>
<el-button type="primary" plain :size="defaultFormItemSize" @click="dataImport(nowVersion)">导入</el-button>
<el-button type="danger" plain :size="defaultFormItemSize" @click="del(nowVersion)">删除</el-button>
<template v-if="nowVersion.inputStatus !== 0">
<el-dropdown style="margin-left:15px;font-size: 12px;color: #0092FF;" :size="defaultFormItemSize">
<el-dropdown split-button type="primary" plain style="margin-left:10px;font-size: 12px;color: #0092FF;" :size="defaultFormItemSize">
<span class="el-dropdown-link">
更多<i class="el-icon-arrow-down el-icon--right"></i>
更多
<!-- <i class="el-icon-arrow-down el-icon--right"></i> -->
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-if="nowVersion.releaseStatus!==1" @click.native="putOut(nowVersion)">发布</el-dropdown-item>
......@@ -27,9 +28,9 @@
</div>
<el-tab-pane label="数据详情" name="dataDetail" style="height: 100%;">
<particulars :versionItem='nowVersion' />
<particulars :versionItem='nowVersion' :releaseStatus="tableData.releaseStatus" />
</el-tab-pane>
<el-tab-pane label="版本信息" name="versionInformation" style="padding-left: 20px;">
<el-tab-pane label="版本信息" name="versionInformation" style="padding-left: 20px;overflow: scroll; height: calc(100vh - 200px);">
<div class="dataBox">
<div class="dataItem">
<div class="title">版本:</div>
......@@ -56,7 +57,6 @@
<div class="title">标注类型>模板:</div>
<div class="content">{{ LabelType.getValue(nowVersion.dimensionType ) }}</div>
</div>
<div class="dataItem">
<div class="title">数据量:</div>
<div class="content"> {{ nowVersion.dataVolume }}</div>
......@@ -69,7 +69,12 @@
<div class="title">最后更新时间:</div>
<div class="content"> {{ nowVersion.updateTime }}</div>
</div>
<div class="dataItem" style="align-items: flex-start;">
<div class="title">导出日志:</div>
<div class="content">
<downList :outputList='outputList' />
</div>
</div>
</el-tab-pane>
</el-tabs>
......@@ -82,16 +87,19 @@ import dataImport from './dialog/dataImport.vue'
import particulars from './dialog/particulars.vue'
import { DatasetVersion } from '@/api/gptController.js'
import addVersions from './dialog/add.vue'
import downList from '@/components/DownList/index.vue'
export default {
data() {
return {
activeName: 'dataDetail',
versionList: [],
nowVersion: undefined
nowVersion: undefined,
outputList: []
}
},
props: ['tableData', 'refresh'],
components: { particulars },
components: { particulars, downList },
computed: {},
......@@ -165,7 +173,7 @@ export default {
DatasetVersion.list(this, params)
.then((res) => {
this.versionList = res.data.dataList
this.nowVersion = this.versionList[0]
this.nowVersion = this.tableData
})
.catch((e) => {})
},
......@@ -201,6 +209,7 @@ export default {
)
.then((res) => {
this.refresh()
this.getOutputList()
})
.catch((e) => {})
},
......@@ -232,6 +241,19 @@ export default {
cutVersions(item) {
// 切换版本
this.nowVersion = item
},
getOutputList() {
let params = { datasetOutputDtoFilter: { versionId: this.nowVersion.versionId } }
DatasetVersion.outputList(this, params).then((res) => {
this.outputList = res.data.dataList
})
}
},
watch: {
nowVersion: {
handler() {
this.getOutputList()
}
}
}
}
......
......@@ -2,50 +2,21 @@
<template>
<div style="position: relative">
<div class="topBox">
<div class="title">在线服务</div>
<div class="title">在线服务</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
>
<el-form ref="myDataSetPage" :model="myDataSetPage" label-width="75px" :size="defaultFormItemSize" label-position="right" @submit.native.prevent>
<filter-box :item-width="350" @search="search()" @reset="onReset">
<el-form-item label-width="0px">
<el-button
class="add"
type="primary"
icon="el-icon-plus"
:size="defaultFormItemSize"
>创建服务</el-button
>
<el-button class="add" type="primary" icon="el-icon-plus" :size="defaultFormItemSize">创建服务</el-button>
</el-form-item>
<el-form-item
label="数据集名称或id"
prop="formFilter.dataName"
label-width="120px"
>
<el-input
class="filter-item"
v-model="myDataSetPage.formFilter.dataName"
:clearable="true"
placeholder="请输入服务名称"
/>
<el-form-item label="数据集名称" prop="formFilter.dataName" label-width="120px">
<el-input class="filter-item" v-model="myDataSetPage.formFilter.dataName" :clearable="true" placeholder="请输入服务名称" />
</el-form-item>
</filter-box>
</el-form>
<vxe-table
border
show-header-overflow
show-overflow
:row-config="{ isHover: true }"
:data="tableData"
min-height="96"
>
<vxe-table border show-header-overflow show-overflow :row-config="{ isHover: true }" :data="tableData" min-height="96">
<vxe-column field="serviceName" title="服务名称"></vxe-column>
<vxe-column field="serviceState" title="服务状态"></vxe-column>
<vxe-column field="modelNameAndVersion" title="模型名称及版本"></vxe-column>
......@@ -74,9 +45,9 @@
</template>
<script>
import { mapGetters } from 'vuex';
import { mapGetters } from 'vuex'
export default {
data () {
data() {
return {
myDataSetPage: {
formFilter: {
......@@ -93,44 +64,42 @@ export default {
address: 'test abc'
}
]
};
}
},
components: {},
computed: {
...mapGetters(['getMainContextHeight']),
tableHeight () {
return this.getMainContextHeight - 110 + 'px';
tableHeight() {
return this.getMainContextHeight - 110 + 'px'
}
},
mounted () {
},
mounted() {},
methods: {
resize (e) {
resize(e) {
setTimeout(() => {
this.collapseHeight = e.height
}, 300);
}, 300)
}
}
};
}
</script>
<style lang="scss" scoped>
@import "@/assets/style/element-variables.scss";
.topBox{
@import '@/assets/style/element-variables.scss';
.topBox {
background-color: white;
width: 100%;
margin-bottom: 16px;
.title {
.title {
color: $--color-text-primary;
font-size: 16px;
font-weight: 500;
padding: 20px 20px 20px 20px;
padding: 20px 20px 20px 20px;
}
}
......@@ -143,5 +112,4 @@ export default {
margin-bottom: 20px;
}
}
</style>
module.exports = {//
productionSourceMap: false,
publicPath:'/',
devServer: {
port: '8085',
/* 跨域代理 */
......
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