初始化

This commit is contained in:
砂糖
2025-11-08 10:38:36 +08:00
commit 3beeec7296
1626 changed files with 198488 additions and 0 deletions

View File

@@ -0,0 +1,228 @@
<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 bs-el-form"
>
<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 'data-room-ui/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
} else {
this.dataForm.id = ''
this.dataForm.labelName = ''
this.dataForm.labelType = ''
this.dataForm.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>

View File

@@ -0,0 +1,535 @@
<template>
<div>
<el-tag
v-for="label in selectLabelListInitial"
:key="label.id"
:closable="isEdit"
:disable-transitions="false"
style="margin-right: 2px;margin-left: 2px;background-color: #2f3440;border-color: #313640;"
@close="handleCloseTag(label)"
>
{{ label.labelName }}
</el-tag>
<el-tooltip
class="item"
content="添加关联标签"
effect="dark"
placement="bottom"
>
<el-button
circle
class="bs-el-button-default"
icon="el-icon-plus"
style="margin-left: 10px"
@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="isManage ? '标签管理' : '选择标签'"
width="1000px"
>
<div>
<el-form
:inline="true"
class="bs-el-form filter-container"
>
<el-form-item label="">
<el-input
v-model="searchForm.labelName"
clearable
class="bs-el-input"
placeholder="请输入标签名称"
@clear="getDataList"
/>
</el-form-item>
<el-form-item
class="filter-item"
prop="labelType"
>
<el-select
v-model="searchForm.labelType"
class="bs-el-select"
popper-class="bs-el-select"
clearable
filterable
placeholder="请选择标签类型"
@change="selectLabelType"
>
<el-option
key="all"
label="全部"
value=""
/>
<el-option
v-for="(type, index) in labelTypeList"
:key="index"
:label="type"
:value="type"
>
<span>
{{ type }}
</span>
<span style="float: right;padding-right: 20px">
<el-button
v-show="isManage"
icon="el-icon-edit"
type="text"
@click.stop="editLabelType(type)"
/>
<el-button
v-if="isManage"
icon="el-icon-delete"
type="text"
@click.stop="deleteLabelType(type)"
/>
</span>
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button
type="primary"
@click="current=1;getDataList()"
>
查询
</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-table
ref="labelTable"
v-loading="labelCheckLoading"
class="bs-el-table bs-scrollbar"
element-loading-text="正在加载中..."
:data="labelList"
row-key="id"
height="calc(100vh - 450px)"
@select="labelCheckChange"
@select-all="selectAll"
>
<el-empty slot="empty" />
<el-table-column
v-if="!isManage"
key="selection"
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
v-if="isManage"
key="opt"
align="center"
label="操作"
width="200"
>
<template slot-scope="scope">
<el-button
class="bs-el-button-default"
@click="editLabel(scope.row)"
>
编辑
</el-button>
<el-button
class="bs-el-button-default"
@click="deleteLabel(scope.row.id)"
>
删除
</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="[10, 20, 50, 100]"
:total="totalCount"
background
layout="total, prev, pager, next,sizes,jumper"
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
/>
</div>
</div>
<span
slot="footer"
class="dialog-footer"
>
<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>
</span>
</el-dialog>
<label-edit
v-if="editFormVisible"
ref="labelEdit"
@afterEdit="afterEdit"
/>
<label-type-edit
v-if="labelTypeEditVisible"
ref="labelTypeEdit"
@afterEdit="afterEdit(true)"
/>
</div>
</template>
<script>
import cloneDeep from 'lodash/cloneDeep'
import LabelEdit from './LabelConfigEdit'
import LabelTypeEdit from './LabelTypeEdit.vue'
import { pageMixins } from 'data-room-ui/js/mixins/page'
import { getLabelType, labelList, getLabelListByDatasetId, removeLabel, removeLabelByType } from 'data-room-ui/js/utils/LabelConfigService'
export default {
name: 'LabelSelect',
components: {
LabelEdit,
LabelTypeEdit
},
mixins: [pageMixins],
props: {
// 选中的标签id列表
idList: {
type: Array,
default: () => []
},
isEdit: {
type: Boolean,
default: true
},
datasetId: {
type: String,
default: ''
}
},
data () {
return {
isManage: false,
idListCopy: this.idList,
// 选中的标签列表
selectLabelList: [],
// 初始选中的标签列表
selectLabelListInitial: [],
labelList: [],
dialogFormVisible: false,
// 编辑弹窗可见性
editFormVisible: false,
// 标签类型编辑弹窗可见性
labelTypeEditVisible: false,
searchForm: {
labelName: '',
labelType: ''
},
sizeLabel: 10,
labelTypeList: [],
labelCheckLoading: false
}
},
mounted () {
// 根据数据集id获取关联的标签列表
if (this.datasetId) {
getLabelListByDatasetId(this.datasetId).then((data) => {
this.selectLabelListInitial = cloneDeep(data)
this.selectLabelList = cloneDeep(data)
const idList = []
data.forEach((item) => {
idList.push(item.id)
})
this.$emit('commit', idList)
})
}
},
watch: {
// labelList变化时根据selectLabelList中项的id设置选中状态
labelList: {
handler (val) {
val.forEach((label) => {
this.selectLabelList.forEach((selected) => {
if (label.id === selected.id) {
// 设置选中状态
this.$nextTick(() => {
this.$refs.labelTable.toggleRowSelection(label)
})
}
})
})
},
deep: true
},
// 根据selectLabelList的变化将id赋值给idList
selectLabelList: {
handler (val) {
this.idListCopy = []
val.forEach((item) => {
this.idListCopy.push(item.id)
})
},
deep: true
}
},
methods: {
/**
* 初始化方法
*/
init (manage) {
this.isManage = manage
this.$nextTick(() => {
this.dialogFormVisible = true
this.getDataList()
this.getLabelType()
})
},
/**
* 获取标签类型列表
*/
getLabelType () {
getLabelType().then((data) => {
this.labelTypeList = data
})
},
/**
* 获取标签列表
*/
getDataList () {
this.labelCheckLoading = true
const params = {
current: this.current,
size: this.sizeLabel,
labelName: this.searchForm.labelName,
labelType: this.searchForm.labelType
}
labelList(params).then((data) => {
this.totalCount = data.totalCount
this.labelList = data.list
this.labelCheckLoading = false
}).catch(() => {
this.labelCheckLoading = false
})
},
/**
* 当前页全选
* @param {*} labelList
*/
selectAll (labelList) {
// 如果selectLabelList中包含id相同的项则忽略否则将该项添加到selectLabelList中
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',
customClass: 'bs-el-message-box'
}).then(() => {
removeLabel(id).then(() => {
this.getDataList()
this.$message.success('删除成功')
// 如果selectLabelList中包含id相同的项则从selectLabelList中移除
if (this.selectLabelList.some(item => item.id === id)) {
this.selectLabelList = this.selectLabelList.filter(item => item.id !== id)
}
this.selectLabelListInitial = cloneDeep(this.selectLabelList)
})
}).catch(() => {
})
},
/**
* 标签选项组选中事件
*/
labelCheckChange (selection, label) {
// 如果selectLabelList中包含id相同的项则从selectLabelList中移除
if (this.selectLabelList.some(item => item.id === label.id)) {
this.selectLabelList = this.selectLabelList.filter(item => item.id !== label.id)
} else {
// 否则将该项添加到selectLabelList中
this.selectLabelList.push(label)
}
},
/**
* 移除选中的标签
*/
handleCloseTag (label) {
this.idListCopy = []
this.selectLabelListInitial.forEach((item, index) => {
if (item.id === label.id) {
this.selectLabelListInitial.splice(index, 1)
}
})
this.selectLabelList.forEach((item, index) => {
if (item.id === label.id) {
this.selectLabelList.splice(index, 1)
}
})
this.selectLabelList.forEach(item => {
this.idListCopy.push(item.id)
})
this.$emit('commit', this.idListCopy)
},
/**
* 点击添加标签关联按钮
*/
addLabelRelation () {
// 初始化
this.init(false)
},
/**
* 标签管理按钮
*/
manageLabel () {
this.init(true)
},
/**
* 选中标签类型
*/
selectLabelType () {
this.getDataList()
},
/**
* 标签类型编辑
*/
editLabelType (type) {
this.labelTypeEditVisible = true
this.$nextTick(() => {
this.$refs.labelTypeEdit.dialogFormVisible = true
this.$refs.labelTypeEdit.init(type)
})
},
/**
* 标签类型删除
*/
deleteLabelType (type) {
this.$confirm('是否删除当前标签类型? ', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
customClass: 'bs-el-message-box'
}).then(() => {
removeLabelByType({ labelType: type }).then(() => {
this.$nextTick(() => {
this.getDataList()
this.getLabelType()
this.$message.success('删除成功')
})
})
})
},
/**
* 弹窗关闭
*/
handleClose () {
this.selectLabelList = cloneDeep(this.selectLabelListInitial)
this.dialogFormVisible = false
},
/**
* 确认按钮
*/
commitLabel () {
this.labelCheckLoading = false
this.dialogFormVisible = false
this.selectLabelListInitial = cloneDeep(this.selectLabelList)
this.$emit('commit', this.idListCopy)
},
/**
* 标签编辑/新增、标签类型编辑 后回调
*/
afterEdit (cleanType) {
if (cleanType) {
this.searchForm.labelType = ''
}
this.getDataList()
this.getLabelType()
}
}
}
</script>
<style lang="scss" scoped>
@import '../../assets/style/bsTheme.scss';
.bs-pagination {
::v-deep .el-input__inner {
border: none;
background: var(--bs-el-background-1);
}
}
</style>

View File

@@ -0,0 +1,100 @@
<template>
<el-dialog
:append-to-body="true"
:before-close="handleClose"
:visible.sync="dialogFormVisible"
class="bs-dialog-wrap bs-el-dialog"
title="标签类型修改"
width="500px"
>
<div style="margin: 20px;">
<el-form
ref="ruleForm"
:model="dataForm"
:rules="rules"
label-position="left"
label-width="90px"
class="bs-el-form"
>
<el-form-item
label="标签类型"
prop="labelType"
>
<el-input
v-model="dataForm.labelType"
class="bs-el-input"
/>
</el-form-item>
</el-form>
</div>
<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 { updateLabelType } from 'data-room-ui/js/utils/LabelConfigService'
export default {
name: 'LabelTypeEdit',
data () {
return {
dialogFormVisible: false,
dataForm: {
labelType: '',
oldLabelType: ''
},
rules: {
labelType: [
{ required: true, message: '标签类型不能为空', trigger: 'blur' }
]
}
}
},
methods: {
init (labelType) {
this.dataForm.labelType = labelType
this.dataForm.oldLabelType = labelType
},
handleClose () {
this.$parent.labelTypeEditVisible = false
},
cancel () {
this.dialogFormVisible = false
this.$nextTick(() => {
this.handleClose()
})
},
submitForm (formName) {
this.$refs[formName].validate((valid) => {
if (!valid) {
return false
}
updateLabelType(this.dataForm).then(() => {
this.$emit('afterEdit')
this.cancel()
this.$message.success('保存成功')
})
})
}
}
}
</script>
<style>
/* .dialogClass .el-dialog__body {
min-height: auto;
} */
</style>