import { log } from 'mathjs'; import JSEncrypt from './jsencrypt'; import { ACCESSTOKEN, config } from '@/common/config.js' let publicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCTREknOkrusbeH7kBe3mSw4AwVT438IWmX/jKmcvYxaAWRrBJiMl7gk37L78HBG/ZstLLcdKBYYdj/5cvVWDQfv+uxbv/piZhOmQej98jWIXEA8aFEk724nFRJ7nfcEhHSWfzbTfgZw0KDO1mWdjWHnHIx/MtD0HIFFIyzg3aO7wIDAQAB'; //校验银行卡号 export function verifyBankCard(str) { //银行卡号长度在16到19之间 if (str.length < 16 || str.length > 19) { return false; } var num = /^\d*$/; if (!num.exec(str)) { //银行卡号必须全为数字; return false; } //开头6位 var strBin = "10,18,30,35,37,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,58,60,62,65,68,69,84,87,88,94,95,98,99"; if (strBin.indexOf(str.substring(0, 2)) == -1) { //银行卡号开头6位不符合规范 return false; } var lastNum = str.substr(str.length - 1, 1); //取出最后一位(与luhm进行比较) var first15Num = str.substr(0, str.length - 1); //前15或18位 var newArr = new Array(); for (var i = first15Num.length - 1; i > -1; i--) { //前15或18位倒序存进数组 newArr.push(first15Num.substr(i, 1)); } var arrJiShu = new Array(); //奇数位*2的积 <9 var arrJiShu2 = new Array(); //奇数位*2的积 >9 var arrOuShu = new Array(); //偶数位数组 for (var j = 0; j < newArr.length; j++) { if ((j + 1) % 2 == 1) { //奇数位 if (parseInt(newArr[j]) * 2 < 9) arrJiShu.push(parseInt(newArr[j]) * 2); else arrJiShu2.push(parseInt(newArr[j]) * 2); } else //偶数位 arrOuShu.push(newArr[j]); } var jishu_child1 = new Array(); //奇数位*2 >9 的分割之后的数组个位数 var jishu_child2 = new Array(); //奇数位*2 >9 的分割之后的数组十位数 for (var h = 0; h < arrJiShu2.length; h++) { jishu_child1.push(parseInt(arrJiShu2[h]) % 10); jishu_child2.push(parseInt(arrJiShu2[h]) / 10); } var sumJiShu = 0; //奇数位*2 < 9 的数组之和 var sumOuShu = 0; //偶数位数组之和 var sumJiShuChild1 = 0; //奇数位*2 >9 的分割之后的数组个位数之和 var sumJiShuChild2 = 0; //奇数位*2 >9 的分割之后的数组十位数之和 var sumTotal = 0; for (var m = 0; m < arrJiShu.length; m++) { sumJiShu = sumJiShu + parseInt(arrJiShu[m]); } for (var n = 0; n < arrOuShu.length; n++) { sumOuShu = sumOuShu + parseInt(arrOuShu[n]); } for (var p = 0; p < jishu_child1.length; p++) { sumJiShuChild1 = sumJiShuChild1 + parseInt(jishu_child1[p]); sumJiShuChild2 = sumJiShuChild2 + parseInt(jishu_child2[p]); } //计算总和 sumTotal = parseInt(sumJiShu) + parseInt(sumOuShu) + parseInt(sumJiShuChild1) + parseInt(sumJiShuChild2); //计算Luhm值 var k = parseInt(sumTotal) % 10 == 0 ? 10 : parseInt(sumTotal) % 10; var luhm = 10 - k; if (lastNum == luhm) { return true; } else { return false; } } /** * 加密 * @param {Object} pas */ export function RSAencrypt(pas) { //实例化jsEncrypt对象 let jse = new JSEncrypt(); //设置公钥 jse.setPublicKey(publicKey); return jse.encrypt(pas); } /** * 拼接ftp图片路径 * @param {Object} item * @param {Object} src */ export function getImgPath(item, src) { if (isBlank(item)) { return src } var ftp = config.sftpURL if (typeof item === 'string') { const arr = JSON.parse(item) return ftp + arr[0].path } else if (typeof item === 'object') { return ftp + item.path } else { return ftp + item } } /** * 判断字符串空 * @param {Object} str */ export function isBlank(str) { if (str === undefined || str === null || str === '' || str === 'null' || str.length == 0) { return true } else { return false } } /** * 判断非空 * @param {Object} str */ export function isNotBlank(str) { return !isBlank(str) } /** * 判断token是否存在 */ export function getToken() { return uni.getStorageSync(ACCESSTOKEN); } /** * 判断token是否存在 */ export function hasToken() { return !isBlank(getToken()); } /** * 获取用户信息 */ export function getUserInfo() { return JSON.parse(uni.getStorageSync('userInfo')) } /** * 判断两个数组的内容是否相同 */ export function arrEquals(arr1, arr2) { // if the other arr2 is a falsy value, return if (!arr2) return false; // compare lengths - can save a lot of time if (arr1.length != arr2.length) return false; for (var i = 0, l = arr1.length; i < l; i++) { // Check if we have nested arr2s if (arr1[i] instanceof Array && arr2[i] instanceof Array) { // recurse into the nested arr2s if (!arr1[i].equals(arr2[i])) return false; } else if (arr1[i] != arr2[i]) { // Warning - two different object instances will never be equal: {x:20} != {x:20} return false; } } return true; } /** * 获取当前时间 */ export function getDate(type) { const date = new Date(); let year = date.getFullYear(); let month = date.getMonth() + 1; let day = date.getDate(); if (type === 'start') { year = year - 60; } else if (type === 'end') { year = year + 2; } month = month > 9 ? month : '0' + month;; day = day > 9 ? day : '0' + day; return `${year}-${month}-${day}`; } /** * 判断是否为整数,为整数则拼接'.0' */ export function rateMark(num) { if (Number.isInteger(num)) { return num + '.0' } else { return num } } /** * 秒转分钟 * @param {Object} value */ export function formatSeconds(value) { var secondTime = parseInt(value); // 秒 var minuteTime = 0; // 分 var hourTime = 0; // 小时 if (secondTime > 60) { //如果秒数大于60,将秒数转换成整数 //获取分钟,除以60取整数,得到整数分钟 minuteTime = parseInt(secondTime / 60); //获取秒数,秒数取佘,得到整数秒数 secondTime = parseInt(secondTime % 60); //如果分钟大于60,将分钟转换成小时 if (minuteTime > 60) { //获取小时,获取分钟除以60,得到整数小时 hourTime = parseInt(minuteTime / 60); //获取小时后取佘的分,获取分钟除以60取佘的分 minuteTime = parseInt(minuteTime % 60); } } var result = "" + parseInt(secondTime) + "秒"; if (minuteTime > 0) { result = "" + parseInt(minuteTime) + "分" + result; } if (hourTime > 0) { result = "" + parseInt(hourTime) + "小时" + result; } return result; } /** * 日期格式化 * @param {Object} date * @param {Object} fmt */ export function dateFormat(date, fmt) { if (!date) { return } if (!fmt) { fmt = 'yyyy-MM-dd hh:mm' } if (!(date instanceof Date)) { date = new Date(date.replace(/-/g, '/')) } if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)); } let o = { 'M+': date.getMonth() + 1, 'd+': date.getDate(), 'h+': date.getHours(), 'm+': date.getMinutes(), 's+': date.getSeconds() }; for (let k in o) { if (new RegExp(`(${k})`).test(fmt)) { let str = o[k] + ''; fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : ('00' + str).substr(str.length)); } } return fmt; } /** * 传入时间格式的时间,以当前时间为标准,返回距离当前时间之前 */ export function timeago(date) { //dateTimeStamp是一个时间毫秒,注意时间戳是秒的形式,在这个毫秒的基础上除以1000,就是十位数的时间戳。13位数的都是时间毫秒。 if (!date) { return } if (!(date instanceof Date)) { date = new Date(date.replace(/-/g, '/')) } var dateTimeStamp = date.getTime() var minute = 1000 * 60; //把分,时,天,周,半个月,一个月用毫秒表示 var hour = minute * 60; var day = hour * 24; var week = day * 7; var halfamonth = day * 15; var month = day * 30; var now = new Date().getTime(); //获取当前时间毫秒 var diffValue = now - dateTimeStamp; //时间差 if (diffValue < 0) { return; } var minC = diffValue / minute; //计算时间差的分,时,天,周,月 var hourC = diffValue / hour; var dayC = diffValue / day; var weekC = diffValue / week; var monthC = diffValue / month; var result = ''; if (monthC >= 1 && monthC <= 3) { result = " " + parseInt(monthC) + "月前" } else if (weekC >= 1 && weekC <= 3) { result = " " + parseInt(weekC) + "周前" } else if (dayC >= 1 && dayC <= 6) { result = " " + parseInt(dayC) + "天前" } else if (hourC >= 1 && hourC <= 23) { result = " " + parseInt(hourC) + "小时前" } else if (minC >= 1 && minC <= 59) { result = " " + parseInt(minC) + "分钟前" } else if (diffValue >= 0 && diffValue <= minute) { result = "刚刚" } else { var datetime = new Date(); datetime.setTime(dateTimeStamp); var Nyear = datetime.getFullYear(); var Nmonth = datetime.getMonth() + 1 < 10 ? "0" + (datetime.getMonth() + 1) : datetime.getMonth() + 1; var Ndate = datetime.getDate() < 10 ? "0" + datetime.getDate() : datetime.getDate(); var Nhour = datetime.getHours() < 10 ? "0" + datetime.getHours() : datetime.getHours(); var Nminute = datetime.getMinutes() < 10 ? "0" + datetime.getMinutes() : datetime.getMinutes(); var Nsecond = datetime.getSeconds() < 10 ? "0" + datetime.getSeconds() : datetime.getSeconds(); result = Nyear + "-" + Nmonth + "-" + Ndate } return result; } /** * 数组截取 * @param {Object} data * @param {Object} index * @param {Object} num */ export function subArray(data, index, num) { return data.slice(index * num, (index * num) + num) } // 根据索引替换字符串中的元素,常用语字符串加密 export function stringReplace(content, start, num, str) { var content = content.split(""); content.splice(start, num, str) return content.join(""); } export function getByteLength(str) { //先把中文替换成两个字节的英文,在计算长度 var aa = str.replace(/[\u0391-\uFFE5]/g, "@@") return aa.length; } export function getDiffDay(date_1, date_2) { // 计算两个日期之间的差值 let totalDays, diffDate let myDate_1 = new Date(date_1.replace(/-/g, '/')) let myDate_2 = new Date(date_2.replace(/-/g, '/')) // 将两个日期都转换为毫秒格式,然后做差 diffDate = Math.abs(myDate_1 - myDate_2) // 取相差毫秒数的绝对值 totalDays = Math.floor(diffDate / (1000 * 3600 * 24)) // 向下取整 // console.log(totalDays) return totalDays // 相差的天数 } /** * 获取两个日期相差的月日时分 * @param {Object} start * @param {Object} end * @param {Object} cha * @param {Object} flag */ export function timeFn(start, end, cha, flag) { if (!!!cha) { cha = 0 } if (!(start instanceof Date)) { start = new Date(start.replace(/-/g, '/')) } start.setSeconds(start.getSeconds() - 1) if (!(end instanceof Date)) { end = new Date(end.replace(/-/g, '/')) } var dateDiff = end.getTime() - start + cha; //时间差的毫秒数 if (dateDiff == 0) { return null } var dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000)); //计算出相差天数 var leave1 = dateDiff % (24 * 3600 * 1000) //计算天数后剩余的毫秒数 var hours = Math.floor(leave1 / (3600 * 1000)) //计算出小时数 //计算相差分钟数 var leave2 = leave1 % (3600 * 1000) //计算小时数后剩余的毫秒数 var minutes = Math.floor(leave2 / (60 * 1000)) //计算相差分钟数 //计算相差秒数 var leave3 = leave2 % (60 * 1000) //计算分钟数后剩余的毫秒数 var seconds = Math.round(leave3 / 1000) var leave4 = leave3 % (60 * 1000) //计算分钟数后剩余的毫秒数 var minseconds = Math.round(leave4 / 1000) if (seconds * 1 < 10) { seconds = '0' + seconds } if (minutes * 1 < 10) { minutes = '0' + minutes } if (hours * 1 < 10) { hours = '0' + hours } if (flag) { var timeFn = (dayDiff ? dayDiff + "天" : '') + hours + "时" + minutes + "分" + seconds + "秒"; return timeFn; } var timeFn = (dayDiff ? dayDiff + "天" : '') + hours + ":" + minutes + ":" + seconds; return timeFn; } /** * 简单的uuid */ export function guid() { return 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } /** * 获取long型数据 */ export function glong() { return 'xxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.floor((Math.random() * 10)) | 0, v = c == 'x' ? r : (r & 0x3); return v.toString(); }); } /** * 页面跳转 * @param {Object} url * @param {Object} param */ export function go(url, param) { var pm = ''; if (param != undefined) { if (typeof param === 'string') { param = JSON.parse(param) } for (var p in param) { //遍历json对象的每个key/value对,p为key pm += '&' + p + '=' + param[p]; } } pm = pm.substr(1); uni.navigateTo({ url: url + '?' + pm }); } /** * 页面跳转 * @param {Object} url * @param {Object} param */ export function redirect(url, param) { var pm = ''; if (param != undefined) { if (typeof param === 'string') { param = JSON.parse(param) } for (var p in param) { //遍历json对象的每个key/value对,p为key pm += '&' + p + '=' + param[p]; } } pm = pm.substr(1); uni.redirectTo({ url: url + '?' + pm }); } /** * 跳转首页 */ export function goIndex() { uni.reLaunch({ url: '/pages/index/index' }); } /** * 跳转登录页 */ export function goLogin(callbackUrl) { if (callbackUrl) { uni.redirectTo({ url: `/pages/user/login/index?callbackUrl=/${callbackUrl}` }); } else { uni.redirectTo({ url: `/pages/user/login/index` }); } } /** * 返回 */ export function goBack() { uni.navigateBack() } /** * 颜色16进制转RGB方法 * @param {Object} c */ export function colorRgb(c) { var sColor = c.toLowerCase(); //十六进制颜色值的正则表达式 var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/; // 如果是16进制颜色 if (sColor && reg.test(sColor)) { if (sColor.length === 4) { var sColorNew = "#"; for (var i = 1; i < 4; i += 1) { sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1)); } sColor = sColorNew; } //处理六位的颜色值 var sColorChange = []; for (var i = 1; i < 7; i += 2) { sColorChange.push(parseInt("0x" + sColor.slice(i, i + 2))); } return "(" + sColorChange.join(",") + ",.08)"; } return sColor; }; /** * 验证手机号 * @param {Object} mobile */ export function checkMobile(mobile) { return /^1[3456789]\d{9}$/.test(mobile); } /** * 验证身份证号 * @param {Object} cardNo */ export function checkCardNo(cardNo) { return /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/ .test(cardNo); } /** * 验证邮箱 * @param {Object} email */ export function checkEmail(email) { return /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/.test(email); } /** * 阿拉伯数字转中文数字 * @param {Object} num */ export function NoToChinese(num) { var AA = new Array("零", "一", "二", "三", "四", "五", "六", "七", "八", "九"); var BB = new Array("", "十", "百", "千", "万", "亿", "点", ""); var a = ("" + num).replace(/(^0*)/g, "").split("."), k = 0, re = ""; for (var i = a[0].length - 1; i >= 0; i--) { switch (k) { case 0: re = BB[7] + re; break; case 4: if (!new RegExp("0{4}\\d{" + (a[0].length - i - 1) + "}$").test(a[0])) re = BB[4] + re; break; case 8: re = BB[5] + re; BB[7] = BB[5]; k = 0; break; } if (k % 4 == 2 && a[0].charAt(i + 2) != 0 && a[0].charAt(i + 1) == 0) re = AA[0] + re; if (a[0].charAt(i) != 0) re = AA[a[0].charAt(i)] + BB[k % 4] + re; k++; } if (a.length > 1) //加上小数部分(如果有小数部分) { re += BB[6]; for (var i = 0; i < a[1].length; i++) re += AA[a[1].charAt(i)]; } return re; }; /** * 合并对象相同属性 * chenlong * @param obj1 目标对象 * @param obj2 源对象 */ export function mergeObj(obj1, obj2) { const res = {} Object.keys(obj2).map(key => { if (key in obj1) { res[key] = obj2[key] } }) return res } /** * 获取返回值 * @param {Object} res * @param {Object} fun */ export function getContent(res, fun) { if (res.code === 10000) { fun(res.data) } else { uni.showToast({ title: res.msg, duration: 1500, icon: 'none' }); } } /* 正整数 */ export function isInteger(number) { const reg = /^[1-9]\d*$/ if (reg.test(number)) { return true } else { return false } } /* 判断是否为空 */ export function isEmpty(item) { if (item === undefined || item === null || item === '') { return true } return false } /* 校验价格,最多两位小数点 */ export function isPrice(price) { const reg = /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/ if (reg.test(price)) { return true } else { return false } } /** * 将元转换为分(如果可以转换,否则原值返回) * @param val * @returns {number|*} */ export function formatYuanToFen(val) { if (isEmpty(val) || !isPrice(val)) { return val } return parseFloat(val) * 100 } /** * 将分转换为元(如果可以转换,否则原值返回) * @param val * @returns {number|*} */ export function formatFenToYuan(val) { if (isEmpty(val) || !isInteger(val)) { return val } return parseFloat(val) / 100 } /** * 提示错误信息 */ export function showErrorMsg(msg) { uni.showToast({ title: msg, icon: 'none' }); return false; } /** * 提示成功信息 */ export function showSuccessMsg(msg) { uni.showToast({ title: msg, icon: 'none' }); } /** * 计算时间差 */ export function timeDiff(startTime, endTime) { // 计算相差的时间 const timeDiff = endTime.getTime() - startTime.getTime(); if (timeDiff <= 0) return false; const totalSeconds = Math.floor(timeDiff / 1000); const hours = Math.floor(totalSeconds / 60 / 60); const minutes = Math.floor((totalSeconds - hours * 60 * 60) / 60); const seconds = Math.floor(totalSeconds - hours * 60 * 60 - minutes * 60); const timeDiffArray = [hours, minutes, seconds].map(e => { return e < 10 ? '0' + e : e; }); return timeDiffArray; } /** * 两数相加 arg1 + arg2 * @param arg1 * @param arg2 * @returns {number} */ export function add(arg1, arg2) { var t = 0 arg1 = arg1 ? arg1.toString() : '0' arg2 = arg2 ? arg2.toString() : '0' if (arg1.includes('.')) { t = arg1.split('.')[1].length } if (arg2.includes('.')) { t = Math.max(arg2.split('.')[1].length, t) } var m = Math.pow(10, t) return Number(((this.mul(arg1, m) + this.mul(arg2, m)) / m)) } /** * 两数相减 arg1 - arg2 * @param arg1 * @param arg2 * @returns {number} */ export function sub(arg1, arg2) { var t = 0 arg1 = arg1 ? arg1.toString() : '0' arg2 = arg2 ? arg2.toString() : '0' if (arg1.includes('.')) { t = arg1.split('.')[1].length } if (arg2.includes('.')) { t = Math.max(arg2.split('.')[1].length, t) } var m = Math.pow(10, t) return Number(((this.mul(arg1, m) - this.mul(arg2, m)) / m)) } /** * 两数相乘 arg1 * arg2 * @param arg1 * @param arg2 * @returns {number} */ export function mul(arg1, arg2) { var t = 0 arg1 = arg1 ? arg1.toString() : '0' arg2 = arg2 ? arg2.toString() : '0' if (arg1.includes('.')) { t += arg1.split('.')[1].length } if (arg2.includes('.')) { t += arg2.split('.')[1].length } var r1 = Number(arg1.replace('.', '')) var r2 = Number(arg2.replace('.', '')) return (r1 * r2) / Math.pow(10, t) } /** * 两数相除 arg1 / arg2 * @param arg1 * @param arg2 * @returns {number} */ export function abs(arg1, arg2) { var t = 0 arg1 = arg1 ? arg1.toString() : '0' arg2 = arg2 ? arg2.toString() : '0' if (arg2.includes('.')) { t = arg2.split('.')[1].length } if (arg1.includes('.')) { t -= arg1.split('.')[1].length } var r1 = Number(arg1.replace('.', '')) var r2 = Number(arg2.replace('.', '')) return this.mul((r1 / r2), Math.pow(10, t)) } /** * arg1*100/(arg1+arg2) * @param {Object} arg2 * @param {Object} arg1 */ export function percentage(arg1, arg2) { var add = this.add(arg1, arg2) return this.mul(this.abs(arg1, add), 100) } /** * 查看网络状态 * false 没有网络 true 有网络 */ export function getNetworkStatus() { var result = '' uni.getNetworkType({ success: (res) => { if (res.networkType == 'none') { // this.$u.toast("没有网络"); result = false } else { // this.$u.toast("有网络"); result = true } } }) return result } /** * @param {Object} key 缓存的key * @param {Object} param 要缓存的对象 * 将param push到缓存数组中 */ export function setArrayStorageSync(key, param) { const data = uni.getStorageSync(key) || [] data.push(param) uni.setStorageSync(key, data) } // 获取轮播图列表 export function getBannerImg(val, state) { let list = [] if (!isBlank(val) && state === '2') { let arr = JSON.parse(val) arr.map(x => { list.push(config.sftpURL + x.path) }) } else { list = [config.imgUrl + 'no-book.png'] } return list } // 商品图片路径 export function getGoodsImg(val, state) { let headImg = "" if (!isBlank(val) && state === '2') { headImg = config.sftpURL + JSON.parse(val)[0].path } else { headImg = config.imgUrl + 'no-book.png' } return headImg } // 图片路径 export function GoodsImg(val) { let headImg = "" if (!isBlank(val)) { headImg = config.sftpURL + val } else { headImg = config.imgUrl + 'no-book.png' } return headImg } // 保留三位小数 末尾超过向上进1 export function getDiscountPrice(price, discount) { let newPrice = "" let a = Number(price) * Number(discount) / 100 let b = a.toFixed(4) let c = b[b.length - 1] newPrice = c != 0 ? Number(b) + 0.01 : b.slice(0, -1) return newPrice } // 判断微信、支付宝 2微信 5支付宝 15云闪付 3其他 export function getPlat() { // #ifdef H5 var ua = window.navigator.userAgent.toLowerCase(); //判断是不是微信 if (ua.match(/MicroMessenger/i) == 'micromessenger') { return 2; } //判断是不是支付宝 if (ua.match(/AlipayClient/i) == 'alipayclient') { return 5; } //判断是不是云闪付 if (ua.indexOf('unionpay/1.0') !== -1) { return 15; } // #endif // #ifdef MP-WEIXIN return 2; // #endif // #ifdef MP-ALIPAY return 5; // #endif return 3; }