import md5 from 'js-md5' const buildCacheImpl = impl => { return { __check () { if (!impl) { throw new Error('missing cache impl') } }, __get (key) { this.__check(key) if (key == null) { return null } const value = impl.getItem(key) if (value == null) { return null } try { const valueObj = JSON.parse(value) // 已过期处理 if (valueObj.expiredTime != null && new Date().getTime() > valueObj.expiredTime) { this.remove(key) return null } return valueObj } catch (e) { return { value } } }, /** * 写入缓存 * * @param key 键 * @param value 值 * @param timeout 超时时间,单位毫秒,-1表示不超时 */ set (key, value, timeout = -1) { if (key == null) { return } if (value == null) { return } let type = typeof value if (value instanceof Date) { type = 'date' } let actualValue = value if (type === 'object') { actualValue = JSON.stringify(value) } if (type === 'date') { actualValue = value.getTime() } const birthtime = new Date().getTime() const valueObj = { type, value: actualValue, birthtime, expiredTime: timeout === -1 ? null : birthtime + timeout } impl.setItem(key, JSON.stringify(valueObj)) }, /** * 获取缓存值 * * @param key 键 * @returns {SVGPoint | SVGNumber | string | SVGTransform | SVGLength | SVGPathSeg | T|*|any|{value}|null|any} */ get (key) { const valueObj = this.__get(key) if (valueObj == null) { return null } if (typeof valueObj !== 'object') { return valueObj } if (valueObj.value == null) { return null } if (valueObj.type === 'date') { return new Date(valueObj.value) } if (valueObj.type === 'object') { return JSON.parse(valueObj.value) } return valueObj.value }, /** * 删除缓存值 * * @param key 键 */ remove (key) { impl.removeItem(key) } } } export default { /** * 默认使用localStorage来记录缓存 */ ...buildCacheImpl(window.localStorage), /** * 会话级缓存 */ session: buildCacheImpl(window.sessionStorage), /** * 本地缓存 */ local: buildCacheImpl(window.localStorage), /** * 2FA缓存 */ twoFA: { ...buildCacheImpl(window.sessionStorage), /** * 设置认证密码 * * @param value 密码 * @param rememberPwd 是否记住密码 */ setPassword (value, rememberPwd = false) { value = md5(value) // 记住密码时,默认记住5分钟 const timeout = 5 * 60 * 1000 this.set('eva-2fa-password', value, rememberPwd ? timeout : -1) }, /** * 获取认证密码 * @returns {*} */ getPassword () { return this.get('eva-2fa-password') }, /** * 删除认证密码 */ removePassword () { this.remove('eva-2fa-password') } } }