You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

471 lines
14 KiB

<template>
<el-card class="categoryContainer">
<el-form :inline="true">
<el-form-item label="分类名称">
<el-input
v-model="queryParams.title"
placeholder="请输入分类名称"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button
type="primary"
icon="el-icon-plus"
size="mini"
@click="handleAdd"
>新增</el-button>
</el-form-item>
</el-form>
<el-table
v-loading="loading"
:data="categoryList"
border
row-key="id"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
>
<el-table-column prop="category_id" label="ID" width="120px" />
<el-table-column prop="category_name" label="分类名称" :show-overflow-tooltip="true" />
<el-table-column label="标签详情">
<template slot-scope="{row}">
<span>{{ row.label_name | getTagDetail }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-plus"
@click="handleAdd(scope.row)"
>新增</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 添加或修改分类对话框 -->
<el-drawer
ref="drawer"
:title="title"
:before-close="cancel"
:visible.sync="open"
direction="rtl"
custom-class="demo-drawer"
size="830px"
>
<div class="demo-drawer__content">
<el-form ref="form" :model="form" :rules="rules" label-position="top" label-width="106px">
<el-row>
<el-col :span="13">
<el-form-item prop="fid">
<span slot="label">
上级分类
<el-tooltip content="指当前分类停靠的分类归属" placement="top">
<i class="el-icon-question" />
</el-tooltip>
</span>
<treeselect
v-model="form.fid"
:options="categoryOptions"
:normalizer="normalizer"
:show-count="true"
placeholder="选择上级分类"
/>
</el-form-item>
</el-col>
<el-col :span="13">
<el-form-item prop="category_name">
<span slot="label">
分类名称
<el-tooltip content="分类位置显示的说明信息" placement="top">
<i class="el-icon-question" />
</el-tooltip>
</span>
<el-input v-model="form.category_name" placeholder="请输入分类标题" />
</el-form-item>
</el-col>
<template v-for="(item,index) in tagData">
<el-col :span="13" :key="index">
<el-form-item>
<span slot="label">
标签组名称{{index+1}}
<el-tooltip content="标签组名称" placement="top">
<i class="el-icon-question" />
</el-tooltip>
<el-button v-if="index+1 < tagData.length" class="button-new-tag" size="small" type="warning" @click="removeTag(index)">删除</el-button>
<el-button v-else class="button-new-tag" size="small" @click="addTag">添加</el-button>
</span>
<el-input v-model="item.label" placeholder="请输入标签名称" />
</el-form-item>
<el-form-item style="margin-left:20px">
<span slot="label">
标签项
<el-tooltip content="标签项名称" placement="top">
<i class="el-icon-question" />
</el-tooltip>
</span>
<el-tag
v-for="(sItem,sIndex) in item.value"
:key="sIndex"
closable
:disable-transitions="false"
@close="handleDelTagItem(sItem,item.value)">
{{sItem}}
</el-tag>
<el-button class="button-new-tag" size="small" @click="openTagDialog(index)">添加标签项</el-button>
</el-form-item>
</el-col>
</template>
</el-row>
</el-form>
<div class="demo-drawer__footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</div>
</el-drawer>
<!-- 标签弹框 -->
<el-dialog class="tagContainer" title="标签名称" :visible.sync="dialogFormVisible">
<el-form>
<el-form-item label="标签名称" :label-width="formLabelWidth">
<el-input v-model="tagName" autocomplete="off"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false">取 消</el-button>
<el-button type="primary" @click="makeSureAddTag"> </el-button>
</div>
</el-dialog>
</el-card>
</template>
<script>
import { listCategory, getCategory, delCategory, addCategory, updateCategory } from '@/api/category'
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
import IconSelect from '@/components/IconSelect'
export default {
name: 'CategoryManage',
components: { Treeselect, IconSelect },
data() {
return {
// 遮罩层
loading: true,
// 分类表格树数据
categoryList: [],
// 分类树选项
categoryOptions: [],
// 弹出层标题
title: '',
// 是否显示弹出层
open: false,
// 分类状态数据字典
visibleOptions: [],
// 查询参数
queryParams: {
category_name: undefined,
},
// 表单参数
form: {
category_id: undefined,
fid: 0,
category_name: undefined,
},
// 表单校验
rules: {
category_name: [{ required: true, message: '分类标题不能为空', trigger: 'blur' }],
// fid: [{ required: true, message: '请选择父级分类', trigger: 'blur' }]
},
tagData:[],
dialogFormVisible: false,
tagName:'',
handleIndex: null,
formLabelWidth: '120px'
}
},
filters: {
getTagDetail(data) {
if (!data) {
return
}
let str=''
data = JSON.parse(data);
data.forEach(item=>{
if (item.value.length) {
str += `${item.label}${item.value.join("、")}`
}
})
return str
},
},
created() {
this.getList()
},
methods: {
/** 查询分类列表 */
getList() {
this.loading = true
listCategory(this.queryParams).then(response => {
this.categoryList = response.data
this.loading = false
})
},
/** 转换分类数据结构 */
normalizer(node) {
if (node.children && !node.children.length) {
delete node.children
}
return {
id: node.category_id,
label: node.category_name,
children: node.children
}
},
/** 查询分类下拉树结构 */
getTreeselect() {
listCategory().then(response => {
this.categoryOptions = []
const category = { category_id: 0, category_name: '主类目', children: [] }
category.children = response.data
this.categoryOptions.push(category)
})
},
// 取消按钮
cancel() {
this.open = false
this.reset()
},
// 表单重置
reset() {
this.form = {
category_id: undefined,
fid: 0,
category_name: undefined,
}
this.tagData = [
{
label:'',
value:[]
}
]
// this.resetForm('form')
},
/** 搜索按钮操作 */
handleQuery() {
this.getList()
},
/** 新增按钮操作 */
handleAdd(row) {
this.reset()
this.getTreeselect()
if (row != null) {
this.form.fid = row.category_id
}
console.log(this.form)
this.open = true
this.title = '添加分类'
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
this.getTreeselect()
this.form = {...row}
this.tagData = this.form.label_name ? JSON.parse(this.form.label_name) : [{label:'',value:[]}];
this.open = true
this.title = '修改分类'
},
/** 提交按钮 */
submitForm() {
this.$refs['form'].validate(valid => {
if (valid) {
if( this.tagData.length==1 ){
if (this.validTagData(false)) {
this.form.label_name = JSON.stringify(this.tagData)
} else {
this.form.label_name = null
}
} else {
if (!this.validTagData()) {
return
}
this.form.label_name = JSON.stringify(this.tagData)
}
if (this.form.category_id !== undefined) {
updateCategory(this.form, this.form.category_id).then(response => {
if (response.code === 200) {
this.$message({
message: response.msg,
type: "success",
duration: 2 * 1000,
});
this.open = false
this.getList()
} else {
this.$message({
message: response.msg,
type: "error",
duration: 2 * 1000,
});
}
})
} else {
addCategory(this.form).then(response => {
if (response.code === 200) {
this.$message({
message: response.msg,
type: "success",
duration: 2 * 1000,
});
this.open = false
this.getList()
} else {
this.$message({
message: response.msg,
type: "error",
duration: 2 * 1000,
});
}
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
console.log(row)
this.$confirm('是否确认删除名称为"' + row.category_name + '"的数据项?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function() {
return delCategory({ 'category_id': row.category_id })
}).then((response) => {
if (response.code === 200) {
this.$message({
message: "删除分类成功",
type: "success",
duration: 2 * 1000,
});
this.open = false
this.getList()
} else {
this.$message({
message: "删除分类失败",
type: "error",
duration: 2 * 1000,
});
}
}).catch(function() {})
},
// 删除标签
handleDelTagItem(tag,data) {
data.splice(data.indexOf(tag), 1);
console.log(this.tagData);
},
// 打开标签弹框
openTagDialog(idx) {
this.tagName = ''
this.handleIndex = idx
this.dialogFormVisible = true
},
// 打开标签弹框
makeSureAddTag(){
if (!this.tagName) {
this.$message.warning('请输入标签名称');
return;
}
this.tagData[this.handleIndex]['value'].push(this.tagName)
this.dialogFormVisible = false
},
//添加标签组
addTag(){
if(!this.validTagData()){
return
}
let obj={
label:'',
value:[]
}
this.tagData.push(obj);
},
//移除标签组
removeTag(idx){
this.$confirm('是否确认删除该标签组', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
this.tagData.splice(idx, 1);
})
.catch(action => {});
},
// 校验标签数据
validTagData(flag=true){
return this.tagData.every(item=>{
if(!item.label){
flag && this.$message.warning('标签组名称不能为空')
return false
}
if (!item.value.length) {
flag && this.$message.warning('标签项不能为空')
return false
}
return true
})
}
}
}
</script>
<style lang="scss" scoped>
.categoryContainer{
::v-deep {
.el-col {
padding: 0 5px;
}
.el-drawer__header{
margin-bottom: 0;
}
.el-drawer__body{
padding: 20px;
}
.el-tag + .el-tag {
margin-left: 10px;
}
.button-new-tag {
margin-left: 10px;
height: 32px;
line-height: 30px;
padding-top: 0;
padding-bottom: 0;
}
.input-new-tag {
width: 90px;
margin-left: 10px;
vertical-align: bottom;
}
}
.tagContainer{
::v-deep .el-input{
width:300px
}
}
}
</style>