| 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') | 
|     } | 
|   } | 
| } |