@Bios
2018-12-10T08:44:10.000000Z
字数 11356
阅读 995
js
Array.prototype.distinct = function(){var arr = this;var len = this.length;var result = [];if (Set) { // Es6 语法return Array.from(new Set(arr));} else { // 循环比较,依次找出数组中独立的项for (var i = 0; i < len; i++) {for (var j = i + 1; j < len; j++){if (arr[i] === arr[j]) { // 1 和 '1'j = ++i;}}result.push(arr[i]);}return result;}}
isIos () {var u = navigator.userAgent;if (u.indexOf('Android') > -1 || u.indexOf('Linux') > -1) {//安卓手机// return "Android";return false} else if (u.indexOf('iPhone') > -1) {//苹果手机// return "iPhone";return true} else if (u.indexOf('iPad') > -1) {//iPad// return "iPad";return false} else if (u.indexOf('Windows Phone') > -1) {//winphone手机// return "Windows Phone";return false}else{return false}}
isPC () { //是否为PC端var userAgentInfo = navigator.userAgent;var Agents = ["Android", "iPhone","SymbianOS", "Windows Phone","iPad", "iPod"];var flag = true;for (var v = 0; v < Agents.length; v++) {if (userAgentInfo.indexOf(Agents[v]) > 0) {flag = false;break;}}return flag;}
browserType(){var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串var isOpera = userAgent.indexOf("Opera") > -1; //判断是否Opera浏览器var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera; //判断是否IE浏览器var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf("rv:11.0") > -1;var isEdge = userAgent.indexOf("Edge") > -1 && !isIE; //判断是否IE的Edge浏览器var isFF = userAgent.indexOf("Firefox") > -1; //判断是否Firefox浏览器var isSafari = userAgent.indexOf("Safari") > -1 && userAgent.indexOf("Chrome") == -1; //判断是否Safari浏览器var isChrome = userAgent.indexOf("Chrome") > -1 && userAgent.indexOf("Safari") > -1; //判断Chrome浏览器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 return "IE7以下"//IE版本过低}if (isIE11) return 'IE11';if (isEdge) return "Edge";if (isFF) return "FF";if (isOpera) return "Opera";if (isSafari) return "Safari";if (isChrome) return "Chrome";}
checkStr (str, type) {switch (type) {case 'phone': //手机号码return /^1[3|4|5|6|7|8][0-9]{9}$/.test(str);case 'tel': //座机return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str);case 'card': //身份证return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(str);case 'pwd': //密码以字母开头,长度在6~18之间,只能包含字母、数字和下划线return /^[a-zA-Z]\w{5,17}$/.test(str)case 'postal': //邮政编码return /[1-9]\d{5}(?!\d)/.test(str);case 'QQ': //QQ号return /^[1-9][0-9]{4,9}$/.test(str);case 'email': //邮箱return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str);case 'money': //金额(小数点2位)return /^\d*(?:\.\d{0,2})?$/.test(str);case 'URL': //网址return /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(str)case 'IP': //IPreturn /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(str);case 'date': //日期时间return /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(str) || /^(\d{4})\-(\d{2})\-(\d{2})$/.test(str)case 'number': //数字return /^[0-9]$/.test(str);case 'english': //英文return /^[a-zA-Z]+$/.test(str);case 'chinese': //中文return /^[\u4E00-\u9FA5]+$/.test(str);case 'lower': //小写return /^[a-z]+$/.test(str);case 'upper': //大写return /^[A-Z]+$/.test(str);case 'HTML': //HTML标记return /<("[^"]*"|'[^']*'|[^'">])*>/.test(str);default:return true;}
/*** 本地存储* @param {[type]} name [description]* @param {[type]} data [description]*/setStorage(name, data){let dataType = typeof data;// json对象if(dataType === 'object'){window.localStorage.setItem(name, JSON.stringify(data));}// 基础类型else if(['number','string','boolean'].indexOf(dataType) >= 0){window.localStorage.setItem(name, data);}// 其他不支持的类型else{alert('该类型不能用于本地存储');}}/*** 取出本地存储* @param {[type]} name [description]* @return {[type]} [description]*/getStorage(name){let data = window.localStorage.getItem(name);if(data){return JSON.parse(data);}else{return '';}}/*** 删除本地存储* @param {[type]} name [description]* @return {[type]} [description]*/removeStorage(name){window.localStorage.removeItem(name);}
const delay = timeout => {return new Promise((resolve, reject) => {setTimeout(() => reject('请求超时!'), timeout * 1000)})}/*** http请求* @param {[type]} options.url [请求地址]* @param {String} options.method [请求方法]* @param {Object} options.params [请求参数]* @param {[type]} timeout} [超时时间]* @return {[type]} [Promise]*/const httpReq = ({url,method = 'get',params = {}, timeout}) => {const paramArr = [];/*** var obj = {'a':'123','b':'345'};* console.log(Object.keys(obj)); //['a','b']*/if (Object.keys(params).length !== 0) {for (const key in params) {paramArr.push(`${key}=${params[key]}`);}}const urlStr = `${url}?${paramArr.join('&')}`; // get请求url拼接const body = paramArr.join('&'); // post请求body传参let options = {};options = {method: 'POST',headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8',},body: body}if (method.toLowerCase() === 'get'){if (timeout === undefined) {return fetch(urlStr)} else {// Promise.race当数组中有一个promise返回则返回,其余的不再执行。如果超时了就不执行了return Promise.race([fetch(urlStr), delay(timeout)])}} else if (method.toLowerCase() === 'post') {if (timeout === undefined) {return fetch(url,options)} else {return Promise.race([fetch(url,options), delay(timeout)])}} else {return new Promise((resolve,reject) => {resolve('不支持该请求!');})}}export { httpReq }
get请求参数的设置:
使用:

// import axios from "axios";//这样写打包的时候就不用切换开发环境和线上环境地址了// console.log(process.env.NODE_ENV) // 看config下面dev.env.js里面的NODE_ENV// const baseURL = process.env.NODE_ENV == 'development'?'https://cnodejs.org/api/v1':'线上环境地址'// export default axios.create({// //urlbase// baseURL,// //查询axios配置,可以设置全局请求头,全局拦截器(请求/响应)// });// ---------------------------------------------------------------------// https://www.cnblogs.com/libin-1/p/6607945.htmlimport axios from 'axios';import { Message } from 'element-ui';// import Vue from 'vue'// import router from 'vue-router'// Vue.use(router)axios.defaults.timeout = 5000;axios.defaults.baseURL ='https://cnodejs.org/api/v1';//http request 拦截器axios.interceptors.request.use(config => {//在发送请求之前做某事// 有的请求需要token验证,token一般存cookie,他就拿到 统一给所有请求加上token字段// const token = getCookie('名称');注意使用的时候需要引入cookie方法,推荐js-cookie// console.log("请求之前")// console.log(config)config.headers = {'Content-Type':'application/x-www-form-urlencoded'}// if(token){// config.params = {'token':token}// }return config;},err => {return Promise.reject(err);});//http response 拦截器axios.interceptors.response.use(response => {//对响应数据做些事// var responses = JSON.stringify(response);// if(response.status == 200){// // alert(123)// }else if(response.status == 404){// alert("找不到")// }// console.log(response)//登录机制--在某个页面,有时候用户没有登录 导致 请求里面没有携带登录所需要的验证机制 所以会返回一些特殊的状态码 约定好的,拦截到这样的状态码 可以给跳转操作,a跳槽到c 并且传参数告诉c 是我a传过去的,这样你登录完了 得知 是a跳转过来的// if(response.data.errCode == 2){// router.push({// path:"/HelloWorld",// querry:{redirect:router.currentRoute.fullPath}//从哪个页面跳转// })// }return response;},err => {//请求错误时做些事if (err && err.response) {switch (err.response.status) {case 400:err.message = '请求出错'breakcase 401:Message.warning({message: '授权失败,请重新登录'})store.commit('LOGIN_OUT')setTimeout(() => {window.location.reload()}, 1000)returncase 403:err.message = '拒绝访问'breakcase 404:err.message = '请求错误,未找到该资源'breakcase 500:err.message = '服务器端出错'break}} else {err.message = '连接服务器失败'}Message.error({message: err.message})// return Promise.resolve(err);return Promise.reject(err)});/** 封装get方法* @param url* @param data* @returns {Promise}*/export function fetch(url,params={}){return new Promise((resolve,reject) => {axios.get(url,{params:params}).then(response => {resolve(response.data);}).catch(err => {reject(err)})})}/** 封装post请求* @param url* @param data* @returns {Promise}*/export function post(url,data = {}){return new Promise((resolve,reject) => {axios.post(url,data).then(response => {resolve(response.data);},err => {reject(err)})})}/** 封装patch请求* @param url* @param data* @returns {Promise}*/export function patch(url,data = {}){return new Promise((resolve,reject) => {axios.patch(url,data).then(response => {resolve(response.data);},err => {reject(err)})})}/** 封装put请求* @param url* @param data* @returns {Promise}*/export function put(url,data = {}){return new Promise((resolve,reject) => {axios.put(url,data).then(response => {resolve(response.data);},err => {reject(err)})})}
export default class ArrayUtils {/*** 更新数组,若item已存在则将其从数组中删除,若不存在则将其添加到数组* **/static updateArray(array,item){for (var i = 0, len = array.length; i < len; i++) {var temp = array[i];if (item=== temp) {array.splice(i, 1);return;}}array.push(item);}/*** 判断两个数组的是否相等* @return boolean true 数组长度相等且对应元素相等* */static isEqual(arr1,arr2){if(!(arr1&&arr2))return false;if(arr1.length!=arr2.length)return false;for(let i=0,l=arr1.length;i<l;i++){if (arr1[i]!=arr2[i])return false;}return true;}/*** clone 数组* @return Array 新的数组* */static clone(from){if(!from)return [];let newArray=[];for(let i=0,l=from.length;i<l;i++){newArray[i]=from[i];}return newArray;}/*** 将数组中指定元素移除* **/static remove(array,item){if (!array)return;for(var i=0,l=array.length;i<l;i++){if (item===array[i])array.splice(i,1);}}}
Array.prototype.equals = function (array) {// if the other array is a falsy value, returnif (!array)return false;// compare lengths - can save a lot of timeif (this.length != array.length)return false;for (var i = 0, l = this.length; i < l; i++) {// Check if we have nested arraysif (this[i] instanceof Array && array[i] instanceof Array) {// recurse into the nested arraysif (!this[i].equals(array[i]))return false;}else if (this[i] != array[i]) {// Warning - two different object instances will never be equal: {x:20} != {x:20}return false;}}return true;}
function p(s) {return s < 10 ? '0' + s: s;}//创建、格式化时间函数var younger_time = function(time) {var time = new Date(time);var year = time.getFullYear();var month = time.getMonth() + 1; // 月份是从0-11var day = time.getDate();//格式化时间var str = year + '-' + p(month) + '-' + p(day);//写入时间格式为 xxxx-xx-xxconsole.log(str);}
function timestampFormat( timestamp ) {function zeroize( num ) {return (String(num).length == 1 ? '0' : '') + num;}var curTimestamp = parseInt(new Date().getTime() / 1000); //当前时间戳var timestampDiff = curTimestamp - timestamp; // 参数时间戳与当前时间戳相差秒数var curDate = new Date( curTimestamp * 1000 ); // 当前时间日期对象var tmDate = new Date( timestamp * 1000 ); // 参数时间戳转换成的日期对象var Y = tmDate.getFullYear(), m = tmDate.getMonth() + 1, d = tmDate.getDate();var H = tmDate.getHours(), i = tmDate.getMinutes(), s = tmDate.getSeconds();if ( timestampDiff < 60 ) { // 一分钟以内return "刚刚";} else if( timestampDiff < 3600 ) { // 一小时前之内return Math.floor( timestampDiff / 60 ) + "分钟前";} else if ( curDate.getFullYear() == Y && curDate.getMonth()+1 == m && curDate.getDate() == d ) {return '今天' + zeroize(H) + ':' + zeroize(i);} else {var newDate = new Date( (curTimestamp - 86400) * 1000 ); // 参数中的时间戳加一天转换成的日期对象if ( newDate.getFullYear() == Y && newDate.getMonth()+1 == m && newDate.getDate() == d ) {return '昨天' + zeroize(H) + ':' + zeroize(i);} else if ( curDate.getFullYear() == Y ) {return zeroize(m) + '月' + zeroize(d) + '日 ' + zeroize(H) + ':' + zeroize(i);} else {return Y + '年' + zeroize(m) + '月' + zeroize(d) + '日 ' + zeroize(H) + ':' + zeroize(i);}}}
export default function(time) {if (time == undefined) return ''let hours = parseInt(time / (60 * 60)),minutes = parseInt((time % (60 * 60)) / 60),seconds = parseInt(time % 60)return `${hours}小时${minutes}分钟${seconds}秒`}
/*** 回到顶部* @return {[type]} [description]*/scrollTop(){let timer = setInterval(() => {let top = document.body.scrollTop || document.documentElement.scrollTop;let speed = Math.ceil(top / 5);document.body.scrollTop = top - speed;if (top === 0) {clearInterval(timer);}}, 20)}
function loadImg(src){let promise = new Promise(function (resolve, reject) {let img = document.createElement('img')img.onload = function () {resolve(img)}img.onerror = function () {reject('图片加载失败')}img.src = src})return promise}
export function deepClone(source) {if (!source && typeof source !== 'object') {throw new Error('error arguments', 'shallowClone')}const targetObj = source.constructor === Array ? [] : {}for (const keys in source) {if (source.hasOwnProperty(keys)) {if (source[keys] && typeof source[keys] === 'object') {targetObj[keys] = source[keys].constructor === Array ? [] : {}targetObj[keys] = deepClone(source[keys])} else {targetObj[keys] = source[keys]}}}return targetObj}