开发常用方法记录

目录

获取数据类型

深拷贝

格式化金额

图片压缩

获取随机16进制颜色

证件号脱敏

uniapp小程序开发u-toast封装

获取身份证有效期限

 文件视频下载

银行卡手机号添加空格

div获取焦点和失去焦点问题

金额数字转成成大写汉子

判断是否IE浏览器(包括Edge浏览器)


获取数据类型

    getType() {
      var obj = Array.prototype.shift.apply(arguments);
      var toString = Object.prototype.toString;
      var map = {
        "[object Boolean]": "boolean",
        "[object Number]": "number",
        "[object String]": "string",
        "[object Function]": "function",
        "[object Array]": "array",
        "[object Date]": "date",
        "[object RegExp]": "regExp",
        "[object Undefined]": "undefined",
        "[object Null]": "null",
        "[object Map]": "map",
        "[object Object]": "object"
      };
      if (obj instanceof Element) {
        return "element";
      }
      return map[toString.call(obj)];
    },

    // 调用
    var type = this.getType(data);

深拷贝

deepClone() {
      var data = Array.prototype.shift.apply(arguments);
      var type = this.getType(data);
      var obj;
      if (type === "array") {
        obj = [];
        for (var i = 0, len = data.length; i < len; i++) {
          obj.push(this.deepClone(data[i]));
        }
      } else if (type === "object") {
        obj = {};
        for (var key in data) {
          obj[key] = this.deepClone(data[key]);
        }
      } else if (type === "map") {
        obj = new Map();
        data.forEach((item, key) => {
          obj.set(key, this.deepClone(item));
        });
      } else {
        return data;
      }
      return obj;
    },

格式化金额

/**
 * 格式化金额
 * 1000 => '1000.00'
 */
export const moneyFormat = x => {
  let f = parseFloat(x)
  if (isNaN(f)) {
    return 0.0
  }
  f = Math.round(x * 100) / 100
  let s = f.toString()
  let rs = s.indexOf('.')
  if (rs < 0) {
    rs = s.length
    s += '.'
  }
  while (s.length <= rs + 2) {
    s += '0'
  }
  return s
}

/**
 * 10000 => "10,000"
 */
export const toThousandFilter = num => {
  return (+num || 0)
    .toString()
    .replace(/^-?\d+/g, m => m.replace(/(?=(?!\b)(\d{3})+$)/g, ','))
}
/**
 * 大数值转换为万,亿函数
 *
 * @param {Number} 大数
 * @param {Number} 保留几位小数
 */
export const numConversion = (num, point = 2) => {
  const numStr = num.toString().split('.')[0] // 去掉小数点后的数值字符串
  const numLen = numStr.length
  if (numLen < 6) {
    return numStr
  } else if (numLen >= 6 && numLen <= 8) {
    const decimal = numStr.substring(numLen - 4, numLen - 4 + point)
    const res = parseInt(num / 10000) + '.' + decimal + '万'
    return res
  } else if (numLen > 8) {
    const decimal = numStr.substring(numLen - 8, numLen - 8 + point)
    const res = parseInt(num / 100000000) + '.' + decimal + '亿'
    return res
  }
}
/**
 * 大金额转换
 * @param {*} money 金额
 * @returns 
 */
export function formatMoney (money) {
    if (money !== undefined && money !== null && money !== ''){
        let s
        let m = parseFloat(money);
        if (m < 10000){
            s = '元';
        } else if (m >= 10000 && m < 100000000){
            s = '万元';
            m = m / 10000;
        } else {
            s = '亿';
            m = m / 100000000;
        }
        let result = m.toFixed(`${m}`.includes('.') ? 2 : 0) + s;
        return result;
    } else {
        return '/';
    }
}

图片压缩

需安装 lrz:npm i lrz

import lrz from 'lrz'

/**
 * 图片压缩
 *
 * @export
 * @param {*} file 通过 input:file 得到的文件,或者直接传入图片路径
 * @param {number} [width=1200] 图片最大不超过的宽度,默认为1200
 * @param {number} [height=1200] 同上
 * @param {number} [quality=0.7] 图片压缩质量,取值 0 - 1,默认为0.7
 * @returns 返回值是一个promise对象
 * rst.formData 后端可处理的数据
 * rst.file 压缩后的file对象(默认已经丢在rst.formData有一份了),需要注意的是如果压缩率太低的话,这个会是原始的file对象
 * rst.fileLen 生成后的图片的大小,后端可以通过此值来校验是否传输完整
 * rst.base64 生成后的图片base64,后端可以处理此字符串为图片,也直接用于img.src = base64
 * rst.base64Len 生成后的base64的大小,后端可以通过此值来校验是否传输完整 (如果采用base64上传方式)
 * rst.origin 也就是原始的file对象,里面存了一些原始文件的信息,例如大小,日期等。
 *
 */
export default async function compress(file, width = 1200, height = 1200, quality = 0.7) {
  return await lrz(file, { width, height, quality })
}

获取随机16进制颜色

/**
 * 随机16进制颜色 hexColor
 * return  string str 带#号的随机16进制颜色
 */
export const hexColor = () => {
  let str = '#'
  const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F']
  for (let i = 0; i < 6; i++) {
    const index = Number.parseInt(Math.random() * 16)
    str += arr[index]
  }
  return str
}

证件号脱敏

export const stringEncrypt = (str) => {
  if (!str) return
  const len = str.length
  if (len < 8) return str
  const center = str.slice(4, len - 4)
  const b = center.replace(/\w/gi, '*')
  str = str.slice(0, 4) + b + str.slice(len - 4, len)
  return str
}

uniapp小程序开发u-toast封装

export const uUnits= {
  uToast({ refs, msg, zIndex = 10079}) {
    let platForm = ""
    // #ifdef H5
    platForm = "H5"
    // #endif
    let tipRef = null
    if (platForm === 'H5') {
      tipRef = this.$refs[refs]
    } else {
      tipRef = this.$children.find(item => item.$options.name === 'u-toast')
    }
    tipRef.show({
      message: msg || '',
      duration: 2000,
      zIndex: zIndex
    })
  }
}
// 调用
uUnits.uToast.call(this, {
	refs: 'tipRef',
	msg: '报名成功',
})

获取身份证有效期限

/**
 * 计算身份证有效期限
 * @param {*} idCardNo 身份证号
 * @param {*} startTime 身份证有效期开始日期
 */
function getRightSpanTime(idCardNo,startTime) {
	let valid = 5;
	const year = +idCardNo.substring(6, 10);
	const month = +idCardNo.substring(10,12);
	const day = +idCardNo.substring(12,14);
	// 领证年份
	const getLiceDate = new Date(startTime.replace(/-/g,'/'));
	const getLiceYear = getLiceDate.getFullYear();
	const getLiceMonth = getLiceDate.getMonth() + 1;
	const getLiceDay = getLiceDate.getDate();
	// 领证年龄(领证年龄取整岁)
	let getLicenseAge = getLiceYear - year;
	if(getLiceMonth < month) {
		getLicenseAge--
	} else if(getLiceMonth === month) {
		if(getLiceDay < day) {
			getLicenseAge--
		}
	}
	/* 年龄小于16,有效期5年
    年龄大于等于16,小于等于25,有效期10年
    年龄大于等于26,小于等于45,有效期20年
    年龄大于等于46,长期 */
	if(getLicenseAge < 0) {
		valid = 0;
	} else if(getLicenseAge < 16) {
		valid = 5;
	} else if(getLicenseAge >= 16 && getLicenseAge <=25) {
		valid = 10;
	} else if(getLicenseAge >= 26 && getLicenseAge <= 45) {
		valid = 20;
	} else {
		// 长期
		valid = 21
	}
	return valid
}


// 获取身份证表单起止时间间隔
function getIDFormTimeSpan(startTime,endTime) {
	let year;
	const sTime = startTime.replace(/-/g,'/');
	const eTime = endTime.replace(/-/g,'/');
	let sYear = new Date(sTime).getFullYear();
	let eYear = new Date(eTime).getFullYear();
	let sMonth = new Date(sTime).getMonth() + 1;
	let eMonth = new Date(eTime).getMonth() + 1;
	let sDay = new Date(sTime).getDate();
	let eDay = new Date(eTime).getDate();
	year = eYear - sYear;
	// 计算年间距后,保证月份日期相等
	const IsEquel = sMonth === eMonth && sDay === eDay;
	return {year,IsEquel}
}

 文件视频下载

/**
 * 下载文件
 * @param res 必传,服务端返回的响应
 * @param fileName 生成文件名称,可不传,使用响应头content-disposition设置
 * @param type 文件媒体类型,可匹配默认值,也可传其他值
 */
export const downloadFile = function({ res, fileName, type }) {
  // find more in https://www.iana.org/assignments/media-types/media-types.xhtml
  const mimeTypeMap = {
    doc: 'application/msword',
    pdf: 'application/pdf',
    excel: 'application/vnd.ms-excel'
  }

  let name = fileName
  const contentDisposition = res.response.headers['content-disposition']
  if (!fileName && contentDisposition) {
    name = decodeURIComponent(contentDisposition.replace(/attachment;\s?filename=/g, ''))
  }

  const typeVale = mimeTypeMap[type] || type
  const blob = new Blob([res], { typeVale })

  if ('download' in document.createElement('a')) {
    const link = document.createElement('a')
    link.download = name
    link.style.display = 'none'
    link.href = URL.createObjectURL(blob)
    document.body.appendChild(link)
    link.click()
    URL.revokeObjectURL(link.href)
    document.body.removeChild(link)
  } else {
    navigator.msSaveBlob(blob, name)
  }
}
// 根据video 播放链接下载视频
// 如果跨域需前端配置proxy代理解决跨域问题
downloadVideo(url, fileName) {
      // 下载跨域代理使用 /downloadApi
      // document.execCommand 另存为api
      let link = document.createElement("a");
      link.style.display = "none";
      document.body.appendChild(link);
      // 使用XMLHttpRequest下载视频
      let xhr = new XMLHttpRequest();
      xhr.open("GET", url, true);
      xhr.responseType = "blob";
      xhr.onload = function () {
        console.log(xhr, "xhr=========");
        if (xhr.status === 200) {
          // 将视频Blob对象创建一个临时URL
          let url = window.URL.createObjectURL(xhr.response);
          // 设置a标签的属性,并触发点击事件进行下载
          link.href = url;
          link.download = fileName;
          link.click();
          // 释放URL对象
          window.URL.revokeObjectURL(url);
          document.body.removeChild(link);
        }
      };
      xhr.send();
    },

银行卡手机号添加空格

// 银行卡号
// 添加空格
card.replace(/\s/g, '').replace(/[^\d]/g, '').replace(/(\d{4})(?=\d)/g, '$1 ');
// 取消空格
card.replace(/[, ]/g,'')

// 手机号
// 添加空格
phone.replace(/\D/g,'').replace(/^/,'$& ').replace(/....(?!$)/g,'$& ')

div获取焦点和失去焦点问题

默认情况下 div 标签是没有获得焦点 focus() 和失去焦点 blur() 事件的。

如果想要 div 可以拥有这两个事件,可以给 div 标签加上 tabindex="-1" 属性,如下:

<div tabindex="-1">...</div>

这样就可以给 div 加上焦点事件了。

同理,利用tabindex="-1" 也可以给其他不支持焦点事件的标签添加焦点事件。

金额数字转成成大写汉子

function numToChinese(money) {
                // 汉字的数字
                var cnNums = new Array('零', '壹', '贰', '叁', '肆', '伍', '陆',
                    '柒', '捌', '玖');
                // 基本单位
                var cnIntRadice = new Array('', '拾', '佰', '仟');
                // 对应整数部分扩展单位
                var cnIntUnits = new Array('', '万', '亿', '兆');
                // 对应小数部分单位
                var cnDecUnits = new Array('角', '分', '毫', '厘');
                // 整数金额时后面跟的字符
                var cnInteger = '整';
                // 整型完以后的单位
                var cnIntLast = '元';
                // 最大处理的数字
                var maxNum = 999999999999999.9999;
                // 金额整数部分
                var integerNum;
                // 金额小数部分
                var decimalNum;
                // 输出的中文金额字符串
                var chineseStr = '';
                // 分离金额后用的数组,预定义
                var parts;
                if (money == '') {
                    return '';
                }
                money = parseFloat(money);
                if (money >= maxNum) {
                    // 超出最大处理数字
                    return '';
                }
                if (money == 0) {
                    chineseStr = cnNums[0] + cnIntLast + cnInteger;
                    return chineseStr;
                }
                // 转换为字符串
                money = money.toString();
                if (money.indexOf('.') == -1) {
                    integerNum = money;
                    decimalNum = '';
                } else {
                    parts = money.split('.');
                    integerNum = parts[0];
                    decimalNum = parts[1].substr(0, 4);
                }
                // 获取整型部分转换
                if (parseInt(integerNum, 10) > 0) {
                    var zeroCount = 0;
                    var IntLen = integerNum.length;
                    for (var i = 0; i < IntLen; i++) {
                        var n = integerNum.substr(i, 1);
                        var p = IntLen - i - 1;
                        var q = p / 4;
                        var m = p % 4;
                        if (n == '0') {
                            zeroCount++;
                        } else {
                            if (zeroCount > 0) {
                                chineseStr += cnNums[0];
                            }
                            // 归零
                            zeroCount = 0;
                            chineseStr += cnNums[parseInt(n)]
                                + cnIntRadice[m];
                        }
                        if (m == 0 && zeroCount < 4) {
                            chineseStr += cnIntUnits[q];
                        }
                    }
                    chineseStr += cnIntLast;
                }
                // 小数部分
                if (decimalNum != '') {
                    var decLen = decimalNum.length;
                    for (let i = 0; i < decLen; i++) {
                        let n = decimalNum.substr(i, 1);
                        if (n != '0') {
                            chineseStr += cnNums[Number(n)] + cnDecUnits[i];
                        }
                    }
                }
                if (chineseStr == '') {
                    chineseStr += cnNums[0] + cnIntLast + cnInteger;
                } else if (decimalNum == '') {
                    chineseStr += cnInteger;
                }
                return chineseStr;
            }

判断是否IE浏览器(包括Edge浏览器)

//判断是否是IE浏览器,包括Edge浏览器
      function IEVersion() {
        var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
        var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1; //判断是否IE浏览器
        var isEdge = userAgent.indexOf("Windows NT 6.1; Trident/7.0;") > -1 && !isIE; //判断是否IE的Edge浏览器
        if (isIE) {
          var reIE = new RegExp("MSIE (\\d+\\.\\d+);");
          reIE.test(userAgent);
          var fIEVersion = parseFloat(RegExp["$1"]);
          if (fIEVersion == 7) {
            return "IE7";
          } else if (fIEVersion == 8) {
            return "IE8";
          } else if (fIEVersion == 9) {
            return "IE9";
          } else if (fIEVersion == 10) {
            return "IE10";
          } else if (fIEVersion == 11) {
            return "IE11";
          } else {
            return "0";
          } //IE版本过低
        } else if (isEdge) {
          return "Edge";
        } else {
          return "-1"; //非IE
        }
      }
      if (IEVersion() == "IE7" || IEVersion() == "IE8" || IEVersion() == "IE9" || IEVersion() == "0") {
        setTimeout(function () {
          // 浏览器版本过低的提示页面
          location.href = "http://60.205.164.169/TMS-WEB/NotSupport";
        });
      }

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值