解析URL参数
/*
* 参数:
* url: [String] 解析的URL,可选,不传该值默认本地href
* 返回:
* obj:[Object] 参数集合对象
*/
function getQueryParam(url) {
const href = url || window.location.href;
let args = href.split('?');
// 没有参数直接返回{}
if (args[0] === href) {
return {};
}
var hrefarr = args[1].split('#')[0].split('&');
var obj = {};
for (var i = 0; i < hrefarr.length; i++) {
hrefarr[i] = hrefarr[i].split('=');
obj[hrefarr[i][0]] = hrefarr[i][1];
}
return obj;
}
解析身份证号码信息
/* 参数:
* IdCard: [String] 身份证号码
* type: [Number] 1/2/3
* 返回:
* type:1 => birthday [String] 出生日期
* type:2 => sex [Number] 性别
* type:3 => age [Number] 年龄
*/
formatIdCard (IdCard, type) {
if (type === 1) {
// 获取出生日期
var birthday = IdCard.substring(6, 10) + '-' + IdCard.substring(10, 12) '-' + IdCard.substring(12, 14)
return birthday
}
if (type === 2) {
// 获取性别
if (parseInt(IdCard.substr(16, 1)) % 2 === 1) {
return '1' // 男
} else {
return '2' // 女
}
}
if (type === 3) {
// 获取年龄
var ageDate = new Date()
var month = ageDate.getMonth() + 1
var day = ageDate.getDate()
var age = ageDate.getFullYear() - IdCard.substring(6, 10) - 1
if (IdCard.substring(10, 12) < month || IdCard.substring(10, 12) === mont&& IdCard.substring(12, 14) <= day) {
age++
}
if (age <= 0) {
age = 1
}
return age
}
}
获取图片base64
/* 参数:
* file {file object} 文件对象
* 返回:
* {Promise}
*/
async function imgToBase64 (file) {
return new Promise((resolve,reject) => {
const reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = e => {
resolve(e.target.result)
}
reader.onerror = err => {
reject(err)
}
})
}
base64解码
/* base64解码
* 优化中文乱码问题
* @param {String} b64Str 待解码的base64数据
* @returns {string}
*/
function b64ToUtf8(b64Str) {
return decodeURIComponent(window.atob(b64Str).split('').map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join(''))
}
// atob()解码不支持中文
// base64编码前先对中文URL转码
window.btoa(encodeURIComponent(str))
格式化日期
/* 参数:
* date: 时间戳 [Date]
* isTime: 是否返回具体时间 [Boolean]
* separator: 年月日分隔符 [String]
* 返回:
* isTime: false => yyyy-MM-dd [String]
* isTime: true => yyyy-MM-dd HH:mm:ss [String]
*/
const formatDate = (date, isTime = false, separator = '-') => {
const year = date.getFullYear()
const month = date.getMonth() + 1
const day = date.getDate()
let d = [year, month, day].map(_formatNumber).join(separator)
if (isTime) {
const hour = date.getHours()
const minute = date.getMinutes()
const second = date.getSeconds()
const time = [hour, minute, second].map(_formatNumber).join(':')
d = `${d} ${time}`
}
return d
}
const _formatNumber = n => {
n = n.toString()
return n[1] ? n : '0' + n
}
// padStart()补齐日期位数
formatDate() {
const date = new Date()
const year = date.getFullYear().toString().padStart(4, '0')
const month = (date.getMonth() + 1).toString().padStart(2, '0')
const day = date.getDate().toString().padStart(2, '0')
const result = `${year}-${month}-${day}`
return result
}
获取某日期若干个工作日后的日期
/* 参数:
* time: [String] 给定日期 yyyy-MM-dd
* itervalByDay: [Number] 相隔工作日
* separator: [String] 年月日分隔符
* 返回:
* rq:[String] 匹配的日期yyyy-MM-dd
*/
var getworkday = function(time, itervalByDay, separator = '-'){
var str = time.split("-");
var date = getDate();
date.setUTCFullYear(str[0], str[1] - 1, str[2]);
date.setUTCHours(0, 0, 0, 0);
var millisceonds =date.getTime();
for(var i = 1; i <= itervalByDay; i++){
millisceonds += 24 * 60 * 60 * 1000;
date.setTime(millisceonds);
// 如果是周末,计数i回退1,既跳过
if(date.getDay() == 0 || date.getDay() == 6) i--;
}
var year = date.getFullYear();
var month = (date.getMonth() + 1);
var day = date.getDate();
var rq = year + separator + month + separator + day;
return rq;
}
图片压缩
/* 原理: 把图片宽度、高度调小
* @param file {file object | file base64}
* @param {width, height}:压缩图片宽高
* @returns {Promise}
*
* Tip: 与imgToBase64()配合使用效果更佳
*/
async function imgToCompressed (file, {
width,
height
}) {
if (typeof file === 'object') {
file = await imgToBase64(file)
}
return new Promise(resolve => {
var image = new Image()
image.src = file
image.onload = () => {
const _width = image.width
const _height = image.height
const canvas = document.createElement('canvas')
const context = canvas.getContext('2d')
let data = ''
if (width && width > _width) {
width = _width
height = _height
} else {
// 等比例缩放
width = width || Math.floor(_width * height / _height)
height = height || Math.floor(width * _height / _width)
}
canvas.width = width
canvas.height = height
context.drawImage(image, 0, 0, width, height)
data = canvas.toDataURL('image/jpeg').replace('data:image/jpeg;base64,', '')
resolve(data)
}
})
}