vue项目封装的有用的公共方法集合
1、数据类型判断以及判断是否为数字类型或者数字型字符串
-
//万能型方法
-
function typeOf(obj) {
-
const toString = Object.prototype.toString
-
const 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 Object]': 'object'
-
}
-
return map[toString.call(obj)]
-
}
-
//简单性
-
function isNumber(obj) {
-
return obj === obj
-
}
-
-
function isNull(arg1) {
-
return !!(!arg1 && arg1 !== 0 && typeof arg1 !== 'boolean')
-
}
-
-
function isString(obj) {
-
return obj === obj ''
-
}
-
function isBoolean(obj) {
-
return obj === !!obj
-
}
-
-
function isObject(obj) {
-
return typeof obj === 'object'
-
}
-
-
/**
-
* 判断检测的字符是否为数字或者是数字类型的字符串,比如123,123.45,'123','123.45', -123,-123.45,'-123','-123.45'均返回true
-
* @param val 检测的字符
-
* @returns {Boolean} 如果是返回true,不是返回false
-
*/
-
function ifTurnToNumber(val) {
-
var regPos = /^\d (\.\d )?$/ // 非负浮点数
-
var regNeg = /^(-(([0-9] \.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9] )|([0-9]*[1-9][0-9]*)))$/ // 负浮点数
-
if (regPos.test(val) || regNeg.test(val)) {
-
return true
-
} else {
-
return false
-
}
-
}
2、如果是IE浏览器return 返回的就是true
-
function checkIE() {
-
return (
-
'-ms-scroll-limit' in document.documentElement.style &&
-
'-ms-ime-align' in document.documentElement.style
-
)
-
}
-
-
//如果是IE浏览器,返回的就是true
3、深拷贝
-
/**
-
* @desc 深拷贝,结构化拷贝,支持string,number,date,reg等格式,不支持function拷贝
-
* @param {Any} obj
-
* @param {WeakMap} hash
-
* @return {Any}
-
*/
-
-
function deepClone(obj, hash = new WeakMap()) {
-
if (obj == null || typeof obj !== 'object') return obj
-
let cloneObj
-
const Constructor = obj.constructor
-
switch (Constructor) {
-
case RegExp:
-
cloneObj = new Constructor(obj)
-
break
-
case Date:
-
cloneObj = new Constructor(obj.getTime())
-
break
-
default:
-
if (obj._isAMomentObject) {
-
cloneObj = new Constructor(obj)
-
}
-
if (hash.has(obj)) return hash.get(obj)
-
cloneObj = new Constructor()
-
hash.set(obj, cloneObj)
-
// //console.log(2, hash.get(obj))
-
}
-
for (const key in obj) {
-
// //console.log(3, key, cloneObj)
-
cloneObj[key] = isObject(obj[key]) ? deepClone(obj[key], hash) : obj[key]
-
// //console.log(4, key, cloneObj[key])
-
}
-
return cloneObj
-
}
4、数组去重
-
/*
-
* JSON数组去重
-
* @param: [array] json Array
-
* @param: [string] 唯一的key名,根据此键名进行去重
-
*/
-
function uniqueArray(array, key) {
-
var result = [array[0]]
-
for (var i = 1; i < array.length; i ) {
-
var item = array[i]
-
var repeat = false
-
for (var j = 0; j < result.length; j ) {
-
if (item[key] == result[j][key]) {
-
repeat = true
-
break
-
}
-
}
-
if (!repeat) {
-
result.push(item)
-
}
-
}
-
return result
-
}
-
-
/**
-
* 两个数组去重
-
* @param {Array} originList 原始数组
-
* @param {Array} currentList 当前数组
-
* @param {String} sortKey 去重字段
-
* @return {Array} 返回新数组中不重复的部分
-
*/
-
function Duplicate(originList, currentList, sortKey = 'id') {
-
const map = {}
-
originList.forEach(e => {
-
map[e[sortKey]] = true
-
})
-
return currentList.filter(e => !map[e[sortKey]])
-
}
-
-
// 数组包数组去重
-
function unique(arr) {
-
arr = arr.filter(item => item.every(item => item)) // 去除[0,0]
-
for (let i = 0, len = arr.length; i < len; i ) {
-
for (let j = i 1, len = arr.length; j < len; j ) {
-
if (JSON.stringify(arr[i]) === JSON.stringify(arr[j])) {
-
arr.splice(j, 1)
-
j-- // 每删除一个数j的值就减1
-
len-- // j值减小时len也要相应减1(减少循环次数,节省性能)
-
// console.log(j,len)
-
}
-
}
-
}
-
return arr
-
}
-
-
/**
-
* 数组元素为对象的去重方法 ES5方法
-
* @param arr 原数组
-
* @param type 根据元素的某个属性进行去重
-
* @returns {Array} 返回去重后的新的数组
-
*/
-
function Es5duplicate(arr, type) {
-
var newArr = []
-
var tArr = []
-
if (arr.length == 0) {
-
return arr
-
} else {
-
if (type) {
-
for (var i = 0; i < arr.length; i ) {
-
if (!tArr[arr[i][type]]) {
-
newArr.push(arr[i])
-
tArr[arr[i][type]] = true
-
}
-
}
-
return newArr
-
} else {
-
for (var j = 0; j < arr.length; j ) {
-
if (!tArr[arr[j]]) {
-
newArr.push(arr[j])
-
tArr[arr[j]] = true
-
}
-
}
-
return newArr
-
}
-
}
-
}
-
-
/**
-
* 数组元素为对象的去重方法 ES6方法
-
* @param arr 原数组
-
* @param type 根据元素的某个属性进行去重
-
* @returns {Array} 返回去重后的新的数组
-
*/
-
function Es6duplicate(arr, type) {
-
var hash = {}
-
return arr.reduce(function(item, next) {
-
hash[next[type]] ? '' : hash[next[type]] = true && item.push(next)
-
return item
-
}, [])
-
}
5、对象合并,仅支持一层
-
/**
-
* 合并两个map ,仅支持一层
-
* @param {*} map1
-
* @param {*} map2
-
*/
-
function mergeMap(map1, map2) {
-
for (const key in map2) {
-
if (map1.hasOwnProperty(key)) {
-
Object.assign(map1[key], map2[key])
-
} else {
-
map1[key] = map2[key]
-
}
-
}
-
return map1
-
}
6、保留任意位小数
-
/**
-
* 保留任意位小数
-
* @param {*} num 实际数字
-
* @param {*} decimal 保留位数
-
*/
-
function keepAnyDecimal(num, decimal = 2) {
-
const level = Math.pow(10, decimal)
-
var result = parseFloat(num)
-
if (isNaN(result)) {
-
return ''
-
}
-
result = Math.round(num * level) / level
-
return result
-
}
7、树形对象数组遍历查询
-
/**
-
* 树形对象数组遍历查询
-
* @param {String} code 遍历字段key
-
* @param {String} val 遍历字段value
-
* @param {Array} arr 遍历数组
-
* @return {Object} 遍历得到的对象
-
*/
-
function findCode(arr, code, val) {
-
const list = getList(arr)
-
return list.find(e => e[code] === val)
-
}
-
-
function getList(list, total = []) {
-
list.forEach(e => {
-
total.push(e)
-
if (e.children) {
-
getList(e.children, total)
-
}
-
})
-
return total
-
}
-
-
function getChildNode(node, nodes, code, children = 'coverages') {
-
if (node != null) {
-
nodes.push(node)
-
const childrens = node[children]
-
? node[children]
-
: node.children
-
? node.children
-
: []
-
for (let i = 0; i < childrens.length; i ) {
-
getChildNode(childrens[i], nodes)
-
}
-
}
-
return nodes.find(e => e.key == code)
-
}
8、判断字节长度
-
/**
-
*判断字节长度
-
* @param {String} val
-
* @return {Number} 字符串长度
-
*/
-
function getByteLen(val) {
-
// 传入一个字符串
-
if (!val) return false
-
let len = 0
-
for (var i = 0; i < val.length; i ) {
-
if (val[i].match(/[^\x00-\xff]/gi) != null) {
-
// 全角
-
len = 2
-
} else {
-
len = 1
-
} // 如果是全角,占用两个字节
-
}
-
return len
-
}
9、正则校验相关
-
/**
-
* 名称校验规则
-
* @param {String} str 获取输入的名称
-
* @return {Boolean} 返回是否校验通过 true为通过, false为不通过
-
*/
-
function nameRexp(str, required = true) {
-
if (!required) {
-
return {
-
status: true
-
}
-
}
-
if (!str) {
-
return {
-
message: '用户名不能为空',
-
status: false
-
}
-
}
-
str = str.trim()
-
// 校验特殊字符
-
// let special = /[^~!@#$%\^&* |}{"::<>?\/;''\[\]\\=`]$/;
-
// let special = partyPersonNameNewReg;
-
// if (!special.test(str)) {
-
// return {
-
// message: "录入结果应不包含特殊字符,请重新录入。",
-
// status: false
-
// };
-
// }
-
str = str.replace(/[\r\n]/g, '')
-
if (getByteLen(str) < 3) {
-
return {
-
message: '请输入3个字节以上的长度',
-
status: false
-
}
-
}
-
// 判断是否含有数字,有数字 校验拦截
-
const Num = /[0-9]/
-
if (Num.test(str)) {
-
return {
-
message: '名称不允许含有数字',
-
status: false
-
}
-
}
-
// 校验是否为全中文
-
const ZH = new RegExp('[\\u4E00-\\u9FFF] $', 'g')
-
if (ZH.test(str)) {
-
// 当输入值为全中文时,校验是否有空格
-
if (str.indexOf(' ') != -1) {
-
return {
-
message: '名称为全中文时中间不允许含有空格',
-
status: false
-
}
-
} // 有空格
-
}
-
return {
-
status: true
-
}
-
}
-
-
/**
-
* 身份证检验规则
-
* @param {String} IDCard 获取输入的身份证号码
-
* @return {Boolean} 返回是否校验通过 true为通过, false为不通过
-
*/
-
function idCard(IDCard) {
-
// 身份证地区
-
const areaID = {
-
11: '北京',
-
12: '天津',
-
13: '河北',
-
14: '山西',
-
15: '内蒙古',
-
21: '辽宁',
-
22: '吉林',
-
23: '黑龙江',
-
31: '上海',
-
32: '江苏',
-
33: '浙江',
-
34: '安徽',
-
35: '福建',
-
36: '江西',
-
37: '山东',
-
41: '河南',
-
42: '湖北',
-
43: '湖南',
-
44: '广东',
-
45: '广西',
-
46: '海南',
-
50: '重庆',
-
51: '四川',
-
52: '贵州',
-
53: '云南',
-
54: '西藏',
-
61: '陕西',
-
62: '甘肃',
-
63: '青海',
-
64: '宁夏',
-
65: '新疆',
-
71: '台湾',
-
81: '香港',
-
82: '澳门',
-
91: '国外'
-
}
-
// 41072119780706355X
-
// var iSum = 0
-
if (!/^\d{17}(\d|x)$/i.test(IDCard)) {
-
return {
-
status: false,
-
message: '你输入的身份证长度或格式错误!'
-
}
-
}
-
IDCard = IDCard.replace(/x$/i, 'a')
-
if (areaID[parseInt(IDCard.substr(0, 2))] == null) {
-
return {
-
status: false,
-
message: '你的身份证地区非法!'
-
}
-
}
-
var sBirthday =
-
IDCard.substr(6, 4)
-
'-'
-
Number(IDCard.substr(10, 2))
-
'-'
-
Number(IDCard.substr(12, 2))
-
var d = new Date(sBirthday.replace(/-/g, '/'))
-
if (
-
sBirthday !=
-
d.getFullYear() '-' (d.getMonth() 1) '-' d.getDate()
-
) {
-
return {
-
status: false,
-
message: '身份证上的出生日期非法!'
-
}
-
}
-
// for (var i = 17; i >= 0; i--)
-
// iSum = (Math.pow(2, i) % 11) * parseInt(IDCard.charAt(17 - i), 11)
-
// if (iSum % 11 != 1)
-
// return {
-
// status: false,
-
// message: '你输入的身份证号非法!'
-
// }
-
// aCity[parseInt(sId.substr(0,2))] "," sBirthday "," (sId.substr(16,1)%2?"男":"女");//此次还可以判断出输入的身份证号的人性别
-
return {
-
status: true,
-
message: '校验成功!'
-
}
-
}
-
-
/**
-
* 根据身份证获取性别
-
* @param {String} idCard 获取输入的身份证号码
-
* @return {String} 返回性别 {男, 女}
-
*/
-
function IDCardSex(idCard) {
-
var sexMap = {
-
0: '女',
-
1: '男'
-
}
-
if (idCard && idCard.length === 15) {
-
return sexMap[idCard.substring(14, 15) % 2]
-
} else if (idCard && idCard.length === 18) {
-
return sexMap[idCard.substring(16, 17) % 2]
-
} else {
-
// 不是15或者18,null
-
return 'error'
-
}
-
}
-
-
/**
-
* 校验比例输入 (输入为数字且在0-100之内)
-
* @param {String Number} num 输入的比例值
-
* @return {Boolean} 校验是否通过 true:通过 / false:未通过
-
*/
-
function propNum(num) {
-
const regExp = /^(?:[1-9]?\d|100)$/
-
if (regExp.test(num)) {
-
return true
-
} else {
-
return false
-
}
-
}
-
-
/**
-
* 校验输入的年龄 (输入为数字且在0-120之内)
-
* @param {String Number} num 输入的年龄
-
* @return {Boolean} 校验是否通过 true:通过 / false:未通过
-
*/
-
function ageRexp(num) {
-
const rexp = /^(?:[1-9][0-9]?|1[01][0-9]|120)$/
-
if (rexp.test(num)) {
-
return true
-
} else {
-
return false
-
}
-
}
-
-
/**
-
* 联系电话校验
-
* @param {String Number} num 录入的号码(手机号或者固定电话)
-
* @return {Boolean} 校验是否通过 true:通过 / false:未通过
-
*/
-
function TelphoneNumber(num) {
-
const str = num.toString()
-
// 手机号校验正则
-
const tel = /^1([358][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}$/
-
// 固定电话校验正则 (不含区号)
-
const rexp = /\d{3}-\d{8}|\d{4}-\d{7}/
-
if (!str.length) return false
-
// //console.log(str.includes('-'))
-
if (str.includes('-')) {
-
const bool = rexp.test(str)
-
return bool
-
} else {
-
const bool = tel.test(str)
-
return bool
-
}
-
}
-
-
// 检查特殊字符
-
function specialCharactersCheck(str) {
-
const pattern = new RegExp(
-
"[`%~!@#$^&=|{}':'\\[\\].<>/?~!@#¥\\\\……&——|{}【】‘:”“'。、?]"
-
)
-
if (!str) return false
-
const flag = Array.from(str).some(item => pattern.test(item))
-
if (flag) return false
-
return true
-
}
-
-
// 下划线转换驼峰
-
function toHump(name) {
-
return name.replace(/\_(\w)/g, function(all, letter) {
-
return letter.toUpperCase()
-
})
-
}
-
// 驼峰转换下划线
-
function toLine(name) {
-
return name.replace(/([A-Z])/g, '_$1').toLowerCase()
-
}
-
-
// 检查特殊字符
-
function specialCharactersCheck(str) {
-
const pattern = new RegExp(
-
"[`%~!@#$^&=|{}':'\\[\\].<>/?~!@#¥\\\\……&——|{}【】‘:”“'。、?]"
-
)
-
if (!str) return false
-
const flag = Array.from(str).some(item => pattern.test(item))
-
if (flag) return false
-
return true
-
}
10、判断两个对象的值是否相等
-
// 判断两个对象的值是否相等
-
function diffObject(obj1, obj2) {
-
const keys1 = Object.keys(obj1)
-
const keys2 = Object.keys(obj2)
-
// console.log(JSON.stringify(keys1), "keys1");
-
// console.log(JSON.stringify(keys2), "keys2");
-
if (keys1.length !== keys2.length) {
-
// //console.log(keys1.length);
-
// //console.log(keys2.length);
-
// //
-
return false
-
} else {
-
for (const key in obj1) {
-
if (!obj2.hasOwnProperty(key)) {
-
return false
-
}
-
// 类型相同
-
if (typeof obj1[key] === typeof obj2[key]) {
-
// 同为引用类型
-
if (typeof obj1[key] === 'object' && typeof obj2[key] === 'object') {
-
if (obj1[key] !== null && obj2[key] !== null) {
-
const equal = diffObject(obj1[key], obj2[key])
-
if (!equal) {
-
// console.log(key, obj1[key], obj2[key]);
-
// //
-
return false
-
}
-
}
-
}
-
// 同为基础数据类型
-
if (
-
typeof obj1[key] !== 'object' &&
-
typeof obj2[key] !== 'object' &&
-
obj1[key] !== obj2[key]
-
) {
-
// console.log(key, obj1[key], obj2[key]);
-
// //
-
return false
-
}
-
} else {
-
// console.log(key, obj1[key], obj2[key]);
-
if (
-
(obj1[key] === null && obj2[key] === undefined) ||
-
(obj2[key] === null && obj1[key] === undefined)
-
) {
-
// 如果值为null和undefind则认为是相等的
-
return true
-
}
-
// //
-
return false
-
}
-
}
-
}
-
return true
-
}
11、接口返回的是对象,转换成数组
-
/**
-
*
-
* 数据字典接口返回的是对象
-
* 将对象转为数组[{code: '', value: []}] 结构
-
*/
-
function objTransArray(obj) {
-
const arr = []
-
if (typeOf(obj) !== 'object') {
-
return false
-
} else {
-
for (const [key, value] of Object.entries(obj)) {
-
arr.push({ code: key, name: value })
-
}
-
return arr
-
}
-
}
12、数组元素为对象,根据元素的某个属性分类
-
/**
-
* 数组根据某个属性分组
-
* @param {*} list 需要分组的数组
-
* @param {*} groupId 需要分组的数组的属性
-
* @return {Array} list
-
*/
-
function arrayGroupBy(list, groupId) {
-
const sorted = groupBy(list, function(item) {
-
return [item[groupId]]
-
})
-
return sorted
-
}
-
function groupBy(arr, fn) {
-
const groups = {}
-
arr.forEach(function(val) {
-
var group = JSON.stringify(fn(val))
-
groups[group] = groups[group] || []
-
groups[group].push(val)
-
})
-
return Object.keys(groups).map(function(group) {
-
return groups[group]
-
})
-
}
13、和日期有关
-
/**
-
*获取当前日期
-
* @param {*} type 返回数据的类型 是否包含 具体哪一天
-
*/
-
function currentDate(type) {
-
var myDate = new Date()
-
var tYear = myDate.getFullYear()
-
var tMonth = myDate.getMonth()
-
var m = tMonth 1
-
if (m.toString().length == 1) {
-
m = '0' m
-
}
-
if (type === 'yearMonth') {
-
return tYear '-' m
-
}
-
if (type === 'yearMonthDay') {
-
var tDay = myDate.getDate()
-
if (tDay.toString().length == 1) {
-
tDay = '0' tDay
-
}
-
return tYear '-' m '-' tDay
-
}
-
}
-
/**
-
*获取几个月前的输入日期
-
*@param {*} date 输入日期(YYYY-MM-DD)
-
*@param {*} monthNum 需要获取传入日期之前的月数
-
*@param {*} type 返回数据的类型 是否包含 具体哪一天
-
*@return {string} string
-
*/
-
function getPreMonthDay(date, monthNum, type) {
-
var dateArr = date.split('-')
-
var year = dateArr[0] // 获取当前日期的年份
-
var month = dateArr[1] // 获取当前日期的月份
-
var day = dateArr[2] // 获取当前日期的日
-
// var days = new Date(year, month, 0)
-
// days = days.getDate() // 获取当前日期中月的天数
-
var year2 = year
-
var month2 = parseInt(month) - monthNum
-
if (month2 <= 0) {
-
var absM = Math.abs(month2)
-
year2 = parseInt(year2) - Math.ceil(absM / 12 == 0 ? 1 : parseInt(absM) / 12)
-
month2 = 12 - (absM % 12)
-
}
-
var day2 = day // 传入的date的日
-
var days2 = new Date(year2, month2, 0).getDate() // 获取到的月份的最后一天日
-
if (day2 > days2) {
-
day2 = days2
-
}
-
if (month2 < 10) {
-
month2 = '0' month2
-
}
-
if (type) {
-
return year2 '-' month2
-
}
-
return year2 '-' month2 '-' day2
-
}
-
/**
-
*获取下几个月的输入日期
-
*@param {*} date 输入日期(YYYY-MM-DD)
-
*@param {*} monthNum 需要获取传入日期下几个月的月数
-
*@return {string} string
-
*/
-
function getNextMonthDay(date, monthNum, type) {
-
var dateArr = date.split('-')
-
var year = dateArr[0] // 获取当前日期的年份
-
var month = dateArr[1] // 获取当前日期的月份
-
var day = dateArr[2] // 获取当前日期的日
-
// var days = new Date(year, month, 0)
-
// days = days.getDate() // 获取当前日期中的月的天数
-
var year2 = year
-
var month2 = parseInt(month) parseInt(monthNum)
-
if (month2 > 12) {
-
year2 = parseInt(year2) parseInt((parseInt(month2) / 12 == 0 ? 1 : parseInt(month2) / 12))
-
month2 = parseInt(month2) % 12
-
}
-
var day2 = day // 传入的date的日
-
var days2 = new Date(year2, month2, 0).getDate() // 获取到的月份的最后一天日
-
if (day2 > days2) {
-
day2 = days2
-
}
-
if (month2 < 10) {
-
month2 = '0' month2
-
}
-
if (type) {
-
return year2 '-' month2
-
}
-
return year2 '-' month2 '-' day2
-
}
-
/**
-
* 获取当前旬的前pre旬和后next旬
-
* @param {*} pre 当前旬的前pre旬
-
* @param {*} next 当前旬的后next旬
-
* @param {*} currentXun 当前旬
-
* @returns {Array} 当前pre旬和当前旬,加上当前旬的后next旬的数组
-
*/
-
function getFrontAndBackXun(pre, next, currentXun) {
-
// 获取echart的x轴时间范围,当前月份的前三个月和后两个月时间
-
const preTimeRange = []
-
let currentTimeRange = []
-
const nextTimeRange = []
-
const allDateArr = []
-
currentTimeRange = [1, 2, 3].map(item => {
-
return currentDate('yearMonth') '-' item
-
})
-
for (let i = Math.ceil(pre / 3); i > 0; i--) {
-
preTimeRange.push([1, 2, 3].map(item => getPreMonthDay(currentDate('yearMonth'), i, 'yearMonth') '-' item))
-
}
-
for (let i = 1; i < Math.ceil(next / 3) 1; i ) {
-
nextTimeRange.push([1, 2, 3].map(item => getNextMonthDay(currentDate('yearMonth'), i, 'yearMonth') '-' item))
-
}
-
[...preTimeRange, ...currentTimeRange, ...nextTimeRange].forEach(item => {
-
if (typeOf(item) === 'array') {
-
item.forEach(e => { allDateArr.push(e) })
-
} else {
-
allDateArr.push(item)
-
}
-
})
-
let checkedMonthRange = []
-
const index = allDateArr.findIndex(item => item === currentXun)
-
// 始终保持当前旬的前pre旬和后next旬
-
checkedMonthRange = allDateArr.slice(index - pre, index next 1)
-
return checkedMonthRange
-
}
-
/**
-
* 计算两个日期之间的天数
-
* @param dateString1 开始日期 yyyy-MM-dd
-
* @param dateString2 结束日期 yyyy-MM-dd
-
* @returns {number} 如果日期相同 返回一天 开始日期大于结束日期,返回0
-
*/
-
function getDaysBetween(dateString1, dateString2) {
-
var startDate = Date.parse(dateString1)
-
var endDate = Date.parse(dateString2)
-
if (startDate > endDate) {
-
return 0
-
}
-
if (startDate == endDate) {
-
return 1
-
}
-
var days = (endDate - startDate) / (1 * 24 * 60 * 60 * 1000)
-
return days
-
}
-
/**
-
* 时间控件按月份统计 开始日期为当月的第一天 结束日期为当月的最后一天
-
* @param date 日期区间 [yyyy-MM, yyyy-MM]
-
* @returns {Array} 返回 [yyyy-MM-dd, yyyy-MM-dd]
-
*/
-
function exportDateRange(date) {
-
const datertArr = date[0].split('-')
-
const start = datertArr[0] '-' datertArr[1] '-' '01'
-
const endArr = date[1].split('-')
-
const end = endArr[0] '-' endArr[1] '-' new Date(endArr[0], endArr[1], 0).getDate()
-
return [start, end]
-
}
-
-
/**
-
* 获取两个时间日期之间所有的日期
-
* @param stime 开始日期
-
* @param etime 结束日期
-
* @returns {Array} 返回所有时间组成的数组
-
*/
-
function getdiffdate(stime, etime) {
-
// 初始化日期列表,数组
-
const diffdate = []
-
let i = 0
-
// 开始日期小于等于结束日期,并循环
-
while (stime <= etime) {
-
diffdate[i] = stime
-
// 获取开始日期时间戳
-
const stime_ts = new Date(stime).getTime()
-
// console.log('当前日期:' stime '当前时间戳:' stime_ts)
-
// 增加一天时间戳后的日期
-
const next_date = stime_ts (24 * 60 * 60 * 1000)
-
// 拼接年月日,这里的月份会返回(0-11),所以要 1
-
const next_dates_y = new Date(next_date).getFullYear() '-'
-
const next_dates_m = (new Date(next_date).getMonth() 1 < 10) ? '0' (new Date(next_date).getMonth() 1) '-' : (new Date(next_date).getMonth() 1) '-'
-
const next_dates_d = (new Date(next_date).getDate() < 10) ? '0' new Date(next_date).getDate() : new Date(next_date).getDate()
-
stime = next_dates_y next_dates_m next_dates_d
-
// 增加数组key
-
i
-
}
-
return diffdate
-
}
-
-
/**
-
* 获取该日期在当年第几周
-
* @param date 测算时间
-
* @returns {Number} 返回当年的第几周
-
*/
-
function weekOfYear(date) {
-
const year = date.split('-')[0]
-
const month = date.split('-')[1]
-
const day = date.split('-')[2]
-
let date1 = new Date(year, 0, 1)
-
let date2 = new Date(year, month - 1, day, 1)
-
const dayMS = 24 * 60 * 60 * 1000
-
// 每周从周一开始 8
-
const firstDay = (8 - date1.getDay()) * dayMS
-
const weekMS = 7 * dayMS
-
date1 = date1.getTime()
-
date2 = date2.getTime()
-
return Math.ceil((date2 - date1 - firstDay) / weekMS) 1
-
}
-
/**
-
* 获取当前日期前后N天的日期
-
* @param dayCount 前后的天数
-
* @returns {String} 返回具体的日期
-
*/
-
function getDateStr(dayCount) {
-
var today = new Date()
-
today.setDate(today.getDate() dayCount) // 获取AddDayCount天后的日期
-
var y = today.getFullYear()
-
var m = (today.getMonth() 1) < 10 ? '0' (today.getMonth() 1) : (today.getMonth() 1) // 获取当前月份的日期,不足10补0
-
var d = today.getDate() < 10 ? '0' today.getDate() : today.getDate() // 获取当前几号,不足10补0
-
return y '-' m '-' d
-
}
-
-
/**
-
* 普通日期时间格式转换
-
* @param val 原日期时间
-
* @param type 转换成的类型
-
* @returns {String} 换换成对应的日期格式
-
*/
-
function changeMonth(val, type) {
-
const month = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
-
if (val) {
-
if (!type) { // 不传类型 默认转换成 日-月
-
const arr = parseTime(val, '{m}-{d}').split('-')
-
return `${arr[1]}-${month[ arr[0] - 1]}`
-
}
-
if (type === 'mdhi') { // 转换成 月-日 时:分
-
const arr = parseTime(val, '{m}-{d} {h}:{i}').split(' ') // 月 天 时 分
-
const dateArr = arr[0].split('-')
-
return `${dateArr[1]}-${month[ dateArr[0] - 1]} ${arr[1]}`
-
}
-
if (type === 'm') { // 转换成 月
-
const arr = val.split('-')
-
return `${month[ arr[1] - 1]}`
-
}
-
if (/^sem/.test(type)) {
-
const arr = val.split('-')
-
const y = arr[0] // 年
-
const m = arr[1] // 月
-
const x = arr[2] // 旬
-
if (x == 1) {
-
return '01-10/' month[ m - 1] (type.includes('y') ? '/' y : '')
-
} else if (x == 2) {
-
return '11-20/' month[ m - 1] (type.includes('y') ? '/' y : '')
-
} else {
-
return '21-' new Date(y, m, 0).getDate() '/' month[ m - 1] (type.includes('y') ? '/' y : '')
-
}
-
}
-
}
-
return ''
-
}
-
/**
-
* 月份转换 数字<=>英文缩写
-
* @param val 需要转换的月份值
-
* @param type 转换成的类型
-
* @returns {String} 转换成对应的月份格式
-
*/
-
function translateMonth(val, type) {
-
const enMonth = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
-
const numMonth = { 'Jan': '01', 'Feb': '02', 'Mar': '03', 'Apr': '04', 'May': '05', 'Jun': '06', 'Jul': '07', 'Aug': '08', 'Sep': '09', 'Oct': '10', 'Nov': '11', 'Dec': '12' }
-
switch (type) {
-
case 'toEn': // 转换成英文缩写
-
return `${enMonth[ val - 1]}`
-
case 'toNum': // 转换成数字月份
-
return `${numMonth[val]}`
-
}
-
}
-
-
/**
-
* 根据当年当月第几旬获取的日期范围 2021-07-3 => {startDate: 2021-07-21, endDate: 2021-07-31}
-
* @param year 年份
-
* @param month 月份
-
* @param decade 旬
-
* @returns {String} 返回补0后的结果或者直接返回
-
*/
-
function decadeToDate(year, month, decade) {
-
switch (decade) {
-
case 1:
-
return {
-
startDate: year '-' month '-' '01',
-
endDate: year '-' month '-' '10'
-
}
-
case 2:
-
return {
-
startDate: year '-' month '-' '11',
-
endDate: year '-' month '-' '20'
-
}
-
case 3:
-
return {
-
startDate: year '-' month '-' '21',
-
endDate: year '-' month '-' new Date(year, month, 0).getDate()
-
}
-
}
-
}
-
/**
-
* 根据当前日期中的‘日’翻译成处于第几旬
-
* @param day 日
-
* @returns {Number} 返回第几旬
-
*/
-
function getDecade(day) {
-
if (day < 11) {
-
return 1
-
} else if (day < 21) {
-
return 2
-
} else {
-
return 3
-
}
-
}
-
/**
-
* 根据传入的日期范围获取所有的日期 按旬 或者按月
-
* @param range 日期范围
-
* @param type 返回的类型 按旬 还是按月
-
* @returns {Array} 返回所有的传入日期范围之内的日期
-
*/
-
function getDateRange(range, type) {
-
const formatManthRange = []
-
let arr = []
-
// 拿到时间日期的所有值,对月份不是两位数的月份进行前面补'0'操作
-
const monthRange = getMonthBetween(range).map(item => {
-
if (item.split('-')[1].length < 2) {
-
return item.split('-')[0] '-' '0' item.split('-')[1]
-
} else {
-
return item
-
}
-
})
-
if (type == 0) {
-
// 每个月按三旬组合而成的数组当成另一个数组的元素
-
arr = monthRange.map(item => {
-
return [1, 2, 3].map(sonItem => item '-' sonItem)
-
})
-
arr.forEach(item => {
-
if (typeOf(item) === 'array') {
-
item.forEach(e => {
-
formatManthRange.push(e)
-
})
-
} else {
-
formatManthRange.push(item)
-
}
-
})
-
return formatManthRange
-
} else {
-
return monthRange
-
}
-
}
-
/**
-
* 根据传入的日期范围获取所有的日期 处理年份是否同一年或者跨度是否大于一年
-
* @param dateRange 日期范围
-
* @returns {Array} 返回所有的传入日期范围之内的日期
-
*/
-
// 根据时间日期控件的时间设置好横坐标时间日期范围区间
-
function getMonthBetween(dateRange) {
-
const result1 = []
-
const result2 = []
-
const result3 = []
-
let result = []
-
const start = dateRange[0].split('-')
-
const end = dateRange[1].split('-')
-
if (start[0] < end[0]) { // 如果开始时间日期的年份和结束时间日期的年份 不是 同一年
-
for (let i = start[1]; i < 13; i ) {
-
result1.push(start[0] '-' i)
-
}
-
for (let i = 1; i <= end[1]; i ) {
-
result2.push(end[0] '-' i)
-
}
-
if ( end[0] - start[0] > 1) {
-
// 证明相差不只一年
-
for (let i = start[0] 1; i < end[0] - start[0]; i ) {
-
for (let j = 1; j < 13; j ) {
-
result3.push(i '-' j)
-
}
-
}
-
}
-
result = [...result1, ...result3, ...result2]
-
} else { // 如果开始时间日期的年份和结束时间日期的年份 是 同一年
-
for (let i = start[1]; i <= end[1]; i ) {
-
result.push(start[0] '-' i)
-
}
-
}
-
return result
-
}
-
/**
-
* 获取当前月份的前后几个月的日期
-
* @param before 前几个月
-
* @param after 后几个月
-
* @returns {Array} 返回所有的日期范围
-
*/
-
function getMonthBeAfRange(before, after) {
-
const arr = []
-
let recentTimeRange = []
-
const preTimeRange = []
-
const nextTimeRange = []
-
// 获取echart的x轴时间范围,当前月份的前三个月和后两个月时间
-
recentTimeRange = [1, 2, 3].map(item => {
-
return currentDate('yearMonth') '-' item
-
})
-
for (let i = before; i > 0; i--) {
-
preTimeRange.push([1, 2, 3].map(item => getPreMonthDay(currentDate('yearMonth'), i, 'yearMonth') '-' item))
-
}
-
for (let i = 1; i < after 1; i ) {
-
nextTimeRange.push([1, 2, 3].map(item => getNextMonthDay(currentDate('yearMonth'), i, 'yearMonth') '-' item))
-
}
-
[...preTimeRange, ...recentTimeRange, ...nextTimeRange].forEach(item => {
-
if (typeOf(item) === 'array') {
-
item.forEach(e => {
-
arr.push(e)
-
})
-
} else {
-
arr.push(item)
-
}
-
})
-
return arr
-
}
-
-
/**
-
* Parse the time to string
-
* @param {(Object|string|number)} time
-
* @param {string} cFormat
-
* @returns {string | null}
-
*/
-
export function parseTime(time, cFormat) {
-
if (arguments.length === 0) {
-
return null
-
}
-
if (!time) {
-
return null
-
}
-
const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
-
let date
-
if (typeof time === 'object') {
-
date = time
-
} else {
-
if ((typeof time === 'string') && (/^[0-9] $/.test(time))) {
-
time = parseInt(time)
-
}
-
if ((typeof time === 'number') && (time.toString().length === 10)) {
-
time = time * 1000
-
}
-
date = new Date(time)
-
}
-
const formatObj = {
-
y: date.getFullYear(),
-
m: date.getMonth() 1,
-
d: date.getDate(),
-
h: date.getHours(),
-
i: date.getMinutes(),
-
s: date.getSeconds(),
-
a: date.getDay()
-
}
-
const time_str = format.replace(/{([ymdhisa]) }/g, (result, key) => {
-
const value = formatObj[key]
-
// Note: getDay() returns 0 on Sunday
-
if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] }
-
return value.toString().padStart(2, '0')
-
})
-
return time_str
-
}
14、元素为对象的数组根据元素对象某个属性排序
-
/**
-
* 元素为对象的数组根据元素对象某个属性排序
-
* @param arr 原数组
-
* @param prop 原数组的元素的某个属性
-
* @param orderByType 按倒序还是顺序
-
* @returns {Array} 返回排好序的数组
-
*/
-
function arrayObjSort(arr, prop, orderByType) {
-
return arr.sort(compare(prop, orderByType))
-
}
-
function compare(prop, orderByType) {
-
return function(obj1, obj2) {
-
var val1 = obj1[prop]
-
var val2 = obj2[prop]
-
if (!isNaN(Number(val1)) && !isNaN(Number(val2))) {
-
val1 = Number(val1)
-
val2 = Number(val2)
-
}
-
switch (orderByType) {
-
// 倒序
-
case 'desc':
-
if (val1 > val2) {
-
return -1
-
} else if (val1 < val2) {
-
return 1
-
} else {
-
return 0
-
}
-
// 升序
-
case 'asc':
-
if (val1 < val2) {
-
return -1
-
} else if (val1 > val2) {
-
return 1
-
} else {
-
return 0
-
}
-
}
-
}
-
}
15、下载文件接口封装
-
/**
-
* 下载文件
-
* @param {data} 相关下载的数据
-
* @param {name} 下载文件的名字
-
*/
-
export function downloadFile(data, name, suffix) {
-
const url = window.URL.createObjectURL(data)
-
const link = document.createElement('a')
-
link.style.display = 'none'
-
link.href = url
-
const fileName = name
-
link.setAttribute('download', fileName)
-
document.body.appendChild(link)
-
link.click()
-
URL.revokeObjectURL(link.href)
-
document.body.removeChild(link)
-
}
-
16、导出文件
封装的导出方法如下
-
async function exportFile(type, params) {
-
await commonExport({ exportType: type, queryConds: JSON.stringify(params) }).then(res => {
-
if (res.data) {
-
const name = res.headers['content-disposition'] ? decodeURI(res.headers['content-disposition'].split(';')[1].split('filename=')[1].replace(/\"/gi, '')) : new Date() '.xls'
-
if (!name) {
-
this.$message.error('Download error')
-
return false
-
}
-
const url = window.URL.createObjectURL(res.data)
-
const link = document.createElement('a')
-
link.style.display = 'none'
-
link.href = url
-
link.setAttribute('download', name)
-
document.body.appendChild(link)
-
link.click()
-
URL.revokeObjectURL(link.href)
-
document.body.removeChild(link)
-
}
-
})
-
}
其中的commonExport方法如下
-
export function commonExport(params) {
-
return downHttp.get('/common/export', { params })
-
}
-
-
同接口封装的axios调用类似
上面的downHttp如下
-
import axios from 'axios'
-
// import { Message, MessageBox } from 'element-ui'
-
import store from '@/store'
-
import { getToken } from '@/utils/auth'
-
-
// function getSaveQueryFlag() {
-
// const cookieArr = String(document.cookie).split(';')
-
// cookieArr.forEach((item, index) => {
-
// if (item.includes('Admin-Token')) {
-
// cookieArr.splice(index, 1)
-
// }
-
// })
-
// return cookieArr.join(',')
-
// }
-
/**
-
* 下载导出专用
-
*/
-
const downHttp = axios.create({
-
responseType: 'blob',
-
baseURL: process.env.VUE_APP_BASE_API,
-
timeout: 60 * 1000 // request timeout
-
})
-
downHttp.interceptors.request.use(
-
config => {
-
if (store.getters.token) {
-
// config.headers['saveQueryFlag'] = getSaveQueryFlag()
-
config.headers['Authorization'] = getToken()
-
}
-
return config
-
},
-
error => {
-
return Promise.reject(error)
-
}
-
)
-
downHttp.interceptors.response.use(response => {
-
if (response.status === 200) return response
-
})
-
-
export default downHttp
导出文件需要后端配合,里面调用的后端的接口,返回不是json格式数据,这里的方法仅供参考
这样调用
exportFile('cargoList', params)
cargoList这个字符串为同后端约定的,params为调用的获取后台数据接口的参数
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhhaeegj
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13