let realAtob const b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' const b64re = /^(?:[A-Za-z\d+/]{4})*?(?:[A-Za-z\d+/]{2}(?:==)?|[A-Za-z\d+/]{3}=?)?$/ if (typeof atob !== 'function') { realAtob = function (str) { str = String(str).replace(/[\t\n\f\r ]+/g, '') if (!b64re.test(str)) { throw new Error("Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.") } // Adding the padding if missing, for semplicity str += '=='.slice(2 - (str.length & 3)) var bitmap; var result = ''; var r1; var r2; var i = 0 for (; i < str.length;) { bitmap = b64.indexOf(str.charAt(i++)) << 18 | b64.indexOf(str.charAt(i++)) << 12 | (r1 = b64.indexOf(str.charAt(i++))) << 6 | (r2 = b64.indexOf(str.charAt(i++))) result += r1 === 64 ? String.fromCharCode(bitmap >> 16 & 255) : r2 === 64 ? String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255) : String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255, bitmap & 255) } return result } } else { // 注意atob只能在全局对象上调用,例如:`const Base64 = {atob};Base64.atob('xxxx')`是错误的用法 realAtob = atob } function b64DecodeUnicode (str) { return decodeURIComponent(realAtob(str).split('').map(function (c) { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2) }).join('')) } function getCurrentUserInfo () { const token = (__PLATFORM__ === 'h5' || __PLATFORM__ === 'app-plus' ? uni : __GLOBAL__).getStorageSync('uni_id_token') || '' const tokenArr = token.split('.') if (!token || tokenArr.length !== 3) { return { uid: null, role: [], permission: [], tokenExpired: 0 } } let userInfo try { userInfo = JSON.parse(b64DecodeUnicode(tokenArr[1])) } catch (error) { throw new Error('获取当前用户信息出错,详细错误信息为:' + error.message) } userInfo.tokenExpired = userInfo.exp * 1000 delete userInfo.exp delete userInfo.iat return userInfo } export function uniIdMixin (Vue) { Vue.prototype.uniIDHasRole = function (roleId) { const { role } = getCurrentUserInfo() return role.indexOf(roleId) > -1 } Vue.prototype.uniIDHasPermission = function (permissionId) { const { permission } = getCurrentUserInfo() return this.uniIDHasRole('admin') || permission.indexOf(permissionId) > -1 } Vue.prototype.uniIDTokenValid = function () { const { tokenExpired } = getCurrentUserInfo() return tokenExpired > Date.now() } }