Authored by 鲁尚清

【无】 【组件】Vue组件开发:文本框下拉树展示菜单--对比分析保存选择菜单\设计器新增选择菜单

  1 +<el-tree-select
  2 + :filterable="filterable"
  3 + :size="$global.elementConfig.size.input"
  4 + node-key="nodeKey"
  5 + :placeholder="placeholderText"
  6 + :props="defaultProps"
  7 + v-model="value"
  8 + :data="data"
  9 + @change="change"
  10 + check-strictly
  11 + :render-after-expand="false"
  12 +>
  13 + <template #default="{ node, data }">
  14 +<!-- //lsq 菜单类型,1:监控菜单,2:巡检菜单,3:个人工作台,4:系统菜单,5:跳转菜单,6:报表菜单 可以删除和编辑 2022-08-26-->
  15 + <el-tag v-if="isTag" style="height: 18px;margin-right:6px;">
  16 + {{getTypeName(data.type)}}</el-tag>
  17 + <span>{{ node.label }}</span>
  18 + </template>
  19 +</el-tree-select>
  1 +/**
  2 + * 下拉树组件
  3 + */
  4 +export default {
  5 + name: 'treeSelect',
  6 + template: '',
  7 + components: {},
  8 + props: {
  9 +
  10 + // 选中的值
  11 + value: {
  12 + type: String,
  13 + default: ''
  14 + },
  15 + // 数据
  16 + data: {
  17 + type: Array,
  18 + default: []
  19 + },
  20 + //显示的提示语
  21 + placeholderText:{
  22 + type: String,
  23 + default: '请选择'
  24 + },
  25 + //指定标签,子树节点
  26 + defaultProps:{
  27 + type:Object,
  28 + default:{
  29 + children: 'subMenus',
  30 + label: 'name',
  31 + value: 'id'
  32 + }
  33 + },
  34 + //唯一标识
  35 + nodeKey:{
  36 + type: String,
  37 + default: 'id'
  38 + },
  39 + //是否有标签
  40 + isTag:{
  41 + type:Boolean,
  42 + default:false
  43 + },
  44 + //是否可搜索
  45 + filterable:{
  46 + type:Boolean,
  47 + default:false
  48 + }
  49 +
  50 + },
  51 + data() {
  52 + return {}
  53 + },
  54 + setup(props, {attrs, slots, emit}) {
  55 + const {proxy} = Vue.getCurrentInstance();
  56 + let data=Vue.ref([]);
  57 + let change=(val)=>{
  58 + emit("changeSelect",val)
  59 + }
  60 + //获取菜单类型
  61 + let getTypeName=(type)=>{
  62 + switch (type) {
  63 + case 1:
  64 + return '监控菜单';
  65 + case 2:
  66 + return '巡检菜单';
  67 + case 3:
  68 + return '个人工作台';
  69 + case 4:
  70 + return '系统菜单';
  71 + case 5:
  72 + return '跳转菜单';
  73 + case 6:
  74 + return '报表菜单';
  75 + case 7:
  76 + return '资产菜单';
  77 + default:
  78 + return '';
  79 + }
  80 + }
  81 + let init=()=>{
  82 + //lsq 菜单树数据 2022-09-05
  83 + proxy.$http.get(`/api-user/menus/current`, {type: 1}, function (res) {
  84 + if(res && res.data){
  85 + data.value = res.data;
  86 + }
  87 + })
  88 + }
  89 + // 监听编辑状态
  90 + Vue.watch(() => props.value, (newValue, oldVlaue) => {
  91 + // 编辑
  92 + });
  93 + // 挂载完
  94 + Vue.onMounted(() => {
  95 + init()
  96 + })
  97 + return {
  98 + data,
  99 + change,
  100 + getTypeName,
  101 + init
  102 + }
  103 + }
  104 +}
@@ -103,21 +103,10 @@ @@ -103,21 +103,10 @@
103 103
104 104
105 <el-form-item label="父菜单" prop="menuPid" v-if="ajConfigFrom.type==0"> 105 <el-form-item label="父菜单" prop="menuPid" v-if="ajConfigFrom.type==0">
106 - <el-select :reserve-keyword="false"  
107 - :size="$global.elementConfig.size.input"  
108 - allow-create  
109 - default-first-option  
110 - filterable  
111 - placeholder="请选择"  
112 - style="width: 100%;" v-model="ajConfigFrom.menuPid">  
113 - <el-option  
114 - :disabled="item.disabled"  
115 - :key="item.value"  
116 - :label="item.label"  
117 - :value="item.value"  
118 - v-for="item in menuOptions">  
119 - </el-option>  
120 - </el-select> 106 + <!--lsq 引入菜单树公共组件 2022-09-05-->
  107 + <cm-tree-select-menu style="width: 80%" @changeSelect="dataFilter" :filterable="true"
  108 + :value="ajConfigFrom.menuPid" :placeholderText="'请选择菜单'" :isTag="true"></cm-tree-select-menu>
  109 +
121 </el-form-item> 110 </el-form-item>
122 111
123 <el-form-item label="菜单名称" prop="menuName" v-if="ajConfigFrom.type==0"> 112 <el-form-item label="菜单名称" prop="menuName" v-if="ajConfigFrom.type==0">
@@ -206,8 +206,6 @@ export default { @@ -206,8 +206,6 @@ export default {
206 let radio = Vue.ref(0); 206 let radio = Vue.ref(0);
207 //下拉框 207 //下拉框
208 let options = Vue.ref([]); 208 let options = Vue.ref([]);
209 - //菜单下拉框  
210 - let menuOptions = Vue.ref([]);  
211 let search = Vue.ref({ 209 let search = Vue.ref({
212 keyword: '', 210 keyword: '',
213 type: '', 211 type: '',
@@ -250,7 +248,6 @@ export default { @@ -250,7 +248,6 @@ export default {
250 clearForm(); 248 clearForm();
251 cacheVisible.value = true; 249 cacheVisible.value = true;
252 pageList(); 250 pageList();
253 - menuList();  
254 251
255 } 252 }
256 //新增或修改aj配置信息 253 //新增或修改aj配置信息
@@ -329,7 +326,6 @@ export default { @@ -329,7 +326,6 @@ export default {
329 cacheVisible.value = true; 326 cacheVisible.value = true;
330 disabled.value = true; 327 disabled.value = true;
331 pageList(); 328 pageList();
332 - menuList();  
333 } 329 }
334 330
335 //预览 331 //预览
@@ -357,21 +353,6 @@ export default { @@ -357,21 +353,6 @@ export default {
357 }) 353 })
358 } 354 }
359 355
360 - //菜单  
361 - let menuList = () => {  
362 - proxy.$http.get(`/api-user/menus/findAlls`, null, function (res) {  
363 - if (res && res.count > 0) {  
364 - let params = res.data;  
365 - params.forEach(function (e) {  
366 - let menu = {}  
367 - menu.label = e.name;  
368 - menu.value = e.id;  
369 - menuOptions.value.push(menu)  
370 - });  
371 - }  
372 - })  
373 -  
374 - }  
375 //AJ设计登录 356 //AJ设计登录
376 let handleView = () => { 357 let handleView = () => {
377 window.open(sessionStorage.getItem("ajWeb") + '/#/login?access_token=' + localStorage.getItem("access_token")); 358 window.open(sessionStorage.getItem("ajWeb") + '/#/login?access_token=' + localStorage.getItem("access_token"));
@@ -456,7 +437,10 @@ export default { @@ -456,7 +437,10 @@ export default {
456 ddicOS.value = res.data; 437 ddicOS.value = res.data;
457 } 438 }
458 }); 439 });
459 - 440 + //lsq 菜单树change事件
  441 + let dataFilter = (val) => {
  442 + ajConfigFrom.value.menuPid = val;
  443 + }
460 return { 444 return {
461 ddicProvider, 445 ddicProvider,
462 ddicOS, 446 ddicOS,
@@ -484,8 +468,6 @@ export default { @@ -484,8 +468,6 @@ export default {
484 pageList, 468 pageList,
485 radio, 469 radio,
486 options, 470 options,
487 - menuList,  
488 - menuOptions,  
489 getResType, 471 getResType,
490 configs, 472 configs,
491 typeOptions, 473 typeOptions,
@@ -494,7 +476,8 @@ export default { @@ -494,7 +476,8 @@ export default {
494 butColumns, 476 butColumns,
495 detailColumns, 477 detailColumns,
496 couponSelected, 478 couponSelected,
497 - disabled 479 + disabled,
  480 + dataFilter
498 } 481 }
499 } 482 }
500 483
@@ -152,10 +152,12 @@ @@ -152,10 +152,12 @@
152 </div> 152 </div>
153 <div style="padding: 3px 10px 3px 39px" v-if="!isAdd "> 153 <div style="padding: 3px 10px 3px 39px" v-if="!isAdd ">
154 <span class="saab"> 菜单:</span> 154 <span class="saab"> 菜单:</span>
155 - <el-select :size="$global.elementConfig.size.input" @change="dataFilter" filterable 155 + <!-- <el-select :size="$global.elementConfig.size.input" @change="dataFilter" filterable
156 placeholder="请选择菜单" style="width: 80%" v-model="form.addFirstPId"> 156 placeholder="请选择菜单" style="width: 80%" v-model="form.addFirstPId">
157 <el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in firstMenu"/> 157 <el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in firstMenu"/>
158 - </el-select> 158 + </el-select>-->
  159 + <cm-tree-select-menu style="width: 80%" :size="$global.elementConfig.size.input" @changeSelect="dataFilter"
  160 + :value="form.addFirstPId" :placeholderText="'请选择菜单'" :isTag="true"></cm-tree-select-menu>
159 </div> 161 </div>
160 <div style="padding: 3px 10px;" v-if="!isAdd "> 162 <div style="padding: 3px 10px;" v-if="!isAdd ">
161 <span class="saab"> 场景分类:</span> 163 <span class="saab"> 场景分类:</span>
@@ -159,7 +159,7 @@ export default { @@ -159,7 +159,7 @@ export default {
159 let countFirst = Vue.ref(0); 159 let countFirst = Vue.ref(0);
160 160
161 let form = Vue.ref({ 161 let form = Vue.ref({
162 - addFirstPId: '', 162 + addFirstPId: '100130900',
163 parentId: '', 163 parentId: '',
164 parentName: '', 164 parentName: '',
165 desc: '', 165 desc: '',
@@ -305,14 +305,15 @@ export default { @@ -305,14 +305,15 @@ export default {
305 305
306 //根菜单选择事件 306 //根菜单选择事件
307 let dataFilter = (val) => { 307 let dataFilter = (val) => {
  308 + form.value.addFirstPId=val;
308 if (val) { //val存在 309 if (val) { //val存在
309 - this.options = this.firstMenu.filter((item) => {  
310 - if (!!~item.label.indexOf(val) || !!~item.label.toUpperCase().indexOf(val.toUpperCase())) { 310 + firstMenu.value.filter((item) => {
  311 + if (!!~item.id.indexOf(val) || !!~item.id.toUpperCase().indexOf(val.toUpperCase())) {
311 return true 312 return true
312 } 313 }
313 }) 314 })
314 } else { //val为空时,还原数组 315 } else { //val为空时,还原数组
315 - this.options = this.firstMenu; 316 + // this.options = firstMenu.value;
316 } 317 }
317 } 318 }
318 319
@@ -552,6 +553,7 @@ export default { @@ -552,6 +553,7 @@ export default {
552 let resTypeList = Vue.ref([]); 553 let resTypeList = Vue.ref([]);
553 let kpiList = Vue.ref([]); 554 let kpiList = Vue.ref([]);
554 let busTypeList = Vue.ref([]); 555 let busTypeList = Vue.ref([]);
  556 +
555 let init = () => { 557 let init = () => {
556 /* 558 /*
557 proxy.$http.get("/api-web/home/resType/getTree?typeParentFlag=1", {}, function(res) { 559 proxy.$http.get("/api-web/home/resType/getTree?typeParentFlag=1", {}, function(res) {
@@ -586,7 +588,7 @@ export default { @@ -586,7 +588,7 @@ export default {
586 588
587 589
588 //LH 加载新增树菜单 590 //LH 加载新增树菜单
589 - proxy.$http.get(`/api-web/ContrastAnalysis/getRootMenu`, {menuName: ''}, function (res) { 591 + /*proxy.$http.get(`/api-web/ContrastAnalysis/getRootMenu`, {menuName: ''}, function (res) {
590 if (res.length > 0) { 592 if (res.length > 0) {
591 firstMenu.value = res; 593 firstMenu.value = res;
592 firstMenu.value.forEach(function (item, index) { 594 firstMenu.value.forEach(function (item, index) {
@@ -596,8 +598,8 @@ export default { @@ -596,8 +598,8 @@ export default {
596 } 598 }
597 }); 599 });
598 } 600 }
599 - });  
600 - //LH 601 + });*/
  602 + //LH
601 setTimeout(function () { 603 setTimeout(function () {
602 let arrs = timeRangeArr.value 604 let arrs = timeRangeArr.value
603 timeRangeChange(arrs[0]); 605 timeRangeChange(arrs[0]);
@@ -693,7 +695,7 @@ export default { @@ -693,7 +695,7 @@ export default {
693 firstMenu,//菜单 695 firstMenu,//菜单
694 getChartData, 696 getChartData,
695 count, 697 count,
696 - countFirst 698 + countFirst,
697 } 699 }
698 } 700 }
699 } 701 }