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