vue+elementUI開發過程常用方法封裝


  1 /*
  2  * Created by luoxuemei on 2019/09/02.
  3  */
  4 
  5 // 拖動調整左右兩側div的寬度
  6 // resizeName表示拖到的工具條的className
  7 // left表示左邊的區域的className。leftWid表示左邊的最小寬度
  8 // midName表示右邊區域的className。rightWid表示右邊的最小寬度
  9 // boxName表示父級元素的className
 10 import moment from 'moment'; 
 11 export function  dragControllerDiv(resizeName='resize', leftName = 'left', midName = 'mid', boxName = 'box', leftWid = 250, rightWid = 800){
 12   var resize = document.getElementsByClassName(resizeName);
 13   var left = document.getElementsByClassName(leftName);
 14   var mid = document.getElementsByClassName(midName);
 15   var box = document.getElementsByClassName(boxName);
 16   for (let i = 0; i < resize.length; i++) {
 17     // 鼠標按下事件
 18     resize[i].onmousedown = function (e) {
 19       var startX = e.clientX;
 20       resize[i].left = resize[i].offsetLeft;
 21       // 鼠標拖動事件
 22       document.onmousemove = function (e) {
 23         var endX = e.clientX;
 24         var moveLen = resize[i].left + (endX - startX); // (endx-startx)=移動的距離。resize[i].left+移動的距離=左邊區域最后的寬度
 25         var maxT = box[i].clientWidth - resize[i].offsetWidth;  // 容器寬度 - 左邊區域的寬度 = 右邊區域的寬度
 26 
 27         if (moveLen < leftWid) moveLen = leftWid; // 左邊區域的最小寬度為150px
 28         if (moveLen > maxT - rightWid) moveLen = maxT  - rightWid;  //右邊區域最小寬度為800px
 29 
 30         resize[i].style.left = moveLen; // 設置左側區域的寬度
 31 
 32         for (let j = 0; j < left.length; j++) {
 33           left[j].style.width = moveLen + 'px';
 34           mid[j].style.width = (box[i].clientWidth - moveLen - 10) + 'px';
 35         }
 36       }
 37       // 鼠標松開事件
 38       document.onmouseup = function (evt) {
 39         document.onmousemove = null;
 40         document.onmouseup = null;
 41         resize[i].releaseCapture && resize[i].releaseCapture(); //當你不在需要繼續獲得鼠標消息就要應該調用ReleaseCapture()釋放掉
 42       }
 43       resize[i].setCapture && resize[i].setCapture(); //該函數在屬於當前線程的指定窗口里設置鼠標捕獲
 44       return false;
 45     }
 46   }
 47 }
 48 
 49 
 50 // 對象深拷貝
 51 export function deepCopy(obj) {
 52   var result = Array.isArray(obj) ? [] : {}
 53   for (var key in obj) {
 54     if (obj.hasOwnProperty(key)) {
 55       if (typeof obj[key] === 'object' && obj[key] !== null) {
 56         result[key] = deepCopy(obj[key])
 57       } else {
 58         result[key] = obj[key]
 59       }
 60     }
 61   }
 62   return result
 63 }
 64 
 65 /*菜單樹下拉,禁止選擇當前項及其子項,以防止死循環*/
 66 export function diGuiTreeEdit(item, compID) {  // 編輯情況下,禁止選擇當前節點及其子節點
 67   const dataSor = item
 68   let treeAry = []
 69   for (let i in dataSor) {
 70     const v = dataSor[i]
 71     let node = {}
 72     if (v === null || v === undefined) { }
 73     else {
 74       if (v.children && v.children.length > 0) {
 75         if (v.id == compID) {
 76           node.isDisabled = true
 77         } else {
 78           node.isDisabled = false
 79         }
 80         node.id = v.id
 81         node.label = v.label
 82         node.name = v.name
 83         node.children = diGuiTreeEdit(v.children, compID)
 84         treeAry.push(node)
 85       } else {
 86         if (v.id == compID) {
 87           node.isDisabled = true
 88         } else {
 89           node.isDisabled = false
 90         }
 91         node.id = v.id
 92         node.label = v.label
 93         node.name = v.name
 94         treeAry.push(node)
 95       }
 96     }
 97   }
 98   return treeAry
 99 }
100 
101 
102 // 遞歸遍歷根據id,找到對應的node節點。treeAry主要是用於遞歸push的值
103 export function rspTreeNodeFormID(item,id,idVal, treeAry=[]) {
104   const dataSor = item
105   for (let v of dataSor) {
106     if (v === null || v === undefined) { }
107     else {
108       if (v.children && v.children.length > 0) {
109         if (v[id] == idVal) {
110           treeAry.push(v)
111           break
112         } else {
113           rspTreeNodeFormID(v.children, id, idVal,treeAry )
114         }
115       } else {
116         if (v[id] == idVal) {
117           treeAry.push(v)
118           break
119         }
120       }
121     }
122   }
123   return treeAry
124 }
125 
126 // 遞歸遍歷根據id,找到對應的node節點下的data屬性里面的對應的值。treeAry主要是用於遞歸push的值
127 export function rspTreeNodeDataFormID(item,firstAttr,secAttr,idVal, treeAry=[]) {
128   const dataSor = item
129   for (let v of dataSor) {
130     if (v === null || v === undefined) { }
131     else {
132       if (v.children && v.children.length > 0) {
133         if (v[firstAttr] && v[firstAttr][secAttr] && v[firstAttr][secAttr] == idVal) {
134           treeAry.push(v)
135           break
136         } else {
137           rspTreeNodeDataFormID(v.children, firstAttr,secAttr, idVal,treeAry )
138         }
139       } else {
140         if (v[firstAttr] && v[firstAttr][secAttr] && v[firstAttr][secAttr] == idVal) {
141           treeAry.push(v)
142           break
143         }
144       }
145     }
146   }
147   return treeAry
148 }
149 
150 
151 // 傳入按鈕組和按鈕權限組,判斷按鈕組的按鈕是否存在權限組里面,存在則true。不存在則false
152 export function btnPermissFun(btnList, permissList) {
153   for(let item in btnList){
154     let isPermiss = false
155     for(let pitem of permissList) {
156       if(item == pitem.code) {
157         isPermiss = true
158         break
159       }
160     }
161     btnList[item] = isPermiss
162   }
163   return btnList
164 }
165 
166 
167 // 字符串合並
168 export function strMergeCom(str1, str2){
169   if(str1== null) {
170     str1 = ''
171   }
172   if(str2 == null) {
173     str2 = ''
174   }
175   return `${str1}(${str2})`
176 }
177 
178 // 根據id,以及id的值,遍歷list對象,得出label
179 export function rstLabelFormID(list, id, label, idVal) {
180   let rsp = ''
181   for (let i = 0; i < list.length; i++) {
182     if (list[i][id] === idVal) {
183       rsp = list[i][label]
184       break
185     }
186   }
187   return rsp
188 }
189 // 根據id,以及id的值,遍歷list集合,得出對應的對象
190 export function rstListFormID(list, id, idVal) {
191   let rsp = undefined
192   for (let i = 0; i < list.length; i++) {
193     if (list[i][id] === idVal) {
194       rsp = list[i]
195       break
196     }
197   }
198   return rsp
199 }
200 // 根據id,label,以及id的值和label的值,遍歷list集合,得出對應的對象集合
201 // 此處是比對2個對象,過濾出包含的,類似於模糊搜索id或者名稱
202 export function rstListFormIDOrLabel(list, id,label, compVal) {
203   let newAry = []
204   for (let i = 0; i < list.length; i++) {
205     if (list[i][id].includes(compVal) || list[i][label].includes(compVal)) {
206       newAry.push(list[i])
207     }
208   }
209   return newAry
210 }
211 
212 // 遍歷obj已有的排序對象,對另一個對象進行排序
213 // compField表示兩個對象關聯的屬性,類似與外鍵
214 export function sortObjFromObj(sortObj, orgObj, compField = 'id') {
215   var arr = Object.keys(sortObj);
216   if(arr.length >0) { // 用於排序的不為空
217     let sortOrgObj = []
218     const newItemAry = []// 移除為空的項
219     for(let item of orgObj) {
220       sortOrgObj[(sortObj[item[compField]])-1] = item // 此處保存的數組,存在空值
221     }
222     for(let newItem of sortOrgObj) {
223       if(newItem) {
224         newItemAry.push(newItem)
225       }
226     }
227     return newItemAry
228   } else {
229     return orgObj
230   }
231 }
232 
233 // 判斷數據是否為空,為空的話返回指定的數值
234 export function isNullORFalse(checkVal,rstVal) {
235   if(checkVal == '' || checkVal == null || checkVal == undefined || typeof(checkVal) == undefined){
236     if(rstVal == null || rstVal == ''){
237       rstVal = "";
238     }
239     return rstVal;
240   } else {
241     return checkVal;
242   }
243 }
244 
245 // 判斷數組的每一項是否不為空,或者不為undefined。不為空的話,返回true;為空返回false
246 // 如果不為空,返回true
247 export function isNotNullObj(objAry) {
248   let isNull =  false
249   for(let item of objAry){
250     if(item != "" && item != null && item != undefined && typeof item != 'undefined') {
251       isNull = true
252       break
253     }
254   }
255   return isNull
256 }
257 
258 // 獲取的localstrage是否為空或者不存在,則轉為空數組[]
259 export function getNullLocalstrageToAry(str) {
260   if(str == null || typeof(str) == undefined ) {
261     return [];
262   } else{
263     return str;
264   }
265 }
266 
267 // 根據文件url,判斷是否指定的文件類型,返回bool值
268 // 定義視頻和圖片的文件后綴。通過這個后綴去判斷文件類型
269 const VIDEO_TYPE = ['mp4', 'ogg', 'webm','mkv'];
270 const IMAGE_TYPE = ['jpg', 'png', 'gif', 'webp', 'jpeg',];
271 export function isFileType(fileUrl,fileType) {
272   const fileTypeName = (fileUrl).substring(fileUrl.lastIndexOf('.') * 1 + 1 * 1);  // 獲取后綴名
273   // 文件后綴和兼容的格式,統一轉為小寫比對
274   const fileTypeNameLower = fileTypeName.toLowerCase();
275   if (fileType == 'image') {
276     let supportFormat = IMAGE_TYPE;
277     let index = supportFormat.indexOf(fileTypeNameLower);
278     if (index == -1) {  // 說明核實不符合
279       return false;
280     } else {
281       return true;
282     }
283   } else if (fileType == 'video') {
284     let supportFormat = VIDEO_TYPE;
285     let index = supportFormat.indexOf(fileTypeNameLower);
286     if (index == -1) {  // 說明核實不符合
287       return false;
288     } else {
289       return true;
290     }
291   }
292 }
293 // 當數值過大是,超過9位數(億)轉為億單位展示
294 export function rspHundredMill(val, unit = 'HM') {
295   if(unit == 'HM') {
296     if(val>100000000) { //大於1億
297       return (val/100000000).toFixed(3)+''
298     } else {
299       return  val
300     }
301   }
302 }
303 
304 // 全部替換
305 // str表示原字符串,s表示要被替換的內容,replaceStr用於替換的內容
306 export function repalceAll(str, s ,replaceStr = '') {
307   var reg = new RegExp(s, "g")//g,表示全部替換
308   return str.replace(reg,replaceStr)
309 }
310 
311 //計算兩個日期天數差的函數,通用,時間格式為yyyy-MM-dd格式
312 export function dateDiff(sDate1, sDate2) {  //sDate1和sDate2是yyyy-MM-dd格式
313   let aDate, oDate1, oDate2, iDays
314   aDate = sDate1.split("-")
315   oDate1 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0])  //轉換為yyyy-MM-dd格式
316   aDate = sDate2.split("-")
317   oDate2 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0])
318   iDays = parseInt(Math.abs(oDate1 - oDate2) / 1000 / 60 / 60 / 24) //把相差的毫秒數轉換為天數
319   return iDays;  //返回相差天數
320 }
321 
322 // 獲取當前時刻
323 // ymdhms表示返回年月日時分秒,ymd表示返回年月日,hms表示返回時分秒
324 export function curDateTime(type='ymdhms') {
325   function getNow(s) {
326     return s < 10 ? '0' + s : s
327   }
328   const myDate = new Date()
329 
330   const year = myDate.getFullYear() // 獲取當前年
331   const month = myDate.getMonth() + 1 * 1 // 獲取當前月
332   const date = myDate.getDate() // 獲取當前日
333 
334   const h = myDate.getHours() // 獲取當前小時數(0-23)
335   const m = myDate.getMinutes() // 獲取當前分鍾數(0-59)
336   const s = myDate.getSeconds()
337 
338   let now = year + '-' + getNow(month) + '-' + getNow(date) + ' ' + getNow(h) + ':' + getNow(m) + ':' + getNow(s)
339   if(type == 'ymd') {
340     now = year + '-' + getNow(month) + '-' + getNow(date)
341   } else if(type == 'hms') {
342     now = getNow(h) + ':' + getNow(m) + ':' + getNow(s)
343   }
344   return now
345 }
346 
347 // 獲取今天星期幾
348 export function getWeekFun() {
349   const weekDay = ['星期日','星期一','星期二','星期三','星期四','星期五','星期六']
350   let week = new Date().getDay();
351   return weekDay[week];
352 }
353 
354 // 查詢最近n年,n表示前多少年的意思
355 // 例如查詢近5年的時間,n=4,不包括今年的的前4年
356 export function getLastNYear(n) {
357   const myDate = new Date;
358   const curYear = myDate.getFullYear();
359   if(n =='' || n==undefined || n == null){
360     n =0;
361   }
362   let rstYear = curYear*1 - n*1;
363   return rstYear;
364 }
365 
366 // 查詢最近n月,n表示前多少月的意思
367 export function getLastNMonth(n) {
368   const myDate = new Date;
369   const curYear = myDate.getFullYear();
370   const curMonth = myDate.getMonth()+1; // 月份從0開始算起。需要加1
371   if(n =='' || n==undefined || n == null){n =0;}
372   let rstYear = '';
373   let rstMonth = '';
374   if(n>curMonth){ //表示去到去年的月份,年份需要去到上一年
375     rstYear = curYear*1-1*1;
376     rstMonth = 12-(n-curMonth)+1;
377   } else {
378     rstYear =curYear;
379     rstMonth = curMonth -n;
380   }
381   rstMonth = (rstMonth)>9?rstMonth:'0'+(rstMonth);
382   let rstYearMonth = rstYear + '-' + rstMonth;
383   return rstYearMonth;
384 }
385 
386 // 獲取最近n天的時間,n表示前多少天的意思。
387 // 例如查詢近7天的時間,n=6,不包括當天的的前6天
388 // fommatterb表示間隔符,例如:-,/
389 export function getLastNDate(n,fommatter ='-') {
390   const d = new Date();
391   var myDate=new Date(d.getTime()-86400000*n);  // 獲取前n天的日期
392   const year = myDate.getFullYear()>9?myDate.getFullYear():'0'+myDate.getFullYear();
393   const month = (myDate.getMonth() + 1)>9?myDate.getMonth() + 1:'0'+(myDate.getMonth() + 1);
394   const date = myDate.getDate()>9?myDate.getDate():'0'+myDate.getDate();
395   let last7Date = year + fommatter + month + fommatter + date;
396   return last7Date;
397 }
398 // 獲取最近的n個小時,n表示前多少小時的意思。
399 export function getLastNHour(n,fommatter ='-') {
400   const d = new Date();
401   var myDate=new Date(d.getTime()-86400000*n);  // 獲取前n天的日期
402   const year = myDate.getFullYear()>9?myDate.getFullYear():'0'+myDate.getFullYear();
403   const month = (myDate.getMonth() + 1)>9?myDate.getMonth() + 1:'0'+(myDate.getMonth() + 1);
404   const date = myDate.getDate()>9?myDate.getDate():'0'+myDate.getDate();
405   const h = myDate.getHours()>9?myDate.getHours():'0'+myDate.getHours();       //獲取當前小時數(0-23)
406   const m = myDate.getMinutes()>9?myDate.getMinutes():'0'+myDate.getMinutes();     //獲取當前分鍾數(0-59)
407   const s = myDate.getSeconds()>9?myDate.getSeconds():'0'+myDate.getSeconds();
408   let  nowTime = year + fommatter + month + fommatter + date + " " + h + fommatter + m + fommatter + s;
409   return nowTime;
410 }
411 
412 
413 // 搜索時間下拉框,快捷鍵
414 export const pickerOptionsTimeEle = [{
415   text: '今日',
416   onClick(picker) {
417     const end = new Date()
418     end.setTime(end.getTime())
419     end.setHours(end.getHours())
420     end.setMinutes(end.getMinutes())
421     end.setSeconds(end.getSeconds())
422     const start = new Date()
423     start.setTime(start.getTime())
424     start.setHours(0); start.setMinutes(0); start.setSeconds(0)
425     picker.$emit('pick', [start, end])
426   }
427 },
428 {
429   text: '近7天',
430   onClick(picker) {
431     const end = new Date()
432     end.setHours(23); end.setMinutes(59); end.setSeconds(59)
433     const start = new Date()
434     start.setTime(start.getTime() - 3600 * 1000 * 24 * 6)
435     start.setHours(0); start.setMinutes(0); start.setSeconds(0)
436     picker.$emit('pick', [start, end])
437   }
438 },
439 {
440   text: '近30天',
441   onClick(picker) {
442     const end = new Date()
443     end.setHours(23); end.setMinutes(59); end.setSeconds(59)
444     const start = new Date()
445     start.setHours(0); start.setMinutes(0); start.setSeconds(0)
446     start.setTime(start.getTime() - 3600 * 1000 * 24 * 29)
447     picker.$emit('pick', [start, end])
448   }
449 },
450 {
451   text: '昨天',
452   onClick(picker) {
453     const end = new Date()
454     end.setTime(end.getTime() - 3600 * 1000 * 24 * 1)
455     end.setHours(23); end.setMinutes(59); end.setSeconds(59)
456     const start = new Date()
457     start.setTime(start.getTime() - 3600 * 1000 * 24 * 1)
458     start.setHours(0); start.setMinutes(0); start.setSeconds(0)
459     picker.$emit('pick', [start, end])
460   }
461 },
462 {
463   text: '最近90天',
464   onClick(picker) {
465     const end = new Date()
466     end.setHours(23); end.setMinutes(59); end.setSeconds(59)
467     const start = new Date()
468     start.setHours(0); start.setMinutes(0); start.setSeconds(0)
469     start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
470     picker.$emit('pick', [start, end])
471   }
472 }]
473 
474 
475 export function getCurrWeekDays () {
476   let date=[];
477   let weekOfday = moment().format('E');//計算今天是這周第幾天
478   let start = moment().subtract(weekOfday-1, 'days').format('YYYY-MM-DD');//周一日期
479   let end= moment().add(7-weekOfday, 'days').format('YYYY-MM-DD');//周日日期
480   date.push(start)
481   date.push(end)
482   return date
483 }
484 export function getCurrMonthDays(){
485   let date = []
486   let start = moment().startOf('month').format('YYYY-MM-DD')
487   let end = moment().endOf('month').format('YYYY-MM-DD')
488   date.push(start)
489   date.push(end)
490   return date
491 }
492 // elementUI 時間范圍選擇器,數據格式轉換
493 // 時間范圍選擇,中國標准時間轉為yyyy-MM-dd HH:mm:ss.
494 export function standardTimeToYMDHMS(timeStr) {
495   if(timeStr == null || typeof(timeStr) == undefined ) {
496     return '';
497   } else{
498     return timeStr.getFullYear() + '-' +
499       ((timeStr.getMonth() + 1)>9?(timeStr.getMonth() + 1):'0'+(timeStr.getMonth() + 1)) + '-' +
500       (timeStr.getDate()>9?timeStr.getDate():'0'+timeStr.getDate()) + ' ' +
501       (timeStr.getHours()>9?timeStr.getHours():'0'+timeStr.getHours()) + ':' +
502       (timeStr.getMinutes()>9?timeStr.getMinutes():'0'+timeStr.getMinutes()) + ':' +
503       (timeStr.getSeconds()>9?timeStr.getSeconds():'0'+timeStr.getSeconds());
504   }
505 }
506 
507 // 用於數據庫管理,動態條件拼接
508 // 遍歷搜索條件,把時間范圍搜索的條件的參數拆分成min,max
509 // {fieldValue: ["2019-09-21 00:00:00", "2019-10-22 00:00:00"]}拆分成{min:'2019-09-21 00:00:00',max:'2019-10-22 00:00:00'}
510 // luoxm@2019-09-21
511 export function dataPackage(list) {
512   for(let i =0; i<list.length; i++) {
513     if(list[i]['javaType'] == 'datetime' && list[i]['fieldValue']) {
514       if(list[i]['fieldValue'].length>0 && list[i]['fieldValue'].length == 2) {
515         list[i]['min'] = list[i]['fieldValue'][0]
516         list[i]['max'] = list[i]['fieldValue'][1]
517         list[i]['fieldValue'] = undefined
518       }
519     }
520   }
521   return list
522 }
523 // 用於數據庫管理,動態條件拼接
524 // 和dataPackageshi是翻轉的一個操作
525 // 遍歷搜索條件,把min,max參數拼裝成時間范圍搜索的條件
526 // {min:'2019-09-21 00:00:00',max:'2019-10-22 00:00:00'}拼裝成{fieldValue: ["2019-09-21 00:00:00", "2019-10-22 00:00:00"]}
527 // luoxm@2019-09-21
528 export function dataPackageReverse(list) {
529   for(let i =0; i<list.length; i++) {
530     if(list[i]['javaType'] == 'datetime' && list[i]['min'] && list[i]['max']) {
531       list[i]['fieldValue'] = []
532       list[i]['fieldValue'].push(list[i]['min'])
533       list[i]['fieldValue'].push(list[i]['max'])
534       list[i]['min'] = undefined
535       list[i]['max'] = undefined
536     }
537   }
538   return list
539 }
540 
541 // 把后台返回的時間默認值,賦值到搜索條件上
542 export function setQryParam(list) {
543   for(let i =0; i<list.length; i++) {
544     if(list[i]['javaType'] == 'datetime' && list[i]['min'] && list[i]['max']) {
545       list[i]['fieldValue'] = []
546       list[i]['fieldValue'][0] = list[i]['min']
547       list[i]['fieldValue'][1] = list[i]['max']
548     }
549   }
550   return list
551 }
552 // 過濾掉javaType=feature的對象
553 export function paramNotFeatureFun(obj) {
554   let rspData = []
555   for(let item of obj) {
556     if(item.javaType != 'feature') {
557       rspData.push(item)
558     }
559   }
560   return rspData
561 }
562 // 用於數據庫管理,動態條件拼接,把閾值從【0,1】轉為【0-100】
563 export function similarExpand100(list) {
564   for(let item of list) {
565     if(item.javaType == 'feature') {
566       if(item.similar) {
567         item.similar = (item.similar * 100).toFixed(2)
568       }
569     }
570   }
571   return list
572 }
573 // 用於數據庫管理,動態條件拼接,把閾值從【0-100】轉為【0,1】
574 export function similarReduce100(list) {
575   for(let item of list) {
576     if(item.javaType == 'feature') {
577       if(item.similar) {
578         item.similar = (item.similar / 100).toFixed(4)
579       }
580     }
581   }
582   return list
583 }
584 // 用於數據庫管理,清空動態的搜索條件的filedValue字段數據
585 export function clearActiveQry(obj) {
586   for(let item of obj) {
587     if(item.javaType == 'datetime') {
588       item.min = undefined
589       item.max = undefined
590       item.fieldValue = ""
591     } else {
592       item.fieldValue = ""
593     }
594   }
595 }
596 
597 // 用戶數據庫管理,默認選擇左側第一個數據數據庫的菜單
598 export function getDBTreeItem(tree) {
599   let rspNode = []
600   const dataSor = tree
601   for (let i in dataSor) {
602     const item = dataSor[i]
603     if(item.dirType == 1) { // 表示數據庫,並返回
604       if(item.children && item.children.length>0) { // 有children,則遞歸找children的第一個數據庫
605         rspNode = [item.children[0],item.id]
606         break
607       } else {
608         continue// 既不是數據庫,也沒有子節點,則表示是一個目錄.不需要
609       }
610     }
611   }
612   return rspNode
613 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM