169 lines
4.4 KiB
JavaScript
169 lines
4.4 KiB
JavaScript
// +----------------------------------------------------------------------
|
||
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
|
||
// +----------------------------------------------------------------------
|
||
// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
|
||
// +----------------------------------------------------------------------
|
||
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
|
||
// +----------------------------------------------------------------------
|
||
// | Author: CRMEB Team <admin@crmeb.com>
|
||
// +----------------------------------------------------------------------
|
||
|
||
import store from "../store";
|
||
import Cache from '../utils/cache';
|
||
import {
|
||
Debounce
|
||
} from '@/utils/validate.js'
|
||
// #ifdef H5 || APP-PLUS
|
||
import {
|
||
isWeixin
|
||
} from "../utils";
|
||
import auth from './wechat';
|
||
// #endif
|
||
|
||
import {
|
||
LOGIN_STATUS,
|
||
USER_INFO,
|
||
EXPIRES_TIME,
|
||
STATE_R_KEY
|
||
} from './../config/cache';
|
||
import Routine from '@/libs/routine';
|
||
|
||
/**
|
||
* 不依赖 atob 的 base64 解码(小程序环境不提供 atob)
|
||
*/
|
||
function base64Decode(str) {
|
||
var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
|
||
var output = '';
|
||
var i = 0;
|
||
str = String(str).replace(/[^A-Za-z0-9+/=]/g, '');
|
||
while (i < str.length) {
|
||
var b1 = chars.indexOf(str.charAt(i++));
|
||
var b2 = chars.indexOf(str.charAt(i++));
|
||
var b3 = chars.indexOf(str.charAt(i++));
|
||
var b4 = chars.indexOf(str.charAt(i++));
|
||
output += String.fromCharCode((b1 << 2) | (b2 >> 4));
|
||
if (b3 !== 64) output += String.fromCharCode(((b2 & 15) << 4) | (b3 >> 2));
|
||
if (b4 !== 64) output += String.fromCharCode(((b3 & 3) << 6) | b4);
|
||
}
|
||
return output;
|
||
}
|
||
|
||
function prePage() {
|
||
let pages = getCurrentPages();
|
||
let prePage = pages[pages.length - 1];
|
||
// #ifndef APP-PLUS
|
||
return prePage.route;
|
||
// #endif
|
||
// #ifdef APP-PLUS
|
||
return prePage.$page.fullPath;
|
||
// #endif
|
||
|
||
}
|
||
|
||
|
||
|
||
export const toLogin = Debounce(_toLogin, 800)
|
||
|
||
function _toLogin(push, pathLogin) {
|
||
store.commit("LOGOUT");
|
||
let path = prePage();
|
||
|
||
// #ifdef H5
|
||
path = location.pathname + location.search;
|
||
// #endif
|
||
|
||
if (!pathLogin)
|
||
pathLogin = '/page/users/login/index'
|
||
Cache.set('login_back_url', path);
|
||
const BASIC_CONFIG = uni.getStorageSync('BASIC_CONFIG');
|
||
// #ifdef H5
|
||
if (isWeixin() && BASIC_CONFIG.wechat_status) {
|
||
uni.navigateTo({
|
||
url: '/pages/users/wechat_login/index',
|
||
});
|
||
|
||
} else {
|
||
uni.navigateTo({
|
||
url: '/pages/users/login/index'
|
||
})
|
||
}
|
||
// #endif
|
||
|
||
// #ifdef MP
|
||
let url
|
||
if (!BASIC_CONFIG.wechat_auth_switch) {
|
||
url = '/pages/users/binding_phone/index?pageType=0'
|
||
} else {
|
||
url = '/pages/users/wechat_login/index'
|
||
}
|
||
uni.navigateTo({
|
||
url
|
||
})
|
||
// #endif
|
||
|
||
// #ifdef APP-PLUS
|
||
uni.navigateTo({
|
||
url: '/pages/users/login/index'
|
||
})
|
||
// #endif
|
||
|
||
}
|
||
|
||
|
||
export function checkLogin() {
|
||
let token = Cache.get(LOGIN_STATUS);
|
||
let expiresTime = Cache.get(EXPIRES_TIME);
|
||
let newTime = Math.round(new Date() / 1000);
|
||
if (expiresTime < newTime || !token) {
|
||
uni.setStorageSync('authIng', false)
|
||
Cache.clear(LOGIN_STATUS);
|
||
Cache.clear(EXPIRES_TIME);
|
||
Cache.clear(USER_INFO);
|
||
Cache.clear(STATE_R_KEY);
|
||
return false;
|
||
} else {
|
||
store.commit('UPDATE_LOGIN', token);
|
||
// 从 JWT payload 中恢复 uid / unionid
|
||
try {
|
||
let parts = token.split('.');
|
||
if (parts.length === 3) {
|
||
let payload = parts[1]
|
||
.replace(/-/g, '+')
|
||
.replace(/_/g, '/');
|
||
while (payload.length % 4 !== 0) payload += '=';
|
||
let data = JSON.parse(base64Decode(payload));
|
||
if (data.uid) store.commit('SETUID', data.uid);
|
||
if (data.unionid) {
|
||
store.commit('SET_UNIONID', data.unionid);
|
||
Cache.set('UNIONID', data.unionid);
|
||
console.log('[checkLogin] unionid 已从 JWT 恢复:', data.unionid);
|
||
}
|
||
}
|
||
} catch (e) {}
|
||
// 恢复缓存的 openid
|
||
const cachedOpenid = Cache.get('OPENID');
|
||
if (cachedOpenid) {
|
||
store.commit('SET_OPENID', cachedOpenid);
|
||
console.log('[checkLogin] openid 已从缓存恢复:', cachedOpenid);
|
||
}
|
||
// 恢复缓存的 unionid
|
||
const cachedUnionid = Cache.get('UNIONID');
|
||
if (cachedUnionid) {
|
||
store.commit('SET_UNIONID', cachedUnionid);
|
||
console.log('[checkLogin] unionid 已从缓存恢复:', cachedUnionid);
|
||
} else {
|
||
console.log('[checkLogin] unionid 缓存为空');
|
||
}
|
||
// 从 userInfo 缓存恢复
|
||
let userInfo = Cache.get(USER_INFO, true);
|
||
if (userInfo) {
|
||
store.commit('UPDATE_USERINFO', userInfo);
|
||
if (!cachedUnionid && userInfo.unionid) {
|
||
console.log('[checkLogin] unionid 已从 userInfo 恢复:', userInfo.unionid);
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
}
|