app.js 7.6 KB
import wx from './utils/wx';
import udid from './common/udid';
import event from './common/event';
import { verify } from './common/api';
import { wechatAuthLogin, verifySessionKey } from './common/login';
import { MD5 } from './vendors/crypto';
import config from './common/config';
import Yas from './common/yas';
import './router/index'; // 新增的router
import {stringify} from './vendors/query-stringify';
import accountModel from './models/account/index';

let yas;

// app.js
App({
    globalData: {
        userInfo: {},
        unionID: '',
        thirdSession: '',
        udid: '',
        unionType: '',
        isIphoneX: false,
        systemInfo: {}
    },
    reportData: {
        awakeReported: false
    },
    onLaunch: function(options) {
        this.globalData.udid = udid.get(); // 生成 UDID

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

        this.globalData.unionType = options.query.union_type || options.scene;
        this.globalData.sid = MD5(new Date().getTime() + '');

        yas = new Yas(this);
        yas.report('YB_LAUNCH_APP');

        // yas 登录成功回调上报
        event.on('yas-login-type-report', params => {
            yas.report('YB_MY_LOGIN', params);
        });

        // yas  注册成功后上报
        event.on('yas-user-register-success', params => {
            accountModel.recordRegisterSource({
                storeId: config.storeId, // 线下店ID写死1
                fromPage: params.TRIGGER_PAGE_NAME
            });
            yas.report('YB_REGISTER_SUCCESS', params);
        });

        // 测试环境打开调试
        if (config.domains.api.indexOf('api-test') > -1) {
            wx.setEnableDebug({
                enableDebug: true
            });
        }
    },
    onShow: function(options) {
        this.globalData.systemInfo = wx.getSystemInfoSync();
        this.globalData.isIphoneX = this.globalData.systemInfo.model === 'iphonrx';

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

        wx.getLocation({});
        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.doLogin();
        });

        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: function() {
        this.globalData._limitSaleEnteredMark = false;
        yas.report('YB_ENTER_BACKGROUND'); // 系统 - 程序切换置后台上报
    },
    doLogin: function() {
        // 默认自动登录,退出不走自动登录
        if (!this._getSync('disableAutoLogin')) {
            this.getSessionKey();
            return this.wechatAuthLogin();
        }
    },
    _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.`);
        }
    },
    _removeSync: function(key) {
        try {
            wx.removeStorageSync(key);
        } catch (e) {
            console.log(`wx.removeStorageSync del ${key} failed.`);
        }
    },
    getWechatThirdSession: function() {
        this.globalData.thirdSession = 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
        });
    },
    getUid: function() {
        return this.globalData.userInfo.uid || this._getUserInfo().uid || 0;
    },
    _getUserInfo: function() {
        this.globalData.userInfo = this._getSync('userInfo');
        return this.globalData.userInfo || {};
    },
    getUnionID: function() {
        this.globalData.unionID = this.globalData.unionID || this._getSync('unionID');
        return this.globalData.unionID;
    },
    getSessionKey: function() {
        return this.globalData.userInfo.sessionKey || this._getUserInfo().sessionKey || '';
    },
    getOpenID: function() {
        this.globalData.openID = this.globalData.openID || wx.getStorageSync('openID');
        return this.globalData.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
        });
    },
    wechatAuthLogin: function() {
        if (!this.getUid() || !this.getSessionKey()) {
            return wechatAuthLogin().then(res => {
                if (res.code === 10003) { // 微信号已绑定手机号
                    this.setUserInfo(res.data);
                    event.emit('user-login-success');
                }

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

                return res;
            }).catch(() => {});
        }

        return verifySessionKey().then(ves => {
            ves = ves || {};
            if (ves.code !== 200) { // sessionKey已过期
                // 清理原存储的用户信息
                this.clearUserSession();
                return wechatAuthLogin();
            } else {
                this._getUserInfo();
                event.emit('user-login-success');
                return ves;
            }
        }).then(res => {
            if (res.code === 10003) { // 微信号已绑定手机号
                this.setUserInfo(res.data);
                event.emit('user-login-success');
            }

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

            return res;
        }).catch(() => {

        });
    },
    clearUserSession: function() {
        this.setUserInfo({});
    },
    getAppId() {
        return config.appid;
    },
    getPvid() {
        return MD5(`${new Date().getTime()}${udid.get()}`).toString();
    }
});