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 }