import { PAGE_CODE } from '~/common/c.js' // 把多次encodeURIComponent结果decode到最终不变 export const parseEncodeURIComponent = (s = '') => { let decodeStr = decodeURIComponent(s) if (decodeStr === s) { return decodeStr } else { return parseEncodeURIComponent(decodeStr) } } export const getPageCode = href => { if (typeof window === 'undefined') { // console.log('此方法只支持在浏览器中执行') return PAGE_CODE.defaultCode } if (!href) { return PAGE_CODE.defaultCode } let pageCode = PAGE_CODE.defaultCode let domA = document.createElement('a') domA.href = href const path = domA.pathname domA = null // 首页路径 匹配范围 / /cn /cn/ /en /en/ //nuxt会报错 忽略 // 文章路径 /articles /articles/ /cn/articles /cn/articles/ /en/articles /en/articles/ if ( /^(\/|\/cn|\/en)(\/?)$/.test(path) || /^(\/cn|\/en)?\/articles(\/?)$/.test(path) ) { pageCode = PAGE_CODE.articleList } else if (/^(\/cn|\/en)?\/article\/\d+(\/?)$/.test(path)) { // 文章详情路径 /article/:id /article/:id/ /cn/article/:id /cn/article/:id/ /en/article/:id /en/article/:id/ pageCode = PAGE_CODE.article } else if (/^(\/cn|\/en)?\/videos(\/?)$/.test(path)) { // 视频路径 /videos /videos/ /cn/videos /cn/videos/ /en/videos /en/videos/ pageCode = PAGE_CODE.videoList } return pageCode } export const MyCookie = { transferCookieStrToObj: cookieStr => { if (!cookieStr) { // console.log('请传入cookies string') return {} } const pairs = cookieStr.split(';') const cookies = {} for (let i = 0; i < pairs.length; i++) { const pair = pairs[i].split('=') // cookies[pair[0].trim()] = unescape(pair[1].trim()) cookies[pair[0].trim()] = pair[1].trim() } return cookies }, setCookie: (key, value = '', exdays = 1, domainCtrl = false) => { if (typeof window === 'undefined') { // console.log('此方法只支持在浏览器中执行') return false } if (!key) { // console.log('请传入cookie name') return false } const d = new Date() d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000) if (domainCtrl) { const domain = window.location.host.indexOf('hoolihome.com') !== -1 ? '.hoolihome.com' : '' document.cookie = `${key}=${value}; domain=${domain}; path=/; expires=${d.toGMTString()}` } else { document.cookie = `${key}=${value}; path=/; expires=${d.toGMTString()}` } }, getCookie: key => { if (typeof window === 'undefined') { // console.log('此方法只支持在浏览器中执行') return false } if (!key) { // console.log('请传入cookie name') return false } const cookieStr = document.cookie if (cookieStr.length > 0) { let cStart = cookieStr.indexOf(key + '=') if (cStart !== -1) { cStart = cStart + key.length + 1 let cEnd = cookieStr.indexOf(';', cStart) if (cEnd === -1) cEnd = cookieStr.length // return unescape(cookieStr.substring(cStart, cEnd)) return cookieStr.substring(cStart, cEnd) } } return '' }, deleteCookie: (key, domainCtrl = false) => { if (typeof window === 'undefined') { // console.log('此方法只支持在浏览器中执行') return false } if (!key) { // console.log('请传入cookie name') return false } if (domainCtrl) { const domain = window.location.host.indexOf('hoolihome.com') !== -1 ? '.hoolihome.com' : '' document.cookie = `${key}=; domain=${domain}; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT` } else { document.cookie = `${key}=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT` } } } export const isObjectEmpty = obj => { if (!obj || typeof obj !== 'object') { return true } for (let key in obj) { return false } return true } export const loadSrc = (url, domId, type) => { if (typeof window === 'undefined') { return false } return new Promise((resolve, reject) => { if (!url) { reject(new Error('请设置加载资源的url')) return false } if (!domId) { reject(new Error('请设置加载资源的dom Id')) return false } if (document.getElementById(domId)) { resolve() } else { if (type === 'css') { let cssLink = document.createElement('link') cssLink.id = domId cssLink.type = 'text/css' cssLink.rel = 'stylesheet' cssLink.href = url cssLink.onload = () => { resolve() } document.head.appendChild(cssLink) } else { let jsScript = document.createElement('script') jsScript.id = domId jsScript.type = 'text/javascript' jsScript.onload = () => { resolve() } jsScript.src = url document.body.appendChild(jsScript) } } }) } // ahex 转 rgba export const colorToRgba = color => { let rgba = '' color = color.substr(1) let colorLen = color.length let aValue, rValue, gValue, bValue aValue = '0xFF' if (colorLen === 6 || colorLen === 8) { if (colorLen === 8) { aValue = '0x' + color.substr(0, 2) color = color.substr(2) } rValue = '0x' + color.substr(0, 2) gValue = '0x' + color.substr(2, 2) bValue = '0x' + color.substr(4, 2) rgba = 'rgba(' + parseInt(rValue) + ',' + parseInt(gValue) + ',' + parseInt(bValue) + ',' + parseInt(aValue) / 255 + ')' } return rgba } export const countStringBytes = str => { var r = 0 for (var i = 0; i < str.length; i++) { var c = str.charCodeAt(i) // Shift_JIS: 0x0 ~ 0x80, 0xa0 , 0xa1 ~ 0xdf , 0xfd ~ 0xff // Unicode : 0x0 ~ 0x80, 0xf8f0, 0xff61 ~ 0xff9f, 0xf8f1 ~ 0xf8f3 if ( (c >= 0x0 && c < 0x81) || c == 0xf8f0 || (c >= 0xff61 && c < 0xffa0) || (c >= 0xf8f1 && c < 0xf8f4) ) { r += 1 } else { r += 2 } } return r } export const cstr = s => { /*处理null、undefined或NaN字符串*/ if (s) { return s.toString() } else { return '' } } export const formatTimeCountToStr = t => { /*格式化时间戳差*/ if (t > 0) { let h = Math.floor((t / 60 / 60) % 24) if (h < 10) { h = `0${h}` } let m = Math.floor((t / 60) % 60) if (m < 10) { m = `0${m}` } let s = Math.floor(t % 60) if (s < 10) { s = `0${s}` } return `${h}:${m}:${s}` } return '' } export const formatTimeToStr = t => { if (t) { t = parseInt(t) let time = new Date(t * 1000) let year = time.getFullYear() let month = time.getMonth() + 1 if (month < 10) { month = `0${month}` } let date = time.getDate() if (date < 10) { date = `0${date}` } let hour = time.getHours() if (hour < 10) { hour = `0${hour}` } let minute = time.getMinutes() if (minute < 10) { minute = `0${minute}` } let second = time.getSeconds() if (second < 10) { second = `0${second}` } return `${year}-${month}-${date} ${hour}:${minute}:${second}` } return '' } export const deepClone = obj => { /* 深度克隆对象 */ try { return JSON.parse(JSON.stringify(obj)) } catch (e) { return obj } } export const money = (m, c, w) => { /*m:金额;c:保留小数位数,只能取值0,1,2;w:1返回整个金额,2返回整数部分,3返回小数部分*/ if (c !== 0 && c !== 1 && c !== 2) { // console.log('传入保留小数位数参数错误') return '' } if (w !== 1 && w !== 2 && w !== 3) { // console.log('传入返回类型参数错误') return '' } if (0 === m) { /*由于0=false,需特殊处理*/ return deal('0', '') } else { if (!m || isNaN(m)) { return '' } m = m.toString() if (-1 === m.indexOf('.')) { return deal(m, '') } else { var s_arr = m.split('.') return deal(s_arr[0], s_arr[1]) } } function deal(p, f) { /*p为整数部分*/ if (0 === c) { if (1 === w) { return p } else if (2 === w) { return p } else if (3 === w) { return '' } } else if (1 === c) { if (0 === f.length) { f = '0' } else if (f.length >= 2) { f = f.substring(0, 1) } if (1 === w) { return p + '.' + f } else if (2 === w) { return p } else if (3 === w) { return f } } else if (2 === c) { if (0 === f.length) { f = '00' } else if (1 === f.length) { f = f + '0' } else if (f.length >= 3) { f = f.substring(0, 2) } if (1 === w) { return p + '.' + f } else if (2 === w) { return p } else if (3 === w) { return f } } } } export const myValidator = { /* 校验字段合法性rule */ checkMobile: s => { /* 校验手机号格式是否正确 */ if (s) { s = s.toString().trim() var rule = /^\d{3,20}$/ return rule.test(s) } return false }, checkEmail: s => { /* 校验邮箱格式是否正确 */ if (s) { s = s.toString().trim() let rule = /^(([^()[\]\\.,;:\s@\"]+(\.[^()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/g return rule.test(s) } return false }, checkPwd: s => { /* 校验登录密码格式是否正确 */ if (s) { s = s.toString().trim() var rule = /^(?=.*[a-zA-Z]+)(?=.*[0-9]+)[a-zA-Z0-9]{8,16}$/ return rule.test(s) } return false }, checkCode: s => { /* 校验短信或邮箱验证码格式是否正确 */ if (s) { s = s.toString().trim() var rule = /^\d{6}$/ return rule.test(s) } return false }, checkImgCode: s => { /* 校验图片验证码格式是否正确 */ if (s) { s = s.toString().trim() var rule = /^[a-zA-Z]{4}$/ return rule.test(s) } return false }, checkNickname: s => { /* 校验昵称格式是否正确 */ if (s) { s = s.toString().trim() var rule = /^[A-Za-z0-9\u4e00-\u9fa5]{2,20}$/ return rule.test(s) } return false } }