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 }