小程序app.js

本文详细介绍了小程序中用户登录流程及用户信息更新的方法。包括登录接口调用、用户信息获取与存储、用户权限刷新及手机号获取等关键步骤。
//app.js
var webim = require('utils/webim_wx.js');
var webimhandler = require('utils/webim_handler.js');
const finalUrl = 'http://localhost:8387/wizardlisa';
App({
  onLaunch: function (opion) {
    var that = this
    // //设置下方tabbar
    // wx.setTabBarItem({
    //   index: 1,
    //   text: that.globalData.companyProfile,
    // })
    //用户初始化进来方式
    that.globalData.source = opion.scene
  },
  //用户登陆================================================================================================================
  userLogin: function () {
    //公共链接
    var that = this;
    return new Promise(function (resolve, reject) {
      // 调用登录接口
      wx.login({
        success: function (res) {
          that.globalData.hasLogin = true//判断是否登录
          if (res.code) {
            //获取用户信息
            wx.request({
              url: finalUrl + '/mpLogin/decodeUser',
              data: {
                code: res.code,
                source: that.globalData.source,
                sourceChannelFlag: that.globalData.sourceChannelFlag,
                wxCompanyId: that.globalData.wxCompanyId,
                wxCompanySalesId: that.globalData.wxCompanySalesId,
              },
              method: 'POST',
              header: { 'content-Type': 'application/json' },
              success: function (res1) {
                wx.setStorageSync('openid', res1.data.validateMap.openid)//存放用户微信唯一字段
                wx.setStorageSync('api_key', res1.data.validateMap.apiKey)//存放用户微信唯一字段
                wx.setStorageSync('sys_source', res1.data.validateMap.sysSource)//存放用户微信唯一字段
                wx.setStorageSync('sessionkey', res1.data.validateMap.sessionkey)//存放用户微信唯一字段
                //判断当前用户是否为销售
                if (res1.data.validateMap.wxUserIdentityFlag == '2') {
                  that.globalData.wxUserIdentityFlag = true;
                  wx.setStorageSync('wxUserIdentityFlag', true);
                } else {
                  that.globalData.wxUserIdentityFlag = false;
                  wx.setStorageSync('wxUserIdentityFlag', false);
                }
                //销售身份赋值对应后台账户的用户等级
                if (res1.data.validateMap.splUserLevel && res1.data.validateMap.splUserLevel != 'null') {
                  that.globalData.splUserLevel = res1.data.validateMap.splUserLevel;
                }
                //判断当前小程序用户 是否绑定销售用户
                if (res1.data.validateMap.wxCompanySalesId && res1.data.validateMap.wxCompanySalesId != 'null') {
                  that.globalData.wxCompanySalesId = res1.data.validateMap.wxCompanySalesId
                } else {
                  that.globalData.wxCompanySalesId = "";
                }
                //当前小程序用户绑定的手机号
                if (res1.data.validateMap.phoneNum && res1.data.validateMap.phoneNum != "null") {
                  that.globalData.phoneNum = res1.data.validateMap.phoneNum;
                } else {
                  that.globalData.phoneNum = '';
                }
                //当前小程序公司 特殊箱子运价展示标识
                if (res1.data.validateMap.containerFclShowFlag && res1.data.validateMap.containerFclShowFlag!="null"){
                  that.globalData.containerFclShowFlag = res1.data.validateMap.containerFclShowFlag;
                }
                //当前小程序公司 是否公开使用小程序标识   1:内部使用   2:公开使用
                if (res1.data.validateMap.programJurisdictionFlag && res1.data.validateMap.programJurisdictionFlag != "null") {
                  that.globalData.programJurisdictionFlag = res1.data.validateMap.programJurisdictionFlag;
                }
                //当前用户的主键id 赋值
                that.globalData.userId = res1.data.validateMap.userId;
                //当前用户是否在 黑名单中 标识
                that.globalData.blacklistFlag = res1.data.validateMap.blacklistFlag;
                //腾讯云IM签名
                that.globalData.userSig = res1.data.validateMap.userSig;
                //腾讯云IMSDKID
                that.globalData.sdkappid = res1.data.validateMap.sdkappid;
                //腾讯云IM模式
                that.globalData.accountType = res1.data.validateMap.accountType;
                var res = { status: 200 }
                resolve(res);//登陆成功
              }
            })
          } else {
            var res = { status: 300 }
            reject(res);//登陆失败
          }
        }
      })
    });
  },


  //2018-07-12 新版本【同意授权】之后的更新用户信息通用方法 =============================================================================================
  newAuthorizeUpdateUserInfo: function (res) {
    var that = this;
    wx.setStorageSync('hasempower', false)
    that.globalData.userInfo = res.detail.userInfo
    that.globalData.hasUserInfo = true
    var data = {
      openid: wx.getStorageSync("openid"),
      nickname: res.detail.userInfo.nickName,
      headPic: res.detail.userInfo.avatarUrl,
      source: that.globalData.source,
      companyId: that.globalData.wxCompanyId,
    }
    //用户信息补录
    wx.request({
      url: finalUrl + '/mpLogin/updateUser',
      data: data,
      method: 'POST',
      header: {
        'content-Type': 'application/json',
        'Authorization': wx.getStorageSync('api_key'),
        'sys_source': wx.getStorageSync('sys_source'),
      },
      success: function (res2) {
        if (res2.data.code == 1) {
          wx.setStorageSync('api_key', res2.data.validateMap.apiKey)//存放用户微信唯一字段
          wx.setStorageSync('hasempower', false)//true的时候未获取头像  
        }
      }
    });
    //设置IM 用户用户昵称 头像
    webimhandler.setProfilePortrait({
      'ProfileItem': [{
        "Tag": "Tag_Profile_IM_Nick",
        "Value": res.detail.userInfo.nickName ? res.detail.userInfo.nickName : "游客"
      },
      {
        "Tag": "Tag_Profile_IM_Image",
        "Value": res.detail.userInfo.avatarUrl ? res.detail.userInfo.avatarUrl : ''
      }
      ]
    }, function () {
      console.log("==========小程序用户允许授权成功后,设置 IM 账户")
    })
  },

  //刷新用户权限  (vip权限 & 用户角色)  (目前同属新缓存 调用接口一样)
  refreshUserAuth: function () {
    //公共链接
    var that = this;
    return new Promise(function (resolve, reject) {
      wx.request({
        url: finalUrl + '/mpLogin/reFreshStorges',
        data: {},
        method: 'POST',
        header: {
          'content-Type': 'application/json',
          'Authorization': wx.getStorageSync('api_key'),
          'sys_source': wx.getStorageSync('sys_source'),
        },
        success: function (res) {
          if (res && res.data && res.data.apiKey) { //这里代表返回正常数据了
            //判断用户是否在黑名单中
            that.globalData.blacklistFlag = res.data.blacklistFlag ? res.data.blacklistFlag:2;
            //用户类型
            if (res.data.wxUserIdentityFlag == true) {//销售身份
              that.globalData.wxUserIdentityFlag = true;
              wx.setStorageSync('wxUserIdentityFlag', true);
            } else {
              that.globalData.wxUserIdentityFlag = false;
              wx.setStorageSync('wxUserIdentityFlag', false);
              wx.removeTabBarBadge({
                index: 3
              })
            }
            //销售身份赋值对应后台账户的用户等级
            if (res.data.splUserLevel && res.data.splUserLevel != 'null') {
              that.globalData.splUserLevel = res.data.splUserLevel;
            }
            //绑定的销售id
            that.globalData.wxCompanySalesId = res.data.wxCompanySalesId ? res.data.wxCompanySalesId:"";
            //修改缓存api_key
            wx.setStorageSync('api_key', res.data.apiKey) //存放用户微信唯一字段
            var res = { status: 200 }
            resolve(res);
          }else{
            var res = { status: 300 }
            reject(res);
          }
        }
      });
    });
  },
  //获取用户手机号  
  getbindphonenum: function (data) {
    //公共链接
    var that = this;
    return new Promise(function (resolve, reject) {
      wx.request({
        url: finalUrl + '/mpLogin/getBindPhoneNum',
        data: data,
        method: 'POST',
        header: {
          'content-Type': 'application/json',
          'Authorization': wx.getStorageSync('api_key'),
          'sys_source': wx.getStorageSync('sys_source'),
        },
        success: function (res) {
          console.log(res);
          console.log("=============================================111111111")
          if (res.data.phoneNum){//授权获取到手机号
            console.log("=============================================222222222")
            //当前用户是否在 黑名单中 标识
            that.globalData.blacklistFlag = res.data.blacklistFlag;
            console.log("=============================================333333333")
            //判断记录用户积分===========
            wx.request({
              url: finalUrl + '/mplogin/savepoints',
              data: {},
              method: 'POST',
              header: {
                'content-type': 'application/json',
                'Authorization': res.data.apiKey,
                'sys_source': wx.getStorageSync('sys_source'),
              },
            })
          }
          console.log("=============================================444444444")
          resolve(res);
          console.log("=============================================555555555")

        },
        fail: function (reserr){
          reject(reserr);
        }
      });
    });
  },


  globalData: {
    source: '',                //用户进入小程序方式(场景值)
    sourceChannelFlag:1,       //用户来源渠道 默认搜索小程序进入
    userId: '',                //当前登陆用户的后台主键Id
    userInfo: {},              //用户信息(这不是完整的用户信息,只是调微信接口赋值的用户信息)
    hasLogin: false,           //用户是否登陆标记
    hasUserInfo: false,        //是否有用户信息
    phoneNum: '',              //当前登陆用户绑定的手机号
    blacklistFlag:2,           //是否在黑名单中 1:是 2:否

    wxCompanySalesId: '',       //客户绑定公司的销售对应的id (这里主要针对 扫码,分享 中的salesId)
    wxUserIdentityFlag: false,  //当前微信用户身份标记 (是否为销售标记)
    splUserLevel: '-1',         //销售身份对应的后台账户用户等级    -1:小程序普通用户  0:BOSS 1:商务 2:销售

    wxCompanyId: 1,             //当前小程序所属公司
    containerFclShowFlag:0,     //当前小程序公司特殊箱子运价展示标识
    programJurisdictionFlag:2,  //1:内部使用 2:公开使用(默认值)

    startPortId: 2,             //全局默认的起始港
    startPortNameEn: 'QINGDAO', //全局默认的起始港英文名

    sdkappid: '',               // 填入创建腾讯云通讯应用获取到的 sdkappid
    accountType: '',            // 填入在帐号体系集成配置中获取到的 accountType
    userSig:"",                 //用户签名

                                // companyProfile: '一米阳光', //设置底层tabbar名称(公司简介)
    mpName: "一米阳光",           //小程序名称

  }
})

 

<think>好的,我现在要处理用户关于微信小程序app.js文件的使用说明和常见问题。首先,我需要整理用户提供的引用内容,确保回答准确。用户提到了四个引用,涉及App.js的注册方法、全局变量、调用其他页面方法以及数据同步的问题。 首先,根据引用[2],App()必须在app.js中调用一次,这是基础,我需要强调这一点。然后,用户进入方式判断和用户信息获取,引用[1]提到了这些,应该详细说明如何实现。全局变量的设置和使用在引用[1]和[4]都有涉及,需要解释如何通过getApp().globalData来操作。 接着,调用其他页面方法的问题,引用[3]给出了一个例子,但需要提醒用户注意作用域的问题,可能存在的this指向错误,这时候可能需要使用箭头函数或者闭包,如引用[4]中的例子。数据同步方面,引用[4]提到了在app.js未完成云函数时如何设置回调,这部分需要详细说明,可能涉及异步处理和闭包的应用。 常见问题部分,用户可能遇到全局变量不同步,引用[4]中的解决方案可以在这里提到。生命周期函数的使用错误也是常见问题,引用[2]提到必须在app.js中正确注册。此外,调用其他页面方法时可能的作用域问题需要解释,如引用[3]和[4]中的方法。 最后,生成相关问题需要考虑用户可能进一步想了解的内容,比如如何优化全局变量,生命周期函数的更多细节,数据同步的其他方法,以及如何调试app.js的问题。需要确保问题覆盖用户可能遇到的各个方面,并引导他们深入阅读相关引用内容。</think>### 微信小程序 `app.js` 文件使用说明及常见问题 #### 一、`app.js` 核心功能 1. **注册小程序** 必须调用 `App(Object object)` 方法注册小程序,且仅在 `app.js` 中调用一次,否则会导致异常[^2]。示例: ```javascript App({ onLaunch() { console.log('小程序初始化完成'); }, globalData: { userInfo: null } }); ``` 2. **判断用户进入方式** 通过 `onLaunch` 或 `onShow` 生命周期函数的参数 `options` 可获取场景值(`scene`),用于判断用户通过扫码、分享链接等方式进入小程序[^1]。 示例: ```javascript onLaunch(options) { console.log('进入场景值:', options.scene); } ``` 3. **全局变量管理** 使用 `globalData` 定义全局变量,其他页面通过 `getApp().globalData` 访问。例如存储用户登录状态或配置信息[^1][^4]。 ```javascript // 设置全局变量 getApp().globalData.openid = '123456'; // 读取全局变量 const openid = getApp().globalData.openid; ``` 4. **跨页面方法调用** 可通过 `getApp()` 在 `app.js` 中定义公共方法,并在其他页面调用。注意作用域问题,建议使用箭头函数或闭包[^3]。 示例: ```javascript // app.js 定义方法 App({ commonMethod() { console.log('公共方法被调用'); } }); // 其他页面调用 getApp().commonMethod(); ``` --- #### 二、常见问题及解决方案 1. **全局变量不同步** - **问题**:页面中获取 `globalData` 时可能因异步操作未完成而得到空值。 - **解决**:使用回调函数或事件监听。示例: ```javascript // index.js const app = getApp(); if (!app.globalData.openid) { app.indexCallback = (data) => { this.setData({ id: data }); }; } // app.js(异步完成后调用) app.indexCallback(openid); ``` 引用[^4] 2. **生命周期函数未触发** - **问题**:`onLaunch` 或 `onShow` 未执行。 - **检查点**:确保 `App()` 调用正确且无语法错误,未在子页面重复注册。 3. **跨页面方法调用报错** - **问题**:`this` 指向错误导致方法无法调用。 - **解决**:在 `app.js` 中使用箭头函数或绑定作用域: ```javascript // app.js App({ methodName: () => { // 使用箭头函数保留 this 指向 this.doSomething(); } }); ``` 引用[^3] --- #### 三、最佳实践建议 1. **全局变量初始化** 在 `onLaunch` 中完成全局数据初始化(如用户登录、网络请求),避免页面直接依赖未准备好的数据。 2. **模块化拆分** 将公共逻辑(如网络请求、工具函数)封装到独立模块,通过 `require` 引入到 `app.js`。 3. **错误监控** 在 `onError` 生命周期中捕获全局错误并上报: ```javascript App({ onError(err) { console.error('全局错误:', err); // 上报错误到服务器 } }); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值