Merge branch 'master' into dev

# Conflicts:
#	src/views/repair/screen/repairBigScreen.vue
This commit is contained in:
13405411873 2024-10-23 15:19:04 +08:00
commit 73c0a25054
7 changed files with 164 additions and 409 deletions

View File

@ -46,7 +46,7 @@ export function getServicePackagePage(query) {
// 获取服务套餐精简信息列表 // 获取服务套餐精简信息列表
export function getServicePackageList() { export function getServicePackageList() {
return request({ return request({
url: '/system/service-package/get-simple-list', url: '/system/service-package/getPackageListByTenantId',
method: 'get' method: 'get'
}) })
} }

View File

@ -39,7 +39,7 @@ export default {
if (isExternal(real_src)) { if (isExternal(real_src)) {
return real_src; return real_src;
} }
console.log(process.env.VUE_APP_IMAGE_URL + real_src,42)
return process.env.VUE_APP_IMAGE_URL + real_src; return process.env.VUE_APP_IMAGE_URL + real_src;
}, },
realSrcList() { realSrcList() {

View File

@ -106,7 +106,7 @@ export default {
async logout() { async logout() {
this.$modal.confirm('确定注销并退出系统吗?', '提示').then(() => { this.$modal.confirm('确定注销并退出系统吗?', '提示').then(() => {
this.$store.dispatch('LogOut').then(() => { this.$store.dispatch('LogOut').then(() => {
location.href = getPath('/index'); window.location.href = "http://159.75.168.143:82/yudao-admin/login";
}) })
}).catch(() => {}); }).catch(() => {});
} }

View File

@ -228,6 +228,7 @@ export function getBasePath() {
export function getPath(path) { export function getPath(path) {
// 基础路径,必须以 / 结尾 // 基础路径,必须以 / 结尾
let basePath = getBasePath(); let basePath = getBasePath();
console.log(basePath,"basePath")
if (!basePath.endsWith('/')) { if (!basePath.endsWith('/')) {
return basePath + '/'; return basePath + '/';
} }

View File

@ -1,30 +1,35 @@
<template> <template>
<div class="dashboard-editor-container"> <div >
<el-row>
<panel-group @handleSetLineChartData="handleSetLineChartData" /> <el-col v-for="item in serviceList" :span="4">
<image-preview :width="300" :height="300" :src="item.coverImg"></image-preview>
<el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;"> {{item.name}}
<line-chart :chart-data="lineChartData" />
</el-row>
<el-row :gutter="32">
<el-col :xs="24" :sm="24" :lg="8">
<div class="chart-wrapper">
<raddar-chart />
</div>
</el-col>
<el-col :xs="24" :sm="24" :lg="8">
<div class="chart-wrapper">
<pie-chart />
</div>
</el-col>
<el-col :xs="24" :sm="24" :lg="8">
<div class="chart-wrapper">
<bar-chart />
</div>
</el-col> </el-col>
</el-row> </el-row>
<el-table
:data="warnList"
stripe
style="width: 100%">
<el-table-column
prop="date"
label="日期"
width="180">
</el-table-column>
<el-table-column
prop="name"
label="姓名"
width="180">
</el-table-column>
<el-table-column
prop="address"
label="地址">
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</div> </div>
</template> </template>
@ -35,6 +40,7 @@ import LineChart from './dashboard/LineChart'
import RaddarChart from './dashboard/RaddarChart' import RaddarChart from './dashboard/RaddarChart'
import PieChart from './dashboard/PieChart' import PieChart from './dashboard/PieChart'
import BarChart from './dashboard/BarChart' import BarChart from './dashboard/BarChart'
import {getServicePackageList} from "@/api/system/servicePackage";
const lineChartData = { const lineChartData = {
newVisitis: { newVisitis: {
@ -66,12 +72,29 @@ export default {
}, },
data() { data() {
return { return {
lineChartData: lineChartData.newVisitis lineChartData: lineChartData.newVisitis,
serviceList:[],
warnList:[],
messageList:[],
queryParams:{
pageNo:1,
pageSize:10
} }
}
},
created() {
this.getServiceList()
}, },
methods: { methods: {
handleSetLineChartData(type) { handleSetLineChartData(type) {
this.lineChartData = lineChartData[type] this.lineChartData = lineChartData[type]
},
getServiceList(){
getServicePackageList(this.queryParams).then(response => {
this.serviceList = response.data;
});
} }
} }
} }

View File

@ -8,7 +8,7 @@
<div class="c_left"> <div class="c_left">
<div class="six_box"> <div class="six_box">
<div class="s_title"> <div class="s_title">
客户来源分析 客户来源
</div> </div>
<div class="echaets_box"> <div class="echaets_box">
<div id="khly" style="width: 400px; height: 267px;"></div> <div id="khly" style="width: 400px; height: 267px;"></div>
@ -16,71 +16,36 @@
</div> </div>
<div class="six_box"> <div class="six_box">
<div class="s_title"> <div class="s_title">
月工单数量走势 月工单数据来源
</div>
<div class="echaets_box">
<div id="gdslzs" style="width: 400px; height: 267px;"></div>
</div> </div>
<div class="echaets_box"></div>
</div> </div>
<div class="six_box"> <div class="six_box">
<div class="s_title"> <div class="s_title">
支付渠道统计 支付渠道统计
</div> </div>
<div class="echaets_box"> <div class="echaets_box"></div>
<div id="zfqdtj" style="width: 400px; height: 267px;"></div>
</div>
</div> </div>
</div> </div>
<div class="c_cont"> <div class="c_cont">
<div class="tab_"> <div class="tab_">
<div @click="countOrAmount()" class="tab_buttom tab_acvit">数量</div> <div class="tab_buttom tab_acvit" >数量</div>
<div @click="countOrAmount()" class="tab_buttom">金额</div> <div class="tab_buttom">金额</div>
</div> </div>
<div v-if="isCount" class="tab_bt"> <div class="tab_bt">
<div class="yb_"> <div class="yb_">
<div class="yb_title">工单总数</div> <div class="yb_title">工单总数</div>
<div class="numlist"> <div class="numlist">
<!-- <div class="num_box" v-for="(item,index) in 6" :key="index">--> <div class="num_box" v-for="(item,index) in 6" :key="index">
<!-- {{index}}--> {{index}}
<!-- </div>-->
<div class="num_box">
{{ statistics.totalCount }}
</div> </div>
</div> </div>
</div> </div>
<div class="yb_"> <div class="yb_">
<div class="yb_title">今日工单</div> <div class="yb_title">今日工单</div>
<div class="numlist"> <div class="numlist">
<!-- <div class="num_box" v-for="(item,index) in 6" :key="index">--> <div class="num_box" v-for="(item,index) in 6" :key="index">
<!-- {{index}}--> {{index}}
<!-- </div>-->
<div class="num_box">
{{ statistics.todayCount }}
</div>
</div>
</div>
</div>
<div v-else class="tab_bt">
<div class="yb_">
<div class="yb_title">工单总金额</div>
<div class="numlist">
<!-- <div class="num_box" v-for="(item,index) in 6" :key="index">-->
<!-- {{index}}-->
<!-- </div>-->
<div class="num_box">
{{ statistics.totalAmount }}
</div>
</div>
</div>
<div class="yb_">
<div class="yb_title">今日工单金额</div>
<div class="numlist">
<!-- <div class="num_box" v-for="(item,index) in 6" :key="index">-->
<!-- {{index}}-->
<!-- </div>-->
<div class="num_box">
{{ statistics.todayAmount }}
</div> </div>
</div> </div>
</div> </div>
@ -91,8 +56,8 @@
<img src="./imgs/1.png" style="width: 60px;height: 60px"> <img src="./imgs/1.png" style="width: 60px;height: 60px">
</div> </div>
<div> <div>
<div class="f_size">{{ statusTickets[3].name }}</div> <div class="f_size">未派工</div>
<div class="f_num">{{ statusTickets[3].value }}</div> <div class="f_num">2082</div>
</div> </div>
</div> </div>
<div class="f_box"> <div class="f_box">
@ -100,8 +65,8 @@
<img src="./imgs/2.png" style="width: 60px;height: 60px"> <img src="./imgs/2.png" style="width: 60px;height: 60px">
</div> </div>
<div> <div>
<div class="f_size">{{ statusTickets[4].name }}</div> <div class="f_size">施工中</div>
<div class="f_num">{{ statusTickets[4].value }}</div> <div class="f_num">2082</div>
</div> </div>
</div> </div>
<div class="f_box"> <div class="f_box">
@ -109,8 +74,8 @@
<img src="./imgs/3.png" style="width: 60px;height: 60px"> <img src="./imgs/3.png" style="width: 60px;height: 60px">
</div> </div>
<div> <div>
<div class="f_size">{{ statusTickets[0].name }}</div> <div class="f_size">未结账</div>
<div class="f_num">{{ statusTickets[0].value }}</div> <div class="f_num">2082</div>
</div> </div>
</div> </div>
<div class="f_box"> <div class="f_box">
@ -118,8 +83,8 @@
<img src="./imgs/4.png" style="width: 60px;height: 60px"> <img src="./imgs/4.png" style="width: 60px;height: 60px">
</div> </div>
<div> <div>
<div class="f_size">{{ statusTickets[1].name }}</div> <div class="f_size">已结账</div>
<div class="f_num">{{ statusTickets[1].value }}</div> <div class="f_num">2082</div>
</div> </div>
</div> </div>
<div class="f_box"> <div class="f_box">
@ -127,13 +92,13 @@
<img src="./imgs/5.png" style="width: 60px;height: 60px"> <img src="./imgs/5.png" style="width: 60px;height: 60px">
</div> </div>
<div> <div>
<div class="f_size">{{ statusTickets[5].name }}</div> <div class="f_size">挂账</div>
<div class="f_num">{{ statusTickets[5].value }}</div> <div class="f_num">2082</div>
</div> </div>
</div> </div>
</div> </div>
<div class="co_title"> <div class="co_title">
今日工单 最新工单
</div> </div>
<div class="list_long"> <div class="list_long">
<div class="long_title"> <div class="long_title">
@ -143,13 +108,14 @@
<div class="l_four">创建时间</div> <div class="l_four">创建时间</div>
</div> </div>
<div class="ot_vox"> <div class="ot_vox">
<div class="long_box" v-for="(item,index) in todayTickets" :key="index"> <div class="long_box" v-for="(item,index) in 16" :key="index">
<div class="l_one">{{ item.ticketNo }}</div> <div class="l_one">1209840149750105501</div>
<div class="l_two">{{ item.userName }}</div> <div class="l_two">张三</div>
<div class="l_three">{{ item.adviserName }}</div> <div class="l_three">李向东</div>
<div class="l_four">{{ parseTime(item.createTime) }}</div> <div class="l_four">2024-10-20 12:00</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="c_right"> <div class="c_right">
@ -157,36 +123,19 @@
<div class="s_title"> <div class="s_title">
维修类型统计 维修类型统计
</div> </div>
<div class="echaets_box"> <div class="echaets_box"></div>
<div id="wxlxtj" style="width: 400px; height: 267px;"></div>
</div>
</div> </div>
<div class="six_box"> <div class="six_box">
<div class="s_title"> <div class="s_title">
月工单金额走势 月工单金额走势
</div> </div>
<div class="echaets_box"> <div class="echaets_box"></div>
<div id="gdjezs" style="width: 400px; height: 267px;"></div>
</div>
</div> </div>
<div class="six_box"> <div class="six_box">
<div class="s_title"> <div class="s_title">
维修工人排行 维修工人排行
</div> </div>
<div class="echaets_box"> <div class="echaets_box"></div>
<div class="list_long">
<div class="long_title">
<div class="l_one">姓名</div>
<div class="l_two">服务工单数</div>
</div>
<div class="ot_vox">
<div class="long_box" v-for="(item,index) in workers" :key="index">
<div class="l_one">{{ item.name }}</div>
<div class="l_two">{{ item.value }}</div>
</div>
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -196,71 +145,38 @@
<script> <script>
import * as echarts from 'echarts'; import * as echarts from 'echarts';
import * as RepairBigScreenApi from '@/views/repair/screen/api/repairBigScreen';
export default { export default {
name: 'Index', name: 'Index',
components: {}, components: {
},
data() { data() {
return { return {
//
statistics: {},
//
statusTickets: [],
//
isCount: true,
//
todayTickets: [],
//
workers: []
} }
}, },
created() { created() {
//
this.ticketStatistics()
//
this.ticketStatusCount()
//
this.listTicketToday()
//
this.listWorks()
}, },
mounted() { mounted() {
// this.echaerCar();
this.customerSource();
//
this.ticketMainCount()
//
this.ticketMainAmount()
//
this.ticketMainPayWay()
//
this.repairTypeStatistics()
}, },
methods: { methods: {
countOrAmount() { echaerCar(){
this.isCount = !this.isCount
},
/**
* 客户来源分析饼图
*/
async customerSource() {
const res = await RepairBigScreenApi.customerSource();
var chartDom = document.getElementById('khly'); var chartDom = document.getElementById('khly');
var myChart = echarts.init(chartDom); var myChart = echarts.init(chartDom);
var option; var option;
option = { option = {
// legend: {
// top: 'bottom'
// },
toolbox: { toolbox: {
show: true, show: true,
},
tooltip: {
trigger: 'item',
formatter: "{a} <br/>{b} : {c} ({d}%)"
}, },
series: [ series: [
{ {
name: '客户来源分析', name: 'Nightingale Chart',
type: 'pie', type: 'pie',
radius: [20, 100], radius: [20, 100],
center: ['50%', '50%'], center: ['50%', '50%'],
@ -268,181 +184,18 @@ export default {
itemStyle: { itemStyle: {
borderRadius: 2 borderRadius: 2
}, },
data: res.data, data: [
{ value: 40, name: '救援' },
{ value: 38, name: '线下' },
{ value: 32, name: '小程序预约' },
]
} }
] ]
}; };
option && myChart.setOption(option); option && myChart.setOption(option);
},
/**
* 月工单数量走势
*/
async ticketMainCount() {
const res = await RepairBigScreenApi.ticketMainCount();
var chartDom = document.getElementById('gdslzs');
var myChart = echarts.init(chartDom, 'dark');
var option;
option = {
tooltip: {
trigger: 'axis'
},
xAxis: {
type: 'category',
data: res.data.xData
},
yAxis: {
type: 'value'
},
series: [
{
data: res.data.data,
type: 'line',
smooth: true
} }
]
};
option && myChart.setOption(option);
},
/**
* 月工单金额走势
*/
async ticketMainAmount() {
const res = await RepairBigScreenApi.ticketMainAmount();
var chartDom = document.getElementById('gdjezs');
var myChart = echarts.init(chartDom, 'dark');
var option;
option = {
tooltip: {
trigger: 'axis'
},
xAxis: {
type: 'category',
data: res.data.xData
},
yAxis: {
type: 'value'
},
series: [
{
data: res.data.data,
type: 'line',
smooth: true
}
]
};
option && myChart.setOption(option);
},
/**
* 支付渠道统计
*/
async ticketMainPayWay() {
const res = await RepairBigScreenApi.ticketMainPayWay();
var chartDom = document.getElementById('zfqdtj');
var myChart = echarts.init(chartDom, 'dark');
var option;
option = {
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
xAxis: {
type: 'category',
data: res.data.xData
},
yAxis: {
type: 'value'
},
series: [
{
data: res.data.data,
type: 'bar'
}
]
};
option && myChart.setOption(option);
},
/**
* 维修类型相关统计分析饼图
*/
async repairTypeStatistics() {
const res = await RepairBigScreenApi.repairTypeStatistics();
var chartDom = document.getElementById('wxlxtj');
var myChart = echarts.init(chartDom, 'dark');
var option;
option = {
tooltip: {
trigger: 'item'
},
legend: {
top: '5%',
left: 'center'
},
series: [
{
name: '维修类型统计',
type: 'pie',
radius: ['40%', '70%'],
avoidLabelOverlap: false,
padAngle: 5,
itemStyle: {
borderRadius: 10
},
label: {
show: false,
position: 'center'
},
emphasis: {
label: {
show: true,
fontSize: 40,
fontWeight: 'bold'
}
},
labelLine: {
show: false
},
data: res.data
}
]
};
option && myChart.setOption(option);
},
/**
* 单总数今日工单工单总金额今日工单金额
*/
async ticketStatistics() {
const res = await RepairBigScreenApi.ticketStatistics();
this.statistics = res.data
},
/**
* 工单状态数量统计
*/
async ticketStatusCount() {
const res = await RepairBigScreenApi.ticketStatusCount();
this.statusTickets = res.data
},
/**
* 今日工单
*/
async listTicketToday() {
const res = await RepairBigScreenApi.listTicketToday();
this.todayTickets = res.data
},
/**
* 维修工人排行
*/
async listWorks() {
const res = await RepairBigScreenApi.listWorks();
this.workers = res.data
}
} }
} }
</script> </script>
@ -455,7 +208,6 @@ export default {
width: 100%; width: 100%;
height: 100vh; height: 100vh;
} }
.top_{ .top_{
width: 100%; width: 100%;
height: 86px; height: 86px;
@ -469,22 +221,18 @@ export default {
font-weight: bold; font-weight: bold;
margin-bottom: 15px; margin-bottom: 15px;
} }
.content_{ .content_{
width: 100%; width: 100%;
display: flex; display: flex;
//align-items: center; //align-items: center;
justify-content: space-between; justify-content: space-between;
} }
.c_left{ .c_left{
width: 25%; width: 25%;
} }
.c_cont{ .c_cont{
width: 50%; width: 50%;
} }
.tab_{ .tab_{
display: flex; display: flex;
align-items: center; align-items: center;
@ -494,14 +242,12 @@ export default {
color: #FFFFFF; color: #FFFFFF;
margin: 15px auto; margin: 15px auto;
} }
.yb_title{ .yb_title{
text-align: center; text-align: center;
font-size: 18px; font-size: 18px;
color: #FFFFFF; color: #FFFFFF;
margin: 15px auto; margin: 15px auto;
} }
.tab_bt{ .tab_bt{
display: flex; display: flex;
align-items: center; align-items: center;
@ -511,7 +257,6 @@ export default {
box-sizing: border-box; box-sizing: border-box;
padding-bottom: 20px; padding-bottom: 20px;
} }
.tab_buttom{ .tab_buttom{
width: 120px; width: 120px;
height: 32px; height: 32px;
@ -521,20 +266,17 @@ export default {
align-items: center; align-items: center;
justify-content: center; justify-content: center;
} }
yb_title{ yb_title{
font-size: 16px; font-size: 16px;
color: #FFFFFF; color: #FFFFFF;
text-align: center; text-align: center;
width: 100%; width: 100%;
} }
.numlist{ .numlist{
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
} }
.num_box{ .num_box{
width: 38px; width: 38px;
height: 50px; height: 50px;
@ -549,44 +291,36 @@ yb_title {
color: #FFFFFF; color: #FFFFFF;
margin: 0px 10px; margin: 0px 10px;
} }
.yb_{ .yb_{
width: 50%; width: 50%;
} }
.tab_acvit{ .tab_acvit{
background: #0174F6 !important; background: #0174F6 !important;
} }
.five_box{ .five_box{
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-around; justify-content: space-around;
margin: 30px auto; margin: 30px auto;
} }
.f_size{ .f_size{
font-size: 14px; font-size: 14px;
color: #FFFFFF; color: #FFFFFF;
} }
.f_num{ .f_num{
font-weight: bold; font-weight: bold;
font-size: 24px; font-size: 24px;
color: #FFFFFF; color: #FFFFFF;
} }
.img_left{ .img_left{
width: 60px; width: 60px;
height: 60px; height: 60px;
margin-right: 10px; margin-right: 10px;
} }
.f_box{ .f_box{
display: flex; display: flex;
align-items: center; align-items: center;
} }
.co_title{ .co_title{
width: 100%; width: 100%;
height: 32px; height: 32px;
@ -598,7 +332,6 @@ yb_title {
box-sizing: border-box; box-sizing: border-box;
padding-left: 40px; padding-left: 40px;
} }
.s_title{ .s_title{
width: 90%; width: 90%;
height: 32px; height: 32px;
@ -611,20 +344,17 @@ yb_title {
padding-left: 40px; padding-left: 40px;
margin: 0px auto; margin: 0px auto;
} }
.echaets_box{ .echaets_box{
width: 90%; width: 90%;
height: 267px; height: 267px;
margin: 0px auto; margin: 0px auto;
border-bottom: 1px solid #0174F6; border-bottom: 1px solid #0174F6;
} }
.list_long{ .list_long{
width: 100%; width: 100%;
height: 563px; height: 563px;
} }
.l_one{ .l_one{
width: 30%; width: 30%;
text-align: left; text-align: left;
@ -634,7 +364,6 @@ yb_title {
box-sizing: border-box; box-sizing: border-box;
padding-left: 35px; padding-left: 35px;
} }
.l_two{ .l_two{
width: 20%; width: 20%;
text-align: center; text-align: center;
@ -642,7 +371,6 @@ yb_title {
color: rgba(255,255,255,0.7); color: rgba(255,255,255,0.7);
overflow: hidden; overflow: hidden;
} }
.l_three{ .l_three{
width: 20%; width: 20%;
text-align: center; text-align: center;
@ -650,7 +378,6 @@ yb_title {
color: rgba(255,255,255,0.7); color: rgba(255,255,255,0.7);
overflow: hidden; overflow: hidden;
} }
.l_four{ .l_four{
width: 30%; width: 30%;
text-align: right; text-align: right;
@ -660,7 +387,6 @@ yb_title {
box-sizing: border-box; box-sizing: border-box;
padding-right: 35px; padding-right: 35px;
} }
.long_title{ .long_title{
width: 100%; width: 100%;
height: 58px; height: 58px;
@ -672,14 +398,12 @@ yb_title {
justify-content: space-between; justify-content: space-between;
margin: 10px auto; margin: 10px auto;
} }
.ot_vox{ .ot_vox{
width: 100%; width: 100%;
height: 500px; height: 500px;
overflow: auto; overflow: auto;
scrollbar-width: none; scrollbar-width: none;
} }
.long_box{ .long_box{
width: 100%; width: 100%;
height: 58px; height: 58px;
@ -689,11 +413,9 @@ yb_title {
justify-content: space-between; justify-content: space-between;
margin: 10px auto; margin: 10px auto;
} }
.six_box{ .six_box{
margin-bottom: 15px; margin-bottom: 15px;
} }
.c_right{ .c_right{
width: 25%; width: 25%;
} }

View File

@ -39,6 +39,11 @@
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" /> <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="icon" align="center" prop="coverImg" width="100">
<template v-slot="scope">
<image-preview :src="scope.row.coverImg"></image-preview>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" /> <el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180"> <el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template v-slot="scope"> <template v-slot="scope">
@ -67,6 +72,10 @@
<el-form-item label="服务套餐名" prop="name"> <el-form-item label="服务套餐名" prop="name">
<el-input v-model="form.name" placeholder="请输入服务套餐名" /> <el-input v-model="form.name" placeholder="请输入服务套餐名" />
</el-form-item> </el-form-item>
<el-form-item label="icon" prop="coverImg">
<image-upload :limit="1" v-model="form.coverImg" />
</el-form-item>
<el-form-item label="菜单权限"> <el-form-item label="菜单权限">
<el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event)">展开/折叠</el-checkbox> <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event)">展开/折叠</el-checkbox>
<el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event)">全选/全不选</el-checkbox> <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event)">全选/全不选</el-checkbox>