fix: 任务修改备份

develop
wx-jincw 1 week ago
parent 3da31c9629
commit c2ce25de03

@ -9,11 +9,17 @@
:on-error="handleUploadError"
:on-exceed="handleExceed"
:on-success="handleUploadSuccess"
:show-file-list="false"
:show-file-list="imageOnly"
:headers="headers"
:on-remove="handleRemove"
:list-type="imageOnly?'picture-card':'text'"
class="upload-file-uploader"
ref="fileUpload"
>
<template v-if="imageOnly">
<i class="el-icon-plus"></i>
</template>
<template v-else>
<!-- 上传按钮 -->
<el-button size="mini" type="primary">选取文件</el-button>
<!-- 上传提示 -->
@ -23,10 +29,12 @@
<template v-if="fileType"> <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>
的文件
</div>
</template>
</el-upload>
<!-- 文件列表 -->
<transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
<transition-group v-if="!imageOnly" class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
<li :key="file.id || file.attachFileUrl" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList">
<el-link :href="`${baseUrl}${file.attachFileUrl}`" :underline="false" target="_blank">
<span class="el-icon-document"> {{ getFileName(file.oldName) }} </span>
@ -66,6 +74,10 @@ export default {
isShowTip: {
type: Boolean,
default: true
},
imageOnly: {
type: Boolean,
default: false,
}
},
data() {
@ -161,6 +173,10 @@ export default {
this.uploadedSuccessfully();
}
},
handleRemove(file) {
this.fileList = this.fileList.filter(item => item !== file);
this.$emit("input", this.fileList);
},
//
handleDelete(index) {
this.fileList.splice(index, 1);

@ -5,7 +5,9 @@
<hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
<breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav"/>
<top-nav id="topmenu-container" class="topmenu-container" v-if="topNav"/>
<top-nav id="topmenu-container" class="topmenu-container" :style="{
background: sideTheme === 'theme-green' ? variables.navbarGreenBackground : variables.navbarBackground
}" v-if="topNav"/>
<div class="right-menu">
<template v-if="device!=='mobile'">

@ -55,6 +55,14 @@
<el-dialog title="上传图片" :visible.sync="openLoad" width="600px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="标签" prop="tagId">
<el-select v-model="form.tagId"
style="width: 100%" @change="tagChange">
<el-option v-for="item in tags" :key="item.id" :label="item.tagName" :value="item.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="目录" prop="cataId">
<treeselect
@ -64,17 +72,20 @@
placeholder="选择目录"
:allow-empty="true"
/>
<!-- <el-select v-model="form.cataId"
style="width: 100%">
<el-option v-for="item in cates" :key="item.id" :label="item.cataName" :value="item.id"></el-option>
</el-select> -->
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="图片标题" prop="imageTitle">
<el-input v-model="form.imageTitle" placeholder="请输入图片标题" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="关键词" prop="keyWords">
<el-input v-model="form.keyWords" placeholder="请输入图片关键词" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
@ -89,8 +100,14 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="关键词" prop="keyWords">
<el-input v-model="form.keyWords" placeholder="请输入图片关键词" />
<el-form-item label="上传时间" prop="uploadTime">
<el-date-picker
v-model="form.uploadTime"
style="width: 100%"
value-format="yyyy-MM-dd"
type="date"
placeholder="选择日期"
></el-date-picker>
</el-form-item>
</el-col>
</el-row>
@ -128,6 +145,7 @@ import { getToken } from "@/utils/auth";
import { formatDateStr } from "@/utils";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import { listTag } from "@/api/task/tag";
export default {
name: 'List',
@ -149,6 +167,7 @@ export default {
},
data() {
return {
tags: [],
cates: [],
defaultProps: {
children: 'children',
@ -166,6 +185,7 @@ export default {
rules: {
imageTitle: [{ required: true, message: '请输入图片标题', trigger: 'blur' }],
photoTime: [{ required: true, message: '请输入图片拍摄时间', trigger: 'change' }],
uploadTime: [{ required: true, message: '请输入上传时间', trigger: 'change' }],
cataId: [{ required: true, message: '请选择图片目录', trigger: 'change' }]
},
imageUrl: '',
@ -198,6 +218,11 @@ export default {
this.cates = list;
});
listTag().then(res => {
const list = res.data || [];
this.tags = list;
});
},
methods: {
MXCreated() {
@ -211,6 +236,12 @@ normalizer(node) {
children: node.children,
};
},
tagChange(tagId) {
const index = this.tags.findIndex(val => val.id === tagId);
if (index > -1 && this.tags[index].saveDir) {
this.form.cataId = this.tags[index].saveDir;
}
},
resetQueryTable() {
this.$refs.multipleTable?.clearSort();
this.tableSort = {};

@ -0,0 +1,278 @@
<template>
<div class="app-container" >
<div class="left-content">
<div style="margin-bottom: 20px;">图片目录</div>
<el-tree :data="cates" :props="defaultProps" @node-click="handleNodeClick"></el-tree>
</div>
<div class="right-content" v-loading="tableLoading">
<el-form :model="query" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="图片标题" prop="imageTitle">
<el-input
v-model="query.imageTitle"
placeholder="请输入图片标题"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="标签" prop="label">
<el-input
v-model="query.label"
placeholder="请输入标签"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="queryTable"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQueryTable"></el-button>
</el-form-item>
</el-form>
<el-table
ref="multipleTable"
tooltip-effect="dark"
:data="tableData"
class="w100p"
border
header-cell-class-name="duojibiaotou"
>
<el-table-column
align="center"
label="图片"
show-overflow-tooltip
min-width="160"
prop="taskTitle"
>
<template slot-scope="scope">
<img style="width: 160px;height: 100px;" :src="getImageUrl(scope.row)" />
<div class="image-name">{{ imageName(scope.row) }}</div>
</template>
</el-table-column>
<el-table-column label="图片标题" align="center" prop="imageTitle" min-width="100">
</el-table-column>
<el-table-column label="拍摄时间" align="center" prop="uploadTime" min-width="100">
</el-table-column>
</el-table>
<!-- 表格页脚 -->
<pagination
v-show="total > 0"
:total="total"
:page.sync="page.pageNum"
:limit.sync="page.pageSize"
@pagination="getTableList"
/>
</div>
<MyImageViewer ref="previewImage" :z-index="2000"
:files="images" @change="imageEditChange"></MyImageViewer>
</div>
</template>
<script>
import ImageItem from '../list/components/ImageItem.vue';
import tableMixin from '../../../mixins/table-mixin';
import { listCata } from "@/api/gallery/cata";
import { pageListImages } from "@/api/gallery/images";
import { getToken } from "@/utils/auth";
import { formatDateStr } from "@/utils";
export default {
name: 'List',
components: {
ImageItem
},
mixins: [tableMixin],
pageInfo: {
title: '图片列表',
exportUrl: '',
pageListApi: pageListImages,
},
props: {
isPerson: {
type: Boolean,
default: false
}
},
data() {
return {
cates: [],
defaultProps: {
children: 'children',
label: 'cataName'
},
openLoad: false,
form: {
imageTitle: null,
photoTime: null,// ,
uploadTime: formatDateStr(),
isOpen: this.isPerson ? 0:1,
keyWords: '日常',
cataId: null,
},
rules: {
imageTitle: [{ required: true, message: '请输入图片标题', trigger: 'blur' }],
photoTime: [{ required: true, message: '请输入图片拍摄时间', trigger: 'change' }],
cataId: [{ required: true, message: '请选择图片目录', trigger: 'change' }]
},
imageUrl: '',
uploadFileUrl: process.env.VUE_APP_BASE_API + "/gallery/images/upload", //
headers: {
Authorization: "Bearer " + getToken(),
},
uploading: false,
switchType: false,
};
},
computed: {
uploadData() {
const params = {};
Object.keys(this.form).forEach(key => {
if (this.form[key] !== null) {
params[key] = this.form[key];
}
});
return params;
},
images() {
return this.tableData.map(item => {
return item.file?.[0] || {};
});
}
},
created() {
listCata().then(res => {
const list = res.data || [];
this.cates = list;
})
},
methods: {
MXCreated() {
this.query.isOpen = this.isPerson ? '0':'';
},
resetQueryTable() {
this.$refs.multipleTable?.clearSort();
this.tableSort = {};
this.page = {
...this.MXDefaultPage()
};
this.query = { ...this.MXPageInfo().defaultQuery };
this.query.isOpen = this.isPerson ? '0':'';
this.getTableList();
},
imageName(item) {
if (item.file?.length > 0) {
return item.file[0].oldName || item.imageName;
}
return item.imageName;
},
getImageUrl(item) {
let url = item.imagePath;
if (item.file?.length > 0) {
url = item.file[0].attachFileUrl || item.imagePath;
}
if (url.indexOf("http") === 0) {
return url;
}
return process.env.VUE_APP_BASE_API + url;
},
imageEditChange() {
this.getTableList();
},
showImageViewer(event, index) {
console.log('showImageViewer');
this.$refs.previewImage.open(index);
},
handleNodeClick(data) {
console.log(data);
if (this.query.cataId === data.id) {
this.query.cataId = null;
} else {
this.query.cataId = data.id;
}
this.getTableList();
},
handleUpload() {
this.form = {
imageTitle: null,
photoTime: null,// ,
uploadTime: formatDateStr(),
isOpen: this.isPerson ? 0:1,
keyWords: '日常',
cataId: null,
};
this.imageUrl = '';
this.openLoad = true;
},
cancel() {
this.openLoad = false;
this.uploading = false;
},
submitForm() {
if (!this.imageUrl) {
this.$message.error('请选择图片');
return;
}
this.$refs['form'].validate((valid) => {
if (valid) {
this.uploading = true;
this.$refs.upload.submit();
}
});
},
handleFileChange(file) {
this.imageUrl = URL.createObjectURL(file.raw);
},
handleFileSuccess(res, file) {
this.$message.success('上传成功');
this.openLoad = false;
this.uploading = false;
this.getTableList();
},
handleFileError() {
this.$message.error('上传失败');
this.uploading = false;
},
beforeAvatarUpload(file) {
const isImg = file.type.indexOf('image/') !== -1;
if (!isImg) {
this.$message.error('只能上传图片!');
}
return isImg;
}
}
}
</script>
<style lang="scss" scoped>
.app-container {
display: flex;
}
.left-content {
width: 300px;
padding: 15px;
border: #EEEEEE 1px solid;
border-radius: 8px;
}
.right-content {
width: 0;
flex: 1;
margin-left: 10px;
}
.image-list {
display: flex;
flex-wrap: wrap;
.image-item {
width: 300px;
margin: 0 15px 15px 0;
}
}
</style>.

@ -85,15 +85,19 @@
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center"/>
<el-table-column label="标签名称" align="center" prop="tagName" sortable='custom'/>
<el-table-column label="标签说明" align="center" prop="tagDesc" sortable='custom'/>
<el-table-column label="是否需要拍照" align="center" prop="isPhoto" sortable='custom'>
<template slot-scope="scope">
<dict-tag :options="dict.type.sys_yes_no" :value="scope.row.isPhoto"/>
</template>
</el-table-column>
<el-table-column label="拍照数量要求" align="center" prop="photoNum" sortable='custom'/>
<el-table-column label="照片存放目录" align="center" prop="saveDir" sortable='custom'/>
<el-table-column label="备注" align="center" prop="remarks" sortable='custom'/>
<el-table-column label="照片存放目录" align="center" prop="saveDir" sortable='custom'>
<template slot-scope="scope">
{{ getCateName(scope.row.saveDir) }}
</template>
</el-table-column>
<el-table-column label="标签说明" align="center" prop="tagDesc" />
<el-table-column label="备注" align="center" prop="remarks" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
@ -151,6 +155,7 @@
<el-form-item label="拍照数量要求" prop="photoNum">
<el-input-number
v-model="form.photoNum"
style="width: 100%;"
placeholder="请输入拍照数量要求"
:min="0"
:step="1"
@ -159,7 +164,13 @@
</el-col>
<el-col :span="12">
<el-form-item label="照片存放目录" prop="saveDir">
<el-input v-model="form.saveDir" placeholder="请输入照片存放目录"/>
<treeselect
v-model="form.saveDir"
:options="cates"
:normalizer="normalizer"
placeholder="选择照片存放目录"
:allow-empty="true"
/>
</el-form-item>
</el-col>
</el-row>
@ -200,6 +211,9 @@
import { pageListTag, getTag, delTag, addTag, updateTag } from "@/api/system/tag";
import FileUpload from "@/components/FileUpload";
import BranchCascaderDialog from "@/components/BranchCascaderDialog";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import { listCata } from "@/api/gallery/cata";
//
const formRules = {
@ -216,7 +230,8 @@ const formRules = {
export default {
components: {
FileUpload
FileUpload,
Treeselect
},
name: "Tag",
dicts: ['sys_yes_no'],
@ -257,13 +272,34 @@ export default {
//
form: {},
//
rules: formRules
rules: formRules,
cates: [],
defaultProps: {
children: 'children',
label: 'cataName'
},
};
},
created() {
this.getList();
listCata().then(res => {
const list = res.data || [];
this.cates = list;
});
},
methods: {
normalizer(node) {
return {
id: node.id,
label: node.cataName,
children: node.children,
};
},
getCateName(saveDir) {
const index = this.cates.findIndex(val => val.id == saveDir);
return index > -1 ? this.cates[index].cataName : "";
},
/** 查询标签信息列表 */
getList() {
this.loading = true;

@ -116,7 +116,8 @@ export default {
userDept: this.$store.getters.userInfo.dept.deptName,
feedbackTime: currentDate,
taskDesc: '',
status: '0'
status: '0',
tags: this.info.ctTaskTags || [],
});
}
}

@ -48,15 +48,25 @@
<span v-else>{{ dialogForm.taskDesc || '' }}</span>
</el-descriptions-item>
</template>
<el-descriptions-item :span="2" v-if="editAble() || dialogForm.file">
<template v-if="editAble() || dialogForm.file">
<el-descriptions-item v-for="tagData in dialogForm.tags" :span="2" :key="tagData.id">
<template slot="label">
<i class="el-icon-paperclip"></i>
附件
{{ tagData.tagName + '图片' }}
</template>
<el-form-item class="desc-form-item" label="" prop="fileId">
<FileUpload v-model="dialogForm.file" :readonly="!editAble()"></FileUpload>
<FileUpload v-model="tagData.file" imageOnly :fileType="['png', 'jpg', 'jpeg']" :readonly="!editAble()"></FileUpload>
<div class="tk-images">
<img class="tk-image-item" v-for="file in imageList" :key="file.id" />
<div class="tk-image-item tk-image-select">
<i class="el-icon-plus"></i>
<div class="tk-image-title">选择图库图片</div>
</div>
</div>
</el-form-item>
</el-descriptions-item>
</template>
</el-descriptions>
<div v-if="editAble()" style="margin-top: 10px;">
<template v-if="isAudit">
@ -186,4 +196,33 @@ export default {
.desc-form-item {
margin: 0;
}
.tk-images {
display: flex;
flex-wrap: wrap;
margin-top: 10px;
.tk-image-item {
width: 100px;
height: 100px;
margin-right: 10px;
margin-bottom: 10px;
border: 1px solid #eee;
background-color: #f5f7fa;
border-radius: 10px;
}
.tk-image-select {
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
width: 100px;
height: 100px;
flex-direction: column;
.tk-image-title {
margin-top: 10px;
}
}
}
</style>

@ -28,7 +28,7 @@
placeholder="请选择任务类型"
clearable
filterable
style="width: calc(100% - 125px); display: inline-block;"
style="width: 100%;"
>
<el-option
v-for="dict in dict.type.task_type"
@ -37,14 +37,7 @@
:value="dict.value"
/>
</el-select>
<el-button
type="primary"
icon="el-icon-search"
@click="openTemplateDialog"
style="width: 120px; margin-left: 5px;"
>
选择模板
</el-button>
</el-form-item>
<el-row :gutter="10">
<el-col :span="12">
@ -80,11 +73,75 @@
>
</el-input>
</el-form-item>
<el-button
v-if="editAble"
type="primary"
icon="el-icon-search"
:disabled="dialogForm.id && dialogForm.tags && dialogForm.tags.length > 0"
@click="openTemplateDialog"
style="margin-bottom: 5px;"
>
选择标签模板
</el-button>
<el-button
v-if="editAble"
type="primary"
icon="el-icon-plus"
@click="showTagsDialog"
style="margin-bottom: 5px;"
plain
>
选择标签
</el-button>
<el-table
tooltip-effect="dark"
:data="dialogForm.tags"
border
highlight-current-row>
<el-table-column
align="center"
label="标签"
show-overflow-tooltip
min-width="160"
prop="tagName"
/>
<el-table-column align="center"
label="是否拍照"
min-width="80"
prop="isPhoto">
<template slot-scope="scope">
<dict-tag :options="dict.type.sys_yes_no" :value="scope.row.isPhoto"/>
</template>
</el-table-column>
<el-table-column
align="center"
label="拍摄数量"
show-overflow-tooltip
prop="photoNum"
/>
<el-table-column
v-if="editAble"
width="80px"
align="center"
label="操作"
fixed="right"
>
<template slot-scope="scope">
<el-popconfirm
title="删除不可恢复,确定删除吗?"
@confirm="handleDelete(scope.row, scope.$index)"
>
<el-link type="warning" slot="reference">移除</el-link>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
<el-form-item label="" prop="file">
<FileUpload
v-model="dialogForm.file"
:readonly="!editAble"
accept=".xls,.xlsx,.doc,.docx,.pdf,.png,.jpg,.jpeg,.gif,.ppt,.pptx"
></FileUpload>
</el-form-item>
</el-form>
@ -206,6 +263,7 @@
<el-button type="primary" @click="confirmTemplateSelection"></el-button>
</div>
</el-dialog>
<TagsDialog ref="tagsDialog" @confirm="tagsDialogConfirm"></TagsDialog>
</el-dialog>
</template>
@ -219,14 +277,17 @@ import {
listBranch,
} from "@/api/task/branch";
import {pageListTemplate} from "@/api/task/template";
import TagsDialog from "./TagsDialog";
import { delTag, listTag } from "@/api/task/tag";
export default {
components: {
FileUpload,
BranchCascaderDialog,
TagsDialog,
},
mixins: [TableEditMixin],
dicts: ['task_type'], //
dicts: ['task_type', 'sys_yes_no'], //
pageInfo: {
defaultForm: {
status: "0", // 01 2/
@ -302,6 +363,14 @@ export default {
this.branchList = [];
this.selectBranch = [];
this.getBranchList();
if (data.id) {
listTag({taskId: this.dialogForm.id}).then(res => {
this.$set(this.dialogForm, "tags", res.data || []);
}).catch(e => {
});
}
},
toAdd() {
this.$refs.branchCascaderDialog.open();
@ -400,7 +469,6 @@ export default {
openTemplateDialog() {
this.templateDialogVisible = true;
this.resetTemplateQuery();
this.fetchTemplates();
},
async fetchTemplates() {
try {
@ -433,6 +501,38 @@ export default {
const textContent = taskContent.replace(/<[^>]*>/g, '');
this.dialogForm.taskContent = textContent;
this.templateDialogVisible = false;
this.dialogForm.tags = this.selectedTemplate.tags.map(val => {
return {
...val,
_id: val.id,
id: null,
};
});
},
showTagsDialog() {
this.$refs.tagsDialog.open();
},
tagsDialogConfirm(data) {
if (!this.dialogForm.tags) {
this.$set(this.dialogForm, 'tags', []);
}
const list = data.filter(val => !this.dialogForm.tags.some(i => i._id === val.id)).map(val => {
return {
...val,
_id: val.id,
id: null,
};
});
this.dialogForm.tags.push(...list);
},
handleDelete(row, index) {
if (row.id) {
delTag(row.id).then(() => {
this.dialogForm.tags.splice(index, 1);
});
} else {
this.dialogForm.tags.splice(index, 1);
}
}
},
};

@ -0,0 +1,130 @@
<template>
<el-dialog
:title="'选择标签'"
:visible.sync="dialogVisible"
width="80%"
append-to-body
>
<el-form :model="query" size="small" :inline="true" label-width="80px">
<el-form-item label="标签名称">
<el-input
v-model="query.tagName"
placeholder="请输入名称"
clearable
@keyup.enter.native="getList"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="getList"></el-button>
<el-button icon="el-icon-refresh" @click="refresh"></el-button>
</el-form-item>
</el-form>
<el-table
v-loading="loading"
:data="list"
border
style="width: 100%; margin-top: 16px;"
@selection-change="handleSelection"
>
<el-table-column type="selection" width="55" align="center"/>
<el-table-column label="标签名称" align="center" prop="tagName"/>
<el-table-column label="是否需要拍照" align="center" prop="isPhoto">
<template slot-scope="scope">
<dict-tag :options="dict.type.sys_yes_no" :value="scope.row.isPhoto"/>
</template>
</el-table-column>
<el-table-column label="拍照数量要求" align="center" prop="photoNum"/>
<el-table-column label="照片存放目录" align="center" prop="saveDir">
<template slot-scope="scope">
{{ getCateName(scope.row.saveDir) }}
</template>
</el-table-column>
<el-table-column label="标签说明" align="center" prop="tagDesc" />
</el-table>
<pagination
:total="total"
:page.sync="query.pageNum"
:limit.sync="query.pageSize"
@pagination="getList"
style="margin-top: 16px;"
/>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="confirm"></el-button>
</div>
</el-dialog>
</template>
<script>
import { pageListTag } from "@/api/system/tag";
import { listCata } from "@/api/gallery/cata";
export default {
name: 'TagsDialog',
dicts: ['sys_yes_no'],
data() {
return {
cates: [],
list: [],
dialogVisible: false,
total: 0,
query: {
tagName: '',
pageNum: 1,
pageSize: 10,
},
selections: [],
loading: false,
};
},
created() {
listCata().then(res => {
const list = res.data || [];
this.cates = list;
});
},
methods: {
open() {
this.dialogVisible = true;
this.getList();
},
getCateName(saveDir) {
const index = this.cates.findIndex(val => val.id == saveDir);
return index > -1 ? this.cates[index].cataName : "";
},
getList() {
this.loading = true;
pageListTag(this.query).then(res => {
this.list = res.rows || [];
this.total = res.total || 0;
this.selections = [];
this.loading = false;
}).catch(() => {
this.loading = false;
});
},
refresh() {
this.query = {
tagName: '',
pageNum: 1,
pageSize: 10,
};
this.getList();
},
handleSelection(val) {
this.selections = val;
},
confirm() {
if (this.selections.length == 0) {
this.$message.warning("请选择标签");
return;
}
this.dialogVisible = false;
this.$emit('confirm', this.selections);
}
}
}
</script>
<style scoped></style>
Loading…
Cancel
Save