fix: 去除数据集标签管理页,将管理页面集成到标签选择器

去除数据集标签管理页,将管理页面集成到标签选择器
main
hong.yang 2 years ago
parent 2425f0cc08
commit 28c04093bb

@ -48,7 +48,6 @@
]
},
"dependencies": {
"@antv/g6": "4.3.6",
"@amap/amap-jsapi-loader": "^1.0.1",
"@antv/g2plot": "2.4.0",
"@jiaminghi/data-view": "2.10.0",

@ -1,7 +0,0 @@
import DataSetLabelManagement from './src/index.vue'
DataSetLabelManagement.install = function (Vue) {
Vue.component(DataSetLabelManagement.name, DataSetLabelManagement)
}
export default DataSetLabelManagement

@ -1,474 +0,0 @@
<template>
<el-dialog
class="bs-dialog-wrap bs-el-dialog"
:append-to-body="true"
:before-close="handleClose"
:title="dataForm.id!==''?'编辑标签':'新增标签'"
:visible.sync="dialogFormVisible"
:width="relVisible?'1100px':'450px'"
>
<el-row>
<el-col :span="relVisible ? 8 : 24">
<el-divider
class="bs-el-divider"
content-position="left"
>
属性信息
</el-divider>
<el-form
ref="ruleForm"
:model="dataForm"
:rules="rules"
label-position="right"
label-width="90px"
class="form-container"
>
<el-form-item
label="标签名称"
prop="labelName"
>
<el-input
v-model="dataForm.labelName"
class="bs-el-input"
clearable
placeholder="请输入标签名称"
maxlength="200"
/>
</el-form-item>
<el-form-item
label="标签类型"
prop="labelType"
>
<el-select
ref="searchSelect"
v-model="dataForm.labelType"
class="bs-el-select"
popper-class="bs-el-select"
allow-create
clearable
filterable
placeholder="请选择或输入标签类型"
@blur="selectBlur"
@input.native="filterData"
>
<el-option
v-for="(item,K) in labelTypeList"
:key="K"
:label="item"
:value="item"
/>
</el-select>
</el-form-item>
<el-form-item
label="标签说明"
prop="labelDesc"
>
<el-input
v-model="dataForm.labelDesc"
clearable
placeholder="请输入标签说明"
class="bs-el-input"
type="text"
/>
</el-form-item>
</el-form>
<el-divider
class="bs-el-divider"
content-position="left"
>
关联数据集信息
</el-divider>
<el-form class="form-container">
<el-form-item align="center">
<el-tag effect="plain">
标签
</el-tag>
<span></span>
<el-button
round
size="mini"
type="primary"
@click="buildRel"
>
添加关联
</el-button>
</el-form-item>
</el-form>
</el-col>
<el-col
v-if="relVisible"
:span="8"
>
<div>
<el-divider
class="bs-el-divider"
content-position="left"
>
添加关联
</el-divider>
<div
class="tree-box full-box--position"
style="padding: 0 8px 24px 0"
>
<Tree
ref="tree"
:tree-data="categoryData"
style="height: 300px;overflow: auto"
@handleNodeClick="handleNodeClick"
/>
</div>
</div>
</el-col>
<el-col
v-if="relVisible"
:span="8"
>
<el-divider
class="bs-el-divider"
content-position="left"
>
数据集列表
</el-divider>
<div class="bs-table-box">
<el-table
ref="mytable"
class="bs-el-table"
:data="datasetList"
height="300"
@select="handleSelect"
@select-all="handleSelectionAll"
>
<el-table-column
type="selection"
width="55"
/>
<el-table-column
label="数据集名称"
prop="name"
show-overflow-tooltip
/>
</el-table>
</div>
</el-col>
</el-row>
<span
slot="footer"
class="dialog-footer"
>
<el-button
class="bs-el-button-default"
@click="cancel"
>
取消
</el-button>
<el-button
type="primary"
@click="submitForm('ruleForm')"
>
确定
</el-button>
</span>
</el-dialog>
</template>
<script>
import { pageMixins } from 'packages/js/mixins/page'
import Tree from './Tree'
import { addOrUpdateLabel, checkRepeatLabel, getDataSetIdListByLabelId } from 'packages/js/utils/LabelConfigService'
import { datasetList, getCategoryTree } from 'packages/js/utils/datasetConfigService'
export default {
name: 'LabelConfigAddOrUpdate',
mixins: [pageMixins],
data () {
return {
loading: false,
datasetList: [],
typeId: '',
dataForm: {
id: '',
labelName: '',
labelType: '',
labelDesc: '',
relList: []
},
dialogFormVisible: true,
rules: {
labelName: [
{ required: true, message: '标签名称不能为空', trigger: 'blur' },
{ validator: this.validateLabelName, trigger: 'blur' }
],
labelType: [
{ required: true, message: '标签类型不能为空', trigger: 'change' }
]
},
//
categoryData: [],
relVisible: false,
//
labelTypeList: [],
// id
datasetIdList: []
}
},
components: {
Tree
},
watch: {
'dataForm.labelType': function (val) {
if (val.length > 20) {
this.dataForm.labelType = val.substring(0, 20)
}
},
// datasetListdatasetIdList
datasetList: {
handler: function (val) {
this.$nextTick(() => {
if (this.$refs.mytable) {
this.$refs.mytable.clearSelection()
}
this.datasetList.forEach((item) => {
if (this.datasetIdList.includes(item.id)) {
this.$refs.mytable.toggleRowSelection(item, true)
}
})
})
},
deep: true
}
},
methods: {
/**
* 初始化
* @param row 标签信息
*/
init (row) {
this.dataForm.id = row ? row.id : ''
this.dialogFormVisible = true
if (row) {
this.dataForm.id = row.id
this.dataForm.labelName = row.labelName
this.dataForm.labelType = row.labelType
this.dataForm.labelDesc = row.labelDesc
// id
getDataSetIdListByLabelId(row.id).then((list) => {
this.datasetIdList = list
this.buildRel()
})
}
this.$nextTick(() => {
this.getDataList()
})
},
/**
* 获取数据集列表
*/
getDataList () {
this.loading = true
const params = {
typeId: this.typeId
}
datasetList(params).then((list) => {
this.datasetList = list
if (!this.relVisible) {
this.loading = false
return
}
this.loading = false
}).catch(() => {
this.loading = false
})
},
/**
* 获取分类树
*/
getTreeList () {
getCategoryTree({ type: 'dataset' }).then((categoryTree) => {
this.categoryData = categoryTree
})
},
/**
* 标签名称校验
* @param rule
* @param value
* @param callback
*/
validateLabelName (rule, value, callback) {
checkRepeatLabel({ id: this.dataForm.id, labelName: this.dataForm.labelName }).then(repeat => {
if (repeat) {
callback(new Error('标签名称已存在'))
} else {
callback()
}
})
},
/**
* 树节点点击事件
* @param row
* @param value
*/
handleNodeClick (row, value) {
this.$nextTick(() => {
this.typeId = row.id
this.getDataList()
})
},
/**
* 选中数据集
* @param selection 选中的数据集列表
* @param row 操作行
*/
handleSelect (selection, row) {
// row.iddatasetIdListdatasetIdList
if (this.datasetIdList.includes(row.id)) {
const index = this.datasetIdList.indexOf(row.id)
if (index > -1) {
this.datasetIdList.splice(index, 1)
}
return
}
// row.iddatasetIdListdatasetIdList
if (!this.datasetIdList.includes(row.id)) {
this.datasetIdList.push(row.id)
}
},
/**
* 数据集全选
* @param selection
*/
handleSelectionAll (selection) {
// datasetListdatasetIdList
if (selection.length === 0) {
this.datasetList.forEach((dataset) => {
const index = this.datasetIdList.indexOf(dataset.id)
if (index > -1) {
this.datasetIdList.splice(index, 1)
}
})
return
}
// datasetListdatasetIdList
if (selection.length > 0) {
this.datasetList.forEach((dataset) => {
if (!this.datasetIdList.includes(dataset.id)) {
this.datasetIdList.push(dataset.id)
}
})
}
},
/**
* 表单关闭
*/
handleClose () {
this.$parent.addOrUpdateVisible = false
},
/**
* 取消按钮
*/
cancel () {
this.dialogFormVisible = false
this.$nextTick(() => {
this.handleClose()
})
},
/**
* 提交按钮
* @param formName
*/
submitForm (formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
this.saveForm(true)
} else {
return false
}
})
},
/**
* 保存标签信息
* @param flag
*/
saveForm (flag) {
this.dataForm.relList = []
this.datasetIdList.forEach(id => {
const param = {
datasetId: id,
labelId: this.dataForm.id
}
this.dataForm.relList.push(param)
})
addOrUpdateLabel(this.dataForm).then((r) => {
this.$message.success('保存成功')
this.cancel()
this.$parent.getDataList()
//
this.$parent.getLabelType()
})
},
/**
* 添加关联按钮
*/
buildRel () {
this.relVisible = !this.relVisible
if (this.relVisible) {
this.getTreeList()
this.$nextTick(() => {
this.getDataList()
})
}
},
filterNode (value, data) {
if (!value) return true
return data.name.indexOf(value) !== -1
},
ellipsis (value, len) {
if (!value) return ''
if (value.length > len) {
return value.slice(0, len) + '...'
}
return value
},
selectBlur (e) {
this.dataForm.labelType = e.target.value
},
//
filterData () {
//
const str = this.$refs.searchSelect.$data.selectedLabel
// js
if (str.length > 20) {
this.$refs.searchSelect.$data.selectedLabel = str.substr(0, 20)
}
}
}
}
</script>
<style scoped>
.el-col {
height: 358px;
}
.tree-box {
overflow-x: auto;
}
.form-container{
padding: 0 8px;
}
::v-deep .el-table{
border: 1px solid transparent !important;
}
::v-deep .el-table th.el-table__cell.is-leaf, .el-table td.el-table__cell{
border-bottom: 1px solid transparent !important;
}
</style>

@ -1,385 +0,0 @@
<template>
<div
v-if="dialogFormVisible"
class="inner-container"
>
<el-scrollbar class="data-set-scrollbar">
<!-- <el-page-header
class="bs-el-page-header"
@back="goBack"
/> -->
<el-page-header class="bs-el-page-header">
<template slot="content">
<div class="page-header">
<div class="page-header-left">
标签详情
</div>
<div class="page-header-right">
<el-button
class="back bs-el-button-default"
@click="goBack"
>
返回
</el-button>
</div>
</div>
</template>
</el-page-header>
<el-divider
class="bs-el-divider"
content-position="left"
>
属性信息
</el-divider>
<el-row
style="width: 100%;"
:gutter="5"
>
<el-col
:span="8"
class="attrInfo"
>
<el-tooltip
v-if="dataForm.labelName.length > 20"
:content="dataForm.labelName"
class="item"
effect="dark"
placement="bottom-start"
>
<span class="text-style">标签名称 {{ ellipsis(dataForm.labelName, 20) }}</span>
</el-tooltip>
<span
v-else
class="text-style"
>
标签名称 {{ ellipsis(dataForm.labelName, 20) }}
</span>
</el-col>
<el-col
:span="8"
class="attrInfo"
>
<el-tooltip
v-if="dataForm.labelType.length > 20"
:content="dataForm.labelType"
class="item"
effect="dark"
placement="bottom-start"
>
<span class="text-style">标签类型 {{ ellipsis(dataForm.labelType, 20) }}</span>
</el-tooltip>
<span
v-else
class="text-style"
>
标签类型 {{ ellipsis(dataForm.labelType, 20) }}
</span>
</el-col>
<el-col
:span="8"
class="attrInfo"
>
<el-tooltip
v-if="dataForm.labelDesc.length > 20"
:content="dataForm.labelDesc"
class="item"
effect="dark"
placement="bottom-start"
>
<span class="text-style">标签说明 {{ ellipsis(dataForm.labelDesc, 20) }}</span>
</el-tooltip>
<span
v-else
class="text-style"
>
标签说明 {{ ellipsis(dataForm.labelDesc, 20) }}
</span>
</el-col>
<el-col
:span="8"
class="attrInfo"
>
<el-tooltip
v-if="dataForm.createBy && dataForm.createBy.length > 20"
:content="dataForm.createBy"
class="item"
effect="dark"
placement="bottom-start"
>
<span class="text-style">创建人 {{ ellipsis(dataForm.createBy, 20) }}</span>
</el-tooltip>
<span
v-else
class="text-style"
>
创建人 {{ ellipsis(dataForm.createBy, 20) }}
</span>
</el-col>
<el-col
:span="16"
class="attrInfo"
>
<el-tooltip
v-if="dataForm.createDate.length > 20"
:content="dataForm.createDate"
class="item"
effect="dark"
placement="bottom-start"
>
<span class="text-style">创建时间 {{ ellipsis(dataForm.createDate, 20) }}</span>
</el-tooltip>
<span
v-else
class="text-style"
>
创建时间 {{ ellipsis(dataForm.createDate, 20) }}
</span>
</el-col>
<el-col
:span="8"
class="attrInfo"
>
<el-tooltip
v-if="dataForm.updateBy && dataForm.updateBy.length > 20"
:content="dataForm.updateBy"
class="item"
effect="dark"
placement="bottom-start"
>
<span class="text-style">
修改人 {{ ellipsis(dataForm.updateBy, 20) }}
</span>
</el-tooltip>
<span
v-else
class="text-style"
>
修改人 {{ ellipsis(dataForm.updateBy, 20) }}
</span>
</el-col>
<el-col
:span="8"
class="attrInfo"
>
<el-tooltip
v-if="dataForm.updateDate.length > 20"
:content="dataForm.updateDate"
class="item"
effect="dark"
placement="bottom-start"
>
<span class="text-style">修改时间 {{ ellipsis(dataForm.updateDate, 20) }}</span>
</el-tooltip>
<span
v-else
class="text-style"
>
修改时间 {{ ellipsis(dataForm.updateDate, 20) }}
</span>
</el-col>
</el-row>
<el-divider
class="bs-el-divider"
content-position="left"
>
关联数据集信息
</el-divider>
<div id="container" />
</el-scrollbar>
</div>
</template>
<script>
import G6 from '@antv/g6'
import { getLabelDetail } from 'packages/js/utils/LabelConfigService'
export default {
name: 'LabelConfigDetails',
data () {
return {
dialogFormVisible: false,
dataForm: {
createBy: '',
createDate: '',
updateBy: '',
updateDate: '',
labelDesc: '',
labelName: '',
labelType: ''
},
jsonData: {},
chartHeight: 0,
chartWidth: 0
}
},
methods: {
ellipsis (value, len) {
if (!value) return ''
if (value.length > len) {
return value.slice(0, len) + '...'
}
return value
},
init (row) {
this.dialogFormVisible = true
getLabelDetail(row.id).then((r) => {
this.jsonData = r.jsonData
if (r.jsonData.nodes.length > 1) {
this.chartHeight = r.jsonData.nodes.length * 100
} else {
this.chartHeight = 200
}
this.dataForm = r
this.chartWidth = r.labelName.length * 20
this.$nextTick(() => {
this.initG6(r.jsonData)
})
})
},
goBack () {
this.dialogFormVisible = false
this.$nextTick(() => {
this.$parent.labelVisible = true
this.$parent.getDataList()
})
},
nodeEach (nodes) {
nodes.forEach(node => {
if (!node.style) {
node.style = {}
}
switch (node.class) {
case 'c1': {
node.shape = 'circle'
node.size = 40
break
}
case 'c3': {
node.shape = 'rect'
// node.size = [80, 50];
node.style = {
stroke: '#FFFFFF',
fill: '#DFE1E3'
}
break
}
case 'c0': {
node.shape = 'ellipse'
node.size = [80, 40]
break
}
case 'c2': {
node.shape = 'diamond'
node.size = [60, 60]
break
}
}
})
},
// G6
initG6 (json) {
const data = json
const width = document.getElementById('container').scrollWidth
this.nodeEach(data.nodes)
const tooltip = new G6.Tooltip({
offsetX: 10,
offsetY: 0,
fixToNode: [1, 0],
itemTypes: ['node', 'edge'],
getContent: (e) => {
const outDiv = document.createElement('div')
outDiv.style.width = 'fit-content'
outDiv.innerHTML = `<div style='width: 200px;'>${e.item.getModel()._label}</div>`
return outDiv
},
shouldBegin: (e) => {
let res = true
if (e.item.getModel()._label && e.item.getModel()._label.length > 12) {
res = true
} else {
res = false
}
return res
}
})
const graph = new G6.Graph({
container: 'container',
// width: '800',
height: this.chartHeight,
plugins: [tooltip],
// modes: {
// default: ['drag-canvas', 'zoom-canvas', 'click-select']
// },
defaultNode: {
type: 'rect',
size: [150, 50],
style: {
fill: '#9ACAFF',
stroke: '#FFFFFF'
}
},
// 线
defaultEdge: {
type: 'line',
style: {
offset: 25,
endArrow: true,
lineWidth: 2,
stroke: '#333'
}
}
})
data.nodes.forEach(node => {
node._label = node.label
if (node.label.length > 12) {
node.label = node.label.substr(0, 9) + '...'
}
})
graph.data(data)
graph.render()
}
}
}
</script>
<style scoped>
@import '../../assets/style/bsTheme.scss';
.data-set-scrollbar {
height: 100%;
width: 100%;
overflow-y: auto;
overflow-x: none;
}
.inner-container{
overflow-x: hidden;
}
.el-col {
height: 35px;
}
.attrInfo {
padding-left: 20px !important;
}
.text-style{
color: var(--bs-el-title);
}
.page-header {
display: flex;
position: relative;
.page-header-right {
position: absolute;
right: 16px;
}
}
</style>

@ -0,0 +1,223 @@
<template>
<el-dialog
class="bs-dialog-wrap bs-el-dialog"
:append-to-body="true"
:before-close="cancel"
:title="dataForm.id!==''?'编辑标签':'新增标签'"
:visible.sync="formVisible"
>
<el-form
ref="ruleForm"
:model="dataForm"
:rules="rules"
label-position="right"
label-width="90px"
class="form-container"
>
<el-form-item
label="标签名称"
prop="labelName"
>
<el-input
v-model="dataForm.labelName"
class="bs-el-input"
clearable
placeholder="请输入标签名称"
maxlength="200"
/>
</el-form-item>
<el-form-item
label="标签类型"
prop="labelType"
>
<el-select
ref="searchSelect"
v-model="dataForm.labelType"
class="bs-el-select"
popper-class="bs-el-select"
allow-create
clearable
filterable
placeholder="请选择或输入标签类型"
@blur="selectBlur"
@input.native="filterData"
>
<el-option
v-for="(item,K) in labelTypeList"
:key="K"
:label="item"
:value="item"
/>
</el-select>
</el-form-item>
<el-form-item
label="标签说明"
prop="labelDesc"
>
<el-input
v-model="dataForm.labelDesc"
clearable
placeholder="请输入标签说明"
class="bs-el-input"
type="text"
/>
</el-form-item>
</el-form>
<span
slot="footer"
class="dialog-footer"
>
<el-button
class="bs-el-button-default"
@click="cancel"
>
取消
</el-button>
<el-button
type="primary"
@click="submitForm('ruleForm')"
>
确定
</el-button>
</span>
</el-dialog>
</template>
<script>
import { addOrUpdateLabel, checkRepeatLabel } from 'packages/js/utils/LabelConfigService'
export default {
name: 'LabelEdit',
data () {
return {
loading: false,
datasetList: [],
typeId: '',
dataForm: {
id: '',
labelName: '',
labelType: '',
labelDesc: '',
relList: []
},
formVisible: true,
rules: {
labelName: [
{ required: true, message: '标签名称不能为空', trigger: 'blur' },
{ validator: this.validateLabelName, trigger: 'blur' }
],
labelType: [
{ required: true, message: '标签类型不能为空', trigger: 'change' }
]
},
//
categoryData: [],
relVisible: false,
//
labelTypeList: [],
// id
datasetIdList: []
}
},
watch: {
'dataForm.labelType': function (val) {
if (val.length > 20) {
this.dataForm.labelType = val.substring(0, 20)
}
}
},
methods: {
/**
* 初始化
* @param row 标签信息
*/
init (row) {
this.$nextTick(() => {
this.$refs.ruleForm.clearValidate()
})
this.dataForm.id = row ? row.id : ''
this.formVisible = true
if (row) {
this.dataForm.id = row.id
this.dataForm.labelName = row.labelName
this.dataForm.labelType = row.labelType
this.dataForm.labelDesc = row.labelDesc
}
},
/**
* 标签名称校验
* @param rule
* @param value
* @param callback
*/
validateLabelName (rule, value, callback) {
checkRepeatLabel({ id: this.dataForm.id, labelName: this.dataForm.labelName }).then(repeat => {
if (repeat) {
callback(new Error('标签名称已存在'))
} else {
callback()
}
})
},
/**
* 表单关闭
*/
handleClose () {
this.$parent.editFormVisible = false
},
/**
* 取消按钮
*/
cancel () {
this.formVisible = false
this.$nextTick(() => {
this.handleClose()
})
},
/**
* 提交按钮
* @param formName
*/
submitForm (formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
this.saveForm(true)
} else {
return false
}
})
},
/**
* 保存标签信息
* @param flag
*/
saveForm (flag) {
addOrUpdateLabel(this.dataForm).then((r) => {
this.$message.success('保存成功')
this.cancel()
this.$emit('afterEdit')
})
},
selectBlur (e) {
this.dataForm.labelType = e.target.value
},
//
filterData () {
//
const str = this.$refs.searchSelect.$data.selectedLabel
// js
if (str.length > 20) {
this.$refs.searchSelect.$data.selectedLabel = str.substr(0, 20)
}
}
}
}
</script>
<style scoped>
.form-container{
padding: 0 8px;
}
</style>

@ -20,19 +20,21 @@
class="bs-el-button-default"
icon="el-icon-plus"
style="margin-left: 10px"
@click="addLabel"
@click="addLabelRelation"
/>
</el-tooltip>
<!-- 配置按钮 -->
<el-button type="text" @click="manageLabel"></el-button>
<!-- 标签列表弹窗 -->
<el-dialog
class="bs-dialog-wrap bs-el-dialog"
:append-to-body="true"
:before-close="handleClose"
:visible.sync="dialogFormVisible"
title="选择标签"
:title="isManage ? '标签管理' : '选择标签'"
width="1000px"
>
<div v-loading="labelCheckLoading">
<div>
<el-form
:inline="true"
class="bs-el-form filter-container"
@ -68,7 +70,6 @@
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button
type="primary"
@ -77,57 +78,82 @@
查询
</el-button>
</el-form-item>
<el-form-item>
<el-button
v-show="isManage"
type="primary"
class="bs-el-button-default"
@click="insertLabel"
>
新增
</el-button>
</el-form-item>
</el-form>
<!-- 标签选项组 -->
<el-checkbox-group
v-model="checkLabelList"
style="padding-bottom: 10px"
<el-table
ref="labelTable"
v-loading="labelCheckLoading"
class="bs-el-table bs-scrollbar"
element-loading-text="正在加载中..."
:data="labelList"
row-key="id"
@select="labelCheckChange"
@select-all="selectAll"
>
<el-row :gutter="2">
<el-col
v-for="label in labelList"
:key="label.id"
:span="4"
style="padding-top: 10px"
>
<el-tooltip
v-if="label.labelDesc || getByteLength(label.labelName) > 18"
effect="light"
placement="top-start"
<el-empty slot="empty" />
<el-table-column
key="selection"
v-if="!isManage"
type="selection"
width="55"
/>
<el-table-column
key="labelName"
label="标签名称"
prop="labelName"
show-overflow-tooltip
/>
<el-table-column
key="labelType"
label="标签类型"
prop="labelType"
show-overflow-tooltip
/>
<el-table-column
key="labelDesc"
label="标签说明"
prop="labelDesc"
show-overflow-tooltip
/>
<el-table-column
key="opt"
align="center"
label="操作"
width="200"
v-if="isManage"
>
<template slot-scope="scope">
<el-button
class="bs-el-button-default"
@click="editLabel(scope.row)"
>
<div slot="content">
<div v-if="getByteLength(label.labelName) > 18">
名称: {{ label.labelName }}
</div>
<div v-if="label.labelDesc">
描述: {{ label.labelDesc }}
</div>
</div>
<el-checkbox
:label="label.id"
@change="labelCheckChange(label)"
>
{{ getByteLength(label.labelName) > 18 ? ellipsis(label.labelName, 18) : label.labelName }}
</el-checkbox>
</el-tooltip>
<el-checkbox
v-else
:label="label.id"
@change="labelCheckChange(label)"
编辑
</el-button>
<el-button
class="bs-el-button-default"
@click="deleteLabel(scope.row.id)"
>
{{ label.labelName }}
</el-checkbox>
</el-col>
</el-row>
</el-checkbox-group>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<div class="bs-pagination">
<el-pagination
class="bs-el-pagination"
popper-class="bs-el-pagination"
:current-page="current"
:page-size="sizeLabel"
:page-sizes="[20, 40, 60, 80]"
:page-sizes="[10, 20, 50, 100]"
:total="totalCount"
background
layout="total, prev, pager, next,sizes,jumper"
@ -137,28 +163,48 @@
</div>
<div class="el-dialog__footer">
<el-button @click="handleClose">
<el-button
v-show="!isManage"
class="bs-el-button-default"
@click="handleClose"
>
取消
</el-button>
<el-button
v-show="!isManage"
type="primary"
@click="commitLabel"
>
确定
</el-button>
<el-button
v-show="isManage"
class="bs-el-button-default"
@click="handleClose"
>
返回
</el-button>
</div>
<label-edit
v-if="editFormVisible"
@afterEdit="afterEdit"
ref="labelEdit"
/>
</div>
</el-dialog>
</div>
</template>
<script>
import LabelEdit from './LabelConfigEdit'
import { pageMixins } from 'packages/js/mixins/page'
import { getLabelType, labelList, getLabelListByDatasetId } from 'packages/js/utils/LabelConfigService'
import {getLabelType, labelList, getLabelListByDatasetId, removeLabel} from 'packages/js/utils/LabelConfigService'
export default {
name: 'LabelSelect',
components: {},
components: {
LabelEdit
},
mixins: [pageMixins],
props: {
// id
@ -177,17 +223,20 @@ export default {
},
data () {
return {
isManage: false,
idListCopy: this.idList,
//
selectLabelList: [],
//
selectLabelListInitial: [],
labelList: [],
dialogFormVisible: false,
//
editFormVisible: false,
searchForm: {
labelName: '',
labelType: ''
},
checkLabelList: [],
sizeLabel: 20,
labelTypeList: [],
labelCheckLoading: false
@ -206,11 +255,13 @@ export default {
// labelListselectLabelListid
labelList: {
handler (val) {
this.checkLabelList = []
val.forEach((label) => {
this.selectLabelList.forEach((selected) => {
if (label.id === selected.id) {
this.checkLabelList.push(label.id)
//
this.$nextTick(() => {
this.$refs.labelTable.toggleRowSelection(label)
})
}
})
})
@ -220,25 +271,25 @@ export default {
// selectLabelListididList
selectLabelList: {
handler (val) {
this.checkLabelList = []
this.idListCopy = []
val.forEach((item) => {
this.idListCopy.push(item.id)
this.checkLabelList.push(item.id)
})
},
deep: true
}
},
methods: {
/**
* 初始化方法
*/
init () {
this.dialogFormVisible = true
this.getDataList()
this.getLabelType()
init (manage) {
this.isManage = manage
this.$nextTick(() => {
this.dialogFormVisible = true
this.getDataList()
this.getLabelType()
})
},
/**
* 获取标签类型列表
@ -267,10 +318,57 @@ export default {
this.labelCheckLoading = false
})
},
/**
* 当前页全选
* @param {*} labelList
*/
selectAll (labelList) {
// selectLabelListidselectLabelList
labelList.forEach((label) => {
if (!this.selectLabelList.some(selected => selected.id === label.id)) {
this.selectLabelList.push(label)
}
})
},
/**
* 新增标签
*/
insertLabel () {
this.editFormVisible = true
this.$nextTick(() => {
this.$refs.labelEdit.labelTypeList = this.labelTypeList
this.$refs.labelEdit.init()
})
},
editLabel (row) {
this.editFormVisible = true
this.$nextTick(() => {
this.$refs.labelEdit.labelTypeList = this.labelTypeList
this.$refs.labelEdit.init(row)
})
},
deleteLabel (id) {
this.$confirm('确定删除当前标签吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
removeLabel(id).then(() => {
this.getDataList()
this.$message.success('删除成功')
// selectLabelListidselectLabelList
if (this.selectLabelList.some(item => item.id === id)) {
this.selectLabelList = this.selectLabelList.filter(item => item.id !== id)
}
this.selectLabelListInitial = _.cloneDeep(this.selectLabelList)
})
}).catch(() => {
})
},
/**
* 标签选项组选中事件
*/
labelCheckChange (label) {
labelCheckChange (selection, label) {
// selectLabelListidselectLabelList
if (this.selectLabelList.some(item => item.id === label.id)) {
this.selectLabelList = this.selectLabelList.filter(item => item.id !== label.id)
@ -295,11 +393,17 @@ export default {
})
},
/**
* 点击添加标签按钮
* 点击添加标签关联按钮
*/
addLabel () {
addLabelRelation () {
//
this.init()
this.init(false)
},
/**
* 标签管理按钮
*/
manageLabel() {
this.init(true)
},
/**
* 选中标签类型
@ -323,25 +427,12 @@ export default {
this.selectLabelListInitial = _.cloneDeep(this.selectLabelList)
this.$emit('commit', this.idListCopy)
},
getByteLength (str) {
return unescape(encodeURIComponent(str)).length
},
ellipsis (str, len) {
if ((!str && typeof (str) !== 'undefined')) {
return ''
}
let num = 0
const str1 = str
var str = ''
for (let i = 0, lens = str1.length; i < lens; i++) {
num += ((str1.charCodeAt(i) > 255) ? 2 : 1)
if (num > len - 3) {
break
} else {
str = str1.substring(0, i + 1)
}
}
return str + '...'
/**
* 标签编辑/新增后回调
*/
afterEdit () {
this.getDataList()
this.getLabelType()
}
}
}

@ -1,167 +0,0 @@
<template>
<el-tree
:ref="treeRef"
class="bs-el-tree"
:data="treeData"
:default-expand-all="expandAll"
:expand-on-click-node="false"
:filter-node-method="filterNode"
:highlight-current="true"
:indent="0"
:props="defaultProps"
node-key="id"
style="width: fit-content;min-width: 100%;"
@node-click="handleNodeClick"
@node-contextmenu="rihgtClick"
>
<span
slot-scope="{ node,data }"
class="custom-tree-node"
style="width: 100%;position: relative;"
@mouseenter="mouseEnter(data)"
@mouseleave="mouseLeave(data)"
>
<span :style="data.children && data.children.length ? {} : {'padding-left': '12px'}">
<i
:class="data.children && data.children.length ? 'el-icon el-icon-folder': 'el-icon el-icon-document'"
style="margin-right: 8px;"
/>
<span class="nodeText">{{ data.name }}</span>
</span>
<span
v-if="optionShow"
class="options"
>
<el-dropdown @command="(command) => { treeCommand(command, data) }">
<i class="el-icon-more" />
<el-dropdown-menu slot="dropdown">
<slot name="options" />
</el-dropdown-menu>
</el-dropdown>
</span>
</span>
</el-tree>
</template>
<script>
export default {
name: 'Tree',
props: {
treeData: {
type: Array,
default: () => ([])
},
treeRef: {
type: String,
default: 'tree'
},
nodeWidth: {
type: String,
default: '280px'
},
expandAll: {
type: Boolean,
default: true
},
filterText: {
type: String,
default: ''
},
optionShow: {
type: Boolean,
default: false
}
},
data () {
return {
defaultProps: {
children: 'children',
label: 'name'
}
}
},
watch: {
treeData: function (val) {
// console.log('valx', val)
},
filterText (val) {
this.$refs[this.treeRef].filter(val)
}
},
methods: {
treeCommand (command, nodeData) {
this.$emit('treeCommand', command, nodeData)
},
filterNode (value, data) {
if (!value) return true
return data.name.indexOf(value) !== -1
},
//
handleNodeClick (row, value) {
this.$emit('handleNodeClick', row, value)
},
//
rihgtClick (event, object, value, element) {
this.$emit('rihgtClick', event, object, value, element)
},
mouseEnter (data) {
// this.$set(data, 'show', true)
//
this.$emit('mouseEnter', data)
},
mouseLeave (data) {
// this.$set(data, 'show', false)
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-tree-node {
display: block;
min-width: 270px;
.el-tree-node__content {
width: 270px;
overflow: hidden;
}
.el-tree-node__children {
.el-tree-node {
display: block;
min-width: 270px;
.el-tree-node__content {
width: 270px;
overflow: hidden;
}
}
}
}
.custom-tree-node {
position: relative;
.nodeText {
display: inline-block;
width: 225px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
line-height: 14px;
}
.options {
position: absolute;
right: 30px;
height: 16px;
top: 2px;
line-height: 16px;
transform: rotate(90deg);
}
}
// ::v-deep .is-current .options{
// background: #fff;
// }
</style>

@ -1,311 +0,0 @@
<template>
<div class="bs-container">
<div
v-if="labelVisible"
class="inner-container"
>
<el-form
ref="queryForm"
:model="queryForm"
class="filter-container"
>
<el-form-item
class="filter-item"
prop="labelName"
>
<el-input
v-model="queryForm.labelName"
class="bs-el-input"
clearable
placeholder="请输入标签名称"
@clear="reSearch()"
@keyup.enter.native="reSearch()"
/>
</el-form-item>
<el-form-item
class="filter-item"
prop="labelType"
>
<el-select
v-model="queryForm.labelType"
clearable
filterable
class="bs-el-select"
popper-class="bs-el-select"
placeholder="请选择标签类型"
@change="reSearch()"
>
<el-option
key="all"
label="全部"
value=""
/>
<el-option
v-for="labelType in labelTypeList"
:key="labelType"
:label="labelType"
:value="labelType"
>
<span>
{{ labelType }}
</span>
<span style="float: right;padding-right: 20px">
<el-button
class="bs-el-button-default"
icon="el-icon-edit"
type="text"
@click.stop="editLabelType(labelType)"
/>
<el-button
class="bs-el-button-default"
icon="el-icon-delete"
type="text"
@click.stop="deleteLabelType(labelType)"
/>
</span>
</el-option>
</el-select>
</el-form-item>
<el-form-item class="filter-item">
<el-button
:loading="dataListLoading"
icon="el-icon-search"
type="primary"
@click="reSearch"
>
查询
</el-button>
</el-form-item>
<el-form-item
class="filter-item"
>
<el-button
type="primary"
class="bs-el-button-default"
@click="addOrUpdateLabel(undefined)"
>
新增
</el-button>
</el-form-item>
</el-form>
<div class="bs-table-box">
<el-table
v-table
v-loading="dataListLoading"
height="0"
:data="tableData"
class="bs-el-table bs-scrollbar"
:element-loading-text="loadingText"
:header-cell-style="sortStyle"
@sort-change="reSort"
>
<el-empty slot="empty" />
<el-table-column
label="标签名称"
prop="labelName"
show-overflow-tooltip
/>
<el-table-column
label="标签类型"
prop="labelType"
show-overflow-tooltip
/>
<el-table-column
label="标签说明"
prop="labelDesc"
show-overflow-tooltip
/>
<el-table-column
align="center"
label="操作"
width="200"
>
<template slot-scope="scope">
<el-button
class="bs-el-button-default"
@click="getDetail(scope.row)"
>
详情
</el-button>
<el-button
class="bs-el-button-default"
@click="addOrUpdateLabel(scope.row)"
>
编辑
</el-button>
<el-button
class="bs-el-button-default"
@click="handleDelete(scope.row.id)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="bs-pagination">
<el-pagination
class="bs-el-pagination"
popper-class="bs-el-pagination"
:current-page="current"
:next-text="nextText"
:page-size="size"
:page-sizes="[10, 20, 50, 100]"
:prev-text="prevText"
:total="totalCount"
background
layout="total, prev, pager, next, sizes"
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
/>
</div>
</div>
<label-config-add-or-update
v-if="addOrUpdateVisible"
ref="LabelConfigAddOrUpdate"
/>
<label-type-edit
v-if="labelTypeEditVisible"
ref="LabelTypeEdit"
/>
<label-config-details
ref="LabelConfigDetails"
/>
</div>
</template>
<script>
import table from 'packages/js/utils/table.js'
import { pageMixins } from 'packages/js/mixins/page'
import LabelConfigAddOrUpdate from './LabelConfigAddOrUpdate.vue'
import LabelConfigDetails from './LabelConfigDetails.vue'
import LabelTypeEdit from './LabelTypeEdit.vue'
import { getLabelType, labelList, removeLabel, removeLabelByType } from 'packages/js/utils/LabelConfigService'
export default {
name: 'LabelConfig',
directives: {
table //
},
mixins: [pageMixins],
components: {
LabelConfigDetails,
LabelConfigAddOrUpdate,
LabelTypeEdit
},
data () {
return {
tableData: [],
addOrUpdateVisible: false,
addOrUpdateDetailVisible: false,
labelTypeEditVisible: false,
labelVisible: true,
labelTypeList: [],
dataListLoading: false,
loadingText: '',
queryForm: {
labelName: '',
labelType: ''
}
}
},
watch: {},
mounted () {
this.getDataList()
this.getLabelType()
},
methods: {
deleteLabelType (labelType) {
this.$confirm('是否删除当前标签类型? ', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
removeLabelByType({ labelType: labelType }).then(() => {
this.$nextTick(() => {
this.reSearch()
this.getLabelType()
this.$message.success('删除成功')
})
})
})
},
editLabelType (labelType) {
this.labelTypeEditVisible = true
this.$nextTick(() => {
this.$refs.LabelTypeEdit.dialogFormVisible = true
this.$refs.LabelTypeEdit.init(labelType)
})
},
handleDelete (id) {
this.$confirm('确定删除当前标签吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
removeLabel(id).then(() => {
this.getDataList()
this.$message.success('删除成功')
})
}).catch(() => {
})
},
// /
addOrUpdateLabel (row) {
this.addOrUpdateVisible = true
this.$nextTick(() => {
this.$refs.LabelConfigAddOrUpdate.labelTypeList = this.labelTypeList
this.$refs.LabelConfigAddOrUpdate.init(row)
})
},
//
getDetail (row) {
this.addOrUpdateDetailVisible = true
this.labelVisible = false
this.$nextTick(() => {
this.$refs.LabelConfigDetails.init(row)
})
},
//
getLabelType () {
getLabelType().then((data) => {
this.labelTypeList = data
})
},
//
getDataList () {
this.dataListLoading = true
this.loadingText = '正在查询数据...'
const params = {
current: this.current,
size: this.size,
...this.queryForm
}
labelList(params).then((data) => {
this.totalCount = data.totalCount
this.tableData = data.list
this.dataListLoading = false
}).catch(() => {
this.dataListLoading = false
})
},
//
reSearch () {
//
this.current = 1
this.getDataList()
}
}
}
</script>
<style lang="scss" scoped>
@import '../../assets/style/bsTheme.scss';
.bs-pagination {
::v-deep .el-input__inner {
width: 110px !important;
border: none;
background: var(--bs-el-background-1);
}
}
</style>

@ -26,8 +26,7 @@ const BigScreenDesign = () => import('./BigScreenDesign')
const DataSetManagement = () => import('./DataSetManagement')
// 数据源管理页面
const DataSourceManagement = () => import('./DataSourceManagement')
// 数据集标签管理页面
import DataSetLabelManagement from 'packages/DataSetLabelManagement'
// 存储组件列表
const components = [
@ -38,8 +37,7 @@ const components = [
BigScreenRun,
BigScreenDesign,
DataSetManagement,
DataSourceManagement,
DataSetLabelManagement
DataSourceManagement
]
const $bigScreen = {
@ -62,7 +60,6 @@ export {
BigScreenDesign,
DataSetManagement,
DataSourceManagement,
DataSetLabelManagement,
$bigScreen,
registerConfig,
updateTheme
@ -78,7 +75,6 @@ export default {
BigScreenDesign,
DataSetManagement,
DataSourceManagement,
DataSetLabelManagement,
$bigScreen,
registerConfig,
updateTheme

@ -72,13 +72,6 @@ function registerRouters (config, router) {
title: '数据集管理'
}
},
{
path: config?.routers?.labelUrl || '/big-screen-label',
component: () => import('packages/DataSetLabelManagement'),
meta: {
title: '标签管理'
}
},
{
path: config?.routers?.SourceUrl || '/big-screen-source',
component: () => import('packages/SourceManagement'),

Loading…
Cancel
Save