/* * @Descripttion: 工具集 * @version: 1.2 * @LastEditors: sakuya * @LastEditTime: 2022年5月24日00:28:56 */ import CryptoJS from 'crypto-js'; import sysConfig from "@/config"; const tool = {} /* localStorage */ tool.data = { set(key, data, datetime = 0) { //加密 if(sysConfig.LS_ENCRYPTION == "AES"){ data = tool.crypto.AES.encrypt(JSON.stringify(data), sysConfig.LS_ENCRYPTION_key) } let cacheValue = { content: data, datetime: parseInt(datetime) === 0 ? 0 : new Date().getTime() + parseInt(datetime) * 1000 } return uni.setStorageSync(key, JSON.stringify(cacheValue)) }, get(key) { try { const value = JSON.parse(uni.getStorageSync(key)) if (value) { let nowTime = new Date().getTime() if (nowTime > value.datetime && value.datetime != 0) { uni.removeStorageSync(key) return null; } //解密 if(sysConfig.LS_ENCRYPTION == "AES"){ value.content = JSON.parse(tool.crypto.AES.decrypt(value.content, sysConfig.LS_ENCRYPTION_key)) } return value.content } return null } catch (err) { return null } }, remove(key) { return uni.removeStorageSync(key) }, clear() { return uni.clearStorageSync() } } /*sessionStorage - 仅在 H5 环境下可用*/ // #ifdef H5 tool.session = { set(table, settings) { const _set = JSON.stringify(settings) return sessionStorage.setItem(table, _set) }, get(table) { const data = sessionStorage.getItem(table) try { return JSON.parse(data) } catch (err) { return null } }, remove(table) { return sessionStorage.removeItem(table) }, clear() { return sessionStorage.clear() } } /*cookie - 仅在 H5 环境下可用*/ tool.cookie = { set(name, value, config = {}) { const cfg = { expires: null, path: null, domain: null, secure: false, httpOnly: false, ...config } let cookieStr = `${name}=${encodeURIComponent(value)}` if (cfg.expires) { const exp = new Date() exp.setTime(exp.getTime() + parseInt(cfg.expires) * 1000) cookieStr += `;expires=${exp.toUTCString()}` } if (cfg.path) { cookieStr += `;path=${cfg.path}` } if (cfg.domain) { cookieStr += `;domain=${cfg.domain}` } document.cookie = cookieStr }, get(name) { const arr = document.cookie.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)")) if (arr != null) { return decodeURIComponent(arr[2]) } return null }, remove(name) { const exp = new Date() exp.setTime(exp.getTime() - 1) document.cookie = `${name}=;expires=${exp.toUTCString()}` } } // #endif // #ifndef H5 // 非 H5 环境下提供空实现,避免调用报错 tool.session = { set() { console.warn('sessionStorage 仅在 H5 环境下可用') }, get() { return null }, remove() {}, clear() {} } tool.cookie = { set() { console.warn('cookie 仅在 H5 环境下可用') }, get() { return null }, remove() {} } // #endif /* 复制对象 */ tool.objCopy = function (obj) { return JSON.parse(JSON.stringify(obj)); } /* 日期格式化 */ tool.dateFormat = function (date, fmt='yyyy-MM-dd hh:mm:ss') { date = new Date(date) var o = { "M+" : date.getMonth()+1, //月份 "d+" : date.getDate(), //日 "h+" : date.getHours(), //小时 "m+" : date.getMinutes(), //分 "s+" : date.getSeconds(), //秒 "q+" : Math.floor((date.getMonth()+3)/3), //季度 "S" : date.getMilliseconds() //毫秒 }; if(/(y+)/.test(fmt)) { fmt=fmt.replace(RegExp.$1, (date.getFullYear()+"").substr(4 - RegExp.$1.length)); } for(var k in o) { if(new RegExp("("+ k +")").test(fmt)){ fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length))); } } return fmt; } /* 千分符 */ tool.groupSeparator = function (num) { num = num + ''; if(!num.includes('.')){ num += '.' } return num.replace(/(\d)(?=(\d{3})+\.)/g, function ($0, $1) { return $1 + ','; }).replace(/\.$/, ''); } /* 常用加解密 */ tool.crypto = { //MD5加密 MD5(data){ return CryptoJS.MD5(data).toString() }, //BASE64加解密 BASE64: { encrypt(data){ return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(data)) }, decrypt(cipher){ return CryptoJS.enc.Base64.parse(cipher).toString(CryptoJS.enc.Utf8) } }, //AES加解密 AES: { encrypt(data, secretKey, config={}){ if(secretKey.length % 8 != 0){ console.warn("[SCUI error]: 秘钥长度需为8的倍数,否则解密将会失败。") } const result = CryptoJS.AES.encrypt(data, CryptoJS.enc.Utf8.parse(secretKey), { iv: CryptoJS.enc.Utf8.parse(config.iv || ""), mode: CryptoJS.mode[config.mode || "ECB"], padding: CryptoJS.pad[config.padding || "Pkcs7"] }) return result.toString() }, decrypt(cipher, secretKey, config={}){ const result = CryptoJS.AES.decrypt(cipher, CryptoJS.enc.Utf8.parse(secretKey), { iv: CryptoJS.enc.Utf8.parse(config.iv || ""), mode: CryptoJS.mode[config.mode || "ECB"], padding: CryptoJS.pad[config.padding || "Pkcs7"] }) return CryptoJS.enc.Utf8.stringify(result); } } } export default tool