app.js 7.4 KB
import wx from './utils/wx';
import udid from './common/udid';
import event from './common/event';
import {verify} from './common/api';
import config from './common/config';
import Promise from './vendors/es6-promise';
import { MD5 } from './vendors/crypto';
import { wechatAuthLogin, verifySessionKey } from './common/login';
import { stringify } from './vendors/query-stringify';
import './router/index';
import Yas from './common/yas';

let yas;

// app.js
App({
    globalData: {
        userInfo: {},
        unionID: '',
        sessionKey: '',
        thirdSession: '',
        systemInfo: {}
    },
    reportData: {
        awakeReported: false
    },
    onLaunch: function() {
        yas = new Yas(this);
        yas.report('YB_LAUNCH_APP');

        udid.get(); // 生成 UDID
        verify.gen(); // 此处返回是是 Promise,需要调用接口的业务,最好在 then 里边执行

        let sysInfo = wx.getSystemInfoSync();
        if (!sysInfo.screenHeight) {
            sysInfo.screenHeight = sysInfo.windowHeight;
        }
        if (!sysInfo.screenWidth) {
            sysInfo.screenWidth = sysInfo.windowWidth;
        }
        this.globalData.systemInfo = sysInfo;

        wx.checkSession()
            .then(() => { // 微信登录未过期
                this.getWechatThirdSession();
                this.getUserInfo();
                this.getUnionID();
                this.doLogin();
            })
            .catch(() => { // 微信登录过期
                wx.setStorage({
                    key: 'thirdSession',
                    data: ''
                });
                wx.setStorage({
                    key: 'userInfo',
                    data: {}
                });

                wx.setStorage({
                    key: 'unionID',
                    data: ''
                });
                this.setUserInfo({});
                this.setSessionKey('');

                this.doLogin();
            });

        this.globalData.sid = MD5(`${new Date().getTime()}`).toString();

        wx.getSystemInfo().then(res => {
            this.globalData.systemInfo = res;
        });
    },
    onShow(options) {
        yas.report('YB_ENTER_FOREGROUND');
        if (this.reportData.awakeReported === false){
            let path = options.path;
            if(Object.keys(options.query).length) {
                path = `${path}?${stringify(options.query)}`
            }

            yas.report('YB_AWAKE_MP', {PAGE_PATH: path});
            this.reportData.awakeReported = true
        }
    },
    onHide () {
        yas.report('YB_ENTER_BACKGROUND');
    },
    doLogin: function() {
        this.getSessionKey();
        event.on('login-type-report', params => {
            yas.report('YB_MY_LOGIN', params);
        });
        setTimeout(() => {
            this.wechatAuthLogin();
        }, 1000);
    },
    _getSync: function(key) {
        try {
            return wx.getStorageSync(key);
        } catch (e) {
            console.log(`wx.getStorageSync get ${key} failed.`);
            return {};
        }
    },
    _setSync: function(key, value) {
        try {
            wx.setStorageSync(key, value);
        } catch (e) {
            console.log(`wx.setStorageSync set ${key} failed.`);
        }
    },
    getWechatThirdSession: function() {
        this.globalData.thirdSession = this._getSync('thirdSession');
        return this.globalData.thirdSession;
    },
    setWechatThirdSession: function(session) {
        this.globalData.thirdSession = session;
        wx.setStorage({
            key: 'thirdSession',
            data: this.globalData.thirdSession
        });
    },
    isLogin: function () {
        return !!this.globalData.userInfo.uid;
    },
    getUid: function() {
        return this.globalData.userInfo.uid || 0;
    },
    getUserInfo: function() {
        this.globalData.userInfo = this._getSync('userInfo');
    },
    getUnionID: function() {
        this.globalData.unionID = this._getSync('unionID');
        return this.globalData.unionID;
    },
    getSessionKey: function() {
        this.globalData.sessionKey = this._getSync('sessionKey');
    },
    getOpenID: function() {
        let openid;

        if (this.globalData.openID) {
            return this.globalData.openID;
        }

        openid = wx.getStorageSync('openID');
        this.globalData.openID = openid;
        return openid;
    },
    setOpenID: function(openID) {
        if (openID) {
            this.globalData.openID = openID;
            wx.setStorage({
                key: 'openID',
                data: openID
            });
        }
    },
    setUnionID: function(unionID) {
        this.globalData.unionID = unionID;
        wx.setStorage({
            key: 'unionID',
            data: unionID
        });
        event.emit('wx-union-id-update');
    },
    setUserInfo: function(user) {
        this.globalData.userInfo = user;
        wx.setStorage({
            key: 'userInfo',
            data: this.globalData.userInfo
        });
    },
    setSessionKey: function(sessionKey) {
        this.globalData.sessionKey = sessionKey;
        this._setSync('sessionKey', sessionKey);
    },
    resumeUserInfo: function() {
        this.globalData.userInfo = this._getSync('userInfo');
    },
    resumeSessionKey: function() {
        this.globalData.sessionKey = this._getSync('sessionKey');
    },
    wechatAuthLogin: function() {
        if (!this.globalData.userInfo.uid || !this.globalData.sessionKey) {
            return wechatAuthLogin()
                .then(res => {
                    if (res.code === 10003) { // 微信号已绑定手机号
                        this.setUserInfo(res.data);
                        this.setSessionKey(res.data.sessionKey);
                        event.emit('user-login-success');
                    }

                    if (res.code === 10004) { // 微信号未绑定手机号
                        // 自动登录未绑定静默处理、不强制绑定
                    }
                })
                .catch(() => {});
        }

        verifySessionKey().then(ves => {
                if (ves.code !== 200) { // sessionKey已过期

                    // 清理原存储的用户信息
                    this.clearUserSession();
                    return wechatAuthLogin();
                } else {
                    this.resumeUserInfo();
                    this.resumeSessionKey();
                    event.emit('user-login-success');
                    return Promise.resolve({});
                }
            })
            .then(res => {
                if (res.code === 10003) { // 微信号已绑定手机号
                    this.setUserInfo(res.data);
                    this.setSessionKey(res.data.sessionKey);

                    event.emit('user-login-success');
                }

                if (res.code === 10004) { // 微信号未绑定手机号
                    // 自动登录未绑定静默处理、不强制绑定
                }
            })
            .catch(() => {});
    },
    clearUserSession: function() {
        this.setUserInfo({});
        this.setSessionKey('');
    },
    getMiniappType:function(){
        return config.mini_app_type
    },
    getUnionType() {
        return config.unionType;
    },
    getAppId() {
        return config.appid;
    },
    getSystemInfo() {
        return this.globalData.systemInfo;
    },
    getPvid() {
        return MD5(`${new Date().getTime()}${udid.get()}`).toString();
    }
});